github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/cloud/test/integration/fixtures/devicemodel.go (about)

     1  /*
     2  Copyright 2019 The KubeEdge Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package fixtures
    18  
    19  import (
    20  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    21  
    22  	"github.com/kubeedge/kubeedge/cloud/pkg/apis/devices/v1alpha1"
    23  )
    24  
    25  type DevicePropertyOp struct {
    26  	deviceProperty v1alpha1.DeviceProperty
    27  }
    28  
    29  type DevicePropertyOption func(*DevicePropertyOp)
    30  
    31  func withName(name string) DevicePropertyOption {
    32  	return func(op *DevicePropertyOp) {
    33  		op.deviceProperty.Name = name
    34  	}
    35  }
    36  
    37  func withDescription(description string) DevicePropertyOption {
    38  	return func(op *DevicePropertyOp) {
    39  		op.deviceProperty.Description = description
    40  	}
    41  }
    42  
    43  func withStringType(accessMode v1alpha1.PropertyAccessMode, defaultValue string) DevicePropertyOption {
    44  	return func(op *DevicePropertyOp) {
    45  		stringType := &v1alpha1.PropertyTypeString{
    46  			DefaultValue: defaultValue,
    47  		}
    48  		stringType.AccessMode = accessMode
    49  		op.deviceProperty.Type = v1alpha1.PropertyType{
    50  			String: stringType,
    51  		}
    52  	}
    53  }
    54  
    55  func withIntType(accessMode v1alpha1.PropertyAccessMode, defaultValue int64, minimum int64, maximum int64, unit string) DevicePropertyOption {
    56  	return func(op *DevicePropertyOp) {
    57  		intType := &v1alpha1.PropertyTypeInt64{
    58  			DefaultValue: defaultValue,
    59  			Minimum:      minimum,
    60  			Maximum:      maximum,
    61  			Unit:         unit,
    62  		}
    63  		intType.AccessMode = accessMode
    64  		op.deviceProperty.Type = v1alpha1.PropertyType{
    65  			Int: intType,
    66  		}
    67  	}
    68  }
    69  
    70  func (op *DevicePropertyOp) applyDevicePropertyOpts(opts []DevicePropertyOption) {
    71  	for _, opt := range opts {
    72  		opt(op)
    73  	}
    74  }
    75  
    76  func newDevicePropertyOp(opts ...DevicePropertyOption) *DevicePropertyOp {
    77  	op := &DevicePropertyOp{
    78  		deviceProperty: v1alpha1.DeviceProperty{},
    79  	}
    80  	op.applyDevicePropertyOpts(opts)
    81  	return op
    82  }
    83  
    84  type DevicePropertyVisitorOp struct {
    85  	devicePropertyVisitor v1alpha1.DevicePropertyVisitor
    86  }
    87  
    88  type DevicePropertyVisitorOption func(*DevicePropertyVisitorOp)
    89  
    90  func withVisitorName(name string) DevicePropertyVisitorOption {
    91  	return func(op *DevicePropertyVisitorOp) {
    92  		op.devicePropertyVisitor.PropertyName = name
    93  	}
    94  }
    95  
    96  func withVisitorConfig(protocol deviceProtocol) DevicePropertyVisitorOption {
    97  	return func(op *DevicePropertyVisitorOp) {
    98  		switch protocol {
    99  		case deviceProtocolBluetooth:
   100  			op.devicePropertyVisitor.VisitorConfig = v1alpha1.VisitorConfig{
   101  				Bluetooth: &v1alpha1.VisitorConfigBluetooth{
   102  					CharacteristicUUID:     "",
   103  					BluetoothDataConverter: v1alpha1.BluetoothReadConverter{},
   104  				},
   105  			}
   106  		case deviceProtocolModbus:
   107  			op.devicePropertyVisitor.VisitorConfig = v1alpha1.VisitorConfig{
   108  				Modbus: &v1alpha1.VisitorConfigModbus{},
   109  			}
   110  		case deviceProtocolOPCUA:
   111  			op.devicePropertyVisitor.VisitorConfig = v1alpha1.VisitorConfig{
   112  				OpcUA: &v1alpha1.VisitorConfigOPCUA{},
   113  			}
   114  		default:
   115  		}
   116  	}
   117  }
   118  
   119  func withCharacteristicUUID(characteristicUUID string) DevicePropertyVisitorOption {
   120  	return func(op *DevicePropertyVisitorOp) {
   121  		op.devicePropertyVisitor.VisitorConfig.Bluetooth.CharacteristicUUID = characteristicUUID
   122  	}
   123  }
   124  
   125  func withStartIndex(startIndex int) DevicePropertyVisitorOption {
   126  	return func(op *DevicePropertyVisitorOp) {
   127  		op.devicePropertyVisitor.VisitorConfig.Bluetooth.BluetoothDataConverter.StartIndex = startIndex
   128  	}
   129  }
   130  
   131  func withEndIndex(endIndex int) DevicePropertyVisitorOption {
   132  	return func(op *DevicePropertyVisitorOp) {
   133  		op.devicePropertyVisitor.VisitorConfig.Bluetooth.BluetoothDataConverter.EndIndex = endIndex
   134  	}
   135  }
   136  
   137  func withOperation(operationType v1alpha1.BluetoothArithmeticOperationType, value float64) DevicePropertyVisitorOption {
   138  	return func(op *DevicePropertyVisitorOp) {
   139  		bluetoothOperation := v1alpha1.BluetoothOperations{
   140  			BluetoothOperationType:  operationType,
   141  			BluetoothOperationValue: value,
   142  		}
   143  		op.devicePropertyVisitor.VisitorConfig.Bluetooth.BluetoothDataConverter.OrderOfOperations =
   144  			append(op.devicePropertyVisitor.VisitorConfig.Bluetooth.BluetoothDataConverter.OrderOfOperations, bluetoothOperation)
   145  	}
   146  
   147  }
   148  
   149  func withRegister(register v1alpha1.ModbusRegisterType) DevicePropertyVisitorOption {
   150  	return func(op *DevicePropertyVisitorOp) {
   151  		op.devicePropertyVisitor.VisitorConfig.Modbus.Register = register
   152  	}
   153  }
   154  
   155  func withOffset(offset int64) DevicePropertyVisitorOption {
   156  	return func(op *DevicePropertyVisitorOp) {
   157  		op.devicePropertyVisitor.VisitorConfig.Modbus.Offset = offset
   158  	}
   159  }
   160  
   161  func withLimit(limit int64) DevicePropertyVisitorOption {
   162  	return func(op *DevicePropertyVisitorOp) {
   163  		op.devicePropertyVisitor.VisitorConfig.Modbus.Limit = limit
   164  	}
   165  }
   166  
   167  func withNodeID(nodeID string) DevicePropertyVisitorOption {
   168  	return func(op *DevicePropertyVisitorOp) {
   169  		op.devicePropertyVisitor.VisitorConfig.OpcUA.NodeID = nodeID
   170  	}
   171  }
   172  
   173  func withBrowseName(browseName string) DevicePropertyVisitorOption {
   174  	return func(op *DevicePropertyVisitorOp) {
   175  		op.devicePropertyVisitor.VisitorConfig.OpcUA.BrowseName = browseName
   176  	}
   177  }
   178  
   179  func (op *DevicePropertyVisitorOp) applyDevicePropVisitorOpts(opts []DevicePropertyVisitorOption) {
   180  	for _, opt := range opts {
   181  		opt(op)
   182  	}
   183  }
   184  
   185  func newDevicePropVisitorOp(opts ...DevicePropertyVisitorOption) *DevicePropertyVisitorOp {
   186  	op := &DevicePropertyVisitorOp{
   187  		devicePropertyVisitor: v1alpha1.DevicePropertyVisitor{},
   188  	}
   189  	op.applyDevicePropVisitorOpts(opts)
   190  	return op
   191  }
   192  
   193  func newDeviceModel(name string, namespace string) *v1alpha1.DeviceModel {
   194  	spec := v1alpha1.DeviceModelSpec{}
   195  	deviceModel := &v1alpha1.DeviceModel{
   196  		ObjectMeta: metav1.ObjectMeta{
   197  			Name:      name,
   198  			Namespace: namespace,
   199  		},
   200  		TypeMeta: metav1.TypeMeta{
   201  			APIVersion: apiVersion,
   202  			Kind:       deviceModelKind,
   203  		},
   204  		Spec: spec,
   205  	}
   206  	return deviceModel
   207  }
   208  
   209  func DeviceModelWithPropertyNoName(name string, namespace string) *v1alpha1.DeviceModel {
   210  	deviceModel := newDeviceModel(name, namespace)
   211  	devicePropertyOp := newDevicePropertyOp(withDescription(devicePropertyTemperatureDesc),
   212  		withStringType(v1alpha1.PropertyAccessMode(v1alpha1.ReadOnly), ""))
   213  	deviceModel.Spec.Properties = append(deviceModel.Spec.Properties, devicePropertyOp.deviceProperty)
   214  	return deviceModel
   215  }
   216  
   217  func DeviceModelWithPropertyNoType(name string, namespace string) *v1alpha1.DeviceModel {
   218  	deviceModel := newDeviceModel(name, namespace)
   219  	devicePropertyOp := newDevicePropertyOp(withName(devicePropertyTemperature), withDescription(devicePropertyTemperatureDesc))
   220  	deviceModel.Spec.Properties = append(deviceModel.Spec.Properties, devicePropertyOp.deviceProperty)
   221  	return deviceModel
   222  }
   223  
   224  func DeviceModelWithPropertyBadAccessMode(name string, namespace string) *v1alpha1.DeviceModel {
   225  	deviceModel := newDeviceModel(name, namespace)
   226  	devicePropertyOp := newDevicePropertyOp(withName(devicePropertyTemperature), withDescription(devicePropertyTemperatureDesc),
   227  		withStringType("", ""))
   228  	deviceModel.Spec.Properties = append(deviceModel.Spec.Properties, devicePropertyOp.deviceProperty)
   229  
   230  	return deviceModel
   231  }
   232  
   233  func NewDeviceModelBluetooth(name string, namespace string) *v1alpha1.DeviceModel {
   234  	deviceModel := newDeviceModel(name, namespace)
   235  	devicePropertyOp := newDevicePropertyOp(withName(devicePropertyTemperature), withDescription(devicePropertyTemperatureDesc),
   236  		withIntType(v1alpha1.PropertyAccessMode(v1alpha1.ReadOnly), 0, minimum, maximum, devicePropertyUnit))
   237  	deviceModel.Spec.Properties = append(deviceModel.Spec.Properties, devicePropertyOp.deviceProperty)
   238  
   239  	devicePropertyVisitorOp := newDevicePropVisitorOp(withVisitorName(devicePropertyTemperature), withVisitorConfig(deviceProtocolBluetooth),
   240  		withCharacteristicUUID(characteristicUUID), withStartIndex(startIndex), withEndIndex(endIndex),
   241  		withOperation(v1alpha1.BluetoothAdd, operationValue))
   242  	deviceModel.Spec.PropertyVisitors = append(deviceModel.Spec.PropertyVisitors, devicePropertyVisitorOp.devicePropertyVisitor)
   243  
   244  	return deviceModel
   245  }
   246  
   247  func NewDeviceModelBluetoothBadOperationType(name string, namespace string) *v1alpha1.DeviceModel {
   248  	deviceModel := newDeviceModel(name, namespace)
   249  	devicePropertyOp := newDevicePropertyOp(withName(devicePropertyTemperature), withDescription(devicePropertyTemperatureDesc),
   250  		withIntType(v1alpha1.PropertyAccessMode(v1alpha1.ReadOnly), 0, minimum, maximum, devicePropertyUnit))
   251  	deviceModel.Spec.Properties = append(deviceModel.Spec.Properties, devicePropertyOp.deviceProperty)
   252  
   253  	devicePropertyVisitorOp := newDevicePropVisitorOp(withVisitorName(devicePropertyTemperature), withVisitorConfig(deviceProtocolBluetooth),
   254  		withCharacteristicUUID(characteristicUUID), withStartIndex(startIndex), withEndIndex(endIndex),
   255  		withOperation("modulo", operationValue))
   256  	deviceModel.Spec.PropertyVisitors = append(deviceModel.Spec.PropertyVisitors, devicePropertyVisitorOp.devicePropertyVisitor)
   257  
   258  	return deviceModel
   259  }
   260  
   261  func NewDeviceModelBluetoothNoStartIndex(name string, namespace string) *v1alpha1.DeviceModel {
   262  	deviceModel := newDeviceModel(name, namespace)
   263  	devicePropertyOp := newDevicePropertyOp(withName(devicePropertyTemperature), withDescription(devicePropertyTemperatureDesc),
   264  		withIntType(v1alpha1.PropertyAccessMode(v1alpha1.ReadOnly), 0, minimum, maximum, devicePropertyUnit))
   265  	deviceModel.Spec.Properties = append(deviceModel.Spec.Properties, devicePropertyOp.deviceProperty)
   266  
   267  	devicePropertyVisitorOp := newDevicePropVisitorOp(withVisitorName(devicePropertyTemperature), withVisitorConfig(deviceProtocolBluetooth),
   268  		withCharacteristicUUID(characteristicUUID), withEndIndex(endIndex), withOperation(v1alpha1.BluetoothAdd, operationValue))
   269  	deviceModel.Spec.PropertyVisitors = append(deviceModel.Spec.PropertyVisitors, devicePropertyVisitorOp.devicePropertyVisitor)
   270  
   271  	return deviceModel
   272  }
   273  
   274  func NewDeviceModelBluetoothNoEndIndex(name string, namespace string) *v1alpha1.DeviceModel {
   275  	deviceModel := newDeviceModel(name, namespace)
   276  	devicePropertyOp := newDevicePropertyOp(withName(devicePropertyTemperature), withDescription(devicePropertyTemperatureDesc),
   277  		withIntType(v1alpha1.PropertyAccessMode(v1alpha1.ReadOnly), 0, minimum, maximum, devicePropertyUnit))
   278  	deviceModel.Spec.Properties = append(deviceModel.Spec.Properties, devicePropertyOp.deviceProperty)
   279  
   280  	devicePropertyVisitorOp := newDevicePropVisitorOp(withVisitorName(devicePropertyTemperature), withVisitorConfig(deviceProtocolBluetooth),
   281  		withCharacteristicUUID(characteristicUUID), withStartIndex(startIndex), withOperation(v1alpha1.BluetoothMultiply, operationValue))
   282  	deviceModel.Spec.PropertyVisitors = append(deviceModel.Spec.PropertyVisitors, devicePropertyVisitorOp.devicePropertyVisitor)
   283  
   284  	return deviceModel
   285  }
   286  
   287  func NewDeviceModelBluetoothNoCharacteristicUUID(name string, namespace string) *v1alpha1.DeviceModel {
   288  	deviceModel := newDeviceModel(name, namespace)
   289  	devicePropertyOp := newDevicePropertyOp(withName(devicePropertyTemperature), withDescription(devicePropertyTemperatureDesc),
   290  		withIntType(v1alpha1.PropertyAccessMode(v1alpha1.ReadOnly), 0, minimum, maximum, devicePropertyUnit))
   291  	deviceModel.Spec.Properties = append(deviceModel.Spec.Properties, devicePropertyOp.deviceProperty)
   292  
   293  	devicePropertyVisitorOp := newDevicePropVisitorOp(withVisitorName(devicePropertyTemperature), withVisitorConfig(deviceProtocolBluetooth),
   294  		withStartIndex(startIndex), withEndIndex(endIndex), withOperation(v1alpha1.BluetoothAdd, operationValue))
   295  	deviceModel.Spec.PropertyVisitors = append(deviceModel.Spec.PropertyVisitors, devicePropertyVisitorOp.devicePropertyVisitor)
   296  
   297  	return deviceModel
   298  }
   299  
   300  func NewDeviceModelModbus(name string, namespace string) *v1alpha1.DeviceModel {
   301  	deviceModel := newDeviceModel(name, namespace)
   302  	devicePropertyOp := newDevicePropertyOp(withName(devicePropertyTemperature), withDescription(devicePropertyTemperatureDesc),
   303  		withIntType(v1alpha1.PropertyAccessMode(v1alpha1.ReadOnly), 0, minimum, maximum, devicePropertyUnit))
   304  	deviceModel.Spec.Properties = append(deviceModel.Spec.Properties, devicePropertyOp.deviceProperty)
   305  
   306  	devicePropertyVisitorOp := newDevicePropVisitorOp(withVisitorName(devicePropertyTemperature), withVisitorConfig(deviceProtocolModbus),
   307  		withRegister(v1alpha1.ModbusRegisterTypeCoilRegister), withLimit(limit), withOffset(offset))
   308  	deviceModel.Spec.PropertyVisitors = append(deviceModel.Spec.PropertyVisitors, devicePropertyVisitorOp.devicePropertyVisitor)
   309  
   310  	return deviceModel
   311  }
   312  
   313  func NewDeviceModelModbusBadRegister(name string, namespace string) *v1alpha1.DeviceModel {
   314  	deviceModel := newDeviceModel(name, namespace)
   315  	devicePropertyOp := newDevicePropertyOp(withName(devicePropertyTemperature), withDescription(devicePropertyTemperatureDesc),
   316  		withIntType(v1alpha1.PropertyAccessMode(v1alpha1.ReadOnly), 0, minimum, maximum, devicePropertyUnit))
   317  	deviceModel.Spec.Properties = append(deviceModel.Spec.Properties, devicePropertyOp.deviceProperty)
   318  
   319  	devicePropertyVisitorOp := newDevicePropVisitorOp(withVisitorName(devicePropertyTemperature), withVisitorConfig(deviceProtocolModbus),
   320  		withRegister("test-register"), withLimit(limit), withOffset(offset))
   321  	deviceModel.Spec.PropertyVisitors = append(deviceModel.Spec.PropertyVisitors, devicePropertyVisitorOp.devicePropertyVisitor)
   322  
   323  	return deviceModel
   324  }
   325  
   326  func NewDeviceModelModbusNoLimit(name string, namespace string) *v1alpha1.DeviceModel {
   327  	deviceModel := newDeviceModel(name, namespace)
   328  	devicePropertyOp := newDevicePropertyOp(withName(devicePropertyTemperature), withDescription(devicePropertyTemperatureDesc),
   329  		withIntType(v1alpha1.PropertyAccessMode(v1alpha1.ReadOnly), 0, minimum, maximum, devicePropertyUnit))
   330  	deviceModel.Spec.Properties = append(deviceModel.Spec.Properties, devicePropertyOp.deviceProperty)
   331  
   332  	devicePropertyVisitorOp := newDevicePropVisitorOp(withVisitorName(devicePropertyTemperature), withVisitorConfig(deviceProtocolModbus),
   333  		withRegister(v1alpha1.ModbusRegisterTypeCoilRegister), withOffset(offset))
   334  	deviceModel.Spec.PropertyVisitors = append(deviceModel.Spec.PropertyVisitors, devicePropertyVisitorOp.devicePropertyVisitor)
   335  	return deviceModel
   336  }
   337  
   338  func NewDeviceModelModbusNoOffset(name string, namespace string) *v1alpha1.DeviceModel {
   339  	deviceModel := newDeviceModel(name, namespace)
   340  	devicePropertyOp := newDevicePropertyOp(withName(devicePropertyTemperature), withDescription(devicePropertyTemperatureDesc),
   341  		withIntType(v1alpha1.PropertyAccessMode(v1alpha1.ReadOnly), 0, minimum, maximum, devicePropertyUnit))
   342  	deviceModel.Spec.Properties = append(deviceModel.Spec.Properties, devicePropertyOp.deviceProperty)
   343  
   344  	devicePropertyVisitorOp := newDevicePropVisitorOp(withVisitorName(devicePropertyTemperature), withVisitorConfig(deviceProtocolModbus),
   345  		withRegister(v1alpha1.ModbusRegisterTypeCoilRegister), withLimit(limit))
   346  	deviceModel.Spec.PropertyVisitors = append(deviceModel.Spec.PropertyVisitors, devicePropertyVisitorOp.devicePropertyVisitor)
   347  
   348  	return deviceModel
   349  }
   350  
   351  func NewDeviceModelModbusNoRegister(name string, namespace string) *v1alpha1.DeviceModel {
   352  	deviceModel := newDeviceModel(name, namespace)
   353  	devicePropertyOp := newDevicePropertyOp(withName(devicePropertyTemperature), withDescription(devicePropertyTemperatureDesc),
   354  		withIntType(v1alpha1.PropertyAccessMode(v1alpha1.ReadOnly), 0, minimum, maximum, devicePropertyUnit))
   355  	deviceModel.Spec.Properties = append(deviceModel.Spec.Properties, devicePropertyOp.deviceProperty)
   356  
   357  	devicePropertyVisitorOp := newDevicePropVisitorOp(withVisitorName(devicePropertyTemperature), withVisitorConfig(deviceProtocolModbus),
   358  		withLimit(limit), withOffset(offset))
   359  	deviceModel.Spec.PropertyVisitors = append(deviceModel.Spec.PropertyVisitors, devicePropertyVisitorOp.devicePropertyVisitor)
   360  
   361  	return deviceModel
   362  }
   363  
   364  func NewDeviceModelOpcUA(name string, namespace string) *v1alpha1.DeviceModel {
   365  	deviceModel := newDeviceModel(name, namespace)
   366  	devicePropertyOp := newDevicePropertyOp(withName(devicePropertyTemperature), withDescription(devicePropertyTemperatureDesc),
   367  		withIntType(v1alpha1.PropertyAccessMode(v1alpha1.ReadOnly), 0, minimum, maximum, devicePropertyUnit))
   368  	deviceModel.Spec.Properties = append(deviceModel.Spec.Properties, devicePropertyOp.deviceProperty)
   369  
   370  	devicePropertyVisitorOp := newDevicePropVisitorOp(withVisitorName(devicePropertyTemperature), withVisitorConfig(deviceProtocolOPCUA),
   371  		withBrowseName("test"), withNodeID("node1"))
   372  	deviceModel.Spec.PropertyVisitors = append(deviceModel.Spec.PropertyVisitors, devicePropertyVisitorOp.devicePropertyVisitor)
   373  	return deviceModel
   374  }
   375  
   376  func NewDeviceModelOpcUANoNodeID(name string, namespace string) *v1alpha1.DeviceModel {
   377  	deviceModel := newDeviceModel(name, namespace)
   378  	devicePropertyOp := newDevicePropertyOp(withName(devicePropertyTemperature), withDescription(devicePropertyTemperatureDesc),
   379  		withIntType(v1alpha1.PropertyAccessMode(v1alpha1.ReadOnly), 0, minimum, maximum, devicePropertyUnit))
   380  	deviceModel.Spec.Properties = append(deviceModel.Spec.Properties, devicePropertyOp.deviceProperty)
   381  
   382  	devicePropertyVisitorOp := newDevicePropVisitorOp(withVisitorName(devicePropertyTemperature), withVisitorConfig(deviceProtocolOPCUA),
   383  		withBrowseName("test"))
   384  	deviceModel.Spec.PropertyVisitors = append(deviceModel.Spec.PropertyVisitors, devicePropertyVisitorOp.devicePropertyVisitor)
   385  	return deviceModel
   386  }