diff options
Diffstat (limited to 'edge')
| -rw-r--r-- | edge/pkg/devicetwin/dmiserver/server.go | 2 | ||||
| -rw-r--r-- | edge/pkg/devicetwin/dtcommon/util.go | 124 |
2 files changed, 126 insertions, 0 deletions
diff --git a/edge/pkg/devicetwin/dmiserver/server.go b/edge/pkg/devicetwin/dmiserver/server.go index 0cd9f5099..689f99885 100644 --- a/edge/pkg/devicetwin/dmiserver/server.go +++ b/edge/pkg/devicetwin/dmiserver/server.go @@ -50,6 +50,7 @@ const ( ) type server struct { + pb.UnimplementedDeviceManagerServiceServer limiter *rate.Limiter dmiCache *DMICache } @@ -83,6 +84,7 @@ func (s *server) MapperRegister(ctx context.Context, in *pb.MapperRegisterReques s.dmiCache.MapperList[in.Mapper.Name] = in.Mapper s.dmiCache.MapperMu.Unlock() + dmiclient.DMIClientsImp.CreateDMIClient(in.Mapper.Protocol, string(in.Mapper.Address)) if !in.WithData { return &pb.MapperRegisterResponse{}, nil } diff --git a/edge/pkg/devicetwin/dtcommon/util.go b/edge/pkg/devicetwin/dtcommon/util.go index eff5156aa..5445360c9 100644 --- a/edge/pkg/devicetwin/dtcommon/util.go +++ b/edge/pkg/devicetwin/dtcommon/util.go @@ -3,10 +3,14 @@ package dtcommon import ( "encoding/json" "errors" + "fmt" + "reflect" "regexp" "strconv" "strings" + "google.golang.org/protobuf/types/known/anypb" + "google.golang.org/protobuf/types/known/wrapperspb" "k8s.io/klog/v2" "github.com/kubeedge/kubeedge/cloud/pkg/devicecontroller/constants" @@ -73,6 +77,47 @@ func ConvertDevice(device *v1beta1.Device) (*pb.Device, error) { klog.Errorf("fail to unmarshal device %s with err: %v", device.Name, err) return nil, err } + if device.Spec.Protocol.ConfigData != nil { + // interface data to anypb.Any data + configAnyData := make(map[string]*anypb.Any) + for k, v := range device.Spec.Protocol.ConfigData.Data { + anyValue, err := dataToAny(v) + if err != nil { + return nil, err + } + configAnyData[k] = anyValue + } + edgeDevice.Spec.Protocol.ConfigData.Data = configAnyData + } + var edgePropertyVisitors []*pb.DeviceProperty + for i := range device.Spec.Properties { + var item *pb.DeviceProperty = new(pb.DeviceProperty) + propertyData, err := json.Marshal(device.Spec.Properties[i]) + if err != nil { + klog.Errorf("fail to marshal device %s with err: %v", device.Name, err) + return nil, err + } + err = json.Unmarshal(propertyData, item) + if err != nil { + klog.Errorf("fail to unmarshal device %s with err: %v", device.Name, err) + return nil, err + } + + if device.Spec.Properties[i].Visitors.ConfigData != nil { + configAnyData := make(map[string]*anypb.Any) + for k, v := range device.Spec.Properties[i].Visitors.ConfigData.Data { + anyValue, err := dataToAny(v) + if err != nil { + return nil, err + } + configAnyData[k] = anyValue + } + item.Visitors.ConfigData.Data = configAnyData + } + edgePropertyVisitors = append(edgePropertyVisitors, item) + } + + edgeDevice.Spec.Properties = edgePropertyVisitors edgeDevice.Name = device.Name edgeDevice.Spec.DeviceModelReference = device.Spec.DeviceModelRef.Name @@ -96,3 +141,82 @@ func ConvertDeviceModel(model *v1beta1.DeviceModel) (*pb.DeviceModel, error) { return &edgeDeviceModel, nil } + +func dataToAny(v interface{}) (*anypb.Any, error) { + switch m := v.(type) { + case string: + strWrapper := wrapperspb.String(m) + anyStr, err := anypb.New(strWrapper) + if err != nil { + klog.Errorf("anypb new error: %v", err) + return nil, err + } + return anyStr, nil + case int8: + intWrapper := wrapperspb.Int32(int32(m)) + anyInt, err := anypb.New(intWrapper) + if err != nil { + klog.Errorf("anypb new error: %v", err) + return nil, err + } + return anyInt, nil + case int16: + intWrapper := wrapperspb.Int32(int32(m)) + anyInt, err := anypb.New(intWrapper) + if err != nil { + klog.Errorf("anypb new error: %v", err) + return nil, err + } + return anyInt, nil + case int32: + intWrapper := wrapperspb.Int32(m) + anyInt, err := anypb.New(intWrapper) + if err != nil { + klog.Errorf("anypb new error: %v", err) + return nil, err + } + return anyInt, nil + case int64: + intWrapper := wrapperspb.Int64(m) + anyInt, err := anypb.New(intWrapper) + if err != nil { + klog.Errorf("anypb new error: %v", err) + return nil, err + } + return anyInt, nil + case int: + intWrapper := wrapperspb.Int32(int32(m)) + anyInt, err := anypb.New(intWrapper) + if err != nil { + klog.Errorf("anypb new error: %v", err) + return nil, err + } + return anyInt, nil + case float64: + floatWrapper := wrapperspb.Float(float32(m)) + anyFloat, err := anypb.New(floatWrapper) + if err != nil { + klog.Errorf("anypb new error: %v", err) + return nil, err + } + return anyFloat, nil + case float32: + floatWrapper := wrapperspb.Float(float32(m)) + anyFloat, err := anypb.New(floatWrapper) + if err != nil { + klog.Errorf("anypb new error: %v", err) + return nil, err + } + return anyFloat, nil + case bool: + boolWrapper := wrapperspb.Bool(m) + anyBool, err := anypb.New(boolWrapper) + if err != nil { + klog.Errorf("anypb new error: %v", err) + return nil, err + } + return anyBool, nil + default: + return nil, fmt.Errorf("%v does not support converting to any", reflect.TypeOf(v)) + } +} |
