update from RIFT as of 696b75d2fe9fb046261b08c616f1bcf6c0b54a9b second try
[osm/SO.git] / rwlaunchpad / test / pytest / lp_kt_utm_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_test.py
20 @author Austin Cormier (Austin.Cormier@riftio.com)
21 @date 10/15/2015
22 @brief Launchpad Module Test
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 import gi
35
36 gi.require_version('RwlogMgmtYang', '1.0')
37 gi.require_version('RwBaseYang', '1.0')
38 gi.require_version('RwCloudYang', '1.0')
39 gi.require_version('RwNsmYang', '1.0')
40 gi.require_version('RwIwpYang', '1.0')
41 gi.require_version('RwNsrYang', '1.0')
42 gi.require_version('RwResourceMgrYang', '1.0')
43 gi.require_version('RwConmanYang', '1.0')
44 gi.require_version('RwProjectVnfdYang', '1.0')
45
46 from gi.repository import (
47 ProjectNsdYang as NsdYang,
48 NsrYang,
49 RwBaseYang,
50 RwCloudYang,
51 RwIwpYang,
52 RwlogMgmtYang,
53 RwNsmYang,
54 RwNsrYang,
55 RwResourceMgrYang,
56 RwConmanYang,
57 RwProjectVnfdYang as RwVnfdYang,
58 VldYang,
59 )
60
61 logging.basicConfig(level=logging.DEBUG)
62
63
64 RW_KT_UTM_PKG_INSTALL_DIR = os.path.join(
65 os.environ["RIFT_INSTALL"],
66 "usr/rift/mano/vnfds/kt_utm"
67 )
68
69 RW_KT_UTM_NSD_PKG_INSTALL_DIR = os.path.join(
70 os.environ["RIFT_INSTALL"],
71 "usr/rift/mano/nsds/utm_only"
72 )
73
74
75 class PackageError(Exception):
76 pass
77
78
79 def raise_package_error():
80 raise PackageError("Could not find ns packages")
81
82
83 @pytest.fixture(scope='module')
84 def iwp_proxy(request, mgmt_session):
85 return mgmt_session.proxy(RwIwpYang)
86
87
88 @pytest.fixture(scope='module')
89 def rwlog_mgmt_proxy(request, mgmt_session):
90 return mgmt_session.proxy(RwlogMgmtYang)
91
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
133 @pytest.fixture(scope='module')
134 def so_proxy(request, mgmt_session):
135 return mgmt_session.proxy(RwConmanYang)
136
137
138 @pytest.fixture(scope='module')
139 def nsm_proxy(request, mgmt_session):
140 return mgmt_session.proxy(RwNsmYang)
141
142
143 @pytest.fixture(scope='session')
144 def kt_utm_vnfd_package_file():
145 ktutm_pkg_file = os.path.join(
146 RW_KT_UTM_PKG_INSTALL_DIR,
147 "kt_utm_vnfd.tar.gz",
148 )
149 if not os.path.exists(ktutm_pkg_file):
150 raise_package_error()
151
152 return ktutm_pkg_file
153
154 @pytest.fixture(scope='session')
155 def utm_only_nsd_package_file():
156 ktutm_nsd_pkg_file = os.path.join(
157 RW_KT_UTM_NSD_PKG_INSTALL_DIR,
158 "utm_only_nsd.tar.gz",
159 )
160 if not os.path.exists(ktutm_nsd_pkg_file):
161 raise_package_error()
162
163 return ktutm_nsd_pkg_file
164
165 def upload_descriptor(logger, descriptor_file, host="127.0.0.1"):
166 curl_cmd = 'curl -F "descriptor=@{file}" http://{host}:4567/api/upload'.format(
167 file=descriptor_file,
168 host=host,
169 )
170 logger.debug("Uploading descriptor %s using cmd: %s", descriptor_file, curl_cmd)
171 stdout = subprocess.check_output(shlex.split(curl_cmd), universal_newlines=True)
172
173 json_out = json.loads(stdout)
174 transaction_id = json_out["transaction_id"]
175
176 return transaction_id
177
178
179 class DescriptorOnboardError(Exception):
180 pass
181
182
183 def wait_unboard_transaction_finished(logger, transaction_id, timeout_secs=600, host="127.0.0.1", project="default"):
184 logger.info("Waiting for onboard trans_id %s to complete",
185 transaction_id)
186 start_time = time.time()
187 while (time.time() - start_time) < timeout_secs:
188 r = requests.get(
189 'http://{host}:8008/api/operational/project/{proj}/create-jobs/job/{t_id}'.format(
190 host=host, proj=project, t_id=transaction_id
191 )
192 )
193 state = r.json()
194 if state["status"] == "pending":
195 time.sleep(1)
196 continue
197
198 elif state["status"] == "success":
199 logger.info("Descriptor onboard was successful")
200 return
201
202 else:
203 raise DescriptorOnboardError(state)
204
205 if state["status"] != "success":
206 raise DescriptorOnboardError(state)
207
208 def create_nsr_from_nsd_id(nsd_id):
209 nsr = NsrYang.YangData_RwProject_Project_NsInstanceConfig_Nsr()
210 nsr.id = str(uuid.uuid4())
211 nsr.name = "UTM-only"
212 nsr.short_name = "UTM-only"
213 nsr.description = "1 VNFs with 5 VLs"
214 nsr.nsd_ref = nsd_id
215 nsr.admin_status = "ENABLED"
216
217 return nsr
218
219 @pytest.mark.incremental
220 class TestLaunchpadStartStop(object):
221 def test_configure_logging(self, rwlog_mgmt_proxy):
222 logging = RwlogMgmtYang.Logging.from_dict({
223 "console": {
224 "on": True,
225 "filter": {
226 "category": [{
227 "name": "rw-generic",
228 "severity": "error"
229 }],
230 }
231 }
232 })
233 rwlog_mgmt_proxy.merge_config("/rwlog-mgmt:logging", logging)
234
235 def test_configure_cloud_account(self, cloud_proxy, logger):
236 cloud_account = RwCloudYang.CloudAccountConfig()
237 # cloud_account.name = "cloudsim_proxy"
238 # cloud_account.account_type = "cloudsim_proxy"
239 cloud_account.name = "openstack"
240 cloud_account.account_type = "openstack"
241 cloud_account.openstack.key = 'pluto'
242 cloud_account.openstack.secret = 'mypasswd'
243 cloud_account.openstack.auth_url = 'http://10.66.4.13:5000/v3/'
244 cloud_account.openstack.tenant = 'demo'
245 cloud_account.openstack.mgmt_network = 'private'
246
247 cloud_proxy.merge_config("/rw-cloud:cloud-account", cloud_account)
248
249 def test_configure_pools(self, resource_mgr_proxy):
250 pools = RwResourceMgrYang.YangData_RwProject_Project_ResourceMgrConfig_ResourcePools.from_dict({
251 "pools": [{ "name": "vm_pool_a",
252 "resource_type": "compute",
253 "pool_type" : "dynamic"},
254 {"name": "network_pool_a",
255 "resource_type": "network",
256 "pool_type" : "dynamic",}]})
257
258 resource_mgr_proxy.merge_config('/rw-project:project/rw-resource-mgr:resource-mgr-config/rw-resource-mgr:resource-pools', pools)
259
260 def test_onboard_ktutm_vnfd(self, logger, vnfd_proxy, kt_utm_vnfd_package_file):
261 logger.info("Onboarding kt_utm_vnfd package: %s", kt_utm_vnfd_package_file)
262 trans_id = upload_descriptor(logger, kt_utm_vnfd_package_file)
263 wait_unboard_transaction_finished(logger, trans_id)
264
265 catalog = vnfd_proxy.get_config('/rw-project:project[rw-project:name="default"]/vnfd-catalog')
266 vnfds = catalog.vnfd
267 assert len(vnfds) == 1, "There should only be a single vnfd"
268 vnfd = vnfds[0]
269 assert vnfd.name == "kt_utm_vnfd"
270
271 def test_onboard_utm_only_nsd(self, logger, nsd_proxy, utm_only_nsd_package_file):
272 logger.info("Onboarding utm_onlynsd package: %s", utm_only_nsd_package_file)
273 trans_id = upload_descriptor(logger, utm_only_nsd_package_file)
274 wait_unboard_transaction_finished(logger, trans_id)
275
276 catalog = nsd_proxy.get_config('/rw-project:project[rw-project:name="default"]/nsd-catalog')
277 nsds = catalog.nsd
278 assert len(nsds) == 1, "There should only be a single nsd"
279 nsd = nsds[0]
280
281 def test_instantiate_utm_only_nsr(self, logger, nsd_proxy, nsr_proxy, rwnsr_proxy, base_proxy):
282 catalog = nsd_proxy.get_config('/rw-project:project[rw-project:name="default"]/nsd-catalog')
283 nsd = catalog.nsd[0]
284
285 nsr = create_nsr_from_nsd_id(nsd.id)
286 nsr_proxy.merge_config('/rw-project:project[rw-project:name="default"]/ns-instance-config', nsr)
287
288 nsr_opdata = rwnsr_proxy.get('/rw-project:project[rw-project:name="default"]/ns-instance-opdata')
289 nsrs = nsr_opdata.nsr
290 assert len(nsrs) == 1
291 assert nsrs[0].ns_instance_config_ref == nsr.id