From 56fb19b663557ce07be6d4e5c07fd4a5b9276ed2 Mon Sep 17 00:00:00 2001 From: Dimitrios Markou Date: Fri, 1 Sep 2017 14:26:45 +0300 Subject: Adapt functionality to the new Tacker API Change-Id: I078e9f26d3040cf04120abd425f03cb4f2e8daef Signed-off-by: Dimitrios Markou --- sfc/lib/openstack_tacker.py | 169 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 165 insertions(+), 4 deletions(-) (limited to 'sfc/lib/openstack_tacker.py') diff --git a/sfc/lib/openstack_tacker.py b/sfc/lib/openstack_tacker.py index 7b0f79a2..df112c39 100644 --- a/sfc/lib/openstack_tacker.py +++ b/sfc/lib/openstack_tacker.py @@ -1,6 +1,8 @@ import logging import os import time +import json +import yaml from tackerclient.tacker import client as tackerclient from functest.utils import openstack_utils as os_utils @@ -41,6 +43,10 @@ def get_vnfd_id(tacker_client, vnfd_name): return get_id_from_name(tacker_client, 'vnfd', vnfd_name) +def get_vim_id(tacker_client, vim_name): + return get_id_from_name(tacker_client, 'vim', vim_name) + + def get_vnf_id(tacker_client, vnf_name, timeout=5): vnf_id = None while vnf_id is None and timeout >= 0: @@ -53,6 +59,22 @@ def get_vnf_id(tacker_client, vnf_name, timeout=5): return vnf_id +def get_vnffg_id(tacker_client, vnffg_name, timeout=5): + vnffg_id = None + while vnffg_id is None and timeout >= 0: + vnffg_id = get_id_from_name(tacker_client, 'vnffg', vnffg_name) + if vnffg_id is None: + logger.info("Could not retrieve ID for vnffg with name [%s]." + " Retrying." % vnffg_name) + time.sleep(1) + timeout -= 1 + return vnffg_id + + +def get_vnffgd_id(tacker_client, vnffgd_name): + return get_id_from_name(tacker_client, 'vnffgd', vnffgd_name) + + def list_vnfds(tacker_client, verbose=False): try: vnfds = tacker_client.list_vnfds(retrieve_all=True) @@ -64,7 +86,7 @@ def list_vnfds(tacker_client, verbose=False): return None -def create_vnfd(tacker_client, tosca_file=None): +def create_vnfd(tacker_client, tosca_file=None, vnfd_name=None): try: vnfd_body = {} if tosca_file is not None: @@ -72,7 +94,8 @@ def create_vnfd(tacker_client, tosca_file=None): vnfd_body = tosca_fd.read() logger.info('VNFD template:\n{0}'.format(vnfd_body)) return tacker_client.create_vnfd( - body={"vnfd": {"attributes": {"vnfd": vnfd_body}}}) + body={"vnfd": {"attributes": {"vnfd": vnfd_body}, + "name": vnfd_name}}) except Exception, e: logger.error("Error [create_vnfd(tacker_client, '%s')]: %s" % (tosca_file, e)) @@ -105,7 +128,7 @@ def list_vnfs(tacker_client, verbose=False): def create_vnf(tacker_client, vnf_name, vnfd_id=None, - vnfd_name=None, param_file=None): + vnfd_name=None, vim_id=None, vim_name=None, param_file=None): try: vnf_body = { 'vnf': { @@ -120,10 +143,15 @@ def create_vnf(tacker_client, vnf_name, vnfd_id=None, vnf_body['vnf']['attributes']['param_values'] = params if vnfd_id is not None: vnf_body['vnf']['vnfd_id'] = vnfd_id + if vim_id is not None: + vnf_body['vnf']['vim_id'] = vim_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) + if vim_name is None: + raise Exception('vim id or vim name is required') + vnf_body['vnf']['vim_id'] = get_vim_id(tacker_client, vim_name) return tacker_client.create_vnf(body=vnf_body) except Exception, e: logger.error("error [create_vnf(tacker_client," @@ -151,7 +179,7 @@ def get_vnf(tacker_client, vnf_id=None, vnf_name=None): return None -def wait_for_vnf(tacker_client, vnf_id=None, vnf_name=None, timeout=60): +def wait_for_vnf(tacker_client, vnf_id=None, vnf_name=None, timeout=100): try: vnf = get_vnf(tacker_client, vnf_id, vnf_name) if vnf is None: @@ -188,3 +216,136 @@ def delete_vnf(tacker_client, vnf_id=None, vnf_name=None): logger.error("Error [delete_vnf(tacker_client, '%s', '%s')]: %s" % (vnf_id, vnf_name, e)) return None + + +def create_vim(tacker_client, vim_file=None): + try: + vim_body = {} + if vim_file is not None: + with open(vim_file) as vim_fd: + vim_body = json.load(vim_fd) + logger.info('VIM template:\n{0}'.format(vim_body)) + return tacker_client.create_vim(body=vim_body) + except Exception, e: + logger.error("Error [create_vim(tacker_client, '%s')]: %s" + % (vim_file, e)) + return None + + +def create_vnffgd(tacker_client, tosca_file=None, vnffgd_name=None): + try: + vnffgd_body = {} + if tosca_file is not None: + with open(tosca_file) as tosca_fd: + vnffgd_body = yaml.load(tosca_fd) + logger.info('VNFFGD template:\n{0}'.format(vnffgd_body)) + return tacker_client.create_vnffgd( + body={'vnffgd': {'name': vnffgd_name, + 'template': {'vnffgd': vnffgd_body}}}) + except Exception, e: + logger.error("Error [create_vnffgd(tacker_client, '%s')]: %s" + % (tosca_file, e)) + return None + + +def create_vnffg(tacker_client, vnffg_name=None, vnffgd_id=None, + vnffgd_name=None): + ''' + Tacker doesn't support Symmetrical chain and parameter file + in Openstack/Ocata + ''' + try: + vnffg_body = { + 'vnffg': { + 'attributes': {}, + 'name': vnffg_name + } + } + if vnffgd_id is not None: + vnffg_body['vnffg']['vnffgd_id'] = vnffgd_id + else: + if vnffgd_name is None: + raise Exception('vnffgd id or vnffgd name is required') + vnffg_body['vnffg']['vnffgd_id'] = get_vnffgd_id(tacker_client, + vnffgd_name) + return tacker_client.create_vnffg(body=vnffg_body) + except Exception, e: + logger.error("error [create_vnffg(tacker_client," + " '%s', '%s', '%s')]: %s" + % (vnffg_name, vnffgd_id, vnffgd_name, e)) + return None + + +def list_vnffgds(tacker_client, verbose=False): + try: + vnffgds = tacker_client.list_vnffgds(retrieve_all=True) + if not verbose: + vnffgds = [vnffgd['id'] for vnffgd in vnffgds['vnffgds']] + return vnffgds + except Exception, e: + logger.error("Error [list_vnffgds(tacker_client)]: %s" % e) + return None + + +def list_vnffgs(tacker_client, verbose=False): + try: + vnffgs = tacker_client.list_vnffgs(retrieve_all=True) + if not verbose: + vnffgs = [vnffg['id'] for vnffg in vnffgs['vnffgs']] + return vnffgs + except Exception, e: + logger.error("Error [list_vnffgs(tacker_client)]: %s" % e) + return None + + +def delete_vnffg(tacker_client, vnffg_id=None, vnffg_name=None): + try: + vnffg = vnffg_id + if vnffg is None: + if vnffg_name is None: + raise Exception('You need to provide a VNFFG id or name') + vnffg = get_vnffg_id(tacker_client, vnffg_name) + return tacker_client.delete_vnffg(vnffg) + except Exception, e: + logger.error("Error [delete_vnffg(tacker_client, '%s', '%s')]: %s" + % (vnffg_id, vnffg_name, e)) + return None + + +def delete_vnffgd(tacker_client, vnffgd_id=None, vnffgd_name=None): + try: + vnffgd = vnffgd_id + if vnffgd is None: + if vnffgd_name is None: + raise Exception('You need to provide VNFFGD id or VNFFGD name') + vnffgd = get_vnffgd_id(tacker_client, vnffgd_name) + return tacker_client.delete_vnffgd(vnffgd) + except Exception, e: + logger.error("Error [delete_vnffgd(tacker_client, '%s', '%s')]: %s" + % (vnffgd_id, vnffgd_name, e)) + return None + + +def list_vims(tacker_client, verbose=False): + try: + vims = tacker_client.list_vims(retrieve_all=True) + if not verbose: + vims = [vim['id'] for vim in vims['vims']] + return vims + except Exception, e: + logger.error("Error [list_vims(tacker_client)]: %s" % e) + return None + + +def delete_vim(tacker_client, vim_id=None, vim_name=None): + try: + vim = vim_id + if vim is None: + if vim_name is None: + raise Exception('You need to provide VIM id or VIM name') + vim = get_vim_id(tacker_client, vim_name) + return tacker_client.delete_vim(vim) + except Exception, e: + logger.error("Error [delete_vim(tacker_client, '%s', '%s')]: %s" + % (vim_id, vim_name, e)) + return None -- cgit 1.2.3-korg