Tacker: ETSI MANO NFV Orchestrator / VNF Manager. See https://wiki.openstack.org/wiki/Tacker
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

122 lines
5.2 KiB

# Copyright (C) 2019 NTT DATA
# 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 tacker.api import views as base
from tacker.objects import vnf_package as _vnf_package
class ViewBuilder(base.BaseViewBuilder):
FLATTEN_ATTRIBUTES = _vnf_package.VnfPackage.FLATTEN_ATTRIBUTES
COMPLEX_ATTRIBUTES = _vnf_package.VnfPackage.COMPLEX_ATTRIBUTES
FLATTEN_COMPLEX_ATTRIBUTES = [key for key in FLATTEN_ATTRIBUTES.keys()
if '/' in key]
def _get_links(self, vnf_package):
return {
"_links": {
"self": {
"href": '/vnfpkgm/v1/vnf_packages/%s'
% vnf_package.id
},
"packageContent": {
"href": '/vnfpkgm/v1/vnf_packages/%s/package_content'
% vnf_package.id
}
}
}
def _get_vnf_package(self, vnf_package, include_fields=None):
vnf_package_response = vnf_package.to_dict(
include_fields=include_fields)
links = self._get_links(vnf_package)
vnf_package_response.update(links)
return vnf_package_response
def _get_modified_user_data(self, old_user_data, new_user_data):
# Checking for the new keys
user_data_response = {k: new_user_data[k] for k
in set(new_user_data) - set(old_user_data)}
# Checking for updation in values of existing keys
for old_key, old_value in old_user_data.items():
if old_key in new_user_data.keys() and \
new_user_data[old_key] != old_user_data[old_key]:
user_data_response[old_key] = new_user_data[old_key]
return user_data_response
def create(self, request, vnf_package):
return self._get_vnf_package(vnf_package)
def show(self, request, vnf_package):
return self._get_vnf_package(vnf_package)
def patch(self, vnf_package, new_vnf_package):
response = {}
if vnf_package.operational_state != new_vnf_package.operational_state:
response['operationalState'] = new_vnf_package.operational_state
if vnf_package.user_data != new_vnf_package.user_data:
updated_user_data = self._get_modified_user_data(
vnf_package.user_data, new_vnf_package.user_data)
response['userDefinedData'] = updated_user_data
return response
def index(self, request, vnf_packages, all_fields=True,
exclude_fields=None, fields=None, exclude_default=False):
# Find out which fields are to be returned in the response.
if all_fields:
include_fields = set(self.FLATTEN_ATTRIBUTES.keys())
if exclude_default and fields or fields:
# Note(tpatil): If fields contains any of the complex attributes
# base name, it should include all attributes from that complex
# attribute. For example, if softwareImages is passed in the
# fields, it should include all attributes matching
# softwareImages/*.
fields = set(fields.split(','))
attributes = set(self.COMPLEX_ATTRIBUTES).intersection(fields)
for attribute in attributes:
add_fields = set([key for key in self.FLATTEN_ATTRIBUTES.
keys() if key.startswith(attribute)])
fields = fields.union(add_fields)
include_fields = set(_vnf_package.VnfPackage.simple_attributes +
_vnf_package.VnfPackage.simple_instantiated_attributes). \
union(fields)
elif exclude_default:
include_fields = set(_vnf_package.VnfPackage.simple_attributes +
_vnf_package.VnfPackage.simple_instantiated_attributes)
elif exclude_fields:
# Note(tpatil): If exclude_fields contains any of the complex
# attributes base name, it should exclude all attributes from
# that complex attribute. For example, if softwareImages is passed
# in the excluded_fields, it should exclude all attributes
# matching softwareImages/*.
exclude_fields = set(exclude_fields.split(','))
exclude_additional_attributes = set(
self.COMPLEX_ATTRIBUTES).intersection(exclude_fields)
for attribute in exclude_additional_attributes:
fields = set([key for key in self.FLATTEN_ATTRIBUTES.keys()
if key.startswith(attribute)])
exclude_fields = exclude_fields.union(fields)
include_fields = set(self.FLATTEN_ATTRIBUTES.keys()) - \
exclude_fields
return [self._get_vnf_package(vnf_package,
include_fields=include_fields)for vnf_package in vnf_packages]