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