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 }