123 lines
5.2 KiB
Python
123 lines
5.2 KiB
Python
# 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]
|