Merge from OSM SO master
[osm/SO.git] / rwlaunchpad / test / pytest / lp_tg_vrouter_ts_epa_sriov_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
46 from gi.repository import (
47 RwIwpYang,
48 ProjectNsdYang,
49 NsrYang,
50 RwNsrYang,
51 VldYang,
52 RwProjectVnfdYang as RwVnfdYang,
53 RwCloudYang,
54 RwBaseYang,
55 RwResourceMgrYang,
56 RwConmanYang,
57 RwNsmYang
58 )
59
60 logging.basicConfig(level=logging.DEBUG)
61
62
63 RW_VROUTER_PKG_INSTALL_DIR = os.path.join(
64 os.environ["RIFT_INSTALL"],
65 "usr/rift/mano/vnfds/vrouter"
66 )
67 RW_TRAFGEN_PKG_INSTALL_DIR = os.path.join(
68 os.environ["RIFT_INSTALL"],
69 "usr/rift/mano/vnfds/trafgen"
70 )
71 RW_TRAFSINK_PKG_INSTALL_DIR = os.path.join(
72 os.environ["RIFT_INSTALL"],
73 "usr/rift/mano/vnfds/trafsink"
74 )
75 RW_TG_VROUTER_TS_NSD_PKG_INSTALL_DIR = os.path.join(
76 os.environ["RIFT_INSTALL"],
77 "usr/rift/mano/nsds/tg_vrouter_ts"
78 )
79
80
81 class PackageError(Exception):
82 pass
83
84
85 def raise_package_error():
86 raise PackageError("Could not find ns packages")
87
88
89 @pytest.fixture(scope='module')
90 def iwp_proxy(request, mgmt_session):
91 return mgmt_session.proxy(RwIwpYang)
92
93 @pytest.fixture(scope='module')
94 def resource_mgr_proxy(request, mgmt_session):
95 return mgmt_session.proxy(RwResourceMgrYang)
96
97
98 @pytest.fixture(scope='module')
99 def cloud_proxy(request, mgmt_session):
100 return mgmt_session.proxy(RwCloudYang)
101
102
103 @pytest.fixture(scope='module')
104 def vnfd_proxy(request, mgmt_session):
105 return mgmt_session.proxy(RwVnfdYang)
106
107
108 @pytest.fixture(scope='module')
109 def vld_proxy(request, mgmt_session):
110 return mgmt_session.proxy(VldYang)
111
112
113 @pytest.fixture(scope='module')
114 def nsd_proxy(request, mgmt_session):
115 return mgmt_session.proxy(NsdYang)
116
117
118 @pytest.fixture(scope='module')
119 def nsr_proxy(request, mgmt_session):
120 return mgmt_session.proxy(NsrYang)
121
122
123 @pytest.fixture(scope='module')
124 def rwnsr_proxy(request, mgmt_session):
125 return mgmt_session.proxy(RwNsrYang)
126
127
128 @pytest.fixture(scope='module')
129 def base_proxy(request, mgmt_session):
130 return mgmt_session.proxy(RwBaseYang)
131
132 @pytest.fixture(scope='module')
133 def so_proxy(request, mgmt_session):
134 return mgmt_session.proxy(RwConmanYang)
135
136 @pytest.fixture(scope='module')
137 def nsm_proxy(request, mgmt_session):
138 return mgmt_session.proxy(RwNsmYang)
139
140 @pytest.fixture(scope='session')
141 def vrouter_vnfd_package_file():
142 vrouter_pkg_file = os.path.join(
143 RW_VROUTER_PKG_INSTALL_DIR,
144 "vrouter_vnfd_with_epa_sriov.tar.gz",
145 )
146 if not os.path.exists(vrouter_pkg_file):
147 raise_package_error()
148
149 return vrouter_pkg_file
150
151 @pytest.fixture(scope='session')
152 def tg_vnfd_package_file():
153 tg_pkg_file = os.path.join(
154 RW_TRAFGEN_PKG_INSTALL_DIR,
155 "trafgen_vnfd_with_epa_sriov.tar.gz",
156 )
157 if not os.path.exists(tg_pkg_file):
158 raise_package_error()
159
160 return tg_pkg_file
161
162 @pytest.fixture(scope='session')
163 def ts_vnfd_package_file():
164 ts_pkg_file = os.path.join(
165 RW_TRAFSINK_PKG_INSTALL_DIR,
166 "trafsink_vnfd_with_epa_sriov.tar.gz",
167 )
168 if not os.path.exists(ts_pkg_file):
169 raise_package_error()
170
171 return ts_pkg_file
172
173 @pytest.fixture(scope='session')
174 def tg_vrouter_ts_nsd_package_file():
175 tg_vrouter_ts_nsd_pkg_file = os.path.join(
176 RW_TG_VROUTER_TS_NSD_PKG_INSTALL_DIR,
177 "tg_vrouter_ts_nsd_with_epa_sriov.tar.gz",
178 )
179 if not os.path.exists(tg_vrouter_ts_nsd_pkg_file):
180 raise_package_error()
181
182 return tg_vrouter_ts_nsd_pkg_file
183
184
185 def create_nsr_from_nsd_id(nsd_id):
186 nsr = NsrYang.YangData_RwProject_Project_NsInstanceConfig_Nsr()
187 nsr.id = str(uuid.uuid4())
188 nsr.name = "TG-Vrouter-TS-EPA-SRIOV"
189 nsr.short_name = "TG-Vrouter-TS-EPA-SRIOV"
190 nsr.description = "3 VNFs with Trafgen, Vrouter and Trafsink EPA SRIOV"
191 nsr.nsd_ref = nsd_id
192 nsr.admin_status = "ENABLED"
193
194 return nsr
195
196
197 def upload_descriptor(logger, descriptor_file, host="127.0.0.1"):
198 curl_cmd = 'curl -F "descriptor=@{file}" http://{host}:4567/api/upload'.format(
199 file=descriptor_file,
200 host=host,
201 )
202 logger.debug("Uploading descriptor %s using cmd: %s", descriptor_file, curl_cmd)
203 stdout = subprocess.check_output(shlex.split(curl_cmd), universal_newlines=True)
204
205 json_out = json.loads(stdout)
206 transaction_id = json_out["transaction_id"]
207
208 return transaction_id
209
210
211 class DescriptorOnboardError(Exception):
212 pass
213
214
215 def wait_unboard_transaction_finished(logger, transaction_id, timeout_secs=600, host="127.0.0.1"):
216 logger.info("Waiting for onboard trans_id %s to complete",
217 transaction_id)
218 start_time = time.time()
219 while (time.time() - start_time) < timeout_secs:
220 r = requests.get(
221 'http://{host}:4567/api/upload/{t_id}/state'.format(
222 host=host, t_id=transaction_id
223 )
224 )
225 state = r.json()
226 if state["status"] == "pending":
227 time.sleep(1)
228 continue
229
230 elif state["status"] == "success":
231 logger.info("Descriptor onboard was successful")
232 return
233
234 else:
235 raise DescriptorOnboardError(state)
236
237 if state["status"] != "success":
238 raise DescriptorOnboardError(state)
239
240 @pytest.mark.incremental
241 class TestLaunchpadStartStop(object):
242 def test_configure_cloud_account(self, cloud_proxy, logger):
243 cloud_account = RwCloudYang.CloudAccountConfig()
244 #cloud_account.name = "cloudsim_proxy"
245 #cloud_account.account_type = "cloudsim_proxy"
246 cloud_account.name = "riftuser1"
247 cloud_account.account_type = "openstack"
248 cloud_account.openstack.key = 'pluto'
249 cloud_account.openstack.secret = 'mypasswd'
250 cloud_account.openstack.auth_url = 'http://10.66.4.xx:5000/v3/'
251 cloud_account.openstack.tenant = 'demo'
252 cloud_account.openstack.mgmt_network = 'private'
253
254 cloud_proxy.merge_config("/rw-project:project/rw-cloud:cloud-account", cloud_account)
255
256 def test_configure_pools(self, resource_mgr_proxy):
257 pools = RwResourceMgrYang.ResourcePools.from_dict({
258 "pools": [{ "name": "vm_pool_a",
259 "resource_type": "compute",
260 "pool_type" : "dynamic"},
261 {"name": "network_pool_a",
262 "resource_type": "network",
263 "pool_type" : "dynamic",}]})
264
265 resource_mgr_proxy.merge_config('/rw-project:project/rw-resource-mgr:resource-mgr-config/rw-resource-mgr:resource-pools', pools)
266
267 def test_configure_resource_orchestrator(self, so_proxy):
268 cfg = RwConmanYang.RoEndpoint.from_dict({'ro_ip_address': '127.0.0.1',
269 'ro_port' : 2022,
270 'ro_username' : 'admin',
271 'ro_password' : 'admin'})
272 so_proxy.merge_config('/rw-project:project/rw-conman:cm-config', cfg)
273
274 def test_configure_service_orchestrator(self, nsm_proxy):
275 cfg = RwNsmYang.SoEndpoint.from_dict({'cm_ip_address': '127.0.0.1',
276 'cm_port' : 2022,
277 'cm_username' : 'admin',
278 'cm_password' : 'admin'})
279 nsm_proxy.merge_config('/rw-nsm:ro-config/rw-nsm:cm-endpoint', cfg)
280
281
282 def test_onboard_tg_vnfd(self, logger, vnfd_proxy, tg_vnfd_package_file):
283 logger.info("Onboarding trafgen_vnfd package: %s", tg_vnfd_package_file)
284 trans_id = upload_descriptor(logger, tg_vnfd_package_file)
285 wait_unboard_transaction_finished(logger, trans_id)
286
287 catalog = vnfd_proxy.get_config('/vnfd-catalog')
288 vnfds = catalog.vnfd
289 assert len(vnfds) == 1, "There should be one vnfds"
290 assert "trafgen_vnfd" in [vnfds[0].name]
291
292 def test_onboard_vrouter_vnfd(self, logger, vnfd_proxy, vrouter_vnfd_package_file):
293 logger.info("Onboarding vrouter_vnfd package: %s", vrouter_vnfd_package_file)
294 trans_id = upload_descriptor(logger, vrouter_vnfd_package_file)
295 wait_unboard_transaction_finished(logger, trans_id)
296
297 catalog = vnfd_proxy.get_config('/vnfd-catalog')
298 vnfds = catalog.vnfd
299 assert len(vnfds) == 2, "There should be two vnfds"
300 assert "vrouter_vnfd" in [vnfds[0].name, vnfds[1].name]
301
302 def test_onboard_ts_vnfd(self, logger, vnfd_proxy, ts_vnfd_package_file):
303 logger.info("Onboarding trafsink_vnfd package: %s", ts_vnfd_package_file)
304 trans_id = upload_descriptor(logger, ts_vnfd_package_file)
305 wait_unboard_transaction_finished(logger, trans_id)
306
307 catalog = vnfd_proxy.get_config('/vnfd-catalog')
308 vnfds = catalog.vnfd
309 assert len(vnfds) == 3, "There should be three vnfds"
310 assert "trafsink_vnfd" in [vnfds[0].name, vnfds[1].name, vnfds[2].name]
311
312 def test_onboard_tg_vrouter_ts_nsd(self, logger, nsd_proxy, tg_vrouter_ts_nsd_package_file):
313 logger.info("Onboarding tg_vrouter_ts nsd package: %s", tg_vrouter_ts_nsd_package_file)
314 trans_id = upload_descriptor(logger, tg_vrouter_ts_nsd_package_file)
315 wait_unboard_transaction_finished(logger, trans_id)
316
317 catalog = nsd_proxy.get_config('/nsd-catalog')
318 nsds = catalog.nsd
319 assert len(nsds) == 1, "There should only be a single nsd"
320 nsd = nsds[0]
321 assert nsd.name == "tg_vrouter_ts_nsd"
322
323 def test_instantiate_tg_vrouter_ts_nsr(self, logger, nsd_proxy, nsr_proxy, rwnsr_proxy, base_proxy):
324 catalog = nsd_proxy.get_config('/nsd-catalog')
325 nsd = catalog.nsd[0]
326
327 nsr = create_nsr_from_nsd_id(nsd.id)
328 nsr_proxy.merge_config('/ns-instance-config', nsr)
329
330 nsr_opdata = rwnsr_proxy.get('/ns-instance-opdata')
331 nsrs = nsr_opdata.nsr
332 assert len(nsrs) == 1
333 assert nsrs[0].ns_instance_config_ref == nsr.id
334
335