update from RIFT as of 696b75d2fe9fb046261b08c616f1bcf6c0b54a9b second try
[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", project="default"):
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}:8008/api/operational/project/{proj}/create-jobs/job/{t_id}'.format(
222 host=host, proj=project, 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.YangData_RwProject_Project_ResourceMgrConfig_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_onboard_tg_vnfd(self, logger, vnfd_proxy, tg_vnfd_package_file):
268 logger.info("Onboarding trafgen_vnfd package: %s", tg_vnfd_package_file)
269 trans_id = upload_descriptor(logger, tg_vnfd_package_file)
270 wait_unboard_transaction_finished(logger, trans_id)
271
272 catalog = vnfd_proxy.get_config('/rw-project:project[rw-project:name="default"]/vnfd-catalog')
273 vnfds = catalog.vnfd
274 assert len(vnfds) == 1, "There should be one vnfds"
275 assert "trafgen_vnfd" in [vnfds[0].name]
276
277 def test_onboard_vrouter_vnfd(self, logger, vnfd_proxy, vrouter_vnfd_package_file):
278 logger.info("Onboarding vrouter_vnfd package: %s", vrouter_vnfd_package_file)
279 trans_id = upload_descriptor(logger, vrouter_vnfd_package_file)
280 wait_unboard_transaction_finished(logger, trans_id)
281
282 catalog = vnfd_proxy.get_config('/rw-project:project[rw-project:name="default"]/vnfd-catalog')
283 vnfds = catalog.vnfd
284 assert len(vnfds) == 2, "There should be two vnfds"
285 assert "vrouter_vnfd" in [vnfds[0].name, vnfds[1].name]
286
287 def test_onboard_ts_vnfd(self, logger, vnfd_proxy, ts_vnfd_package_file):
288 logger.info("Onboarding trafsink_vnfd package: %s", ts_vnfd_package_file)
289 trans_id = upload_descriptor(logger, ts_vnfd_package_file)
290 wait_unboard_transaction_finished(logger, trans_id)
291
292 catalog = vnfd_proxy.get_config('/rw-project:project[rw-project:name="default"]/vnfd-catalog')
293 vnfds = catalog.vnfd
294 assert len(vnfds) == 3, "There should be three vnfds"
295 assert "trafsink_vnfd" in [vnfds[0].name, vnfds[1].name, vnfds[2].name]
296
297 def test_onboard_tg_vrouter_ts_nsd(self, logger, nsd_proxy, tg_vrouter_ts_nsd_package_file):
298 logger.info("Onboarding tg_vrouter_ts nsd package: %s", tg_vrouter_ts_nsd_package_file)
299 trans_id = upload_descriptor(logger, tg_vrouter_ts_nsd_package_file)
300 wait_unboard_transaction_finished(logger, trans_id)
301
302 catalog = nsd_proxy.get_config('/rw-project:project[rw-project:name="default"]/nsd-catalog')
303 nsds = catalog.nsd
304 assert len(nsds) == 1, "There should only be a single nsd"
305 nsd = nsds[0]
306 assert nsd.name == "tg_vrouter_ts_nsd"
307
308 def test_instantiate_tg_vrouter_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