summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cloud/pkg/devicecontroller/controller/downstream.go20
-rw-r--r--cloud/pkg/devicecontroller/controller/upstream.go27
2 files changed, 42 insertions, 5 deletions
diff --git a/cloud/pkg/devicecontroller/controller/downstream.go b/cloud/pkg/devicecontroller/controller/downstream.go
index 20bc84ad1..adc3c3ac1 100644
--- a/cloud/pkg/devicecontroller/controller/downstream.go
+++ b/cloud/pkg/devicecontroller/controller/downstream.go
@@ -208,6 +208,9 @@ func isExistModel(deviceMap *sync.Map, device *v1beta1.Device) bool {
// If NodeName is updated, call add device for newNode, deleteDevice for old Node.
// If Spec is updated, send update message to edge
func (dc *DownstreamController) deviceUpdated(device *v1beta1.Device) {
+ if len(device.Status.Twins) > 0 {
+ removeTwinWithNameChanged(device)
+ }
deviceID := util.GetResourceID(device.Namespace, device.Name)
value, ok := dc.deviceManager.Device.Load(deviceID)
dc.deviceManager.Device.Store(deviceID, device)
@@ -417,3 +420,20 @@ func NewDownstreamController(crdInformerFactory crdinformers.SharedInformerFacto
}
return dc, nil
}
+
+// Remove twin with changed attribute names.
+func removeTwinWithNameChanged(device *v1beta1.Device) {
+ properties := device.Spec.Properties
+ twins := device.Status.Twins
+ newTwins := make([]v1beta1.Twin, 0, len(properties))
+ for _, twin := range twins {
+ twinName := twin.PropertyName
+ for _, property := range properties {
+ if property.Name == twinName {
+ newTwins = append(newTwins, twin)
+ break
+ }
+ }
+ }
+ device.Status.Twins = newTwins
+}
diff --git a/cloud/pkg/devicecontroller/controller/upstream.go b/cloud/pkg/devicecontroller/controller/upstream.go
index 46fea8db2..6f2298095 100644
--- a/cloud/pkg/devicecontroller/controller/upstream.go
+++ b/cloud/pkg/devicecontroller/controller/upstream.go
@@ -135,7 +135,7 @@ func (uc *UpstreamController) updateDeviceStatus() {
}
deviceStatus := &DeviceStatus{Status: cacheDevice.Status}
for twinName, twin := range msgTwin.Twin {
- deviceTwin := findTwinByName(twinName, deviceStatus.Status.Twins)
+ deviceTwin := findOrCreateTwinByName(twinName, cacheDevice.Spec.Properties, deviceStatus)
if deviceTwin != nil {
if twin.Actual != nil && twin.Actual.Value != nil {
reported := v1beta1.TwinProperty{}
@@ -226,10 +226,27 @@ func NewUpstreamController(dc *DownstreamController) (*UpstreamController, error
return uc, nil
}
-func findTwinByName(twinName string, twins []v1beta1.Twin) *v1beta1.Twin {
- for i := range twins {
- if twinName == twins[i].PropertyName {
- return &twins[i]
+func findOrCreateTwinByName(twinName string, properties []v1beta1.DeviceProperty, deviceStatus *DeviceStatus) *v1beta1.Twin {
+ for i := range properties {
+ if twinName == properties[i].Name {
+ twin := findTwinByName(twinName, deviceStatus)
+ if twin != nil {
+ return twin
+ }
+ twin = &v1beta1.Twin{
+ PropertyName: twinName,
+ }
+ deviceStatus.Status.Twins = append(deviceStatus.Status.Twins, *twin)
+ return twin
+ }
+ }
+ return nil
+}
+
+func findTwinByName(twinName string, deviceStatus *DeviceStatus) *v1beta1.Twin {
+ for i := range deviceStatus.Status.Twins {
+ if twinName == deviceStatus.Status.Twins[i].PropertyName {
+ return &deviceStatus.Status.Twins[i]
}
}
return nil