{ 'enum': 'TestEnum',
'data': [ 'value1', 'value2' ] }
{ 'struct': 'TestBase',
'data': { 'enum1': 'TestEnum' } }
{ 'struct': 'TestTypeA',
'data': { 'string': 'str' } }
{ 'struct': 'TestTypeB',
'data': { 'integer': 'int' } }
{ 'union': 'TestUnion',
'base': 'TestBase',
'discriminator':
@media only all and (prefers-color-scheme: dark) {
.highlight .hll { background-color: #49483e }
.highlight .c { color: #75715e } /* Comment */
.highlight .err { color: #960050; background-color: #1e0010 } /* Error */
.highlight .k { color: #66d9ef } /* Keyword */
.highlight .l { color: #ae81ff } /* Literal */
.highlight .n { color: #f8f8f2 } /* Name */
.highlight .o { color: #f92672 } /* Operator */
.highlight .p { color: #f8f8f2 } /* Punctuation */
.highlight .ch { color: #75715e } /* Comment.Hashbang */
.highlight .cm { color: #75715e } /* Comment.Multiline */
.highlight .cp { color: #75715e } /* Comment.Preproc */
.highlight .cpf { color: #75715e } /* Comment.PreprocFile */
.highlight .c1 { color: #75715e } /* Comment.Single */
.highlight .cs { color: #75715e } /* Comment.Special */
.highlight .gd { color: #f92672 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gi { color: #a6e22e } /* Generic.Inserted */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #75715e } /* Generic.Subheading */
.highlight .kc { color: #66d9ef } /* Keyword.Constant */
.highlight .kd { color: #66d9ef } /* Keyword.Declaration */
.highlight .kn { color: #f92672 } /* Keyword.Namespace */
.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */
.highlight .kr { color: #66d9ef } /* Keyword.Reserved */
.highlight .kt { color: #66d9ef } /* Keyword.Type */
.highlight .ld { color: #e6db74 } /* Literal.Date */
.highlight .m { color: #ae81ff } /* Literal.Number */
.highlight .s { color: #e6db74 } /* Literal.String */
.highlight .na { color: #a6e22e } /* Name.Attribute */
.highlight .nb { color: #f8f8f2 } /* Name.Builtin */
.highlight .nc { color: #a6e22e } /* Name.Class */
.highlight .no { color: #66d9ef } /* Name.Constant */
.highlight .nd { color: #a6e22e } /* Name.Decorator */
.highlight .ni { color: #f8f8f2 } /* Name.Entity */
.highlight .ne { color: #a6e22e } /* Name.Exception */
.highlight .nf { color: #a6e22e } /* Name.Function */
.highlight .nl { color: #f8f8f2 } /* Name.Label */
.highlight .nn { color: #f8f8f2 } /* Name.Namespace */
.highlight .nx { color: #a6e22e } /* Name.Other */
.highlight .py { color: #f8f8f2 } /* Name.Property */
.highlight .nt { color: #f92672 } /* Name.Tag */
.highlight .nv { color: #f8f8f2 } /* Name.Variable */
.highlight .ow { color: #f92672 } /* Operator.Word */
.highlight .w { color: #f8f8f2 } /* Text.Whitespace */
.highlight .mb { color: #ae81ff } /* Literal.Number.Bin */
.highlight .mf { color: #ae81ff } /* Literal.Number.Float */
.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */
.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */
.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */
.highlight .sa { color: #e6db74 } /* Literal.String.Affix */
.highlight .sb { color: #e6db74 } /* Literal.String.Backtick */
.highlight .sc { color: #e6db74 } /* Literal.String.Char */
.highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */
.highlight .sd { color: #e6db74 } /* Literal.String.Doc */
.highlight .s2 { color: #e6db74 } /* Literal.String.Double */
.highlight .se { color: #ae81ff } /* Literal.String.Escape */
.highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */
.highlight .si { color: #e6db74 } /* Literal.String.Interpol */
.highlight .sx { color: #e6db74 } /* Literal.String.Other */
.highlight .sr { color: #e6db74 } /* Literal.String.Regex */
.highlight .s1 { color: #e6db74 } /* Literal.String.Single */
.highlight .ss { color: #e6db74 } /* Literal.String.Symbol */
.highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #a6e22e } /* Name.Function.Magic */
.highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */
.highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */
.highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */
.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */
}
@media (prefers-color-scheme: light) {
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
}
###########################################################################
# Copyright (c) 2016 Ericsson AB and others.
# Author: George Paraskevopoulos <geopar@intracom-telecom.com>
#
# 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 time
logger = ft_logger.Logger("tacker_utils").getLogger()
def get_tacker_client(other_creds={}):
sess = os_utils.get_session(other_creds)
return tackerclient.Client(session=sess)
# *********************************************
# 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)
endpoint = endpoint.replace('-', '_')
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, timeout=5):
vnf_id = None
while vnf_id is None and timeout >= 0:
vnf_id = get_id_from_name(tacker_client, 'vnf', vnf_name)
if vnf_id is None:
logger.info("Could not retrieve ID for vnf with name [%s]."
" Retrying." % vnf_name)
time.sleep(1)
timeout -= 1
return vnf_id
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 = tosca_fd.read()
logger.info('VNFD template:\n{0}'.format(vnfd_body))
return tacker_client.create_vnfd(
body={"vnfd": {"attributes": {"vnfd": 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, param_file=None):
try:
vnf_body = {
'vnf': {
'attributes': {},
'name': vnf_name
}
}
if param_file is not None:
params = None
with open(param_file) as f:
params = f.read()
vnf_body['vnf']['attributes']['param_values'] = params
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 get_vnf(tacker_client, vnf_id=None, vnf_name=None):
try:
if vnf_id is None and vnf_name is None:
raise Exception('You must specify vnf_id or vnf_name')
_id = get_vnf_id(tacker_client, vnf_name) if vnf_id is None else vnf_id
if _id is not None:
all_vnfs = list_vnfs(tacker_client, verbose=True)['vnfs']
return next((vnf for vnf in all_vnfs if vnf['id'] == _id), None)
else:
raise Exception('Could not retrieve ID from name [%s]' % vnf_name)
except Exception, e:
logger.error("Could not retrieve VNF [vnf_id=%s, vnf_name=%s] - %s"
% (vnf_id, vnf_name, e))
return None
def wait_for_vnf(tacker_client, vnf_id=None, vnf_name=None, timeout=60):
try:
vnf = get_vnf(tacker_client, vnf_id, vnf_name)
if vnf is None:
raise Exception("Could not retrieve VNF - id='%s', name='%s'"
% vnf_id, vnf_name)
logger.info('Waiting for vnf {0}'.format(str(vnf)))
while vnf['status'] != 'ACTIVE' and timeout >= 0:
if vnf['status'] == 'ERROR':
raise Exception('Error when booting vnf %s' % vnf['id'])
elif vnf['status'] == 'PENDING_CREATE':
time.sleep(3)
timeout -= 3
vnf = get_vnf(tacker_client, vnf_id, vnf_name)
if (timeout < 0):
raise Exception('Timeout when booting vnf %s' % vnf['id'])
return vnf['id']
except Exception, e:
logger.error("error [wait_for_vnf(tacker_client, '%s', '%s')]: %s"
% (vnf_id, vnf_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,
symmetrical=False):
try:
sfc_body = {
'sfc': {
'attributes': {},
'name': sfc_name,
'chain': []
}
}
if symmetrical:
sfc_body['sfc']['symmetrical'] = True
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_classifiers(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_classifier']['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')]: '%s'"
% (sfc_clf_name, sfc_id, sfc_name, str(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