Skip to content

Commit bc31b8c

Browse files
authored
Merge pull request #32 from arenadata/adcm-1359
ADCM-1359 Added decorator for compare version of server and client.
2 parents a13c9a7 + 6274771 commit bc31b8c

3 files changed

Lines changed: 43 additions & 12 deletions

File tree

adcm_client/base.py

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,16 @@
1010
# See the License for the specific language governing permissions and
1111
# limitations under the License.
1212
# pylint: disable=R0901
13-
from adcm_client.util.search import search_one, search
14-
from adcm_client.wrappers.api import ADCMApiWrapper
1513
from collections import UserList, OrderedDict
14+
from functools import wraps
1615
from pprint import pprint
1716
from time import sleep
17+
1818
import coreapi
19+
from version_utils import rpm
20+
21+
from adcm_client.util.search import search_one, search
22+
from adcm_client.wrappers.api import ADCMApiWrapper
1923

2024

2125
def pp(*args, **kwargs):
@@ -69,6 +73,30 @@ class PagingEnds(Exception):
6973
"""There are no more data in paginated mode."""
7074

7175

76+
class TooOldServerVersion(Exception):
77+
"""Incompatible version, upgrade version ADCM."""
78+
def __init__(self, method_name='', version='', message=None):
79+
if message is None:
80+
self.message = (f'The "{method_name}" method works with versions older {version},'
81+
f' upgrade version ADCM.')
82+
else:
83+
self.message = message
84+
super(TooOldServerVersion, self).__init__(self.message)
85+
86+
87+
def min_server_version(version):
88+
def decorate(func):
89+
@wraps(func)
90+
def wrapper(*args, **kwargs):
91+
# The ADCM version must be greater than or equal to the method version
92+
# args[0].adcm_version >= version
93+
if rpm.compare_versions(args[0].adcm_version, version) < 0:
94+
raise TooOldServerVersion(func.__name__, version)
95+
return func(*args, **kwargs)
96+
return wrapper
97+
return decorate
98+
99+
72100
class Paging:
73101
def __init__(self, paged_object, limit=50, **args):
74102
self._paged_object = paged_object
@@ -245,7 +273,7 @@ def __init__(self, api: ADCMApiWrapper, path=None, path_args=None, **args):
245273

246274
self._endpoint = EndPoint(api, self.IDNAME, path, path_args, self.FILTERS)
247275
self._api = api
248-
276+
self.adcm_version = self._api.adcm_version
249277
self._client = api.objects
250278

251279
self._data = self._endpoint.search_one(**args)

adcm_client/objects.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
from adcm_client.base import (
2121
ActionHasIssues, ADCMApiError, BaseAPIListObject, BaseAPIObject, ObjectNotFound,
22-
TooManyArguments, strip_none_keys
22+
TooManyArguments, strip_none_keys, min_server_version
2323
)
2424
from adcm_client.util import stream
2525
from adcm_client.wrappers.api import ADCMApiWrapper
@@ -431,9 +431,10 @@ def service_add(self, **args) -> "Service":
431431
data = self._subcall("service", "create", prototype_id=proto.id)
432432
return self._subobject(Service, service_id=data['id'])
433433

434-
# @allure_step("Remove service to cluster")
435-
# def service_delete(self, service):
436-
# self._subcall("service", "delete", service_id=service.id)
434+
@min_server_version('2020.05.13.00')
435+
def service_delete(self, service: "Service"):
436+
with allure_step("Remove service {} from cluster {}".format(service.name, self.name)):
437+
self._subcall("service", "delete", service_id=service.id)
437438

438439
def hostcomponent(self):
439440
return self._subcall("hostcomponent", "list")
@@ -889,6 +890,7 @@ def __init__(self, api=None, url=None, user=None, password=None):
889890
self.auth(user, password)
890891
if self.api_token() is not None:
891892
self.guess_adcm_url()
893+
self.adcm_version = self._api.adcm_version
892894

893895
def auth(self, user=None, password=None):
894896
if user is None or password is None:
@@ -899,11 +901,7 @@ def auth(self, user=None, password=None):
899901
self._check_min_version()
900902

901903
def _check_min_version(self):
902-
try:
903-
version = self._api.objects.info.list()['adcm_version']
904-
except (KeyError, AttributeError):
905-
version = "0"
906-
if rpm.compare_versions(self._MIN_VERSION, version) > 0:
904+
if rpm.compare_versions(self._MIN_VERSION, self._api.adcm_version) > 0:
907905
raise ADCMApiError("That client supports ADCM versions >= {}".format(self._MIN_VERSION))
908906

909907
def api_token(self):

adcm_client/wrappers/api.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ def __init__(self, url):
102102
self.schema = None
103103
self.objects = None
104104
self.api_token = None
105+
self.adcm_version = None
105106

106107
def _check_for_error(self, data):
107108
if data is not None:
@@ -124,6 +125,10 @@ def auth(self, username, password):
124125
self.schema = self.client.get("{}{}schema/".format(self.url, self.api_url))
125126
self.objects = self._parse_schema(self.schema, is_allure=IS_ALLURE)
126127
self.api_token = token['token']
128+
try:
129+
self.adcm_version = self.objects.info.list()['adcm_version']
130+
except (KeyError, AttributeError):
131+
self.adcm_version = "0"
127132

128133
def action(self, *args, **kvargs):
129134
"""

0 commit comments

Comments
 (0)