1 ###########################################################################
2 # Copyright (c) 2016 Ericsson AB and others.
3 # Author: George Paraskevopoulos <geopar@intracom-telecom.com>
5 # Wrappers for trozet's python-tackerclient v1.0
6 # (https://github.com/trozet/python-tackerclient)
8 # All rights reserved. This program and the accompanying materials
9 # are made available under the terms of the Apache License, Version 2.0
10 # which accompanies this distribution, and is available at
11 # http://www.apache.org/licenses/LICENSE-2.0
12 ##########################################################################
16 from tackerclient.v1_0 import client as tackerclient
17 import functest.utils.openstack_utils as os_utils
20 logger = logging.getLogger(__name__)
23 def get_tacker_client(other_creds={}):
24 sess = os_utils.get_session(other_creds)
25 return tackerclient.Client(session=sess)
28 # *********************************************
30 # *********************************************
31 def get_id_from_name(tacker_client, resource_type, resource_name):
33 req_params = {'fields': 'id', 'name': resource_name}
34 endpoint = '/{0}s'.format(resource_type)
35 resp = tacker_client.get(endpoint, params=req_params)
36 endpoint = endpoint.replace('-', '_')
37 return resp[endpoint[1:]][0]['id']
39 logger.error("Error [get_id_from_name(tacker_client, "
40 "resource_type, resource_name)]: %s" % e)
44 def get_vnfd_id(tacker_client, vnfd_name):
45 return get_id_from_name(tacker_client, 'vnfd', vnfd_name)
48 def get_vnf_id(tacker_client, vnf_name, timeout=5):
50 while vnf_id is None and timeout >= 0:
51 vnf_id = get_id_from_name(tacker_client, 'vnf', vnf_name)
53 logger.info("Could not retrieve ID for vnf with name [%s]."
54 " Retrying." % vnf_name)
60 def get_sfc_id(tacker_client, sfc_name):
61 return get_id_from_name(tacker_client, 'sfc', sfc_name)
64 def get_sfc_classifier_id(tacker_client, sfc_clf_name):
65 return get_id_from_name(tacker_client, 'sfc-classifier', sfc_clf_name)
68 def list_vnfds(tacker_client, verbose=False):
70 vnfds = tacker_client.list_vnfds(retrieve_all=True)
72 vnfds = [vnfd['id'] for vnfd in vnfds['vnfds']]
75 logger.error("Error [list_vnfds(tacker_client)]: %s" % e)
79 def create_vnfd(tacker_client, tosca_file=None):
82 if tosca_file is not None:
83 with open(tosca_file) as tosca_fd:
84 vnfd_body = tosca_fd.read()
85 logger.info('VNFD template:\n{0}'.format(vnfd_body))
86 return tacker_client.create_vnfd(
87 body={"vnfd": {"attributes": {"vnfd": vnfd_body}}})
89 logger.error("Error [create_vnfd(tacker_client, '%s')]: %s"
94 def delete_vnfd(tacker_client, vnfd_id=None, vnfd_name=None):
99 raise Exception('You need to provide VNFD id or VNFD name')
100 vnfd = get_vnfd_id(tacker_client, vnfd_name)
101 return tacker_client.delete_vnfd(vnfd)
103 logger.error("Error [delete_vnfd(tacker_client, '%s', '%s')]: %s"
104 % (vnfd_id, vnfd_name, e))
108 def list_vnfs(tacker_client, verbose=False):
110 vnfs = tacker_client.list_vnfs(retrieve_all=True)
112 vnfs = [vnf['id'] for vnf in vnfs['vnfs']]
115 logger.error("Error [list_vnfs(tacker_client)]: %s" % e)
119 def create_vnf(tacker_client, vnf_name, vnfd_id=None,
120 vnfd_name=None, param_file=None):
128 if param_file is not None:
130 with open(param_file) as f:
132 vnf_body['vnf']['attributes']['param_values'] = params
133 if vnfd_id is not None:
134 vnf_body['vnf']['vnfd_id'] = vnfd_id
136 if vnfd_name is None:
137 raise Exception('vnfd id or vnfd name is required')
138 vnf_body['vnf']['vnfd_id'] = get_vnfd_id(tacker_client, vnfd_name)
139 return tacker_client.create_vnf(body=vnf_body)
141 logger.error("error [create_vnf(tacker_client,"
142 " '%s', '%s', '%s')]: %s"
143 % (vnf_name, vnfd_id, vnfd_name, e))
147 def get_vnf(tacker_client, vnf_id=None, vnf_name=None):
149 if vnf_id is None and vnf_name is None:
150 raise Exception('You must specify vnf_id or vnf_name')
152 _id = get_vnf_id(tacker_client, vnf_name) if vnf_id is None else vnf_id
155 all_vnfs = list_vnfs(tacker_client, verbose=True)['vnfs']
156 return next((vnf for vnf in all_vnfs if vnf['id'] == _id), None)
158 raise Exception('Could not retrieve ID from name [%s]' % vnf_name)
161 logger.error("Could not retrieve VNF [vnf_id=%s, vnf_name=%s] - %s"
162 % (vnf_id, vnf_name, e))
166 def wait_for_vnf(tacker_client, vnf_id=None, vnf_name=None, timeout=60):
168 vnf = get_vnf(tacker_client, vnf_id, vnf_name)
170 raise Exception("Could not retrieve VNF - id='%s', name='%s'"
172 logger.info('Waiting for vnf {0}'.format(str(vnf)))
173 while vnf['status'] != 'ACTIVE' and timeout >= 0:
174 if vnf['status'] == 'ERROR':
175 raise Exception('Error when booting vnf %s' % vnf['id'])
176 elif vnf['status'] == 'PENDING_CREATE':
179 vnf = get_vnf(tacker_client, vnf_id, vnf_name)
182 raise Exception('Timeout when booting vnf %s' % vnf['id'])
186 logger.error("error [wait_for_vnf(tacker_client, '%s', '%s')]: %s"
187 % (vnf_id, vnf_name, e))
191 def delete_vnf(tacker_client, vnf_id=None, vnf_name=None):
196 raise Exception('You need to provide a VNF id or name')
197 vnf = get_vnf_id(tacker_client, vnf_name)
198 return tacker_client.delete_vnf(vnf)
200 logger.error("Error [delete_vnf(tacker_client, '%s', '%s')]: %s"
201 % (vnf_id, vnf_name, e))
205 def list_sfcs(tacker_client, verbose=False):
207 sfcs = tacker_client.list_sfcs(retrieve_all=True)
209 sfcs = [sfc['id'] for sfc in sfcs['sfcs']]
212 logger.error("Error [list_sfcs(tacker_client)]: %s" % e)
216 def create_sfc(tacker_client, sfc_name,
218 chain_vnf_names=None,
229 sfc_body['sfc']['symmetrical'] = True
230 if chain_vnf_ids is not None:
231 sfc_body['sfc']['chain'] = chain_vnf_ids
233 if chain_vnf_names is None:
234 raise Exception('You need to provide a chain of VNFs')
235 sfc_body['sfc']['chain'] = [get_vnf_id(tacker_client, name)
236 for name in chain_vnf_names]
237 return tacker_client.create_sfc(body=sfc_body)
239 logger.error("error [create_sfc(tacker_client,"
240 " '%s', '%s', '%s')]: %s"
241 % (sfc_name, chain_vnf_ids, chain_vnf_names, e))
245 def delete_sfc(tacker_client, sfc_id=None, sfc_name=None):
250 raise Exception('You need to provide an SFC id or name')
251 sfc = get_sfc_id(tacker_client, sfc_name)
252 return tacker_client.delete_sfc(sfc)
254 logger.error("Error [delete_sfc(tacker_client, '%s', '%s')]: %s"
255 % (sfc_id, sfc_name, e))
259 def list_sfc_classifiers(tacker_client, verbose=False):
261 sfc_clfs = tacker_client.list_sfc_classifiers(retrieve_all=True)
263 sfc_clfs = [sfc_clf['id']
264 for sfc_clf in sfc_clfs['sfc_classifiers']]
267 logger.error("Error [list_sfc_classifiers(tacker_client)]: %s" % e)
271 def create_sfc_classifier(tacker_client, sfc_clf_name, sfc_id=None,
272 sfc_name=None, match={}):
275 # "source_port": "0",
283 'name': sfc_clf_name,
288 if sfc_id is not None:
289 sfc_clf_body['sfc_classifier']['chain'] = sfc_id
292 raise Exception('You need to provide an SFC id or name')
293 sfc_clf_body['sfc_classifier']['chain'] = get_sfc_id(
294 tacker_client, sfc_name)
295 return tacker_client.create_sfc_classifier(body=sfc_clf_body)
297 logger.error("error [create_sfc_classifier(tacker_client,"
298 " '%s', '%s','%s', '%s')]: '%s'"
299 % (sfc_clf_name, sfc_id, sfc_name, str(match), e))
303 def delete_sfc_classifier(tacker_client,
309 if sfc_clf_name is None:
310 raise Exception('You need to provide an SFC'
311 'classifier id or name')
312 sfc_clf = get_sfc_classifier_id(tacker_client, sfc_clf_name)
313 return tacker_client.delete_sfc_classifier(sfc_clf)
315 logger.error("Error [delete_sfc_classifier(tacker_client, '%s', "
316 "'%s')]: %s" % (sfc_clf_id, sfc_clf_name, e))