f44488ee555294450f02fa6cc86e44cbb54816ae
[modeling/etsicatalog.git] / genericparser / packages / tests / test_nspackage.py
1 # Copyright 2017 ZTE Corporation.
2 #
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
6 #
7 #         http://www.apache.org/licenses/LICENSE-2.0
8 #
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.
14
15 import json
16 import mock
17 from rest_framework import status
18 from django.test import TestCase
19 from django.test import Client
20
21 from genericparser.pub.utils import restcall, toscaparsers
22 from genericparser.pub.database.models import NSPackageModel, VnfPackageModel, PnfPackageModel
23 from genericparser.pub.msapi import sdc
24
25
26 class TestNsPackage(TestCase):
27     def setUp(self):
28         self.client = Client()
29         NSPackageModel.objects.filter().delete()
30         VnfPackageModel.objects.filter().delete()
31         self.nsd_data = {"vnffgs": [{"vnffg_id": "vnffg1",
32                                      "description": "",
33                                      "members": ["path1",
34                                                  "path2"],
35                                      "properties": {"vendor": "zte",
36                                                     "connection_point": ["m6000_data_in",
37                                                                          "m600_tunnel_cp",
38                                                                          "m6000_data_out"],
39                                                     "version": "1.0",
40                                                     "constituent_vnfs": ["VFW",
41                                                                          "VNAT"],
42                                                     "number_of_endpoints": 3,
43                                                     "dependent_virtual_link": ["sfc_data_network",
44                                                                                "ext_datanet_net",
45                                                                                "ext_mnet_net"]}}],
46                          "inputs": {"sfc_data_network": {"type": "string",
47                                                          "value": "sfc_data_network"},
48                                     "externalDataNetworkName": {"type": "string",
49                                                                 "value": "vlan_4004_tunnel_net"},
50                                     "externalManageNetworkName": {"type": "string",
51                                                                   "value": "vlan_4008_mng_net"},
52                                     "NatIpRange": {"type": "string",
53                                                    "value": "192.167.0.10-192.168.0.20"},
54                                     "externalPluginManageNetworkName": {"type": "string",
55                                                                         "value": "vlan_4007_plugin_net"}},
56                          "pnfs": [{"pnf_id": "m6000_s",
57                                    "cps": [],
58                                    "description": "",
59                                    "properties": {"vendor": "zte",
60                                                   "request_reclassification": False,
61                                                   "pnf_type": "m6000s",
62                                                   "version": "1.0",
63                                                   "management_address": "111111",
64                                                   "id": "m6000_s",
65                                                   "nsh_aware": False}}],
66                          "fps": [{"properties": {"symmetric": False,
67                                                  "policy": {"type": "ACL",
68                                                             "criteria": {"dest_port_range": "1-100",
69                                                                          "ip_protocol": "tcp",
70                                                                          "source_ip_range": ["119.1.1.1-119.1.1.10"],
71                                                                          "dest_ip_range": [{"get_input": "NatIpRange"}],
72                                                                          "dscp": 0,
73                                                                          "source_port_range": "1-100"}}},
74                                   "forwarder_list": [{"capability": "",
75                                                       "type": "cp",
76                                                       "node_name": "m6000_data_out"},
77                                                      {"capability": "",
78                                                       "type": "cp",
79                                                       "node_name": "m600_tunnel_cp"},
80                                                      {"capability": "vnat_fw_inout",
81                                                       "type": "vnf",
82                                                       "node_name": "VNAT"}],
83                                   "description": "",
84                                   "fp_id": "path2"},
85                                  {"properties": {"symmetric": True,
86                                                  "policy": {"type": "ACL",
87                                                             "criteria": {"dest_port_range": "1-100",
88                                                                          "ip_protocol": "tcp",
89                                                                          "source_ip_range": ["1-100"],
90                                                                          "dest_ip_range": ["1-100"],
91                                                                          "dscp": 4,
92                                                                          "source_port_range": "1-100"}}},
93                                   "forwarder_list": [{"capability": "",
94                                                       "type": "cp",
95                                                       "node_name": "m6000_data_in"},
96                                                      {"capability": "",
97                                                       "type": "cp",
98                                                       "node_name": "m600_tunnel_cp"},
99                                                      {"capability": "vfw_fw_inout",
100                                                       "type": "vnf",
101                                                       "node_name": "VFW"},
102                                                      {"capability": "vnat_fw_inout",
103                                                       "type": "vnf",
104                                                       "node_name": "VNAT"},
105                                                      {"capability": "",
106                                                       "type": "cp",
107                                                       "node_name": "m600_tunnel_cp"},
108                                                      {"capability": "",
109                                                       "type": "cp",
110                                                       "node_name": "m6000_data_out"}],
111                                   "description": "",
112                                   "fp_id": "path1"}],
113                          "routers": [],
114                          "vnfs": [{"vnf_id": "VFW",
115                                    "description": "",
116                                    "properties": {"plugin_info": "vbrasplugin_1.0",
117                                                   "vendor": "zte",
118                                                   "is_shared": False,
119                                                   "adjust_vnf_capacity": True,
120                                                   "name": "VFW",
121                                                   "vnf_extend_type": "driver",
122                                                   "csarVersion": "v1.0",
123                                                   "csarType": "NFAR",
124                                                   "csarProvider": "ZTE",
125                                                   "version": "1.0",
126                                                   "nsh_aware": True,
127                                                   "cross_dc": False,
128                                                   "vnf_type": "VFW",
129                                                   "vmnumber_overquota_alarm": True,
130                                                   "vnfd_version": "1.0.0",
131                                                   "externalPluginManageNetworkName": "vlan_4007_plugin_net",
132                                                   "id": "vcpe_vfw_zte_1_0",
133                                                   "request_reclassification": False},
134                                    "dependencies": [{"key_name": "vfw_ctrl_by_manager_cp",
135                                                      "vl_id": "ext_mnet_net"},
136                                                     {"key_name": "vfw_data_cp",
137                                                      "vl_id": "sfc_data_network"}],
138                                    "type": "tosca.nodes.nfv.ext.zte.VNF.VFW",
139                                    "networks": []}],
140                          "ns_exposed": {"external_cps": [],
141                                         "forward_cps": []},
142                          "policies": [{"file_url": "policies/abc.drl",
143                                        "name": "aaa"}],
144                          "vls": [{"route_id": "",
145                                   "vl_id": "ext_mnet_net",
146                                   "route_external": False,
147                                   "description": "",
148                                   "properties": {"name": "vlan_4008_mng_net",
149                                                  "mtu": 1500,
150                                                  "location_info": {"tenant": "admin",
151                                                                    "vimid": 2,
152                                                                    "availability_zone": "nova"},
153                                                  "ip_version": 4,
154                                                  "dhcp_enabled": True,
155                                                  "network_name": "vlan_4008_mng_net",
156                                                  "network_type": "vlan"}},
157                                  {"route_id": "",
158                                   "vl_id": "ext_datanet_net",
159                                   "route_external": False,
160                                   "description": "",
161                                   "properties": {"name": "vlan_4004_tunnel_net",
162                                                  "mtu": 1500,
163                                                  "location_info": {"tenant": "admin",
164                                                                    "vimid": 2,
165                                                                    "availability_zone": "nova"},
166                                                  "ip_version": 4,
167                                                  "dhcp_enabled": True,
168                                                  "network_name": "vlan_4004_tunnel_net",
169                                                  "network_type": "vlan"}},
170                                  {"route_id": "",
171                                   "vl_id": "sfc_data_network",
172                                   "route_external": False,
173                                   "description": "",
174                                   "properties": {"name": "sfc_data_network",
175                                                  "dhcp_enabled": True,
176                                                  "is_predefined": False,
177                                                  "location_info": {"tenant": "admin",
178                                                                    "vimid": 2,
179                                                                    "availability_zone": "nova"},
180                                                  "ip_version": 4,
181                                                  "mtu": 1500,
182                                                  "network_name": "sfc_data_network",
183                                                  "network_type": "vlan"}}],
184                          "cps": [{"pnf_id": "m6000_s",
185                                   "vl_id": "path2",
186                                   "description": "",
187                                   "cp_id": "m6000_data_out",
188                                   "properties": {"direction": "bidirectional",
189                                                  "vnic_type": "normal",
190                                                  "bandwidth": 0,
191                                                  "mac_address": "11-22-33-22-11-44",
192                                                  "interface_name": "xgei-0/4/1/5",
193                                                  "ip_address": "176.1.1.2",
194                                                  "order": 0,
195                                                  "sfc_encapsulation": "mac"}},
196                                  {"pnf_id": "m6000_s",
197                                   "vl_id": "ext_datanet_net",
198                                   "description": "",
199                                   "cp_id": "m600_tunnel_cp",
200                                   "properties": {"direction": "bidirectional",
201                                                  "vnic_type": "normal",
202                                                  "bandwidth": 0,
203                                                  "mac_address": "00-11-00-22-33-00",
204                                                  "interface_name": "gei-0/4/0/13",
205                                                  "ip_address": "191.167.100.5",
206                                                  "order": 0,
207                                                  "sfc_encapsulation": "mac"}},
208                                  {"pnf_id": "m6000_s",
209                                   "vl_id": "path2",
210                                   "description": "",
211                                   "cp_id": "m6000_data_in",
212                                   "properties": {"direction": "bidirectional",
213                                                  "vnic_type": "normal",
214                                                  "bandwidth": 0,
215                                                  "mac_address": "11-22-33-22-11-41",
216                                                  "interface_name": "gei-0/4/0/7",
217                                                  "ip_address": "1.1.1.1",
218                                                  "order": 0,
219                                                  "sfc_encapsulation": "mac",
220                                                  "bond": "none"}},
221                                  {"pnf_id": "m6000_s",
222                                   "vl_id": "ext_mnet_net",
223                                   "description": "",
224                                   "cp_id": "m600_mnt_cp",
225                                   "properties": {"direction": "bidirectional",
226                                                  "vnic_type": "normal",
227                                                  "bandwidth": 0,
228                                                  "mac_address": "00-11-00-22-33-11",
229                                                  "interface_name": "gei-0/4/0/1",
230                                                  "ip_address": "10.46.244.51",
231                                                  "order": 0,
232                                                  "sfc_encapsulation": "mac",
233                                                  "bond": "none"}}],
234                          "metadata": {"invariant_id": "vcpe_ns_sff_1",
235                                       "name": "VCPE_NS",
236                                       "csarVersion": "v1.0",
237                                       "csarType": "NSAR",
238                                       "csarProvider": "ZTE",
239                                       "version": 1,
240                                       "vendor": "ZTE",
241                                       "id": "VCPE_NS",
242                                       "description": "vcpe_ns"},
243                          "ns": {
244                              "properties": {
245                                  "descriptor_id": "VCPE_NS",
246                                  "version": 1,
247                                  "name": "VCPE_NS",
248                                  "desginer": "ZTE",
249                                  "invariant_id": "vcpe_ns_sff_1"
250                              }
251         }
252         }
253
254     def tearDown(self):
255         pass
256
257     def test_ns_pkg_distribute_when_ns_exists(self):
258         NSPackageModel(nsPackageId="1", nsdId="2").save()
259         resp = self.client.post(
260             "/api/genericparser/v1/nspackages", {"csarId": "1"}, format='json')
261         self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
262         self.assertEqual("failed", resp.data["status"])
263         self.assertEqual(
264             "NS CSAR(1) already exists.",
265             resp.data["statusDescription"])
266
267     @mock.patch.object(restcall, 'call_req')
268     def test_ns_pkg_distribute_when_csar_not_exist(self, mock_call_req):
269         mock_call_req.return_value = [0, "[]", '200']
270         resp = self.client.post(
271             "/api/genericparser/v1/nspackages", {"csarId": "1"}, format='json')
272         self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
273         self.assertEqual("failed", resp.data["status"])
274         self.assertEqual(
275             "Failed to query artifact(services,1) from sdc.",
276             resp.data["statusDescription"])
277
278     @mock.patch.object(restcall, 'call_req')
279     @mock.patch.object(sdc, 'download_artifacts')
280     @mock.patch.object(toscaparsers, 'parse_nsd')
281     def test_ns_pkg_distribute_when_nsd_already_exists(
282             self, mock_parse_nsd, mock_download_artifacts, mock_call_req):
283         mock_parse_nsd.return_value = json.JSONEncoder().encode(self.nsd_data)
284         mock_download_artifacts.return_value = "/home/vcpe.csar"
285         mock_call_req.return_value = [0, json.JSONEncoder().encode([{
286             "uuid": "1",
287             "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/vcpe.csar",
288             "distributionStatus": "DISTRIBUTED"
289         }]), '200']
290         NSPackageModel(nsPackageId="2", nsdId="VCPE_NS").save()
291         resp = self.client.post(
292             "/api/genericparser/v1/nspackages", {"csarId": "1"}, format='json')
293         self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
294         self.assertEqual("failed", resp.data["status"])
295         self.assertEqual(
296             "NSD(VCPE_NS) already exists.",
297             resp.data["statusDescription"])
298
299     @mock.patch.object(restcall, 'call_req')
300     @mock.patch.object(sdc, 'download_artifacts')
301     @mock.patch.object(toscaparsers, 'parse_nsd')
302     def test_ns_pkg_distribute_when_nf_not_distributed(
303             self, mock_parse_nsd, mock_download_artifacts, mock_call_req):
304         mock_parse_nsd.return_value = json.JSONEncoder().encode(self.nsd_data)
305         mock_download_artifacts.return_value = "/home/vcpe.csar"
306         mock_call_req.return_value = [0, json.JSONEncoder().encode([{
307             "uuid": "1",
308             "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/vcpe.csar",
309             "distributionStatus": "DISTRIBUTED",
310         }]), '200']
311         resp = self.client.post(
312             "/api/genericparser/v1/nspackages", {"csarId": "1"}, format='json')
313         self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
314         self.assertEqual("failed", resp.data["status"])
315         self.assertEqual(
316             "VNF package(vcpe_vfw_zte_1_0) is not distributed.",
317             resp.data["statusDescription"])
318
319     @mock.patch.object(restcall, 'call_req')
320     @mock.patch.object(sdc, 'download_artifacts')
321     @mock.patch.object(toscaparsers, 'parse_nsd')
322     def test_ns_pkg_distribute_when_successfully(
323             self, mock_parse_nsd, mock_download_artifacts, mock_call_req):
324         mock_parse_nsd.return_value = json.JSONEncoder().encode(self.nsd_data)
325         mock_download_artifacts.return_value = "/home/vcpe.csar"
326         mock_call_req.return_value = [0, json.JSONEncoder().encode([{
327             "uuid": "1",
328             "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/vcpe.csar",
329             "distributionStatus": "DISTRIBUTED"
330         }]), '200']
331         VnfPackageModel(vnfPackageId="1", vnfdId="vcpe_vfw_zte_1_0").save()
332         PnfPackageModel(pnfPackageId="1", pnfdId="m6000_s").save()
333         resp = self.client.post(
334             "/api/genericparser/v1/nspackages", {"csarId": "1"}, format='json')
335         self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
336         self.assertEqual("success", resp.data["status"])
337         self.assertEqual(
338             "CSAR(1) distributed successfully.",
339             resp.data["statusDescription"])
340
341     @mock.patch.object(sdc, 'get_artifacts')
342     def test_ns_when_not_distributed_by_sdc(self, mock_get_artifacts):
343         mock_get_artifacts.return_value = [{
344             "uuid": "1",
345             "invariantUUID": "63eaec39-ffbe-411c-a838-448f2c73f7eb",
346             "name": "underlayvpn",
347             "version": "2.0",
348             "toscaModelURL": "/sdc/v1/genericparser/resources/c94490a0-f7ef-48be-b3f8-8d8662a37236/toscaModel",
349             "category": "Volte",
350             "subCategory": "VolteVNF",
351             "resourceType": "VF",
352             "lifecycleState": "CERTIFIED",
353             "distributionStatus": "DISTRIBUTION_APPROVED",
354             "lastUpdaterUserId": "jh0003"
355         }]
356         resp = self.client.post(
357             "/api/genericparser/v1/nspackages", {"csarId": "1"}, format='json')
358         self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
359         self.assertEqual("failed", resp.data["status"])
360         self.assertEqual(
361             "The artifact (services,1) is not distributed from sdc.",
362             resp.data["statusDescription"])
363
364     ##########################################################################
365
366     def test_ns_pkg_normal_delete(self):
367         NSPackageModel(nsPackageId="8", nsdId="2").save()
368         resp = self.client.delete("/api/genericparser/v1/nspackages/8")
369         self.assertEqual(resp.status_code, status.HTTP_200_OK)
370         self.assertEqual("success", resp.data["status"])
371         self.assertEqual(
372             "Delete CSAR(8) successfully.",
373             resp.data["statusDescription"])
374
375     def test_ns_pkg_get_all(self):
376         NSPackageModel(
377             nsPackageId="13",
378             nsdId="2",
379             nsdDesginer="2",
380             nsdVersion="2",
381             nsPackageUri="13.csar",
382             nsdModel="").save()
383         NSPackageModel(
384             nsPackageId="14",
385             nsdId="3",
386             nsdDesginer="3",
387             nsdVersion="3",
388             nsPackageUri="14.csar",
389             nsdModel="").save()
390         resp = self.client.get("/api/genericparser/v1/nspackages")
391         self.assertEqual(resp.status_code, status.HTTP_200_OK)
392         expect_data = [{"csarId": "13",
393                         "packageInfo": {"csarName": "13.csar",
394                                         "nsdProvider": "2",
395                                         "nsdId": "2",
396                                         "nsPackageId": "13",
397                                         "downloadUrl": "http://127.0.0.1:8806/static/genericparser/13/13.csar",
398                                         "nsdModel": "",
399                                         "nsdVersion": "2",
400                                         "nsdInvariantId": None
401                                         }},
402                        {"csarId": "14",
403                         "packageInfo": {"csarName": "14.csar",
404                                         "nsdProvider": "3",
405                                         "nsdId": "3",
406                                         "nsPackageId": "14",
407                                         "downloadUrl": "http://127.0.0.1:8806/static/genericparser/14/14.csar",
408                                         "nsdModel": "",
409                                         "nsdVersion": "3",
410                                         "nsdInvariantId": None}}]
411         self.assertEqual(expect_data, resp.data)
412
413     def test_ns_pkg_get_one(self):
414         NSPackageModel(
415             nsPackageId="14",
416             nsdId="2",
417             nsdDesginer="3",
418             nsdVersion="4",
419             nsPackageUri="14.csar",
420             nsdModel="").save()
421         resp = self.client.get("/api/genericparser/v1/nspackages/14")
422         self.assertEqual(resp.status_code, status.HTTP_200_OK)
423         expect_data = {
424             "csarId": "14",
425             "packageInfo": {
426                 "nsdId": "2",
427                 "nsPackageId": "14",
428                 "nsdProvider": "3",
429                 "nsdVersion": "4",
430                 "csarName": "14.csar",
431                 "nsdModel": "",
432                 "downloadUrl": "http://127.0.0.1:8806/static/genericparser/14/14.csar",
433                 "nsdInvariantId": None}}
434         self.assertEqual(expect_data, resp.data)
435
436     def test_ns_pkg_get_one_not_found(self):
437         resp = self.client.get("/api/genericparser/v1/nspackages/22")
438         self.assertEqual(resp.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
439         self.assertEqual(
440             {"error": "Ns package[22] not Found."},
441             resp.data)
442
443     ##########################################################################
444
445     @mock.patch.object(toscaparsers, 'parse_nsd')
446     def test_nsd_parse_normal(self, mock_parse_nsd):
447         NSPackageModel(nsPackageId="18", nsdId="12").save()
448         mock_parse_nsd.return_value = json.JSONEncoder().encode({"a": "b"})
449         req_data = {"csarId": "18", "inputs": []}
450         resp = self.client.post(
451             "/api/genericparser/v1/parsernsd",
452             req_data,
453             format='json')
454         self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
455         self.assertEqual({"model": '{"a": "b"}'}, resp.data)
456
457     def test_nsd_parse_when_csar_not_exist(self):
458         req_data = {"csarId": "1", "inputs": []}
459         resp = self.client.post(
460             "/api/genericparser/v1/parsernsd",
461             req_data,
462             format='json')
463         self.assertEqual(
464             resp.status_code,
465             status.HTTP_500_INTERNAL_SERVER_ERROR)
466         self.assertEqual(resp.data, {"error": "NS CSAR(1) does not exist."})