Obsolete Legacy APIs excluding VIM feature
This patch obsoletes CLI for Legacy APIs excluding VIM feature. Implements: blueprint deprecate-legacy-apis Change-Id: I9be376a660c6f7c34c0abe7e327dec7a91d49ee2
This commit is contained in:
@@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
upgrade:
|
||||||
|
- |
|
||||||
|
Legacy APIs excluding VIM feature are obsoleted.
|
39
setup.cfg
39
setup.cfg
@@ -40,45 +40,6 @@ openstack.tackerclient.v1 =
|
|||||||
vim_set = tackerclient.osc.v1.nfvo.vim:UpdateVIM
|
vim_set = tackerclient.osc.v1.nfvo.vim:UpdateVIM
|
||||||
vim_delete = tackerclient.osc.v1.nfvo.vim:DeleteVIM
|
vim_delete = tackerclient.osc.v1.nfvo.vim:DeleteVIM
|
||||||
vim_show = tackerclient.osc.v1.nfvo.vim:ShowVIM
|
vim_show = tackerclient.osc.v1.nfvo.vim:ShowVIM
|
||||||
vnf_descriptor_create = tackerclient.osc.v1.vnfm.vnfd:CreateVNFD
|
|
||||||
vnf_descriptor_delete = tackerclient.osc.v1.vnfm.vnfd:DeleteVNFD
|
|
||||||
vnf_descriptor_list = tackerclient.osc.v1.vnfm.vnfd:ListVNFD
|
|
||||||
vnf_descriptor_show = tackerclient.osc.v1.vnfm.vnfd:ShowVNFD
|
|
||||||
vnf_descriptor_template_show = tackerclient.osc.v1.vnfm.vnfd:ShowTemplateVNFD
|
|
||||||
vnf_create = tackerclient.osc.v1.vnfm.vnf:CreateVNF
|
|
||||||
vnf_delete = tackerclient.osc.v1.vnfm.vnf:DeleteVNF
|
|
||||||
vnf_list = tackerclient.osc.v1.vnfm.vnf:ListVNF
|
|
||||||
vnf_show = tackerclient.osc.v1.vnfm.vnf:ShowVNF
|
|
||||||
vnf_resource_list = tackerclient.osc.v1.vnfm.vnf:ListVNFResources
|
|
||||||
vnf_set = tackerclient.osc.v1.vnfm.vnf:UpdateVNF
|
|
||||||
vnf_scale = tackerclient.osc.v1.vnfm.vnf:ScaleVNF
|
|
||||||
vnf_graph_descriptor_create = tackerclient.osc.v1.nfvo.vnffgd:CreateVNFFGD
|
|
||||||
vnf_graph_descriptor_delete = tackerclient.osc.v1.nfvo.vnffgd:DeleteVNFFGD
|
|
||||||
vnf_graph_descriptor_list = tackerclient.osc.v1.nfvo.vnffgd:ListVNFFGD
|
|
||||||
vnf_graph_descriptor_show = tackerclient.osc.v1.nfvo.vnffgd:ShowVNFFGD
|
|
||||||
vnf_graph_descriptor_template_show = tackerclient.osc.v1.nfvo.vnffgd:ShowTemplateVNFFGD
|
|
||||||
ns_descriptor_create = tackerclient.osc.v1.nfvo.nsd:CreateNSD
|
|
||||||
ns_descriptor_delete = tackerclient.osc.v1.nfvo.nsd:DeleteNSD
|
|
||||||
ns_descriptor_list = tackerclient.osc.v1.nfvo.nsd:ListNSD
|
|
||||||
ns_descriptor_show = tackerclient.osc.v1.nfvo.nsd:ShowNSD
|
|
||||||
ns_descriptor_template_show = tackerclient.osc.v1.nfvo.nsd:ShowTemplateNSD
|
|
||||||
nfv_event_show = tackerclient.osc.v1.events.events:ShowEvent
|
|
||||||
nfv_event_list = tackerclient.osc.v1.events.events:ListEvent
|
|
||||||
ns_create = tackerclient.osc.v1.nfvo.ns:CreateNS
|
|
||||||
ns_delete = tackerclient.osc.v1.nfvo.ns:DeleteNS
|
|
||||||
ns_list = tackerclient.osc.v1.nfvo.ns:ListNS
|
|
||||||
ns_show = tackerclient.osc.v1.nfvo.ns:ShowNS
|
|
||||||
vnf_graph_create = tackerclient.osc.v1.nfvo.vnffg:CreateVNFFG
|
|
||||||
vnf_graph_delete = tackerclient.osc.v1.nfvo.vnffg:DeleteVNFFG
|
|
||||||
vnf_graph_set = tackerclient.osc.v1.nfvo.vnffg:UpdateVNFFG
|
|
||||||
vnf_graph_list = tackerclient.osc.v1.nfvo.vnffg:ListVNFFG
|
|
||||||
vnf_graph_show = tackerclient.osc.v1.nfvo.vnffg:ShowVNFFG
|
|
||||||
vnf_network_forwarding_path_list = tackerclient.osc.v1.nfvo.vnffg:ListNFP
|
|
||||||
vnf_network_forwarding_path_show = tackerclient.osc.v1.nfvo.vnffg:ShowNFP
|
|
||||||
vnf_classifier_list = tackerclient.osc.v1.nfvo.vnffg:ListFC
|
|
||||||
vnf_classifier_show = tackerclient.osc.v1.nfvo.vnffg:ShowFC
|
|
||||||
vnf_chain_list = tackerclient.osc.v1.nfvo.vnffg:ListSFC
|
|
||||||
vnf_chain_show = tackerclient.osc.v1.nfvo.vnffg:ShowSFC
|
|
||||||
vnf_package_create = tackerclient.osc.v1.vnfpkgm.vnf_package:CreateVnfPackage
|
vnf_package_create = tackerclient.osc.v1.vnfpkgm.vnf_package:CreateVnfPackage
|
||||||
vnf_package_list = tackerclient.osc.v1.vnfpkgm.vnf_package:ListVnfPackage
|
vnf_package_list = tackerclient.osc.v1.vnfpkgm.vnf_package:ListVnfPackage
|
||||||
vnf_package_show = tackerclient.osc.v1.vnfpkgm.vnf_package:ShowVnfPackage
|
vnf_package_show = tackerclient.osc.v1.vnfpkgm.vnf_package:ShowVnfPackage
|
||||||
|
@@ -1,20 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -x
|
|
||||||
function die() {
|
|
||||||
local exitcode=$?
|
|
||||||
set +o xtrace
|
|
||||||
echo $@
|
|
||||||
exit $exitcode
|
|
||||||
}
|
|
||||||
|
|
||||||
noauth_tenant_id=me
|
|
||||||
if [ $1 == 'noauth' ]; then
|
|
||||||
NOAUTH="--tenant_id $noauth_tenant_id"
|
|
||||||
else
|
|
||||||
NOAUTH=
|
|
||||||
fi
|
|
||||||
|
|
||||||
FORMAT=" --request-format xml"
|
|
||||||
|
|
||||||
# test the CRUD of xxx
|
|
||||||
# TODO(yamahata)
|
|
@@ -14,24 +14,8 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
|
||||||
EXT_NS = '_extension_ns'
|
|
||||||
XML_NS_V10 = 'http://openstack.org/tacker/api/v1.0'
|
|
||||||
XSI_NAMESPACE = "http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
XSI_ATTR = "xsi:nil"
|
|
||||||
XSI_NIL_ATTR = "xmlns:xsi"
|
|
||||||
TYPE_XMLNS = "xmlns:tacker"
|
|
||||||
TYPE_ATTR = "tacker:type"
|
|
||||||
VIRTUAL_ROOT_KEY = "_v_root"
|
|
||||||
ATOM_NAMESPACE = "http://www.w3.org/2005/Atom"
|
|
||||||
ATOM_XMLNS = "xmlns:atom"
|
|
||||||
ATOM_LINK_NOTATION = "{%s}link" % ATOM_NAMESPACE
|
|
||||||
|
|
||||||
TYPE_BOOL = "bool"
|
TYPE_BOOL = "bool"
|
||||||
TYPE_INT = "int"
|
TYPE_INT = "int"
|
||||||
TYPE_FLOAT = "float"
|
TYPE_FLOAT = "float"
|
||||||
TYPE_LIST = "list"
|
TYPE_LIST = "list"
|
||||||
TYPE_DICT = "dict"
|
TYPE_DICT = "dict"
|
||||||
|
|
||||||
|
|
||||||
PLURALS = {'templates': 'template',
|
|
||||||
'devices': 'device'}
|
|
||||||
|
@@ -111,55 +111,6 @@ HTTP_EXCEPTION_MAP = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# Exceptions mapped to Tacker server exceptions
|
|
||||||
# These are defined if a user of client library needs specific exception.
|
|
||||||
# Exception name should be <Tacker Exception Name> + 'Client'
|
|
||||||
# e.g., NetworkNotFound -> NetworkNotFoundClient
|
|
||||||
|
|
||||||
class NetworkNotFoundClient(NotFound):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class PortNotFoundClient(NotFound):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class StateInvalidClient(BadRequest):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class NetworkInUseClient(Conflict):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class PortInUseClient(Conflict):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class IpAddressInUseClient(Conflict):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class InvalidIpForNetworkClient(BadRequest):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class OverQuotaClient(Conflict):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class IpAddressGenerationFailureClient(Conflict):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class MacAddressInUseClient(Conflict):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class ExternalIpAddressExhaustedClient(BadRequest):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
# Exceptions from client library
|
# Exceptions from client library
|
||||||
|
|
||||||
class NoAuthURLProvided(Unauthorized):
|
class NoAuthURLProvided(Unauthorized):
|
||||||
@@ -174,11 +125,6 @@ class EndpointTypeNotFound(TackerClientException):
|
|||||||
message = _("Could not find endpoint type %(type_)s in Service Catalog.")
|
message = _("Could not find endpoint type %(type_)s in Service Catalog.")
|
||||||
|
|
||||||
|
|
||||||
class AmbiguousEndpoints(TackerClientException):
|
|
||||||
message = _("Found more than one matching endpoint in Service Catalog: "
|
|
||||||
"%(matching_endpoints)")
|
|
||||||
|
|
||||||
|
|
||||||
class RequestURITooLong(TackerClientException):
|
class RequestURITooLong(TackerClientException):
|
||||||
"""Raised when a request fails with HTTP error 414."""
|
"""Raised when a request fails with HTTP error 414."""
|
||||||
|
|
||||||
|
@@ -14,12 +14,9 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
from xml.etree import ElementTree as etree
|
|
||||||
from xml.parsers import expat
|
|
||||||
|
|
||||||
from oslo_serialization import jsonutils
|
from oslo_serialization import jsonutils
|
||||||
|
|
||||||
from tackerclient.common import constants
|
|
||||||
from tackerclient.common import exceptions as exception
|
from tackerclient.common import exceptions as exception
|
||||||
from tackerclient.i18n import _
|
from tackerclient.i18n import _
|
||||||
|
|
||||||
@@ -58,144 +55,6 @@ class JSONDictSerializer(DictSerializer):
|
|||||||
return jsonutils.dumps(data, default=sanitizer)
|
return jsonutils.dumps(data, default=sanitizer)
|
||||||
|
|
||||||
|
|
||||||
class XMLDictSerializer(DictSerializer):
|
|
||||||
|
|
||||||
def __init__(self, metadata=None, xmlns=None):
|
|
||||||
"""XMLDictSerializer constructor.
|
|
||||||
|
|
||||||
:param metadata: information needed to deserialize XML into
|
|
||||||
a dictionary.
|
|
||||||
:param xmlns: XML namespace to include with serialized XML
|
|
||||||
"""
|
|
||||||
super(XMLDictSerializer, self).__init__()
|
|
||||||
self.metadata = metadata or {}
|
|
||||||
if not xmlns:
|
|
||||||
xmlns = self.metadata.get('xmlns')
|
|
||||||
if not xmlns:
|
|
||||||
xmlns = constants.XML_NS_V10
|
|
||||||
self.xmlns = xmlns
|
|
||||||
|
|
||||||
def default(self, data):
|
|
||||||
"""Default serializer of XMLDictSerializer.
|
|
||||||
|
|
||||||
:param data: expect data to contain a single key as XML root, or
|
|
||||||
contain another '*_links' key as atom links. Other
|
|
||||||
case will use 'VIRTUAL_ROOT_KEY' as XML root.
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
links = None
|
|
||||||
has_atom = False
|
|
||||||
if data is None:
|
|
||||||
root_key = constants.VIRTUAL_ROOT_KEY
|
|
||||||
root_value = None
|
|
||||||
else:
|
|
||||||
link_keys = [k for k in data.keys() or []
|
|
||||||
if k.endswith('_links')]
|
|
||||||
if link_keys:
|
|
||||||
links = data.pop(link_keys[0], None)
|
|
||||||
has_atom = True
|
|
||||||
root_key = (len(data) == 1 and
|
|
||||||
list(data.keys())[0] or constants.VIRTUAL_ROOT_KEY)
|
|
||||||
root_value = data.get(root_key, data)
|
|
||||||
doc = etree.Element("_temp_root")
|
|
||||||
used_prefixes = []
|
|
||||||
self._to_xml_node(doc, self.metadata, root_key,
|
|
||||||
root_value, used_prefixes)
|
|
||||||
if links:
|
|
||||||
self._create_link_nodes(list(doc)[0], links)
|
|
||||||
return self.to_xml_string(list(doc)[0], used_prefixes, has_atom)
|
|
||||||
except AttributeError as e:
|
|
||||||
LOG.exception(str(e))
|
|
||||||
return ''
|
|
||||||
|
|
||||||
def __call__(self, data):
|
|
||||||
# Provides a migration path to a cleaner WSGI layer, this
|
|
||||||
# "default" stuff and extreme extensibility isn't being used
|
|
||||||
# like originally intended
|
|
||||||
return self.default(data)
|
|
||||||
|
|
||||||
def to_xml_string(self, node, used_prefixes, has_atom=False):
|
|
||||||
self._add_xmlns(node, used_prefixes, has_atom)
|
|
||||||
return etree.tostring(node, encoding='UTF-8')
|
|
||||||
|
|
||||||
# NOTE(ameade): the has_atom should be removed after all of the
|
|
||||||
# XML serializers and view builders have been updated to the current
|
|
||||||
# spec that required all responses include the xmlns:atom, the has_atom
|
|
||||||
# flag is to prevent current tests from breaking
|
|
||||||
def _add_xmlns(self, node, used_prefixes, has_atom=False):
|
|
||||||
node.set('xmlns', self.xmlns)
|
|
||||||
node.set(constants.TYPE_XMLNS, self.xmlns)
|
|
||||||
if has_atom:
|
|
||||||
node.set(constants.ATOM_XMLNS, constants.ATOM_NAMESPACE)
|
|
||||||
node.set(constants.XSI_NIL_ATTR, constants.XSI_NAMESPACE)
|
|
||||||
ext_ns = self.metadata.get(constants.EXT_NS, {})
|
|
||||||
for prefix in used_prefixes:
|
|
||||||
if prefix in ext_ns:
|
|
||||||
node.set('xmlns:' + prefix, ext_ns[prefix])
|
|
||||||
|
|
||||||
def _to_xml_node(self, parent, metadata, nodename, data, used_prefixes):
|
|
||||||
"""Recursive method to convert data members to XML nodes."""
|
|
||||||
result = etree.SubElement(parent, nodename)
|
|
||||||
if ":" in nodename:
|
|
||||||
used_prefixes.append(nodename.split(":", 1)[0])
|
|
||||||
# TODO(bcwaldon): accomplish this without a type-check
|
|
||||||
if isinstance(data, list):
|
|
||||||
if not data:
|
|
||||||
result.set(
|
|
||||||
constants.TYPE_ATTR,
|
|
||||||
constants.TYPE_LIST)
|
|
||||||
return result
|
|
||||||
singular = metadata.get('plurals', {}).get(nodename, None)
|
|
||||||
if singular is None:
|
|
||||||
if nodename.endswith('s'):
|
|
||||||
singular = nodename[:-1]
|
|
||||||
else:
|
|
||||||
singular = 'item'
|
|
||||||
for item in data:
|
|
||||||
self._to_xml_node(result, metadata, singular, item,
|
|
||||||
used_prefixes)
|
|
||||||
# TODO(bcwaldon): accomplish this without a type-check
|
|
||||||
elif isinstance(data, dict):
|
|
||||||
if not data:
|
|
||||||
result.set(
|
|
||||||
constants.TYPE_ATTR,
|
|
||||||
constants.TYPE_DICT)
|
|
||||||
return result
|
|
||||||
attrs = metadata.get('attributes', {}).get(nodename, {})
|
|
||||||
for k, v in sorted(data.items()):
|
|
||||||
if k in attrs:
|
|
||||||
result.set(k, str(v))
|
|
||||||
else:
|
|
||||||
self._to_xml_node(result, metadata, k, v,
|
|
||||||
used_prefixes)
|
|
||||||
elif data is None:
|
|
||||||
result.set(constants.XSI_ATTR, 'true')
|
|
||||||
else:
|
|
||||||
if isinstance(data, bool):
|
|
||||||
result.set(
|
|
||||||
constants.TYPE_ATTR,
|
|
||||||
constants.TYPE_BOOL)
|
|
||||||
elif isinstance(data, int):
|
|
||||||
result.set(
|
|
||||||
constants.TYPE_ATTR,
|
|
||||||
constants.TYPE_INT)
|
|
||||||
elif isinstance(data, float):
|
|
||||||
result.set(
|
|
||||||
constants.TYPE_ATTR,
|
|
||||||
constants.TYPE_FLOAT)
|
|
||||||
LOG.debug("Data %(data)s type is %(type)s",
|
|
||||||
{'data': data,
|
|
||||||
'type': type(data)})
|
|
||||||
result.text = str(data)
|
|
||||||
return result
|
|
||||||
|
|
||||||
def _create_link_nodes(self, xml_doc, links):
|
|
||||||
for link in links:
|
|
||||||
link_node = etree.SubElement(xml_doc, 'atom:link')
|
|
||||||
link_node.set('rel', link['rel'])
|
|
||||||
link_node.set('href', link['href'])
|
|
||||||
|
|
||||||
|
|
||||||
class TextDeserializer(ActionDispatcher):
|
class TextDeserializer(ActionDispatcher):
|
||||||
"""Default request body deserialization."""
|
"""Default request body deserialization."""
|
||||||
|
|
||||||
@@ -219,138 +78,11 @@ class JSONDeserializer(TextDeserializer):
|
|||||||
return {'body': self._from_json(datastring)}
|
return {'body': self._from_json(datastring)}
|
||||||
|
|
||||||
|
|
||||||
class XMLDeserializer(TextDeserializer):
|
|
||||||
|
|
||||||
def __init__(self, metadata=None):
|
|
||||||
"""XMLDeserializer constructor.
|
|
||||||
|
|
||||||
:param metadata: information needed to deserialize XML into
|
|
||||||
a dictionary.
|
|
||||||
"""
|
|
||||||
super(XMLDeserializer, self).__init__()
|
|
||||||
self.metadata = metadata or {}
|
|
||||||
xmlns = self.metadata.get('xmlns')
|
|
||||||
if not xmlns:
|
|
||||||
xmlns = constants.XML_NS_V10
|
|
||||||
self.xmlns = xmlns
|
|
||||||
|
|
||||||
def _get_key(self, tag):
|
|
||||||
tags = tag.split("}", 1)
|
|
||||||
if len(tags) == 2:
|
|
||||||
ns = tags[0][1:]
|
|
||||||
bare_tag = tags[1]
|
|
||||||
ext_ns = self.metadata.get(constants.EXT_NS, {})
|
|
||||||
if ns == self.xmlns:
|
|
||||||
return bare_tag
|
|
||||||
for prefix, _ns in ext_ns.items():
|
|
||||||
if ns == _ns:
|
|
||||||
return prefix + ":" + bare_tag
|
|
||||||
else:
|
|
||||||
return tag
|
|
||||||
|
|
||||||
def _get_links(self, root_tag, node):
|
|
||||||
link_nodes = node.findall(constants.ATOM_LINK_NOTATION)
|
|
||||||
root_tag = self._get_key(node.tag)
|
|
||||||
link_key = "%s_links" % root_tag
|
|
||||||
link_list = []
|
|
||||||
for link in link_nodes:
|
|
||||||
link_list.append({'rel': link.get('rel'),
|
|
||||||
'href': link.get('href')})
|
|
||||||
# Remove link node in order to avoid link node being
|
|
||||||
# processed as an item in _from_xml_node
|
|
||||||
node.remove(link)
|
|
||||||
return link_list and {link_key: link_list} or {}
|
|
||||||
|
|
||||||
def _from_xml(self, datastring):
|
|
||||||
if datastring is None:
|
|
||||||
return None
|
|
||||||
plurals = set(self.metadata.get('plurals', {}))
|
|
||||||
try:
|
|
||||||
node = etree.fromstring(datastring)
|
|
||||||
root_tag = self._get_key(node.tag)
|
|
||||||
links = self._get_links(root_tag, node)
|
|
||||||
result = self._from_xml_node(node, plurals)
|
|
||||||
# There is no case where root_tag = constants.VIRTUAL_ROOT_KEY
|
|
||||||
# and links is not None because of the way data are serialized
|
|
||||||
if root_tag == constants.VIRTUAL_ROOT_KEY:
|
|
||||||
return result
|
|
||||||
return dict({root_tag: result}, **links)
|
|
||||||
except Exception as e:
|
|
||||||
parseError = False
|
|
||||||
# Python2.7
|
|
||||||
if (hasattr(etree, 'ParseError') and
|
|
||||||
isinstance(e, getattr(etree, 'ParseError'))):
|
|
||||||
parseError = True
|
|
||||||
# Python2.6
|
|
||||||
elif isinstance(e, expat.ExpatError):
|
|
||||||
parseError = True
|
|
||||||
if parseError:
|
|
||||||
msg = _("Cannot understand XML")
|
|
||||||
raise exception.MalformedResponseBody(reason=msg)
|
|
||||||
else:
|
|
||||||
raise
|
|
||||||
|
|
||||||
def _from_xml_node(self, node, listnames):
|
|
||||||
"""Convert a minidom node to a simple Python type.
|
|
||||||
|
|
||||||
:param node: minidom node name
|
|
||||||
:param listnames: list of XML node names whose subnodes should
|
|
||||||
be considered list items.
|
|
||||||
|
|
||||||
"""
|
|
||||||
attrNil = node.get(str(etree.QName(constants.XSI_NAMESPACE, "nil")))
|
|
||||||
attrType = node.get(str(etree.QName(
|
|
||||||
self.metadata.get('xmlns'), "type")))
|
|
||||||
if (attrNil and attrNil.lower() == 'true'):
|
|
||||||
return None
|
|
||||||
elif not len(node) and not node.text:
|
|
||||||
if (attrType and attrType == constants.TYPE_DICT):
|
|
||||||
return {}
|
|
||||||
elif (attrType and attrType == constants.TYPE_LIST):
|
|
||||||
return []
|
|
||||||
else:
|
|
||||||
return ''
|
|
||||||
elif (len(node) == 0 and node.text):
|
|
||||||
converters = {constants.TYPE_BOOL:
|
|
||||||
lambda x: x.lower() == 'true',
|
|
||||||
constants.TYPE_INT:
|
|
||||||
lambda x: int(x),
|
|
||||||
constants.TYPE_FLOAT:
|
|
||||||
lambda x: float(x)}
|
|
||||||
if attrType and attrType in converters:
|
|
||||||
return converters[attrType](node.text)
|
|
||||||
else:
|
|
||||||
return node.text
|
|
||||||
elif self._get_key(node.tag) in listnames:
|
|
||||||
return [self._from_xml_node(n, listnames) for n in node]
|
|
||||||
else:
|
|
||||||
result = dict()
|
|
||||||
for attr in node.keys():
|
|
||||||
if (attr == 'xmlns' or
|
|
||||||
attr.startswith('xmlns:') or
|
|
||||||
attr == constants.XSI_ATTR or
|
|
||||||
attr == constants.TYPE_ATTR):
|
|
||||||
continue
|
|
||||||
result[self._get_key(attr)] = node.get(attr)
|
|
||||||
children = list(node)
|
|
||||||
for child in children:
|
|
||||||
result[self._get_key(child.tag)] = self._from_xml_node(
|
|
||||||
child, listnames)
|
|
||||||
return result
|
|
||||||
|
|
||||||
def default(self, datastring):
|
|
||||||
return {'body': self._from_xml(datastring)}
|
|
||||||
|
|
||||||
def __call__(self, datastring):
|
|
||||||
# Adding a migration path to allow us to remove unncessary classes
|
|
||||||
return self.default(datastring)
|
|
||||||
|
|
||||||
|
|
||||||
# NOTE(maru): this class is duplicated from tacker.wsgi
|
# NOTE(maru): this class is duplicated from tacker.wsgi
|
||||||
class Serializer(object):
|
class Serializer(object):
|
||||||
"""Serializes and deserializes dictionaries to certain MIME types."""
|
"""Serializes and deserializes dictionaries to certain MIME types."""
|
||||||
|
|
||||||
def __init__(self, metadata=None, default_xmlns=None):
|
def __init__(self, metadata=None):
|
||||||
"""Create a serializer based on the given WSGI environment.
|
"""Create a serializer based on the given WSGI environment.
|
||||||
|
|
||||||
'metadata' is an optional dict mapping MIME types to information
|
'metadata' is an optional dict mapping MIME types to information
|
||||||
@@ -358,12 +90,10 @@ class Serializer(object):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
self.metadata = metadata or {}
|
self.metadata = metadata or {}
|
||||||
self.default_xmlns = default_xmlns
|
|
||||||
|
|
||||||
def _get_serialize_handler(self, content_type):
|
def _get_serialize_handler(self, content_type):
|
||||||
handlers = {
|
handlers = {
|
||||||
'application/json': JSONDictSerializer(),
|
'application/json': JSONDictSerializer()
|
||||||
'application/xml': XMLDictSerializer(self.metadata),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -385,8 +115,7 @@ class Serializer(object):
|
|||||||
|
|
||||||
def get_deserialize_handler(self, content_type):
|
def get_deserialize_handler(self, content_type):
|
||||||
handlers = {
|
handlers = {
|
||||||
'application/json': JSONDeserializer(),
|
'application/json': JSONDeserializer()
|
||||||
'application/xml': XMLDeserializer(self.metadata),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@@ -20,7 +20,6 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import sys
|
|
||||||
|
|
||||||
from oslo_log import versionutils
|
from oslo_log import versionutils
|
||||||
from oslo_utils import encodeutils
|
from oslo_utils import encodeutils
|
||||||
@@ -184,15 +183,3 @@ def deprecate_warning(what, as_of, in_favor_of=None, remove_in=1):
|
|||||||
versionutils.deprecation_warning(as_of=as_of, what=what,
|
versionutils.deprecation_warning(as_of=as_of, what=what,
|
||||||
in_favor_of=in_favor_of,
|
in_favor_of=in_favor_of,
|
||||||
remove_in=remove_in)
|
remove_in=remove_in)
|
||||||
|
|
||||||
|
|
||||||
# TODO(ueha): Remove this along with the deprecated commands in the first major
|
|
||||||
# python-tackerclient release after the Tacker server version 9.0.0 (2023.1
|
|
||||||
# Antelope release).
|
|
||||||
def deprecate_legacy_warning():
|
|
||||||
# NOTE(ueha): versionutils has not support Antelope version yet.
|
|
||||||
msg = _(
|
|
||||||
'The Legacy API interface has been deprecated. This command will be '
|
|
||||||
'removed in the first major release after the Tacker server version '
|
|
||||||
'9.0.0 (2023.1 Antelope release).')
|
|
||||||
print(msg, file=sys.stderr)
|
|
||||||
|
@@ -1,119 +0,0 @@
|
|||||||
# Copyright 2018 OpenStack Foundation
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
from osc_lib.command import command
|
|
||||||
from osc_lib import utils
|
|
||||||
|
|
||||||
from tackerclient.common import utils as tacker_common_utils
|
|
||||||
from tackerclient.i18n import _
|
|
||||||
from tackerclient.osc import sdk_utils
|
|
||||||
from tackerclient.osc import utils as tacker_osc_utils
|
|
||||||
from tackerclient.tacker import v1_0 as tackerV10
|
|
||||||
|
|
||||||
_attr_map = (
|
|
||||||
('id', 'ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('resource_type', 'Resource Type', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('resource_id', 'Resource ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('resource_state', 'Resource State', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('event_type', 'Event Type', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('timestamp', 'Timestamp', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('event_details', 'Event Details', tacker_osc_utils.LIST_LONG_ONLY),
|
|
||||||
)
|
|
||||||
|
|
||||||
_EVENT = "event"
|
|
||||||
|
|
||||||
events_path = '/events'
|
|
||||||
|
|
||||||
|
|
||||||
def _get_columns(item):
|
|
||||||
column_map = {}
|
|
||||||
return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map)
|
|
||||||
|
|
||||||
|
|
||||||
class ShowEvent(command.ShowOne):
|
|
||||||
_description = _("Show event given the event id.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ShowEvent, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_EVENT,
|
|
||||||
metavar="ID",
|
|
||||||
help=_("ID of event to display")
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _EVENT, parsed_args.event)
|
|
||||||
obj = client.show_event(obj_id)
|
|
||||||
display_columns, columns = _get_columns(obj[_EVENT])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(obj[_EVENT]),
|
|
||||||
columns,)
|
|
||||||
return (display_columns, data)
|
|
||||||
|
|
||||||
|
|
||||||
class ListEvent(command.Lister):
|
|
||||||
_description = _("List events of resources.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListEvent, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'--id',
|
|
||||||
help=_("id of the event to look up."))
|
|
||||||
parser.add_argument(
|
|
||||||
'--resource-type',
|
|
||||||
help=_("resource type of the events to look up."))
|
|
||||||
parser.add_argument(
|
|
||||||
'--resource-id',
|
|
||||||
help=_("resource id of the events to look up."))
|
|
||||||
parser.add_argument(
|
|
||||||
'--resource-state',
|
|
||||||
help=_("resource state of the events to look up."))
|
|
||||||
parser.add_argument(
|
|
||||||
'--event-type',
|
|
||||||
help=_("event type of the events to look up."))
|
|
||||||
parser.add_argument(
|
|
||||||
'--long',
|
|
||||||
action='store_true',
|
|
||||||
help=_("List additional fields in output"))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
_params = {}
|
|
||||||
if parsed_args.id:
|
|
||||||
_params['id'] = parsed_args.id
|
|
||||||
if parsed_args.resource_id:
|
|
||||||
_params['resource_id'] = parsed_args.resource_id
|
|
||||||
if parsed_args.resource_state:
|
|
||||||
_params['resource_state'] = parsed_args.resource_id
|
|
||||||
if parsed_args.event_type:
|
|
||||||
_params['event_type'] = parsed_args.event_type
|
|
||||||
if parsed_args.resource_type:
|
|
||||||
_params['resource_type'] = parsed_args.resource_type
|
|
||||||
events = client.list('events', events_path, True, **_params)
|
|
||||||
data = {}
|
|
||||||
data['events'] = events['events']
|
|
||||||
headers, columns = tacker_osc_utils.get_column_definitions(
|
|
||||||
_attr_map, long_listing=parsed_args.long)
|
|
||||||
return (headers,
|
|
||||||
(utils.get_dict_properties(
|
|
||||||
s, columns,
|
|
||||||
) for s in data[_EVENT + 's']))
|
|
@@ -1,261 +0,0 @@
|
|||||||
# Copyright 2018 OpenStack Foundation.
|
|
||||||
# All Rights Reserved
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from osc_lib.command import command
|
|
||||||
from osc_lib import utils
|
|
||||||
|
|
||||||
from tackerclient.common import exceptions
|
|
||||||
from tackerclient.common import utils as tacker_common_utils
|
|
||||||
from tackerclient.i18n import _
|
|
||||||
from tackerclient.osc import sdk_utils
|
|
||||||
from tackerclient.osc import utils as tacker_osc_utils
|
|
||||||
from tackerclient.tacker import v1_0 as tackerV10
|
|
||||||
|
|
||||||
_attr_map = (
|
|
||||||
('id', 'ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('name', 'Name', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('nsd_id', 'NSD ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('vnf_ids', 'VNF IDs', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('vnffg_ids', 'VNFFG IDs', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('mgmt_ip_addresses', 'Mgmt Ip Addresses', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('status', 'Status', tacker_osc_utils.LIST_BOTH),
|
|
||||||
)
|
|
||||||
|
|
||||||
_NS = 'ns'
|
|
||||||
_RESOURCE = 'resource'
|
|
||||||
|
|
||||||
|
|
||||||
def _get_columns(item):
|
|
||||||
column_map = {
|
|
||||||
'tenant_id': 'project_id',
|
|
||||||
}
|
|
||||||
return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map)
|
|
||||||
|
|
||||||
|
|
||||||
class CreateNS(command.ShowOne):
|
|
||||||
_description = _("Create a new NS")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(CreateNS, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'name', metavar='NAME',
|
|
||||||
help=_('Name for NS'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--tenant-id', metavar='TENANT_ID',
|
|
||||||
help=_('The owner tenant ID'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--description',
|
|
||||||
help=_('Set description for the NS'))
|
|
||||||
nsd_group = parser.add_mutually_exclusive_group(required=True)
|
|
||||||
nsd_group.add_argument(
|
|
||||||
'--nsd-id',
|
|
||||||
help=_('NSD ID to use as template to create NS'))
|
|
||||||
nsd_group.add_argument(
|
|
||||||
'--nsd-template',
|
|
||||||
help=_('NSD file to create NS'))
|
|
||||||
nsd_group.add_argument(
|
|
||||||
'--nsd-name',
|
|
||||||
help=_('NSD name to use as template to create NS'))
|
|
||||||
vim_group = parser.add_mutually_exclusive_group()
|
|
||||||
vim_group.add_argument(
|
|
||||||
'--vim-id',
|
|
||||||
help=_('VIM ID to use to create NS on the specified VIM'))
|
|
||||||
vim_group.add_argument(
|
|
||||||
'--vim-name',
|
|
||||||
help=_('VIM name to use to create NS on the specified VIM'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--vim-region-name',
|
|
||||||
help=_('VIM Region to use to create NS on the specified VIM'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--param-file',
|
|
||||||
help=_('Specify parameter YAML file'))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = {_NS: {}}
|
|
||||||
body[_NS]['attributes'] = {}
|
|
||||||
|
|
||||||
if parsed_args.vim_region_name:
|
|
||||||
body[_NS].setdefault('placement_attr', {})['region_name'] = \
|
|
||||||
parsed_args.vim_region_name
|
|
||||||
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
if parsed_args.vim_name:
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(client, 'vim',
|
|
||||||
parsed_args.vim_name)
|
|
||||||
parsed_args.vim_id = _id
|
|
||||||
if parsed_args.nsd_name:
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(client, 'nsd',
|
|
||||||
parsed_args.nsd_name)
|
|
||||||
parsed_args.nsd_id = _id
|
|
||||||
elif parsed_args.nsd_template:
|
|
||||||
with open(parsed_args.nsd_template) as f:
|
|
||||||
template = f.read()
|
|
||||||
try:
|
|
||||||
template = yaml.load(
|
|
||||||
template, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not template:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason='The nsd file is empty')
|
|
||||||
body[_NS]['nsd_template'] = template
|
|
||||||
|
|
||||||
if parsed_args.param_file:
|
|
||||||
with open(parsed_args.param_file) as f:
|
|
||||||
param_yaml = f.read()
|
|
||||||
try:
|
|
||||||
param_yaml = yaml.load(
|
|
||||||
param_yaml, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not param_yaml:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason='The parameter file is empty')
|
|
||||||
body[_NS]['attributes'] = {'param_values': param_yaml}
|
|
||||||
tackerV10.update_dict(parsed_args, body[_NS],
|
|
||||||
['tenant_id', 'name', 'description',
|
|
||||||
'nsd_id', 'vim_id'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
ns = client.create_ns(self.args2body(parsed_args))
|
|
||||||
display_columns, columns = _get_columns(ns[_NS])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(ns[_NS]),
|
|
||||||
columns)
|
|
||||||
lstdata = list(data)
|
|
||||||
for index, value in enumerate(lstdata):
|
|
||||||
if value is None:
|
|
||||||
lstdata[index] = ''
|
|
||||||
data = tuple(lstdata)
|
|
||||||
return (display_columns, data)
|
|
||||||
|
|
||||||
|
|
||||||
class DeleteNS(command.Command):
|
|
||||||
_description = _("Delete NS(s).")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(DeleteNS, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_NS,
|
|
||||||
metavar="<NS>",
|
|
||||||
nargs="+",
|
|
||||||
help=_("NS(s) to delete (name or ID)")
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
'--force',
|
|
||||||
default=False,
|
|
||||||
action='store_true',
|
|
||||||
help=_('Force delete Network Service')
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
if parsed_args.force:
|
|
||||||
body = {_NS: {'attributes': {'force': True}}}
|
|
||||||
else:
|
|
||||||
body = dict()
|
|
||||||
return body
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
failure = False
|
|
||||||
deleted_ids = []
|
|
||||||
failed_items = {}
|
|
||||||
body = self.args2body(parsed_args)
|
|
||||||
for resource_id in parsed_args.ns:
|
|
||||||
try:
|
|
||||||
obj = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _NS, resource_id)
|
|
||||||
client.delete_ns(obj, body)
|
|
||||||
deleted_ids.append(resource_id)
|
|
||||||
except Exception as e:
|
|
||||||
failure = True
|
|
||||||
failed_items[resource_id] = e
|
|
||||||
if failure:
|
|
||||||
msg = ''
|
|
||||||
if deleted_ids:
|
|
||||||
msg = (_('Successfully deleted %(resource)s(s):'
|
|
||||||
' %(deleted_list)s') % {'deleted_list':
|
|
||||||
', '.join(deleted_ids),
|
|
||||||
'resource': _NS})
|
|
||||||
err_msg = _("\n\nUnable to delete the below"
|
|
||||||
" %s(s):") % _NS
|
|
||||||
for failed_id, error in failed_items.items():
|
|
||||||
err_msg += (_('\n Cannot delete %(failed_id)s: %(error)s')
|
|
||||||
% {'failed_id': failed_id,
|
|
||||||
'error': error})
|
|
||||||
msg += err_msg
|
|
||||||
raise exceptions.CommandError(message=msg)
|
|
||||||
else:
|
|
||||||
print((_('All specified %(resource)s(s) deleted successfully')
|
|
||||||
% {'resource': _NS}))
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
class ListNS(command.Lister):
|
|
||||||
_description = ("List (NS)s that belong to a given tenant.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListNS, self).get_parser(prog_name)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
data = client.list_nss()
|
|
||||||
headers, columns = tacker_osc_utils.get_column_definitions(
|
|
||||||
_attr_map, long_listing=None)
|
|
||||||
return (headers,
|
|
||||||
(utils.get_dict_properties(
|
|
||||||
s, columns,
|
|
||||||
) for s in data[_NS + 's']))
|
|
||||||
|
|
||||||
|
|
||||||
class ShowNS(command.ShowOne):
|
|
||||||
_description = _("Display NS details")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ShowNS, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_NS,
|
|
||||||
metavar="<NS>",
|
|
||||||
help=_("NS to display (name or ID)")
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _NS, parsed_args.ns)
|
|
||||||
obj = client.show_ns(obj_id)
|
|
||||||
display_columns, columns = _get_columns(obj[_NS])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(obj[_NS]),
|
|
||||||
columns)
|
|
||||||
lstdata = list(data)
|
|
||||||
for index, value in enumerate(lstdata):
|
|
||||||
if value is None:
|
|
||||||
lstdata[index] = ''
|
|
||||||
data = tuple(lstdata)
|
|
||||||
return (display_columns, data)
|
|
@@ -1,229 +0,0 @@
|
|||||||
# Copyright 2018 OpenStack Foundation
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from osc_lib.command import command
|
|
||||||
from osc_lib import utils
|
|
||||||
|
|
||||||
from tackerclient.common import exceptions
|
|
||||||
from tackerclient.common import utils as tacker_common_utils
|
|
||||||
from tackerclient.i18n import _
|
|
||||||
from tackerclient.osc import sdk_utils
|
|
||||||
from tackerclient.osc import utils as tacker_osc_utils
|
|
||||||
from tackerclient.tacker import v1_0 as tackerV10
|
|
||||||
|
|
||||||
_attr_map = (
|
|
||||||
('id', 'ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('name', 'Name', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('template_source', 'Template_Source',
|
|
||||||
tacker_osc_utils.LIST_BOTH),
|
|
||||||
('description', 'Description', tacker_osc_utils.LIST_BOTH),
|
|
||||||
)
|
|
||||||
|
|
||||||
_NSD = 'nsd'
|
|
||||||
|
|
||||||
_formatters = {
|
|
||||||
'attributes': tacker_osc_utils.format_dict_with_indention,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def _get_columns(item):
|
|
||||||
column_map = {
|
|
||||||
'tenant_id': 'project_id',
|
|
||||||
}
|
|
||||||
return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map)
|
|
||||||
|
|
||||||
|
|
||||||
class CreateNSD(command.ShowOne):
|
|
||||||
_description = _("Create a new NSD.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(CreateNSD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'name', metavar='NAME',
|
|
||||||
help=_('Name for NSD'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--tenant-id', metavar='TENANT_ID',
|
|
||||||
help=_('The owner tenant ID or project ID'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--nsd-file',
|
|
||||||
required=True,
|
|
||||||
help=_('YAML file with NSD parameters'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--description',
|
|
||||||
help=_('Set a description for the NSD'))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = {_NSD: {}}
|
|
||||||
nsd = None
|
|
||||||
if not parsed_args.nsd_file:
|
|
||||||
raise exceptions.InvalidInput(reason="Invalid input for nsd file")
|
|
||||||
with open(parsed_args.nsd_file) as f:
|
|
||||||
nsd = f.read()
|
|
||||||
try:
|
|
||||||
nsd = yaml.load(nsd, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not nsd:
|
|
||||||
raise exceptions.InvalidInput(reason="nsd file is empty")
|
|
||||||
body[_NSD]['attributes'] = {'nsd': nsd}
|
|
||||||
tackerV10.update_dict(parsed_args, body[_NSD],
|
|
||||||
['tenant_id', 'name', 'description'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
nsd = client.create_nsd(self.args2body(parsed_args))
|
|
||||||
display_columns, columns = _get_columns(nsd[_NSD])
|
|
||||||
nsd[_NSD]['attributes']['nsd'] = yaml.load(
|
|
||||||
nsd[_NSD]['attributes']['nsd'])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(nsd[_NSD]),
|
|
||||||
columns, formatters=_formatters)
|
|
||||||
return (display_columns, data)
|
|
||||||
|
|
||||||
|
|
||||||
class DeleteNSD(command.Command):
|
|
||||||
_description = _("Delete NSD(s).")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(DeleteNSD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_NSD,
|
|
||||||
metavar="<NSD>",
|
|
||||||
nargs="+",
|
|
||||||
help=_("NSD(s) to delete (name or ID)")
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
failure = False
|
|
||||||
deleted_ids = []
|
|
||||||
failed_items = {}
|
|
||||||
for resource_id in parsed_args.nsd:
|
|
||||||
try:
|
|
||||||
obj = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _NSD, resource_id)
|
|
||||||
client.delete_nsd(obj)
|
|
||||||
deleted_ids.append(resource_id)
|
|
||||||
except Exception as e:
|
|
||||||
failure = True
|
|
||||||
failed_items[resource_id] = e
|
|
||||||
if failure:
|
|
||||||
msg = ''
|
|
||||||
if deleted_ids:
|
|
||||||
msg = (_('Successfully deleted %(resource)s(s):'
|
|
||||||
' %(deleted_list)s') % {'deleted_list':
|
|
||||||
', '.join(deleted_ids),
|
|
||||||
'resource': _NSD})
|
|
||||||
err_msg = _("\n\nUnable to delete the below"
|
|
||||||
" %s(s):") % _NSD
|
|
||||||
for failed_id, error in failed_items.items():
|
|
||||||
err_msg += (_('\n Cannot delete %(failed_id)s: %(error)s')
|
|
||||||
% {'failed_id': failed_id,
|
|
||||||
'error': error})
|
|
||||||
msg += err_msg
|
|
||||||
raise exceptions.CommandError(message=msg)
|
|
||||||
else:
|
|
||||||
print((_('All specified %(resource)s(s) deleted successfully')
|
|
||||||
% {'resource': _NSD}))
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
class ListNSD(command.Lister):
|
|
||||||
_description = ("List (NSD)s that belong to a given tenant.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListNSD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'--template-source',
|
|
||||||
help=_("List NSD with specified template source. Available \
|
|
||||||
options are 'onboared' (default), 'inline' or 'all'"),
|
|
||||||
action='store',
|
|
||||||
default='onboarded')
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
data = client.list_nsds()
|
|
||||||
headers, columns = tacker_osc_utils.get_column_definitions(
|
|
||||||
_attr_map, long_listing=None)
|
|
||||||
return (headers,
|
|
||||||
(utils.get_dict_properties(
|
|
||||||
s, columns,
|
|
||||||
) for s in data[_NSD + 's']))
|
|
||||||
|
|
||||||
|
|
||||||
class ShowNSD(command.ShowOne):
|
|
||||||
_description = _("Display NSD details")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ShowNSD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_NSD,
|
|
||||||
metavar="<NSD>",
|
|
||||||
help=_("NSD to display (name or ID)")
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _NSD, parsed_args.nsd)
|
|
||||||
obj = client.show_nsd(obj_id)
|
|
||||||
obj[_NSD]['attributes']['nsd'] = yaml.load(
|
|
||||||
obj[_NSD]['attributes']['nsd'])
|
|
||||||
display_columns, columns = _get_columns(obj[_NSD])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(obj[_NSD]),
|
|
||||||
columns,
|
|
||||||
formatters=_formatters)
|
|
||||||
return (display_columns, data)
|
|
||||||
|
|
||||||
|
|
||||||
class ShowTemplateNSD(command.ShowOne):
|
|
||||||
_description = _("Display NSD Template details")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ShowTemplateNSD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_NSD,
|
|
||||||
metavar="<NSD>",
|
|
||||||
help=_("NSD to display (name or ID)")
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _NSD, parsed_args.nsd)
|
|
||||||
obj = client.show_nsd(obj_id)
|
|
||||||
obj[_NSD]['attributes']['nsd'] = yaml.load(
|
|
||||||
obj[_NSD]['attributes']['nsd'])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(obj[_NSD]),
|
|
||||||
('attributes',),
|
|
||||||
formatters=_formatters)
|
|
||||||
data = (data or _('Unable to display NSD template!'))
|
|
||||||
return (('attributes',), data)
|
|
@@ -1,574 +0,0 @@
|
|||||||
# Copyright 2018 OpenStack Foundation.
|
|
||||||
# All Rights Reserved
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from osc_lib.command import command
|
|
||||||
from osc_lib import utils
|
|
||||||
|
|
||||||
from tackerclient.common import exceptions
|
|
||||||
from tackerclient.common import utils as tacker_common_utils
|
|
||||||
from tackerclient.i18n import _
|
|
||||||
from tackerclient.osc import sdk_utils
|
|
||||||
from tackerclient.osc import utils as tacker_osc_utils
|
|
||||||
from tackerclient.tacker import v1_0 as tackerV10
|
|
||||||
|
|
||||||
_VNFFG = 'vnffg' # VNF Forwarding Graph
|
|
||||||
_NFP = 'nfp' # Network Forwarding Path
|
|
||||||
_SFC = 'sfc' # Service Function Chain
|
|
||||||
_FC = 'classifier' # Flow Classifier
|
|
||||||
|
|
||||||
nfps_path = '/nfps'
|
|
||||||
fcs_path = '/classifiers'
|
|
||||||
sfcs_path = '/sfcs'
|
|
||||||
|
|
||||||
DEFAULT_ERROR_REASON_LENGTH = 100
|
|
||||||
|
|
||||||
_attr_map_vnffg = (
|
|
||||||
('id', 'ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('name', 'Name', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('ns_id', 'NS ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('vnffgd_id', 'VNFFGD ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('status', 'Status', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('description', 'Description', tacker_osc_utils.LIST_LONG_ONLY),
|
|
||||||
)
|
|
||||||
|
|
||||||
_attr_map_nfp = (
|
|
||||||
('id', 'ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('name', 'Name', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('status', 'Status', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('vnffg_id', 'VNFFG ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('path_id', 'Path ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
)
|
|
||||||
|
|
||||||
_attr_map_sfc = (
|
|
||||||
('id', 'ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('status', 'Status', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('nfp_id', 'NFP ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
)
|
|
||||||
|
|
||||||
_attr_map_fc = (
|
|
||||||
('id', 'ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('name', 'Name', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('status', 'Status', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('nfp_id', 'NFP ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('chain_id', 'Chain ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
)
|
|
||||||
|
|
||||||
_formatters = {
|
|
||||||
'attributes': tacker_osc_utils.format_dict_with_indention,
|
|
||||||
'match': tacker_osc_utils.format_dict_with_indention,
|
|
||||||
'chain': tacker_osc_utils.format_dict_with_indention,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def _get_columns(item):
|
|
||||||
column_map = {
|
|
||||||
'tenant_id': 'project_id',
|
|
||||||
}
|
|
||||||
return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map)
|
|
||||||
|
|
||||||
|
|
||||||
class CreateVNFFG(command.ShowOne):
|
|
||||||
_description = _("Create a new VNFFG.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(CreateVNFFG, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'name', metavar='NAME',
|
|
||||||
help=_('Set a name for the VNFFG'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--tenant-id', metavar='TENANT_ID',
|
|
||||||
help=_('The owner tenant ID'))
|
|
||||||
vnffgd_group = parser.add_mutually_exclusive_group(required=True)
|
|
||||||
vnffgd_group.add_argument(
|
|
||||||
'--vnffgd-id',
|
|
||||||
help=_('VNFFGD ID to use as template to create VNFFG'))
|
|
||||||
vnffgd_group.add_argument(
|
|
||||||
'--vnffgd-name',
|
|
||||||
help=_('VNFFGD Name to use as template to create VNFFG'))
|
|
||||||
vnffgd_group.add_argument(
|
|
||||||
'--vnffgd-template',
|
|
||||||
help=_('VNFFGD file to create VNFFG'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--vnf-mapping',
|
|
||||||
help=_('List of logical VNFD name to VNF instance name mapping. '
|
|
||||||
'Example: VNF1:my_vnf1,VNF2:my_vnf2'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--symmetrical',
|
|
||||||
action='store_true',
|
|
||||||
default=False,
|
|
||||||
help=_('Should a reverse path be created for the NFP '
|
|
||||||
'(True or False)'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--param-file',
|
|
||||||
help=_('YAML file with specific VNFFG parameters'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--description',
|
|
||||||
help=_('Set a description for the VNFFG'))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = {_VNFFG: {}}
|
|
||||||
body[_VNFFG]['attributes'] = {}
|
|
||||||
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
if parsed_args.vnf_mapping:
|
|
||||||
_vnf_mapping = dict()
|
|
||||||
_vnf_mappings = parsed_args.vnf_mapping.split(",")
|
|
||||||
for mapping in _vnf_mappings:
|
|
||||||
vnfd_name, vnf = mapping.split(":", 1)
|
|
||||||
_vnf_mapping[vnfd_name] = \
|
|
||||||
tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, 'vnf', vnf)
|
|
||||||
parsed_args.vnf_mapping = _vnf_mapping
|
|
||||||
|
|
||||||
if parsed_args.vnffgd_name:
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, 'vnffgd', parsed_args.vnffgd_name)
|
|
||||||
parsed_args.vnffgd_id = _id
|
|
||||||
elif parsed_args.vnffgd_template:
|
|
||||||
with open(parsed_args.vnffgd_template) as f:
|
|
||||||
template = f.read()
|
|
||||||
try:
|
|
||||||
template = yaml.load(template, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not template:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason='The vnffgd file is empty')
|
|
||||||
body[_VNFFG]['vnffgd_template'] = template
|
|
||||||
|
|
||||||
if parsed_args.param_file:
|
|
||||||
with open(parsed_args.param_file) as f:
|
|
||||||
param_yaml = f.read()
|
|
||||||
try:
|
|
||||||
param_yaml = yaml.load(
|
|
||||||
param_yaml, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not param_yaml:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason='The parameter file is empty')
|
|
||||||
body[_VNFFG]['attributes'] = {'param_values': param_yaml}
|
|
||||||
tackerV10.update_dict(parsed_args, body[_VNFFG],
|
|
||||||
['tenant_id', 'name', 'vnffgd_id',
|
|
||||||
'symmetrical', 'vnf_mapping', 'description'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
vnffg = client.create_vnffg(self.args2body(parsed_args))
|
|
||||||
display_columns, columns = _get_columns(vnffg[_VNFFG])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(vnffg[_VNFFG]),
|
|
||||||
columns,
|
|
||||||
formatters=_formatters)
|
|
||||||
return (display_columns, data)
|
|
||||||
|
|
||||||
|
|
||||||
class DeleteVNFFG(command.Command):
|
|
||||||
_description = _("Delete VNFFG(s).")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(DeleteVNFFG, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_VNFFG,
|
|
||||||
metavar="<VNFFG>",
|
|
||||||
nargs="+",
|
|
||||||
help=_("VNFFG(s) to delete (name or ID)")
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
'--force',
|
|
||||||
default=False,
|
|
||||||
action='store_true',
|
|
||||||
help=_('Force delete VNFFG'))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = dict()
|
|
||||||
if parsed_args.force:
|
|
||||||
body[_VNFFG] = dict()
|
|
||||||
body[_VNFFG]['attributes'] = dict()
|
|
||||||
body[_VNFFG]['attributes']['force'] = True
|
|
||||||
return body
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
failure = False
|
|
||||||
deleted_ids = []
|
|
||||||
failed_items = {}
|
|
||||||
body = self.args2body(parsed_args)
|
|
||||||
for resource_id in parsed_args.vnffg:
|
|
||||||
try:
|
|
||||||
obj = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _VNFFG, resource_id)
|
|
||||||
client.delete_vnffg(obj, body)
|
|
||||||
deleted_ids.append(resource_id)
|
|
||||||
except Exception as e:
|
|
||||||
failure = True
|
|
||||||
failed_items[resource_id] = e
|
|
||||||
if failure:
|
|
||||||
msg = ''
|
|
||||||
if deleted_ids:
|
|
||||||
msg = (_('Successfully deleted %(resource)s(s):'
|
|
||||||
' %(deleted_list)s') % {'deleted_list':
|
|
||||||
', '.join(deleted_ids),
|
|
||||||
'resource': _VNFFG})
|
|
||||||
err_msg = _("\n\nUnable to delete the below"
|
|
||||||
" %s(s):") % _VNFFG
|
|
||||||
for failed_id, error in failed_items.items():
|
|
||||||
err_msg += (_('\n Cannot delete %(failed_id)s: %(error)s')
|
|
||||||
% {'failed_id': failed_id,
|
|
||||||
'error': error})
|
|
||||||
msg += err_msg
|
|
||||||
raise exceptions.CommandError(message=msg)
|
|
||||||
else:
|
|
||||||
print((_('All specified %(resource)s(s) deleted successfully')
|
|
||||||
% {'resource': _VNFFG}))
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
class UpdateVNFFG(command.ShowOne):
|
|
||||||
_description = _("Update VNFFG.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(UpdateVNFFG, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_VNFFG,
|
|
||||||
metavar="<VNFFG>",
|
|
||||||
help=_('VNFFG to update (name or ID)'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--vnffgd-template',
|
|
||||||
help=_('VNFFGD file to update VNFFG'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--vnf-mapping',
|
|
||||||
help=_('List of logical VNFD name to VNF instance name mapping. '
|
|
||||||
'Example: VNF1:my_vnf1,VNF2:my_vnf2'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--symmetrical',
|
|
||||||
action='store_true',
|
|
||||||
default=False,
|
|
||||||
help=_('Should a reverse path be created for the NFP'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--description',
|
|
||||||
help=_('Set a description for the VNFFG'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--param-file',
|
|
||||||
help=_('YAML file with specific VNFFG parameters'))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = {_VNFFG: {}}
|
|
||||||
body[_VNFFG]['attributes'] = {}
|
|
||||||
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
|
|
||||||
if parsed_args.vnf_mapping:
|
|
||||||
_vnf_mapping = dict()
|
|
||||||
_vnf_mappings = parsed_args.vnf_mapping.split(",")
|
|
||||||
for mapping in _vnf_mappings:
|
|
||||||
vnfd_name, vnf = mapping.split(":", 1)
|
|
||||||
_vnf_mapping[vnfd_name] = \
|
|
||||||
tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, 'vnf', vnf)
|
|
||||||
parsed_args.vnf_mapping = _vnf_mapping
|
|
||||||
|
|
||||||
if parsed_args.vnffgd_template:
|
|
||||||
with open(parsed_args.vnffgd_template) as f:
|
|
||||||
template = f.read()
|
|
||||||
try:
|
|
||||||
template = yaml.load(
|
|
||||||
template, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not template:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason='The vnffgd file is empty')
|
|
||||||
body[_VNFFG]['vnffgd_template'] = template
|
|
||||||
|
|
||||||
if parsed_args.param_file:
|
|
||||||
with open(parsed_args.param_file) as f:
|
|
||||||
param_yaml = f.read()
|
|
||||||
try:
|
|
||||||
param_yaml = yaml.load(
|
|
||||||
param_yaml, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not param_yaml:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason='The parameter file is empty')
|
|
||||||
body[_VNFFG]['attributes'] = {'param_values': param_yaml}
|
|
||||||
tackerV10.update_dict(parsed_args, body[_VNFFG],
|
|
||||||
['vnf_mapping', 'symmetrical', 'description'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _VNFFG, parsed_args.vnffg)
|
|
||||||
vnffg = client.update_vnffg(obj_id, self.args2body(parsed_args))
|
|
||||||
display_columns, columns = _get_columns(vnffg[_VNFFG])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(vnffg[_VNFFG]),
|
|
||||||
columns,
|
|
||||||
formatters=_formatters)
|
|
||||||
return (display_columns, data)
|
|
||||||
|
|
||||||
|
|
||||||
class ListVNFFG(command.Lister):
|
|
||||||
_description = ("List VNFFG(s) that belong to a given tenant.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListVNFFG, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'--long',
|
|
||||||
action='store_true',
|
|
||||||
help=_('List additional fields in output')
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
data = client.list_vnffgs()
|
|
||||||
headers, columns = tacker_osc_utils.get_column_definitions(
|
|
||||||
_attr_map_vnffg, long_listing=parsed_args.long)
|
|
||||||
return (headers,
|
|
||||||
(utils.get_dict_properties(
|
|
||||||
s, columns,
|
|
||||||
) for s in data[_VNFFG + 's']))
|
|
||||||
|
|
||||||
|
|
||||||
class ShowVNFFG(command.ShowOne):
|
|
||||||
_description = _("Display VNFFG details")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ShowVNFFG, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_VNFFG,
|
|
||||||
metavar="<VNFFG>",
|
|
||||||
help=_('VNFFG to display (name or ID)')
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _VNFFG, parsed_args.vnffg)
|
|
||||||
obj = client.show_vnffg(obj_id)
|
|
||||||
display_columns, columns = _get_columns(obj[_VNFFG])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(obj[_VNFFG]),
|
|
||||||
columns,
|
|
||||||
formatters=_formatters)
|
|
||||||
return (display_columns, data)
|
|
||||||
|
|
||||||
|
|
||||||
class ListNFP(command.Lister):
|
|
||||||
_description = ("List NFP(s) that belong to a given tenant.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListNFP, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'--vnffg-id',
|
|
||||||
help=_('List NFP(s) with specific VNFFG ID'))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
_params = {}
|
|
||||||
if parsed_args.vnffg_id:
|
|
||||||
_params['vnffg_id'] = parsed_args.vnffg_id
|
|
||||||
nfps = client.list('nfps', nfps_path, True, **_params)
|
|
||||||
for nfp in nfps['nfps']:
|
|
||||||
error_reason = nfp.get('error_reason', None)
|
|
||||||
if error_reason and \
|
|
||||||
len(error_reason) > DEFAULT_ERROR_REASON_LENGTH:
|
|
||||||
nfp['error_reason'] = error_reason[
|
|
||||||
:DEFAULT_ERROR_REASON_LENGTH]
|
|
||||||
nfp['error_reason'] += '...'
|
|
||||||
data = {}
|
|
||||||
data['nfps'] = nfps['nfps']
|
|
||||||
data = client.list_nfps()
|
|
||||||
headers, columns = tacker_osc_utils.get_column_definitions(
|
|
||||||
_attr_map_nfp, long_listing=None)
|
|
||||||
return (headers,
|
|
||||||
(utils.get_dict_properties(
|
|
||||||
s, columns,
|
|
||||||
) for s in data[_NFP + 's']))
|
|
||||||
|
|
||||||
|
|
||||||
class ShowNFP(command.ShowOne):
|
|
||||||
_description = _("Display NFP details")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ShowNFP, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_NFP,
|
|
||||||
metavar="<NFP>",
|
|
||||||
help=_('NFP to display (name or ID)')
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _NFP, parsed_args.nfp)
|
|
||||||
obj = client.show_nfp(obj_id)
|
|
||||||
display_columns, columns = _get_columns(obj[_NFP])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(obj[_NFP]),
|
|
||||||
columns)
|
|
||||||
return (display_columns, data)
|
|
||||||
|
|
||||||
|
|
||||||
class ListFC(command.Lister):
|
|
||||||
_description = ("List flow classifier(s) that belong to a given tenant.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListFC, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'--nfp-id',
|
|
||||||
help=_('List flow classifier(s) with specific nfp id'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--tenant-id', metavar='TENANT_ID',
|
|
||||||
help=_('The owner tenant ID or project ID'))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
_params = {}
|
|
||||||
if parsed_args.nfp_id:
|
|
||||||
_params['nfp_id'] = parsed_args.nfp_id
|
|
||||||
if parsed_args.tenant_id:
|
|
||||||
_params['tenant_id'] = parsed_args.tenant_id
|
|
||||||
classifiers = client.list('classifiers', fcs_path, True,
|
|
||||||
**_params)
|
|
||||||
for classifier in classifiers['classifiers']:
|
|
||||||
error_reason = classifier.get('error_reason', None)
|
|
||||||
if error_reason and \
|
|
||||||
len(error_reason) > DEFAULT_ERROR_REASON_LENGTH:
|
|
||||||
classifier['error_reason'] = error_reason[
|
|
||||||
:DEFAULT_ERROR_REASON_LENGTH]
|
|
||||||
classifier['error_reason'] += '...'
|
|
||||||
data = {}
|
|
||||||
data['classifiers'] = classifiers['classifiers']
|
|
||||||
data = client.list_classifiers()
|
|
||||||
headers, columns = tacker_osc_utils.get_column_definitions(
|
|
||||||
_attr_map_fc, long_listing=None)
|
|
||||||
return (headers,
|
|
||||||
(utils.get_dict_properties(
|
|
||||||
s, columns,
|
|
||||||
) for s in data[_FC + 's']))
|
|
||||||
|
|
||||||
|
|
||||||
class ShowFC(command.ShowOne):
|
|
||||||
_description = _("Display flow classifier details")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ShowFC, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_FC,
|
|
||||||
metavar="<Classifier ID>",
|
|
||||||
help=_('Flow Classifier to display (name or ID)')
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _FC, parsed_args.classifier)
|
|
||||||
obj = client.show_classifier(obj_id)
|
|
||||||
display_columns, columns = _get_columns(obj[_FC])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(obj[_FC]),
|
|
||||||
columns,
|
|
||||||
formatters=_formatters)
|
|
||||||
return (display_columns, data)
|
|
||||||
|
|
||||||
|
|
||||||
class ListSFC(command.Lister):
|
|
||||||
_description = ("List SFC(s) that belong to a given tenant.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListSFC, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'--nfp-id',
|
|
||||||
help=_('List SFC(s) with specific nfp id'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--tenant-id', metavar='TENANT_ID',
|
|
||||||
help=_('The owner tenant ID or project ID'))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
_params = {}
|
|
||||||
if parsed_args.nfp_id:
|
|
||||||
_params['nfp_id'] = parsed_args.nfp_id
|
|
||||||
if parsed_args.tenant_id:
|
|
||||||
_params['tenant_id'] = parsed_args.tenant_id
|
|
||||||
sfcs = client.list('sfcs', sfcs_path, True, **_params)
|
|
||||||
for chain in sfcs['sfcs']:
|
|
||||||
error_reason = chain.get('error_reason', None)
|
|
||||||
if error_reason and \
|
|
||||||
len(error_reason) > DEFAULT_ERROR_REASON_LENGTH:
|
|
||||||
chain['error_reason'] = error_reason[
|
|
||||||
:DEFAULT_ERROR_REASON_LENGTH]
|
|
||||||
chain['error_reason'] += '...'
|
|
||||||
data = {}
|
|
||||||
data['sfcs'] = sfcs['sfcs']
|
|
||||||
headers, columns = tacker_osc_utils.get_column_definitions(
|
|
||||||
_attr_map_sfc, long_listing=None)
|
|
||||||
return (headers,
|
|
||||||
(utils.get_dict_properties(
|
|
||||||
s, columns,
|
|
||||||
) for s in data[_SFC + 's']))
|
|
||||||
|
|
||||||
|
|
||||||
class ShowSFC(command.ShowOne):
|
|
||||||
_description = _("Display SFC details")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ShowSFC, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_SFC,
|
|
||||||
metavar="<SFC>",
|
|
||||||
help=_('SFC to display (name or ID)')
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _SFC, parsed_args.sfc)
|
|
||||||
obj = client.show_sfc(obj_id)
|
|
||||||
display_columns, columns = _get_columns(obj[_SFC])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(obj[_SFC]),
|
|
||||||
columns,
|
|
||||||
formatters=_formatters)
|
|
||||||
return (display_columns, data)
|
|
@@ -1,223 +0,0 @@
|
|||||||
# Copyright 2018 OpenStack Foundation.
|
|
||||||
# All Rights Reserved
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from osc_lib.command import command
|
|
||||||
from osc_lib import utils
|
|
||||||
|
|
||||||
from tackerclient.common import exceptions
|
|
||||||
from tackerclient.common import utils as tacker_common_utils
|
|
||||||
from tackerclient.i18n import _
|
|
||||||
from tackerclient.osc import sdk_utils
|
|
||||||
from tackerclient.osc import utils as tacker_osc_utils
|
|
||||||
from tackerclient.tacker import v1_0 as tackerV10
|
|
||||||
|
|
||||||
_attr_map = (
|
|
||||||
('id', 'ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('name', 'Name', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('template_source', 'Template_Source',
|
|
||||||
tacker_osc_utils.LIST_BOTH),
|
|
||||||
('description', 'Description', tacker_osc_utils.LIST_BOTH),
|
|
||||||
)
|
|
||||||
|
|
||||||
_VNFFGD = "vnffgd"
|
|
||||||
|
|
||||||
_formatters = {
|
|
||||||
'template': tacker_osc_utils.format_dict_with_indention,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def _get_columns(item):
|
|
||||||
column_map = {
|
|
||||||
'tenant_id': 'project_id',
|
|
||||||
}
|
|
||||||
return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map)
|
|
||||||
|
|
||||||
|
|
||||||
class CreateVNFFGD(command.ShowOne):
|
|
||||||
_description = _("Create a new VNFFGD")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(CreateVNFFGD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'name', metavar='NAME',
|
|
||||||
help=_('Name for VNFFGD'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--tenant-id', metavar='TENANT_ID',
|
|
||||||
help=_('The owner tenant ID or project ID'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--vnffgd-file',
|
|
||||||
required=True,
|
|
||||||
help=_('YAML file with VNFFGD parameters'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--description',
|
|
||||||
help=_('Set a description for the VNFFGD'))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = {_VNFFGD: {}}
|
|
||||||
vnffgd = None
|
|
||||||
if not parsed_args.vnffgd_file:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason="Invalid input for vnffgd file")
|
|
||||||
with open(parsed_args.vnffgd_file) as f:
|
|
||||||
vnffgd = f.read()
|
|
||||||
try:
|
|
||||||
vnffgd = yaml.load(vnffgd, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not vnffgd:
|
|
||||||
raise exceptions.InvalidInput(reason="vnffgd file is empty")
|
|
||||||
body[_VNFFGD]['template'] = {'vnffgd': vnffgd}
|
|
||||||
tackerV10.update_dict(parsed_args, body[_VNFFGD],
|
|
||||||
['tenant_id', 'name', 'description'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
vnffgd = client.create_vnffgd(self.args2body(parsed_args))
|
|
||||||
display_columns, columns = _get_columns(vnffgd[_VNFFGD])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(vnffgd[_VNFFGD]),
|
|
||||||
columns, formatters=_formatters)
|
|
||||||
return (display_columns, data)
|
|
||||||
|
|
||||||
|
|
||||||
class DeleteVNFFGD(command.Command):
|
|
||||||
_description = _("Delete VNFFGD(s).")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(DeleteVNFFGD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_VNFFGD,
|
|
||||||
metavar="<VNFFGD>",
|
|
||||||
nargs="+",
|
|
||||||
help=_("VNFFGD(s) to delete (name or ID)")
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
failure = False
|
|
||||||
deleted_ids = []
|
|
||||||
failed_items = {}
|
|
||||||
for resource_id in parsed_args.vnffgd:
|
|
||||||
try:
|
|
||||||
obj = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _VNFFGD, resource_id)
|
|
||||||
client.delete_vnffgd(obj)
|
|
||||||
deleted_ids.append(resource_id)
|
|
||||||
except Exception as e:
|
|
||||||
failure = True
|
|
||||||
failed_items[resource_id] = e
|
|
||||||
if failure:
|
|
||||||
msg = ''
|
|
||||||
if deleted_ids:
|
|
||||||
msg = (_('Successfully deleted %(resource)s(s):'
|
|
||||||
' %(deleted_list)s') % {'deleted_list':
|
|
||||||
', '.join(deleted_ids),
|
|
||||||
'resource': _VNFFGD})
|
|
||||||
err_msg = _("\n\nUnable to delete the below"
|
|
||||||
" %s(s):") % _VNFFGD
|
|
||||||
for failed_id, error in failed_items.items():
|
|
||||||
err_msg += (_('\n Cannot delete %(failed_id)s: %(error)s')
|
|
||||||
% {'failed_id': failed_id,
|
|
||||||
'error': error})
|
|
||||||
msg += err_msg
|
|
||||||
raise exceptions.CommandError(message=msg)
|
|
||||||
else:
|
|
||||||
print((_('All specified %(resource)s(s) deleted successfully')
|
|
||||||
% {'resource': _VNFFGD}))
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
class ListVNFFGD(command.Lister):
|
|
||||||
_description = ("List (VNFFGD)s that belong to a given tenant.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListVNFFGD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'--template-source',
|
|
||||||
help=_("List VNFFGD with specified template source. Available \
|
|
||||||
options are 'onboarded' (default), 'inline' or 'all'"),
|
|
||||||
action='store',
|
|
||||||
default='onboarded')
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
data = client.list_vnffgds()
|
|
||||||
headers, columns = tacker_osc_utils.get_column_definitions(
|
|
||||||
_attr_map, long_listing=None)
|
|
||||||
return (headers,
|
|
||||||
(utils.get_dict_properties(
|
|
||||||
s, columns,
|
|
||||||
) for s in data[_VNFFGD + 's']))
|
|
||||||
|
|
||||||
|
|
||||||
class ShowVNFFGD(command.ShowOne):
|
|
||||||
_description = _("Display VNFFGD details")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ShowVNFFGD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_VNFFGD,
|
|
||||||
metavar="<VNFFGD>",
|
|
||||||
help=_("VNFFGD to display (name or ID)")
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _VNFFGD, parsed_args.vnffgd)
|
|
||||||
obj = client.show_vnffgd(obj_id)
|
|
||||||
display_columns, columns = _get_columns(obj[_VNFFGD])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(obj[_VNFFGD]),
|
|
||||||
columns, formatters=_formatters)
|
|
||||||
return (display_columns, data)
|
|
||||||
|
|
||||||
|
|
||||||
class ShowTemplateVNFFGD(command.ShowOne):
|
|
||||||
_description = _("Display VNFFGD Template details")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ShowTemplateVNFFGD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_VNFFGD,
|
|
||||||
metavar="<VNFFGD>",
|
|
||||||
help=_("VNFFGD to display (name or ID)")
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _VNFFGD, parsed_args.vnffgd)
|
|
||||||
obj = client.show_vnffgd(obj_id)
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(obj[_VNFFGD]),
|
|
||||||
('template',),
|
|
||||||
formatters=_formatters)
|
|
||||||
data = (data or _('Unable to display VNFFGD template!'))
|
|
||||||
return (('template',), data)
|
|
@@ -1,472 +0,0 @@
|
|||||||
# Copyright 2018 OpenStack Foundation.
|
|
||||||
# All Rights Reserved
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from osc_lib.command import command
|
|
||||||
from osc_lib import utils
|
|
||||||
from oslo_utils import encodeutils
|
|
||||||
|
|
||||||
from tackerclient.common import exceptions
|
|
||||||
from tackerclient.common import utils as tacker_common_utils
|
|
||||||
from tackerclient.i18n import _
|
|
||||||
from tackerclient.osc import sdk_utils
|
|
||||||
from tackerclient.osc import utils as tacker_osc_utils
|
|
||||||
from tackerclient.tacker import v1_0 as tackerV10
|
|
||||||
|
|
||||||
_attr_map = (
|
|
||||||
('id', 'ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('name', 'Name', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('mgmt_ip_address', 'Mgmt Ip Address',
|
|
||||||
tacker_osc_utils.LIST_BOTH),
|
|
||||||
('status', 'Status', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('vim_id', 'VIM ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('vnfd_id', 'VNFD ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('tenant_id', 'Project ID', tacker_osc_utils.LIST_LONG_ONLY),
|
|
||||||
)
|
|
||||||
|
|
||||||
_attr_map_rsc = (
|
|
||||||
('id', 'ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('name', 'Name', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('type', 'Type', tacker_osc_utils.LIST_BOTH),
|
|
||||||
)
|
|
||||||
|
|
||||||
_VNF = "vnf"
|
|
||||||
|
|
||||||
|
|
||||||
def _get_columns(item):
|
|
||||||
column_map = {
|
|
||||||
'tenant_id': 'project_id',
|
|
||||||
}
|
|
||||||
return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map)
|
|
||||||
|
|
||||||
|
|
||||||
def _break_string(vnf_monitoring_policy):
|
|
||||||
count_space = 0
|
|
||||||
monitoring_policy = "\n"
|
|
||||||
for i in range(0, len(vnf_monitoring_policy)):
|
|
||||||
monitoring_policy += vnf_monitoring_policy[i]
|
|
||||||
if vnf_monitoring_policy[i] == ' ':
|
|
||||||
count_space += 1
|
|
||||||
if count_space == 9:
|
|
||||||
monitoring_policy += "\n"
|
|
||||||
count_space = 0
|
|
||||||
return monitoring_policy
|
|
||||||
|
|
||||||
|
|
||||||
class CreateVNF(command.ShowOne):
|
|
||||||
_description = _("Create a new VNF")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(CreateVNF, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'name', metavar='NAME',
|
|
||||||
help=_('Set a name for the VNF'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--tenant-id', metavar='TENANT_ID',
|
|
||||||
help=_('The owner tenant ID or project ID'))
|
|
||||||
vnfd_group = parser.add_mutually_exclusive_group(required=True)
|
|
||||||
vnfd_group.add_argument(
|
|
||||||
'--vnfd-id',
|
|
||||||
help=_('VNFD ID to use as template to create VNF'))
|
|
||||||
vnfd_group.add_argument(
|
|
||||||
'--vnfd-name',
|
|
||||||
help=_('VNFD Name to use as template to create VNF'))
|
|
||||||
vnfd_group.add_argument(
|
|
||||||
'--vnfd-template',
|
|
||||||
help=_("VNFD file to create VNF"))
|
|
||||||
vim_group = parser.add_mutually_exclusive_group()
|
|
||||||
vim_group.add_argument(
|
|
||||||
'--vim-id',
|
|
||||||
help=_('VIM ID to deploy VNF on specified VIM'))
|
|
||||||
vim_group.add_argument(
|
|
||||||
'--vim-name',
|
|
||||||
help=_('VIM name to deploy VNF on specified VIM'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--vim-region-name',
|
|
||||||
help=_('VIM Region to deploy VNF on specified VIM'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--config-file',
|
|
||||||
help=_('YAML file with VNF configuration'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--param-file',
|
|
||||||
help=_('Specify parameter yaml file'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--description',
|
|
||||||
help=_('Set description for the VNF'))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = {_VNF: {}}
|
|
||||||
body[_VNF]['attributes'] = {}
|
|
||||||
|
|
||||||
config = None
|
|
||||||
if parsed_args.config_file:
|
|
||||||
with open(parsed_args.config_file) as f:
|
|
||||||
config_yaml = f.read()
|
|
||||||
try:
|
|
||||||
config = yaml.load(
|
|
||||||
config_yaml, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if config:
|
|
||||||
body[_VNF]['attributes'] = {'config': config}
|
|
||||||
|
|
||||||
if parsed_args.vim_region_name:
|
|
||||||
body[_VNF].setdefault('placement_attr', {})['region_name'] = \
|
|
||||||
parsed_args.vim_region_name
|
|
||||||
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
if parsed_args.vim_name:
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(client, 'vim',
|
|
||||||
parsed_args.vim_name)
|
|
||||||
parsed_args.vim_id = _id
|
|
||||||
if parsed_args.vnfd_name:
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, 'vnfd',
|
|
||||||
parsed_args.vnfd_name
|
|
||||||
)
|
|
||||||
parsed_args.vnfd_id = _id
|
|
||||||
elif parsed_args.vnfd_template:
|
|
||||||
with open(parsed_args.vnfd_template) as f:
|
|
||||||
template = f.read()
|
|
||||||
try:
|
|
||||||
template = yaml.load(
|
|
||||||
template, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not template:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason='The vnfd file is empty')
|
|
||||||
body[_VNF]['vnfd_template'] = template
|
|
||||||
|
|
||||||
if parsed_args.param_file:
|
|
||||||
with open(parsed_args.param_file) as f:
|
|
||||||
param_yaml = f.read()
|
|
||||||
try:
|
|
||||||
param_yaml = yaml.load(
|
|
||||||
param_yaml, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not param_yaml:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason='The parameter file is empty')
|
|
||||||
body[_VNF]['attributes'] = {'param_values': param_yaml}
|
|
||||||
tackerV10.update_dict(parsed_args, body[_VNF],
|
|
||||||
['tenant_id', 'name', 'description',
|
|
||||||
'vnfd_id', 'vim_id'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
vnf = client.create_vnf(self.args2body(parsed_args))
|
|
||||||
display_columns, columns = _get_columns(vnf[_VNF])
|
|
||||||
if vnf[_VNF]['attributes'].get('monitoring_policy'):
|
|
||||||
vnf[_VNF]['attributes']['monitoring_policy'] =\
|
|
||||||
_break_string(vnf[_VNF]['attributes']['monitoring_policy'])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(vnf[_VNF]),
|
|
||||||
columns)
|
|
||||||
return (display_columns, data)
|
|
||||||
|
|
||||||
|
|
||||||
class DeleteVNF(command.Command):
|
|
||||||
_description = _("Delete VNF(s).")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(DeleteVNF, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_VNF,
|
|
||||||
metavar="<VNF>",
|
|
||||||
nargs="+",
|
|
||||||
help=_("VNF(s) to delete (name or ID)"))
|
|
||||||
parser.add_argument(
|
|
||||||
'--force',
|
|
||||||
default=False,
|
|
||||||
action='store_true',
|
|
||||||
help=_('Force delete VNF instance'))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = dict()
|
|
||||||
if parsed_args.force:
|
|
||||||
body[_VNF] = dict()
|
|
||||||
body[_VNF]['attributes'] = dict()
|
|
||||||
body[_VNF]['attributes']['force'] = True
|
|
||||||
return body
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
failure = False
|
|
||||||
deleted_ids = []
|
|
||||||
failed_items = {}
|
|
||||||
body = self.args2body(parsed_args)
|
|
||||||
for resource_id in parsed_args.vnf:
|
|
||||||
try:
|
|
||||||
obj = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _VNF, resource_id)
|
|
||||||
client.delete_vnf(obj, body)
|
|
||||||
deleted_ids.append(resource_id)
|
|
||||||
except Exception as e:
|
|
||||||
failure = True
|
|
||||||
failed_items[resource_id] = e
|
|
||||||
if failure:
|
|
||||||
msg = ''
|
|
||||||
if deleted_ids:
|
|
||||||
msg = (_('Successfully deleted %(resource)s(s):'
|
|
||||||
' %(deleted_list)s') % {'deleted_list':
|
|
||||||
', '.join(deleted_ids),
|
|
||||||
'resource': _VNF})
|
|
||||||
err_msg = _("\n\nUnable to delete the below"
|
|
||||||
" %s(s):") % _VNF
|
|
||||||
for failed_id, error in failed_items.items():
|
|
||||||
err_msg += (_('\n Cannot delete %(failed_id)s: %(error)s')
|
|
||||||
% {'failed_id': failed_id,
|
|
||||||
'error': error})
|
|
||||||
msg += err_msg
|
|
||||||
raise exceptions.CommandError(message=msg)
|
|
||||||
else:
|
|
||||||
print((_('All specified %(resource)s(s) deleted successfully')
|
|
||||||
% {'resource': _VNF}))
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
class ListVNF(command.Lister):
|
|
||||||
_description = _("List VNF(s) that belong to a given tenant.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListVNF, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'--template-source',
|
|
||||||
help=_("List VNF with specified template source. Available \
|
|
||||||
options are 'onboarded' (default), 'inline' or 'all'"),
|
|
||||||
action='store',
|
|
||||||
default='onboarded')
|
|
||||||
vim_group = parser.add_mutually_exclusive_group()
|
|
||||||
vim_group.add_argument(
|
|
||||||
'--vim-id',
|
|
||||||
help=_('List VNF(s) that belong to a given VIM ID'))
|
|
||||||
vim_group.add_argument(
|
|
||||||
'--vim-name',
|
|
||||||
help=_('List VNF(s) that belong to a given VIM Name'))
|
|
||||||
vnfd_group = parser.add_mutually_exclusive_group()
|
|
||||||
vnfd_group.add_argument(
|
|
||||||
'--vnfd-id',
|
|
||||||
help=_('List VNF(s) that belong to a given VNFD ID'))
|
|
||||||
vnfd_group.add_argument(
|
|
||||||
'--vnfd-name',
|
|
||||||
help=_('List VNF(s) that belong to a given VNFD Name'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--tenant-id', metavar='TENANT_ID',
|
|
||||||
help=_('The owner tenant ID or project ID'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--long',
|
|
||||||
action='store_true',
|
|
||||||
help=_('List additional fields in output'))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
_params = {}
|
|
||||||
if parsed_args.vim_id:
|
|
||||||
_params['vim_id'] = parsed_args.vim_id
|
|
||||||
if parsed_args.vim_name:
|
|
||||||
vim_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, 'vim', parsed_args.vim_name
|
|
||||||
)
|
|
||||||
_params['vim_id'] = vim_id
|
|
||||||
if parsed_args.vnfd_id:
|
|
||||||
_params['vnfd_id'] = parsed_args.vnfd_id
|
|
||||||
if parsed_args.vnfd_name:
|
|
||||||
vim_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, 'vnfd', parsed_args.vnfd_name
|
|
||||||
)
|
|
||||||
_params['vnfd_id'] = vim_id
|
|
||||||
if parsed_args.tenant_id:
|
|
||||||
_params['tenant_id'] = parsed_args.tenant_id
|
|
||||||
data = client.list_vnfs(**_params)
|
|
||||||
headers, columns = tacker_osc_utils.get_column_definitions(
|
|
||||||
_attr_map, long_listing=parsed_args.long)
|
|
||||||
return (headers,
|
|
||||||
(utils.get_dict_properties(
|
|
||||||
s, columns,
|
|
||||||
) for s in data[_VNF + 's']))
|
|
||||||
|
|
||||||
|
|
||||||
class ShowVNF(command.ShowOne):
|
|
||||||
_description = _("Display VNF details")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ShowVNF, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_VNF,
|
|
||||||
metavar="<VNF>",
|
|
||||||
help=_("VNF to display (name or ID)"))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _VNF, parsed_args.vnf)
|
|
||||||
obj = client.show_vnf(obj_id)
|
|
||||||
if obj[_VNF]['attributes'].get('monitoring_policy'):
|
|
||||||
obj[_VNF]['attributes']['monitoring_policy'] =\
|
|
||||||
_break_string(obj[_VNF]['attributes']['monitoring_policy'])
|
|
||||||
display_columns, columns = _get_columns(obj[_VNF])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(obj[_VNF]),
|
|
||||||
columns)
|
|
||||||
return (display_columns, data)
|
|
||||||
|
|
||||||
|
|
||||||
class ListVNFResources(command.Lister):
|
|
||||||
_description = _("List resources of a VNF like VDU, CP, etc.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListVNFResources, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_VNF,
|
|
||||||
metavar="<VNF>",
|
|
||||||
help=_("VNF to display (name or ID)"))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _VNF, parsed_args.vnf)
|
|
||||||
data = client.list_vnf_resources(obj_id)
|
|
||||||
headers, columns = tacker_osc_utils.get_column_definitions(
|
|
||||||
_attr_map_rsc, long_listing=None)
|
|
||||||
return (headers,
|
|
||||||
(utils.get_dict_properties(
|
|
||||||
s, columns,
|
|
||||||
) for s in data['resources']))
|
|
||||||
|
|
||||||
|
|
||||||
class UpdateVNF(command.ShowOne):
|
|
||||||
_description = _("Update a given VNF.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(UpdateVNF, self).get_parser(prog_name)
|
|
||||||
group = parser.add_mutually_exclusive_group(required=True)
|
|
||||||
group.add_argument(
|
|
||||||
'--config-file',
|
|
||||||
help=_('YAML file with VNF configuration'))
|
|
||||||
group.add_argument(
|
|
||||||
'--config',
|
|
||||||
help=_('YAML data with VNF configuration'))
|
|
||||||
group.add_argument(
|
|
||||||
'--param-file',
|
|
||||||
help=_('YAML file with VNF parameter'))
|
|
||||||
parser.add_argument(
|
|
||||||
_VNF,
|
|
||||||
metavar="<VNF>",
|
|
||||||
help=_("VNF to update (name or ID)"))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = {_VNF: {}}
|
|
||||||
body[_VNF]['attributes'] = {}
|
|
||||||
|
|
||||||
config = None
|
|
||||||
if parsed_args.config_file:
|
|
||||||
with open(parsed_args.config_file) as f:
|
|
||||||
config_yaml = f.read()
|
|
||||||
try:
|
|
||||||
config = yaml.load(config_yaml, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not config:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason='The config file is empty')
|
|
||||||
if parsed_args.config:
|
|
||||||
decoded_config = encodeutils.safe_decode(parsed_args.config)
|
|
||||||
try:
|
|
||||||
config = yaml.load(decoded_config, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not config:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason='The parameter is empty')
|
|
||||||
if config:
|
|
||||||
body[_VNF]['attributes'] = {'config': config}
|
|
||||||
if parsed_args.param_file:
|
|
||||||
with open(parsed_args.param_file) as f:
|
|
||||||
param_yaml = f.read()
|
|
||||||
try:
|
|
||||||
param = yaml.load(
|
|
||||||
param_yaml, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not param:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason='The parameter file is empty')
|
|
||||||
body[_VNF]['attributes'] = {'param_values': param}
|
|
||||||
tackerV10.update_dict(parsed_args, body[_VNF], ['tenant_id'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _VNF, parsed_args.vnf)
|
|
||||||
vnf = client.update_vnf(obj_id, self.args2body(parsed_args))
|
|
||||||
if vnf[_VNF]['attributes'].get('monitoring_policy'):
|
|
||||||
vnf[_VNF]['attributes']['monitoring_policy'] =\
|
|
||||||
_break_string(vnf[_VNF]['attributes']['monitoring_policy'])
|
|
||||||
display_columns, columns = _get_columns(vnf[_VNF])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(vnf[_VNF]),
|
|
||||||
columns)
|
|
||||||
return (display_columns, data)
|
|
||||||
|
|
||||||
|
|
||||||
class ScaleVNF(command.Command):
|
|
||||||
_description = _("Scale a VNF.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ScaleVNF, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'--scaling-policy-name',
|
|
||||||
help=_('VNF policy name used to scale'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--scaling-type',
|
|
||||||
help=_('VNF scaling type, it could be either "out" or "in"'))
|
|
||||||
parser.add_argument(
|
|
||||||
_VNF,
|
|
||||||
metavar="<VNF>",
|
|
||||||
help=_("VNF to scale (name or ID)"))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
args = {}
|
|
||||||
body = {"scale": args}
|
|
||||||
args['type'] = parsed_args.scaling_type
|
|
||||||
args['policy'] = parsed_args.scaling_policy_name
|
|
||||||
return body
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _VNF, parsed_args.vnf)
|
|
||||||
client.scale_vnf(obj_id, self.args2body(parsed_args))
|
|
||||||
return
|
|
@@ -1,230 +0,0 @@
|
|||||||
# Copyright 2016 NEC Corporation.
|
|
||||||
# All Rights Reserved
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from osc_lib.command import command
|
|
||||||
from osc_lib import utils
|
|
||||||
|
|
||||||
from tackerclient.common import exceptions
|
|
||||||
from tackerclient.common import utils as tacker_common_utils
|
|
||||||
from tackerclient.i18n import _
|
|
||||||
from tackerclient.osc import sdk_utils
|
|
||||||
from tackerclient.osc import utils as tacker_osc_utils
|
|
||||||
from tackerclient.tacker import v1_0 as tackerV10
|
|
||||||
|
|
||||||
_attr_map = (
|
|
||||||
('id', 'ID', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('name', 'Name', tacker_osc_utils.LIST_BOTH),
|
|
||||||
('template_source', 'Template_Source',
|
|
||||||
tacker_osc_utils.LIST_BOTH),
|
|
||||||
('description', 'Description', tacker_osc_utils.LIST_BOTH),
|
|
||||||
)
|
|
||||||
|
|
||||||
_VNFD = "vnfd"
|
|
||||||
|
|
||||||
_formatters = {
|
|
||||||
'attributes': tacker_osc_utils.format_dict_with_indention,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def _get_columns(item):
|
|
||||||
column_map = {
|
|
||||||
'tenant_id': 'project_id',
|
|
||||||
}
|
|
||||||
return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map)
|
|
||||||
|
|
||||||
|
|
||||||
class CreateVNFD(command.ShowOne):
|
|
||||||
_description = _("Create a new VNFD")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(CreateVNFD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'name', metavar='NAME',
|
|
||||||
help=_('Name for VNFD'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--tenant-id', metavar='TENANT_ID',
|
|
||||||
help=_('The owner tenant ID or project ID'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--vnfd-file',
|
|
||||||
required=True,
|
|
||||||
help=_('YAML file with VNFD parameters'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--description',
|
|
||||||
help=_('Set a description for the VNFD'))
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = {_VNFD: {}}
|
|
||||||
vnfd = None
|
|
||||||
if not parsed_args.vnfd_file:
|
|
||||||
raise exceptions.InvalidInput(reason="Invalid input for vnfd file")
|
|
||||||
with open(parsed_args.vnfd_file) as f:
|
|
||||||
vnfd = f.read()
|
|
||||||
try:
|
|
||||||
vnfd = yaml.load(vnfd, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
msg = _("yaml failed to load vnfd file. %s") % e
|
|
||||||
raise exceptions.InvalidInput(reason=msg)
|
|
||||||
if not vnfd:
|
|
||||||
raise exceptions.InvalidInput(reason="vnfd file is empty")
|
|
||||||
body[_VNFD]['attributes'] = {'vnfd': vnfd}
|
|
||||||
tackerV10.update_dict(parsed_args, body[_VNFD],
|
|
||||||
['tenant_id', 'name', 'description'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
vnfd = client.create_vnfd(self.args2body(parsed_args))
|
|
||||||
display_columns, columns = _get_columns(vnfd[_VNFD])
|
|
||||||
vnfd[_VNFD]['attributes']['vnfd'] = yaml.load(
|
|
||||||
vnfd[_VNFD]['attributes']['vnfd'])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(vnfd[_VNFD]),
|
|
||||||
columns, formatters=_formatters)
|
|
||||||
return (display_columns, data)
|
|
||||||
|
|
||||||
|
|
||||||
class DeleteVNFD(command.Command):
|
|
||||||
_description = _("Delete VNFD(s).")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(DeleteVNFD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_VNFD,
|
|
||||||
metavar="<VNFD>",
|
|
||||||
nargs="+",
|
|
||||||
help=_("VNFD(s) to delete (name or ID)")
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
failure = False
|
|
||||||
deleted_ids = []
|
|
||||||
failed_items = {}
|
|
||||||
for resource_id in parsed_args.vnfd:
|
|
||||||
try:
|
|
||||||
obj = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _VNFD, resource_id)
|
|
||||||
client.delete_vnfd(obj)
|
|
||||||
deleted_ids.append(resource_id)
|
|
||||||
except Exception as e:
|
|
||||||
failure = True
|
|
||||||
failed_items[resource_id] = e
|
|
||||||
if failure:
|
|
||||||
msg = ''
|
|
||||||
if deleted_ids:
|
|
||||||
msg = (_('Successfully deleted %(resource)s(s):'
|
|
||||||
' %(deleted_list)s') % {'deleted_list':
|
|
||||||
', '.join(deleted_ids),
|
|
||||||
'resource': _VNFD})
|
|
||||||
err_msg = _("\n\nUnable to delete the below"
|
|
||||||
" %s(s):") % _VNFD
|
|
||||||
for failed_id, error in failed_items.items():
|
|
||||||
err_msg += (_('\n Cannot delete %(failed_id)s: %(error)s')
|
|
||||||
% {'failed_id': failed_id,
|
|
||||||
'error': error})
|
|
||||||
msg += err_msg
|
|
||||||
raise exceptions.CommandError(message=msg)
|
|
||||||
else:
|
|
||||||
print((_('All specified %(resource)s(s) deleted successfully')
|
|
||||||
% {'resource': _VNFD}))
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
class ListVNFD(command.Lister):
|
|
||||||
_description = ("List (VNFD)s that belong to a given tenant.")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListVNFD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'--template-source',
|
|
||||||
help=_("List VNFD with specified template source. Available \
|
|
||||||
options are 'onboarded' (default), 'inline' or 'all'"),
|
|
||||||
action='store',
|
|
||||||
default='onboarded')
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
data = client.list_vnfds()
|
|
||||||
headers, columns = tacker_osc_utils.get_column_definitions(
|
|
||||||
_attr_map, long_listing=None)
|
|
||||||
return (headers,
|
|
||||||
(utils.get_dict_properties(
|
|
||||||
s, columns,
|
|
||||||
) for s in data[_VNFD + 's']))
|
|
||||||
|
|
||||||
|
|
||||||
class ShowVNFD(command.ShowOne):
|
|
||||||
_description = _("Display VNFD details")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ShowVNFD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_VNFD,
|
|
||||||
metavar="<VNFD>",
|
|
||||||
help=_("VNFD to display (name or ID)")
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _VNFD, parsed_args.vnfd)
|
|
||||||
obj = client.show_vnfd(obj_id)
|
|
||||||
obj[_VNFD]['attributes']['vnfd'] = yaml.load(
|
|
||||||
obj[_VNFD]['attributes']['vnfd'])
|
|
||||||
display_columns, columns = _get_columns(obj[_VNFD])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(obj[_VNFD]),
|
|
||||||
columns,
|
|
||||||
formatters=_formatters)
|
|
||||||
return (display_columns, data)
|
|
||||||
|
|
||||||
|
|
||||||
class ShowTemplateVNFD(command.ShowOne):
|
|
||||||
_description = _("Display VNFD Template details")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ShowTemplateVNFD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
_VNFD,
|
|
||||||
metavar="<VNFD>",
|
|
||||||
help=_("VNFD to display (name or ID)")
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
tacker_common_utils.deprecate_legacy_warning()
|
|
||||||
client = self.app.client_manager.tackerclient
|
|
||||||
obj_id = tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
client, _VNFD, parsed_args.vnfd)
|
|
||||||
obj = client.show_vnfd(obj_id)
|
|
||||||
obj[_VNFD]['attributes']['vnfd'] = yaml.load(
|
|
||||||
obj[_VNFD]['attributes']['vnfd'])
|
|
||||||
data = utils.get_item_properties(
|
|
||||||
sdk_utils.DictModel(obj[_VNFD]),
|
|
||||||
('attributes',),
|
|
||||||
formatters=_formatters)
|
|
||||||
data = (data or _('Unable to display VNFD template!'))
|
|
||||||
return (('attributes',), data)
|
|
@@ -43,16 +43,7 @@ from tackerclient.common import exceptions as exc
|
|||||||
from tackerclient.common import extension as client_extension
|
from tackerclient.common import extension as client_extension
|
||||||
from tackerclient.common import utils
|
from tackerclient.common import utils
|
||||||
from tackerclient.i18n import _
|
from tackerclient.i18n import _
|
||||||
from tackerclient.tacker.v1_0.events import events
|
|
||||||
from tackerclient.tacker.v1_0 import extension
|
|
||||||
from tackerclient.tacker.v1_0.nfvo import ns
|
|
||||||
from tackerclient.tacker.v1_0.nfvo import nsd
|
|
||||||
from tackerclient.tacker.v1_0.nfvo import vim
|
from tackerclient.tacker.v1_0.nfvo import vim
|
||||||
from tackerclient.tacker.v1_0.nfvo import vnfcluster
|
|
||||||
from tackerclient.tacker.v1_0.nfvo import vnffg
|
|
||||||
from tackerclient.tacker.v1_0.nfvo import vnffgd
|
|
||||||
from tackerclient.tacker.v1_0.vnfm import vnf
|
|
||||||
from tackerclient.tacker.v1_0.vnfm import vnfd
|
|
||||||
from tackerclient.version import __version__
|
from tackerclient.version import __version__
|
||||||
|
|
||||||
|
|
||||||
@@ -105,79 +96,13 @@ class BashCompletionCommand(openstack_command.OpenStackCommand):
|
|||||||
|
|
||||||
COMMAND_V1 = {
|
COMMAND_V1 = {
|
||||||
'bash-completion': BashCompletionCommand,
|
'bash-completion': BashCompletionCommand,
|
||||||
'ext-list': extension.ListExt,
|
|
||||||
'ext-show': extension.ShowExt,
|
|
||||||
|
|
||||||
# MANO lingo
|
# MANO lingo
|
||||||
'vnfd-create': vnfd.CreateVNFD,
|
|
||||||
'vnfd-delete': vnfd.DeleteVNFD,
|
|
||||||
'vnfd-list': vnfd.ListVNFD,
|
|
||||||
'vnfd-show': vnfd.ShowVNFD,
|
|
||||||
'vnfd-template-show': vnfd.ShowTemplateVNFD,
|
|
||||||
|
|
||||||
'vnf-create': vnf.CreateVNF,
|
|
||||||
'vnf-update': vnf.UpdateVNF,
|
|
||||||
'vnf-delete': vnf.DeleteVNF,
|
|
||||||
'vnf-list': vnf.ListVNF,
|
|
||||||
'vnf-show': vnf.ShowVNF,
|
|
||||||
'vnf-scale': vnf.ScaleVNF,
|
|
||||||
'vnf-resource-list': vnf.ListVNFResources,
|
|
||||||
# 'vnf-config-create'
|
|
||||||
# 'vnf-config-push'
|
|
||||||
|
|
||||||
'vim-register': vim.CreateVIM,
|
'vim-register': vim.CreateVIM,
|
||||||
'vim-update': vim.UpdateVIM,
|
'vim-update': vim.UpdateVIM,
|
||||||
'vim-delete': vim.DeleteVIM,
|
'vim-delete': vim.DeleteVIM,
|
||||||
'vim-list': vim.ListVIM,
|
'vim-list': vim.ListVIM,
|
||||||
'vim-show': vim.ShowVIM,
|
'vim-show': vim.ShowVIM
|
||||||
|
|
||||||
'events-list': events.ListResourceEvents,
|
|
||||||
'event-show': events.ShowEvent,
|
|
||||||
'vnf-events-list': events.ListVNFEvents,
|
|
||||||
'vim-events-list': events.ListVIMEvents,
|
|
||||||
'vnfd-events-list': events.ListVNFDEvents,
|
|
||||||
|
|
||||||
'vnffgd-create': vnffgd.CreateVNFFGD,
|
|
||||||
'vnffgd-delete': vnffgd.DeleteVNFFGD,
|
|
||||||
'vnffgd-list': vnffgd.ListVNFFGD,
|
|
||||||
'vnffgd-show': vnffgd.ShowVNFFGD,
|
|
||||||
'vnffgd-template-show': vnffgd.ShowTemplateVNFFGD,
|
|
||||||
|
|
||||||
'vnffg-create': vnffg.CreateVNFFG,
|
|
||||||
'vnffg-delete': vnffg.DeleteVNFFG,
|
|
||||||
'vnffg-list': vnffg.ListVNFFG,
|
|
||||||
'vnffg-show': vnffg.ShowVNFFG,
|
|
||||||
'vnffg-update': vnffg.UpdateVNFFG,
|
|
||||||
|
|
||||||
'nfp-list': vnffg.ListNFP,
|
|
||||||
'nfp-show': vnffg.ShowNFP,
|
|
||||||
|
|
||||||
'chain-list': vnffg.ListSFC,
|
|
||||||
'chain-show': vnffg.ShowSFC,
|
|
||||||
|
|
||||||
'classifier-list': vnffg.ListFC,
|
|
||||||
'classifier-show': vnffg.ShowFC,
|
|
||||||
|
|
||||||
'nsd-create': nsd.CreateNSD,
|
|
||||||
'nsd-list': nsd.ListNSD,
|
|
||||||
'nsd-delete': nsd.DeleteNSD,
|
|
||||||
'nsd-show': nsd.ShowNSD,
|
|
||||||
'nsd-template-show': nsd.ShowTemplateNSD,
|
|
||||||
|
|
||||||
'ns-create': ns.CreateNS,
|
|
||||||
'ns-list': ns.ListNS,
|
|
||||||
'ns-delete': ns.DeleteNS,
|
|
||||||
'ns-show': ns.ShowNS,
|
|
||||||
|
|
||||||
'cluster-create': vnfcluster.CreateCluster,
|
|
||||||
'cluster-delete': vnfcluster.DeleteCluster,
|
|
||||||
'cluster-list': vnfcluster.ListCluster,
|
|
||||||
'cluster-show': vnfcluster.ShowCluster,
|
|
||||||
|
|
||||||
'cluster-member-add': vnfcluster.AddClusterMember,
|
|
||||||
'cluster-member-show': vnfcluster.ShowClusterMember,
|
|
||||||
'cluster-member-list': vnfcluster.ListClusterMember,
|
|
||||||
'cluster-member-delete': vnfcluster.DeleteClusterMember,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
COMMANDS = {'1.0': COMMAND_V1}
|
COMMANDS = {'1.0': COMMAND_V1}
|
||||||
|
@@ -374,12 +374,12 @@ class TackerCommand(command.OpenStackCommand, metaclass=TackerCommandMeta):
|
|||||||
parser = super(TackerCommand, self).get_parser(prog_name)
|
parser = super(TackerCommand, self).get_parser(prog_name)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--request-format',
|
'--request-format',
|
||||||
help=_('The xml or json request format'),
|
help=_('The json request format'),
|
||||||
default='json',
|
default='json',
|
||||||
choices=['json', 'xml', ], )
|
choices=['json', ], )
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--request_format',
|
'--request_format',
|
||||||
choices=['json', 'xml', ],
|
choices=['json', ],
|
||||||
help=argparse.SUPPRESS)
|
help=argparse.SUPPRESS)
|
||||||
|
|
||||||
return parser
|
return parser
|
||||||
|
@@ -1,95 +0,0 @@
|
|||||||
# Copyright 2016 Brocade Communications Systems Inc
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
from tackerclient.tacker import v1_0 as tackerV10
|
|
||||||
|
|
||||||
_EVENT = "event"
|
|
||||||
|
|
||||||
|
|
||||||
class ListEventsBase(tackerV10.ListCommand):
|
|
||||||
"""Base class for list command."""
|
|
||||||
|
|
||||||
list_columns = ['id', 'resource_type', 'resource_id',
|
|
||||||
'resource_state', 'event_type',
|
|
||||||
'timestamp', 'event_details']
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListEventsBase, self).get_parser(prog_name)
|
|
||||||
parser.add_argument('--id',
|
|
||||||
help='id of the event to look up.')
|
|
||||||
parser.add_argument('--resource-id',
|
|
||||||
help='resource id of the events to look up.')
|
|
||||||
parser.add_argument('--resource-state',
|
|
||||||
help='resource state of the events to look up.')
|
|
||||||
parser.add_argument('--event-type',
|
|
||||||
help='event type of the events to look up.')
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2search_opts(self, parsed_args):
|
|
||||||
search_opts = super(ListEventsBase, self).args2search_opts(
|
|
||||||
parsed_args)
|
|
||||||
if parsed_args.id:
|
|
||||||
search_opts.update({'id': parsed_args.id})
|
|
||||||
if parsed_args.resource_id:
|
|
||||||
search_opts.update({'resource_id': parsed_args.resource_id})
|
|
||||||
if parsed_args.resource_state:
|
|
||||||
search_opts.update({'resource_state': parsed_args.resource_state})
|
|
||||||
if parsed_args.event_type:
|
|
||||||
search_opts.update({'event_type': parsed_args.event_type})
|
|
||||||
return search_opts
|
|
||||||
|
|
||||||
|
|
||||||
class ListResourceEvents(ListEventsBase):
|
|
||||||
"""List events of resources."""
|
|
||||||
|
|
||||||
resource = _EVENT
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListResourceEvents, self).get_parser(prog_name)
|
|
||||||
parser.add_argument('--resource-type',
|
|
||||||
help='resource type of the events to look up.')
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2search_opts(self, parsed_args):
|
|
||||||
search_opts = super(ListResourceEvents, self).args2search_opts(
|
|
||||||
parsed_args)
|
|
||||||
if parsed_args.resource_type:
|
|
||||||
search_opts.update({'resource_type': parsed_args.resource_type})
|
|
||||||
return search_opts
|
|
||||||
|
|
||||||
|
|
||||||
class ListVNFEvents(ListEventsBase):
|
|
||||||
"""List events of VNFs."""
|
|
||||||
|
|
||||||
resource = "vnf_event"
|
|
||||||
|
|
||||||
|
|
||||||
class ListVNFDEvents(ListEventsBase):
|
|
||||||
"""List events of VNFDs."""
|
|
||||||
|
|
||||||
resource = "vnfd_event"
|
|
||||||
|
|
||||||
|
|
||||||
class ListVIMEvents(ListEventsBase):
|
|
||||||
"""List events of VIMs."""
|
|
||||||
|
|
||||||
resource = "vim_event"
|
|
||||||
|
|
||||||
|
|
||||||
class ShowEvent(tackerV10.ShowCommand):
|
|
||||||
"""Show event given the event id."""
|
|
||||||
|
|
||||||
resource = _EVENT
|
|
@@ -1,34 +0,0 @@
|
|||||||
# Copyright 2012 OpenStack Foundation.
|
|
||||||
# All Rights Reserved
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
from tackerclient.tacker import v1_0 as cmd_base
|
|
||||||
|
|
||||||
|
|
||||||
class ListExt(cmd_base.ListCommand):
|
|
||||||
"""List all extensions."""
|
|
||||||
|
|
||||||
resource = 'extension'
|
|
||||||
list_columns = ['alias', 'name']
|
|
||||||
|
|
||||||
|
|
||||||
class ShowExt(cmd_base.ShowCommand):
|
|
||||||
"""Show information of a given resource."""
|
|
||||||
|
|
||||||
resource = "extension"
|
|
||||||
allow_names = False
|
|
||||||
|
|
||||||
def get_id(self):
|
|
||||||
return 'EXT-ALIAS'
|
|
@@ -1,139 +0,0 @@
|
|||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from tackerclient.common import exceptions
|
|
||||||
from tackerclient.i18n import _
|
|
||||||
from tackerclient.tacker import v1_0 as tackerV10
|
|
||||||
|
|
||||||
|
|
||||||
_NS = 'ns'
|
|
||||||
_RESOURCE = 'resource'
|
|
||||||
|
|
||||||
|
|
||||||
class ListNS(tackerV10.ListCommand):
|
|
||||||
"""List NS that belong to a given tenant."""
|
|
||||||
|
|
||||||
resource = _NS
|
|
||||||
list_columns = ['id', 'name', 'nsd_id', 'vnf_ids', 'vnffg_ids',
|
|
||||||
'mgmt_ip_addresses', 'status']
|
|
||||||
|
|
||||||
|
|
||||||
class ShowNS(tackerV10.ShowCommand):
|
|
||||||
"""Show information of a given NS."""
|
|
||||||
|
|
||||||
resource = _NS
|
|
||||||
|
|
||||||
|
|
||||||
class CreateNS(tackerV10.CreateCommand):
|
|
||||||
"""Create a NS."""
|
|
||||||
|
|
||||||
resource = _NS
|
|
||||||
remove_output_fields = ["attributes"]
|
|
||||||
|
|
||||||
def add_known_arguments(self, parser):
|
|
||||||
parser.add_argument(
|
|
||||||
'name', metavar='NAME',
|
|
||||||
help=_('Set a name for the NS'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--description',
|
|
||||||
help=_('Set description for the NS'))
|
|
||||||
nsd_group = parser.add_mutually_exclusive_group(required=True)
|
|
||||||
nsd_group.add_argument(
|
|
||||||
'--nsd-id',
|
|
||||||
help=_('NSD ID to use as template to create NS'))
|
|
||||||
nsd_group.add_argument(
|
|
||||||
'--nsd-template',
|
|
||||||
help=_('NSD file to create NS'))
|
|
||||||
nsd_group.add_argument(
|
|
||||||
'--nsd-name',
|
|
||||||
help=_('NSD name to use as template to create NS'))
|
|
||||||
vim_group = parser.add_mutually_exclusive_group()
|
|
||||||
vim_group.add_argument(
|
|
||||||
'--vim-id',
|
|
||||||
help=_('VIM ID to use to create NS on the specified VIM'))
|
|
||||||
vim_group.add_argument(
|
|
||||||
'--vim-name',
|
|
||||||
help=_('VIM name to use to create NS on the specified VIM'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--vim-region-name',
|
|
||||||
help=_('VIM Region to use to create NS on the specified VIM'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--param-file',
|
|
||||||
help=_('Specify parameter yaml file'))
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
args = {'attributes': {}}
|
|
||||||
body = {self.resource: args}
|
|
||||||
if parsed_args.vim_region_name:
|
|
||||||
args.setdefault('placement_attr', {})['region_name'] = \
|
|
||||||
parsed_args.vim_region_name
|
|
||||||
|
|
||||||
tacker_client = self.get_client()
|
|
||||||
tacker_client.format = parsed_args.request_format
|
|
||||||
if parsed_args.vim_name:
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(tacker_client,
|
|
||||||
'vim',
|
|
||||||
parsed_args.
|
|
||||||
vim_name)
|
|
||||||
parsed_args.vim_id = _id
|
|
||||||
if parsed_args.nsd_name:
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(tacker_client,
|
|
||||||
'nsd',
|
|
||||||
parsed_args.
|
|
||||||
nsd_name)
|
|
||||||
parsed_args.nsd_id = _id
|
|
||||||
elif parsed_args.nsd_template:
|
|
||||||
with open(parsed_args.nsd_template) as f:
|
|
||||||
template = f.read()
|
|
||||||
try:
|
|
||||||
args['nsd_template'] = yaml.load(
|
|
||||||
template, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not args['nsd_template']:
|
|
||||||
raise exceptions.InvalidInput(reason='The nsd file is empty')
|
|
||||||
|
|
||||||
if parsed_args.param_file:
|
|
||||||
with open(parsed_args.param_file) as f:
|
|
||||||
param_yaml = f.read()
|
|
||||||
try:
|
|
||||||
args['attributes']['param_values'] = yaml.load(
|
|
||||||
param_yaml, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
tackerV10.update_dict(parsed_args, body[self.resource],
|
|
||||||
['tenant_id', 'name', 'description',
|
|
||||||
'nsd_id', 'vim_id'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
|
|
||||||
class DeleteNS(tackerV10.DeleteCommand):
|
|
||||||
"""Delete given NS(s)."""
|
|
||||||
|
|
||||||
resource = _NS
|
|
||||||
deleted_msg = {'ns': 'delete initiated'}
|
|
||||||
|
|
||||||
def add_known_arguments(self, parser):
|
|
||||||
parser.add_argument(
|
|
||||||
'--force',
|
|
||||||
default=False,
|
|
||||||
action='store_true',
|
|
||||||
help=_('Force delete Network Service'))
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
if parsed_args.force:
|
|
||||||
body = {self.resource: {'attributes': {'force': True}}}
|
|
||||||
else:
|
|
||||||
body = dict()
|
|
||||||
return body
|
|
@@ -1,100 +0,0 @@
|
|||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from oslo_serialization import jsonutils
|
|
||||||
|
|
||||||
from tackerclient.i18n import _
|
|
||||||
from tackerclient.tacker import v1_0 as tackerV10
|
|
||||||
|
|
||||||
_NSD = "nsd"
|
|
||||||
|
|
||||||
|
|
||||||
class ListNSD(tackerV10.ListCommand):
|
|
||||||
"""List NSDs that belong to a given tenant."""
|
|
||||||
|
|
||||||
resource = _NSD
|
|
||||||
list_columns = ['id', 'name', 'template_source', 'description']
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListNSD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'--template-source',
|
|
||||||
help=_("List NSD with specified template source. Available \
|
|
||||||
options are 'onboared' (default), 'inline' or 'all'"),
|
|
||||||
action='store',
|
|
||||||
default='onboarded')
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2search_opts(self, parsed_args):
|
|
||||||
search_opts = super(ListNSD, self).args2search_opts(parsed_args)
|
|
||||||
template_source = parsed_args.template_source
|
|
||||||
if parsed_args.template_source:
|
|
||||||
search_opts.update({'template_source': template_source})
|
|
||||||
return search_opts
|
|
||||||
|
|
||||||
|
|
||||||
class ShowNSD(tackerV10.ShowCommand):
|
|
||||||
"""Show information of a given NSD."""
|
|
||||||
|
|
||||||
resource = _NSD
|
|
||||||
|
|
||||||
|
|
||||||
class CreateNSD(tackerV10.CreateCommand):
|
|
||||||
"""Create a NSD."""
|
|
||||||
resource = _NSD
|
|
||||||
remove_output_fields = ["attributes"]
|
|
||||||
|
|
||||||
def add_known_arguments(self, parser):
|
|
||||||
parser.add_argument('--nsd-file', help='Specify NSD file',
|
|
||||||
required=True)
|
|
||||||
parser.add_argument(
|
|
||||||
'name', metavar='NAME',
|
|
||||||
help='Set a name for the NSD')
|
|
||||||
parser.add_argument(
|
|
||||||
'--description',
|
|
||||||
help='Set a description for the NSD')
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = {self.resource: {}}
|
|
||||||
nsd = None
|
|
||||||
with open(parsed_args.nsd_file) as f:
|
|
||||||
nsd = yaml.safe_load(f.read())
|
|
||||||
tackerV10.update_dict(parsed_args, body[self.resource],
|
|
||||||
['tenant_id', 'name', 'description'])
|
|
||||||
if nsd:
|
|
||||||
body[self.resource]['attributes'] = {'nsd': nsd}
|
|
||||||
|
|
||||||
return body
|
|
||||||
|
|
||||||
|
|
||||||
class DeleteNSD(tackerV10.DeleteCommand):
|
|
||||||
"""Delete a given NSD."""
|
|
||||||
resource = _NSD
|
|
||||||
|
|
||||||
|
|
||||||
class ShowTemplateNSD(tackerV10.ShowCommand):
|
|
||||||
"""Show template of a given NSD."""
|
|
||||||
resource = _NSD
|
|
||||||
|
|
||||||
def run(self, parsed_args):
|
|
||||||
self.log.debug('run(%s)', parsed_args)
|
|
||||||
template = None
|
|
||||||
data = self.get_data(parsed_args)
|
|
||||||
try:
|
|
||||||
attributes_index = data[0].index('attributes')
|
|
||||||
attributes_json = data[1][attributes_index]
|
|
||||||
template = jsonutils.loads(attributes_json).get('nsd', None)
|
|
||||||
except (IndexError, TypeError, ValueError) as e:
|
|
||||||
self.log.debug('Data handling error: %s', str(e))
|
|
||||||
print(template or _('Unable to display NSD template!'))
|
|
@@ -1,191 +0,0 @@
|
|||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
from tackerclient.tacker import v1_0 as tackerV10
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
_CLUSTER = 'cluster'
|
|
||||||
_CLUSTER_MEMBER = 'clustermember'
|
|
||||||
|
|
||||||
|
|
||||||
class ListCluster(tackerV10.ListCommand):
|
|
||||||
"""List Clusters that belong to a given tenant."""
|
|
||||||
|
|
||||||
resource = _CLUSTER
|
|
||||||
list_columns = ['id', 'name', 'vnfd_id', 'status', 'vip_endpoint']
|
|
||||||
|
|
||||||
|
|
||||||
class ShowCluster(tackerV10.ShowCommand):
|
|
||||||
"""Show information of a given Cluster."""
|
|
||||||
|
|
||||||
resource = _CLUSTER
|
|
||||||
|
|
||||||
|
|
||||||
class DeleteCluster(tackerV10.DeleteCommand):
|
|
||||||
"""Delete a given Cluster."""
|
|
||||||
|
|
||||||
resource = _CLUSTER
|
|
||||||
|
|
||||||
|
|
||||||
class CreateCluster(tackerV10.CreateCommand):
|
|
||||||
"""Create a Cluster."""
|
|
||||||
|
|
||||||
resource = _CLUSTER
|
|
||||||
|
|
||||||
def add_known_arguments(self, parser):
|
|
||||||
parser.add_argument(
|
|
||||||
'name', metavar='NAME',
|
|
||||||
help='Set a name for the VNF cluster')
|
|
||||||
vnfd_group = parser.add_mutually_exclusive_group(required=True)
|
|
||||||
vnfd_group.add_argument(
|
|
||||||
'--vnfd-id',
|
|
||||||
help='VNFD ID to use as template to create member VNF')
|
|
||||||
vnfd_group.add_argument(
|
|
||||||
'--vnfd-name',
|
|
||||||
help='VNFD name to use as template to create member VNF')
|
|
||||||
parser.add_argument('--policy-file',
|
|
||||||
help='Specify policy file for cluster',
|
|
||||||
required=True)
|
|
||||||
parser.add_argument(
|
|
||||||
'--description',
|
|
||||||
help='Set a description for the created VNF cluster')
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = {self.resource: {}}
|
|
||||||
tacker_client = self.get_client()
|
|
||||||
tacker_client.format = parsed_args.request_format
|
|
||||||
|
|
||||||
if parsed_args.vnfd_name:
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(tacker_client,
|
|
||||||
'vnfd',
|
|
||||||
parsed_args.
|
|
||||||
vnfd_name)
|
|
||||||
parsed_args.vnfd_id = _id
|
|
||||||
policy_info = None
|
|
||||||
with open(parsed_args.policy_file) as f:
|
|
||||||
policy_info = yaml.safe_load(f.read())
|
|
||||||
tackerV10.update_dict(parsed_args, body[self.resource],
|
|
||||||
['tenant_id', 'name', 'vnfd_id', 'description'])
|
|
||||||
if policy_info:
|
|
||||||
body[self.resource]['policy_info'] = policy_info
|
|
||||||
return body
|
|
||||||
|
|
||||||
|
|
||||||
class AddClusterMember(tackerV10.CreateCommand):
|
|
||||||
"""Add a new Cluster Member to given Cluster."""
|
|
||||||
|
|
||||||
resource = _CLUSTER_MEMBER
|
|
||||||
|
|
||||||
def add_known_arguments(self, parser):
|
|
||||||
parser.add_argument(
|
|
||||||
'name', metavar='NAME',
|
|
||||||
help='Set a name for the VNF cluster member')
|
|
||||||
cluster_group = parser.add_mutually_exclusive_group()
|
|
||||||
cluster_group.add_argument(
|
|
||||||
'--cluster-id',
|
|
||||||
help='VNFD ID to use as template to create member VNF')
|
|
||||||
cluster_group.add_argument(
|
|
||||||
'--cluster-name',
|
|
||||||
help='VNFD name to use as template to create member VNF')
|
|
||||||
vnfd_group = parser.add_mutually_exclusive_group()
|
|
||||||
vnfd_group.add_argument(
|
|
||||||
'--vnfd-id',
|
|
||||||
help='Set a id for the VNFD')
|
|
||||||
vnfd_group.add_argument(
|
|
||||||
'--vnfd-name',
|
|
||||||
help='Set a name for the VNFD')
|
|
||||||
parser.add_argument(
|
|
||||||
'--role',
|
|
||||||
help='Set a [Active/Standby] role to cluster member',
|
|
||||||
required=True)
|
|
||||||
vim_group = parser.add_mutually_exclusive_group()
|
|
||||||
vim_group.add_argument(
|
|
||||||
'--vim-id',
|
|
||||||
help='Set a VIM ID to deploy cluster member')
|
|
||||||
vim_group.add_argument(
|
|
||||||
'--vim-name',
|
|
||||||
help='Set a VIM name to deploy cluster member')
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = {self.resource: {}}
|
|
||||||
|
|
||||||
tacker_client = self.get_client()
|
|
||||||
tacker_client.format = parsed_args.request_format
|
|
||||||
if parsed_args.cluster_name:
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(tacker_client,
|
|
||||||
'cluster',
|
|
||||||
parsed_args.
|
|
||||||
cluster_name)
|
|
||||||
parsed_args.cluster_id = _id
|
|
||||||
if parsed_args.vnfd_name:
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(tacker_client,
|
|
||||||
'vnfd',
|
|
||||||
parsed_args.
|
|
||||||
vnfd_name)
|
|
||||||
parsed_args.vnfd_id = _id
|
|
||||||
parsed_args.role = parsed_args.role.upper()
|
|
||||||
if parsed_args.vim_name:
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(tacker_client,
|
|
||||||
'vim',
|
|
||||||
parsed_args.
|
|
||||||
vim_name)
|
|
||||||
parsed_args.vim_id = _id
|
|
||||||
tackerV10.update_dict(parsed_args, body[self.resource],
|
|
||||||
['tenant_id', 'name', 'cluster_id', 'vnfd_id',
|
|
||||||
'role', 'vim_id'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
|
|
||||||
class ListClusterMember(tackerV10.ListCommand):
|
|
||||||
"""List Cluster Members that belong to a given tenant."""
|
|
||||||
|
|
||||||
resource = _CLUSTER_MEMBER
|
|
||||||
|
|
||||||
def add_known_arguments(self, parser):
|
|
||||||
cluster_group = parser.add_mutually_exclusive_group(required=True)
|
|
||||||
cluster_group.add_argument(
|
|
||||||
'--cluster-id',
|
|
||||||
help='Set a ID for the queried cluster')
|
|
||||||
cluster_group.add_argument(
|
|
||||||
'--cluster-name',
|
|
||||||
help='Set a name for the queried cluster')
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = {self.resource: {}}
|
|
||||||
tacker_client = self.get_client()
|
|
||||||
tacker_client.format = parsed_args.request_format
|
|
||||||
|
|
||||||
if parsed_args.cluster_name:
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(tacker_client,
|
|
||||||
'cluster',
|
|
||||||
parsed_args.
|
|
||||||
cluster_name)
|
|
||||||
parsed_args.cluster_id = _id
|
|
||||||
|
|
||||||
tackerV10.update_dict(parsed_args, body[self.resource],
|
|
||||||
['tenant_id', 'cluster_id'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
list_columns = ['id', 'name', 'cluster_id', 'role', 'vnf_id',
|
|
||||||
'vim_id', 'mgmt_ip_address', 'lb_member_id']
|
|
||||||
|
|
||||||
|
|
||||||
class DeleteClusterMember(tackerV10.DeleteCommand):
|
|
||||||
"""Delete a given Cluster Member."""
|
|
||||||
|
|
||||||
resource = _CLUSTER_MEMBER
|
|
||||||
|
|
||||||
|
|
||||||
class ShowClusterMember(tackerV10.ShowCommand):
|
|
||||||
"""Show information of a given Cluster Member."""
|
|
||||||
|
|
||||||
resource = _CLUSTER_MEMBER
|
|
@@ -1,249 +0,0 @@
|
|||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from tackerclient.common import exceptions
|
|
||||||
from tackerclient.i18n import _
|
|
||||||
from tackerclient.tacker import v1_0 as tackerV10
|
|
||||||
|
|
||||||
|
|
||||||
_VNFFG = 'vnffg'
|
|
||||||
_NFP = 'nfp'
|
|
||||||
_SFC = 'sfc'
|
|
||||||
_FC = 'classifier'
|
|
||||||
|
|
||||||
|
|
||||||
class ListFC(tackerV10.ListCommand):
|
|
||||||
"""List FCs that belong to a given tenant."""
|
|
||||||
|
|
||||||
resource = _FC
|
|
||||||
list_columns = ['id', 'status', 'nfp_id', 'chain_id']
|
|
||||||
|
|
||||||
def extend_list(self, data, parsed_args):
|
|
||||||
"""Update the list_columns list.
|
|
||||||
|
|
||||||
This method update the list_columns list by adding the
|
|
||||||
'name' column in case the retrieved FC list from the tacker
|
|
||||||
server side contains the names of the FCs.
|
|
||||||
"""
|
|
||||||
for item in data:
|
|
||||||
if 'name' in item:
|
|
||||||
self.list_columns.insert(1, 'name')
|
|
||||||
break
|
|
||||||
|
|
||||||
|
|
||||||
class ShowFC(tackerV10.ShowCommand):
|
|
||||||
"""Show information of a given FC."""
|
|
||||||
|
|
||||||
resource = _FC
|
|
||||||
|
|
||||||
|
|
||||||
class ListSFC(tackerV10.ListCommand):
|
|
||||||
"""List SFCs that belong to a given tenant."""
|
|
||||||
|
|
||||||
resource = _SFC
|
|
||||||
list_columns = ['id', 'status', 'nfp_id']
|
|
||||||
|
|
||||||
|
|
||||||
class ShowSFC(tackerV10.ShowCommand):
|
|
||||||
"""Show information of a given SFC."""
|
|
||||||
|
|
||||||
resource = _SFC
|
|
||||||
|
|
||||||
|
|
||||||
class ListNFP(tackerV10.ListCommand):
|
|
||||||
"""List NFPs that belong to a given tenant."""
|
|
||||||
|
|
||||||
resource = _NFP
|
|
||||||
list_columns = ['id', 'name', 'status', 'vnffg_id', 'path_id']
|
|
||||||
|
|
||||||
|
|
||||||
class ShowNFP(tackerV10.ShowCommand):
|
|
||||||
"""Show information of a given NFP."""
|
|
||||||
|
|
||||||
resource = _NFP
|
|
||||||
|
|
||||||
|
|
||||||
class ListVNFFG(tackerV10.ListCommand):
|
|
||||||
"""List VNFFGs that belong to a given tenant."""
|
|
||||||
|
|
||||||
resource = _VNFFG
|
|
||||||
list_columns = ['id', 'name', 'ns_id',
|
|
||||||
'description', 'status', 'vnffgd_id']
|
|
||||||
|
|
||||||
|
|
||||||
class ShowVNFFG(tackerV10.ShowCommand):
|
|
||||||
"""Show information of a given VNFFG."""
|
|
||||||
|
|
||||||
resource = _VNFFG
|
|
||||||
|
|
||||||
|
|
||||||
class CreateVNFFG(tackerV10.CreateCommand):
|
|
||||||
"""Create a VNFFG."""
|
|
||||||
|
|
||||||
resource = _VNFFG
|
|
||||||
remove_output_fields = ["attributes"]
|
|
||||||
|
|
||||||
def add_known_arguments(self, parser):
|
|
||||||
parser.add_argument(
|
|
||||||
'name', metavar='NAME',
|
|
||||||
help=_('Set a name for the VNFFG'))
|
|
||||||
vnffgd_group = parser.add_mutually_exclusive_group(required=True)
|
|
||||||
vnffgd_group.add_argument(
|
|
||||||
'--vnffgd-id',
|
|
||||||
help=_('VNFFGD ID to use as template to create VNFFG'))
|
|
||||||
vnffgd_group.add_argument(
|
|
||||||
'--vnffgd-name',
|
|
||||||
help=_('VNFFGD Name to use as template to create VNFFG'))
|
|
||||||
vnffgd_group.add_argument(
|
|
||||||
'--vnffgd-template',
|
|
||||||
help=_('VNFFGD file to create VNFFG'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--vnf-mapping',
|
|
||||||
help=_('List of logical VNFD name to VNF instance name mapping. '
|
|
||||||
'Example: VNF1:my_vnf1,VNF2:my_vnf2'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--symmetrical',
|
|
||||||
action='store_true',
|
|
||||||
default=False,
|
|
||||||
help=_('Should a reverse path be created for the NFP'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--param-file',
|
|
||||||
help='Specify parameter yaml file'
|
|
||||||
)
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
args = {'attributes': {}}
|
|
||||||
body = {self.resource: args}
|
|
||||||
|
|
||||||
tacker_client = self.get_client()
|
|
||||||
tacker_client.format = parsed_args.request_format
|
|
||||||
|
|
||||||
if parsed_args.vnf_mapping:
|
|
||||||
_vnf_mapping = dict()
|
|
||||||
_vnf_mappings = parsed_args.vnf_mapping.split(",")
|
|
||||||
for mapping in _vnf_mappings:
|
|
||||||
vnfd_name, vnf = mapping.split(":", 1)
|
|
||||||
_vnf_mapping[vnfd_name] = \
|
|
||||||
tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
tacker_client, 'vnf', vnf)
|
|
||||||
|
|
||||||
parsed_args.vnf_mapping = _vnf_mapping
|
|
||||||
|
|
||||||
if parsed_args.vnffgd_name:
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(tacker_client,
|
|
||||||
'vnffgd',
|
|
||||||
parsed_args.
|
|
||||||
vnffgd_name)
|
|
||||||
parsed_args.vnffgd_id = _id
|
|
||||||
elif parsed_args.vnffgd_template:
|
|
||||||
with open(parsed_args.vnffgd_template) as f:
|
|
||||||
template = f.read()
|
|
||||||
try:
|
|
||||||
args['vnffgd_template'] = yaml.load(
|
|
||||||
template, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not args['vnffgd_template']:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason='The vnffgd file is empty')
|
|
||||||
|
|
||||||
if parsed_args.param_file:
|
|
||||||
with open(parsed_args.param_file) as f:
|
|
||||||
param_yaml = f.read()
|
|
||||||
try:
|
|
||||||
args['attributes']['param_values'] = yaml.load(
|
|
||||||
param_yaml, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
|
|
||||||
tackerV10.update_dict(parsed_args, body[self.resource],
|
|
||||||
['tenant_id', 'name', 'vnffgd_id',
|
|
||||||
'symmetrical', 'vnf_mapping'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
|
|
||||||
class UpdateVNFFG(tackerV10.UpdateCommand):
|
|
||||||
"""Update a given VNFFG."""
|
|
||||||
|
|
||||||
resource = _VNFFG
|
|
||||||
|
|
||||||
def add_known_arguments(self, parser):
|
|
||||||
parser.add_argument(
|
|
||||||
'--vnffgd-template',
|
|
||||||
help=_('VNFFGD file to update VNFFG')
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
'--vnf-mapping',
|
|
||||||
help=_('List of logical VNFD name to VNF instance name mapping. '
|
|
||||||
'Example: VNF1:my_vnf1,VNF2:my_vnf2'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--symmetrical',
|
|
||||||
action='store_true',
|
|
||||||
default=False,
|
|
||||||
help=_('Should a reverse path be created for the NFP'))
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
args = {}
|
|
||||||
body = {self.resource: args}
|
|
||||||
|
|
||||||
tacker_client = self.get_client()
|
|
||||||
tacker_client.format = parsed_args.request_format
|
|
||||||
|
|
||||||
if parsed_args.vnf_mapping:
|
|
||||||
_vnf_mapping = dict()
|
|
||||||
_vnf_mappings = parsed_args.vnf_mapping.split(",")
|
|
||||||
for mapping in _vnf_mappings:
|
|
||||||
vnfd_name, vnf = mapping.split(":", 1)
|
|
||||||
_vnf_mapping[vnfd_name] = \
|
|
||||||
tackerV10.find_resourceid_by_name_or_id(
|
|
||||||
tacker_client, 'vnf', vnf)
|
|
||||||
|
|
||||||
parsed_args.vnf_mapping = _vnf_mapping
|
|
||||||
|
|
||||||
if parsed_args.vnffgd_template:
|
|
||||||
with open(parsed_args.vnffgd_template) as f:
|
|
||||||
template = f.read()
|
|
||||||
try:
|
|
||||||
args['vnffgd_template'] = yaml.load(
|
|
||||||
template, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not args['vnffgd_template']:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason='The vnffgd template is empty')
|
|
||||||
|
|
||||||
tackerV10.update_dict(parsed_args, body[self.resource],
|
|
||||||
['tenant_id', 'vnf_mapping', 'symmetrical'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
|
|
||||||
class DeleteVNFFG(tackerV10.DeleteCommand):
|
|
||||||
"""Delete a given VNFFG."""
|
|
||||||
|
|
||||||
resource = _VNFFG
|
|
||||||
remove_output_fields = ["attributes"]
|
|
||||||
|
|
||||||
def add_known_arguments(self, parser):
|
|
||||||
parser.add_argument(
|
|
||||||
'--force',
|
|
||||||
default=False,
|
|
||||||
action='store_true',
|
|
||||||
help=_('Force delete VNFFG'))
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = dict()
|
|
||||||
if parsed_args.force:
|
|
||||||
body[self.resource] = dict()
|
|
||||||
body[self.resource]['attributes'] = {'force': True}
|
|
||||||
return body
|
|
@@ -1,97 +0,0 @@
|
|||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from oslo_serialization import jsonutils
|
|
||||||
|
|
||||||
from tackerclient.i18n import _
|
|
||||||
from tackerclient.tacker import v1_0 as tackerV10
|
|
||||||
|
|
||||||
_VNFFGD = "vnffgd"
|
|
||||||
|
|
||||||
|
|
||||||
class ListVNFFGD(tackerV10.ListCommand):
|
|
||||||
"""List VNFFGDs that belong to a given tenant."""
|
|
||||||
|
|
||||||
resource = _VNFFGD
|
|
||||||
list_columns = ['id', 'name', 'template_source', 'description']
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListVNFFGD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'--template-source',
|
|
||||||
help=_("List VNFFGD with specified template source. Available \
|
|
||||||
options are 'onboarded' (default), 'inline' or 'all'"),
|
|
||||||
action='store',
|
|
||||||
default='onboarded')
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2search_opts(self, parsed_args):
|
|
||||||
search_opts = super(ListVNFFGD, self).args2search_opts(parsed_args)
|
|
||||||
template_source = parsed_args.template_source
|
|
||||||
if parsed_args.template_source:
|
|
||||||
search_opts.update({'template_source': template_source})
|
|
||||||
return search_opts
|
|
||||||
|
|
||||||
|
|
||||||
class ShowVNFFGD(tackerV10.ShowCommand):
|
|
||||||
"""Show information of a given VNFFGD."""
|
|
||||||
|
|
||||||
resource = _VNFFGD
|
|
||||||
|
|
||||||
|
|
||||||
class CreateVNFFGD(tackerV10.CreateCommand):
|
|
||||||
"""Create a VNFFGD."""
|
|
||||||
resource = _VNFFGD
|
|
||||||
remove_output_fields = ["attributes"]
|
|
||||||
|
|
||||||
def add_known_arguments(self, parser):
|
|
||||||
parser.add_argument('--vnffgd-file', help=_('Specify VNFFGD file'))
|
|
||||||
parser.add_argument(
|
|
||||||
'name', metavar='NAME',
|
|
||||||
help=_('Set a name for the VNFFGD'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--description',
|
|
||||||
help=_('Set a description for the VNFFGD'))
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = {self.resource: {}}
|
|
||||||
if parsed_args.vnffgd_file:
|
|
||||||
with open(parsed_args.vnffgd_file) as f:
|
|
||||||
vnffgd = yaml.safe_load(f.read())
|
|
||||||
body[self.resource]['template'] = {'vnffgd': vnffgd}
|
|
||||||
tackerV10.update_dict(parsed_args, body[self.resource],
|
|
||||||
['tenant_id', 'name', 'description'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
|
|
||||||
class DeleteVNFFGD(tackerV10.DeleteCommand):
|
|
||||||
"""Delete a given VNFFGD."""
|
|
||||||
resource = _VNFFGD
|
|
||||||
|
|
||||||
|
|
||||||
class ShowTemplateVNFFGD(tackerV10.ShowCommand):
|
|
||||||
"""Show template of a given VNFFGD."""
|
|
||||||
resource = _VNFFGD
|
|
||||||
|
|
||||||
def run(self, parsed_args):
|
|
||||||
self.log.debug('run(%s)', parsed_args)
|
|
||||||
template = None
|
|
||||||
data = self.get_data(parsed_args)
|
|
||||||
try:
|
|
||||||
attributes_index = data[0].index('template')
|
|
||||||
attributes_json = data[1][attributes_index]
|
|
||||||
template = jsonutils.loads(attributes_json).get('vnffgd', None)
|
|
||||||
except (IndexError, TypeError, ValueError) as e:
|
|
||||||
self.log.debug('Data handling error: %s', str(e))
|
|
||||||
print(template or _('Unable to display VNFFGD template!'))
|
|
@@ -1,341 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright 2013 Intel Corporation
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from oslo_utils import encodeutils
|
|
||||||
|
|
||||||
from tackerclient.common import exceptions
|
|
||||||
from tackerclient.i18n import _
|
|
||||||
from tackerclient.tacker import v1_0 as tackerV10
|
|
||||||
|
|
||||||
|
|
||||||
_VNF = 'vnf'
|
|
||||||
_RESOURCE = 'resource'
|
|
||||||
|
|
||||||
|
|
||||||
class ListVNF(tackerV10.ListCommand):
|
|
||||||
"""List VNF that belong to a given tenant."""
|
|
||||||
|
|
||||||
resource = _VNF
|
|
||||||
list_columns = ['id', 'name', 'mgmt_ip_address', 'status',
|
|
||||||
'vim_id', 'vnfd_id']
|
|
||||||
|
|
||||||
|
|
||||||
class ShowVNF(tackerV10.ShowCommand):
|
|
||||||
"""Show information of a given VNF."""
|
|
||||||
|
|
||||||
resource = _VNF
|
|
||||||
|
|
||||||
|
|
||||||
class CreateVNF(tackerV10.CreateCommand):
|
|
||||||
"""Create a VNF."""
|
|
||||||
|
|
||||||
resource = _VNF
|
|
||||||
remove_output_fields = ["attributes"]
|
|
||||||
|
|
||||||
def add_known_arguments(self, parser):
|
|
||||||
parser.add_argument(
|
|
||||||
'name', metavar='NAME',
|
|
||||||
help=_('Set a name for the VNF'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--description',
|
|
||||||
help=_('Set description for the VNF'))
|
|
||||||
vnfd_group = parser.add_mutually_exclusive_group(required=True)
|
|
||||||
vnfd_group.add_argument(
|
|
||||||
'--vnfd-id',
|
|
||||||
help=_('VNFD ID to use as template to create VNF'))
|
|
||||||
vnfd_group.add_argument(
|
|
||||||
'--vnfd-name',
|
|
||||||
help=_('VNFD Name to use as template to create VNF'))
|
|
||||||
vnfd_group.add_argument(
|
|
||||||
'--vnfd-template',
|
|
||||||
help=_("VNFD file to create VNF"))
|
|
||||||
vim_group = parser.add_mutually_exclusive_group()
|
|
||||||
vim_group.add_argument(
|
|
||||||
'--vim-id',
|
|
||||||
help=_('VIM ID to use to create VNF on the specified VIM'))
|
|
||||||
vim_group.add_argument(
|
|
||||||
'--vim-name',
|
|
||||||
help=_('VIM name to use to create VNF on the specified VIM'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--vim-region-name',
|
|
||||||
help=_('VIM Region to use to create VNF on the specified VIM'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--config-file',
|
|
||||||
help=_('YAML file with VNF configuration'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--param-file',
|
|
||||||
help=_('Specify parameter yaml file'))
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
args = {'attributes': {}}
|
|
||||||
body = {self.resource: args}
|
|
||||||
# config arg passed as data overrides config yaml when both args passed
|
|
||||||
config = None
|
|
||||||
if parsed_args.config_file:
|
|
||||||
with open(parsed_args.config_file) as f:
|
|
||||||
config_yaml = f.read()
|
|
||||||
try:
|
|
||||||
config = yaml.load(
|
|
||||||
config_yaml, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
|
|
||||||
if config:
|
|
||||||
args['attributes']['config'] = config
|
|
||||||
if parsed_args.vim_region_name:
|
|
||||||
args.setdefault('placement_attr', {})['region_name'] = \
|
|
||||||
parsed_args.vim_region_name
|
|
||||||
|
|
||||||
tacker_client = self.get_client()
|
|
||||||
tacker_client.format = parsed_args.request_format
|
|
||||||
if parsed_args.vim_name:
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(tacker_client,
|
|
||||||
'vim',
|
|
||||||
parsed_args.
|
|
||||||
vim_name)
|
|
||||||
parsed_args.vim_id = _id
|
|
||||||
if parsed_args.vnfd_name:
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(tacker_client,
|
|
||||||
'vnfd',
|
|
||||||
parsed_args.
|
|
||||||
vnfd_name)
|
|
||||||
parsed_args.vnfd_id = _id
|
|
||||||
elif parsed_args.vnfd_template:
|
|
||||||
with open(parsed_args.vnfd_template) as f:
|
|
||||||
template = f.read()
|
|
||||||
try:
|
|
||||||
args['vnfd_template'] = yaml.load(
|
|
||||||
template, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
|
|
||||||
if parsed_args.param_file:
|
|
||||||
with open(parsed_args.param_file) as f:
|
|
||||||
param_yaml = f.read()
|
|
||||||
try:
|
|
||||||
args['attributes']['param_values'] = yaml.load(
|
|
||||||
param_yaml, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
tackerV10.update_dict(parsed_args, body[self.resource],
|
|
||||||
['tenant_id', 'name', 'description',
|
|
||||||
'vnfd_id', 'vim_id'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
|
|
||||||
class UpdateVNF(tackerV10.UpdateCommand):
|
|
||||||
"""Update a given VNF."""
|
|
||||||
|
|
||||||
resource = _VNF
|
|
||||||
|
|
||||||
def add_known_arguments(self, parser):
|
|
||||||
group = parser.add_mutually_exclusive_group()
|
|
||||||
group.add_argument(
|
|
||||||
'--config-file',
|
|
||||||
help=_('YAML file with VNF configuration'))
|
|
||||||
group.add_argument(
|
|
||||||
'--config',
|
|
||||||
help=_('YAML data with VNF configuration'))
|
|
||||||
group.add_argument(
|
|
||||||
'--param-file',
|
|
||||||
help=_('YAML file with VNF parameter'))
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = {self.resource: {}}
|
|
||||||
# config arg passed as data overrides config yaml when both args passed
|
|
||||||
config = None
|
|
||||||
if parsed_args.config_file:
|
|
||||||
with open(parsed_args.config_file) as f:
|
|
||||||
config_yaml = f.read()
|
|
||||||
try:
|
|
||||||
config = yaml.load(config_yaml, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not config:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason='The config file is empty')
|
|
||||||
if parsed_args.config:
|
|
||||||
config_param = encodeutils.safe_decode(parsed_args.config)
|
|
||||||
try:
|
|
||||||
config = yaml.load(config_param, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not config:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason='The parameter is empty')
|
|
||||||
if config:
|
|
||||||
body[self.resource]['attributes'] = {'config': config}
|
|
||||||
if parsed_args.param_file:
|
|
||||||
with open(parsed_args.param_file) as f:
|
|
||||||
param_yaml = f.read()
|
|
||||||
try:
|
|
||||||
param = yaml.load(
|
|
||||||
param_yaml, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not param:
|
|
||||||
raise exceptions.InvalidInput(
|
|
||||||
reason='The parameter file is empty')
|
|
||||||
body[self.resource]['attributes'] = {'param_values': param}
|
|
||||||
tackerV10.update_dict(parsed_args, body[self.resource], ['tenant_id'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
|
|
||||||
class DeleteVNF(tackerV10.DeleteCommand):
|
|
||||||
"""Delete given VNF(s)."""
|
|
||||||
|
|
||||||
resource = _VNF
|
|
||||||
remove_output_fields = ["attributes"]
|
|
||||||
deleted_msg = {'vnf': 'delete initiated'}
|
|
||||||
|
|
||||||
def add_known_arguments(self, parser):
|
|
||||||
parser.add_argument(
|
|
||||||
'--force',
|
|
||||||
default=False,
|
|
||||||
action='store_true',
|
|
||||||
help=_('Force delete VNF instance'))
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = dict()
|
|
||||||
if parsed_args.force:
|
|
||||||
body[self.resource] = dict()
|
|
||||||
body[self.resource]['attributes'] = {'force': True}
|
|
||||||
return body
|
|
||||||
|
|
||||||
|
|
||||||
class ListVNFResources(tackerV10.ListCommand):
|
|
||||||
"""List resources of a VNF like VDU, CP, etc."""
|
|
||||||
|
|
||||||
list_columns = ['name', 'id', 'type']
|
|
||||||
allow_names = True
|
|
||||||
resource = _VNF
|
|
||||||
|
|
||||||
def get_id(self):
|
|
||||||
if self.resource:
|
|
||||||
return self.resource.upper()
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListVNFResources, self).get_parser(prog_name)
|
|
||||||
if self.allow_names:
|
|
||||||
help_str = _('ID or name of %s to look up')
|
|
||||||
else:
|
|
||||||
help_str = _('ID of %s to look up')
|
|
||||||
parser.add_argument(
|
|
||||||
'id', metavar=self.get_id(),
|
|
||||||
help=help_str % self.resource)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def get_data(self, parsed_args):
|
|
||||||
self.log.debug('get_data(%s)', parsed_args)
|
|
||||||
tacker_client = self.get_client()
|
|
||||||
tacker_client.format = parsed_args.request_format
|
|
||||||
if self.allow_names:
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(tacker_client,
|
|
||||||
self.resource,
|
|
||||||
parsed_args.id)
|
|
||||||
else:
|
|
||||||
_id = parsed_args.id
|
|
||||||
|
|
||||||
data = self.retrieve_list_by_id(_id, parsed_args)
|
|
||||||
self.extend_list(data, parsed_args)
|
|
||||||
return self.setup_columns(data, parsed_args)
|
|
||||||
|
|
||||||
def retrieve_list_by_id(self, id, parsed_args):
|
|
||||||
"""Retrieve a list of sub resources from Tacker server"""
|
|
||||||
tacker_client = self.get_client()
|
|
||||||
tacker_client.format = parsed_args.request_format
|
|
||||||
_extra_values = tackerV10.parse_args_to_dict(self.values_specs)
|
|
||||||
tackerV10._merge_args(self, parsed_args, _extra_values,
|
|
||||||
self.values_specs)
|
|
||||||
search_opts = self.args2search_opts(parsed_args)
|
|
||||||
search_opts.update(_extra_values)
|
|
||||||
if self.pagination_support:
|
|
||||||
page_size = parsed_args.page_size
|
|
||||||
if page_size:
|
|
||||||
search_opts.update({'limit': page_size})
|
|
||||||
if self.sorting_support:
|
|
||||||
keys = parsed_args.sort_key
|
|
||||||
if keys:
|
|
||||||
search_opts.update({'sort_key': keys})
|
|
||||||
dirs = parsed_args.sort_dir
|
|
||||||
len_diff = len(keys) - len(dirs)
|
|
||||||
if len_diff > 0:
|
|
||||||
dirs += ['asc'] * len_diff
|
|
||||||
elif len_diff < 0:
|
|
||||||
dirs = dirs[:len(keys)]
|
|
||||||
if dirs:
|
|
||||||
search_opts.update({'sort_dir': dirs})
|
|
||||||
obj_lister = getattr(tacker_client, "list_vnf_resources")
|
|
||||||
data = obj_lister(id, **search_opts)
|
|
||||||
return data.get('resources', [])
|
|
||||||
|
|
||||||
|
|
||||||
class ScaleVNF(tackerV10.TackerCommand):
|
|
||||||
"""Scale a VNF."""
|
|
||||||
|
|
||||||
api = 'nfv-orchestration'
|
|
||||||
resource = None
|
|
||||||
log = None
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ScaleVNF, self).get_parser(prog_name)
|
|
||||||
self.add_known_arguments(parser)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def run(self, parsed_args):
|
|
||||||
tacker_client = self.get_client()
|
|
||||||
tacker_client.format = parsed_args.request_format
|
|
||||||
body = self.args2body(parsed_args)
|
|
||||||
obj_creator = getattr(tacker_client,
|
|
||||||
"scale_vnf")
|
|
||||||
obj_creator(body["scale"].pop('vnf_id'), body)
|
|
||||||
|
|
||||||
def add_known_arguments(self, parser):
|
|
||||||
vnf_group = parser.add_mutually_exclusive_group(required=True)
|
|
||||||
vnf_group.add_argument(
|
|
||||||
'--vnf-id',
|
|
||||||
help=_('VNF ID'))
|
|
||||||
vnf_group.add_argument(
|
|
||||||
'--vnf-name',
|
|
||||||
help=_('VNF name'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--scaling-policy-name',
|
|
||||||
help=_('VNF policy name used to scale'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--scaling-type',
|
|
||||||
help=_('VNF scaling type, it could be either "out" or "in"'))
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
args = {}
|
|
||||||
body = {"scale": args}
|
|
||||||
|
|
||||||
if parsed_args.vnf_name:
|
|
||||||
tacker_client = self.get_client()
|
|
||||||
tacker_client.format = parsed_args.request_format
|
|
||||||
_id = tackerV10.find_resourceid_by_name_or_id(tacker_client,
|
|
||||||
'vnf',
|
|
||||||
parsed_args.
|
|
||||||
vnf_name)
|
|
||||||
parsed_args.vnf_id = _id
|
|
||||||
|
|
||||||
args['vnf_id'] = parsed_args.vnf_id
|
|
||||||
args['type'] = parsed_args.scaling_type
|
|
||||||
args['policy'] = parsed_args.scaling_policy_name
|
|
||||||
|
|
||||||
return body
|
|
@@ -1,113 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright 2013 Intel Corporation
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
from oslo_serialization import jsonutils
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from tackerclient.common import exceptions
|
|
||||||
from tackerclient.i18n import _
|
|
||||||
from tackerclient.tacker import v1_0 as tackerV10
|
|
||||||
|
|
||||||
|
|
||||||
_VNFD = "vnfd"
|
|
||||||
|
|
||||||
|
|
||||||
class ListVNFD(tackerV10.ListCommand):
|
|
||||||
"""List VNFD that belong to a given tenant."""
|
|
||||||
|
|
||||||
resource = _VNFD
|
|
||||||
list_columns = ['id', 'name', 'template_source', 'description']
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListVNFD, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'--template-source',
|
|
||||||
help=_("List VNFD with specified template source. Available \
|
|
||||||
options are 'onboarded' (default), 'inline' or 'all'"),
|
|
||||||
action='store',
|
|
||||||
default='onboarded')
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def args2search_opts(self, parsed_args):
|
|
||||||
search_opts = super(ListVNFD, self).args2search_opts(parsed_args)
|
|
||||||
template_source = parsed_args.template_source
|
|
||||||
if parsed_args.template_source:
|
|
||||||
search_opts.update({'template_source': template_source})
|
|
||||||
return search_opts
|
|
||||||
|
|
||||||
|
|
||||||
class ShowVNFD(tackerV10.ShowCommand):
|
|
||||||
"""Show information of a given VNFD."""
|
|
||||||
|
|
||||||
resource = _VNFD
|
|
||||||
|
|
||||||
|
|
||||||
class CreateVNFD(tackerV10.CreateCommand):
|
|
||||||
"""Create a VNFD."""
|
|
||||||
|
|
||||||
resource = _VNFD
|
|
||||||
remove_output_fields = ["attributes"]
|
|
||||||
|
|
||||||
def add_known_arguments(self, parser):
|
|
||||||
parser.add_argument('--vnfd-file', help=_('Specify VNFD file'))
|
|
||||||
parser.add_argument(
|
|
||||||
'name', metavar='NAME',
|
|
||||||
help=_('Set a name for the VNFD'))
|
|
||||||
parser.add_argument(
|
|
||||||
'--description',
|
|
||||||
help=_('Set a description for the VNFD'))
|
|
||||||
|
|
||||||
def args2body(self, parsed_args):
|
|
||||||
body = {self.resource: {}}
|
|
||||||
vnfd = None
|
|
||||||
if not parsed_args.vnfd_file:
|
|
||||||
raise exceptions.InvalidInput(reason="Invalid input for vnfd file")
|
|
||||||
with open(parsed_args.vnfd_file) as f:
|
|
||||||
vnfd = f.read()
|
|
||||||
try:
|
|
||||||
vnfd = yaml.load(vnfd, Loader=yaml.SafeLoader)
|
|
||||||
except yaml.YAMLError as e:
|
|
||||||
raise exceptions.InvalidInput(reason=e)
|
|
||||||
if not vnfd:
|
|
||||||
raise exceptions.InvalidInput(reason="vnfd file is empty")
|
|
||||||
body[self.resource]['attributes'] = {'vnfd': vnfd}
|
|
||||||
tackerV10.update_dict(parsed_args, body[self.resource],
|
|
||||||
['tenant_id', 'name', 'description'])
|
|
||||||
return body
|
|
||||||
|
|
||||||
|
|
||||||
class DeleteVNFD(tackerV10.DeleteCommand):
|
|
||||||
"""Delete given VNFD(s)."""
|
|
||||||
resource = _VNFD
|
|
||||||
|
|
||||||
|
|
||||||
class ShowTemplateVNFD(tackerV10.ShowCommand):
|
|
||||||
"""Show template of a given VNFD."""
|
|
||||||
|
|
||||||
resource = _VNFD
|
|
||||||
|
|
||||||
def run(self, parsed_args):
|
|
||||||
self.log.debug('run(%s)', parsed_args)
|
|
||||||
template = None
|
|
||||||
data = self.get_data(parsed_args)
|
|
||||||
try:
|
|
||||||
attributes_index = data[0].index('attributes')
|
|
||||||
attributes_json = data[1][attributes_index]
|
|
||||||
template = jsonutils.loads(attributes_json).get('vnfd', None)
|
|
||||||
except (IndexError, TypeError, ValueError) as e:
|
|
||||||
self.log.debug('Data handling error: %s', str(e))
|
|
||||||
print(template or _('Unable to display VNFD template!'))
|
|
@@ -1,7 +0,0 @@
|
|||||||
auth_url: 'http://1.2.3.4:5000'
|
|
||||||
username: 'xyz'
|
|
||||||
password: '12345'
|
|
||||||
project_name: 'abc'
|
|
||||||
project_domain_name: 'prj_domain_name'
|
|
||||||
user_domain_name: 'user_domain_name'
|
|
||||||
type: 'openstack'
|
|
@@ -1 +0,0 @@
|
|||||||
{}
|
|
@@ -1,7 +0,0 @@
|
|||||||
auth_url: ][
|
|
||||||
username: 'xyz'
|
|
||||||
password: '12345'
|
|
||||||
project_name: 'abc'
|
|
||||||
project_domain_name: 'prj_domain_name'
|
|
||||||
user_domain_name: 'user_domain_name'
|
|
||||||
type: 'openstack'
|
|
@@ -1 +0,0 @@
|
|||||||
old_key: ][
|
|
@@ -1 +0,0 @@
|
|||||||
key: new-value
|
|
@@ -1 +0,0 @@
|
|||||||
{}
|
|
@@ -1,313 +0,0 @@
|
|||||||
# Copyright 2014 Intel Corporation
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import ast
|
|
||||||
from unittest import mock
|
|
||||||
|
|
||||||
import fixtures
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from tackerclient.common import exceptions
|
|
||||||
from tackerclient.common import utils
|
|
||||||
from tackerclient.osc.v1.vnfm import vnf
|
|
||||||
from tackerclient.tests.unit.osc import base
|
|
||||||
from tackerclient.tests.unit.osc.v1.fixture_data import client
|
|
||||||
|
|
||||||
|
|
||||||
def _get_columns_vnf_parameter():
|
|
||||||
|
|
||||||
columns = ['attributes', 'project_id']
|
|
||||||
return columns
|
|
||||||
|
|
||||||
|
|
||||||
class TestVnfParameter(base.FixturedTestCase):
|
|
||||||
client_fixture_class = client.ClientFixture
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(TestVnfParameter, self).setUp()
|
|
||||||
self.url = client.TACKER_URL
|
|
||||||
self.header = {'content-type': 'application/json'}
|
|
||||||
self.app = mock.Mock()
|
|
||||||
self.app_args = mock.Mock()
|
|
||||||
self.client_manager = self.cs
|
|
||||||
self.app.client_manager.tackerclient = self.client_manager
|
|
||||||
|
|
||||||
|
|
||||||
class TestUpdateVNF(TestVnfParameter):
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(TestUpdateVNF, self).setUp()
|
|
||||||
self.useFixture(fixtures.MonkeyPatch(
|
|
||||||
'tackerclient.tacker.v1_0.find_resourceid_by_name_or_id',
|
|
||||||
self._find_resourceid))
|
|
||||||
self.set_vnf = vnf.UpdateVNF(
|
|
||||||
self.app, self.app_args, cmd_name='vnf set')
|
|
||||||
|
|
||||||
def _find_resourceid(self, client, resource, name_or_id):
|
|
||||||
return name_or_id
|
|
||||||
|
|
||||||
def _cmd_parser(self, cmd_parser, sub_argv):
|
|
||||||
_argv = sub_argv
|
|
||||||
index = -1
|
|
||||||
if '--' in sub_argv:
|
|
||||||
index = sub_argv.index('--')
|
|
||||||
_argv = sub_argv[:index]
|
|
||||||
known_args, _values_specs = cmd_parser.parse_known_args(_argv)
|
|
||||||
return known_args
|
|
||||||
|
|
||||||
def _get_vnf_data(self, vnf_parameter):
|
|
||||||
return tuple([vnf_parameter[key]
|
|
||||||
for key in sorted(vnf_parameter.keys())])
|
|
||||||
|
|
||||||
def _take_action(self, args, extra_fields, get_client_called_count=1):
|
|
||||||
cmd_par = self.set_vnf.get_parser("update_vnf")
|
|
||||||
parsed_args = self._cmd_parser(cmd_par, args)
|
|
||||||
body = {"vnf": extra_fields}
|
|
||||||
body = str(body)
|
|
||||||
project_id = {"tenant_id": "test-vnf-tenant_id"}
|
|
||||||
extra_fields.update(project_id)
|
|
||||||
json = {"vnf": extra_fields}
|
|
||||||
|
|
||||||
self.requests_mock.register_uri(
|
|
||||||
'PUT', self.url + '/v1.0/vnfs/my-id.json',
|
|
||||||
json=json, headers=self.header)
|
|
||||||
columns, data = (self.set_vnf.take_action(parsed_args))
|
|
||||||
|
|
||||||
self.assertCountEqual(_get_columns_vnf_parameter(),
|
|
||||||
columns)
|
|
||||||
self.assertEqual(get_client_called_count,
|
|
||||||
self.requests_mock.call_count)
|
|
||||||
self.assertCountEqual(
|
|
||||||
ast.literal_eval(self.requests_mock.last_request.body),
|
|
||||||
ast.literal_eval(body))
|
|
||||||
self.assertCountEqual(self._get_vnf_data(json['vnf']), data)
|
|
||||||
|
|
||||||
def test_vnf_update_param_file(self):
|
|
||||||
my_id = 'my-id'
|
|
||||||
param_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_param.yaml')
|
|
||||||
args = [my_id, '--param-file', str(param_file)]
|
|
||||||
extra_fields = {'attributes': {'param_values': {'key': 'new-value'}}}
|
|
||||||
|
|
||||||
self._take_action(args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_config_file(self):
|
|
||||||
my_id = 'my-id'
|
|
||||||
config_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_config.yaml')
|
|
||||||
p_auth_url = 'http://1.2.3.4:5000'
|
|
||||||
p_project_name = 'abc'
|
|
||||||
p_username = 'xyz'
|
|
||||||
p_project_domain_name = 'prj_domain_name'
|
|
||||||
p_type = 'openstack'
|
|
||||||
p_user_domain_name = 'user_domain_name'
|
|
||||||
p_password = '12345'
|
|
||||||
args = [my_id, '--config-file', str(config_file)]
|
|
||||||
config = {'auth_url': p_auth_url, 'project_name': p_project_name,
|
|
||||||
'username': p_username,
|
|
||||||
'project_domain_name': p_project_domain_name,
|
|
||||||
'type': p_type, 'user_domain_name': p_user_domain_name,
|
|
||||||
'password': p_password}
|
|
||||||
extra_fields = {'attributes': {'config': config}}
|
|
||||||
|
|
||||||
self._take_action(args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_config(self):
|
|
||||||
my_id = 'my-id'
|
|
||||||
p_auth_url = 'https://1.2.3.4:6443'
|
|
||||||
p_type = 'kubernetes'
|
|
||||||
p_password = '12345'
|
|
||||||
p_project_name = 'default'
|
|
||||||
p_username = 'xyz'
|
|
||||||
p_ssl_ca_cert = 'abcxyz'
|
|
||||||
config = {'password': p_password, 'project_name': p_project_name,
|
|
||||||
'username': p_username, 'type': p_type,
|
|
||||||
'ssl_ca_cert': p_ssl_ca_cert, 'auth_url': p_auth_url}
|
|
||||||
config = yaml.dump(config)
|
|
||||||
args = [my_id, '--config', str(config)]
|
|
||||||
extra_fields = {'attributes': {'config': config}}
|
|
||||||
|
|
||||||
self._take_action(args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_invalid_format_param_file(self):
|
|
||||||
my_id = 'my-id'
|
|
||||||
param_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_invalid_format_param.yaml')
|
|
||||||
args = [my_id, '--param-file', str(param_file)]
|
|
||||||
extra_fields = {'attributes': {'param_values': None}}
|
|
||||||
|
|
||||||
self.assertRaises(exceptions.InvalidInput,
|
|
||||||
self._take_action,
|
|
||||||
args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_empty_param_file(self):
|
|
||||||
my_id = 'my-id'
|
|
||||||
param_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_empty_param.yaml')
|
|
||||||
args = [my_id, '--param-file', str(param_file)]
|
|
||||||
extra_fields = {'attributes': {'param_values': None}}
|
|
||||||
|
|
||||||
self.assertRaises(exceptions.InvalidInput,
|
|
||||||
self._take_action,
|
|
||||||
args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_invalid_format_config_file(self):
|
|
||||||
my_id = 'my-id'
|
|
||||||
config_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_invalid_format_config.yaml')
|
|
||||||
args = [my_id, '--config-file', str(config_file)]
|
|
||||||
extra_fields = {'attributes': {'config': None}}
|
|
||||||
|
|
||||||
self.assertRaises(exceptions.InvalidInput,
|
|
||||||
self._take_action,
|
|
||||||
args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_empty_config_file(self):
|
|
||||||
my_id = 'my-id'
|
|
||||||
config_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_empty_config.yaml')
|
|
||||||
args = [my_id, '--config-file', str(config_file)]
|
|
||||||
extra_fields = {'attributes': {'config': None}}
|
|
||||||
|
|
||||||
self.assertRaises(exceptions.InvalidInput,
|
|
||||||
self._take_action,
|
|
||||||
args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_invalid_format_config(self):
|
|
||||||
my_id = 'my_id'
|
|
||||||
config = 'test: : ]['
|
|
||||||
args = [my_id, '--config', config]
|
|
||||||
extra_fields = {'attributes': {'config': None}}
|
|
||||||
|
|
||||||
self.assertRaises(exceptions.InvalidInput,
|
|
||||||
self._take_action,
|
|
||||||
args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_empty_config(self):
|
|
||||||
my_id = 'my-id'
|
|
||||||
config = ' '
|
|
||||||
args = [my_id, '--config', config]
|
|
||||||
extra_fields = {'attributes': {'config': None}}
|
|
||||||
|
|
||||||
self.assertRaises(exceptions.InvalidInput,
|
|
||||||
self._take_action,
|
|
||||||
args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_multi_args_config_configfile_paramfile(self):
|
|
||||||
my_id = 'my-id'
|
|
||||||
config_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_config.yaml')
|
|
||||||
param_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_param.yaml')
|
|
||||||
p_auth_url = 'https://1.2.3.4:6443'
|
|
||||||
p_type = 'kubernetes'
|
|
||||||
p_password = '12345'
|
|
||||||
p_project_name = 'default'
|
|
||||||
p_username = 'xyz'
|
|
||||||
p_ssl_ca_cert = 'abcxyz'
|
|
||||||
config = {'password': p_password, 'project_name': p_project_name,
|
|
||||||
'username': p_username, 'type': p_type,
|
|
||||||
'ssl_ca_cert': p_ssl_ca_cert, 'auth_url': p_auth_url}
|
|
||||||
config = yaml.dump(config)
|
|
||||||
args = [my_id, '--config-file', str(config_file),
|
|
||||||
'--config', str(config), '--param-file', str(param_file)]
|
|
||||||
extra_fields = {'attributes': None}
|
|
||||||
|
|
||||||
self.assertRaises(BaseException,
|
|
||||||
self._take_action,
|
|
||||||
args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_multi_args_configfile_paramfile(self):
|
|
||||||
my_id = 'my-id'
|
|
||||||
config_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_config.yaml')
|
|
||||||
param_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_param.yaml')
|
|
||||||
args = [my_id, '--param-file', str(param_file),
|
|
||||||
'--config-file', str(config_file)]
|
|
||||||
extra_fields = {'attributes': None}
|
|
||||||
|
|
||||||
self.assertRaises(BaseException,
|
|
||||||
self._take_action,
|
|
||||||
args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_multi_args_config_configfile(self):
|
|
||||||
my_id = 'my-id'
|
|
||||||
config_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_config.yaml')
|
|
||||||
p_auth_url = 'https://1.2.3.4:6443'
|
|
||||||
p_type = 'kubernetes'
|
|
||||||
p_password = '12345'
|
|
||||||
p_project_name = 'default'
|
|
||||||
p_username = 'xyz'
|
|
||||||
p_ssl_ca_cert = 'abcxyz'
|
|
||||||
config = {'password': p_password, 'project_name': p_project_name,
|
|
||||||
'username': p_username, 'type': p_type,
|
|
||||||
'ssl_ca_cert': p_ssl_ca_cert, 'auth_url': p_auth_url}
|
|
||||||
config = yaml.dump(config)
|
|
||||||
args = [my_id, '--config-file', str(config_file),
|
|
||||||
'--config', str(config)]
|
|
||||||
extra_fields = {'attributes': None}
|
|
||||||
|
|
||||||
self.assertRaises(BaseException,
|
|
||||||
self._take_action,
|
|
||||||
args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_multi_args_config_paramfile(self):
|
|
||||||
my_id = 'my-id'
|
|
||||||
param_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_param.yaml')
|
|
||||||
p_auth_url = 'https://1.2.3.4:6443'
|
|
||||||
p_type = 'kubernetes'
|
|
||||||
p_password = '12345'
|
|
||||||
p_project_name = 'default'
|
|
||||||
p_username = 'xyz'
|
|
||||||
p_ssl_ca_cert = 'abcxyz'
|
|
||||||
config = {'password': p_password, 'project_name': p_project_name,
|
|
||||||
'username': p_username, 'type': p_type,
|
|
||||||
'ssl_ca_cert': p_ssl_ca_cert, 'auth_url': p_auth_url}
|
|
||||||
config = yaml.dump(config)
|
|
||||||
args = [my_id, '--param-file', str(param_file),
|
|
||||||
'--config', str(config)]
|
|
||||||
extra_fields = {'attributes': None}
|
|
||||||
|
|
||||||
self.assertRaises(BaseException,
|
|
||||||
self._take_action,
|
|
||||||
args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_param_file_with_empty_dict(self):
|
|
||||||
my_id = 'my-id'
|
|
||||||
param_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/'
|
|
||||||
'vnf_update_param_file_with_empty_dict.yaml')
|
|
||||||
args = [my_id, '--param-file', str(param_file)]
|
|
||||||
extra_fields = {'attributes': None}
|
|
||||||
|
|
||||||
self.assertRaises(exceptions.InvalidInput,
|
|
||||||
self._take_action,
|
|
||||||
args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_config_file_with_empty_dict(self):
|
|
||||||
my_id = 'my-id'
|
|
||||||
config_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/'
|
|
||||||
'vnf_update_config_file_with_empty_dict.yaml')
|
|
||||||
args = [my_id, '--config-file', str(config_file)]
|
|
||||||
extra_fields = {'attributes': None}
|
|
||||||
|
|
||||||
self.assertRaises(exceptions.InvalidInput,
|
|
||||||
self._take_action,
|
|
||||||
args, extra_fields)
|
|
@@ -23,7 +23,6 @@ from unittest import mock
|
|||||||
import urllib
|
import urllib
|
||||||
from urllib import parse as urlparse
|
from urllib import parse as urlparse
|
||||||
|
|
||||||
from tackerclient.common import constants
|
|
||||||
from tackerclient.common import exceptions
|
from tackerclient.common import exceptions
|
||||||
from tackerclient import shell
|
from tackerclient import shell
|
||||||
from tackerclient.tacker import v1_0 as tackerV1_0
|
from tackerclient.tacker import v1_0 as tackerV1_0
|
||||||
@@ -191,12 +190,6 @@ class CLITestV10Base(testtools.TestCase):
|
|||||||
def setUp(self, plurals={}):
|
def setUp(self, plurals={}):
|
||||||
"""Prepare the test environment."""
|
"""Prepare the test environment."""
|
||||||
super(CLITestV10Base, self).setUp()
|
super(CLITestV10Base, self).setUp()
|
||||||
client.LegacyClient.EXTED_PLURALS.update(constants.PLURALS)
|
|
||||||
client.LegacyClient.EXTED_PLURALS.update(plurals)
|
|
||||||
self.metadata = {'plurals': client.LegacyClient.EXTED_PLURALS,
|
|
||||||
'xmlns': constants.XML_NS_V10,
|
|
||||||
constants.EXT_NS: {'prefix':
|
|
||||||
'http://xxxx.yy.com'}}
|
|
||||||
self.endurl = ENDURL
|
self.endurl = ENDURL
|
||||||
self.fake_stdout = FakeStdout()
|
self.fake_stdout = FakeStdout()
|
||||||
self.useFixture(fixtures.MonkeyPatch('sys.stdout', self.fake_stdout))
|
self.useFixture(fixtures.MonkeyPatch('sys.stdout', self.fake_stdout))
|
||||||
@@ -217,7 +210,7 @@ class CLITestV10Base(testtools.TestCase):
|
|||||||
tags=None, admin_state_up=True, extra_body=None,
|
tags=None, admin_state_up=True, extra_body=None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
mock_get.return_value = self.client
|
mock_get.return_value = self.client
|
||||||
non_admin_status_resources = ['vnfd', 'vnf', 'vim', 'vnffgd', 'vnffg']
|
non_admin_status_resources = ['vim']
|
||||||
if (resource in non_admin_status_resources):
|
if (resource in non_admin_status_resources):
|
||||||
body = {resource: {}, }
|
body = {resource: {}, }
|
||||||
else:
|
else:
|
||||||
@@ -714,44 +707,6 @@ class CLITestV10ExceptionHandler(CLITestV10Base):
|
|||||||
expected_msg = error_msg
|
expected_msg = error_msg
|
||||||
self.assertEqual(expected_msg, e.message)
|
self.assertEqual(expected_msg, e.message)
|
||||||
|
|
||||||
def test_exception_handler_v10_ip_address_in_use(self):
|
|
||||||
err_msg = ('Unable to complete operation for network '
|
|
||||||
'fake-network-uuid. The IP address fake-ip is in use.')
|
|
||||||
self._test_exception_handler_v10(
|
|
||||||
exceptions.IpAddressInUseClient, 409, err_msg,
|
|
||||||
'IpAddressInUse', err_msg, '')
|
|
||||||
|
|
||||||
def test_exception_handler_v10_tacker_known_error(self):
|
|
||||||
known_error_map = [
|
|
||||||
('NetworkNotFound', exceptions.NetworkNotFoundClient, 404),
|
|
||||||
('PortNotFound', exceptions.PortNotFoundClient, 404),
|
|
||||||
('NetworkInUse', exceptions.NetworkInUseClient, 409),
|
|
||||||
('PortInUse', exceptions.PortInUseClient, 409),
|
|
||||||
('StateInvalid', exceptions.StateInvalidClient, 400),
|
|
||||||
('IpAddressInUse', exceptions.IpAddressInUseClient, 409),
|
|
||||||
('IpAddressGenerationFailure',
|
|
||||||
exceptions.IpAddressGenerationFailureClient, 409),
|
|
||||||
('ExternalIpAddressExhausted',
|
|
||||||
exceptions.ExternalIpAddressExhaustedClient, 400),
|
|
||||||
('OverQuota', exceptions.OverQuotaClient, 409),
|
|
||||||
]
|
|
||||||
|
|
||||||
error_msg = 'dummy exception message'
|
|
||||||
error_detail = 'sample detail'
|
|
||||||
for server_exc, client_exc, status_code in known_error_map:
|
|
||||||
self._test_exception_handler_v10(
|
|
||||||
client_exc, status_code,
|
|
||||||
error_msg + '\n' + error_detail,
|
|
||||||
server_exc, error_msg, error_detail)
|
|
||||||
|
|
||||||
def test_exception_handler_v10_tacker_known_error_without_detail(self):
|
|
||||||
error_msg = 'Network not found'
|
|
||||||
error_detail = ''
|
|
||||||
self._test_exception_handler_v10(
|
|
||||||
exceptions.NetworkNotFoundClient, 404,
|
|
||||||
error_msg,
|
|
||||||
'NetworkNotFound', error_msg, error_detail)
|
|
||||||
|
|
||||||
def test_exception_handler_v10_unknown_error_to_per_code_exception(self):
|
def test_exception_handler_v10_unknown_error_to_per_code_exception(self):
|
||||||
for status_code, client_exc in exceptions.HTTP_EXCEPTION_MAP.items():
|
for status_code, client_exc in exceptions.HTTP_EXCEPTION_MAP.items():
|
||||||
error_msg = 'Unknown error'
|
error_msg = 'Unknown error'
|
||||||
|
@@ -1,47 +0,0 @@
|
|||||||
# Copyright 2013 NEC Corporation
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from tackerclient.tacker.v1_0.extension import ListExt
|
|
||||||
from tackerclient.tacker.v1_0.extension import ShowExt
|
|
||||||
from tackerclient.tests.unit.test_cli10 import CLITestV10Base
|
|
||||||
from tackerclient.tests.unit.test_cli10 import MyApp
|
|
||||||
|
|
||||||
|
|
||||||
class CLITestV10Extension(CLITestV10Base):
|
|
||||||
id_field = 'alias'
|
|
||||||
|
|
||||||
def test_list_extensions(self):
|
|
||||||
resources = 'extensions'
|
|
||||||
cmd = ListExt(MyApp(sys.stdout), None)
|
|
||||||
contents = [{'alias': 'ext1', 'name': 'name1', 'other': 'other1'},
|
|
||||||
{'alias': 'ext2', 'name': 'name2', 'other': 'other2'}]
|
|
||||||
ret = self._test_list_resources(resources, cmd,
|
|
||||||
response_contents=contents)
|
|
||||||
ret_words = set(ret.split())
|
|
||||||
# Check only the default columns are shown.
|
|
||||||
self.assertIn('name', ret_words)
|
|
||||||
self.assertIn('alias', ret_words)
|
|
||||||
self.assertNotIn('other', ret_words)
|
|
||||||
|
|
||||||
def test_show_extension(self):
|
|
||||||
# -F option does not work for ext-show at the moment, so -F option
|
|
||||||
# is not passed in the commandline args as other tests do.
|
|
||||||
resource = 'extension'
|
|
||||||
cmd = ShowExt(MyApp(sys.stdout), None)
|
|
||||||
args = [self.test_id]
|
|
||||||
ext_alias = self.test_id
|
|
||||||
self._test_show_resource(resource, cmd, ext_alias, args, fields=[])
|
|
@@ -94,8 +94,8 @@ class ShellTest(testtools.TestCase):
|
|||||||
|
|
||||||
def test_help_on_subcommand(self):
|
def test_help_on_subcommand(self):
|
||||||
required = [
|
required = [
|
||||||
'.*?^usage: .* vnfd-list']
|
'.*?^usage: .* vim-list']
|
||||||
stdout, stderr = self.shell('help vnfd-list')
|
stdout, stderr = self.shell('help vim-list')
|
||||||
for r in required:
|
for r in required:
|
||||||
self.assertThat(
|
self.assertThat(
|
||||||
stdout,
|
stdout,
|
||||||
@@ -104,7 +104,7 @@ class ShellTest(testtools.TestCase):
|
|||||||
|
|
||||||
def test_help_command(self):
|
def test_help_command(self):
|
||||||
required = 'usage:'
|
required = 'usage:'
|
||||||
help_text, stderr = self.shell('help vnfd-create')
|
help_text, stderr = self.shell('help vim-create')
|
||||||
self.assertThat(
|
self.assertThat(
|
||||||
help_text,
|
help_text,
|
||||||
matchers.MatchesRegex(required))
|
matchers.MatchesRegex(required))
|
||||||
@@ -113,7 +113,7 @@ class ShellTest(testtools.TestCase):
|
|||||||
def test_unknown_auth_strategy(self):
|
def test_unknown_auth_strategy(self):
|
||||||
self.useFixture(fixtures.FakeLogger(level=logging.DEBUG))
|
self.useFixture(fixtures.FakeLogger(level=logging.DEBUG))
|
||||||
stdout, stderr = self.shell('--os-auth-strategy fake '
|
stdout, stderr = self.shell('--os-auth-strategy fake '
|
||||||
'vnfd-list')
|
'vim-list')
|
||||||
self.assertFalse(stdout)
|
self.assertFalse(stdout)
|
||||||
|
|
||||||
def test_auth(self):
|
def test_auth(self):
|
||||||
@@ -130,7 +130,7 @@ class ShellTest(testtools.TestCase):
|
|||||||
'--os-password test '
|
'--os-password test '
|
||||||
'--os-tenant-name test '
|
'--os-tenant-name test '
|
||||||
'--os-auth-url http://127.0.0.1:5000/ '
|
'--os-auth-url http://127.0.0.1:5000/ '
|
||||||
'--os-auth-strategy keystone vnfd-list')
|
'--os-auth-strategy keystone vim-list')
|
||||||
shell.authenticate_user()
|
shell.authenticate_user()
|
||||||
shell.run(cmdline.split())
|
shell.run(cmdline.split())
|
||||||
|
|
||||||
|
@@ -1 +0,0 @@
|
|||||||
abcxyz
|
|
@@ -1,69 +0,0 @@
|
|||||||
# Copyright 2014 Intel Corporation
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from tackerclient.tacker.v1_0.events import events
|
|
||||||
from tackerclient.tests.unit import test_cli10
|
|
||||||
|
|
||||||
API_VERSION = "1.0"
|
|
||||||
FORMAT = 'json'
|
|
||||||
TOKEN = 'testtoken'
|
|
||||||
ENDURL = 'localurl'
|
|
||||||
|
|
||||||
|
|
||||||
class CLITestV10EventJSON(test_cli10.CLITestV10Base):
|
|
||||||
_EVT_RESOURCE = 'event'
|
|
||||||
_EVT_RESOURCES = _EVT_RESOURCE + 's'
|
|
||||||
_VNF_EVT_RESOURCE = "vnf_event"
|
|
||||||
_VNF_EVT_RESOURCES = _VNF_EVT_RESOURCE + 's'
|
|
||||||
_VNFD_EVT_RESOURCE = "vnfd_event"
|
|
||||||
_VNFD_EVT_RESOURCES = _VNFD_EVT_RESOURCE + 's'
|
|
||||||
_VIM_EVT_RESOURCE = "vim_event"
|
|
||||||
_VIM_EVT_RESOURCES = _VIM_EVT_RESOURCE + 's'
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
plurals = {'events': 'event', 'vnf_events': 'vnf_event',
|
|
||||||
'vnfd_events': 'vnfd_event', 'vim_events': 'vim_event'}
|
|
||||||
super(CLITestV10EventJSON, self).setUp(plurals=plurals)
|
|
||||||
|
|
||||||
def test_list_events(self):
|
|
||||||
cmd = events.ListResourceEvents(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
self._test_list_resources(self._EVT_RESOURCES, cmd, True)
|
|
||||||
|
|
||||||
def test_show_event_id(self):
|
|
||||||
cmd = events.ShowEvent(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
args = ['--fields', 'id', self.test_id]
|
|
||||||
self._test_show_resource(self._EVT_RESOURCE, cmd, self.test_id, args,
|
|
||||||
['id'])
|
|
||||||
|
|
||||||
def notest_list_vnf_events(self):
|
|
||||||
# TODO(vishwanathj): Need to enhance _test_list_resources()
|
|
||||||
# for supporting filters to get this test working
|
|
||||||
cmd = events.ListVNFEvents(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
self._test_list_resources(self._VNF_EVT_RESOURCES, cmd, True)
|
|
||||||
|
|
||||||
def notest_list_vnfd_events(self):
|
|
||||||
# TODO(vishwanathj): Need to enhance _test_list_resources()
|
|
||||||
# for supporting filters to get this test working
|
|
||||||
cmd = events.ListVNFDEvents(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
self._test_list_resources(self._VNFD_EVT_RESOURCES, cmd, True)
|
|
||||||
|
|
||||||
def notest_list_vim_events(self):
|
|
||||||
# TODO(vishwanathj): Need to enhance _test_list_resources()
|
|
||||||
# for supporting filters to get this test working
|
|
||||||
cmd = events.ListVIMEvents(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
self._test_list_resources(self._VIM_EVT_RESOURCES, cmd, True)
|
|
@@ -1,526 +0,0 @@
|
|||||||
# Copyright 2014 Intel Corporation
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
import sys
|
|
||||||
from unittest import mock
|
|
||||||
|
|
||||||
from tackerclient.common import exceptions
|
|
||||||
from tackerclient.common import utils
|
|
||||||
from tackerclient import shell
|
|
||||||
from tackerclient.tacker import v1_0 as tackerV1_0
|
|
||||||
from tackerclient.tacker.v1_0 import TackerCommand
|
|
||||||
from tackerclient.tacker.v1_0.vnfm import vnf
|
|
||||||
from tackerclient.tests.unit import test_cli10
|
|
||||||
from tackerclient.tests.unit import test_utils
|
|
||||||
|
|
||||||
API_VERSION = "1.0"
|
|
||||||
FORMAT = 'json'
|
|
||||||
TOKEN = 'testtoken'
|
|
||||||
ENDURL = 'localurl'
|
|
||||||
|
|
||||||
|
|
||||||
class CLITestV10VmVNFJSON(test_cli10.CLITestV10Base):
|
|
||||||
_RESOURCE = 'vnf'
|
|
||||||
_RESOURCES = 'vnfs'
|
|
||||||
_VNF_RESOURCES = 'vnf_resources'
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
plurals = {'vnfs': 'vnf',
|
|
||||||
'resources': 'resource'}
|
|
||||||
super(CLITestV10VmVNFJSON, self).setUp(plurals=plurals)
|
|
||||||
|
|
||||||
@mock.patch.object(TackerCommand, 'get_client')
|
|
||||||
def _test_create_resource(self, resource, cmd, name, myid, args,
|
|
||||||
position_names, position_values, mock_get,
|
|
||||||
tenant_id=None, tags=None, admin_state_up=True,
|
|
||||||
extra_body=None, **kwargs):
|
|
||||||
mock_get.return_value = self.client
|
|
||||||
non_admin_status_resources = ['vnfd', 'vnf']
|
|
||||||
if (resource in non_admin_status_resources):
|
|
||||||
body = {resource: {}, }
|
|
||||||
else:
|
|
||||||
body = {resource: {'admin_state_up': admin_state_up, }, }
|
|
||||||
if tenant_id:
|
|
||||||
body[resource].update({'tenant_id': tenant_id})
|
|
||||||
if tags:
|
|
||||||
body[resource].update({'tags': tags})
|
|
||||||
if extra_body:
|
|
||||||
body[resource].update(extra_body)
|
|
||||||
body[resource].update(kwargs)
|
|
||||||
|
|
||||||
for i in range(len(position_names)):
|
|
||||||
body[resource].update({position_names[i]: position_values[i]})
|
|
||||||
ress = {resource:
|
|
||||||
{self.id_field: myid}, }
|
|
||||||
if name:
|
|
||||||
ress[resource].update({'name': name})
|
|
||||||
self.client.format = self.format
|
|
||||||
resstr = self.client.serialize(ress)
|
|
||||||
# url method body
|
|
||||||
resource_plural = tackerV1_0._get_resource_plural(resource,
|
|
||||||
self.client)
|
|
||||||
path = getattr(self.client, resource_plural + "_path")
|
|
||||||
# Work around for LP #1217791. XML deserializer called from
|
|
||||||
# MyComparator does not decodes XML string correctly.
|
|
||||||
if self.format == 'json':
|
|
||||||
_body = test_cli10.MyComparator(body, self.client)
|
|
||||||
else:
|
|
||||||
_body = self.client.serialize(body)
|
|
||||||
with mock.patch.object(self.client.httpclient, 'request') as mock_req:
|
|
||||||
mock_req.return_value = (test_cli10.MyResp(200), resstr)
|
|
||||||
args.extend(['--request-format', self.format])
|
|
||||||
args.extend(['--vnfd-id', 'vnfd'])
|
|
||||||
cmd_parser = cmd.get_parser('create_' + resource)
|
|
||||||
shell.run_command(cmd, cmd_parser, args)
|
|
||||||
mock_req.assert_called_once_with(
|
|
||||||
test_cli10.end_url(path, format=self.format), 'POST',
|
|
||||||
body=_body,
|
|
||||||
headers=test_utils.ContainsKeyValue('X-Auth-Token', TOKEN))
|
|
||||||
mock_get.assert_any_call()
|
|
||||||
|
|
||||||
def test_create_vnf_all_params(self):
|
|
||||||
cmd = vnf.CreateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
name = 'my_name'
|
|
||||||
my_id = 'my-id'
|
|
||||||
vnfd_id = 'vnfd'
|
|
||||||
vim_id = 'vim_id'
|
|
||||||
description = 'my-description'
|
|
||||||
region_name = 'region'
|
|
||||||
key = 'key'
|
|
||||||
value = 'value'
|
|
||||||
|
|
||||||
args = [
|
|
||||||
name,
|
|
||||||
'--vnfd-id', vnfd_id,
|
|
||||||
'--vim-id', vim_id,
|
|
||||||
'--description', description,
|
|
||||||
'--vim-region-name', region_name,
|
|
||||||
'--%s' % key, value]
|
|
||||||
position_names = [
|
|
||||||
'name',
|
|
||||||
'vnfd_id',
|
|
||||||
'vim_id',
|
|
||||||
'description',
|
|
||||||
'attributes',
|
|
||||||
]
|
|
||||||
position_values = [
|
|
||||||
name,
|
|
||||||
vnfd_id,
|
|
||||||
vim_id,
|
|
||||||
description,
|
|
||||||
{},
|
|
||||||
]
|
|
||||||
extra_body = {key: value, 'placement_attr': {'region_name':
|
|
||||||
region_name}}
|
|
||||||
self._test_create_resource(self._RESOURCE, cmd, name, my_id,
|
|
||||||
args, position_names, position_values,
|
|
||||||
extra_body=extra_body)
|
|
||||||
|
|
||||||
def test_create_vnf_with_vnfd_id(self):
|
|
||||||
cmd = vnf.CreateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
name = 'my_name'
|
|
||||||
my_id = 'my-id'
|
|
||||||
vnfd_id = 'vnfd'
|
|
||||||
args = [
|
|
||||||
name,
|
|
||||||
'--vnfd-id', vnfd_id,
|
|
||||||
]
|
|
||||||
position_names = ['name', 'vnfd_id', 'attributes']
|
|
||||||
position_values = [name, vnfd_id, {}]
|
|
||||||
self._test_create_resource(self._RESOURCE, cmd, name, my_id,
|
|
||||||
args, position_names, position_values)
|
|
||||||
|
|
||||||
def test_create_vnf_with_description_param(self):
|
|
||||||
cmd = vnf.CreateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
name = 'my_name'
|
|
||||||
my_id = 'my-id'
|
|
||||||
vnfd_id = 'vnfd'
|
|
||||||
description = 'my-description'
|
|
||||||
args = [
|
|
||||||
name,
|
|
||||||
'--vnfd-id', vnfd_id,
|
|
||||||
'--description', description,
|
|
||||||
]
|
|
||||||
position_names = ['name', 'vnfd_id', 'description',
|
|
||||||
'attributes']
|
|
||||||
position_values = [name, vnfd_id, description, {}]
|
|
||||||
self._test_create_resource(self._RESOURCE, cmd, None, my_id,
|
|
||||||
args, position_names, position_values)
|
|
||||||
|
|
||||||
def test_list_vnfs(self):
|
|
||||||
cmd = vnf.ListVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
self._test_list_resources(self._RESOURCES, cmd, True)
|
|
||||||
|
|
||||||
def test_list_vnfs_pagenation(self):
|
|
||||||
cmd = vnf.ListVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
self._test_list_resources(self._RESOURCES, cmd, True)
|
|
||||||
|
|
||||||
def test_show_vnf_id(self):
|
|
||||||
cmd = vnf.ShowVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
args = ['--fields', 'id', self.test_id]
|
|
||||||
self._test_show_resource(self._RESOURCE, cmd, self.test_id, args,
|
|
||||||
['id'])
|
|
||||||
|
|
||||||
def test_show_vnf_id_name(self):
|
|
||||||
cmd = vnf.ShowVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
args = ['--fields', 'id', '--fields', 'name', self.test_id]
|
|
||||||
self._test_show_resource(self._RESOURCE, cmd, self.test_id,
|
|
||||||
args, ['id', 'name'])
|
|
||||||
|
|
||||||
def test_update_vnf(self):
|
|
||||||
cmd = vnf.UpdateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
key = 'new_key'
|
|
||||||
value = 'new-value'
|
|
||||||
self._test_update_resource(self._RESOURCE, cmd, my_id,
|
|
||||||
[my_id, '--%s' % key, value],
|
|
||||||
{key: value})
|
|
||||||
|
|
||||||
def test_vnf_update_param_file(self):
|
|
||||||
cmd = vnf.UpdateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
key = 'key'
|
|
||||||
value = 'new-value'
|
|
||||||
config_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_param.yaml')
|
|
||||||
args = [my_id, '--param-file', str(config_file)]
|
|
||||||
extra_fields = {'attributes': {'param_values': {key: value}}}
|
|
||||||
|
|
||||||
self._test_update_resource(self._RESOURCE, cmd, my_id, args,
|
|
||||||
extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_config_file(self):
|
|
||||||
cmd = vnf.UpdateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
name = 'my-name'
|
|
||||||
description = 'Vim Description'
|
|
||||||
vim_config = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_config.yaml')
|
|
||||||
args = [
|
|
||||||
name,
|
|
||||||
'--config-file', vim_config,
|
|
||||||
'--description', description]
|
|
||||||
p_auth_url = 'http://1.2.3.4:5000'
|
|
||||||
p_type = 'openstack'
|
|
||||||
p_project_name = 'abc'
|
|
||||||
p_username = 'xyz'
|
|
||||||
p_project_domain_name = 'prj_domain_name'
|
|
||||||
p_user_domain_name = 'user_domain_name'
|
|
||||||
p_password = '12345'
|
|
||||||
config = {'auth_url': p_auth_url, 'project_name': p_project_name,
|
|
||||||
'username': p_username,
|
|
||||||
'project_domain_name': p_project_domain_name,
|
|
||||||
'type': p_type, 'user_domain_name': p_user_domain_name,
|
|
||||||
'password': p_password}
|
|
||||||
extra_body = {'description': description,
|
|
||||||
'attributes': {'config': config}}
|
|
||||||
|
|
||||||
self._test_update_resource(self._RESOURCE, cmd, name, args, extra_body)
|
|
||||||
|
|
||||||
def test_vnf_update_config(self):
|
|
||||||
cmd = vnf.UpdateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
name = 'my-name'
|
|
||||||
description = 'Vim Description'
|
|
||||||
p_auth_url = 'https://1.2.3.4:6443'
|
|
||||||
p_type = 'kubernetes'
|
|
||||||
p_password = '12345'
|
|
||||||
p_project_name = 'default'
|
|
||||||
p_username = 'xyz'
|
|
||||||
p_ssl_ca_cert = 'abcxyz'
|
|
||||||
config = {'password': p_password, 'project_name': p_project_name,
|
|
||||||
'username': p_username, 'type': p_type,
|
|
||||||
'ssl_ca_cert': p_ssl_ca_cert, 'auth_url': p_auth_url}
|
|
||||||
args = [
|
|
||||||
name,
|
|
||||||
'--description', description,
|
|
||||||
'--config', str(config)]
|
|
||||||
extra_body = {'description': description,
|
|
||||||
'attributes': {'config': config}}
|
|
||||||
|
|
||||||
self._test_update_resource(self._RESOURCE, cmd, name, args, extra_body)
|
|
||||||
|
|
||||||
def test_vnf_update_invalid_format_param_file(self):
|
|
||||||
cmd = vnf.UpdateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
name = 'my-name'
|
|
||||||
key = 'key'
|
|
||||||
value = 'new-value'
|
|
||||||
config_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_invalid_format_param.yaml')
|
|
||||||
args = [my_id, '--param-file', str(config_file)]
|
|
||||||
extra_fields = {'attributes': {'param_values': {key: value}}}
|
|
||||||
|
|
||||||
self.assertRaises(exceptions.InvalidInput,
|
|
||||||
self._test_update_resource,
|
|
||||||
self._RESOURCE, cmd, name, args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_empty_param_file(self):
|
|
||||||
cmd = vnf.UpdateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
name = 'my-name'
|
|
||||||
key = 'key'
|
|
||||||
value = 'new-value'
|
|
||||||
config_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_empty_param.yaml')
|
|
||||||
args = [my_id, '--param-file', str(config_file)]
|
|
||||||
extra_fields = {'attributes': {'param_values': {key: value}}}
|
|
||||||
|
|
||||||
self.assertRaises(exceptions.InvalidInput,
|
|
||||||
self._test_update_resource,
|
|
||||||
self._RESOURCE, cmd, name, args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_invalid_format_config_file(self):
|
|
||||||
cmd = vnf.UpdateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
name = 'my-name'
|
|
||||||
description = 'Vim Description'
|
|
||||||
vim_config = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_invalid_format_config.yaml')
|
|
||||||
args = [
|
|
||||||
name,
|
|
||||||
'--config-file', vim_config,
|
|
||||||
'--description', description]
|
|
||||||
p_auth_url = 'http://1.2.3.4:5000'
|
|
||||||
p_type = 'openstack'
|
|
||||||
p_project_name = 'abc'
|
|
||||||
p_username = 'xyz'
|
|
||||||
p_project_domain_name = 'prj_domain_name'
|
|
||||||
p_user_domain_name = 'user_domain_name'
|
|
||||||
p_password = '12345'
|
|
||||||
config = {'auth_url': p_auth_url, 'project_name': p_project_name,
|
|
||||||
'username': p_username,
|
|
||||||
'project_domain_name': p_project_domain_name, 'type': p_type,
|
|
||||||
'user_domain_name': p_user_domain_name,
|
|
||||||
'password': p_password}
|
|
||||||
extra_body = {'description': description,
|
|
||||||
'attributes': {'config': config}}
|
|
||||||
|
|
||||||
self.assertRaises(exceptions.InvalidInput,
|
|
||||||
self._test_update_resource,
|
|
||||||
self._RESOURCE, cmd, name, args, extra_body)
|
|
||||||
|
|
||||||
def test_vnf_update_empty_config_file(self):
|
|
||||||
cmd = vnf.UpdateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
name = 'my-name'
|
|
||||||
description = 'Vim Description'
|
|
||||||
vim_config = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_empty_config.yaml')
|
|
||||||
args = [
|
|
||||||
name,
|
|
||||||
'--config-file', vim_config,
|
|
||||||
'--description', description]
|
|
||||||
extra_body = {'description': description}
|
|
||||||
|
|
||||||
self.assertRaises(exceptions.InvalidInput,
|
|
||||||
self._test_update_resource,
|
|
||||||
self._RESOURCE, cmd, name, args, extra_body)
|
|
||||||
|
|
||||||
def test_vnf_update_invalid_format_config(self):
|
|
||||||
cmd = vnf.UpdateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
name = 'vnfs/my-id'
|
|
||||||
key = 'key'
|
|
||||||
value = 'new-value'
|
|
||||||
description = 'Vim Description'
|
|
||||||
extra_fields = {'attributes': {'param_values': {key: value}}}
|
|
||||||
config = 'test: : ]['
|
|
||||||
args = [my_id,
|
|
||||||
'--config', config,
|
|
||||||
'--description', description]
|
|
||||||
|
|
||||||
self.assertRaises(exceptions.InvalidInput,
|
|
||||||
self._test_update_resource,
|
|
||||||
self._RESOURCE, cmd, name, args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_empty_config(self):
|
|
||||||
cmd = vnf.UpdateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
name = 'my-name'
|
|
||||||
description = 'Vim Description'
|
|
||||||
config = {}
|
|
||||||
args = [name,
|
|
||||||
'--config', str(config),
|
|
||||||
'--description', description]
|
|
||||||
extra_body = {'description': description}
|
|
||||||
|
|
||||||
self.assertRaises(exceptions.InvalidInput,
|
|
||||||
self._test_update_resource,
|
|
||||||
self._RESOURCE, cmd, name, args, extra_body)
|
|
||||||
|
|
||||||
def test_vnf_update_multi_args_config_configfile_paramfile(self):
|
|
||||||
cmd = vnf.UpdateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
key = 'key'
|
|
||||||
name = 'my-name'
|
|
||||||
value = 'new-value'
|
|
||||||
description = 'Vim Description'
|
|
||||||
p_auth_url = 'https://1.2.3.4:6443'
|
|
||||||
p_type = 'kubernetes'
|
|
||||||
p_password = '12345'
|
|
||||||
p_project_name = 'default'
|
|
||||||
p_username = 'xyz'
|
|
||||||
p_ssl_ca_cert = 'abcxyz'
|
|
||||||
config = {'password': p_password, 'project_name': p_project_name,
|
|
||||||
'username': p_username, 'type': p_type,
|
|
||||||
'ssl_ca_cert': p_ssl_ca_cert, 'auth_url': p_auth_url}
|
|
||||||
vim_config = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_config.yaml')
|
|
||||||
param_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_param.yaml')
|
|
||||||
args = [my_id,
|
|
||||||
'--config-file', str(vim_config),
|
|
||||||
'--param-file', str(param_file),
|
|
||||||
'--config', str(config),
|
|
||||||
'--description', description]
|
|
||||||
extra_fields = {'attributes': {'param_values': {key: value}}}
|
|
||||||
|
|
||||||
self.assertRaises(BaseException,
|
|
||||||
self._test_update_resource,
|
|
||||||
self._RESOURCE, cmd, name, args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_multi_args_configfile_paramfile(self):
|
|
||||||
cmd = vnf.UpdateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
name = 'my_name'
|
|
||||||
my_id = 'my-id'
|
|
||||||
description = 'Vim Description'
|
|
||||||
param_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_param.yaml')
|
|
||||||
vim_config = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_config.yaml')
|
|
||||||
args = [
|
|
||||||
my_id,
|
|
||||||
'--param-file', str(param_file),
|
|
||||||
'--config-file', vim_config,
|
|
||||||
'--description', description]
|
|
||||||
extra_body = {'description': description}
|
|
||||||
|
|
||||||
self.assertRaises(BaseException,
|
|
||||||
self._test_update_resource,
|
|
||||||
self._RESOURCE, cmd, name, args, extra_body)
|
|
||||||
|
|
||||||
def test_vnf_update_multi_args_config_configfile(self):
|
|
||||||
cmd = vnf.UpdateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
name = 'my_name'
|
|
||||||
my_id = 'my-id'
|
|
||||||
description = 'Vim Description'
|
|
||||||
p_auth_url = 'https://1.2.3.4:6443'
|
|
||||||
p_type = 'kubernetes'
|
|
||||||
p_password = '12345'
|
|
||||||
p_project_name = 'default'
|
|
||||||
p_username = 'xyz'
|
|
||||||
p_ssl_ca_cert = 'abcxyz'
|
|
||||||
config = {'password': p_password, 'project_name': p_project_name,
|
|
||||||
'username': p_username, 'type': p_type,
|
|
||||||
'ssl_ca_cert': p_ssl_ca_cert, 'auth_url': p_auth_url}
|
|
||||||
vim_config = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_config.yaml')
|
|
||||||
args = [
|
|
||||||
my_id,
|
|
||||||
'--config-file', str(vim_config),
|
|
||||||
'--config', str(config),
|
|
||||||
'--description', description]
|
|
||||||
extra_body = {'description': description}
|
|
||||||
|
|
||||||
self.assertRaises(BaseException,
|
|
||||||
self._test_update_resource,
|
|
||||||
self._RESOURCE, cmd, name, args, extra_body)
|
|
||||||
|
|
||||||
def test_vnf_update_multi_args_config_paramfile(self):
|
|
||||||
cmd = vnf.UpdateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
name = 'my_name'
|
|
||||||
my_id = 'my-id'
|
|
||||||
description = 'Vim Description'
|
|
||||||
p_auth_url = 'https://1.2.3.4:6443'
|
|
||||||
p_type = 'kubernetes'
|
|
||||||
p_password = '12345'
|
|
||||||
p_project_name = 'default'
|
|
||||||
p_username = 'xyz'
|
|
||||||
p_ssl_ca_cert = 'abcxyz'
|
|
||||||
config = {'password': p_password, 'project_name': p_project_name,
|
|
||||||
'username': p_username, 'type': p_type,
|
|
||||||
'ssl_ca_cert': p_ssl_ca_cert, 'auth_url': p_auth_url}
|
|
||||||
param_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/vnf_update_param.yaml')
|
|
||||||
args = [
|
|
||||||
my_id,
|
|
||||||
'--param-file', str(param_file),
|
|
||||||
'--config', str(config),
|
|
||||||
'--description', description]
|
|
||||||
extra_body = {'description': description}
|
|
||||||
|
|
||||||
self.assertRaises(BaseException,
|
|
||||||
self._test_update_resource,
|
|
||||||
self._RESOURCE, cmd, name, args, extra_body)
|
|
||||||
|
|
||||||
def test_vnf_update_param_file_with_empty_dict(self):
|
|
||||||
cmd = vnf.UpdateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
name = 'my-name'
|
|
||||||
key = 'key'
|
|
||||||
value = 'new-value'
|
|
||||||
config_file = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/'
|
|
||||||
'vnf_update_param_file_with_empty_dict.yaml')
|
|
||||||
args = [my_id, '--param-file', str(config_file)]
|
|
||||||
extra_fields = {'attributes': {'param_values': {key: value}}}
|
|
||||||
|
|
||||||
self.assertRaises(exceptions.InvalidInput,
|
|
||||||
self._test_update_resource,
|
|
||||||
self._RESOURCE, cmd, name, args, extra_fields)
|
|
||||||
|
|
||||||
def test_vnf_update_config_file_with_empty_dict(self):
|
|
||||||
cmd = vnf.UpdateVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
name = 'my-name'
|
|
||||||
description = 'Vim Description'
|
|
||||||
vim_config = utils.get_file_path(
|
|
||||||
'tests/unit/osc/samples/'
|
|
||||||
'vnf_update_config_file_with_empty_dict.yaml')
|
|
||||||
args = [
|
|
||||||
name,
|
|
||||||
'--config-file', vim_config,
|
|
||||||
'--description', description]
|
|
||||||
extra_body = {'description': description}
|
|
||||||
|
|
||||||
self.assertRaises(exceptions.InvalidInput,
|
|
||||||
self._test_update_resource,
|
|
||||||
self._RESOURCE, cmd, name, args, extra_body)
|
|
||||||
|
|
||||||
def test_delete_vnf(self):
|
|
||||||
cmd = vnf.DeleteVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
args = [my_id]
|
|
||||||
self._test_delete_resource(self._RESOURCE, cmd, my_id, args)
|
|
||||||
|
|
||||||
def test_delete_vnf_with_force(self):
|
|
||||||
cmd = vnf.DeleteVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
args = [my_id, '--force']
|
|
||||||
self._test_delete_resource(self._RESOURCE, cmd, my_id, args)
|
|
||||||
|
|
||||||
def test_list_vnf_resources(self):
|
|
||||||
cmd = vnf.ListVNFResources(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
base_args = [self.test_id]
|
|
||||||
response = [{'name': 'CP11', 'id': 'id1', 'type': 'NeutronPort'},
|
|
||||||
{'name': 'CP12', 'id': 'id2', 'type': 'NeutronPort'}]
|
|
||||||
val = self._test_list_sub_resources(self._VNF_RESOURCES, 'resources',
|
|
||||||
cmd, self.test_id,
|
|
||||||
response_contents=response,
|
|
||||||
detail=True, base_args=base_args)
|
|
||||||
self.assertIn('id1', val)
|
|
||||||
self.assertIn('NeutronPort', val)
|
|
||||||
self.assertIn('CP11', val)
|
|
||||||
|
|
||||||
def test_multi_delete_vnf(self):
|
|
||||||
cmd = vnf.DeleteVNF(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
vnf_ids = 'vnf1 vnf2 vnf3'
|
|
||||||
args = [vnf_ids]
|
|
||||||
self._test_delete_resource(self._RESOURCE, cmd, vnf_ids, args)
|
|
@@ -1,146 +0,0 @@
|
|||||||
# Copyright 2014 Intel Corporation
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from tackerclient.common.exceptions import InvalidInput
|
|
||||||
from tackerclient.tacker.v1_0.vnfm import vnfd
|
|
||||||
from tackerclient.tests.unit import test_cli10
|
|
||||||
from unittest.mock import mock_open
|
|
||||||
from unittest.mock import patch
|
|
||||||
|
|
||||||
|
|
||||||
class CLITestV10VmVNFDJSON(test_cli10.CLITestV10Base):
|
|
||||||
_RESOURCE = 'vnfd'
|
|
||||||
_RESOURCES = 'vnfds'
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
plurals = {'vnfds': 'vnfd'}
|
|
||||||
super(CLITestV10VmVNFDJSON, self).setUp(plurals=plurals)
|
|
||||||
|
|
||||||
@patch("tackerclient.tacker.v1_0.vnfm.vnfd.open",
|
|
||||||
side_effect=mock_open(read_data="vnfd"),
|
|
||||||
create=True)
|
|
||||||
def test_create_vnfd_all_params(self, mo):
|
|
||||||
cmd = vnfd.CreateVNFD(
|
|
||||||
test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
name = 'my-name'
|
|
||||||
attr_key = 'vnfd'
|
|
||||||
attr_val = 'vnfd'
|
|
||||||
args = [
|
|
||||||
name,
|
|
||||||
'--vnfd-file', 'vnfd-file'
|
|
||||||
]
|
|
||||||
position_names = ['name']
|
|
||||||
position_values = [name]
|
|
||||||
extra_body = {
|
|
||||||
'service_types': [{'service_type': 'vnfd'}],
|
|
||||||
'attributes': {attr_key: attr_val},
|
|
||||||
}
|
|
||||||
self._test_create_resource(self._RESOURCE, cmd, None, my_id,
|
|
||||||
args, position_names, position_values,
|
|
||||||
extra_body=extra_body)
|
|
||||||
|
|
||||||
@patch("tackerclient.tacker.v1_0.vnfm.vnfd.open",
|
|
||||||
side_effect=mock_open(read_data="vnfd"),
|
|
||||||
create=True)
|
|
||||||
def test_create_vnfd_with_mandatory_params(self, mo):
|
|
||||||
cmd = vnfd.CreateVNFD(
|
|
||||||
test_cli10.MyApp(sys.stdout), None)
|
|
||||||
name = 'my_name'
|
|
||||||
my_id = 'my-id'
|
|
||||||
args = [name, '--vnfd-file', 'vnfd-file', ]
|
|
||||||
position_names = ['name']
|
|
||||||
position_values = [name]
|
|
||||||
extra_body = {
|
|
||||||
'service_types': [{'service_type': 'vnfd'}],
|
|
||||||
'attributes': {'vnfd': 'vnfd'}
|
|
||||||
}
|
|
||||||
self._test_create_resource(self._RESOURCE, cmd, name, my_id,
|
|
||||||
args, position_names, position_values,
|
|
||||||
extra_body=extra_body)
|
|
||||||
|
|
||||||
@patch("tackerclient.tacker.v1_0.vnfm.vnfd.open",
|
|
||||||
side_effect=mock_open(read_data=""),
|
|
||||||
create=True)
|
|
||||||
def test_create_vnfd_with_empty_file(self, mo):
|
|
||||||
cmd = vnfd.CreateVNFD(
|
|
||||||
test_cli10.MyApp(sys.stdout), None)
|
|
||||||
name = 'my_name'
|
|
||||||
my_id = 'my-id'
|
|
||||||
args = [name, '--vnfd-file', 'vnfd-file', ]
|
|
||||||
position_names = ['name']
|
|
||||||
position_values = [name]
|
|
||||||
extra_body = {
|
|
||||||
'service_types': [{'service_type': 'vnfd'}],
|
|
||||||
'attributes': {'vnfd': 'vnfd'}
|
|
||||||
}
|
|
||||||
err = None
|
|
||||||
try:
|
|
||||||
self._test_create_resource(self._RESOURCE, cmd, name, my_id,
|
|
||||||
args, position_names, position_values,
|
|
||||||
extra_body=extra_body)
|
|
||||||
except InvalidInput:
|
|
||||||
err = True
|
|
||||||
self.assertEqual(True, err)
|
|
||||||
|
|
||||||
def test_list_vnfds(self):
|
|
||||||
cmd = vnfd.ListVNFD(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
self._test_list_resources(self._RESOURCES, cmd, True,
|
|
||||||
template_source='onboarded')
|
|
||||||
|
|
||||||
def test_list_inline_vnfds(self):
|
|
||||||
cmd = vnfd.ListVNFD(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
self._test_list_resources(self._RESOURCES, cmd, True,
|
|
||||||
template_source='inline')
|
|
||||||
|
|
||||||
def test_list_all_vnfds(self):
|
|
||||||
cmd = vnfd.ListVNFD(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
self._test_list_resources(self._RESOURCES, cmd, True,
|
|
||||||
template_source='all')
|
|
||||||
|
|
||||||
def test_list_vnfds_pagenation(self):
|
|
||||||
cmd = vnfd.ListVNFD(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
print(cmd)
|
|
||||||
self._test_list_resources(self._RESOURCES, cmd, True,
|
|
||||||
template_source='onboarded')
|
|
||||||
|
|
||||||
def test_show_vnfd_id(self):
|
|
||||||
cmd = vnfd.ShowVNFD(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
args = ['--fields', 'id', self.test_id]
|
|
||||||
self._test_show_resource(self._RESOURCE, cmd, self.test_id, args,
|
|
||||||
['id'])
|
|
||||||
|
|
||||||
def test_show_vnfd_id_name(self):
|
|
||||||
cmd = vnfd.ShowVNFD(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
args = ['--fields', 'id', '--fields', 'name', self.test_id]
|
|
||||||
self._test_show_resource(self._RESOURCE, cmd, self.test_id,
|
|
||||||
args, ['id', 'name'])
|
|
||||||
|
|
||||||
def test_delete_vnfd(self):
|
|
||||||
cmd = vnfd.DeleteVNFD(
|
|
||||||
test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
args = [my_id]
|
|
||||||
self._test_delete_resource(self._RESOURCE, cmd, my_id, args)
|
|
||||||
|
|
||||||
def test_multi_delete_vnfd(self):
|
|
||||||
cmd = vnfd.DeleteVNFD(
|
|
||||||
test_cli10.MyApp(sys.stdout), None)
|
|
||||||
vnfd_ids = 'my-id1 my-id2 my-id3'
|
|
||||||
args = [vnfd_ids]
|
|
||||||
self._test_delete_resource(self._RESOURCE, cmd, vnfd_ids, args)
|
|
@@ -1,126 +0,0 @@
|
|||||||
# Copyright 2014 Intel Corporation
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from tackerclient.common import utils
|
|
||||||
from tackerclient.tacker.v1_0.nfvo import vnffg
|
|
||||||
from tackerclient.tests.unit import test_cli10
|
|
||||||
|
|
||||||
API_VERSION = "1.0"
|
|
||||||
FORMAT = 'json'
|
|
||||||
TOKEN = 'testtoken'
|
|
||||||
ENDURL = 'localurl'
|
|
||||||
|
|
||||||
|
|
||||||
class CLITestV10VmVNFFGJSON(test_cli10.CLITestV10Base):
|
|
||||||
_RESOURCE = 'vnffg'
|
|
||||||
_RESOURCES = 'vnffgs'
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
plurals = {'vnffgs': 'vnffg'}
|
|
||||||
super(CLITestV10VmVNFFGJSON, self).setUp(plurals=plurals)
|
|
||||||
|
|
||||||
def test_create_vnffg_all_params(self):
|
|
||||||
cmd = vnffg.CreateVNFFG(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
vnffgd_id = 'vnffgd'
|
|
||||||
vnffg_name = 'fake-vnffg'
|
|
||||||
vnf_mapping = 'VNFD1:VNF1'
|
|
||||||
|
|
||||||
args = [
|
|
||||||
vnffg_name,
|
|
||||||
'--vnffgd-id', vnffgd_id,
|
|
||||||
'--vnf-mapping', vnf_mapping,
|
|
||||||
'--symmetrical']
|
|
||||||
position_names = ['vnffgd_id', 'vnf_mapping', 'symmetrical']
|
|
||||||
position_values = [vnffgd_id, {"VNFD1": "VNF1"}, True]
|
|
||||||
extra_body = {'name': vnffg_name, 'attributes': {}}
|
|
||||||
self._test_create_resource(self._RESOURCE, cmd, None, my_id,
|
|
||||||
args, position_names, position_values,
|
|
||||||
extra_body=extra_body,
|
|
||||||
get_client_called_count=2)
|
|
||||||
|
|
||||||
def test_create_vnffg_with_mandatory_params(self):
|
|
||||||
cmd = vnffg.CreateVNFFG(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
vnffg_name = 'fake-vnffg'
|
|
||||||
vnffgd_id = 'vnffgd'
|
|
||||||
args = [
|
|
||||||
vnffg_name,
|
|
||||||
'--vnffgd-id', vnffgd_id,
|
|
||||||
]
|
|
||||||
position_names = ['vnffgd_id']
|
|
||||||
position_values = [vnffgd_id]
|
|
||||||
extra_body = {'symmetrical': False, 'name': vnffg_name,
|
|
||||||
'attributes': {}}
|
|
||||||
self._test_create_resource(self._RESOURCE, cmd, vnffg_name, my_id,
|
|
||||||
args, position_names, position_values,
|
|
||||||
extra_body=extra_body,
|
|
||||||
get_client_called_count=2)
|
|
||||||
|
|
||||||
def test_list_vnffgs(self):
|
|
||||||
cmd = vnffg.ListVNFFG(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
self._test_list_resources(self._RESOURCES, cmd, True)
|
|
||||||
|
|
||||||
def test_list_vnffgs_pagenation(self):
|
|
||||||
cmd = vnffg.ListVNFFG(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
self._test_list_resources(self._RESOURCES, cmd, True)
|
|
||||||
|
|
||||||
def test_show_vnffg_id(self):
|
|
||||||
cmd = vnffg.ShowVNFFG(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
args = ['--fields', 'id', self.test_id]
|
|
||||||
self._test_show_resource(self._RESOURCE, cmd, self.test_id, args,
|
|
||||||
['id'])
|
|
||||||
|
|
||||||
def test_show_vnffg_id_name(self):
|
|
||||||
cmd = vnffg.ShowVNFFG(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
args = ['--fields', 'id', '--fields', 'name', self.test_id]
|
|
||||||
self._test_show_resource(self._RESOURCE, cmd, self.test_id,
|
|
||||||
args, ['id', 'name'])
|
|
||||||
|
|
||||||
def test_update_vnffg(self):
|
|
||||||
cmd = vnffg.UpdateVNFFG(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
update_vnffg = utils.get_file_path(
|
|
||||||
'tests/unit/vm/samples/vnffg_update_file.yaml')
|
|
||||||
vnf_mapping = 'VNFD1:VNF1'
|
|
||||||
args = [
|
|
||||||
my_id,
|
|
||||||
'--vnf-mapping', vnf_mapping,
|
|
||||||
'--vnffgd-template', str(update_vnffg),
|
|
||||||
'--symmetrical'
|
|
||||||
]
|
|
||||||
extra_fields = {
|
|
||||||
"vnf_mapping": {"VNFD1": "VNF1"},
|
|
||||||
"vnffgd_template": "abcxyz",
|
|
||||||
"symmetrical": True
|
|
||||||
}
|
|
||||||
self._test_update_resource(self._RESOURCE, cmd, my_id,
|
|
||||||
args, extra_fields,
|
|
||||||
get_client_called_count=2)
|
|
||||||
|
|
||||||
def test_delete_vnffg_without_force(self):
|
|
||||||
cmd = vnffg.DeleteVNFFG(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
args = [my_id]
|
|
||||||
self._test_delete_resource(self._RESOURCE, cmd, my_id, args)
|
|
||||||
|
|
||||||
def test_delete_vnffg_with_force(self):
|
|
||||||
cmd = vnffg.DeleteVNFFG(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
args = [my_id, '--force']
|
|
||||||
self._test_delete_resource(self._RESOURCE, cmd, my_id, args)
|
|
@@ -1,113 +0,0 @@
|
|||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from tackerclient.tacker.v1_0.nfvo import vnffgd
|
|
||||||
from tackerclient.tests.unit import test_cli10
|
|
||||||
from unittest.mock import mock_open
|
|
||||||
from unittest.mock import patch
|
|
||||||
|
|
||||||
|
|
||||||
class CLITestV10VmVNFFGDJSON(test_cli10.CLITestV10Base):
|
|
||||||
_RESOURCE = 'vnffgd'
|
|
||||||
_RESOURCES = 'vnffgds'
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
plurals = {'vnffgds': 'vnffgd'}
|
|
||||||
super(CLITestV10VmVNFFGDJSON, self).setUp(plurals=plurals)
|
|
||||||
|
|
||||||
@patch("tackerclient.tacker.v1_0.nfvo.vnffgd.open",
|
|
||||||
side_effect=mock_open(read_data="vnffgd"),
|
|
||||||
create=True)
|
|
||||||
def test_create_vnffgd_all_params(self, mo):
|
|
||||||
cmd = vnffgd.CreateVNFFGD(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
name = 'my-name'
|
|
||||||
attr_key = 'vnffgd'
|
|
||||||
attr_val = 'vnffgd'
|
|
||||||
description = 'vnffgd description'
|
|
||||||
args = [
|
|
||||||
name,
|
|
||||||
'--vnffgd-file', 'vnffgd_file',
|
|
||||||
'--description', description,
|
|
||||||
]
|
|
||||||
position_names = ['name', 'description']
|
|
||||||
position_values = [name, description]
|
|
||||||
extra_body = {
|
|
||||||
'template': {attr_key: attr_val},
|
|
||||||
}
|
|
||||||
|
|
||||||
self._test_create_resource(self._RESOURCE, cmd, name, my_id,
|
|
||||||
args, position_names, position_values,
|
|
||||||
extra_body=extra_body)
|
|
||||||
|
|
||||||
@patch("tackerclient.tacker.v1_0.nfvo.vnffgd.open",
|
|
||||||
side_effect=mock_open(read_data="vnffgd"),
|
|
||||||
create=True)
|
|
||||||
def test_create_vnffgd_with_mandatory_params(self, mo):
|
|
||||||
cmd = vnffgd.CreateVNFFGD(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
name = 'my-name'
|
|
||||||
attr_key = 'vnffgd'
|
|
||||||
attr_val = 'vnffgd'
|
|
||||||
args = [
|
|
||||||
name,
|
|
||||||
'--vnffgd-file', 'vnffgd_file',
|
|
||||||
]
|
|
||||||
position_names = ['name']
|
|
||||||
position_values = [name]
|
|
||||||
extra_body = {
|
|
||||||
'template': {attr_key: attr_val},
|
|
||||||
}
|
|
||||||
|
|
||||||
self._test_create_resource(self._RESOURCE, cmd, name, my_id,
|
|
||||||
args, position_names, position_values,
|
|
||||||
extra_body=extra_body)
|
|
||||||
|
|
||||||
def test_list_vnffgds(self):
|
|
||||||
cmd = vnffgd.ListVNFFGD(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
self._test_list_resources(self._RESOURCES, cmd, True,
|
|
||||||
template_source='onboarded')
|
|
||||||
|
|
||||||
def test_list_inline_vnffgds(self):
|
|
||||||
cmd = vnffgd.ListVNFFGD(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
self._test_list_resources(self._RESOURCES, cmd, True,
|
|
||||||
template_source='inline')
|
|
||||||
|
|
||||||
def test_list_all_vnffgds(self):
|
|
||||||
cmd = vnffgd.ListVNFFGD(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
self._test_list_resources(self._RESOURCES, cmd, True,
|
|
||||||
template_source='all')
|
|
||||||
|
|
||||||
def test_list_vnffgds_pagenation(self):
|
|
||||||
cmd = vnffgd.ListVNFFGD(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
self._test_list_resources(self._RESOURCES, cmd, True,
|
|
||||||
template_source='onboarded')
|
|
||||||
|
|
||||||
def test_show_vnffgd_id(self):
|
|
||||||
cmd = vnffgd.ShowVNFFGD(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
args = ['--fields', 'id', self.test_id]
|
|
||||||
self._test_show_resource(self._RESOURCE, cmd, self.test_id, args,
|
|
||||||
['id'])
|
|
||||||
|
|
||||||
def test_show_vnffgd_id_name(self):
|
|
||||||
cmd = vnffgd.ShowVNFFGD(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
args = ['--fields', 'id', '--fields', 'name', self.test_id]
|
|
||||||
self._test_show_resource(self._RESOURCE, cmd, self.test_id,
|
|
||||||
args, ['id', 'name'])
|
|
||||||
|
|
||||||
def test_delete_vnffgd(self):
|
|
||||||
cmd = vnffgd.DeleteVNFFGD(test_cli10.MyApp(sys.stdout), None)
|
|
||||||
my_id = 'my-id'
|
|
||||||
args = [my_id]
|
|
||||||
self._test_delete_resource(self._RESOURCE, cmd, my_id, args)
|
|
@@ -23,7 +23,6 @@ import requests
|
|||||||
from urllib import parse as urlparse
|
from urllib import parse as urlparse
|
||||||
|
|
||||||
from tackerclient import client
|
from tackerclient import client
|
||||||
from tackerclient.common import constants
|
|
||||||
from tackerclient.common import exceptions
|
from tackerclient.common import exceptions
|
||||||
from tackerclient.common import serializer
|
from tackerclient.common import serializer
|
||||||
from tackerclient.common import utils
|
from tackerclient.common import utils
|
||||||
@@ -277,7 +276,7 @@ class ClientBase(object):
|
|||||||
return self.httpclient.get_auth_info()
|
return self.httpclient.get_auth_info()
|
||||||
|
|
||||||
def serialize(self, data):
|
def serialize(self, data):
|
||||||
"""Serializes a dictionary into either XML or JSON.
|
"""Serializes a dictionary JSON.
|
||||||
|
|
||||||
A dictionary with a single key can be passed and it can contain any
|
A dictionary with a single key can be passed and it can contain any
|
||||||
structure.
|
structure.
|
||||||
@@ -287,34 +286,20 @@ class ClientBase(object):
|
|||||||
elif self.format in ('zip', 'text'):
|
elif self.format in ('zip', 'text'):
|
||||||
return data
|
return data
|
||||||
elif type(data) is dict:
|
elif type(data) is dict:
|
||||||
return serializer.Serializer(
|
return serializer.Serializer().serialize(data, 'application/json')
|
||||||
self.get_attr_metadata()).serialize(data, self.content_type())
|
|
||||||
else:
|
else:
|
||||||
raise Exception(_("Unable to serialize object of type = '%s'") %
|
raise Exception(_("Unable to serialize object of type = '%s'") %
|
||||||
type(data))
|
type(data))
|
||||||
|
|
||||||
def deserialize(self, data, status_code):
|
def deserialize(self, data, status_code):
|
||||||
"""Deserializes an XML or JSON string into a dictionary."""
|
"""Deserializes an JSON string into a dictionary."""
|
||||||
if status_code in (204, 202) or self.format in ('zip', 'text', 'any'):
|
if status_code in (204, 202) or self.format in ('zip', 'text', 'any'):
|
||||||
return data
|
return data
|
||||||
return serializer.Serializer(self.get_attr_metadata()).deserialize(
|
return serializer.Serializer().deserialize(
|
||||||
data, self.content_type())['body']
|
data, 'application/json')['body']
|
||||||
|
|
||||||
def get_attr_metadata(self):
|
|
||||||
if self.format == 'json':
|
|
||||||
return {}
|
|
||||||
old_request_format = self.format
|
|
||||||
self.format = 'json'
|
|
||||||
exts = self.list_extensions()['extensions']
|
|
||||||
self.format = old_request_format
|
|
||||||
ns = dict([(ext['alias'], ext['namespace']) for ext in exts])
|
|
||||||
self.EXTED_PLURALS.update(constants.PLURALS)
|
|
||||||
return {'plurals': self.EXTED_PLURALS,
|
|
||||||
'xmlns': constants.XML_NS_V10,
|
|
||||||
constants.EXT_NS: ns}
|
|
||||||
|
|
||||||
def content_type(self, _format=None):
|
def content_type(self, _format=None):
|
||||||
"""Returns the mime-type for either 'xml', 'json, 'text', or 'zip'.
|
"""Returns the mime-type for either 'json, 'text', or 'zip'.
|
||||||
|
|
||||||
Defaults to the currently set format.
|
Defaults to the currently set format.
|
||||||
"""
|
"""
|
||||||
@@ -418,129 +403,12 @@ class ClientBase(object):
|
|||||||
|
|
||||||
class LegacyClient(ClientBase):
|
class LegacyClient(ClientBase):
|
||||||
|
|
||||||
extensions_path = "/extensions"
|
|
||||||
extension_path = "/extensions/%s"
|
|
||||||
|
|
||||||
vnfds_path = '/vnfds'
|
|
||||||
vnfd_path = '/vnfds/%s'
|
|
||||||
vnfs_path = '/vnfs'
|
|
||||||
vnf_path = '/vnfs/%s'
|
|
||||||
vnf_scale_path = '/vnfs/%s/actions'
|
|
||||||
vnf_resources_path = '/vnfs/%s/resources'
|
|
||||||
|
|
||||||
vims_path = '/vims'
|
vims_path = '/vims'
|
||||||
vim_path = '/vims/%s'
|
vim_path = '/vims/%s'
|
||||||
|
|
||||||
events_path = '/events'
|
|
||||||
event_path = '/events/%s'
|
|
||||||
|
|
||||||
vnffgds_path = '/vnffgds'
|
|
||||||
vnffgd_path = '/vnffgds/%s'
|
|
||||||
|
|
||||||
vnffgs_path = '/vnffgs'
|
|
||||||
vnffg_path = '/vnffgs/%s'
|
|
||||||
|
|
||||||
nfps_path = '/nfps'
|
|
||||||
nfp_path = '/nfps/%s'
|
|
||||||
|
|
||||||
sfcs_path = '/sfcs'
|
|
||||||
sfc_path = '/sfcs/%s'
|
|
||||||
|
|
||||||
fcs_path = '/classifiers'
|
|
||||||
fc_path = '/classifiers/%s'
|
|
||||||
|
|
||||||
nsds_path = '/nsds'
|
|
||||||
nsd_path = '/nsds/%s'
|
|
||||||
|
|
||||||
nss_path = '/nss'
|
|
||||||
ns_path = '/nss/%s'
|
|
||||||
|
|
||||||
clusters_path = '/clusters'
|
|
||||||
cluster_path = '/clusters/%s'
|
|
||||||
cluster_members_path = '/clustermembers'
|
|
||||||
cluster_member_path = '/clustermembers/%s'
|
|
||||||
|
|
||||||
# API has no way to report plurals, so we have to hard code them
|
# API has no way to report plurals, so we have to hard code them
|
||||||
# EXTED_PLURALS = {}
|
# EXTED_PLURALS = {}
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_extensions(self, **_params):
|
|
||||||
"""Fetch a list of all exts on server side."""
|
|
||||||
return self.get(self.extensions_path, params=_params)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def show_extension(self, ext_alias, **_params):
|
|
||||||
"""Fetch a list of all exts on server side."""
|
|
||||||
return self.get(self.extension_path % ext_alias, params=_params)
|
|
||||||
|
|
||||||
_VNFD = "vnfd"
|
|
||||||
_NSD = "nsd"
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_vnfds(self, retrieve_all=True, **_params):
|
|
||||||
vnfds_dict = self.list(self._VNFD + 's',
|
|
||||||
self.vnfds_path,
|
|
||||||
retrieve_all,
|
|
||||||
**_params)
|
|
||||||
for vnfd in vnfds_dict['vnfds']:
|
|
||||||
if vnfd.get('description'):
|
|
||||||
if len(vnfd['description']) > DEFAULT_DESC_LENGTH:
|
|
||||||
vnfd['description'] = \
|
|
||||||
vnfd['description'][:DEFAULT_DESC_LENGTH]
|
|
||||||
vnfd['description'] += '...'
|
|
||||||
return vnfds_dict
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def show_vnfd(self, vnfd, **_params):
|
|
||||||
return self.get(self.vnfd_path % vnfd,
|
|
||||||
params=_params)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def create_vnfd(self, body):
|
|
||||||
body[self._VNFD]['service_types'] = [{'service_type': 'vnfd'}]
|
|
||||||
return self.post(self.vnfds_path, body)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def delete_vnfd(self, vnfd):
|
|
||||||
return self.delete(self.vnfd_path % vnfd)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_vnfs(self, retrieve_all=True, **_params):
|
|
||||||
vnfs = self.list('vnfs', self.vnfs_path, retrieve_all, **_params)
|
|
||||||
for vnf in vnfs['vnfs']:
|
|
||||||
error_reason = vnf.get('error_reason', None)
|
|
||||||
if error_reason and \
|
|
||||||
len(error_reason) > DEFAULT_ERROR_REASON_LENGTH:
|
|
||||||
vnf['error_reason'] = error_reason[
|
|
||||||
:DEFAULT_ERROR_REASON_LENGTH]
|
|
||||||
vnf['error_reason'] += '...'
|
|
||||||
return vnfs
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def show_vnf(self, vnf, **_params):
|
|
||||||
return self.get(self.vnf_path % vnf, params=_params)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def create_vnf(self, body):
|
|
||||||
return self.post(self.vnfs_path, body=body)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def delete_vnf(self, vnf, body=None):
|
|
||||||
return self.delete(self.vnf_path % vnf, body=body)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def update_vnf(self, vnf, body):
|
|
||||||
return self.put(self.vnf_path % vnf, body=body)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_vnf_resources(self, vnf, retrieve_all=True, **_params):
|
|
||||||
return self.list('resources', self.vnf_resources_path % vnf,
|
|
||||||
retrieve_all, **_params)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def scale_vnf(self, vnf, body=None):
|
|
||||||
return self.post(self.vnf_scale_path % vnf, body=body)
|
|
||||||
|
|
||||||
@APIParamsCall
|
@APIParamsCall
|
||||||
def show_vim(self, vim, **_params):
|
def show_vim(self, vim, **_params):
|
||||||
return self.get(self.vim_path % vim, params=_params)
|
return self.get(self.vim_path % vim, params=_params)
|
||||||
@@ -563,239 +431,6 @@ class LegacyClient(ClientBase):
|
|||||||
def list_vims(self, retrieve_all=True, **_params):
|
def list_vims(self, retrieve_all=True, **_params):
|
||||||
return self.list('vims', self.vims_path, retrieve_all, **_params)
|
return self.list('vims', self.vims_path, retrieve_all, **_params)
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_events(self, retrieve_all=True, **_params):
|
|
||||||
events = self.list('events', self.events_path, retrieve_all,
|
|
||||||
**_params)
|
|
||||||
return events
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_vnf_events(self, retrieve_all=True, **_params):
|
|
||||||
_params['resource_type'] = 'vnf'
|
|
||||||
events = self.list('events', self.events_path, retrieve_all,
|
|
||||||
**_params)
|
|
||||||
vnf_events = {}
|
|
||||||
vnf_events['vnf_events'] = events['events']
|
|
||||||
return vnf_events
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_vnfd_events(self, retrieve_all=True, **_params):
|
|
||||||
_params['resource_type'] = 'vnfd'
|
|
||||||
events = self.list('events', self.events_path, retrieve_all,
|
|
||||||
**_params)
|
|
||||||
vnfd_events = {}
|
|
||||||
vnfd_events['vnfd_events'] = events['events']
|
|
||||||
return vnfd_events
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_vim_events(self, retrieve_all=True, **_params):
|
|
||||||
_params['resource_type'] = 'vim'
|
|
||||||
events = self.list('events', self.events_path, retrieve_all,
|
|
||||||
**_params)
|
|
||||||
vim_events = {}
|
|
||||||
vim_events['vim_events'] = events['events']
|
|
||||||
return vim_events
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def show_event(self, event_id, **_params):
|
|
||||||
return self.get(self.event_path % event_id, params=_params)
|
|
||||||
|
|
||||||
_VNFFGD = "vnffgd"
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def create_vnffgd(self, body):
|
|
||||||
return self.post(self.vnffgds_path, body)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_vnffgds(self, retrieve_all=True, **_params):
|
|
||||||
vnffgds_dict = self.list(self._VNFFGD + 's',
|
|
||||||
self.vnffgds_path,
|
|
||||||
retrieve_all,
|
|
||||||
**_params)
|
|
||||||
for vnffgd in vnffgds_dict['vnffgds']:
|
|
||||||
if 'description' in vnffgd.keys() and \
|
|
||||||
len(vnffgd['description']) > DEFAULT_DESC_LENGTH:
|
|
||||||
vnffgd['description'] = vnffgd['description'][
|
|
||||||
:DEFAULT_DESC_LENGTH]
|
|
||||||
vnffgd['description'] += '...'
|
|
||||||
return vnffgds_dict
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def show_vnffgd(self, vnffgd, **_params):
|
|
||||||
return self.get(self.vnffgd_path % vnffgd, params=_params)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def delete_vnffgd(self, vnffgd):
|
|
||||||
return self.delete(self.vnffgd_path % vnffgd)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_vnffgs(self, retrieve_all=True, **_params):
|
|
||||||
vnffgs = self.list('vnffgs', self.vnffgs_path, retrieve_all, **_params)
|
|
||||||
for vnffg in vnffgs['vnffgs']:
|
|
||||||
error_reason = vnffg.get('error_reason', None)
|
|
||||||
if error_reason and \
|
|
||||||
len(error_reason) > DEFAULT_ERROR_REASON_LENGTH:
|
|
||||||
vnffg['error_reason'] = error_reason[
|
|
||||||
:DEFAULT_ERROR_REASON_LENGTH]
|
|
||||||
vnffg['error_reason'] += '...'
|
|
||||||
return vnffgs
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def show_vnffg(self, vnffg, **_params):
|
|
||||||
return self.get(self.vnffg_path % vnffg, params=_params)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def create_vnffg(self, body):
|
|
||||||
return self.post(self.vnffgs_path, body=body)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def delete_vnffg(self, vnffg, body=None):
|
|
||||||
return self.delete(self.vnffg_path % vnffg, body=body)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def update_vnffg(self, vnffg, body):
|
|
||||||
return self.put(self.vnffg_path % vnffg, body=body)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_sfcs(self, retrieve_all=True, **_params):
|
|
||||||
sfcs = self.list('sfcs', self.sfcs_path, retrieve_all, **_params)
|
|
||||||
for chain in sfcs['sfcs']:
|
|
||||||
error_reason = chain.get('error_reason', None)
|
|
||||||
if error_reason and \
|
|
||||||
len(error_reason) > DEFAULT_ERROR_REASON_LENGTH:
|
|
||||||
chain['error_reason'] = error_reason[
|
|
||||||
:DEFAULT_ERROR_REASON_LENGTH]
|
|
||||||
chain['error_reason'] += '...'
|
|
||||||
return sfcs
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def show_sfc(self, chain, **_params):
|
|
||||||
return self.get(self.sfc_path % chain, params=_params)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_nfps(self, retrieve_all=True, **_params):
|
|
||||||
nfps = self.list('nfps', self.nfps_path, retrieve_all, **_params)
|
|
||||||
for nfp in nfps['nfps']:
|
|
||||||
error_reason = nfp.get('error_reason', None)
|
|
||||||
if error_reason and \
|
|
||||||
len(error_reason) > DEFAULT_ERROR_REASON_LENGTH:
|
|
||||||
nfp['error_reason'] = error_reason[
|
|
||||||
:DEFAULT_ERROR_REASON_LENGTH]
|
|
||||||
nfp['error_reason'] += '...'
|
|
||||||
return nfps
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def show_nfp(self, nfp, **_params):
|
|
||||||
return self.get(self.nfp_path % nfp, params=_params)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_classifiers(self, retrieve_all=True, **_params):
|
|
||||||
classifiers = self.list('classifiers', self.fcs_path, retrieve_all,
|
|
||||||
**_params)
|
|
||||||
for classifier in classifiers['classifiers']:
|
|
||||||
error_reason = classifier.get('error_reason', None)
|
|
||||||
if error_reason and \
|
|
||||||
len(error_reason) > DEFAULT_ERROR_REASON_LENGTH:
|
|
||||||
classifier['error_reason'] = error_reason[
|
|
||||||
:DEFAULT_ERROR_REASON_LENGTH]
|
|
||||||
classifier['error_reason'] += '...'
|
|
||||||
return classifiers
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def show_classifier(self, classifier, **_params):
|
|
||||||
return self.get(self.fc_path % classifier, params=_params)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_nsds(self, retrieve_all=True, **_params):
|
|
||||||
nsds_dict = self.list(self._NSD + 's',
|
|
||||||
self.nsds_path,
|
|
||||||
retrieve_all,
|
|
||||||
**_params)
|
|
||||||
for nsd in nsds_dict['nsds']:
|
|
||||||
if 'description' in nsd.keys() and \
|
|
||||||
len(nsd['description']) > DEFAULT_DESC_LENGTH:
|
|
||||||
nsd['description'] = nsd['description'][:DEFAULT_DESC_LENGTH]
|
|
||||||
nsd['description'] += '...'
|
|
||||||
return nsds_dict
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def show_nsd(self, nsd, **_params):
|
|
||||||
return self.get(self.nsd_path % nsd,
|
|
||||||
params=_params)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def create_nsd(self, body):
|
|
||||||
return self.post(self.nsds_path, body)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def delete_nsd(self, nsd):
|
|
||||||
return self.delete(self.nsd_path % nsd)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_nss(self, retrieve_all=True, **_params):
|
|
||||||
nss = self.list('nss', self.nss_path, retrieve_all, **_params)
|
|
||||||
for ns in nss['nss']:
|
|
||||||
error_reason = ns.get('error_reason', None)
|
|
||||||
if error_reason and \
|
|
||||||
len(error_reason) > DEFAULT_ERROR_REASON_LENGTH:
|
|
||||||
ns['error_reason'] = error_reason[
|
|
||||||
:DEFAULT_ERROR_REASON_LENGTH]
|
|
||||||
ns['error_reason'] += '...'
|
|
||||||
return nss
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def show_ns(self, ns, **_params):
|
|
||||||
return self.get(self.ns_path % ns, params=_params)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def create_ns(self, body):
|
|
||||||
return self.post(self.nss_path, body=body)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def delete_ns(self, ns, body=None):
|
|
||||||
return self.delete(self.ns_path % ns, body=body)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def create_cluster(self, body=None):
|
|
||||||
return self.post(self.clusters_path, body)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_clusters(self, retrieve_all=True, **_params):
|
|
||||||
clusters = self.list('clusters', self.clusters_path,
|
|
||||||
retrieve_all, **_params)
|
|
||||||
return clusters
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def show_cluster(self, cluster, **_params):
|
|
||||||
member = self.get(self.cluster_path % cluster,
|
|
||||||
params=_params)
|
|
||||||
return member
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def delete_cluster(self, cluster):
|
|
||||||
return self.delete(self.cluster_path % cluster)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def create_clustermember(self, body=None):
|
|
||||||
return self.post(self.cluster_members_path, body)
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def list_clustermembers(self, retrieve_all=True, **_params):
|
|
||||||
cluster_members = self.list('clustermembers',
|
|
||||||
self.cluster_members_path,
|
|
||||||
retrieve_all, **_params)
|
|
||||||
return cluster_members
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def show_clustermember(self, clustermember, **_params):
|
|
||||||
member = self.get(self.cluster_member_path % clustermember,
|
|
||||||
params=_params)
|
|
||||||
return member
|
|
||||||
|
|
||||||
@APIParamsCall
|
|
||||||
def delete_clustermember(self, clustermember):
|
|
||||||
return self.delete(self.cluster_member_path % clustermember)
|
|
||||||
|
|
||||||
|
|
||||||
class VnfPackageClient(ClientBase):
|
class VnfPackageClient(ClientBase):
|
||||||
"""Client for vnfpackage APIs.
|
"""Client for vnfpackage APIs.
|
||||||
@@ -1224,49 +859,6 @@ class Client(object):
|
|||||||
return self.legacy_client.list(collection, path,
|
return self.legacy_client.list(collection, path,
|
||||||
retrieve_all=retrieve_all, **params)
|
retrieve_all=retrieve_all, **params)
|
||||||
|
|
||||||
def list_extensions(self, **_params):
|
|
||||||
return self.legacy_client.list_extensions(**_params)
|
|
||||||
|
|
||||||
def show_extension(self, ext_alias, **_params):
|
|
||||||
"""Fetch a list of all exts on server side."""
|
|
||||||
return self.legacy_client.show_extension(ext_alias, **_params)
|
|
||||||
|
|
||||||
def list_vnfds(self, retrieve_all=True, **_params):
|
|
||||||
return self.legacy_client.list_vnfds(retrieve_all=retrieve_all,
|
|
||||||
**_params)
|
|
||||||
|
|
||||||
def show_vnfd(self, vnfd, **_params):
|
|
||||||
return self.legacy_client.show_vnfd(vnfd, **_params)
|
|
||||||
|
|
||||||
def create_vnfd(self, body):
|
|
||||||
return self.legacy_client.create_vnfd(body)
|
|
||||||
|
|
||||||
def delete_vnfd(self, vnfd):
|
|
||||||
return self.legacy_client.delete_vnfd(vnfd)
|
|
||||||
|
|
||||||
def list_vnfs(self, retrieve_all=True, **_params):
|
|
||||||
return self.legacy_client.list_vnfs(retrieve_all=retrieve_all,
|
|
||||||
**_params)
|
|
||||||
|
|
||||||
def show_vnf(self, vnf, **_params):
|
|
||||||
return self.legacy_client.show_vnf(vnf, **_params)
|
|
||||||
|
|
||||||
def create_vnf(self, body):
|
|
||||||
return self.legacy_client.create_vnf(body)
|
|
||||||
|
|
||||||
def delete_vnf(self, vnf, body=None):
|
|
||||||
return self.legacy_client.delete_vnf(vnf, body=body)
|
|
||||||
|
|
||||||
def update_vnf(self, vnf, body):
|
|
||||||
return self.legacy_client.update_vnf(vnf, body)
|
|
||||||
|
|
||||||
def list_vnf_resources(self, vnf, retrieve_all=True, **_params):
|
|
||||||
return self.legacy_client.list_vnf_resources(
|
|
||||||
vnf, retrieve_all=retrieve_all, **_params)
|
|
||||||
|
|
||||||
def scale_vnf(self, vnf, body=None):
|
|
||||||
return self.legacy_client.scale_vnf(vnf, body=body)
|
|
||||||
|
|
||||||
def show_vim(self, vim, **_params):
|
def show_vim(self, vim, **_params):
|
||||||
return self.legacy_client.show_vim(vim, **_params)
|
return self.legacy_client.show_vim(vim, **_params)
|
||||||
|
|
||||||
@@ -1283,128 +875,6 @@ class Client(object):
|
|||||||
return self.legacy_client.list_vims(retrieve_all=retrieve_all,
|
return self.legacy_client.list_vims(retrieve_all=retrieve_all,
|
||||||
**_params)
|
**_params)
|
||||||
|
|
||||||
def list_events(self, retrieve_all=True, **_params):
|
|
||||||
return self.legacy_client.list_events(retrieve_all=retrieve_all,
|
|
||||||
**_params)
|
|
||||||
|
|
||||||
def list_vnf_events(self, retrieve_all=True, **_params):
|
|
||||||
return self.legacy_client.list_vnf_events(
|
|
||||||
retrieve_all=retrieve_all, **_params)
|
|
||||||
|
|
||||||
def list_vnfd_events(self, retrieve_all=True, **_params):
|
|
||||||
return self.legacy_client.list_vnfd_events(
|
|
||||||
retrieve_all=retrieve_all, **_params)
|
|
||||||
|
|
||||||
def list_vim_events(self, retrieve_all=True, **_params):
|
|
||||||
return self.legacy_client.list_vim_events(
|
|
||||||
retrieve_all=retrieve_all, **_params)
|
|
||||||
|
|
||||||
def show_event(self, event_id, **_params):
|
|
||||||
return self.legacy_client.show_event(event_id, **_params)
|
|
||||||
|
|
||||||
def create_vnffgd(self, body):
|
|
||||||
return self.legacy_client.create_vnffgd(body)
|
|
||||||
|
|
||||||
def list_vnffgds(self, retrieve_all=True, **_params):
|
|
||||||
return self.legacy_client.list_vnffgds(retrieve_all=retrieve_all,
|
|
||||||
**_params)
|
|
||||||
|
|
||||||
def show_vnffgd(self, vnffgd, **_params):
|
|
||||||
return self.legacy_client.show_vnffgd(vnffgd, **_params)
|
|
||||||
|
|
||||||
def delete_vnffgd(self, vnffgd):
|
|
||||||
return self.legacy_client.delete_vnffgd(vnffgd)
|
|
||||||
|
|
||||||
def list_vnffgs(self, retrieve_all=True, **_params):
|
|
||||||
return self.legacy_client.list_vnffgs(retrieve_all=retrieve_all,
|
|
||||||
**_params)
|
|
||||||
|
|
||||||
def show_vnffg(self, vnffg, **_params):
|
|
||||||
return self.legacy_client.show_vnffg(vnffg, **_params)
|
|
||||||
|
|
||||||
def create_vnffg(self, body):
|
|
||||||
return self.legacy_client.create_vnffg(body)
|
|
||||||
|
|
||||||
def delete_vnffg(self, vnffg):
|
|
||||||
return self.legacy_client.delete_vnffg(vnffg)
|
|
||||||
|
|
||||||
def update_vnffg(self, vnffg, body):
|
|
||||||
return self.legacy_client.update_vnffg(vnffg, body)
|
|
||||||
|
|
||||||
def list_sfcs(self, retrieve_all=True, **_params):
|
|
||||||
return self.legacy_client.list_sfcs(retrieve_all=retrieve_all,
|
|
||||||
**_params)
|
|
||||||
|
|
||||||
def show_sfc(self, chain, **_params):
|
|
||||||
return self.legacy_client.show_sfc(chain, **_params)
|
|
||||||
|
|
||||||
def list_nfps(self, retrieve_all=True, **_params):
|
|
||||||
return self.legacy_client.list_nfps(retrieve_all=retrieve_all,
|
|
||||||
**_params)
|
|
||||||
|
|
||||||
def show_nfp(self, nfp, **_params):
|
|
||||||
return self.legacy_client.show_nfp(nfp, **_params)
|
|
||||||
|
|
||||||
def list_classifiers(self, retrieve_all=True, **_params):
|
|
||||||
return self.legacy_client.list_classifiers(
|
|
||||||
retrieve_all=retrieve_all, **_params)
|
|
||||||
|
|
||||||
def show_classifier(self, classifier, **_params):
|
|
||||||
return self.legacy_client.show_classifier(classifier, **_params)
|
|
||||||
|
|
||||||
def list_nsds(self, retrieve_all=True, **_params):
|
|
||||||
return self.legacy_client.list_nsds(retrieve_all=retrieve_all,
|
|
||||||
**_params)
|
|
||||||
|
|
||||||
def show_nsd(self, nsd, **_params):
|
|
||||||
return self.legacy_client.show_nsd(nsd, **_params)
|
|
||||||
|
|
||||||
def create_nsd(self, body):
|
|
||||||
return self.legacy_client.create_nsd(body)
|
|
||||||
|
|
||||||
def delete_nsd(self, nsd):
|
|
||||||
return self.legacy_client.delete_nsd(nsd)
|
|
||||||
|
|
||||||
def list_nss(self, retrieve_all=True, **_params):
|
|
||||||
return self.legacy_client.list_nss(retrieve_all=retrieve_all,
|
|
||||||
**_params)
|
|
||||||
|
|
||||||
def show_ns(self, ns, **_params):
|
|
||||||
return self.legacy_client.show_ns(ns, **_params)
|
|
||||||
|
|
||||||
def create_ns(self, body):
|
|
||||||
return self.legacy_client.create_ns(body)
|
|
||||||
|
|
||||||
def delete_ns(self, ns, body=None):
|
|
||||||
return self.legacy_client.delete_ns(ns, body=body)
|
|
||||||
|
|
||||||
def create_cluster(self, body=None):
|
|
||||||
return self.legacy_client.create_cluster(body=body)
|
|
||||||
|
|
||||||
def list_clusters(self, retrieve_all=True, **_params):
|
|
||||||
return self.legacy_client.list_clusters(retrieve_all=retrieve_all,
|
|
||||||
**_params)
|
|
||||||
|
|
||||||
def show_cluster(self, cluster, **_params):
|
|
||||||
return self.legacy_client.show_cluster(cluster, **_params)
|
|
||||||
|
|
||||||
def delete_cluster(self, cluster):
|
|
||||||
return self.legacy_client.delete_cluster(cluster)
|
|
||||||
|
|
||||||
def create_clustermember(self, body=None):
|
|
||||||
return self.legacy_client.create_clustermember(body=body)
|
|
||||||
|
|
||||||
def list_clustermembers(self, retrieve_all=True, **_params):
|
|
||||||
return self.legacy_client.list_clustermembers(
|
|
||||||
retrieve_all=retrieve_all, **_params)
|
|
||||||
|
|
||||||
def show_clustermember(self, clustermember, **_params):
|
|
||||||
return self.legacy_client.show_clustermember(clustermember,
|
|
||||||
**_params)
|
|
||||||
|
|
||||||
def delete_clustermember(self, clustermember):
|
|
||||||
return self.legacy_client.delete_clustermember(clustermember)
|
|
||||||
|
|
||||||
# VnfPackageClient methods
|
# VnfPackageClient methods
|
||||||
|
|
||||||
def create_vnf_package(self, body):
|
def create_vnf_package(self, body):
|
||||||
|
Reference in New Issue
Block a user