tacker/tacker/sol_refactored/api/api_version.py
Itsuro Oda 5f35b695bf Multi version API support
This patch provides a base to support multi version API.

The existing code of functions for SOL specification was hard to
understand and enhance since it is based on the code of legacy tacker
API and they are connected with each other complicatedly.

Therefore the code for SOL specification is newly created which
is independent to the legacy tacker API so that it will be easy to
maintain and enhance.

This patch supports vnflcm v2 API (api_version 2.0.0) as a starting
point. It supports less functions than the exsisting v1 API at the
moment(Xena) but it will catch up with by the next release (Y).

This patch makes supporting another API version easy when it will
be supported in the future. Possibly it may thought to add v1 API to
this code base.

TODO: enhance UT/FT
UT/FT is not sufficient at the moment. Additional UTs and FTs will
be provided with another patches.

Implements: blueprint multi-version-api
Implements: blueprint support-nfv-solv3-start-and-terminate-vnf
Implements: blueprint support-nfv-solv3-query-vnf-instances
Implements: blueprint support-nfv-solv3-query-operation-occurrences
Implements: blueprint support-nfv-solv3-subscriptions
Change-Id: If76f315d8b3856e0eef9b8808b90f0b15d80d488
2021-09-16 01:19:51 +00:00

116 lines
3.7 KiB
Python

# Copyright (C) 2021 Nippon Telegraph and Telephone 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 re
from tacker.sol_refactored.common import exceptions as sol_ex
supported_versions_v1 = {
'uriPrefix': '/vnflcm/v1',
'apiVersions': [
{'version': '1.3.0', 'isDeprecated': False}
]
}
supported_versions_v2 = {
'uriPrefix': '/vnflcm/v2',
'apiVersions': [
{'version': '2.0.0', 'isDeprecated': False}
]
}
CURRENT_VERSION = '2.0.0'
supported_versions = [
item['version'] for item in supported_versions_v2['apiVersions']
]
class APIVersion(object):
def __init__(self, version_string=None):
self.ver_major = 0
self.ver_minor = 0
self.ver_patch = 0
if version_string is None:
return
version_string = self._get_version_id(version_string)
match = re.match(r"^([1-9]\d*)\.([1-9]\d*|0)\.([1-9]\d*|0)$",
version_string)
if match:
self.ver_major = int(match.group(1))
self.ver_minor = int(match.group(2))
self.ver_patch = int(match.group(3))
else:
raise sol_ex.InvalidAPIVersionString(version=version_string)
if version_string not in supported_versions:
raise sol_ex.APIVersionNotSupported(version=version_string)
def _get_version_id(self, version_string):
# version example (see. SOL013 Table 4.2.2-1)
# `1.2.0` or `1.2.0-impl:example.com:myProduct:4`
# This method checks the later case and return the part of
# version identifier. check is loose.
if '-' not in version_string:
return version_string
items = version_string.split('-')
if len(items) == 2 and items[1].startswith("impl:"):
return items[0]
raise sol_ex.InvalidAPIVersionString(version=version_string)
def is_null(self):
return (self.ver_major, self.ver_minor, self.ver_patch) == (0, 0, 0)
def __str__(self):
return "%d.%d.%d" % (self.ver_major, self.ver_minor, self.ver_patch)
def __lt__(self, other):
return ((self.ver_major, self.ver_minor, self.ver_patch) <
(other.ver_major, other.ver_minor, other.ver_patch))
def __eq__(self, other):
return ((self.ver_major, self.ver_minor, self.ver_patch) ==
(other.ver_major, other.ver_minor, other.ver_patch))
def __gt__(self, other):
return ((self.ver_major, self.ver_minor, self.ver_patch) >
(other.ver_major, other.ver_minor, other.ver_patch))
def __le__(self, other):
return self < other or self == other
def __ne__(self, other):
return not self.__eq__(other)
def __ge__(self, other):
return self > other or self == other
def matches(self, min_version, max_version):
if self.is_null():
return False
if max_version.is_null() and min_version.is_null():
return True
elif max_version.is_null():
return min_version <= self
elif min_version.is_null():
return self <= max_version
else:
return min_version <= self <= max_version