diff options
author | Huang Haibin <haibin.huang@intel.com> | 2018-02-27 23:26:26 +0800 |
---|---|---|
committer | Huang Haibin <haibin.huang@intel.com> | 2018-02-28 18:36:50 +0800 |
commit | b99c0d415f37ca26443514d43f3cc1975185bf74 (patch) | |
tree | 9c53b28d8977e6752e06a9e6fdb125e2847ed735 | |
parent | ec6574daf067ae7ad98e7fb6e3ddf4c88d899e36 (diff) |
Move pub file from newton to common
Change-Id: Ib7160619b6fd0b1bada0da685bf4cfaa95a15fff
Issue-ID: MULTICLOUD-138
Signed-off-by: Huang Haibin <haibin.huang@intel.com>
-rw-r--r-- | share/common/__init__.py | 10 | ||||
-rw-r--r-- | share/common/config.py | 35 | ||||
-rw-r--r-- | share/common/database/__init__.py | 10 | ||||
-rw-r--r-- | share/common/database/models.py | 20 | ||||
-rw-r--r-- | share/common/exceptions.py | 17 | ||||
-rw-r--r-- | share/common/utils/__init__.py | 10 | ||||
-rw-r--r-- | share/common/utils/enumutil.py | 14 | ||||
-rw-r--r-- | share/common/utils/fileutil.py | 48 | ||||
-rw-r--r-- | share/common/utils/idutil.py | 17 | ||||
-rw-r--r-- | share/common/utils/restcall.py | 146 | ||||
-rw-r--r-- | share/common/utils/share_lock.py | 77 | ||||
-rw-r--r-- | share/common/utils/syscomm.py | 16 | ||||
-rw-r--r-- | share/common/utils/timeutil.py | 16 | ||||
-rw-r--r-- | share/common/utils/toscautil.py | 2603 | ||||
-rw-r--r-- | share/common/utils/values.py | 22 |
15 files changed, 3061 insertions, 0 deletions
diff --git a/share/common/__init__.py b/share/common/__init__.py new file mode 100644 index 00000000..387c54c2 --- /dev/null +++ b/share/common/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2017-2018 Wind River Systems, Inc. +# +# 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. diff --git a/share/common/config.py b/share/common/config.py new file mode 100644 index 00000000..e3d3db4e --- /dev/null +++ b/share/common/config.py @@ -0,0 +1,35 @@ +# Copyright (c) 2017-2018 Wind River Systems, Inc. +# +# 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. + +import os + +# [MSB] +MSB_SERVICE_ADDR = '127.0.0.1' +MSB_SERVICE_PORT = '80' + + +#[Multicloud] +MULTICLOUD_PREFIX = "http://%s:%s/api/multicloud-newton/v0" %(MSB_SERVICE_ADDR, MSB_SERVICE_PORT) + +# [A&AI] +AAI_ADDR = "aai.api.simpledemo.openecomp.org" +AAI_PORT = "8443" +AAI_SERVICE_URL = 'https://%s:%s/aai' % (AAI_ADDR, AAI_PORT) +AAI_SCHEMA_VERSION = "v11" +AAI_USERNAME = 'AAI' +AAI_PASSWORD = 'AAI' + +AAI_BASE_URL = "%s/%s" % (AAI_SERVICE_URL, AAI_SCHEMA_VERSION) + +MULTICLOUD_APP_ID = 'MultiCloud-Newton' + +# [IMAGE LOCAL PATH] +ROOT_PATH = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) diff --git a/share/common/database/__init__.py b/share/common/database/__init__.py new file mode 100644 index 00000000..802f3fba --- /dev/null +++ b/share/common/database/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. diff --git a/share/common/database/models.py b/share/common/database/models.py new file mode 100644 index 00000000..d95d00d6 --- /dev/null +++ b/share/common/database/models.py @@ -0,0 +1,20 @@ +# Copyright (c) 2017-2018 Wind River Systems, Inc. +# +# 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. + +from django.db import models + +class VimInstModel(models.Model): + class Meta: + db_table = 'vim_inst_type_mapping' + + vimid = models.CharField(db_column='VIMID', primary_key=True, max_length=200) + vimtype = models.CharField(db_column="VIMTYPE", max_length=200) + viminst_url = models.CharField(db_column="VIMINSTURL", max_length=200) diff --git a/share/common/exceptions.py b/share/common/exceptions.py new file mode 100644 index 00000000..597c11a9 --- /dev/null +++ b/share/common/exceptions.py @@ -0,0 +1,17 @@ +# Copyright (c) 2017-2018 Wind River Systems, Inc. +# +# 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. + + +class VimDriverNewtonException(Exception): + def __init__(self, message, status_code="", content=""): + super(VimDriverNewtonException, self).__init__(message) + self.status_code = status_code + self.content = content diff --git a/share/common/utils/__init__.py b/share/common/utils/__init__.py new file mode 100644 index 00000000..387c54c2 --- /dev/null +++ b/share/common/utils/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2017-2018 Wind River Systems, Inc. +# +# 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. diff --git a/share/common/utils/enumutil.py b/share/common/utils/enumutil.py new file mode 100644 index 00000000..156f0df4 --- /dev/null +++ b/share/common/utils/enumutil.py @@ -0,0 +1,14 @@ +# Copyright (c) 2017-2018 Wind River Systems, Inc. +# +# 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. + + +def enum(**enums): + return type('Enum', (), enums) diff --git a/share/common/utils/fileutil.py b/share/common/utils/fileutil.py new file mode 100644 index 00000000..5a1624b0 --- /dev/null +++ b/share/common/utils/fileutil.py @@ -0,0 +1,48 @@ +# Copyright (c) 2017-2018 Wind River Systems, Inc. +# +# 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. +import os +import shutil +import logging +import traceback +from six.moves import urllib + +logger = logging.getLogger(__name__) + + +def make_dirs(path): + if not os.path.exists(path): + os.makedirs(path, 0777) + + +def delete_dirs(path): + try: + if os.path.exists(path): + shutil.rmtree(path) + except Exception as e: + logger.error(traceback.format_exc()) + logger.error("Failed to delete %s:%s", path, e.message) + + +def download_file_from_http(url, local_dir, file_name): + local_file_name = os.path.join(local_dir, file_name) + is_download_ok = False + try: + make_dirs(local_dir) + req = urllib.request.urlopen(url) + save_file = open(local_file_name, 'wb') + save_file.write(req.read()) + save_file.close() + req.close() + is_download_ok = True + except: + logger.error(traceback.format_exc()) + logger.error("Failed to download %s to %s.", url, local_file_name) + return is_download_ok, local_file_name diff --git a/share/common/utils/idutil.py b/share/common/utils/idutil.py new file mode 100644 index 00000000..a99e7de3 --- /dev/null +++ b/share/common/utils/idutil.py @@ -0,0 +1,17 @@ +# Copyright (c) 2017-2018 Wind River Systems, Inc. +# +# 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. +from redisco import containers as cont + + +def get_auto_id(id_type, id_group="auto_id_hash"): + auto_id_hash = cont.Hash(id_group) + auto_id_hash.hincrby(id_type, 1) + return auto_id_hash.hget(id_type) diff --git a/share/common/utils/restcall.py b/share/common/utils/restcall.py new file mode 100644 index 00000000..38bcf39c --- /dev/null +++ b/share/common/utils/restcall.py @@ -0,0 +1,146 @@ +# Copyright (c) 2017-2018 Wind River Systems, Inc. +# +# 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. + +import six +import base64 + +import codecs +import json +import traceback +import sys + +import logging +from six.moves import urllib +import httplib2 +import uuid + +from rest_framework import status +from common import config + +rest_no_auth, rest_oneway_auth, rest_bothway_auth = 0, 1, 2 +HTTP_200_OK, HTTP_201_CREATED = '200', '201' +HTTP_204_NO_CONTENT, HTTP_202_ACCEPTED = '204', '202' +status_ok_list = [HTTP_200_OK, HTTP_201_CREATED, + HTTP_204_NO_CONTENT, HTTP_202_ACCEPTED] +HTTP_404_NOTFOUND, HTTP_403_FORBIDDEN = '404', '403' +HTTP_401_UNAUTHORIZED, HTTP_400_BADREQUEST = '401', '400' + +MAX_RETRY_TIME = 3 + +logger = logging.getLogger(__name__) + + +def _call_req(base_url, user, passwd, auth_type, + resource, method, extra_headers='', content=''): + callid = str(uuid.uuid1()) + ret = None + resp_status = None + try: + full_url = _combine_url(base_url, resource) + headers = { + 'content-type': 'application/json', + 'accept': 'application/json' + } + + if extra_headers: + headers.update(extra_headers) +# if user: +# headers['Authorization'] = \ +# 'Basic ' + str(codecs.encode('%s:%s' % (user, passwd), "ascii")) + + if user: + tmpauthsource = '%s:%s' % (user, passwd) + if six.PY3: + tmpauthsource = tmpauthsource.encode('utf-8') + headers['Authorization'] = 'Basic ' + \ + base64.b64encode(tmpauthsource).decode('utf-8') + + ca_certs = None + for retry_times in range(MAX_RETRY_TIME): + http = httplib2.Http( + ca_certs=ca_certs, + disable_ssl_certificate_validation=(auth_type == rest_no_auth)) + http.follow_all_redirects = True + try: + resp, resp_content = http.request(full_url, + method=method.upper(), + body=content, + headers=headers) + resp_status, resp_body = \ + resp['status'], codecs.decode( + resp_content, 'UTF-8') + if resp_status in status_ok_list: + ret = [0, resp_body, resp_status] + else: + ret = [1, resp_body, resp_status] + break + except Exception as ex: + if 'httplib.ResponseNotReady' in str(sys.exc_info()): + logger.debug("retry_times=%d", retry_times) + logger.error(traceback.format_exc()) + ret = [1, "Unable to connect to %s" % full_url, resp_status] + continue + raise ex + except urllib.error.URLError as err: + ret = [2, str(err), resp_status] + except Exception: + logger.error(traceback.format_exc()) + logger.error("[%s]ret=%s" % (callid, str(sys.exc_info()))) + if not resp_status: + resp_status = status.HTTP_500_INTERNAL_SERVER_ERROR + ret = [3, str(sys.exc_info()), resp_status] + except: + logger.error(traceback.format_exc()) + ret = [4, str(sys.exc_info()), resp_status] + return ret + + +def req_by_msb(resource, method, content=''): + base_url = "http://%s:%s/" % (config.MSB_SERVICE_ADDR, config.MSB_SERVICE_PORT) + return _call_req(base_url, "", "", rest_no_auth, + resource, method, "", content) + + +def req_to_vim(base_url, resource, method, extra_headers='', content=''): + return _call_req(base_url, "", "", rest_no_auth, + resource, method, extra_headers, content) + + +def req_to_aai(resource, method, content='', appid=config.MULTICLOUD_APP_ID): + tmp_trasaction_id = '9003' #str(uuid.uuid1()) + headers = { + 'X-FromAppId': appid, + 'X-TransactionId': tmp_trasaction_id, + 'content-type': 'application/json', + 'accept': 'application/json' + } + + logger.debug("req_to_aai--%s::> %s, %s" % + (tmp_trasaction_id, method, _combine_url(config.AAI_BASE_URL,resource))) + return _call_req(config.AAI_BASE_URL, config.AAI_USERNAME, config.AAI_PASSWORD, rest_no_auth, + resource, method, content=json.dumps(content), extra_headers=headers) + + +def _combine_url(base_url, resource): + full_url = None + + if not resource: + return base_url + + if base_url.endswith('/') and resource.startswith('/'): + full_url = base_url[:-1] + resource + elif base_url.endswith('/') and not resource.startswith('/'): + full_url = base_url + resource + elif not base_url.endswith('/') and resource.startswith('/'): + full_url = base_url + resource + else: + full_url = base_url + '/' + resource + return full_url diff --git a/share/common/utils/share_lock.py b/share/common/utils/share_lock.py new file mode 100644 index 00000000..7ffc7b47 --- /dev/null +++ b/share/common/utils/share_lock.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2017-2018 Wind River Systems, Inc. +# +# 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. + +import time + +import redis + +from common.config.config import REDIS_HOST, REDIS_PORT, REDIS_PASSWD + + +class SharedLock: + def __init__(self, lock_key, host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWD, db=9, lock_timeout=5 * 60): + self.lock_key = lock_key + self.lock_timeout = lock_timeout + self.redis = redis.Redis(host=host, port=port, db=db, password=password) + self.acquire_time = -1 + + def acquire(self): + begin = now = int(time.time()) + while (now - begin) < self.lock_timeout: + + result = self.redis.setnx(self.lock_key, now + self.lock_timeout + 1) + if result == 1 or result is True: + self.acquire_time = now + return True + + current_lock_timestamp = self.redis.get(self.lock_key) + if not current_lock_timestamp: + time.sleep(1) + continue + + current_lock_timestamp = int(current_lock_timestamp) + + if now > current_lock_timestamp: + next_lock_timestamp = self.redis.getset(self.lock_key, now + self.lock_timeout + 1) + if not next_lock_timestamp: + time.sleep(1) + continue + next_lock_timestamp = int(next_lock_timestamp) + + if next_lock_timestamp == current_lock_timestamp: + self.acquire_time = now + return True + else: + time.sleep(1) + continue + return False + + def release(self): + now = int(time.time()) + if now > self.acquire_time + self.lock_timeout: + # key expired, do nothing and let other clients handle it + return + self.acquire_time = None + self.redis.delete(self.lock_key) + + +def do_biz_with_share_lock(lock_name, callback): + lock = SharedLock(lock_name) + try: + if not lock.acquire(): + raise Exception(lock_name + " timeout") + callback() + except Exception as e: + raise e + finally: + lock.release() diff --git a/share/common/utils/syscomm.py b/share/common/utils/syscomm.py new file mode 100644 index 00000000..6e20ab1e --- /dev/null +++ b/share/common/utils/syscomm.py @@ -0,0 +1,16 @@ +# Copyright (c) 2017-2018 Wind River Systems, Inc. +# +# 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. + +import inspect + + +def fun_name(): + return inspect.stack()[1][3] diff --git a/share/common/utils/timeutil.py b/share/common/utils/timeutil.py new file mode 100644 index 00000000..1358355e --- /dev/null +++ b/share/common/utils/timeutil.py @@ -0,0 +1,16 @@ +# Copyright (c) 2017-2018 Wind River Systems, Inc. +# +# 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. + +import datetime + + +def now_time(fmt="%Y-%m-%d %H:%M:%S"): + return datetime.datetime.now().strftime(fmt) diff --git a/share/common/utils/toscautil.py b/share/common/utils/toscautil.py new file mode 100644 index 00000000..7be71fd8 --- /dev/null +++ b/share/common/utils/toscautil.py @@ -0,0 +1,2603 @@ +# Copyright (c) 2017-2018 Wind River Systems, Inc. +# +# 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. + +import json + +def safe_get(key_val, key): + return key_val[key] if key in key_val else "" + + +def find_node_name(node_id, node_list): + for node in node_list: + if node['id'] == node_id: + return node['template_name'] + raise Exception('can not find node(%s).' % node_id) + + +def find_node_type(node_id, node_list): + for node in node_list: + if node['id'] == node_id: + return node['type_name'] + raise Exception('can not find node(%s).' % node_id) + + +def find_related_node(node_id, src_json_model, requirement_name): + related_nodes = [] + for model_tpl in safe_get(src_json_model, "node_templates"): + for rt in safe_get(model_tpl, 'requirement_templates'): + if safe_get(rt, 'name') == requirement_name and \ + safe_get(rt, 'target_node_template_name') == node_id: + related_nodes.append(model_tpl['name']) + return related_nodes + + +def convert_props(src_node, dest_node): + if 'properties' in src_node and src_node['properties']: + for prop_name, prop_info in src_node['properties'].items(): + if 'value' in prop_info: + dest_node['properties'][prop_name] = prop_info['value'] + + +def convert_metadata(src_json): + return src_json['metadata'] if 'metadata' in src_json else {} + + +def convert_inputs(src_json): + inputs = {} + if 'inputs' in src_json: + src_inputs = src_json['inputs'] + for param_name, param_info in src_inputs.items(): + input_param = {} + if 'type_name' in param_info: + input_param['type'] = param_info['type_name'] + if 'description' in param_info: + input_param['description'] = param_info['description'] + if 'value' in param_info: + input_param['value'] = param_info['value'] + inputs[param_name] = input_param + return inputs + + +def convert_vnf_node(src_node, src_json_model): + vnf_node = {'type': src_node['type_name'], 'vnf_id': src_node['template_name'], + 'description': '', 'properties': {}, 'dependencies': [], 'networks': []} + convert_props(src_node, vnf_node) + for model_tpl in safe_get(src_json_model, "node_templates"): + if model_tpl['name'] != vnf_node['vnf_id']: + continue + vnf_node['dependencies'] = [{ + 'key_name': requirement['name'], + 'vl_id': requirement['target_node_template_name']} for \ + requirement in safe_get(model_tpl, 'requirement_templates') if \ + safe_get(requirement, 'target_capability_name') == 'virtual_linkable'] + vnf_node['networks'] = [requirement['target_node_template_name'] for \ + requirement in safe_get(model_tpl, 'requirement_templates') if \ + safe_get(requirement, 'name') == 'dependency'] + return vnf_node + + +def convert_pnf_node(src_node, src_json_model): + pnf_node = {'pnf_id': src_node['template_name'], 'description': '', 'properties': {}} + convert_props(src_node, pnf_node) + pnf_node['cps'] = find_related_node(src_node['id'], src_json_model, 'virtualbinding') + return pnf_node + + +def convert_vl_node(src_node, src_node_list): + vl_node = {'vl_id': src_node['template_name'], 'description': '', 'properties': {}} + convert_props(src_node, vl_node) + vl_node['route_id'] = '' + for relation in safe_get(src_node, 'relationships'): + if safe_get(relation, 'type_name').endswith('.VirtualLinksTo'): + vl_node['route_id'] = find_node_name(relation['target_node_id'], src_node_list) + break + vl_node['route_external'] = (src_node['type_name'].find('.RouteExternalVL') > 0) + return vl_node + + +def convert_cp_node(src_node, src_node_list, model_type='NSD'): + cp_node = {'cp_id': src_node['template_name'], 'description': '', 'properties': {}} + convert_props(src_node, cp_node) + src_relationships = src_node['relationships'] + for relation in src_relationships: + if safe_get(relation, 'name') == 'virtualLink': + cp_node['vl_id'] = find_node_name(relation['target_node_id'], src_node_list) + elif safe_get(relation, 'name') == 'virtualbinding': + node_key = 'pnf_id' if model_type == 'NSD' else 'vdu_id' + cp_node[node_key] = find_node_name(relation['target_node_id'], src_node_list) + return cp_node + + +def convert_router_node(src_node, src_node_list): + router_node = {'router_id': src_node['template_name'], 'description': '', 'properties': {}} + convert_props(src_node, router_node) + for relation in src_node['relationships']: + if safe_get(relation, 'name') != 'external_virtual_link': + continue + router_node['external_vl_id'] = find_node_name(relation['target_node_id'], src_node_list) + router_node['external_ip_addresses'] = [] + if 'properties' not in relation: + continue + for prop_name, prop_info in relation['properties'].items(): + if prop_name == 'router_ip_address': + router_node['external_ip_addresses'].append(prop_info['value']) + break + return router_node + + +def convert_fp_node(src_node, src_node_list, src_json_model): + fp_node = {'fp_id': src_node['template_name'], 'description': '', + 'properties': {}, 'forwarder_list': []} + convert_props(src_node, fp_node) + for relation in safe_get(src_node, 'relationships'): + if safe_get(relation, 'name') != 'forwarder': + continue + forwarder_point = {'type': 'vnf'} + target_node_type = find_node_type(relation['target_node_id'], src_node_list).upper() + if target_node_type.find('.CP.') >= 0 or target_node_type.endswith('.CP'): + forwarder_point['type'] = 'cp' + forwarder_point['node_name'] = find_node_name(relation['target_node_id'], src_node_list) + forwarder_point['capability'] = '' + if forwarder_point['type'] == 'vnf': + for node_tpl in src_json_model["node_templates"]: + if fp_node['fp_id'] != node_tpl["name"]: + continue + for r_tpl in safe_get(node_tpl, "requirement_templates"): + if safe_get(r_tpl, "target_node_template_name") != forwarder_point['node_name']: + continue + forwarder_point['capability'] = safe_get(r_tpl, "target_capability_name") + break + break + fp_node['forwarder_list'].append(forwarder_point) + return fp_node + + +def convert_vnffg_group(src_group, src_group_list, src_node_list): + vnffg = {'vnffg_id': src_group['template_name'], 'description': '', + 'properties': {}, 'members': []} + convert_props(src_group, vnffg) + for member_node_id in src_group['member_node_ids']: + vnffg['members'].append(find_node_name(member_node_id, src_node_list)) + return vnffg + + +def convert_imagefile_node(src_node, src_node_list): + image_node = {'image_file_id': src_node['template_name'], 'description': '', + 'properties': {}} + convert_props(src_node, image_node) + return image_node + + +def convert_localstorage_node(src_node, src_node_list): + localstorage_node = {'local_storage_id': src_node['template_name'], 'description': '', + 'properties': {}} + convert_props(src_node, localstorage_node) + return localstorage_node + + +def convert_vdu_node(src_node, src_node_list, src_json_model): + vdu_node = {'vdu_id': src_node['template_name'], 'description': '', 'properties': {}, + 'image_file': '', 'local_storages': [], 'dependencies': [], 'nfv_compute': {}, + 'vls': [], 'artifacts': []} + convert_props(src_node, vdu_node) + + for relation in src_node['relationships']: + r_id, r_name = safe_get(relation, 'target_node_id'), safe_get(relation, 'name') + if r_name == 'guest_os': + vdu_node['image_file'] = find_node_name(r_id, src_node_list) + elif r_name == 'local_storage': + vdu_node['local_storages'].append(find_node_name(r_id, src_node_list)) + elif r_name.endswith('.AttachesTo'): + nt = find_node_type(r_id, src_node_list) + if nt.endswith('.BlockStorage.Local') or nt.endswith('.LocalStorage'): + vdu_node['local_storages'].append(find_node_name(r_id, src_node_list)) + + for capability in src_node['capabilities']: + if capability['name'] != 'nfv_compute': + continue + for prop_name, prop_info in capability['properties'].items(): + if 'value' in prop_info: + vdu_node['nfv_compute'][prop_name] = prop_info['value'] + + vdu_node['cps'] = find_related_node(src_node['id'], src_json_model, 'virtualbinding') + + for cp_node in vdu_node['cps']: + for src_cp_node in src_node_list: + if src_cp_node['template_name'] != cp_node: + continue + for relation in safe_get(src_cp_node, 'relationships'): + if relation['name'] != 'virtualLink': + continue + vl_node_name = find_node_name(relation['target_node_id'], src_node_list) + if vl_node_name not in vdu_node['vls']: + vdu_node['vls'].append(vl_node_name) + + for item in safe_get(src_node, 'artifacts'): + artifact = {'artifact_name': item['name'], 'type': item['type_name'], + 'file': item['source_path']} + vdu_node['artifacts'].append(artifact) + + return vdu_node + + +def convert_exposed_node(src_json, src_nodes, exposed): + for item in safe_get(safe_get(src_json, 'substitution'), 'requirements'): + exposed['external_cps'].append({'key_name': item['mapped_name'], + "cp_id": find_node_name(item['node_id'], src_nodes)}) + for item in safe_get(safe_get(src_json, 'substitution'), 'capabilities'): + exposed['forward_cps'].append({'key_name': item['mapped_name'], + "cp_id": find_node_name(item['node_id'], src_nodes)}) + + +def convert_vnffgs(src_json_inst, src_nodes): + vnffgs = [] + src_groups = safe_get(src_json_inst, 'groups') + for group in src_groups: + type_name = group['type_name'].upper() + if type_name.find('.VNFFG.') >= 0 or type_name.endswith('.VNFFG'): + vnffgs.append(convert_vnffg_group(group, src_groups, src_nodes)) + return vnffgs + + +def convert_common(src_json, target_json): + if isinstance(src_json, (unicode, str)): + src_json_dict = json.loads(src_json) + else: + src_json_dict = src_json + src_json_inst = src_json_dict["instance"] + src_json_model = src_json_dict["model"] if "model" in src_json_dict else {} + + target_json['metadata'] = convert_metadata(src_json_inst) + target_json['inputs'] = convert_inputs(src_json_inst) + target_json['vls'] = [] + target_json['cps'] = [] + target_json['routers'] = [] + + return src_json_inst, src_json_model + + +def convert_nsd_model(src_json): + target_json = {'vnfs': [], 'pnfs': [], 'fps': []} + src_json_inst, src_json_model = convert_common(src_json, target_json) + + src_nodes = src_json_inst['nodes'] + for node in src_nodes: + type_name = node['type_name'] + if type_name.find('.VNF.') > 0 or type_name.endswith('.VNF'): + target_json['vnfs'].append(convert_vnf_node(node, src_json_model)) + elif type_name.find('.PNF.') > 0 or type_name.endswith('.PNF'): + target_json['pnfs'].append(convert_pnf_node(node, src_json_model)) + elif type_name.find('.VL.') > 0 or type_name.endswith('.VL') \ + or node['type_name'].find('.RouteExternalVL') > 0: + target_json['vls'].append(convert_vl_node(node, src_nodes)) + elif type_name.find('.CP.') > 0 or type_name.endswith('.CP'): + target_json['cps'].append(convert_cp_node(node, src_nodes)) + elif type_name.find('.FP.') > 0 or type_name.endswith('.FP'): + target_json['fps'].append(convert_fp_node(node, src_nodes, src_json_model)) + elif type_name.endswith('.Router'): + target_json['routers'].append(convert_router_node(node, src_nodes)) + + target_json['vnffgs'] = convert_vnffgs(src_json_inst, src_nodes) + + target_json['ns_exposed'] = {'external_cps': [], 'forward_cps': []} + convert_exposed_node(src_json_inst, src_nodes, target_json['ns_exposed']) + return json.dumps(target_json) + + +def convert_vnfd_model(src_json): + target_json = {'image_files': [], 'local_storages': [], 'vdus': []} + src_json_inst, src_json_model = convert_common(src_json, target_json) + + src_nodes = src_json_inst['nodes'] + for node in src_nodes: + type_name = node['type_name'] + if type_name.endswith('.ImageFile'): + target_json['image_files'].append(convert_imagefile_node(node, src_nodes)) + elif type_name.endswith('.BlockStorage.Local') or type_name.endswith('.LocalStorage'): + target_json['local_storages'].append(convert_localstorage_node(node, src_nodes)) + elif type_name.find('.VDU.') > 0 or type_name.endswith('.VDU'): + target_json['vdus'].append(convert_vdu_node(node, src_nodes, src_json_model)) + elif type_name.find('.VL.') > 0 or type_name.endswith('.VL') \ + or node['type_name'].find('.RouteExternalVL') > 0: + target_json['vls'].append(convert_vl_node(node, src_nodes)) + elif type_name.find('.CP.') > 0 or type_name.endswith('.CP'): + target_json['cps'].append(convert_cp_node(node, src_nodes, 'VNFD')) + elif type_name.endswith('.Router'): + target_json['routers'].append(convert_router_node(node, src_nodes)) + + target_json['vnf_exposed'] = {'external_cps': [], 'forward_cps': []} + convert_exposed_node(src_json_inst, src_nodes, target_json['vnf_exposed']) + return json.dumps(target_json) + +if __name__ == '__main__': + src_json = json.dumps( + { + "instance":{ + "metadata":{ + "vendor":"ZTE", + "name":"VCPE_NS", + "csarVersion":"v1.0", + "csarType":"NSAR", + "csarProvider":"ZTE", + "version":1, + "invariant_id":"vcpe_ns_sff_1", + "id":"VCPE_NS", + "description":"vcpe_ns" + }, + "nodes":[ + { + "id":"path2_kgmfqr5ldqs9lj3oscrgxqefc", + "type_name":"tosca.nodes.nfv.ext.FP", + "template_name":"path2", + "properties":{ + "symmetric":{ + "type_name":"boolean", + "value":False + }, + "policy":{ + "type_name":"tosca.datatypes.nfv.ext.FPPolicy", + "value":{ + "type":"ACL", + "criteria":{ + "dest_port_range":"1-100", + "ip_protocol":"tcp", + "source_ip_range":[ + "119.1.1.1-119.1.1.10" + ], + "dest_ip_range":[ + {"get_input":"NatIpRange"} + ], + "dscp":0, + "source_port_range":"1-100" + } + } + } + }, + "interfaces":[ + { + "name":"Standard", + "description":"This lifecycle interface defines the essential, normative operations that TOSCA nodes may support.", + "type_name":"tosca.interfaces.node.lifecycle.Standard", + "operations":[ + { + "name":"create", + "description":"Standard lifecycle create operation." + }, + { + "name":"stop", + "description":"Standard lifecycle stop operation." + }, + { + "name":"start", + "description":"Standard lifecycle start operation." + }, + { + "name":"delete", + "description":"Standard lifecycle delete operation." + }, + { + "name":"configure", + "description":"Standard lifecycle configure operation." + } + ] + } + ], + "capabilities":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + } + ], + "relationships":[ + { + "name":"forwarder", + "source_requirement_index":0, + "target_node_id":"m6000_data_out_qeukdtf6g87cnparxi51fa8s6" + }, + { + "name":"forwarder", + "source_requirement_index":1, + "target_node_id":"m600_tunnel_cp_imwfk5l48ljz0g9knc6d68hv5" + }, + { + "name":"forwarder", + "source_requirement_index":2, + "target_node_id":"VNAT_cfdljtspvkp234irka59wgab0", + "target_capability_name":"feature" + } + ] + }, + { + "id":"path1_bv53fblv26hawr8dj4fxe2rsd", + "type_name":"tosca.nodes.nfv.ext.FP", + "template_name":"path1", + "properties":{ + "symmetric":{ + "type_name":"boolean", + "value":True + }, + "policy":{ + "type_name":"tosca.datatypes.nfv.ext.FPPolicy", + "value":{ + "type":"ACL", + "criteria":{ + "dest_port_range":"1-100", + "ip_protocol":"tcp", + "source_ip_range":[ + "1-100" + ], + "dest_ip_range":[ + "1-100" + ], + "dscp":4, + "source_port_range":"1-100" + } + } + } + }, + "interfaces":[ + { + "name":"Standard", + "description":"This lifecycle interface defines the essential, normative operations that TOSCA nodes may support.", + "type_name":"tosca.interfaces.node.lifecycle.Standard", + "operations":[ + { + "name":"create", + "description":"Standard lifecycle create operation." + }, + { + "name":"stop", + "description":"Standard lifecycle stop operation." + }, + { + "name":"start", + "description":"Standard lifecycle start operation." + }, + { + "name":"delete", + "description":"Standard lifecycle delete operation." + }, + { + "name":"configure", + "description":"Standard lifecycle configure operation." + } + ] + } + ], + "capabilities":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + } + ], + "relationships":[ + { + "name":"forwarder", + "source_requirement_index":0, + "target_node_id":"m6000_data_in_eldly5txw4frny3cc349uz3nc" + }, + { + "name":"forwarder", + "source_requirement_index":1, + "target_node_id":"m600_tunnel_cp_imwfk5l48ljz0g9knc6d68hv5" + }, + { + "name":"forwarder", + "source_requirement_index":2, + "target_node_id":"VFW_57z0ua89aiyl8ncvw7h7mjf34", + "target_capability_name":"feature" + }, + { + "name":"forwarder", + "source_requirement_index":3, + "target_node_id":"VNAT_cfdljtspvkp234irka59wgab0", + "target_capability_name":"feature" + }, + { + "name":"forwarder", + "source_requirement_index":4, + "target_node_id":"m600_tunnel_cp_imwfk5l48ljz0g9knc6d68hv5" + }, + { + "name":"forwarder", + "source_requirement_index":5, + "target_node_id":"m6000_data_out_qeukdtf6g87cnparxi51fa8s6" + } + ] + }, + { + "id":"m6000_data_out_qeukdtf6g87cnparxi51fa8s6", + "type_name":"tosca.nodes.nfv.ext.zte.CP", + "template_name":"m6000_data_out", + "properties":{ + "direction":{ + "type_name":"string", + "value":"bidirectional" + }, + "vnic_type":{ + "type_name":"string", + "value":"normal" + }, + "bandwidth":{ + "type_name":"integer", + "value":0 + }, + "mac_address":{ + "type_name":"string", + "value":"11-22-33-22-11-44" + }, + "interface_name":{ + "type_name":"string", + "value":"xgei-0/4/1/5" + }, + "ip_address":{ + "type_name":"string", + "value":"176.1.1.2" + }, + "order":{ + "type_name":"integer", + "value":0 + }, + "sfc_encapsulation":{ + "type_name":"string", + "value":"mac" + } + }, + "interfaces":[ + { + "name":"Standard", + "description":"This lifecycle interface defines the essential, normative operations that TOSCA nodes may support.", + "type_name":"tosca.interfaces.node.lifecycle.Standard", + "operations":[ + { + "name":"create", + "description":"Standard lifecycle create operation." + }, + { + "name":"stop", + "description":"Standard lifecycle stop operation." + }, + { + "name":"start", + "description":"Standard lifecycle start operation." + }, + { + "name":"delete", + "description":"Standard lifecycle delete operation." + }, + { + "name":"configure", + "description":"Standard lifecycle configure operation." + } + ] + } + ], + "capabilities":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"forwarder", + "type_name":"tosca.capabilities.nfv.Forwarder" + } + ], + "relationships":[ + { + "name":"virtualbinding", + "source_requirement_index":0, + "target_node_id":"m6000_s_7qtzo5nuocyfmebc6kp9raq18", + "target_capability_name":"feature" + }, + { + "name":"virtualLink", + "source_requirement_index":1, + "target_node_id":"path2_kgmfqr5ldqs9lj3oscrgxqefc", + "target_capability_name":"feature" + }, + { + "name":"forwarder", + "source_requirement_index":2, + "target_node_id":"path2_kgmfqr5ldqs9lj3oscrgxqefc", + "target_capability_name":"feature" + } + ] + }, + { + "id":"VFW_57z0ua89aiyl8ncvw7h7mjf34", + "type_name":"tosca.nodes.nfv.ext.zte.VNF.VFW", + "template_name":"VFW", + "properties":{ + "is_shared":{ + "type_name":"boolean", + "value":False + }, + "plugin_info":{ + "type_name":"string", + "value":"vbrasplugin_1.0" + }, + "vendor":{ + "type_name":"string", + "value":"zte" + }, + "request_reclassification":{ + "type_name":"boolean", + "value":False + }, + "vnf_extend_type":{ + "type_name":"string", + "value":"driver" + }, + "name":{ + "type_name":"string", + "value":"VFW" + }, + "version":{ + "type_name":"string", + "value":"1.0" + }, + "cross_dc":{ + "type_name":"boolean", + "value":False + }, + "vnf_type":{ + "type_name":"string", + "value":"VFW" + }, + "vnfd_version":{ + "type_name":"string", + "value":"1.0.0" + }, + "id":{ + "type_name":"string", + "value":"vcpe_vfw_zte_1_0" + }, + "nsh_aware":{ + "type_name":"boolean", + "value":True + }, + "adjust_vnf_capacity":{ + "type_name":"boolean", + "value":True + }, + "vmnumber_overquota_alarm":{ + "type_name":"boolean", + "value":True + }, + "csarProvider":{ + "type_name":"string", + "value":"ZTE" + }, + "csarVersion":{ + "type_name":"string", + "value":"v1.0" + }, + "externalPluginManageNetworkName":{ + "type_name":"string", + "value":"vlan_4007_plugin_net" + }, + "csarType":{ + "type_name":"string", + "value":"NFAR" + } + }, + "interfaces":[ + { + "name":"Standard", + "description":"This lifecycle interface defines the essential, normative operations that TOSCA nodes may support.", + "type_name":"tosca.interfaces.node.lifecycle.Standard", + "operations":[ + { + "name":"create", + "description":"Standard lifecycle create operation." + }, + { + "name":"stop", + "description":"Standard lifecycle stop operation." + }, + { + "name":"start", + "description":"Standard lifecycle start operation." + }, + { + "name":"delete", + "description":"Standard lifecycle delete operation." + }, + { + "name":"configure", + "description":"Standard lifecycle configure operation." + } + ] + } + ], + "capabilities":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"forwarder", + "type_name":"tosca.capabilities.nfv.Forwarder" + }, + { + "name":"vfw_fw_inout", + "type_name":"tosca.capabilities.nfv.Forwarder" + } + ], + "relationships":[ + { + "name":"vfw_ctrl_by_manager_cp", + "source_requirement_index":0, + "target_node_id":"ext_mnet_net_au2otee5mcy0dnpqykj487zr3", + "target_capability_name":"feature" + }, + { + "name":"vfw_data_cp", + "source_requirement_index":1, + "target_node_id":"sfc_data_network_vx3pc1oahn0k0pa5q722yafee", + "target_capability_name":"feature" + }, + { + "name":"virtualLink", + "source_requirement_index":2, + "target_node_id":"path2_kgmfqr5ldqs9lj3oscrgxqefc", + "target_capability_name":"feature" + }, + { + "name":"forwarder", + "source_requirement_index":3, + "target_node_id":"path2_kgmfqr5ldqs9lj3oscrgxqefc", + "target_capability_name":"feature" + } + ] + }, + { + "id":"m600_tunnel_cp_imwfk5l48ljz0g9knc6d68hv5", + "type_name":"tosca.nodes.nfv.ext.zte.CP", + "template_name":"m600_tunnel_cp", + "properties":{ + "direction":{ + "type_name":"string", + "value":"bidirectional" + }, + "vnic_type":{ + "type_name":"string", + "value":"normal" + }, + "bandwidth":{ + "type_name":"integer", + "value":0 + }, + "mac_address":{ + "type_name":"string", + "value":"00-11-00-22-33-00" + }, + "interface_name":{ + "type_name":"string", + "value":"gei-0/4/0/13" + }, + "ip_address":{ + "type_name":"string", + "value":"191.167.100.5" + }, + "order":{ + "type_name":"integer", + "value":0 + }, + "sfc_encapsulation":{ + "type_name":"string", + "value":"mac" + } + }, + "interfaces":[ + { + "name":"Standard", + "description":"This lifecycle interface defines the essential, normative operations that TOSCA nodes may support.", + "type_name":"tosca.interfaces.node.lifecycle.Standard", + "operations":[ + { + "name":"create", + "description":"Standard lifecycle create operation." + }, + { + "name":"stop", + "description":"Standard lifecycle stop operation." + }, + { + "name":"start", + "description":"Standard lifecycle start operation." + }, + { + "name":"delete", + "description":"Standard lifecycle delete operation." + }, + { + "name":"configure", + "description":"Standard lifecycle configure operation." + } + ] + } + ], + "capabilities":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"forwarder", + "type_name":"tosca.capabilities.nfv.Forwarder" + } + ], + "relationships":[ + { + "name":"virtualLink", + "source_requirement_index":0, + "target_node_id":"ext_datanet_net_qtqzlx5dsthzs883hxjn6hyhd", + "target_capability_name":"feature" + }, + { + "name":"virtualbinding", + "source_requirement_index":1, + "target_node_id":"m6000_s_7qtzo5nuocyfmebc6kp9raq18", + "target_capability_name":"feature" + }, + { + "name":"forwarder", + "source_requirement_index":2, + "target_node_id":"path2_kgmfqr5ldqs9lj3oscrgxqefc", + "target_capability_name":"feature" + } + ] + }, + { + "id":"ext_mnet_net_au2otee5mcy0dnpqykj487zr3", + "type_name":"tosca.nodes.nfv.ext.VL.Vmware", + "template_name":"ext_mnet_net", + "properties":{ + "name":{ + "type_name":"string", + "value":"vlan_4008_mng_net" + }, + "dhcp_enabled":{ + "type_name":"boolean", + "value":True + }, + "location_info":{ + "type_name":"tosca.datatypes.nfv.ext.LocationInfo", + "value":{ + "tenant":"admin", + "vimid":2, + "availability_zone":"nova" + } + }, + "ip_version":{ + "type_name":"integer", + "value":4 + }, + "mtu":{ + "type_name":"integer", + "value":1500 + }, + "network_name":{ + "type_name":"string", + "value":"vlan_4008_mng_net" + }, + "network_type":{ + "type_name":"string", + "value":"vlan" + } + }, + "interfaces":[ + { + "name":"Standard", + "description":"This lifecycle interface defines the essential, normative operations that TOSCA nodes may support.", + "type_name":"tosca.interfaces.node.lifecycle.Standard", + "operations":[ + { + "name":"create", + "description":"Standard lifecycle create operation." + }, + { + "name":"stop", + "description":"Standard lifecycle stop operation." + }, + { + "name":"start", + "description":"Standard lifecycle start operation." + }, + { + "name":"delete", + "description":"Standard lifecycle delete operation." + }, + { + "name":"configure", + "description":"Standard lifecycle configure operation." + } + ] + } + ], + "capabilities":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"virtual_linkable", + "type_name":"tosca.capabilities.nfv.VirtualLinkable" + } + ] + }, + { + "id":"m6000_data_in_eldly5txw4frny3cc349uz3nc", + "type_name":"tosca.nodes.nfv.ext.zte.CP", + "template_name":"m6000_data_in", + "properties":{ + "direction":{ + "type_name":"string", + "value":"bidirectional" + }, + "vnic_type":{ + "type_name":"string", + "value":"normal" + }, + "bandwidth":{ + "type_name":"integer", + "value":0 + }, + "mac_address":{ + "type_name":"string", + "value":"11-22-33-22-11-41" + }, + "interface_name":{ + "type_name":"string", + "value":"gei-0/4/0/7" + }, + "ip_address":{ + "type_name":"string", + "value":"1.1.1.1" + }, + "order":{ + "type_name":"integer", + "value":0 + }, + "sfc_encapsulation":{ + "type_name":"string", + "value":"mac" + }, + "bond":{ + "type_name":"string", + "value":"none" + } + }, + "interfaces":[ + { + "name":"Standard", + "description":"This lifecycle interface defines the essential, normative operations that TOSCA nodes may support.", + "type_name":"tosca.interfaces.node.lifecycle.Standard", + "operations":[ + { + "name":"create", + "description":"Standard lifecycle create operation." + }, + { + "name":"stop", + "description":"Standard lifecycle stop operation." + }, + { + "name":"start", + "description":"Standard lifecycle start operation." + }, + { + "name":"delete", + "description":"Standard lifecycle delete operation." + }, + { + "name":"configure", + "description":"Standard lifecycle configure operation." + } + ] + } + ], + "capabilities":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"forwarder", + "type_name":"tosca.capabilities.nfv.Forwarder" + } + ], + "relationships":[ + { + "name":"virtualbinding", + "source_requirement_index":0, + "target_node_id":"m6000_s_7qtzo5nuocyfmebc6kp9raq18", + "target_capability_name":"feature" + }, + { + "name":"virtualLink", + "source_requirement_index":1, + "target_node_id":"path2_kgmfqr5ldqs9lj3oscrgxqefc", + "target_capability_name":"feature" + }, + { + "name":"forwarder", + "source_requirement_index":2, + "target_node_id":"path2_kgmfqr5ldqs9lj3oscrgxqefc", + "target_capability_name":"feature" + } + ] + }, + { + "id":"ext_datanet_net_qtqzlx5dsthzs883hxjn6hyhd", + "type_name":"tosca.nodes.nfv.ext.VL.Vmware", + "template_name":"ext_datanet_net", + "properties":{ + "name":{ + "type_name":"string", + "value":"vlan_4004_tunnel_net" + }, + "dhcp_enabled":{ + "type_name":"boolean", + "value":True + }, + "location_info":{ + "type_name":"tosca.datatypes.nfv.ext.LocationInfo", + "value":{ + "tenant":"admin", + "vimid":2, + "availability_zone":"nova" + } + }, + "ip_version":{ + "type_name":"integer", + "value":4 + }, + "mtu":{ + "type_name":"integer", + "value":1500 + }, + "network_name":{ + "type_name":"string", + "value":"vlan_4004_tunnel_net" + }, + "network_type":{ + "type_name":"string", + "value":"vlan" + } + }, + "interfaces":[ + { + "name":"Standard", + "description":"This lifecycle interface defines the essential, normative operations that TOSCA nodes may support.", + "type_name":"tosca.interfaces.node.lifecycle.Standard", + "operations":[ + { + "name":"create", + "description":"Standard lifecycle create operation." + }, + { + "name":"stop", + "description":"Standard lifecycle stop operation." + }, + { + "name":"start", + "description":"Standard lifecycle start operation." + }, + { + "name":"delete", + "description":"Standard lifecycle delete operation." + }, + { + "name":"configure", + "description":"Standard lifecycle configure operation." + } + ] + } + ], + "capabilities":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"virtual_linkable", + "type_name":"tosca.capabilities.nfv.VirtualLinkable" + } + ] + }, + { + "id":"m600_mnt_cp_l3488y2a8ilyfdn0l89ni4os7", + "type_name":"tosca.nodes.nfv.ext.zte.CP", + "template_name":"m600_mnt_cp", + "properties":{ + "direction":{ + "type_name":"string", + "value":"bidirectional" + }, + "vnic_type":{ + "type_name":"string", + "value":"normal" + }, + "bandwidth":{ + "type_name":"integer", + "value":0 + }, + "mac_address":{ + "type_name":"string", + "value":"00-11-00-22-33-11" + }, + "interface_name":{ + "type_name":"string", + "value":"gei-0/4/0/1" + }, + "ip_address":{ + "type_name":"string", + "value":"10.46.244.51" + }, + "order":{ + "type_name":"integer", + "value":0 + }, + "sfc_encapsulation":{ + "type_name":"string", + "value":"mac" + }, + "bond":{ + "type_name":"string", + "value":"none" + } + }, + "interfaces":[ + { + "name":"Standard", + "description":"This lifecycle interface defines the essential, normative operations that TOSCA nodes may support.", + "type_name":"tosca.interfaces.node.lifecycle.Standard", + "operations":[ + { + "name":"create", + "description":"Standard lifecycle create operation." + }, + { + "name":"stop", + "description":"Standard lifecycle stop operation." + }, + { + "name":"start", + "description":"Standard lifecycle start operation." + }, + { + "name":"delete", + "description":"Standard lifecycle delete operation." + }, + { + "name":"configure", + "description":"Standard lifecycle configure operation." + } + ] + } + ], + "capabilities":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"forwarder", + "type_name":"tosca.capabilities.nfv.Forwarder" + } + ], + "relationships":[ + { + "name":"virtualLink", + "source_requirement_index":0, + "target_node_id":"ext_mnet_net_au2otee5mcy0dnpqykj487zr3", + "target_capability_name":"feature" + }, + { + "name":"virtualbinding", + "source_requirement_index":1, + "target_node_id":"m6000_s_7qtzo5nuocyfmebc6kp9raq18", + "target_capability_name":"feature" + }, + { + "name":"forwarder", + "source_requirement_index":2, + "target_node_id":"path2_kgmfqr5ldqs9lj3oscrgxqefc", + "target_capability_name":"feature" + } + ] + }, + { + "id":"sfc_data_network_vx3pc1oahn0k0pa5q722yafee", + "type_name":"tosca.nodes.nfv.ext.zte.VL", + "template_name":"sfc_data_network", + "properties":{ + "name":{ + "type_name":"string", + "value":"sfc_data_network" + }, + "dhcp_enabled":{ + "type_name":"boolean", + "value":True + }, + "is_predefined":{ + "type_name":"boolean", + "value":False + }, + "location_info":{ + "type_name":"tosca.datatypes.nfv.ext.LocationInfo", + "value":{ + "tenant":"admin", + "vimid":2, + "availability_zone":"nova" + } + }, + "ip_version":{ + "type_name":"integer", + "value":4 + }, + "mtu":{ + "type_name":"integer", + "value":1500 + }, + "network_name":{ + "type_name":"string", + "value":"sfc_data_network" + }, + "network_type":{ + "type_name":"string", + "value":"vlan" + } + }, + "interfaces":[ + { + "name":"Standard", + "description":"This lifecycle interface defines the essential, normative operations that TOSCA nodes may support.", + "type_name":"tosca.interfaces.node.lifecycle.Standard", + "operations":[ + { + "name":"create", + "description":"Standard lifecycle create operation." + }, + { + "name":"stop", + "description":"Standard lifecycle stop operation." + }, + { + "name":"start", + "description":"Standard lifecycle start operation." + }, + { + "name":"delete", + "description":"Standard lifecycle delete operation." + }, + { + "name":"configure", + "description":"Standard lifecycle configure operation." + } + ] + } + ], + "capabilities":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"virtual_linkable", + "type_name":"tosca.capabilities.nfv.VirtualLinkable" + } + ] + }, + { + "id":"m6000_s_7qtzo5nuocyfmebc6kp9raq18", + "type_name":"tosca.nodes.nfv.ext.PNF", + "template_name":"m6000_s", + "properties":{ + "vendor":{ + "type_name":"string", + "value":"zte" + }, + "request_reclassification":{ + "type_name":"boolean", + "value":False + }, + "pnf_type":{ + "type_name":"string", + "value":"m6000s" + }, + "version":{ + "type_name":"string", + "value":"1.0" + }, + "management_address":{ + "type_name":"string", + "value":"111111" + }, + "id":{ + "type_name":"string", + "value":"m6000_s" + }, + "nsh_aware":{ + "type_name":"boolean", + "value":False + } + }, + "interfaces":[ + { + "name":"Standard", + "description":"This lifecycle interface defines the essential, normative operations that TOSCA nodes may support.", + "type_name":"tosca.interfaces.node.lifecycle.Standard", + "operations":[ + { + "name":"create", + "description":"Standard lifecycle create operation." + }, + { + "name":"stop", + "description":"Standard lifecycle stop operation." + }, + { + "name":"start", + "description":"Standard lifecycle start operation." + }, + { + "name":"delete", + "description":"Standard lifecycle delete operation." + }, + { + "name":"configure", + "description":"Standard lifecycle configure operation." + } + ] + } + ], + "capabilities":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"virtualBinding", + "type_name":"tosca.capabilities.nfv.VirtualBindable" + }, + { + "name":"forwarder", + "type_name":"tosca.capabilities.nfv.Forwarder" + } + ], + "relationships":[ + { + "name":"forwarder", + "source_requirement_index":0, + "target_node_id":"path2_kgmfqr5ldqs9lj3oscrgxqefc", + "target_capability_name":"feature" + } + ] + }, + { + "id":"VNAT_cfdljtspvkp234irka59wgab0", + "type_name":"tosca.nodes.nfv.ext.zte.VNF.VNAT", + "template_name":"VNAT", + "properties":{ + "is_shared":{ + "type_name":"boolean", + "value":False + }, + "plugin_info":{ + "type_name":"string", + "value":"vbrasplugin_1.0" + }, + "vendor":{ + "type_name":"string", + "value":"zte" + }, + "request_reclassification":{ + "type_name":"boolean", + "value":False + }, + "name":{ + "type_name":"string", + "value":"VNAT" + }, + "vnf_extend_type":{ + "type_name":"string", + "value":"driver" + }, + "externalPluginManageNetworkName":{ + "type_name":"string", + "value":"vlan_4007_plugin_net" + }, + "version":{ + "type_name":"string", + "value":"1.0" + }, + "cross_dc":{ + "type_name":"boolean", + "value":False + }, + "vnf_type":{ + "type_name":"string", + "value":"VNAT" + }, + "vnfd_version":{ + "type_name":"string", + "value":"1.0.0" + }, + "id":{ + "type_name":"string", + "value":"vcpe_vnat_zte_1" + }, + "nsh_aware":{ + "type_name":"boolean", + "value":True + }, + "adjust_vnf_capacity":{ + "type_name":"boolean", + "value":True + }, + "vmnumber_overquota_alarm":{ + "type_name":"boolean", + "value":True + }, + "csarProvider":{ + "type_name":"string", + "value":"ZTE" + }, + "NatIpRange":{ + "type_name":"string", + "value":"192.167.0.10-192.168.0.20" + }, + "csarVersion":{ + "type_name":"string", + "value":"v1.0" + }, + "csarType":{ + "type_name":"string", + "value":"NFAR" + } + }, + "interfaces":[ + { + "name":"Standard", + "description":"This lifecycle interface defines the essential, normative operations that TOSCA nodes may support.", + "type_name":"tosca.interfaces.node.lifecycle.Standard", + "operations":[ + { + "name":"create", + "description":"Standard lifecycle create operation." + }, + { + "name":"stop", + "description":"Standard lifecycle stop operation." + }, + { + "name":"start", + "description":"Standard lifecycle start operation." + }, + { + "name":"delete", + "description":"Standard lifecycle delete operation." + }, + { + "name":"configure", + "description":"Standard lifecycle configure operation." + } + ] + } + ], + "capabilities":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"forwarder", + "type_name":"tosca.capabilities.nfv.Forwarder" + }, + { + "name":"vnat_fw_inout", + "type_name":"tosca.capabilities.nfv.Forwarder" + } + ], + "relationships":[ + { + "name":"vnat_ctrl_by_manager_cp", + "source_requirement_index":0, + "target_node_id":"ext_mnet_net_au2otee5mcy0dnpqykj487zr3", + "target_capability_name":"feature" + }, + { + "name":"vnat_data_cp", + "source_requirement_index":1, + "target_node_id":"sfc_data_network_vx3pc1oahn0k0pa5q722yafee", + "target_capability_name":"feature" + }, + { + "name":"virtualLink", + "source_requirement_index":2, + "target_node_id":"path2_kgmfqr5ldqs9lj3oscrgxqefc", + "target_capability_name":"feature" + }, + { + "name":"forwarder", + "source_requirement_index":3, + "target_node_id":"path2_kgmfqr5ldqs9lj3oscrgxqefc", + "target_capability_name":"feature" + } + ] + } + ], + "groups":[ + { + "id":"vnffg1_wk1aqhk6exoh5fmds2unu0uyc", + "type_name":"tosca.groups.nfv.VNFFG", + "template_name":"vnffg1", + "properties":{ + "vendor":{ + "type_name":"string", + "value":"zte" + }, + "connection_point":{ + "type_name":"list", + "value":[ + "m6000_data_in", + "m600_tunnel_cp", + "m6000_data_out" + ] + }, + "version":{ + "type_name":"string", + "value":"1.0" + }, + "constituent_vnfs":{ + "type_name":"list", + "value":[ + "VFW", + "VNAT" + ] + }, + "number_of_endpoints":{ + "type_name":"integer", + "value":3 + }, + "dependent_virtual_link":{ + "type_name":"list", + "value":[ + "sfc_data_network", + "ext_datanet_net", + "ext_mnet_net" + ] + } + }, + "interfaces":[ + { + "name":"standard", + "description":"This lifecycle interface defines the essential, normative operations that TOSCA nodes may support.", + "type_name":"tosca.interfaces.node.lifecycle.Standard", + "operations":[ + { + "name":"create", + "description":"Standard lifecycle create operation." + }, + { + "name":"stop", + "description":"Standard lifecycle stop operation." + }, + { + "name":"start", + "description":"Standard lifecycle start operation." + }, + { + "name":"delete", + "description":"Standard lifecycle delete operation." + }, + { + "name":"configure", + "description":"Standard lifecycle configure operation." + } + ] + } + ], + "member_node_ids":[ + "path1_bv53fblv26hawr8dj4fxe2rsd", + "path2_kgmfqr5ldqs9lj3oscrgxqefc" + ] + } + ], + "substitution":{ + "node_type_name":"tosca.nodes.nfv.NS.VCPE_NS" + }, + "inputs":{ + "externalDataNetworkName":{ + "type_name":"string", + "value":"vlan_4004_tunnel_net" + }, + "sfc_data_network":{ + "type_name":"string", + "value":"sfc_data_network" + }, + "NatIpRange":{ + "type_name":"string", + "value":"192.167.0.10-192.168.0.20" + }, + "externalManageNetworkName":{ + "type_name":"string", + "value":"vlan_4008_mng_net" + }, + "externalPluginManageNetworkName":{ + "type_name":"string", + "value":"vlan_4007_plugin_net" + } + } + }, + "model":{ + "metadata":{ + "vendor":"ZTE", + "name":"VCPE_NS", + "csarVersion":"v1.0", + "csarType":"NSAR", + "csarProvider":"ZTE", + "version":1, + "invariant_id":"vcpe_ns_sff_1", + "id":"VCPE_NS", + "description":"vcpe_ns" + }, + "node_templates":[ + { + "name":"path2", + "type_name":"tosca.nodes.nfv.ext.FP", + "default_instances":1, + "min_instances":0, + "properties":{ + "symmetric":{ + "type_name":"boolean", + "value":False + }, + "policy":{ + "type_name":"tosca.datatypes.nfv.ext.FPPolicy", + "value":{ + "type":"ACL", + "criteria":{ + "dest_port_range":"1-100", + "ip_protocol":"tcp", + "source_ip_range":[ + "119.1.1.1-119.1.1.10" + ], + "dest_ip_range":[ + {"get_input":"NatIpRange"} + ], + "dscp":0, + "source_port_range":"1-100" + } + } + } + }, + "interface_templates":[ + "<aria.modeling.model_elements.InterfaceTemplate object at 0x7f8ed0288a10>" + ], + "capability_templates":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + } + ], + "requirement_templates":[ + { + "name":"forwarder", + "target_node_template_name":"m6000_data_out" + }, + { + "name":"forwarder", + "target_node_template_name":"m600_tunnel_cp" + }, + { + "name":"forwarder", + "target_node_template_name":"VNAT", + "target_capability_name":"vnat_fw_inout" + } + ] + }, + { + "name":"path1", + "type_name":"tosca.nodes.nfv.ext.FP", + "default_instances":1, + "min_instances":0, + "properties":{ + "symmetric":{ + "type_name":"boolean", + "value":True + }, + "policy":{ + "type_name":"tosca.datatypes.nfv.ext.FPPolicy", + "value":{ + "type":"ACL", + "criteria":{ + "dest_port_range":"1-100", + "ip_protocol":"tcp", + "source_ip_range":[ + "1-100" + ], + "dest_ip_range":[ + "1-100" + ], + "dscp":4, + "source_port_range":"1-100" + } + } + } + }, + "interface_templates":[ + "<aria.modeling.model_elements.InterfaceTemplate object at 0x7f8ec81df090>" + ], + "capability_templates":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + } + ], + "requirement_templates":[ + { + "name":"forwarder", + "target_node_template_name":"m6000_data_in" + }, + { + "name":"forwarder", + "target_node_template_name":"m600_tunnel_cp" + }, + { + "name":"forwarder", + "target_node_template_name":"VFW", + "target_capability_name":"vfw_fw_inout" + }, + { + "name":"forwarder", + "target_node_template_name":"VNAT", + "target_capability_name":"vnat_fw_inout" + }, + { + "name":"forwarder", + "target_node_template_name":"m600_tunnel_cp" + }, + { + "name":"forwarder", + "target_node_template_name":"m6000_data_out" + } + ] + }, + { + "name":"m6000_data_out", + "type_name":"tosca.nodes.nfv.ext.zte.CP", + "default_instances":1, + "min_instances":0, + "properties":{ + "direction":{ + "type_name":"string", + "value":"bidirectional" + }, + "vnic_type":{ + "type_name":"string", + "value":"normal" + }, + "bandwidth":{ + "type_name":"integer", + "value":0 + }, + "mac_address":{ + "type_name":"string", + "value":"11-22-33-22-11-44" + }, + "interface_name":{ + "type_name":"string", + "value":"xgei-0/4/1/5" + }, + "ip_address":{ + "type_name":"string", + "value":"176.1.1.2" + }, + "order":{ + "type_name":"integer", + "value":0 + }, + "sfc_encapsulation":{ + "type_name":"string", + "value":"mac" + } + }, + "interface_templates":[ + "<aria.modeling.model_elements.InterfaceTemplate object at 0x7f8ec82c6610>" + ], + "capability_templates":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"forwarder", + "type_name":"tosca.capabilities.nfv.Forwarder" + } + ], + "requirement_templates":[ + { + "name":"virtualbinding", + "target_node_template_name":"m6000_s", + "target_capability_name":"virtualBinding" + }, + { + "name":"virtualLink", + "target_node_type_name":"tosca.nodes.Root" + }, + { + "name":"forwarder", + "target_node_type_name":"tosca.nodes.Root" + } + ] + }, + { + "name":"VFW", + "type_name":"tosca.nodes.nfv.ext.zte.VNF.VFW", + "default_instances":1, + "min_instances":0, + "properties":{ + "is_shared":{ + "type_name":"boolean", + "value":False + }, + "plugin_info":{ + "type_name":"string", + "value":"vbrasplugin_1.0" + }, + "vendor":{ + "type_name":"string", + "value":"zte" + }, + "request_reclassification":{ + "type_name":"boolean", + "value":False + }, + "vnf_extend_type":{ + "type_name":"string", + "value":"driver" + }, + "name":{ + "type_name":"string", + "value":"VFW" + }, + "version":{ + "type_name":"string", + "value":"1.0" + }, + "cross_dc":{ + "type_name":"boolean", + "value":False + }, + "vnf_type":{ + "type_name":"string", + "value":"VFW" + }, + "vnfd_version":{ + "type_name":"string", + "value":"1.0.0" + }, + "id":{ + "type_name":"string", + "value":"vcpe_vfw_zte_1_0" + }, + "nsh_aware":{ + "type_name":"boolean", + "value":True + }, + "adjust_vnf_capacity":{ + "type_name":"boolean", + "value":True + }, + "vmnumber_overquota_alarm":{ + "type_name":"boolean", + "value":True + }, + "csarProvider":{ + "type_name":"string", + "value":"ZTE" + }, + "csarVersion":{ + "type_name":"string", + "value":"v1.0" + }, + "externalPluginManageNetworkName":{ + "type_name":"string", + "value":"vlan_4007_plugin_net" + }, + "csarType":{ + "type_name":"string", + "value":"NFAR" + } + }, + "interface_templates":[ + "<aria.modeling.model_elements.InterfaceTemplate object at 0x7f8ec8281950>" + ], + "capability_templates":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"forwarder", + "type_name":"tosca.capabilities.nfv.Forwarder" + }, + { + "name":"vfw_fw_inout", + "type_name":"tosca.capabilities.nfv.Forwarder" + } + ], + "requirement_templates":[ + { + "name":"vfw_ctrl_by_manager_cp", + "target_node_template_name":"ext_mnet_net", + "target_capability_name":"virtual_linkable" + }, + { + "name":"vfw_data_cp", + "target_node_template_name":"sfc_data_network", + "target_capability_name":"virtual_linkable" + }, + { + "name":"virtualLink", + "target_node_type_name":"tosca.nodes.Root" + }, + { + "name":"forwarder", + "target_node_type_name":"tosca.nodes.Root" + } + ] + }, + { + "name":"m600_tunnel_cp", + "type_name":"tosca.nodes.nfv.ext.zte.CP", + "default_instances":1, + "min_instances":0, + "properties":{ + "direction":{ + "type_name":"string", + "value":"bidirectional" + }, + "vnic_type":{ + "type_name":"string", + "value":"normal" + }, + "bandwidth":{ + "type_name":"integer", + "value":0 + }, + "mac_address":{ + "type_name":"string", + "value":"00-11-00-22-33-00" + }, + "interface_name":{ + "type_name":"string", + "value":"gei-0/4/0/13" + }, + "ip_address":{ + "type_name":"string", + "value":"191.167.100.5" + }, + "order":{ + "type_name":"integer", + "value":0 + }, + "sfc_encapsulation":{ + "type_name":"string", + "value":"mac" + } + }, + "interface_templates":[ + "<aria.modeling.model_elements.InterfaceTemplate object at 0x1ae39d0>" + ], + "capability_templates":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"forwarder", + "type_name":"tosca.capabilities.nfv.Forwarder" + } + ], + "requirement_templates":[ + { + "name":"virtualLink", + "target_node_template_name":"ext_datanet_net", + "target_capability_name":"virtual_linkable" + }, + { + "name":"virtualbinding", + "target_node_template_name":"m6000_s", + "target_capability_name":"virtualBinding" + }, + { + "name":"forwarder", + "target_node_type_name":"tosca.nodes.Root" + } + ] + }, + { + "name":"ext_mnet_net", + "type_name":"tosca.nodes.nfv.ext.VL.Vmware", + "default_instances":1, + "min_instances":0, + "properties":{ + "name":{ + "type_name":"string", + "value":"vlan_4008_mng_net" + }, + "dhcp_enabled":{ + "type_name":"boolean", + "value":True + }, + "location_info":{ + "type_name":"tosca.datatypes.nfv.ext.LocationInfo", + "value":{ + "tenant":"admin", + "vimid":2, + "availability_zone":"nova" + } + }, + "ip_version":{ + "type_name":"integer", + "value":4 + }, + "mtu":{ + "type_name":"integer", + "value":1500 + }, + "network_name":{ + "type_name":"string", + "value":"vlan_4008_mng_net" + }, + "network_type":{ + "type_name":"string", + "value":"vlan" + } + }, + "interface_templates":[ + "<aria.modeling.model_elements.InterfaceTemplate object at 0x7f8ed00f89d0>" + ], + "capability_templates":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"virtual_linkable", + "type_name":"tosca.capabilities.nfv.VirtualLinkable" + } + ] + }, + { + "name":"m6000_data_in", + "type_name":"tosca.nodes.nfv.ext.zte.CP", + "default_instances":1, + "min_instances":0, + "properties":{ + "direction":{ + "type_name":"string", + "value":"bidirectional" + }, + "vnic_type":{ + "type_name":"string", + "value":"normal" + }, + "bandwidth":{ + "type_name":"integer", + "value":0 + }, + "mac_address":{ + "type_name":"string", + "value":"11-22-33-22-11-41" + }, + "interface_name":{ + "type_name":"string", + "value":"gei-0/4/0/7" + }, + "ip_address":{ + "type_name":"string", + "value":"1.1.1.1" + }, + "order":{ + "type_name":"integer", + "value":0 + }, + "sfc_encapsulation":{ + "type_name":"string", + "value":"mac" + }, + "bond":{ + "type_name":"string", + "value":"none" + } + }, + "interface_templates":[ + "<aria.modeling.model_elements.InterfaceTemplate object at 0x1745710>" + ], + "capability_templates":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"forwarder", + "type_name":"tosca.capabilities.nfv.Forwarder" + } + ], + "requirement_templates":[ + { + "name":"virtualbinding", + "target_node_template_name":"m6000_s", + "target_capability_name":"virtualBinding" + }, + { + "name":"virtualLink", + "target_node_type_name":"tosca.nodes.Root" + }, + { + "name":"forwarder", + "target_node_type_name":"tosca.nodes.Root" + } + ] + }, + { + "name":"ext_datanet_net", + "type_name":"tosca.nodes.nfv.ext.VL.Vmware", + "default_instances":1, + "min_instances":0, + "properties":{ + "name":{ + "type_name":"string", + "value":"vlan_4004_tunnel_net" + }, + "dhcp_enabled":{ + "type_name":"boolean", + "value":True + }, + "location_info":{ + "type_name":"tosca.datatypes.nfv.ext.LocationInfo", + "value":{ + "tenant":"admin", + "vimid":2, + "availability_zone":"nova" + } + }, + "ip_version":{ + "type_name":"integer", + "value":4 + }, + "mtu":{ + "type_name":"integer", + "value":1500 + }, + "network_name":{ + "type_name":"string", + "value":"vlan_4004_tunnel_net" + }, + "network_type":{ + "type_name":"string", + "value":"vlan" + } + }, + "interface_templates":[ + "<aria.modeling.model_elements.InterfaceTemplate object at 0x7f8eac063990>" + ], + "capability_templates":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"virtual_linkable", + "type_name":"tosca.capabilities.nfv.VirtualLinkable" + } + ] + }, + { + "name":"m600_mnt_cp", + "type_name":"tosca.nodes.nfv.ext.zte.CP", + "default_instances":1, + "min_instances":0, + "properties":{ + "direction":{ + "type_name":"string", + "value":"bidirectional" + }, + "vnic_type":{ + "type_name":"string", + "value":"normal" + }, + "bandwidth":{ + "type_name":"integer", + "value":0 + }, + "mac_address":{ + "type_name":"string", + "value":"00-11-00-22-33-11" + }, + "interface_name":{ + "type_name":"string", + "value":"gei-0/4/0/1" + }, + "ip_address":{ + "type_name":"string", + "value":"10.46.244.51" + }, + "order":{ + "type_name":"integer", + "value":0 + }, + "sfc_encapsulation":{ + "type_name":"string", + "value":"mac" + }, + "bond":{ + "type_name":"string", + "value":"none" + } + }, + "interface_templates":[ + "<aria.modeling.model_elements.InterfaceTemplate object at 0x7f8ec81264d0>" + ], + "capability_templates":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"forwarder", + "type_name":"tosca.capabilities.nfv.Forwarder" + } + ], + "requirement_templates":[ + { + "name":"virtualLink", + "target_node_template_name":"ext_mnet_net", + "target_capability_name":"virtual_linkable" + }, + { + "name":"virtualbinding", + "target_node_template_name":"m6000_s", + "target_capability_name":"virtualBinding" + }, + { + "name":"forwarder", + "target_node_type_name":"tosca.nodes.Root" + } + ] + }, + { + "name":"sfc_data_network", + "type_name":"tosca.nodes.nfv.ext.zte.VL", + "default_instances":1, + "min_instances":0, + "properties":{ + "name":{ + "type_name":"string", + "value":"sfc_data_network" + }, + "dhcp_enabled":{ + "type_name":"boolean", + "value":True + }, + "is_predefined":{ + "type_name":"boolean", + "value":False + }, + "location_info":{ + "type_name":"tosca.datatypes.nfv.ext.LocationInfo", + "value":{ + "tenant":"admin", + "vimid":2, + "availability_zone":"nova" + } + }, + "ip_version":{ + "type_name":"integer", + "value":4 + }, + "mtu":{ + "type_name":"integer", + "value":1500 + }, + "network_name":{ + "type_name":"string", + "value":"sfc_data_network" + }, + "network_type":{ + "type_name":"string", + "value":"vlan" + } + }, + "interface_templates":[ + "<aria.modeling.model_elements.InterfaceTemplate object at 0x7f8ec813c6d0>" + ], + "capability_templates":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"virtual_linkable", + "type_name":"tosca.capabilities.nfv.VirtualLinkable" + } + ] + }, + { + "name":"m6000_s", + "type_name":"tosca.nodes.nfv.ext.PNF", + "default_instances":1, + "min_instances":0, + "properties":{ + "vendor":{ + "type_name":"string", + "value":"zte" + }, + "request_reclassification":{ + "type_name":"boolean", + "value":False + }, + "pnf_type":{ + "type_name":"string", + "value":"m6000s" + }, + "version":{ + "type_name":"string", + "value":"1.0" + }, + "management_address":{ + "type_name":"string", + "value":"111111" + }, + "id":{ + "type_name":"string", + "value":"m6000_s" + }, + "nsh_aware":{ + "type_name":"boolean", + "value":False + } + }, + "interface_templates":[ + "<aria.modeling.model_elements.InterfaceTemplate object at 0x7f8ec8132490>" + ], + "capability_templates":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"virtualBinding", + "type_name":"tosca.capabilities.nfv.VirtualBindable" + }, + { + "name":"forwarder", + "type_name":"tosca.capabilities.nfv.Forwarder" + } + ], + "requirement_templates":[ + { + "name":"forwarder", + "target_node_type_name":"tosca.nodes.Root" + } + ] + }, + { + "name":"VNAT", + "type_name":"tosca.nodes.nfv.ext.zte.VNF.VNAT", + "default_instances":1, + "min_instances":0, + "properties":{ + "is_shared":{ + "type_name":"boolean", + "value":False + }, + "plugin_info":{ + "type_name":"string", + "value":"vbrasplugin_1.0" + }, + "vendor":{ + "type_name":"string", + "value":"zte" + }, + "request_reclassification":{ + "type_name":"boolean", + "value":False + }, + "name":{ + "type_name":"string", + "value":"VNAT" + }, + "vnf_extend_type":{ + "type_name":"string", + "value":"driver" + }, + "externalPluginManageNetworkName":{ + "type_name":"string", + "value":"vlan_4007_plugin_net" + }, + "version":{ + "type_name":"string", + "value":"1.0" + }, + "cross_dc":{ + "type_name":"boolean", + "value":False + }, + "vnf_type":{ + "type_name":"string", + "value":"VNAT" + }, + "vnfd_version":{ + "type_name":"string", + "value":"1.0.0" + }, + "id":{ + "type_name":"string", + "value":"vcpe_vnat_zte_1" + }, + "nsh_aware":{ + "type_name":"boolean", + "value":True + }, + "adjust_vnf_capacity":{ + "type_name":"boolean", + "value":True + }, + "vmnumber_overquota_alarm":{ + "type_name":"boolean", + "value":True + }, + "csarProvider":{ + "type_name":"string", + "value":"ZTE" + }, + "NatIpRange":{ + "type_name":"string", + "value":"192.167.0.10-192.168.0.20" + }, + "csarVersion":{ + "type_name":"string", + "value":"v1.0" + }, + "csarType":{ + "type_name":"string", + "value":"NFAR" + } + }, + "interface_templates":[ + "<aria.modeling.model_elements.InterfaceTemplate object at 0x1bba810>" + ], + "capability_templates":[ + { + "name":"feature", + "type_name":"tosca.capabilities.Node" + }, + { + "name":"forwarder", + "type_name":"tosca.capabilities.nfv.Forwarder" + }, + { + "name":"vnat_fw_inout", + "type_name":"tosca.capabilities.nfv.Forwarder" + } + ], + "requirement_templates":[ + { + "name":"vnat_ctrl_by_manager_cp", + "target_node_template_name":"ext_mnet_net", + "target_capability_name":"virtual_linkable" + }, + { + "name":"vnat_data_cp", + "target_node_template_name":"sfc_data_network", + "target_capability_name":"virtual_linkable" + }, + { + "name":"virtualLink", + "target_node_type_name":"tosca.nodes.Root" + }, + { + "name":"forwarder", + "target_node_type_name":"tosca.nodes.Root" + } + ] + } + ], + "group_templates":[ + { + "name":"vnffg1", + "type_name":"tosca.groups.nfv.VNFFG", + "properties":{ + "vendor":{ + "type_name":"string", + "value":"zte" + }, + "connection_point":{ + "type_name":"list", + "value":[ + "m6000_data_in", + "m600_tunnel_cp", + "m6000_data_out" + ] + }, + "version":{ + "type_name":"string", + "value":"1.0" + }, + "constituent_vnfs":{ + "type_name":"list", + "value":[ + "VFW", + "VNAT" + ] + }, + "number_of_endpoints":{ + "type_name":"integer", + "value":3 + }, + "dependent_virtual_link":{ + "type_name":"list", + "value":[ + "sfc_data_network", + "ext_datanet_net", + "ext_mnet_net" + ] + } + }, + "interface_templates":[ + "<aria.modeling.model_elements.InterfaceTemplate object at 0x7f8ec811cd10>" + ], + "member_node_template_names":[ + "path1", + "path2" + ] + } + ], + "substitution_template":{ + "node_type_name":"tosca.nodes.nfv.NS.VCPE_NS" + }, + "inputs":{ + "externalDataNetworkName":{ + "type_name":"string", + "value":"vlan_4004_tunnel_net" + }, + "sfc_data_network":{ + "type_name":"string", + "value":"sfc_data_network" + }, + "NatIpRange":{ + "type_name":"string", + "value":"192.167.0.10-192.168.0.20" + }, + "externalManageNetworkName":{ + "type_name":"string", + "value":"vlan_4008_mng_net" + }, + "externalPluginManageNetworkName":{ + "type_name":"string", + "value":"vlan_4007_plugin_net" + } + } + } + } + ) + print convert_nsd_model(src_json) + + + + diff --git a/share/common/utils/values.py b/share/common/utils/values.py new file mode 100644 index 00000000..7478c013 --- /dev/null +++ b/share/common/utils/values.py @@ -0,0 +1,22 @@ +# Copyright (c) 2017-2018 Wind River Systems, Inc. +# +# 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. + + +def ignore_case_get(args, key, def_val=""): + if not key: + return def_val + if key in args: + return args[key] + for old_key in args: + if old_key.upper() == key.upper(): + return args[old_key] + return def_val + |