From 41e8777b43f768c0aa5d6c9bd54a335b3ad1ada9 Mon Sep 17 00:00:00 2001 From: George Paraskevopoulos Date: Fri, 14 Oct 2016 12:12:13 +0300 Subject: Add wrappers for Tacker Python client New module: functest.utils.openstack_tacker Change-Id: Ie02b72d53c824eeff944bc76e4cae58c8de9044a Signed-off-by: George Paraskevopoulos (cherry picked from commit 7e21e6cd5187e27c8f0115deee1ab7719d186e78) --- utils/openstack_tacker.py | 249 ++++++++++++++++++++++++++++++++++++++++++++++ utils/openstack_utils.py | 3 +- 2 files changed, 250 insertions(+), 2 deletions(-) create mode 100644 utils/openstack_tacker.py diff --git a/utils/openstack_tacker.py b/utils/openstack_tacker.py new file mode 100644 index 000000000..3e0c9cf45 --- /dev/null +++ b/utils/openstack_tacker.py @@ -0,0 +1,249 @@ +########################################################################### +# Copyright (c) 2016 Ericsson AB and others. +# Author: George Paraskevopoulos +# +# Wrappers for trozet's python-tackerclient v1.0 +# (https://github.com/trozet/python-tackerclient) +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +########################################################################## + + +from tackerclient.v1_0 import client as tackerclient +import functest.utils.functest_logger as ft_logger +import functest.utils.openstack_utils as os_utils +import yaml + +logger = ft_logger.Logger("tacker_utils").getLogger() + + +def get_tacker_client(): + creds_tacker = os_utils.get_credentials('tacker') + return tackerclient.Client(**creds_tacker) + + +# ********************************************* +# TACKER +# ********************************************* +def get_id_from_name(tacker_client, resource_type, resource_name): + try: + req_params = {'fields': 'id', 'name': resource_name} + endpoint = '/{0}s'.format(resource_type) + resp = tacker_client.get(endpoint, params=req_params) + return resp[endpoint[1:]][0]['id'] + except Exception, e: + logger.error("Error [get_id_from_name(tacker_client, " + "resource_type, resource_name)]: %s" % e) + return None + + +def get_vnfd_id(tacker_client, vnfd_name): + return get_id_from_name(tacker_client, 'vnfd', vnfd_name) + + +def get_vnf_id(tacker_client, vnf_name): + return get_id_from_name(tacker_client, 'vnf', vnf_name) + + +def get_sfc_id(tacker_client, sfc_name): + return get_id_from_name(tacker_client, 'sfc', sfc_name) + + +def get_sfc_classifier_id(tacker_client, sfc_clf_name): + return get_id_from_name(tacker_client, 'sfc_classifier', sfc_clf_name) + + +def list_vnfds(tacker_client, verbose=False): + try: + vnfds = tacker_client.list_vnfds(retrieve_all=True) + if not verbose: + vnfds = [vnfd['id'] for vnfd in vnfds['vnfds']] + return vnfds + except Exception, e: + logger.error("Error [list_vnfds(tacker_client)]: %s" % e) + return None + + +def create_vnfd(tacker_client, tosca_file=None): + try: + vnfd_body = {} + if tosca_file is not None: + with open(tosca_file) as tosca_fd: + vnfd_body = yaml.safe_load(tosca_fd) + return tacker_client.create_vnfd(body=vnfd_body) + except Exception, e: + logger.error("Error [create_vnfd(tacker_client, '%s')]: %s" + % (tosca_file, e)) + return None + + +def delete_vnfd(tacker_client, vnfd_id=None, vnfd_name=None): + try: + vnfd = vnfd_id + if vnfd is None: + if vnfd_name is None: + raise Exception('You need to provide VNFD id or VNFD name') + vnfd = get_vnfd_id(tacker_client, vnfd_name) + return tacker_client.delete_vnfd(vnfd) + except Exception, e: + logger.error("Error [delete_vnfd(tacker_client, '%s', '%s')]: %s" + % (vnfd_id, vnfd_name, e)) + return None + + +def list_vnfs(tacker_client, verbose=False): + try: + vnfs = tacker_client.list_vnfs(retrieve_all=True) + if not verbose: + vnfs = [vnf['id'] for vnf in vnfs['vnfs']] + return vnfs + except Exception, e: + logger.error("Error [list_vnfs(tacker_client)]: %s" % e) + return None + + +def create_vnf(tacker_client, vnf_name, vnfd_id=None, vnfd_name=None): + try: + vnf_body = { + 'vnf': { + 'attributes': {}, + 'name': vnf_name + } + } + if vnfd_id is not None: + vnf_body['vnf']['vnfd_id'] = vnfd_id + else: + if vnfd_name is None: + raise Exception('vnfd id or vnfd name is required') + vnf_body['vnf']['vnfd_id'] = get_vnfd_id(tacker_client, vnfd_name) + return tacker_client.create_vnf(body=vnf_body) + except Exception, e: + logger.error("error [create_vnf(tacker_client, '%s', '%s', '%s')]: %s" + % (vnf_name, vnfd_id, vnfd_name, e)) + return None + + +def delete_vnf(tacker_client, vnf_id=None, vnf_name=None): + try: + vnf = vnf_id + if vnf is None: + if vnf_name is None: + raise Exception('You need to provide a VNF id or name') + vnf = get_vnf_id(tacker_client, vnf_name) + return tacker_client.delete_vnf(vnf) + except Exception, e: + logger.error("Error [delete_vnf(tacker_client, '%s', '%s')]: %s" + % (vnf_id, vnf_name, e)) + return None + + +def list_sfcs(tacker_client, verbose=False): + try: + sfcs = tacker_client.list_sfcs(retrieve_all=True) + if not verbose: + sfcs = [sfc['id'] for sfc in sfcs['sfcs']] + return sfcs + except Exception, e: + logger.error("Error [list_sfcs(tacker_client)]: %s" % e) + return None + + +def create_sfc(tacker_client, sfc_name, + chain_vnf_ids=None, + chain_vnf_names=None): + try: + sfc_body = { + 'sfc': { + 'attributes': {}, + 'name': sfc_name, + 'chain': [] + } + } + if chain_vnf_ids is not None: + sfc_body['sfc']['chain'] = chain_vnf_ids + else: + if chain_vnf_names is None: + raise Exception('You need to provide a chain of VNFs') + sfc_body['sfc']['chain'] = [get_vnf_id(tacker_client, name) + for name in chain_vnf_names] + return tacker_client.create_sfc(body=sfc_body) + except Exception, e: + logger.error("error [create_sfc(tacker_client, '%s', '%s', '%s')]: %s" + % (sfc_name, chain_vnf_ids, chain_vnf_names, e)) + return None + + +def delete_sfc(tacker_client, sfc_id=None, sfc_name=None): + try: + sfc = sfc_id + if sfc is None: + if sfc_name is None: + raise Exception('You need to provide an SFC id or name') + sfc = get_sfc_id(tacker_client, sfc_name) + return tacker_client.delete_sfc(sfc) + except Exception, e: + logger.error("Error [delete_sfc(tacker_client, '%s', '%s')]: %s" + % (sfc_id, sfc_name, e)) + return None + + +def list_sfc_clasifiers(tacker_client, verbose=False): + try: + sfc_clfs = tacker_client.list_sfc_classifiers(retrieve_all=True) + if not verbose: + sfc_clfs = [sfc_clf['id'] + for sfc_clf in sfc_clfs['sfc_classifiers']] + return sfc_clfs + except Exception, e: + logger.error("Error [list_sfc_classifiers(tacker_client)]: %s" % e) + return None + + +def create_sfc_classifier(tacker_client, sfc_clf_name, sfc_id=None, + sfc_name=None, match={}): + # Example match: + # match: { + # "source_port": "0", + # "protocol": "6", + # "dest_port": "80" + # } + try: + sfc_clf_body = { + 'sfc_classifier': { + 'attributes': {}, + 'name': sfc_clf_name, + 'match': match, + 'chain': '' + } + } + if sfc_id is not None: + sfc_clf_body['sfc_classifier']['chain'] = sfc_id + else: + if sfc_name is None: + raise Exception('You need to provide an SFC id or name') + sfc_clf_body['sfc']['chain'] = get_sfc_id(tacker_client, sfc_name) + return tacker_client.create_sfc_classifier(body=sfc_clf_body) + except Exception, e: + logger.error("error [create_sfc_classifier(tacker_client, '%s', '%s', " + "'%s')]: %s" % (sfc_clf_name, sfc_id, sfc_name, match, e)) + return None + + +def delete_sfc_classifier(tacker_client, + sfc_clf_id=None, + sfc_clf_name=None): + try: + sfc_clf = sfc_clf_id + if sfc_clf is None: + if sfc_clf_name is None: + raise Exception('You need to provide an SFC' + 'classifier id or name') + sfc_clf = get_sfc_classifier_id(tacker_client, sfc_clf_name) + return tacker_client.delete_sfc_classifier(sfc_clf) + except Exception, e: + logger.error("Error [delete_sfc_classifier(tacker_client, '%s', " + "'%s')]: %s" % (sfc_clf_id, sfc_clf_name, e)) + return None diff --git a/utils/openstack_utils.py b/utils/openstack_utils.py index 57e96cd9e..97e755917 100755 --- a/utils/openstack_utils.py +++ b/utils/openstack_utils.py @@ -158,11 +158,10 @@ def get_glance_client(): return glanceclient.Client(1, glance_endpoint, token=keystone_client.auth_token) + # ********************************************* # NOVA # ********************************************* - - def get_instances(nova_client): try: instances = nova_client.servers.list(search_opts={'all_tenants': 1}) -- cgit 1.2.3-korg