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  }