summaryrefslogtreecommitdiff
path: root/cloud
diff options
context:
space:
mode:
authorcl2017 <chenlin.liu@daocloud.io>2023-10-10 18:53:31 +0800
committercl2017 <chenlin.liu@daocloud.io>2023-10-13 10:25:57 +0800
commit194023c05deeabc44f8f5d0d5f58782ef3d06334 (patch)
treecdbc57e0b0e58cdedc35a3231e9842bd40e38284 /cloud
parentMerge pull request #5023 from wbc6080/dmi-dataplane (diff)
downloadkubeedge-194023c05deeabc44f8f5d0d5f58782ef3d06334.tar.gz
bugfix: device model sync
Signed-off-by: cl2017 <chenlin.liu@daocloud.io>
Diffstat (limited to 'cloud')
-rw-r--r--cloud/pkg/devicecontroller/controller/downstream.go35
1 files changed, 33 insertions, 2 deletions
diff --git a/cloud/pkg/devicecontroller/controller/downstream.go b/cloud/pkg/devicecontroller/controller/downstream.go
index 808238e15..43793fddd 100644
--- a/cloud/pkg/devicecontroller/controller/downstream.go
+++ b/cloud/pkg/devicecontroller/controller/downstream.go
@@ -18,6 +18,7 @@ package controller
import (
"reflect"
+ "sync"
"time"
"github.com/google/uuid"
@@ -145,7 +146,9 @@ func (dc *DownstreamController) deviceAdded(device *v1beta1.Device) {
klog.Errorf("Failed to send device addition message %v due to error %v", msg, err)
}
- dc.sendDeviceModelMsg(device, model.InsertOperation)
+ if !isExistModel(&dc.deviceManager.Device, device) {
+ dc.sendDeviceModelMsg(device, model.InsertOperation)
+ }
dc.sendDeviceMsg(device, model.InsertOperation)
}
}
@@ -166,6 +169,32 @@ func createDevice(device *v1beta1.Device) types.Device {
return edgeDevice
}
+// isExistModel check if the target node already has the model.
+func isExistModel(deviceMap *sync.Map, device *v1beta1.Device) bool {
+ var res bool
+ targetNode := device.Spec.NodeName
+ modelName := device.Spec.DeviceModelRef.Name
+ // To find another device in deviceMap that uses the same deviceModel with exclude current device
+ deviceMap.Range(func(k, v interface{}) bool {
+ if k == device.Name {
+ return true
+ }
+ deviceItem, ok := v.(*v1beta1.Device)
+ if !ok {
+ return true
+ }
+ if deviceItem.Spec.NodeName == "" {
+ return true
+ }
+ if deviceItem.Spec.NodeName == targetNode && deviceItem.Spec.DeviceModelRef.Name == modelName {
+ res = true
+ return false
+ }
+ return true
+ })
+ return res
+}
+
// deviceUpdated updates the map, check if device is actually updated.
// If NodeName is updated, call add device for newNode, deleteDevice for old Node.
// If Spec is updated, send update message to edge
@@ -229,7 +258,9 @@ func (dc *DownstreamController) deviceDeleted(device *v1beta1.Device) {
if err != nil {
klog.Errorf("Failed to send device addition message %v due to error %v", msg, err)
}
- dc.sendDeviceModelMsg(device, model.DeleteOperation)
+ if !isExistModel(&dc.deviceManager.Device, device) {
+ dc.sendDeviceModelMsg(device, model.DeleteOperation)
+ }
dc.sendDeviceMsg(device, model.DeleteOperation)
}
}