4 # Copyright 2016 RIFT.IO Inc
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
10 # http://www.apache.org/licenses/LICENSE-2.0
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.
19 @file lp_3vnfs_test.py
20 @author Austin Cormier (Austin.Cormier@riftio.com)
22 @brief Launchpad Module Test ExtVNF
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')
46 from gi
.repository
import RwIwpYang
, NsdYang
, NsrYang
, RwNsrYang
, VldYang
, RwVnfdYang
, RwCloudYang
, RwBaseYang
, RwResourceMgrYang
, RwConmanYang
, RwNsmYang
48 logging
.basicConfig(level
=logging
.DEBUG
)
51 RW_VROUTER_PKG_INSTALL_DIR
= os
.path
.join(
52 os
.environ
["RIFT_INSTALL"],
53 "usr/rift/mano/vnfds/vrouter"
55 RW_TRAFGEN_PKG_INSTALL_DIR
= os
.path
.join(
56 os
.environ
["RIFT_INSTALL"],
57 "usr/rift/mano/vnfds/trafgen"
59 RW_TRAFSINK_PKG_INSTALL_DIR
= os
.path
.join(
60 os
.environ
["RIFT_INSTALL"],
61 "usr/rift/mano/vnfds/trafsink"
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"
69 class PackageError(Exception):
73 def raise_package_error():
74 raise PackageError("Could not find ns packages")
77 @pytest.fixture(scope
='module')
78 def iwp_proxy(request
, mgmt_session
):
79 return mgmt_session
.proxy(RwIwpYang
)
81 @pytest.fixture(scope
='module')
82 def resource_mgr_proxy(request
, mgmt_session
):
83 return mgmt_session
.proxy(RwResourceMgrYang
)
86 @pytest.fixture(scope
='module')
87 def cloud_proxy(request
, mgmt_session
):
88 return mgmt_session
.proxy(RwCloudYang
)
91 @pytest.fixture(scope
='module')
92 def vnfd_proxy(request
, mgmt_session
):
93 return mgmt_session
.proxy(RwVnfdYang
)
96 @pytest.fixture(scope
='module')
97 def vld_proxy(request
, mgmt_session
):
98 return mgmt_session
.proxy(VldYang
)
101 @pytest.fixture(scope
='module')
102 def nsd_proxy(request
, mgmt_session
):
103 return mgmt_session
.proxy(NsdYang
)
106 @pytest.fixture(scope
='module')
107 def nsr_proxy(request
, mgmt_session
):
108 return mgmt_session
.proxy(NsrYang
)
111 @pytest.fixture(scope
='module')
112 def rwnsr_proxy(request
, mgmt_session
):
113 return mgmt_session
.proxy(RwNsrYang
)
116 @pytest.fixture(scope
='module')
117 def base_proxy(request
, mgmt_session
):
118 return mgmt_session
.proxy(RwBaseYang
)
120 @pytest.fixture(scope
='module')
121 def so_proxy(request
, mgmt_session
):
122 return mgmt_session
.proxy(RwConmanYang
)
124 @pytest.fixture(scope
='module')
125 def nsm_proxy(request
, mgmt_session
):
126 return mgmt_session
.proxy(RwNsmYang
)
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",
134 if not os
.path
.exists(vrouter_pkg_file
):
135 raise_package_error()
137 return vrouter_pkg_file
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",
145 if not os
.path
.exists(tg_pkg_file
):
146 raise_package_error()
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",
156 if not os
.path
.exists(ts_pkg_file
):
157 raise_package_error()
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",
167 if not os
.path
.exists(tg_vrouter_ts_nsd_pkg_file
):
168 raise_package_error()
170 return tg_vrouter_ts_nsd_pkg_file
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"
180 nsr
.admin_status
= "ENABLED"
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
,
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)
193 json_out
= json
.loads(stdout
)
194 transaction_id
= json_out
["transaction_id"]
196 return transaction_id
199 class DescriptorOnboardError(Exception):
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",
206 start_time
= time
.time()
207 while (time
.time() - start_time
) < timeout_secs
:
209 'http://{host}:4567/api/upload/{t_id}/state'.format(
210 host
=host
, t_id
=transaction_id
214 if state
["status"] == "pending":
218 elif state
["status"] == "success":
219 logger
.info("Descriptor onboard was successful")
223 raise DescriptorOnboardError(state
)
225 if state
["status"] != "success":
226 raise DescriptorOnboardError(state
)
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'
242 cloud_proxy
.merge_config("/rw-cloud:cloud-account", cloud_account
)
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",}]})
253 resource_mgr_proxy
.merge_config('/rw-resource-mgr:resource-mgr-config/rw-resource-mgr:resource-pools', pools
)
255 def test_configure_resource_orchestrator(self
, so_proxy
):
256 cfg
= RwConmanYang
.RoEndpoint
.from_dict({'ro_ip_address': '127.0.0.1',
258 'ro_username' : 'admin',
259 'ro_password' : 'admin'})
260 so_proxy
.merge_config('/rw-conman:cm-config', cfg
)
262 def test_configure_service_orchestrator(self
, nsm_proxy
):
263 cfg
= RwNsmYang
.SoEndpoint
.from_dict({'cm_ip_address': '127.0.0.1',
265 'cm_username' : 'admin',
266 'cm_password' : 'admin'})
267 nsm_proxy
.merge_config('/rw-nsm:ro-config/rw-nsm:cm-endpoint', cfg
)
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
)
275 catalog
= vnfd_proxy
.get_config('/vnfd-catalog')
277 assert len(vnfds
) == 1, "There should be one vnfds"
278 assert "trafgen_vnfd" in [vnfds
[0].name
]
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
)
285 catalog
= vnfd_proxy
.get_config('/vnfd-catalog')
287 assert len(vnfds
) == 2, "There should be two vnfds"
288 assert "vrouter_vnfd" in [vnfds
[0].name
, vnfds
[1].name
]
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
)
295 catalog
= vnfd_proxy
.get_config('/vnfd-catalog')
297 assert len(vnfds
) == 3, "There should be three vnfds"
298 assert "trafsink_vnfd" in [vnfds
[0].name
, vnfds
[1].name
, vnfds
[2].name
]
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
)
305 catalog
= nsd_proxy
.get_config('/nsd-catalog')
307 assert len(nsds
) == 1, "There should only be a single nsd"
309 assert nsd
.name
== "tg_vrouter_ts_nsd"
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')
315 nsr
= create_nsr_from_nsd_id(nsd
.id)
316 nsr_proxy
.merge_config('/ns-instance-config', nsr
)
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