f22c88fff608ef1680b7471ad21123e4d94d7040
[osm/SO.git] / rwlaunchpad / test / pytest / lp_tg_2vrouter_ts_test.py
1 #!/usr/bin/env python
2 """
3 #
4 # Copyright 2016-2017 RIFT.IO Inc
5 #
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
9 #
10 # http://www.apache.org/licenses/LICENSE-2.0
11 #
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
17 #
18
19 @file lp_3vnfs_test.py
20 @author Austin Cormier (Austin.Cormier@riftio.com)
21 @date 10/15/2015
22 @brief Launchpad Module Test ExtVNF
23 """
24
25 import json
26 import logging
27 import os
28 import pytest
29 import shlex
30 import requests
31 import subprocess
32 import time
33 import uuid
34
35 import gi
36 gi.require_version('RwIwpYang', '1.0')
37 gi.require_version('RwNsrYang', '1.0')
38 gi.require_version('RwProjectVnfdYang', '1.0')
39 gi.require_version('RwCloudYang', '1.0')
40 gi.require_version('RwBaseYang', '1.0')
41 gi.require_version('RwResourceMgrYang', '1.0')
42 gi.require_version('RwConmanYang', '1.0')
43 gi.require_version('RwNsmYang', '1.0')
44
45 from gi.repository import (
46 RwIwpYang,
47 ProjectNsdYang as NsdYang,
48 NsrYang,
49 RwNsrYang,
50 VldYang,
51 RwProjectVnfdYang as RwVnfdYang,
52 RwCloudYang,
53 RwBaseYang,
54 RwResourceMgrYang,
55 RwConmanYang,
56 RwNsmYang
57 )
58
59 logging.basicConfig(level=logging.DEBUG)
60
61
62 RW_VROUTER_PKG_INSTALL_DIR = os.path.join(
63 os.environ["RIFT_INSTALL"],
64 "usr/rift/mano/vnfds/vrouter"
65 )
66 RW_TRAFGEN_PKG_INSTALL_DIR = os.path.join(
67 os.environ["RIFT_INSTALL"],
68 "usr/rift/mano/vnfds/trafgen"
69 )
70 RW_TRAFSINK_PKG_INSTALL_DIR = os.path.join(
71 os.environ["RIFT_INSTALL"],
72 "usr/rift/mano/vnfds/trafsink"
73 )
74 RW_TG_2VROUTER_TS_NSD_PKG_INSTALL_DIR = os.path.join(
75 os.environ["RIFT_INSTALL"],
76 "usr/rift/mano/nsds/tg_2vrouter_ts"
77 )
78
79
80 class PackageError(Exception):
81 pass
82
83
84 def raise_package_error():
85 raise PackageError("Could not find ns packages")
86
87
88 @pytest.fixture(scope='module')
89 def iwp_proxy(request, mgmt_session):
90 return mgmt_session.proxy(RwIwpYang)
91
92 @pytest.fixture(scope='module')
93 def resource_mgr_proxy(request, mgmt_session):
94 return mgmt_session.proxy(RwResourceMgrYang)
95
96
97 @pytest.fixture(scope='module')
98 def cloud_proxy(request, mgmt_session):
99 return mgmt_session.proxy(RwCloudYang)
100
101
102 @pytest.fixture(scope='module')
103 def vnfd_proxy(request, mgmt_session):
104 return mgmt_session.proxy(RwVnfdYang)
105
106
107 @pytest.fixture(scope='module')
108 def vld_proxy(request, mgmt_session):
109 return mgmt_session.proxy(VldYang)
110
111
112 @pytest.fixture(scope='module')
113 def nsd_proxy(request, mgmt_session):
114 return mgmt_session.proxy(NsdYang)
115
116
117 @pytest.fixture(scope='module')
118 def nsr_proxy(request, mgmt_session):
119 return mgmt_session.proxy(NsrYang)
120
121
122 @pytest.fixture(scope='module')
123 def rwnsr_proxy(request, mgmt_session):
124 return mgmt_session.proxy(RwNsrYang)
125
126
127 @pytest.fixture(scope='module')
128 def base_proxy(request, mgmt_session):
129 return mgmt_session.proxy(RwBaseYang)
130
131 @pytest.fixture(scope='module')
132 def so_proxy(request, mgmt_session):
133 return mgmt_session.proxy(RwConmanYang)
134
135 @pytest.fixture(scope='module')
136 def nsm_proxy(request, mgmt_session):
137 return mgmt_session.proxy(RwNsmYang)
138
139 @pytest.fixture(scope='session')
140 def vrouter_vnfd_package_file():
141 vrouter_pkg_file = os.path.join(
142 RW_VROUTER_PKG_INSTALL_DIR,
143 "vrouter_vnfd.tar.gz",
144 )
145 if not os.path.exists(vrouter_pkg_file):
146 raise_package_error()
147
148 return vrouter_pkg_file
149
150 @pytest.fixture(scope='session')
151 def tg_vnfd_package_file():
152 tg_pkg_file = os.path.join(
153 RW_TRAFGEN_PKG_INSTALL_DIR,
154 "trafgen_vnfd.tar.gz",
155 )
156 if not os.path.exists(tg_pkg_file):
157 raise_package_error()
158
159 return tg_pkg_file
160
161 @pytest.fixture(scope='session')
162 def ts_vnfd_package_file():
163 ts_pkg_file = os.path.join(
164 RW_TRAFSINK_PKG_INSTALL_DIR,
165 "trafsink_vnfd.tar.gz",
166 )
167 if not os.path.exists(ts_pkg_file):
168 raise_package_error()
169
170 return ts_pkg_file
171
172 @pytest.fixture(scope='session')
173 def tg_2vrouter_ts_nsd_package_file():
174 tg_2vrouter_ts_nsd_pkg_file = os.path.join(
175 RW_TG_2VROUTER_TS_NSD_PKG_INSTALL_DIR,
176 "tg_2vrouter_ts_nsd.tar.gz",
177 )
178 if not os.path.exists(tg_2vrouter_ts_nsd_pkg_file):
179 raise_package_error()
180
181 return tg_2vrouter_ts_nsd_pkg_file
182
183
184 def create_nsr_from_nsd_id(nsd_id):
185 nsr = NsrYang.YangData_RwProject_Project_NsInstanceConfig_Nsr()
186 nsr.id = str(uuid.uuid4())
187 nsr.name = "TG-2Vrouter-TS EPA"
188 nsr.short_name = "TG-2Vrouter-TS EPA"
189 nsr.description = "4 VNFs with Trafgen, 2 Vrouters and Trafsink EPA"
190 nsr.nsd_ref = nsd_id
191 nsr.admin_status = "ENABLED"
192
193 return nsr
194
195
196 def upload_descriptor(logger, descriptor_file, host="127.0.0.1"):
197 curl_cmd = 'curl -F "descriptor=@{file}" http://{host}:4567/api/upload'.format(
198 file=descriptor_file,
199 host=host,
200 )
201 logger.debug("Uploading descriptor %s using cmd: %s", descriptor_file, curl_cmd)
202 stdout = subprocess.check_output(shlex.split(curl_cmd), universal_newlines=True)
203
204 json_out = json.loads(stdout)
205 transaction_id = json_out["transaction_id"]
206
207 return transaction_id
208
209
210 class DescriptorOnboardError(Exception):
211 pass
212
213
214 def wait_unboard_transaction_finished(logger, transaction_id, timeout_secs=600, host="127.0.0.1", project="default"):
215 logger.info("Waiting for onboard trans_id %s to complete",
216 transaction_id)
217 start_time = time.time()
218 while (time.time() - start_time) < timeout_secs:
219 r = requests.get(
220 'http://{host}:8008/api/operational/project/{proj}/create-jobs/job/{t_id}'.format(
221 host=host, proj=project, t_id=transaction_id
222 )
223 )
224 state = r.json()
225 if state["status"] == "pending":
226 time.sleep(1)
227 continue
228
229 elif state["status"] == "success":
230 logger.info("Descriptor onboard was successful")
231 return
232
233 else:
234 raise DescriptorOnboardError(state)
235
236 if state["status"] != "success":
237 raise DescriptorOnboardError(state)
238
239 @pytest.mark.incremental
240 class TestLaunchpadStartStop(object):
241 def test_configure_cloud_account(self, cloud_proxy, logger):
242 cloud_account = RwCloudYang.CloudAccountConfig()
243 #cloud_account.name = "cloudsim_proxy"
244 #cloud_account.account_type = "cloudsim_proxy"
245 cloud_account.name = "riftuser1"
246 cloud_account.account_type = "openstack"
247 cloud_account.openstack.key = 'pluto'
248 cloud_account.openstack.secret = 'mypasswd'
249 cloud_account.openstack.auth_url = 'http://10.66.4.xx:5000/v3/'
250 cloud_account.openstack.tenant = 'demo'
251 cloud_account.openstack.mgmt_network = 'private'
252
253 cloud_proxy.merge_config("/rw-project:project/rw-cloud:cloud-account", cloud_account)
254
255 def test_configure_pools(self, resource_mgr_proxy):
256 pools = RwResourceMgrYang.YangData_RwProject_Project_ResourceMgrConfig_ResourcePools.from_dict({
257 "pools": [{ "name": "vm_pool_a",
258 "resource_type": "compute",
259 "pool_type" : "dynamic"},
260 {"name": "network_pool_a",
261 "resource_type": "network",
262 "pool_type" : "dynamic",}]})
263
264 resource_mgr_proxy.merge_config('/rw-project:project/rw-resource-mgr:resource-mgr-config/rw-resource-mgr:resource-pools', pools)
265
266 def test_onboard_tg_vnfd(self, logger, vnfd_proxy, tg_vnfd_package_file):
267 logger.info("Onboarding trafgen_vnfd package: %s", tg_vnfd_package_file)
268 trans_id = upload_descriptor(logger, tg_vnfd_package_file)
269 wait_unboard_transaction_finished(logger, trans_id)
270
271 catalog = vnfd_proxy.get_config('/rw-project:project[rw-project:name="default"]/vnfd-catalog')
272 vnfds = catalog.vnfd
273 assert len(vnfds) == 1, "There should be one vnfds"
274 assert "trafgen_vnfd" in [vnfds[0].name]
275
276 def test_onboard_vrouter_vnfd(self, logger, vnfd_proxy, vrouter_vnfd_package_file):
277 logger.info("Onboarding vrouter_vnfd package: %s", vrouter_vnfd_package_file)
278 trans_id = upload_descriptor(logger, vrouter_vnfd_package_file)
279 wait_unboard_transaction_finished(logger, trans_id)
280
281 catalog = vnfd_proxy.get_config('/rw-project:project[rw-project:name="default"]/vnfd-catalog')
282 vnfds = catalog.vnfd
283 assert len(vnfds) == 2, "There should be two vnfds"
284 assert "vrouter_vnfd" in [vnfds[0].name, vnfds[1].name]
285
286 def test_onboard_ts_vnfd(self, logger, vnfd_proxy, ts_vnfd_package_file):
287 logger.info("Onboarding trafsink_vnfd package: %s", ts_vnfd_package_file)
288 trans_id = upload_descriptor(logger, ts_vnfd_package_file)
289 wait_unboard_transaction_finished(logger, trans_id)
290
291 catalog = vnfd_proxy.get_config('/rw-project:project[rw-project:name="default"]/vnfd-catalog')
292 vnfds = catalog.vnfd
293 assert len(vnfds) == 3, "There should be three vnfds"
294 assert "trafsink_vnfd" in [vnfds[0].name, vnfds[1].name, vnfds[2].name]
295
296 def test_onboard_tg_2vrouter_ts_nsd(self, logger, nsd_proxy, tg_2vrouter_ts_nsd_package_file):
297 logger.info("Onboarding tg_2vrouter_ts nsd package: %s", tg_2vrouter_ts_nsd_package_file)
298 trans_id = upload_descriptor(logger, tg_2vrouter_ts_nsd_package_file)
299 wait_unboard_transaction_finished(logger, trans_id)
300
301 catalog = nsd_proxy.get_config('/rw-project:project[rw-project:name="default"]/nsd-catalog')
302 nsds = catalog.nsd
303 assert len(nsds) == 1, "There should only be a single nsd"
304 nsd = nsds[0]
305 assert nsd.name == "tg_vrouter_ts_nsd"
306 assert nsd.short_name == "tg_2vrouter_ts_nsd"
307
308 def test_instantiate_tg_2vrouter_ts_nsr(self, logger, nsd_proxy, nsr_proxy, rwnsr_proxy, base_proxy):
309 catalog = nsd_proxy.get_config('/rw-project:project[rw-project:name="default"]/nsd-catalog')
310 nsd = catalog.nsd[0]
311
312 nsr = create_nsr_from_nsd_id(nsd.id)
313 nsr_proxy.merge_config('/rw-project:project[rw-project:name="default"]/ns-instance-config', nsr)
314
315 nsr_opdata = rwnsr_proxy.get('/rw-project:project[rw-project:name="default"]/ns-instance-opdata')
316 nsrs = nsr_opdata.nsr
317 assert len(nsrs) == 1
318 assert nsrs[0].ns_instance_config_ref == nsr.id
319
320