github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/cloud/test/integration/crds/validation_test.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 crds 18 19 import ( 20 "encoding/json" 21 "os" 22 "testing" 23 24 "k8s.io/client-go/rest" 25 "k8s.io/client-go/tools/clientcmd" 26 27 "github.com/kubeedge/kubeedge/cloud/pkg/apis/devices/v1alpha1" 28 deviceutils "github.com/kubeedge/kubeedge/cloud/pkg/devicecontroller/utils" 29 "github.com/kubeedge/kubeedge/cloud/test/integration/fixtures" 30 ) 31 32 func buildCrdClient(t *testing.T) *rest.RESTClient { 33 kubeConfigPath := os.Getenv("KUBE_CONFIG") 34 kubeAPIServerURL := os.Getenv("KUBE_APISERVER_URL") 35 kubeConfig, err := clientcmd.BuildConfigFromFlags(kubeAPIServerURL, kubeConfigPath) 36 if err != nil { 37 t.Fatalf("Failed to build device CRD client, error is %v", err) 38 return nil 39 } 40 crdClient, err := deviceutils.NewCRDClient(kubeConfig) 41 if err != nil { 42 t.Fatalf("Failed to build device CRD client, error is %v", err) 43 return nil 44 } 45 return crdClient 46 } 47 48 func TestValidDeviceModel(t *testing.T) { 49 testNamespace := os.Getenv("TESTNS") 50 tests := map[string]struct { 51 deviceModelFn func() *v1alpha1.DeviceModel 52 }{ 53 "valid bluetooth device model": { 54 deviceModelFn: func() *v1alpha1.DeviceModel { 55 deviceModel := fixtures.NewDeviceModelBluetooth("bluetooth-device-model", testNamespace) 56 return deviceModel 57 }, 58 }, 59 "valid modbus rtu device model": { 60 deviceModelFn: func() *v1alpha1.DeviceModel { 61 deviceModel := fixtures.NewDeviceModelModbus("modbus-device-model", testNamespace) 62 return deviceModel 63 }, 64 }, 65 "valid opc ua device model": { 66 deviceModelFn: func() *v1alpha1.DeviceModel { 67 deviceModel := fixtures.NewDeviceModelOpcUA("opcua-device-model", testNamespace) 68 return deviceModel 69 }, 70 }, 71 } 72 73 crdClient := buildCrdClient(t) 74 75 for name, tc := range tests { 76 t.Run(name, func(t *testing.T) { 77 deviceModel := tc.deviceModelFn() 78 respBytes, err := json.Marshal(deviceModel) 79 if err != nil { 80 t.Fatalf("%s : json marshal error : %v", name, err) 81 } 82 result := crdClient.Post().Name(deviceModel.Name).Namespace(deviceModel.Namespace).Resource(fixtures.ResourceDeviceModel).Body(respBytes).Do() 83 if result.Error() != nil { 84 t.Fatalf("%s: expected nil err , got %v", name, result.Error()) 85 } 86 }) 87 } 88 } 89 90 func TestInvalidDeviceModel(t *testing.T) { 91 testNamespace := os.Getenv("TESTNS") 92 tests := map[string]struct { 93 deviceModelFn func() *v1alpha1.DeviceModel 94 }{ 95 "device model with property no name": { 96 deviceModelFn: func() *v1alpha1.DeviceModel { 97 deviceModel := fixtures.DeviceModelWithPropertyNoName("device-model-property-no-name", testNamespace) 98 return deviceModel 99 }, 100 }, 101 102 "device model with property bad access mode": { 103 deviceModelFn: func() *v1alpha1.DeviceModel { 104 deviceModel := fixtures.DeviceModelWithPropertyBadAccessMode("model-property-bad-access-mode", testNamespace) 105 return deviceModel 106 }, 107 }, 108 109 "device model with ble protocol property bad operation type": { 110 deviceModelFn: func() *v1alpha1.DeviceModel { 111 deviceModel := fixtures.NewDeviceModelBluetoothBadOperationType("model-bluetooth-bad-operation-type", testNamespace) 112 return deviceModel 113 }, 114 }, 115 "device model with ble protocol property no start index": { 116 deviceModelFn: func() *v1alpha1.DeviceModel { 117 deviceModel := fixtures.NewDeviceModelBluetoothNoStartIndex("model-bluetooth-no-start-index", testNamespace) 118 return deviceModel 119 }, 120 }, 121 "device model with ble protocol property no end index": { 122 deviceModelFn: func() *v1alpha1.DeviceModel { 123 deviceModel := fixtures.NewDeviceModelBluetoothNoEndIndex("model-bluetooth-bad-operation-type", testNamespace) 124 return deviceModel 125 }, 126 }, 127 "device model with ble protocol property no characteristic UUID": { 128 deviceModelFn: func() *v1alpha1.DeviceModel { 129 deviceModel := fixtures.NewDeviceModelBluetoothNoCharacteristicUUID("model-bluetooth-no-char-uuid", testNamespace) 130 return deviceModel 131 }, 132 }, 133 "device model with modbus protocol property bad register": { 134 deviceModelFn: func() *v1alpha1.DeviceModel { 135 deviceModel := fixtures.NewDeviceModelModbusBadRegister("model-modbus-bad-register", testNamespace) 136 return deviceModel 137 }, 138 }, 139 "device model with modbus protocol property no register": { 140 deviceModelFn: func() *v1alpha1.DeviceModel { 141 deviceModel := fixtures.NewDeviceModelModbusNoRegister("model-modbus-no-register", testNamespace) 142 return deviceModel 143 }, 144 }, 145 "device model with modbus protocol property no limit": { 146 deviceModelFn: func() *v1alpha1.DeviceModel { 147 deviceModel := fixtures.NewDeviceModelModbusNoLimit("model-modbus-no-limit", testNamespace) 148 return deviceModel 149 }, 150 }, 151 "device model with ble protocol with no offset": { 152 deviceModelFn: func() *v1alpha1.DeviceModel { 153 deviceModel := fixtures.NewDeviceModelModbusNoOffset("model-modbus-no-offset", testNamespace) 154 return deviceModel 155 }, 156 }, 157 "device model with opc ua property no nodeID": { 158 deviceModelFn: func() *v1alpha1.DeviceModel { 159 deviceModel := fixtures.NewDeviceModelOpcUANoNodeID("model-modbus-no-nodeID", testNamespace) 160 return deviceModel 161 }, 162 }, 163 } 164 165 crdClient := buildCrdClient(t) 166 167 for name, tc := range tests { 168 t.Run(name, func(t *testing.T) { 169 deviceModel := tc.deviceModelFn() 170 deviceModelJSON, err := json.Marshal(deviceModel) 171 if err != nil { 172 t.Fatalf("%s : error while marshalling device model : %v", name, err) 173 } 174 result := crdClient.Post().Name(deviceModel.Name).Namespace(deviceModel.Namespace).Resource(fixtures.ResourceDeviceModel). 175 Body(deviceModelJSON).Do() 176 if result.Error() == nil { 177 t.Fatalf("%s: expected error", name) 178 } 179 }) 180 } 181 } 182 183 func TestValidDevice(t *testing.T) { 184 testNamespace := os.Getenv("TESTNS") 185 tests := map[string]struct { 186 deviceInstanceFn func() v1alpha1.Device 187 }{ 188 "valid device with modbus rtu protocol": { 189 deviceInstanceFn: func() v1alpha1.Device { 190 deviceInstance := fixtures.NewDeviceModbusRTU("device-modbus-rtu", testNamespace) 191 return deviceInstance 192 }, 193 }, 194 "valid device with modbus tcp protocol": { 195 deviceInstanceFn: func() v1alpha1.Device { 196 deviceInstance := fixtures.NewDeviceModbusTCP("device-modbus-tcp", testNamespace) 197 return deviceInstance 198 }, 199 }, 200 "valid device with opc ua protocol": { 201 deviceInstanceFn: func() v1alpha1.Device { 202 deviceInstance := fixtures.NewDeviceOpcUA("device-opcua", testNamespace) 203 return deviceInstance 204 }, 205 }, 206 } 207 208 crdClient := buildCrdClient(t) 209 210 for name, tc := range tests { 211 t.Run(name, func(t *testing.T) { 212 device := tc.deviceInstanceFn() 213 deviceJSON, err := json.Marshal(device) 214 if err != nil { 215 t.Fatalf("%s : error while marshalling device : %v", name, err) 216 } 217 result := crdClient.Post().Name(device.Name).Namespace(device.Namespace).Resource(fixtures.ResourceDevice).Body(deviceJSON).Do() 218 if result.Error() != nil { 219 t.Fatalf("%s expected nil err , got %v", name, result.Error()) 220 } 221 }) 222 } 223 } 224 225 func TestInvalidDevice(t *testing.T) { 226 testNamespace := os.Getenv("TESTNS") 227 tests := map[string]struct { 228 deviceInstanceFn func() v1alpha1.Device 229 }{ 230 "device modbus rtu no baud rate": { 231 deviceInstanceFn: func() v1alpha1.Device { 232 deviceInstance := fixtures.NewDeviceModbusRTUNoBaudRate("device-modbus-rtu-no-baud-rate", testNamespace) 233 return deviceInstance 234 }, 235 }, 236 "device modbus rtu bad baud rate": { 237 deviceInstanceFn: func() v1alpha1.Device { 238 deviceInstance := fixtures.NewDeviceModbusRTUBadBaudRate("device-modbus-rtu-bad-baud-rate", testNamespace) 239 return deviceInstance 240 }, 241 }, 242 "device modbus rtu no data bits": { 243 deviceInstanceFn: func() v1alpha1.Device { 244 deviceInstance := fixtures.NewDeviceModbusRTUNoDataBits("device-modbus-rtu-no-data-bits", testNamespace) 245 return deviceInstance 246 }, 247 }, 248 "device modbus rtu bad data bits": { 249 deviceInstanceFn: func() v1alpha1.Device { 250 deviceInstance := fixtures.NewDeviceModbusRTUBadDataBits("device-modbus-rtu-bad-data-bits", testNamespace) 251 return deviceInstance 252 }, 253 }, 254 "device modbus rtu no parity": { 255 deviceInstanceFn: func() v1alpha1.Device { 256 deviceInstance := fixtures.NewDeviceModbusRTUNoParity("device-modbus-rtu-no-parity", testNamespace) 257 return deviceInstance 258 }, 259 }, 260 "device modbus rtu bad parity": { 261 deviceInstanceFn: func() v1alpha1.Device { 262 deviceInstance := fixtures.NewDeviceModbusRTUBadParity("device-modbus-rtu-bad-parity", testNamespace) 263 return deviceInstance 264 }, 265 }, 266 "device modbus rtu no serial port": { 267 deviceInstanceFn: func() v1alpha1.Device { 268 deviceInstance := fixtures.NewDeviceModbusRTUNoSerialPort("device-modbus-rtu-no-serial-port", testNamespace) 269 return deviceInstance 270 }, 271 }, 272 "device modbus rtu no slave id": { 273 deviceInstanceFn: func() v1alpha1.Device { 274 deviceInstance := fixtures.NewDeviceModbusRTUNoSlaveID("device-modbus-rtu-no-slaveID", testNamespace) 275 return deviceInstance 276 }, 277 }, 278 "device modbus rtu bad slave id": { 279 deviceInstanceFn: func() v1alpha1.Device { 280 deviceInstance := fixtures.NewDeviceModbusRTUBadSlaveID("device-modbus-bad-slaveID", testNamespace) 281 return deviceInstance 282 }, 283 }, 284 "device modbus rtu no stop bits": { 285 deviceInstanceFn: func() v1alpha1.Device { 286 deviceInstance := fixtures.NewDeviceModbusRTUNoStopBits("device-modbus-rtu-no-stopbits", testNamespace) 287 return deviceInstance 288 }, 289 }, 290 "device modbus rtu bad_stop_bits": { 291 deviceInstanceFn: func() v1alpha1.Device { 292 deviceInstance := fixtures.NewDeviceModbusRTUBadStopBits("device-modbus-rtu-bad-stopbits", testNamespace) 293 return deviceInstance 294 }, 295 }, 296 "device modbus tcp no IP": { 297 deviceInstanceFn: func() v1alpha1.Device { 298 deviceInstance := fixtures.NewDeviceModbusTCPNoIP("device-modbus-tcp-no-IP", testNamespace) 299 return deviceInstance 300 }, 301 }, 302 "device modbus tcp no port": { 303 deviceInstanceFn: func() v1alpha1.Device { 304 deviceInstance := fixtures.NewDeviceModbusTCPNoPort("device-modbus-tcp-no-port", testNamespace) 305 return deviceInstance 306 }, 307 }, 308 "device modbus tcp no slaveID": { 309 deviceInstanceFn: func() v1alpha1.Device { 310 deviceInstance := fixtures.NewDeviceModbusTCPNoSlaveID("device-modbus-tcp-no-slaveID", testNamespace) 311 return deviceInstance 312 }, 313 }, 314 "device opcua no url": { 315 deviceInstanceFn: func() v1alpha1.Device { 316 deviceInstance := fixtures.NewDeviceOpcUANoURL("device-opcua-no-url", testNamespace) 317 return deviceInstance 318 }, 319 }, 320 "device no model reference": { 321 deviceInstanceFn: func() v1alpha1.Device { 322 deviceInstance := fixtures.NewDeviceNoModelReference("device-no-model-ref", "default") 323 return deviceInstance 324 }, 325 }, 326 } 327 328 crdClient := buildCrdClient(t) 329 330 for name, tc := range tests { 331 t.Run(name, func(t *testing.T) { 332 device := tc.deviceInstanceFn() 333 deviceJSON, err := json.Marshal(device) 334 if err != nil { 335 t.Fatalf("%s : error while marshalling device : %v", name, err) 336 } 337 result := crdClient.Post().Name(device.Name).Namespace(device.Namespace).Resource(fixtures.ResourceDevice).Body(deviceJSON).Do() 338 if result.Error() == nil { 339 t.Fatalf("%s : expected error", name) 340 } 341 }) 342 } 343 }