366fcef7203d73a6492322ffa3787ab70b792709
[vfc/nfvo/lcm.git] / lcm / ns / tests / vls / tests.py
1 # Copyright 2016 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 uuid
17
18 import mock
19 from django.test import TestCase, Client
20 from rest_framework import status
21
22 from lcm.pub.database.models import VLInstModel, NSInstModel, VNFFGInstModel
23 from lcm.pub.nfvi.vim import vimadaptor
24 from lcm.pub.utils import restcall
25
26 vim_info = {
27     "cloud-owner": "example-cloud-owner-val-97336",
28     "cloud-region-id": "example-cloud-region-id-val-35532",
29     "cloud-type": "example-cloud-type-val-18046",
30     "owner-defined-type": "example-owner-defined-type-val-9413",
31     "cloud-region-version": "example-cloud-region-version-val-85706",
32     "identity-url": "example-identity-url-val-71252",
33     "cloud-zone": "example-cloud-zone-val-27112",
34     "complex-name": "example-complex-name-val-85283",
35     "sriov-automation": True,
36     "cloud-extra-info": "example-cloud-extra-info-val-90854",
37     "cloud-epa-caps": "example-cloud-epa-caps-val-2409",
38     "resource-version": "example-resource-version-val-42094",
39     "esr-system-info-list": {
40         "esr-system-info": [
41             {
42                 "esr-system-info-id": "example-esr-system-info-id-val-7713",
43                 "system-name": "example-system-name-val-19801",
44                 "type": "example-type-val-24477",
45                 "vendor": "example-vendor-val-50079",
46                 "version": "example-version-val-93146",
47                 "service-url": "example-service-url-val-68090",
48                 "user-name": "example-user-name-val-14470",
49                 "password": "example-password-val-84190",
50                 "system-type": "example-system-type-val-42773",
51                 "protocal": "example-protocal-val-85736",
52                 "ssl-cacert": "example-ssl-cacert-val-33989",
53                 "ssl-insecure": True,
54                 "ip-address": "example-ip-address-val-99038",
55                 "port": "example-port-val-27323",
56                 "cloud-domain": "example-cloud-domain-val-55163",
57                 "default-tenant": "admin",
58                 "resource-version": "example-resource-version-val-15424"
59             }
60         ]
61     }
62 }
63
64 class TestVlViews(TestCase):
65     def setUp(self):
66         self.client = Client()
67         self.ns_inst_id = str(uuid.uuid4())
68         self.vnffg_id = str(uuid.uuid4())
69         self.vl_id_1 = 1
70         self.vl_id_2 = 1
71         self.vim_id = str(uuid.uuid4())
72         self.tenant = "tenantname"
73         properties = {"network_type": "vlan", "name": "externalMNetworkName", "dhcp_enabled": False,
74                       "location_info": {"host": True, "vimid": self.vim_id, "region": True, "tenant": self.tenant},
75                       "end_ip": "190.168.100.100", "gateway_ip": "190.168.100.1", "start_ip": "190.168.100.2",
76                       "cidr": "190.168.100.0/24", "mtu": 1500, "network_name": "sub_mnet", "ip_version": 4}
77         self.context = {
78             "vls": [{"vl_id": self.vl_id_1, "description": "", "properties": properties, "route_external": False},
79                     {"vl_id": self.vl_id_2, "description": "", "properties": properties, "route_external": False}],
80             "vnffgs": [{"vnffg_id": self.vnffg_id, "description": "",
81                         "properties": {"vendor": "zte", "version": "1.1.2", "number_of_endpoints": 7,
82                                        "dependent_virtual_link": [self.vl_id_2, self.vl_id_1],
83                                        "connection_point": ["CP01", "CP02"],
84                                        "constituent_vnfs": ["VNF1", "VNF2", "VNF3"],
85                                        "constituent_pnfs": ["pnf1", "pnf2"]},
86                         "members": ["forwarding_path1", "forwarding_path2"]}]}
87         NSInstModel(id=self.ns_inst_id, name="ns_name").save()
88         VNFFGInstModel(vnffgdid=self.vnffg_id, vnffginstid="", nsinstid=self.ns_inst_id, endpointnumber=0, vllist="",
89                        cplist="", vnflist="", fplist="", status="").save()
90
91     def tearDown(self):
92         VLInstModel.objects.all().delete()
93         NSInstModel.objects.all().delete()
94         VNFFGInstModel.objects.all().delete()
95
96     @mock.patch.object(restcall, "call_req")
97     @mock.patch.object(vimadaptor.VimAdaptor, "create_network")
98     def test_create_vl(self, mock_create_network, mock_req_by_rest):
99         network_id = str(uuid.uuid4())
100         subnetwork_id = str(uuid.uuid4())
101         mock_create_network.return_value = [0,
102                                             {"status": "ACTIVE", "id": network_id, "name": "net1",
103                                              "provider:segmentation_id": 204, "provider:network_type": "vlan",
104                                              "res_type": 1,
105                                              "subnet_list": [
106                                                  {"id": subnetwork_id, "name": "subnet1", "res_type": 1}]}]
107         mock_req_by_rest.return_value = [0, json.JSONEncoder().encode(vim_info), '200']
108
109         self.create_vl(self.vl_id_1)
110         self.create_vl(self.vl_id_2)
111         vl_from_vl_1 = VLInstModel.objects.filter(vldid=self.vl_id_1, ownerid=self.ns_inst_id)
112         self.assertEqual(network_id, vl_from_vl_1[0].relatednetworkid)
113         self.assertEqual(subnetwork_id, vl_from_vl_1[0].relatedsubnetworkid)
114         #self.assertEqual(self.vim_id, vl_from_vl_1[0].vimid)
115         self.assertEqual(self.tenant, vl_from_vl_1[0].tenant)
116         vl_from_vl_2 = VLInstModel.objects.filter(vldid=self.vl_id_2, ownerid=self.ns_inst_id)
117         self.assertEqual(VNFFGInstModel.objects.filter(vnffgdid=self.vnffg_id, nsinstid=self.ns_inst_id)[0].vllist,
118                          vl_from_vl_2[0].vlinstanceid + "," + vl_from_vl_1[0].vlinstanceid)
119
120     def create_vl(self, vl_id):
121         req_data = {
122             "nsInstanceId": self.ns_inst_id,
123             "context": json.JSONEncoder().encode(self.context),
124             "vlindex": vl_id}
125         response = self.client.post("/api/nslcm/v1/ns/vls", data=req_data)
126         self.assertEqual(status.HTTP_201_CREATED, response.status_code)
127         self.assertEqual(0, response.data["result"])
128
129     @mock.patch.object(restcall, "call_req")
130     @mock.patch.object(vimadaptor.VimAdaptor, "create_network")
131     @mock.patch.object(uuid, "uuid4")
132     def test_create_network_fail_when_send_to_vim(self, mock_uuid4, mock_create_network, mock_req_by_rest):
133         req_data = {
134             "nsInstanceId": self.ns_inst_id,
135             "context": json.JSONEncoder().encode(self.context),
136             "vlindex": self.vl_id_1}
137         mock_uuid4.return_value = '999'
138         mock_req_by_rest.return_value = [0, json.JSONEncoder().encode(vim_info), '200']
139         mock_create_network.return_value = [1, (1)]
140         response = self.client.post("/api/nslcm/v1/ns/vls", data=req_data)
141         retinfo = {"detail": "vl instantiation failed, detail message: Send post vl request to vim failed."}
142         self.assertEqual(retinfo["detail"], response.data["detail"])
143
144
145 class TestVlDetailViews(TestCase):
146     def setUp(self):
147         self.client = Client()
148         self.vl_inst_id = str(uuid.uuid4())
149         self.vl_name = str(uuid.uuid4())
150         self.ns_inst_id = str(uuid.uuid4())
151         VLInstModel(vlinstanceid=self.vl_inst_id, vldid="", vlinstancename=self.vl_name, ownertype=1,
152                     ownerid=self.ns_inst_id, relatednetworkid="network1", relatedsubnetworkid="subnet1,subnet2",
153                     vimid="",
154                     tenant="").save()
155         VNFFGInstModel(vnffgdid="", vnffginstid="", nsinstid=self.ns_inst_id,
156                        vllist="test1," + self.vl_inst_id + ",test2,test3", endpointnumber=0, cplist="", vnflist="",
157                        fplist="", status="").save()
158
159     def tearDown(self):
160         VLInstModel.objects.all().delete()
161         VNFFGInstModel.objects.all().delete()
162
163     @mock.patch.object(restcall, "call_req")
164     @mock.patch.object(vimadaptor.VimAdaptor, "delete_network")
165     @mock.patch.object(vimadaptor.VimAdaptor, "delete_subnet")
166     def test_delete_vl(self, mock_delete_subnet, mock_delete_network, mock_req_by_rest):
167         mock_req_by_rest.return_value = [0, json.JSONEncoder().encode(vim_info), '200']
168         response = self.client.delete("/api/nslcm/v1/ns/vls/%s" % self.vl_inst_id)
169         self.assertEqual(status.HTTP_202_ACCEPTED, response.status_code)
170         expect_resp_data = {"result": 0, "detail": "delete vl success"}
171         self.assertEqual(expect_resp_data, response.data)
172
173         for vnffg_info in VNFFGInstModel.objects.filter(nsinstid=self.ns_inst_id):
174             self.assertEqual(vnffg_info.vllist, "test1,test2,test3")
175         if VLInstModel.objects.filter(vlinstanceid=self.vl_inst_id):
176             self.fail()
177
178         response = self.client.delete("/api/nslcm/v1/ns/vls/%s" % "notExist")
179         self.assertEqual(status.HTTP_202_ACCEPTED, response.status_code)
180         expect_resp_data = {"result": 0, "detail": "vl is not exist or has been already deleted"}
181         self.assertEqual(expect_resp_data, response.data)
182
183     def test_query_vl(self):
184         response = self.client.get("/api/nslcm/v1/ns/vls/%s" % self.vl_inst_id)
185         self.assertEqual(status.HTTP_200_OK, response.status_code)
186         expect_resp_data = {'vlId': self.vl_inst_id, 'vlName': self.vl_name, 'vlStatus': "active"}
187         self.assertEqual(expect_resp_data, response.data)
188
189         response = self.client.get("/api/nslcm/v1/ns/vls/%s" % "notExist")
190         self.assertEqual(status.HTTP_404_NOT_FOUND, response.status_code)