1 # Copyright 2018 ZTE Corporation.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
20 from django.test import Client
21 from django.test import TestCase
22 from rest_framework import status
24 from lcm.pub.database.models import FPInstModel, CPInstModel, PortInstModel, NfInstModel
25 from lcm.pub.database.models import VNFFGInstModel
26 from lcm.pub.msapi import extsys
27 from lcm.pub.msapi import sdncdriver
28 from lcm.pub.utils import restcall
29 from lcm.ns_sfcs.biz.create_sfc_worker import CreateSfcWorker
30 from lcm.pub.utils.jobutil import JobUtil
31 from lcm.ns_sfcs.tests.test_data import nsd_model
34 class TestSfc(TestCase):
36 self.client = Client()
37 FPInstModel.objects.filter().delete()
38 VNFFGInstModel.objects.filter().delete()
39 CPInstModel.objects.filter().delete()
40 PortInstModel.objects.filter().delete()
41 NfInstModel.objects.filter().delete()
43 self.save_vnffg_inst_data()
44 self.save_vnf_inst_data()
45 self.save_cp_inst_data()
46 self.save_port_inst_data()
47 self.save_fp_inst_data()
50 FPInstModel.objects.filter().delete()
51 VNFFGInstModel.objects.filter().delete()
52 CPInstModel.objects.filter().delete()
53 PortInstModel.objects.filter().delete()
54 NfInstModel.objects.filter().delete()
56 @mock.patch.object(extsys, "get_sdn_controller_by_id")
57 @mock.patch.object(sdncdriver, "create_flow_classfier")
58 @mock.patch.object(restcall, 'call_req')
59 def test_create_flow_classfier(self, mock_call_req, mock_create_flow_classfier, mock_get_sdn_controller_by_id):
61 "fpinstid": "fp_inst_1",
62 "context": json.dumps(nsd_model)
64 mock_create_flow_classfier.return_value = [0, json.dumps({'id': '1'})]
65 mock_get_sdn_controller_by_id.return_value = json.loads('{"test":"test_name","url":"url_add"}')
66 resp = self.client.post("/api/nslcm/v1/ns/create_flow_classifier", data)
67 self.assertEqual(resp.status_code, status.HTTP_200_OK)
69 @mock.patch.object(extsys, "get_sdn_controller_by_id")
70 @mock.patch.object(sdncdriver, 'create_port_pair_group')
71 @mock.patch.object(sdncdriver, 'create_port_pair')
72 @mock.patch.object(restcall, 'call_req')
73 def test_create_port_pair_group(self, mock_call_req, mock_create_port_pair,
74 mock_create_port_pair_group, mock_get_sdn_controller_by_id):
76 "nsinstanceid": "ns_inst_1",
77 "fpinstid": "fp_inst_1",
78 "context": json.dumps(nsd_model)
80 mock_create_port_pair.return_value = [0, json.dumps({'id': '1'})]
81 mock_create_port_pair_group.return_value = [0, json.dumps({'id': '1'})]
82 mock_get_sdn_controller_by_id.return_value = json.loads('{"test":"test_name","url":"url_add"}')
83 resp = self.client.post("/api/nslcm/v1/ns/create_port_pair_group", data)
84 self.assertEqual(resp.status_code, status.HTTP_200_OK)
86 @mock.patch.object(extsys, "get_sdn_controller_by_id")
87 @mock.patch.object(sdncdriver, 'create_port_chain')
88 @mock.patch.object(restcall, 'call_req')
89 def test_create_port_chain(self, mock_call_req, mock_create_port_chain, mock_get_sdn_controller_by_id):
91 "nsinstanceid": "ns_inst_1",
92 "fpinstid": "fp_inst_1",
93 "context": json.dumps(nsd_model)
95 self.update_fp_inst_data()
96 mock_create_port_chain.return_value = [0, json.dumps({'id': '1'})]
97 mock_get_sdn_controller_by_id.return_value = json.loads('{"test":"test_name","url":"url_add"}')
98 resp = self.client.post("/api/nslcm/v1/ns/create_port_chain", data)
99 self.assertEqual(resp.status_code, status.HTTP_200_OK)
101 @mock.patch.object(CreateSfcWorker, 'run')
102 @mock.patch.object(JobUtil, 'create_job')
103 @mock.patch.object(time, 'sleep')
104 def test_create_sfc(self, mock_sleep, mock_create_job, mock_run):
105 mock_create_job.return_value = 'job_id_1'
106 mock_sleep.return_value = None
107 mock_run.return_value = None
109 'nsInstanceid': "ns_inst_1",
110 "context": json.dumps(nsd_model),
112 'fpinstid': str(uuid.uuid4()),
113 "sdnControllerId": "sdnControllerId_1"
115 self.client.post("/api/nslcm/v1/ns/sfcs", data, format='json')
116 # self.assertEqual(resp.status_code, status.HTTP_200_OK)
117 # self.assertEqual(resp.data['jobId'], 'job_id_1')
119 def update_fp_inst_data(self):
120 FPInstModel.objects.filter(fpinstid="fp_inst_1").update(flowclassifiers="1",
121 portpairgroups=json.JSONEncoder().encode([{
126 def save_vnffg_inst_data(self):
128 vnffgdid="vnffg_id1",
129 vnffginstid="vnffg_inst_1",
130 nsinstid="ns_inst_1",
137 def save_cp_inst_data(self):
139 cpinstanceid="cp_inst_1",
142 ownerid="vnf_inst_1",
144 relatedport="port_inst_1"
148 cpinstanceid="cp_inst_2",
151 ownerid="vnf_inst_2",
153 relatedport="port_inst_2"
156 def save_fp_inst_data(self):
159 fpinstid="fp_inst_1",
160 nsinstid="ns_inst_1",
161 vnffginstid="vnffg_inst_1",
165 "dest_port_range": [80, 1024],
166 "source_port_range": [80, 1024],
167 "ip_protocol": "tcp",
168 "dest_ip_range": ["192.168.1.2", "192.168.1.100"],
169 "source_ip_range": ["192.168.1.2", "192.168.1.100"],
174 sdncontrollerid="sdn_controller_1"
180 fpinstid="fp_inst_2",
181 nsinstid="ns_inst_1",
182 vnffginstid="vnffg_inst_1",
186 "dest_port_range": [80, 1024],
187 "source_port_range": [80, 1024],
188 "ip_protocol": "tcp",
189 "dest_ip_range": ["192.168.1.2", "192.168.1.100"],
190 "source_ip_range": ["192.168.1.2", "192.168.1.100"],
195 sdncontrollerid="sdn_controller_1"
198 def save_port_inst_data(self):
200 portid="port_inst_1",
201 networkid="network_inst_1",
202 subnetworkid="subnetwork_inst_1",
205 ipaddress="10.43.25.2",
206 macaddress="EC-F4-BB-20-43-F1"
210 portid="port_inst_2",
211 networkid="network_inst_1",
212 subnetworkid="subnetwork_inst_1",
215 ipaddress="10.43.25.3",
216 macaddress="EC-F4-BB-20-43-F2"
219 def save_vnf_inst_data(self):
221 nfinstid="vnf_inst_1",
222 ns_inst_id="ns_inst_1",
224 vnfd_model=json.dumps(vnfd_model_dict1)
229 nfinstid="vnf_inst_2",
231 ns_inst_id="ns_inst_1",
232 vnfd_model=json.dumps(vnfd_model_dict2)
250 'vdu_id': 'vdu_omm.001',
251 'image_file': 'opencos_sss_omm_img_release_20150723-1-disk1',
263 'support_scaling': False,
266 'storage_policy': '',
269 'availability_zone': '',
275 'inject_data_list': [
282 'local_affinity_antiaffinity_rule': {
285 'template_id': 'omm.001',
286 'manual_scale_select_vim': False
288 'description': 'singleommvm'
314 'support_scaling': False,
317 'storage_policy': '',
320 'availability_zone': '',
326 'inject_data_list': [
333 'local_affinity_antiaffinity_rule': {
337 'manual_scale_select_vim': False
339 'description': 'ompvm'
365 'support_scaling': False,
368 'storage_policy': '',
371 'availability_zone': '',
377 'inject_data_list': [
384 'local_affinity_antiaffinity_rule': {
388 'manual_scale_select_vim': False
390 'description': 'ompvm'
416 'support_scaling': False,
419 'storage_policy': '',
422 'availability_zone': '',
428 'inject_data_list': [
435 'local_affinity_antiaffinity_rule': {
439 'manual_scale_select_vim': False
441 'description': 'ompvm'
467 'support_scaling': False,
470 'storage_policy': '',
473 'availability_zone': '',
479 'inject_data_list': [
486 'local_affinity_antiaffinity_rule': {
490 'manual_scale_select_vim': False
492 'description': 'ppvm'
518 'support_scaling': False,
521 'storage_policy': '',
524 'availability_zone': '',
530 'inject_data_list': [
537 'local_affinity_antiaffinity_rule': {
541 'manual_scale_select_vim': False
543 'description': 'ppvm'
569 'support_scaling': False,
572 'storage_policy': '',
575 'availability_zone': '',
581 'inject_data_list': [
588 'local_affinity_antiaffinity_rule': {
592 'manual_scale_select_vim': False
594 'description': 'ppvm'
605 'policy_id': 'policy_scale_sss-vnf-template',
607 'policy_file': '*-vnfd.zip/*-vnf-policy.xml'
616 'name': 'opencos_sss_omm_img_release_20150723-1-disk1.vmdk',
618 'disk_format': 'VMDK',
619 'file_url': './zte-cn-sss-main-image/OMM/opencos_sss_omm_img_release_20150723-1-disk1.vmdk',
620 'container_type': 'vm',
622 'hypervisor_type': 'kvm'
624 'image_file_id': 'opencos_sss_omm_img_release_20150723-1-disk1'
631 'disk_format': 'VMDK',
632 'file_url': './zte-cn-sss-main-image/NE/sss.vmdk',
633 'container_type': 'vm',
635 'hypervisor_type': 'kvm'
637 'image_file_id': 'sss'
647 "mac_address": "00:d9:00:82:11:e1",
648 "ip_address": "10.43.25.2",
649 "ip_range_start": "192.168.1.20",
650 "ip_range_end": "192.168.1.29",
651 "sfc_encapsulation": ""
660 'version': 'v4.14.10',
661 'vmnumber_overquota_alarm': False,
664 'vnfd_version': 'V00000001',
666 'name': 'sss-vnf-template'
672 "key_name": "virtualLink1",
678 "key_name": "forwarder1",
682 "key_name": "forwarder2",
705 'vdu_id': 'vdu_omm.001',
706 'image_file': 'opencos_sss_omm_img_release_20150723-1-disk1',
718 'support_scaling': False,
721 'storage_policy': '',
724 'availability_zone': '',
730 'inject_data_list': [
737 'local_affinity_antiaffinity_rule': {
740 'template_id': 'omm.001',
741 'manual_scale_select_vim': False
743 'description': 'singleommvm'
769 'support_scaling': False,
772 'storage_policy': '',
775 'availability_zone': '',
781 'inject_data_list': [
788 'local_affinity_antiaffinity_rule': {
792 'manual_scale_select_vim': False
794 'description': 'ompvm'
820 'support_scaling': False,
823 'storage_policy': '',
826 'availability_zone': '',
832 'inject_data_list': [
839 'local_affinity_antiaffinity_rule': {
843 'manual_scale_select_vim': False
845 'description': 'ompvm'
871 'support_scaling': False,
874 'storage_policy': '',
877 'availability_zone': '',
883 'inject_data_list': [
890 'local_affinity_antiaffinity_rule': {
894 'manual_scale_select_vim': False
896 'description': 'ompvm'
922 'support_scaling': False,
925 'storage_policy': '',
928 'availability_zone': '',
934 'inject_data_list': [
941 'local_affinity_antiaffinity_rule': {
945 'manual_scale_select_vim': False
947 'description': 'ppvm'
973 'support_scaling': False,
976 'storage_policy': '',
979 'availability_zone': '',
985 'inject_data_list': [
992 'local_affinity_antiaffinity_rule': {
996 'manual_scale_select_vim': False
998 'description': 'ppvm'
1001 'volumn_storages': [
1012 'image_file': 'sss',
1024 'support_scaling': False,
1027 'storage_policy': '',
1030 'availability_zone': '',
1036 'inject_data_list': [
1043 'local_affinity_antiaffinity_rule': {
1046 'template_id': '12',
1047 'manual_scale_select_vim': False
1049 'description': 'ppvm'
1052 'volumn_storages': [
1060 'policy_id': 'policy_scale_sss-vnf-template',
1062 'policy_file': '*-vnfd.zip/*-vnf-policy.xml'
1071 'name': 'opencos_sss_omm_img_release_20150723-1-disk1.vmdk',
1073 'disk_format': 'VMDK',
1074 'file_url': './zte-cn-sss-main-image/OMM/opencos_sss_omm_img_release_20150723-1-disk1.vmdk',
1075 'container_type': 'vm',
1077 'hypervisor_type': 'kvm'
1079 'image_file_id': 'opencos_sss_omm_img_release_20150723-1-disk1'
1086 'disk_format': 'VMDK',
1087 'file_url': './zte-cn-sss-main-image/NE/sss.vmdk',
1088 'container_type': 'vm',
1090 'hypervisor_type': 'kvm'
1092 'image_file_id': 'sss'
1102 "mac_address": "00:d9:00:82:11:e2",
1103 "ip_address": "10.43.25.3",
1104 "ip_range_start": "192.168.1.20",
1105 "ip_range_end": "192.168.1.29",
1106 "sfc_encapsulation": ""
1114 'domain_type': 'CN',
1115 'version': 'v4.14.10',
1116 'vmnumber_overquota_alarm': False,
1119 'vnfd_version': 'V00000001',
1120 'id': 'sss-vnf-template',
1126 "key_name": "virtualLink1",
1132 "key_name": "forwarder2",
1136 "key_name": "forwarder3",