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