diff options
| author | wbc6080 <wangbincheng4@huawei.com> | 2023-12-06 19:37:20 +0800 |
|---|---|---|
| committer | wbc6080 <wangbincheng4@huawei.com> | 2024-01-18 20:19:09 +0800 |
| commit | beeff6a72f4e7477722f7739ccb618abef9dc48d (patch) | |
| tree | 85c88004301dfccc3996d298aa776e4897d4d238 | |
| parent | Merge pull request #5356 from wbc6080/fix-framework-e2e (diff) | |
| download | kubeedge-beeff6a72f4e7477722f7739ccb618abef9dc48d.tar.gz | |
fix namespace in mapper
Signed-off-by: wbc6080 <wangbincheng4@huawei.com>
10 files changed, 64 insertions, 38 deletions
diff --git a/staging/src/github.com/kubeedge/mapper-framework/_template/mapper/device/device.go b/staging/src/github.com/kubeedge/mapper-framework/_template/mapper/device/device.go index 081b48185..692806843 100644 --- a/staging/src/github.com/kubeedge/mapper-framework/_template/mapper/device/device.go +++ b/staging/src/github.com/kubeedge/mapper-framework/_template/mapper/device/device.go @@ -124,6 +124,7 @@ func dataHandler(ctx context.Context, dev *driver.CustomizedDev) { // handle twin twinData := &TwinData{ DeviceName: dev.Instance.Name, + DeviceNamespace: dev.Instance.Namespace, Client: dev.CustomizedClient, Name: twin.PropertyName, Type: twin.ObservedDesired.Metadata.Type, @@ -289,7 +290,7 @@ func (d *DevPanel) UpdateDev(model *common.DeviceModel, device *common.DeviceIns // start new device d.devices[device.ID] = new(driver.CustomizedDev) d.devices[device.ID].Instance = *device - d.models[device.ID] = *model + d.models[model.ID] = *model ctx, cancelFunc := context.WithCancel(context.Background()) d.deviceMuxs[device.ID] = cancelFunc @@ -409,26 +410,26 @@ func (d *DevPanel) stopDev(dev *driver.CustomizedDev, id string) error { } // GetModel if the model exists, return device model -func (d *DevPanel) GetModel(modelName string) (common.DeviceModel, error) { +func (d *DevPanel) GetModel(modelID string) (common.DeviceModel, error) { d.serviceMutex.Lock() defer d.serviceMutex.Unlock() - if model, ok := d.models[modelName]; ok { + if model, ok := d.models[modelID]; ok { return model, nil } - return common.DeviceModel{}, fmt.Errorf("deviceModel %s not found", modelName) + return common.DeviceModel{}, fmt.Errorf("deviceModel %s not found", modelID) } // UpdateModel update device model func (d *DevPanel) UpdateModel(model *common.DeviceModel) { d.serviceMutex.Lock() - d.models[model.Name] = *model + d.models[model.ID] = *model d.serviceMutex.Unlock() } // RemoveModel remove device model -func (d *DevPanel) RemoveModel(modelName string) { +func (d *DevPanel) RemoveModel(modelID string) { d.serviceMutex.Lock() - delete(d.models, modelName) + delete(d.models, modelID) d.serviceMutex.Unlock() } diff --git a/staging/src/github.com/kubeedge/mapper-framework/_template/mapper/device/devicetwin.go b/staging/src/github.com/kubeedge/mapper-framework/_template/mapper/device/devicetwin.go index 154614472..da90628f4 100644 --- a/staging/src/github.com/kubeedge/mapper-framework/_template/mapper/device/devicetwin.go +++ b/staging/src/github.com/kubeedge/mapper-framework/_template/mapper/device/devicetwin.go @@ -18,6 +18,7 @@ import ( type TwinData struct { DeviceName string + DeviceNamespace string Client *driver.CustomizedClient Name string Type string @@ -75,7 +76,8 @@ func (td *TwinData) PushToEdgeCore() { twins := parse.ConvMsgTwinToGrpc(msg.Twin) var rdsr = &dmiapi.ReportDeviceStatusRequest{ - DeviceName: td.DeviceName, + DeviceName: td.DeviceName, + DeviceNamespace: td.DeviceNamespace, ReportedDevice: &dmiapi.DeviceStatus{ Twins: twins, //State: "OK", diff --git a/staging/src/github.com/kubeedge/mapper-framework/go.mod b/staging/src/github.com/kubeedge/mapper-framework/go.mod index aa4cac129..84b0d95fd 100644 --- a/staging/src/github.com/kubeedge/mapper-framework/go.mod +++ b/staging/src/github.com/kubeedge/mapper-framework/go.mod @@ -6,7 +6,7 @@ require ( github.com/avast/retry-go v3.0.0+incompatible github.com/golang/protobuf v1.5.3 github.com/gorilla/mux v1.8.0 - github.com/kubeedge/kubeedge v1.15.0-beta.0.0.20240110111122-c44efa2389b9 + github.com/kubeedge/kubeedge v1.15.0-beta.0.0.20240118080528-4237f6f6805e github.com/spf13/pflag v1.0.6-0.20210604193023-d5e0c0615ace golang.org/x/net v0.17.0 // indirect google.golang.org/grpc v1.53.0 diff --git a/staging/src/github.com/kubeedge/mapper-framework/go.sum b/staging/src/github.com/kubeedge/mapper-framework/go.sum index d6af2920c..123b25773 100644 --- a/staging/src/github.com/kubeedge/mapper-framework/go.sum +++ b/staging/src/github.com/kubeedge/mapper-framework/go.sum @@ -16,8 +16,8 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kubeedge/kubeedge v1.15.0-beta.0.0.20240110111122-c44efa2389b9 h1:vVjy6eJGzKZyAdW2L2E8fi2DDz4w4Bn+1pwXgC/v2W8= -github.com/kubeedge/kubeedge v1.15.0-beta.0.0.20240110111122-c44efa2389b9/go.mod h1:3f9VoRV6ar6yAOrjRYySlYBoSG3n4BEi/PitT2uoUm4= +github.com/kubeedge/kubeedge v1.15.0-beta.0.0.20240118080528-4237f6f6805e h1:SQD/Z9/z75tQpnZKGs179ugFywJH2tj0bAKlDh0M9Gs= +github.com/kubeedge/kubeedge v1.15.0-beta.0.0.20240118080528-4237f6f6805e/go.mod h1:NbL/UWB68wuY5itB/0jMtDyI04Q+Iw2CJshOQz/WJS4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/spf13/pflag v1.0.6-0.20210604193023-d5e0c0615ace h1:9PNP1jnUjRhfmGMlkXHjYPishpcw4jpSt/V/xYY3FMA= github.com/spf13/pflag v1.0.6-0.20210604193023-d5e0c0615ace/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= diff --git a/staging/src/github.com/kubeedge/mapper-framework/pkg/common/configmaptype.go b/staging/src/github.com/kubeedge/mapper-framework/pkg/common/configmaptype.go index bfdd0dad6..8e1582126 100644 --- a/staging/src/github.com/kubeedge/mapper-framework/pkg/common/configmaptype.go +++ b/staging/src/github.com/kubeedge/mapper-framework/pkg/common/configmaptype.go @@ -29,6 +29,7 @@ type DeviceProfile struct { type DeviceInstance struct { ID string `json:"id,omitempty"` Name string `json:"name,omitempty"` + Namespace string `json:"namespace,omitempty"` ProtocolName string `json:"protocol,omitempty"` PProtocol ProtocolConfig Model string `json:"model,omitempty"` @@ -38,7 +39,9 @@ type DeviceInstance struct { // DeviceModel is structure to store deviceModel in deviceProfile.json in configmap. type DeviceModel struct { + ID string `json:"id,omitempty"` Name string `json:"name,omitempty"` + Namespace string `json:"namespace,omitempty"` Description string `json:"description,omitempty"` Properties []ModelProperty `json:"properties,omitempty"` } diff --git a/staging/src/github.com/kubeedge/mapper-framework/pkg/global/global.go b/staging/src/github.com/kubeedge/mapper-framework/pkg/global/global.go index 457d2770b..f79222d06 100644 --- a/staging/src/github.com/kubeedge/mapper-framework/pkg/global/global.go +++ b/staging/src/github.com/kubeedge/mapper-framework/pkg/global/global.go @@ -22,11 +22,11 @@ type DevPanel interface { // RemoveDevice stop device and remove device RemoveDevice(deviceID string) error // GetModel get model's info - GetModel(modelName string) (common.DeviceModel, error) + GetModel(modelID string) (common.DeviceModel, error) // UpdateModel update model in map only UpdateModel(model *common.DeviceModel) // RemoveModel remove model in map only - RemoveModel(modelName string) + RemoveModel(modelID string) // GetTwinResult get device's property value and datatype GetTwinResult(deviceID string, twinName string) (string, string, error) } diff --git a/staging/src/github.com/kubeedge/mapper-framework/pkg/grpcserver/device.go b/staging/src/github.com/kubeedge/mapper-framework/pkg/grpcserver/device.go index fa69a9e52..8db5cd6a4 100644 --- a/staging/src/github.com/kubeedge/mapper-framework/pkg/grpcserver/device.go +++ b/staging/src/github.com/kubeedge/mapper-framework/pkg/grpcserver/device.go @@ -21,16 +21,18 @@ func (s *Server) RegisterDevice(_ context.Context, request *dmiapi.RegisterDevic if device == nil { return nil, errors.New("device is nil") } - if _, err := s.devPanel.GetDevice(device.Name); err == nil { + deviceID := parse.GetResourceID(device.Namespace, device.Name) + if _, err := s.devPanel.GetDevice(deviceID); err == nil { // The device has been registered return &dmiapi.RegisterDeviceResponse{DeviceName: device.Name}, nil } var model common.DeviceModel var err error + modelID := parse.GetResourceID(device.Namespace, device.Spec.DeviceModelReference) err = retry.Do( func() error { - model, err = s.devPanel.GetModel(device.Spec.DeviceModelReference) + model, err = s.devPanel.GetModel(modelID) return err }, retry.Delay(1*time.Second), @@ -38,11 +40,11 @@ func (s *Server) RegisterDevice(_ context.Context, request *dmiapi.RegisterDevic retry.DelayType(retry.FixedDelay), ) if err != nil { - return nil, fmt.Errorf("deviceModel %s not found, err: %s", device.Spec.DeviceModelReference, err) + return nil, fmt.Errorf("deviceModel %s in %s namespace not found, err: %s", device.Spec.DeviceModelReference, device.Namespace, err) } protocol, err := parse.BuildProtocolFromGrpc(device) if err != nil { - return nil, fmt.Errorf("parse device %s protocol failed, err: %s", device.Name, err) + return nil, fmt.Errorf("parse device %s protocol in %s namespace failed, err: %s", device.Name, device.Namespace, err) } klog.Infof("model: %+v", model) deviceInstance, err := parse.GetDeviceFromGrpc(device, &model) @@ -61,8 +63,9 @@ func (s *Server) RemoveDevice(_ context.Context, request *dmiapi.RemoveDeviceReq if request.GetDeviceName() == "" { return nil, errors.New("device name is nil") } + deviceID := parse.GetResourceID(request.GetDeviceNamespace(), request.GetDeviceName()) - return &dmiapi.RemoveDeviceResponse{}, s.devPanel.RemoveDevice(request.GetDeviceName()) + return &dmiapi.RemoveDeviceResponse{}, s.devPanel.RemoveDevice(deviceID) } func (s *Server) UpdateDevice(_ context.Context, request *dmiapi.UpdateDeviceRequest) (*dmiapi.UpdateDeviceResponse, error) { @@ -72,19 +75,19 @@ func (s *Server) UpdateDevice(_ context.Context, request *dmiapi.UpdateDeviceReq return nil, errors.New("device is nil") } - model, err := s.devPanel.GetModel(device.Spec.DeviceModelReference) + modelID := parse.GetResourceID(device.GetNamespace(), device.Spec.DeviceModelReference) + model, err := s.devPanel.GetModel(modelID) if err != nil { - return nil, fmt.Errorf("deviceModel %s not found, err: %s", device.Spec.DeviceModelReference, err) + return nil, fmt.Errorf("deviceModel %s in %s namespace not found, err: %s", device.Spec.DeviceModelReference, device.GetNamespace(), err) } + klog.V(3).Infof("model: %+v", model) protocol, err := parse.BuildProtocolFromGrpc(device) if err != nil { return nil, fmt.Errorf("parse device %s protocol failed, err: %s", device.Name, err) } - - klog.V(3).Infof("model: %+v", model) deviceInstance, err := parse.GetDeviceFromGrpc(device, &model) if err != nil { - return nil, fmt.Errorf("parse device %s instance failed, err: %s", device.Name, err) + return nil, fmt.Errorf("parse device %s instance in %s namespace failed, err: %s", device.Name, device.Namespace, err) } deviceInstance.PProtocol = protocol @@ -114,7 +117,8 @@ func (s *Server) UpdateDeviceModel(_ context.Context, request *dmiapi.UpdateDevi if deviceModel == nil { return nil, errors.New("deviceModel is nil") } - if _, err := s.devPanel.GetModel(deviceModel.Name); err != nil { + modelID := parse.GetResourceID(deviceModel.Namespace, deviceModel.Name) + if _, err := s.devPanel.GetModel(modelID); err != nil { return nil, fmt.Errorf("update deviceModel %s failed, not existed", deviceModel.Name) } @@ -126,8 +130,8 @@ func (s *Server) UpdateDeviceModel(_ context.Context, request *dmiapi.UpdateDevi } func (s *Server) RemoveDeviceModel(_ context.Context, request *dmiapi.RemoveDeviceModelRequest) (*dmiapi.RemoveDeviceModelResponse, error) { - s.devPanel.RemoveModel(request.ModelName) - + modelID := parse.GetResourceID(request.ModelNamespace, request.ModelName) + s.devPanel.RemoveModel(modelID) return &dmiapi.RemoveDeviceModelResponse{}, nil } @@ -135,8 +139,8 @@ func (s *Server) GetDevice(_ context.Context, request *dmiapi.GetDeviceRequest) if request.GetDeviceName() == "" { return nil, errors.New("device name is nil") } - - device, err := s.devPanel.GetDevice(request.GetDeviceName()) + deviceID := parse.GetResourceID(request.GetDeviceNamespace(), request.GetDeviceName()) + device, err := s.devPanel.GetDevice(deviceID) if err != nil { return nil, err } diff --git a/staging/src/github.com/kubeedge/mapper-framework/pkg/httpserver/callback.go b/staging/src/github.com/kubeedge/mapper-framework/pkg/httpserver/callback.go index ed4151a39..ac9d90308 100644 --- a/staging/src/github.com/kubeedge/mapper-framework/pkg/httpserver/callback.go +++ b/staging/src/github.com/kubeedge/mapper-framework/pkg/httpserver/callback.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/kubeedge/mapper-framework/pkg/common" + "github.com/kubeedge/mapper-framework/pkg/util/parse" ) func (rs *RestServer) Ping(writer http.ResponseWriter, request *http.Request) { @@ -19,9 +20,11 @@ func (rs *RestServer) Ping(writer http.ResponseWriter, request *http.Request) { func (rs *RestServer) DeviceRead(writer http.ResponseWriter, request *http.Request) { urlItem := strings.Split(request.URL.Path, "/") + deviceNamespace := urlItem[len(urlItem)-3] deviceName := urlItem[len(urlItem)-2] propertyName := urlItem[len(urlItem)-1] - res, dataType, err := rs.devPanel.GetTwinResult(urlItem[len(urlItem)-2], urlItem[len(urlItem)-1]) + deviceID := parse.GetResourceID(deviceNamespace, deviceName) + res, dataType, err := rs.devPanel.GetTwinResult(deviceID, propertyName) if err != nil { http.Error(writer, fmt.Sprintf("Get device data error: %v", err), http.StatusInternalServerError) } else { @@ -40,8 +43,10 @@ func (rs *RestServer) DeviceRead(writer http.ResponseWriter, request *http.Reque func (rs *RestServer) MetaGetModel(writer http.ResponseWriter, request *http.Request) { urlItem := strings.Split(request.URL.Path, "/") + deviceNamespace := urlItem[len(urlItem)-2] deviceName := urlItem[len(urlItem)-1] - device, err := rs.devPanel.GetDevice(deviceName) + deviceID := parse.GetResourceID(deviceNamespace, deviceName) + device, err := rs.devPanel.GetDevice(deviceID) if err != nil { http.Error(writer, fmt.Sprintf("Get device error: %v", err), http.StatusInternalServerError) return @@ -55,7 +60,8 @@ func (rs *RestServer) MetaGetModel(writer http.ResponseWriter, request *http.Req if instance.IsValid() { instance, ok := instance.Interface().(common.DeviceInstance) if ok { - model, err := rs.devPanel.GetModel(instance.Model) + modelID := parse.GetResourceID(instance.Namespace, instance.Model) + model, err := rs.devPanel.GetModel(modelID) if err != nil { http.Error(writer, fmt.Sprintf("Get device model error: %v", err), http.StatusInternalServerError) } diff --git a/staging/src/github.com/kubeedge/mapper-framework/pkg/httpserver/restapi.go b/staging/src/github.com/kubeedge/mapper-framework/pkg/httpserver/restapi.go index c379d570b..92fc0e80c 100644 --- a/staging/src/github.com/kubeedge/mapper-framework/pkg/httpserver/restapi.go +++ b/staging/src/github.com/kubeedge/mapper-framework/pkg/httpserver/restapi.go @@ -13,23 +13,25 @@ const ( // APIDeviceRoute to build device RESTful API APIDeviceRoute = APIBase + "/device" // APIDeviceReadRoute API that read device's property - APIDeviceReadRoute = APIDeviceRoute + "/" + DeviceID + "/" + PropertyName + APIDeviceReadRoute = APIDeviceRoute + "/" + DeviceNamespace + "/" + DeviceName + "/" + PropertyName // APIMetaRoute to build meta RESTful API APIMetaRoute = APIBase + "/meta" // APIMetaGetModelRoute API that get device model by device id - APIMetaGetModelRoute = APIMetaRoute + "/model" + "/" + DeviceID + APIMetaGetModelRoute = APIMetaRoute + "/model" + "/" + DeviceNamespace + "/" + DeviceName // APIDataBaseRoute to build database RESTful API APIDataBaseRoute = APIBase + "/database" // APIDataBaseGetDataByID API that get data by device id - APIDataBaseGetDataByID = APIDataBaseRoute + "/" + DeviceID + APIDataBaseGetDataByID = APIDataBaseRoute + "/" + DeviceNamespace + "/" + DeviceName ) // API field pattern const ( - // DeviceID pattern for deviceID - DeviceID = "{id}" + // DeviceName pattern for deviceName + DeviceName = "{name}" + // DeviceNamespace pattern for deviceNamespace + DeviceNamespace = "{namespace}" // PropertyName pattern for property PropertyName = "{property}" ) diff --git a/staging/src/github.com/kubeedge/mapper-framework/pkg/util/parse/grpc.go b/staging/src/github.com/kubeedge/mapper-framework/pkg/util/parse/grpc.go index a1d1b9917..90c1a9876 100644 --- a/staging/src/github.com/kubeedge/mapper-framework/pkg/util/parse/grpc.go +++ b/staging/src/github.com/kubeedge/mapper-framework/pkg/util/parse/grpc.go @@ -198,7 +198,9 @@ func buildPropertiesFromGrpc(device *dmiapi.Device) []common.DeviceProperty { func GetDeviceModelFromGrpc(model *dmiapi.DeviceModel) common.DeviceModel { cur := common.DeviceModel{ - Name: model.GetName(), + ID: GetResourceID(model.GetNamespace(), model.GetName()), + Name: model.GetName(), + Namespace: model.GetNamespace(), } if model.GetSpec() == nil || len(model.GetSpec().GetProperties()) == 0 { return cur @@ -226,8 +228,9 @@ func GetDeviceFromGrpc(device *dmiapi.Device, commonModel *common.DeviceModel) ( return nil, err } instance := &common.DeviceInstance{ - ID: device.GetName(), + ID: GetResourceID(device.GetNamespace(), device.GetName()), Name: device.GetName(), + Namespace: device.GetNamespace(), ProtocolName: protocolName + "-" + device.GetName(), Model: device.GetSpec().GetDeviceModelReference(), Twins: buildTwinsFromGrpc(device), @@ -258,3 +261,8 @@ func GetDeviceFromGrpc(device *dmiapi.Device, commonModel *common.DeviceModel) ( klog.V(2).Infof("final instance data from grpc = %v", instance) return instance, nil } + +// GetResourceID return resource ID +func GetResourceID(namespace, name string) string { + return namespace + "/" + name +} |
