From 3a3cda58c69b9a9adec6a5ec49d4e797771bc589 Mon Sep 17 00:00:00 2001 From: Lars Kellogg-Stedman Date: Tue, 25 Mar 2025 08:35:34 -0400 Subject: [PATCH 1/3] Fix erroneous use of "is" The `is` operator checks for identity, not equality. To check for an empty list, one should use either: if roles == []: Or just take advantage of the fact that an empty list is `False` when used in a boolean expression, and write: if not roles: This commit takes the second option. --- esileapclient/tests/functional/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esileapclient/tests/functional/base.py b/esileapclient/tests/functional/base.py index 0817347..634b551 100644 --- a/esileapclient/tests/functional/base.py +++ b/esileapclient/tests/functional/base.py @@ -121,7 +121,7 @@ def _init_dummy_project(self, name, roles, parent=None): 'domain': 'default' } - if roles is []: + if not roles: raise ValueError('No roles specified when initializing dummy \ project %s' % name) elif type(roles) is str: From afcea88a895820ebf5b7d18b9ca8f3f6690cd6bc Mon Sep 17 00:00:00 2001 From: Lars Kellogg-Stedman Date: Tue, 25 Mar 2025 08:33:49 -0400 Subject: [PATCH 2/3] Add pre-commit config and workflow Bring this repository in line with other ESI repositories and introduce our standard linting and ruff-based formatting of Python code. --- .github/dependabot.yaml | 10 ++++++++++ .github/workflows/precommit.yaml | 31 +++++++++++++++++++++++++++++++ .github/workflows/tests.yml | 4 +--- .pre-commit-config.yaml | 27 +++++++++++++++++++++++++++ .yamllint.yaml | 10 ++++++++++ 5 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 .github/dependabot.yaml create mode 100644 .github/workflows/precommit.yaml create mode 100644 .pre-commit-config.yaml create mode 100644 .yamllint.yaml diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml new file mode 100644 index 0000000..dfd0e30 --- /dev/null +++ b/.github/dependabot.yaml @@ -0,0 +1,10 @@ +# Set update schedule for GitHub Actions + +version: 2 +updates: + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + # Check for updates to GitHub Actions every week + interval: "weekly" diff --git a/.github/workflows/precommit.yaml b/.github/workflows/precommit.yaml new file mode 100644 index 0000000..7bfaad5 --- /dev/null +++ b/.github/workflows/precommit.yaml @@ -0,0 +1,31 @@ +name: "Run pre-commit checks" + +on: + push: + pull_request: + +jobs: + run-linters: + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Configure caching + uses: actions/cache@v4 + with: + path: ~/.cache/pre-commit + key: precommit-${{ runner.os }}-${{ hashFiles('.pre-commit-config.yaml') }} + + - name: Install pre-commit + run: | + pip install pre-commit + + - name: Run linters + run: | + pre-commit run --all-files diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ab0dd5f..67b273e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,4 +1,4 @@ -name: python-esileapclient +name: Run unit tests on: [push, pull_request] @@ -20,7 +20,5 @@ jobs: run: | python -m pip install --upgrade pip pip install tox - - name: Lint - run: tox -epep8 - name: Unit Tests run: tox -epy3 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..cfbe88f --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,27 @@ +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: trailing-whitespace + - id: check-merge-conflict + - id: end-of-file-fixer + - id: check-added-large-files + - id: check-case-conflict + - id: check-json + - id: check-symlinks + - id: detect-private-key + - id: check-executables-have-shebangs + +- repo: https://github.com/adrienverge/yamllint.git + rev: v1.37.0 + hooks: + - id: yamllint + files: \.(yaml|yml)$ + types: [file, yaml] + entry: yamllint --strict + +- repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.11.2 + hooks: + - id: ruff + - id: ruff-format diff --git a/.yamllint.yaml b/.yamllint.yaml new file mode 100644 index 0000000..88404b7 --- /dev/null +++ b/.yamllint.yaml @@ -0,0 +1,10 @@ +extends: default +rules: + line-length: disable + document-start: disable + indentation: + indent-sequences: whatever + hyphens: + max-spaces-after: 4 + truthy: + check-keys: false From 3a3c87acb510d1cf6403d63df257988240fd4c7b Mon Sep 17 00:00:00 2001 From: Lars Kellogg-Stedman Date: Tue, 25 Mar 2025 08:40:28 -0400 Subject: [PATCH 3/3] Reformat and fix linting errors Correct all the errors reported by pre-commit. --- conftest.py | 27 +- esileapclient/__init__.py | 3 +- esileapclient/common/base.py | 98 +-- esileapclient/common/utils.py | 21 +- esileapclient/osc/plugin.py | 20 +- esileapclient/osc/v1/console_auth_token.py | 39 +- esileapclient/osc/v1/event.py | 57 +- esileapclient/osc/v1/lease.py | 246 +++--- esileapclient/osc/v1/mdc/mdc_lease.py | 84 +- esileapclient/osc/v1/mdc/mdc_offer.py | 184 ++--- esileapclient/osc/v1/node.py | 51 +- esileapclient/osc/v1/offer.py | 270 +++---- esileapclient/tests/functional/base.py | 189 +++-- .../tests/functional/utils/dummy_node.py | 30 +- .../tests/functional/utils/esi_interfaces.py | 150 +++- .../tests/functional/utils/output_utils.py | 33 +- .../tests/functional/v1/test_basic.py | 607 ++++++++------- .../tests/functional/v1/test_policy.py | 333 ++++---- .../tests/functional/v1/test_sublease.py | 336 ++++---- .../tests/functional/v1/test_time.py | 733 +++++++++--------- esileapclient/tests/unit/common/test_base.py | 256 +++--- esileapclient/tests/unit/common/test_utils.py | 89 ++- esileapclient/tests/unit/osc/test_plugin.py | 23 +- esileapclient/tests/unit/osc/v1/base.py | 3 +- esileapclient/tests/unit/osc/v1/fakes.py | 136 ++-- .../tests/unit/osc/v1/mdc/test_mdc_lease.py | 132 ++-- .../tests/unit/osc/v1/mdc/test_mdc_offer.py | 303 ++++---- .../unit/osc/v1/test_console_auth_token.py | 25 +- esileapclient/tests/unit/osc/v1/test_event.py | 37 +- esileapclient/tests/unit/osc/v1/test_lease.py | 374 ++++----- esileapclient/tests/unit/osc/v1/test_node.py | 110 +-- esileapclient/tests/unit/osc/v1/test_offer.py | 369 +++++---- esileapclient/v1/console_auth_token.py | 9 +- esileapclient/v1/event.py | 52 +- esileapclient/v1/lease.py | 103 +-- esileapclient/v1/node.py | 58 +- esileapclient/v1/offer.py | 88 ++- setup.py | 8 +- 38 files changed, 3010 insertions(+), 2676 deletions(-) diff --git a/conftest.py b/conftest.py index e063012..8f66371 100644 --- a/conftest.py +++ b/conftest.py @@ -4,24 +4,27 @@ def pytest_addoption(parser): - parser.addoption('--run-slow', - action='store_true', - default=False, - help='run tests marked as slow') + parser.addoption( + "--run-slow", + action="store_true", + default=False, + help="run tests marked as slow", + ) def pytest_configure(config): - slow_info = 'slow: mark test as slow to run' - neg_info = 'negative: marks tests that test invalid input' - config.addinivalue_line('markers', slow_info) - config.addinivalue_line('markers', neg_info) + slow_info = "slow: mark test as slow to run" + neg_info = "negative: marks tests that test invalid input" + config.addinivalue_line("markers", slow_info) + config.addinivalue_line("markers", neg_info) def pytest_collection_modifyitems(config, items): - if config.getoption('--run-slow'): + if config.getoption("--run-slow"): return - skipped = pytest.mark.skip(reason='slow tests are skipped by default; ' - 'to run, call pytest with --run-slow.') + skipped = pytest.mark.skip( + reason="slow tests are skipped by default; to run, call pytest with --run-slow." + ) for item in items: - if 'slow' in item.keywords: + if "slow" in item.keywords: item.add_marker(skipped) diff --git a/esileapclient/__init__.py b/esileapclient/__init__.py index a44c94a..e55ff5a 100644 --- a/esileapclient/__init__.py +++ b/esileapclient/__init__.py @@ -1,4 +1,3 @@ - # 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 @@ -14,4 +13,4 @@ import pbr.version -__version__ = pbr.version.VersionInfo('python-esileapclient').version_string() +__version__ = pbr.version.VersionInfo("python-esileapclient").version_string() diff --git a/esileapclient/common/base.py b/esileapclient/common/base.py index 8d81a20..6a045a5 100644 --- a/esileapclient/common/base.py +++ b/esileapclient/common/base.py @@ -32,14 +32,12 @@ class Manager(object): @property @abc.abstractmethod def resource_class(self): - """The resource class - """ + """The resource class""" @property @abc.abstractmethod def _resource_name(self): - """The resource name. - """ + """The resource name.""" def __init__(self, api): self.api = api @@ -50,17 +48,20 @@ def _path(self, resource_id=None): path. """ - return ('/v1/%s/%s' % (self._resource_name, resource_id) - if resource_id else '/v1/%s' % self._resource_name) + return ( + "/v1/%s/%s" % (self._resource_name, resource_id) + if resource_id + else "/v1/%s" % self._resource_name + ) @staticmethod def _url_variables(variables): """Returns a url with variables set""" - url_variables = '?' + url_variables = "?" for k, v in variables.items(): if v is not None: - url_variables += k + '=' + v + '&' + url_variables += k + "=" + v + "&" return url_variables[:-1] def _create(self, os_esileap_api_version=None, **kwargs): @@ -71,30 +72,32 @@ def _create(self, os_esileap_api_version=None, **kwargs): new = {} invalid = [] - for (key, value) in kwargs.items(): + for key, value in kwargs.items(): if key in self.resource_class._creation_attributes: new[key] = value else: invalid.append(key) if invalid: - raise Exception('The attribute(s) "%(attrs)s" ' - 'are invalid; they are not ' - 'needed to create %(resource)s.' % - {'resource': self._resource_name, - 'attrs': '","'.join(invalid)}) + raise Exception( + 'The attribute(s) "%(attrs)s" ' + "are invalid; they are not " + "needed to create %(resource)s." + % {"resource": self._resource_name, "attrs": '","'.join(invalid)} + ) headers = {} if os_esileap_api_version is not None: - headers['headers'] = {'X-OpenStack-ESI-Leap-API-Version': - os_esileap_api_version} + headers["headers"] = { + "X-OpenStack-ESI-Leap-API-Version": os_esileap_api_version + } url = self._path() - resp, body = self.api.json_request('POST', url, body=new, **headers) + resp, body = self.api.json_request("POST", url, body=new, **headers) if resp.status_code == 201: return self.resource_class(self, body) else: - raise exceptions.CommandError(json.loads(resp.text)['faultstring']) + raise exceptions.CommandError(json.loads(resp.text)["faultstring"]) def _update(self, resource_id, os_esileap_api_version=None, **kwargs): """Update a resource based on a kwargs dictionary of attributes. @@ -104,30 +107,32 @@ def _update(self, resource_id, os_esileap_api_version=None, **kwargs): new = {} invalid = [] - for (key, value) in kwargs.items(): + for key, value in kwargs.items(): if key in self.resource_class._update_attributes: new[key] = value else: invalid.append(key) if invalid: - raise Exception('The attribute(s) "%(attrs)s" ' - 'are invalid; they are not ' - 'needed to update %(resource)s.' % - {'resource': self._resource_name, - 'attrs': '","'.join(invalid)}) + raise Exception( + 'The attribute(s) "%(attrs)s" ' + "are invalid; they are not " + "needed to update %(resource)s." + % {"resource": self._resource_name, "attrs": '","'.join(invalid)} + ) headers = {} if os_esileap_api_version is not None: - headers['headers'] = {'X-OpenStack-ESI-Leap-API-Version': - os_esileap_api_version} + headers["headers"] = { + "X-OpenStack-ESI-Leap-API-Version": os_esileap_api_version + } url = self._path(resource_id) - resp, body = self.api.json_request('PATCH', url, body=new, **headers) + resp, body = self.api.json_request("PATCH", url, body=new, **headers) if resp.status_code == 200: return self.resource_class(self, body) else: - raise exceptions.CommandError(json.loads(resp.text)['faultstring']) + raise exceptions.CommandError(json.loads(resp.text)["faultstring"]) def _list(self, url, obj_class=None, os_esileap_api_version=None): if obj_class is None: @@ -136,17 +141,18 @@ def _list(self, url, obj_class=None, os_esileap_api_version=None): kwargs = {} if os_esileap_api_version is not None: - kwargs['headers'] = {'X-OpenStack-ESI-Leap-API-Version': - os_esileap_api_version} + kwargs["headers"] = { + "X-OpenStack-ESI-Leap-API-Version": os_esileap_api_version + } - resp, body = self.api.json_request('GET', url, **kwargs) + resp, body = self.api.json_request("GET", url, **kwargs) if resp.status_code == 200: body = body[self._resource_name] return [obj_class(self, res) for res in body if res] else: - raise exceptions.CommandError(json.loads(resp.text)['faultstring']) + raise exceptions.CommandError(json.loads(resp.text)["faultstring"]) def _get(self, resource_id, obj_class=None, os_esileap_api_version=None): """Retrieve a resource. @@ -162,16 +168,17 @@ def _get(self, resource_id, obj_class=None, os_esileap_api_version=None): kwargs = {} if os_esileap_api_version is not None: - kwargs['headers'] = {'X-OpenStack-ESI-Leap-API-Version': - os_esileap_api_version} + kwargs["headers"] = { + "X-OpenStack-ESI-Leap-API-Version": os_esileap_api_version + } - resp, body = self.api.json_request('GET', url, **kwargs) + resp, body = self.api.json_request("GET", url, **kwargs) if resp.status_code == 200: return obj_class(self, body) else: - raise exceptions.CommandError(json.loads(resp.text)['faultstring']) + raise exceptions.CommandError(json.loads(resp.text)["faultstring"]) def _delete(self, resource_id, os_esileap_api_version=None): """Delete a resource. @@ -184,13 +191,14 @@ def _delete(self, resource_id, os_esileap_api_version=None): kwargs = {} if os_esileap_api_version is not None: - kwargs['headers'] = {'X-OpenStack-ESI-Leap-API-Version': - os_esileap_api_version} + kwargs["headers"] = { + "X-OpenStack-ESI-Leap-API-Version": os_esileap_api_version + } - resp, _ = self.api.json_request('DELETE', url, **kwargs) + resp, _ = self.api.json_request("DELETE", url, **kwargs) if resp.status_code != 200: - raise exceptions.CommandError(json.loads(resp.text)['faultstring']) + raise exceptions.CommandError(json.loads(resp.text)["faultstring"]) @six.add_metaclass(abc.ABCMeta) @@ -214,8 +222,7 @@ def detailed_fields(self): @property @abc.abstractmethod def _creation_attributes(self): - """A list of required creation attributes for a resource type. - """ + """A list of required creation attributes for a resource type.""" def __init__(self, manager, info): """Populate and bind to a manager. @@ -224,12 +231,13 @@ def __init__(self, manager, info): """ self.manager = manager - self._info = {k: v for (k, v) in info.items() if k - in self.detailed_fields.keys()} + self._info = { + k: v for (k, v) in info.items() if k in self.detailed_fields.keys() + } self._add_details(self._info) def _add_details(self, info): - for (k, v) in info.items(): + for k, v in info.items(): try: setattr(self, k, v) except AttributeError: diff --git a/esileapclient/common/utils.py b/esileapclient/common/utils.py index a92490b..21fe169 100644 --- a/esileapclient/common/utils.py +++ b/esileapclient/common/utils.py @@ -8,15 +8,15 @@ # Define constants for operator pattern and filter pattern OPS = { - '>=': operator.ge, - '<=': operator.le, - '>': operator.gt, - '<': operator.lt, - '=': operator.eq, + ">=": operator.ge, + "<=": operator.le, + ">": operator.gt, + "<": operator.lt, + "=": operator.eq, } -OPERATOR_PATTERN = '|'.join(re.escape(op) for op in OPS.keys()) -FILTER_PATTERN = re.compile(rf'([^><=]+)({OPERATOR_PATTERN})(.+)') +OPERATOR_PATTERN = "|".join(re.escape(op) for op in OPS.keys()) +FILTER_PATTERN = re.compile(rf"([^><=]+)({OPERATOR_PATTERN})(.+)") def convert_value(value_str): @@ -44,11 +44,11 @@ def parse_property_filter(filter_str): def node_matches_property_filters(node, property_filters): """Check if a node matches all property filters.""" - properties = node.get('resource_properties', node.get('properties', {})) + properties = node.get("resource_properties", node.get("properties", {})) for key, op, value in property_filters: if key not in properties: return False - node_value = convert_value(properties.get(key, '')) + node_value = convert_value(properties.get(key, "")) if not op(node_value, value): return False return True @@ -67,8 +67,7 @@ def filter_nodes_by_properties(nodes, properties): raise filtered_nodes = [ - node for node in nodes - if node_matches_property_filters(node, property_filters) + node for node in nodes if node_matches_property_filters(node, property_filters) ] return filtered_nodes diff --git a/esileapclient/osc/plugin.py b/esileapclient/osc/plugin.py index 81221cf..3d781c9 100644 --- a/esileapclient/osc/plugin.py +++ b/esileapclient/osc/plugin.py @@ -15,18 +15,18 @@ from openstackclient.i18n import _ -DEFAULT_API_VERSION = '1' +DEFAULT_API_VERSION = "1" # Required by the OSC plugin interface -API_NAME = 'lease' -API_VERSION_OPTION = 'os_esileap_api_version' +API_NAME = "lease" +API_VERSION_OPTION = "os_esileap_api_version" API_VERSIONS = { - '1': 'esi.connection.ESIConnection', + "1": "esi.connection.ESIConnection", } OS_LEASE_API_LATEST = True -LAST_KNOWN_API_VERSION = '1' -LATEST_VERSION = '1' +LAST_KNOWN_API_VERSION = "1" +LATEST_VERSION = "1" LOG = logging.getLogger(__name__) @@ -44,7 +44,6 @@ def make_client(instance): def build_option_parser(parser): - """Hook to add global options Called from openstackclient.shell.OpenStackShell.__init__() @@ -55,11 +54,10 @@ def build_option_parser(parser): initialized by OpenStackShell. """ parser.add_argument( - '--os-esileap-api-version', - metavar='', + "--os-esileap-api-version", + metavar="", default=DEFAULT_API_VERSION, - help=_('ESI-LEAP API version, default=%s') - % DEFAULT_API_VERSION, + help=_("ESI-LEAP API version, default=%s") % DEFAULT_API_VERSION, ) return parser diff --git a/esileapclient/osc/v1/console_auth_token.py b/esileapclient/osc/v1/console_auth_token.py index 2a7f567..38eba57 100644 --- a/esileapclient/osc/v1/console_auth_token.py +++ b/esileapclient/osc/v1/console_auth_token.py @@ -14,8 +14,9 @@ from osc_lib.command import command -from esileapclient.v1.console_auth_token import ConsoleAuthToken \ - as CONSOLE_AUTH_TOKEN_RESOURCE +from esileapclient.v1.console_auth_token import ( + ConsoleAuthToken as CONSOLE_AUTH_TOKEN_RESOURCE, +) LOG = logging.getLogger(__name__) @@ -30,15 +31,15 @@ def get_parser(self, prog_name): parser = super(CreateConsoleAuthToken, self).get_parser(prog_name) parser.add_argument( - "node_uuid_or_name", - metavar="", - help="Node UUID or name") + "node_uuid_or_name", metavar="", help="Node UUID or name" + ) parser.add_argument( - '--token-ttl', - dest='token_ttl', + "--token-ttl", + dest="token_ttl", metavar="", required=False, - help="TTL of token.") + help="TTL of token.", + ) return parser @@ -47,13 +48,17 @@ def take_action(self, parsed_args): field_list = CONSOLE_AUTH_TOKEN_RESOURCE._creation_attributes - fields = dict((k, v) for (k, v) in vars(parsed_args).items() - if k in field_list and v is not None) + fields = dict( + (k, v) + for (k, v) in vars(parsed_args).items() + if k in field_list and v is not None + ) cat = client.create_console_auth_token(**fields) - data = dict([(f, getattr(cat, f, '')) for f in - CONSOLE_AUTH_TOKEN_RESOURCE.fields]) + data = dict( + [(f, getattr(cat, f, "")) for f in CONSOLE_AUTH_TOKEN_RESOURCE.fields] + ) return self.dict2columns(data) @@ -66,14 +71,14 @@ class DeleteConsoleAuthToken(command.Command): def get_parser(self, prog_name): parser = super(DeleteConsoleAuthToken, self).get_parser(prog_name) parser.add_argument( - "node_uuid_or_name", - metavar="", - help="Node UUID or name") + "node_uuid_or_name", metavar="", help="Node UUID or name" + ) return parser def take_action(self, parsed_args): client = self.app.client_manager.lease client.delete_console_auth_token(parsed_args.node_uuid_or_name) - print('Disabled console auth tokens for node %s' % - parsed_args.node_uuid_or_name) + print( + "Disabled console auth tokens for node %s" % parsed_args.node_uuid_or_name + ) diff --git a/esileapclient/osc/v1/event.py b/esileapclient/osc/v1/event.py index a5de74c..75d7b53 100644 --- a/esileapclient/osc/v1/event.py +++ b/esileapclient/osc/v1/event.py @@ -29,35 +29,41 @@ def get_parser(self, prog_name): parser = super(ListEvent, self).get_parser(prog_name) parser.add_argument( - '--project', - dest='project_id', + "--project", + dest="project_id", required=False, - help="Show all events associated with given project ID or name.") + help="Show all events associated with given project ID or name.", + ) parser.add_argument( - '--last-event-id', - dest='last_event_id', + "--last-event-id", + dest="last_event_id", required=False, - help="Show events after this event ID.") + help="Show events after this event ID.", + ) parser.add_argument( - '--last-notification-time', - dest='last_event_time', + "--last-notification-time", + dest="last_event_time", required=False, - help="Show events after this notification time.") + help="Show events after this notification time.", + ) parser.add_argument( - '--event-type', - dest='event_type', + "--event-type", + dest="event_type", required=False, - help="Show events matching this event type.") + help="Show events matching this event type.", + ) parser.add_argument( - '--resource-type', - dest='resource_type', + "--resource-type", + dest="resource_type", required=False, - help="Show events matching this resource type.") + help="Show events matching this resource type.", + ) parser.add_argument( - '--resource-uuid', - dest='resource_uuid', + "--resource-uuid", + dest="resource_uuid", required=False, - help="Show events matching this resource ID or name.") + help="Show events matching this resource ID or name.", + ) return parser @@ -65,16 +71,15 @@ def take_action(self, parsed_args): client = self.app.client_manager.lease filters = { - 'lessee_or_owner_id': parsed_args.project_id, - 'last_event_id': parsed_args.last_event_id, - 'last_event_time': parsed_args.last_event_time, - 'event_type': parsed_args.event_type, - 'resource_type': parsed_args.resource_type, - 'resource_uuid': parsed_args.resource_uuid, + "lessee_or_owner_id": parsed_args.project_id, + "last_event_id": parsed_args.last_event_id, + "last_event_time": parsed_args.last_event_time, + "event_type": parsed_args.event_type, + "resource_type": parsed_args.resource_type, + "resource_uuid": parsed_args.resource_uuid, } data = list(client.events(**filters)) columns = EVENT_RESOURCE.fields.keys() labels = EVENT_RESOURCE.fields.values() - return (labels, - (oscutils.get_item_properties(s, columns) for s in data)) + return (labels, (oscutils.get_item_properties(s, columns) for s in data)) diff --git a/esileapclient/osc/v1/lease.py b/esileapclient/osc/v1/lease.py index 58c165b..bc5089e 100644 --- a/esileapclient/osc/v1/lease.py +++ b/esileapclient/osc/v1/lease.py @@ -31,60 +31,68 @@ def get_parser(self, prog_name): parser = super(CreateLease, self).get_parser(prog_name) parser.add_argument( - "resource_uuid", - metavar="", - help="Resource UUID or name") + "resource_uuid", metavar="", help="Resource UUID or name" + ) parser.add_argument( - 'project_id', + "project_id", metavar="", - help="Project ID or name leasing the resource.") + help="Project ID or name leasing the resource.", + ) parser.add_argument( - '--end-time', - dest='end_time', + "--end-time", + dest="end_time", required=False, - help="Time when the lease will expire.") + help="Time when the lease will expire.", + ) parser.add_argument( - '--name', - dest='name', + "--name", + dest="name", required=False, - help="Name of the lease being created. ") + help="Name of the lease being created. ", + ) parser.add_argument( - '--properties', - dest='properties', + "--properties", + dest="properties", required=False, help="Record arbitrary key/value resource property " - "information. Pass in as a json object.") + "information. Pass in as a json object.", + ) parser.add_argument( - '--resource-type', - dest='resource_type', + "--resource-type", + dest="resource_type", required=False, - help="Use this resource type instead of the default.") + help="Use this resource type instead of the default.", + ) parser.add_argument( - '--start-time', - dest='start_time', + "--start-time", + dest="start_time", required=False, - help="Time when the resource will become usable.") + help="Time when the resource will become usable.", + ) parser.add_argument( - '--purpose', - dest='purpose', + "--purpose", + dest="purpose", required=False, - help="Specify the purpose for leasing the node") + help="Specify the purpose for leasing the node", + ) return parser def take_action(self, parsed_args): client = self.app.client_manager.lease field_list = LEASE_RESOURCE._creation_attributes - fields = dict((k, v) for (k, v) in vars(parsed_args).items() - if k in field_list and v is not None) + fields = dict( + (k, v) + for (k, v) in vars(parsed_args).items() + if k in field_list and v is not None + ) - if 'properties' in fields: - fields['properties'] = json.loads(fields['properties']) + if "properties" in fields: + fields["properties"] = json.loads(fields["properties"]) lease = client.create_lease(**fields) - data = dict([(f, getattr(lease, f, '')) for f in - LEASE_RESOURCE.fields]) + data = dict([(f, getattr(lease, f, "")) for f in LEASE_RESOURCE.fields]) return self.dict2columns(data) @@ -97,27 +105,27 @@ class UpdateLease(command.ShowOne): def get_parser(self, prog_name): parser = super(UpdateLease, self).get_parser(prog_name) + parser.add_argument("uuid", metavar="", help="UUID of the lease") parser.add_argument( - "uuid", - metavar="", - help="UUID of the lease") - parser.add_argument( - '--end-time', - dest='end_time', + "--end-time", + dest="end_time", required=False, - help="Time when the lease will expire.") + help="Time when the lease will expire.", + ) return parser def take_action(self, parsed_args): client = self.app.client_manager.lease field_list = LEASE_RESOURCE._update_attributes - fields = dict((k, v) for (k, v) in vars(parsed_args).items() - if k in field_list and v is not None) + fields = dict( + (k, v) + for (k, v) in vars(parsed_args).items() + if k in field_list and v is not None + ) lease = client.update_lease(parsed_args.uuid, **fields) - data = dict([(f, lease.get(f, '')) for f in - LEASE_RESOURCE.fields]) + data = dict([(f, lease.get(f, "")) for f in LEASE_RESOURCE.fields]) return self.dict2columns(data) @@ -130,105 +138,117 @@ def get_parser(self, prog_name): parser = super(ListLease, self).get_parser(prog_name) parser.add_argument( - '--long', + "--long", default=False, help="Show detailed information about the leases.", - action='store_true') + action="store_true", + ) parser.add_argument( - '--all', + "--all", default=False, help="Show all leases in the database. For admin use only.", - action='store_true') + action="store_true", + ) parser.add_argument( - '--status', - dest='status', + "--status", + dest="status", required=False, help="Show all leases with the given status. " - "Use --status 'any' to show leases with any status " - "(by default, leases with 'created', 'active', 'error', " - "'wait_cancel', 'wait_expire', and 'wait_fulfill' statuses " - "are shown).") + "Use --status 'any' to show leases with any status " + "(by default, leases with 'created', 'active', 'error', " + "'wait_cancel', 'wait_expire', and 'wait_fulfill' statuses " + "are shown).", + ) parser.add_argument( - '--offer-uuid', - dest='offer_uuid', + "--offer-uuid", + dest="offer_uuid", required=False, - help="Show all leases with given offer_uuid.") + help="Show all leases with given offer_uuid.", + ) parser.add_argument( - '--time-range', - dest='time_range', + "--time-range", + dest="time_range", nargs=2, required=False, help="Show all leases with start and end times " - "which intersect with the given range." - "Must pass in two valid datetime strings." - "Example: --time-range 2020-06-30T00:00:00" - " 2021-06-30T00:00:00") + "which intersect with the given range." + "Must pass in two valid datetime strings." + "Example: --time-range 2020-06-30T00:00:00" + " 2021-06-30T00:00:00", + ) parser.add_argument( - '--project', - dest='project_id', + "--project", + dest="project_id", required=False, - help="Show all leases owned by given project ID or name.") + help="Show all leases owned by given project ID or name.", + ) parser.add_argument( - '--owner', - dest='owner_id', + "--owner", + dest="owner_id", required=False, help="Show all leases relevant to an offer owner " - "by the owner's project ID or name.") + "by the owner's project ID or name.", + ) parser.add_argument( - '--resource-type', - dest='resource_type', + "--resource-type", + dest="resource_type", required=False, - help="Show all leases with given resource-type.") + help="Show all leases with given resource-type.", + ) parser.add_argument( - '--resource-uuid', - dest='resource_uuid', + "--resource-uuid", + dest="resource_uuid", required=False, - help="Show all leases with given resource-uuid.") + help="Show all leases with given resource-uuid.", + ) parser.add_argument( - '--resource-class', - dest='resource_class', + "--resource-class", + dest="resource_class", required=False, - help="Show all leases with given resource-class.") + help="Show all leases with given resource-class.", + ) parser.add_argument( - '--purpose', - dest='purpose', + "--purpose", + dest="purpose", required=False, - help="Show the purpose of leasing the node") + help="Show the purpose of leasing the node", + ) parser.add_argument( - '--property', - dest='properties', + "--property", + dest="properties", required=False, - action='append', + action="append", help="Filter offers by properties. Format: 'key>=value'. " - "Can be specified multiple times. " - f"Supported operators are: {', '.join(utils.OPS.keys())}", - metavar='"key>=value"') + "Can be specified multiple times. " + f"Supported operators are: {', '.join(utils.OPS.keys())}", + metavar='"key>=value"', + ) return parser def take_action(self, parsed_args): - client = self.app.client_manager.lease filters = { - 'status': parsed_args.status, - 'offer_uuid': parsed_args.offer_uuid, - 'start_time': str(parsed_args.time_range[0]) if - parsed_args.time_range else None, - 'end_time': str(parsed_args.time_range[1]) if - parsed_args.time_range else None, - 'project_id': parsed_args.project_id, - 'owner_id': parsed_args.owner_id, - 'view': 'all' if parsed_args.all else None, - 'resource_type': parsed_args.resource_type, - 'resource_uuid': parsed_args.resource_uuid, - 'resource_class': parsed_args.resource_class, - 'purpose': parsed_args.purpose + "status": parsed_args.status, + "offer_uuid": parsed_args.offer_uuid, + "start_time": str(parsed_args.time_range[0]) + if parsed_args.time_range + else None, + "end_time": str(parsed_args.time_range[1]) + if parsed_args.time_range + else None, + "project_id": parsed_args.project_id, + "owner_id": parsed_args.owner_id, + "view": "all" if parsed_args.all else None, + "resource_type": parsed_args.resource_type, + "resource_uuid": parsed_args.resource_uuid, + "resource_class": parsed_args.resource_class, + "purpose": parsed_args.purpose, } data = list(client.leases(**filters)) - filtered_leases = utils.filter_nodes_by_properties( - data, parsed_args.properties) + filtered_leases = utils.filter_nodes_by_properties(data, parsed_args.properties) if parsed_args.long: columns = LEASE_RESOURCE.long_fields.keys() @@ -237,9 +257,10 @@ def take_action(self, parsed_args): columns = LEASE_RESOURCE.fields.keys() labels = LEASE_RESOURCE.fields.values() - return (labels, - (oscutils.get_item_properties(s, columns) - for s in filtered_leases)) + return ( + labels, + (oscutils.get_item_properties(s, columns) for s in filtered_leases), + ) class ShowLease(command.ShowOne): @@ -249,24 +270,17 @@ class ShowLease(command.ShowOne): def get_parser(self, prog_name): parser = super(ShowLease, self).get_parser(prog_name) - parser.add_argument( - "uuid", - metavar="", - help="UUID of the lease") + parser.add_argument("uuid", metavar="", help="UUID of the lease") return parser def take_action(self, parsed_args): - client = self.app.client_manager.lease lease = client.get_lease(parsed_args.uuid) - lease_info = {k: getattr(lease, k, '') for k in - LEASE_RESOURCE.detailed_fields} + lease_info = {k: getattr(lease, k, "") for k in LEASE_RESOURCE.detailed_fields} - lease_info['resource_properties'] = getattr( - lease, 'resource_properties', {} - ) + lease_info["resource_properties"] = getattr(lease, "resource_properties", {}) return zip(*sorted(lease_info.items())) @@ -278,15 +292,11 @@ class DeleteLease(command.Command): def get_parser(self, prog_name): parser = super(DeleteLease, self).get_parser(prog_name) - parser.add_argument( - "uuid", - metavar="", - help="Lease to delete (UUID)") + parser.add_argument("uuid", metavar="", help="Lease to delete (UUID)") return parser def take_action(self, parsed_args): - client = self.app.client_manager.lease client.delete_lease(parsed_args.uuid) - print('Deleted lease %s' % parsed_args.uuid) + print("Deleted lease %s" % parsed_args.uuid) diff --git a/esileapclient/osc/v1/mdc/mdc_lease.py b/esileapclient/osc/v1/mdc/mdc_lease.py index b37312c..71fdd52 100644 --- a/esileapclient/osc/v1/mdc/mdc_lease.py +++ b/esileapclient/osc/v1/mdc/mdc_lease.py @@ -31,61 +31,68 @@ def get_parser(self, prog_name): parser = super(MDCListLease, self).get_parser(prog_name) parser.add_argument( - '--clouds', - dest='clouds', - metavar='', + "--clouds", + dest="clouds", + metavar="", nargs="+", - help="Specify the cloud to use from clouds.yaml." + help="Specify the cloud to use from clouds.yaml.", ) parser.add_argument( - '--status', - dest='status', + "--status", + dest="status", required=False, - help="Show all leases with given status.") + help="Show all leases with given status.", + ) parser.add_argument( - '--time-range', - dest='time_range', + "--time-range", + dest="time_range", nargs=2, required=False, help="Show all leases with start and end times " - "which begin and end in the given range." - "Must pass in two valid datetime strings." - "Example: --time-range 2020-06-30T00:00:00" - "2021-06-30T00:00:00") + "which begin and end in the given range." + "Must pass in two valid datetime strings." + "Example: --time-range 2020-06-30T00:00:00" + "2021-06-30T00:00:00", + ) parser.add_argument( - '--resource-type', - dest='resource_type', + "--resource-type", + dest="resource_type", required=False, - help="Show all leases with given resource-type.") + help="Show all leases with given resource-type.", + ) parser.add_argument( - '--resource-class', - dest='resource_class', + "--resource-class", + dest="resource_class", required=False, - help="Show all leases with given resource-class.") + help="Show all leases with given resource-class.", + ) parser.add_argument( - '--purpose', - dest='purpose', + "--purpose", + dest="purpose", required=False, - help="Show all the leases with given purpose") + help="Show all the leases with given purpose", + ) return parser def take_action(self, parsed_args): data = [] - cloud_regions = openstack.config.loader.OpenStackConfig().\ - get_all_clouds() + cloud_regions = openstack.config.loader.OpenStackConfig().get_all_clouds() if parsed_args.clouds: - cloud_regions = filter(lambda c: c.name in parsed_args.clouds, - cloud_regions) + cloud_regions = filter( + lambda c: c.name in parsed_args.clouds, cloud_regions + ) filters = { - 'status': parsed_args.status, - 'start_time': str(parsed_args.time_range[0]) if - parsed_args.time_range else None, - 'end_time': str(parsed_args.time_range[1]) if - parsed_args.time_range else None, - 'resource_type': parsed_args.resource_type, - 'resource_class': parsed_args.resource_class, - 'purpose': parsed_args.purpose, + "status": parsed_args.status, + "start_time": str(parsed_args.time_range[0]) + if parsed_args.time_range + else None, + "end_time": str(parsed_args.time_range[1]) + if parsed_args.time_range + else None, + "resource_type": parsed_args.resource_type, + "resource_class": parsed_args.resource_class, + "purpose": parsed_args.purpose, } for c in cloud_regions: @@ -94,11 +101,10 @@ def take_action(self, parsed_args): leases = list(client.leases(**filters)) for lease in leases: lease.cloud = c.name - lease.region = c.config['region_name'] + lease.region = c.config["region_name"] data += [lease] - columns = ['cloud', 'region'] + list(LEASE_RESOURCE.fields.keys()) - labels = ['Cloud', 'Region'] + list(LEASE_RESOURCE.fields.values()) + columns = ["cloud", "region"] + list(LEASE_RESOURCE.fields.keys()) + labels = ["Cloud", "Region"] + list(LEASE_RESOURCE.fields.values()) - return (labels, - (oscutils.get_item_properties(s, columns) for s in data)) + return (labels, (oscutils.get_item_properties(s, columns) for s in data)) diff --git a/esileapclient/osc/v1/mdc/mdc_offer.py b/esileapclient/osc/v1/mdc/mdc_offer.py index 6c0b84b..a64721d 100644 --- a/esileapclient/osc/v1/mdc/mdc_offer.py +++ b/esileapclient/osc/v1/mdc/mdc_offer.py @@ -34,72 +34,80 @@ def get_parser(self, prog_name): parser = super(MDCListOffer, self).get_parser(prog_name) parser.add_argument( - '--clouds', - dest='clouds', - metavar='', + "--clouds", + dest="clouds", + metavar="", nargs="+", - help="Specify the cloud to use from clouds.yaml." + help="Specify the cloud to use from clouds.yaml.", ) parser.add_argument( - '--status', - dest='status', + "--status", + dest="status", required=False, - help="Show all offers with given status.") + help="Show all offers with given status.", + ) parser.add_argument( - '--time-range', - dest='time_range', + "--time-range", + dest="time_range", nargs=2, required=False, help="Show all offers with start and end times " - "which begin and end in the given range." - "Must pass in two valid datetime strings." - "Example: --time-range 2020-06-30T00:00:00" - "2021-06-30T00:00:00") + "which begin and end in the given range." + "Must pass in two valid datetime strings." + "Example: --time-range 2020-06-30T00:00:00" + "2021-06-30T00:00:00", + ) parser.add_argument( - '--availability-range', - dest='availability_range', + "--availability-range", + dest="availability_range", nargs=2, required=False, help="Show all offers with availabilities " - "which will have no conflicting leases within " - "the given range. Must pass in two valid datetime " - "strings." - "Example: --availability-range 2020-06-30T00:00:00" - "2021-06-30T00:00:00") + "which will have no conflicting leases within " + "the given range. Must pass in two valid datetime " + "strings." + "Example: --availability-range 2020-06-30T00:00:00" + "2021-06-30T00:00:00", + ) parser.add_argument( - '--resource-type', - dest='resource_type', + "--resource-type", + dest="resource_type", required=False, - help="Show all offers with given resource-type.") + help="Show all offers with given resource-type.", + ) parser.add_argument( - '--resource-class', - dest='resource_class', + "--resource-class", + dest="resource_class", required=False, - help="Show all leases with given resource-class.") + help="Show all leases with given resource-class.", + ) return parser def take_action(self, parsed_args): data = [] - cloud_regions = openstack.config.loader.OpenStackConfig().\ - get_all_clouds() + cloud_regions = openstack.config.loader.OpenStackConfig().get_all_clouds() if parsed_args.clouds: - cloud_regions = filter(lambda c: c.name in parsed_args.clouds, - cloud_regions) + cloud_regions = filter( + lambda c: c.name in parsed_args.clouds, cloud_regions + ) filters = { - 'status': parsed_args.status, - 'start_time': str(parsed_args.time_range[0]) if - parsed_args.time_range else None, - 'end_time': str(parsed_args.time_range[1]) if - parsed_args.time_range else None, - 'available_start_time': str( - parsed_args.availability_range[0]) if - parsed_args.availability_range else None, - 'available_end_time': str(parsed_args.availability_range[1]) if - parsed_args.availability_range else None, - 'resource_type': parsed_args.resource_type, - 'resource_class': parsed_args.resource_class, + "status": parsed_args.status, + "start_time": str(parsed_args.time_range[0]) + if parsed_args.time_range + else None, + "end_time": str(parsed_args.time_range[1]) + if parsed_args.time_range + else None, + "available_start_time": str(parsed_args.availability_range[0]) + if parsed_args.availability_range + else None, + "available_end_time": str(parsed_args.availability_range[1]) + if parsed_args.availability_range + else None, + "resource_type": parsed_args.resource_type, + "resource_class": parsed_args.resource_class, } for c in cloud_regions: @@ -107,14 +115,13 @@ def take_action(self, parsed_args): offers = list(client.offers(**filters)) for offer in offers: offer.cloud = c.name - offer.region = c.config['region_name'] + offer.region = c.config["region_name"] data += [offer] - columns = ['cloud', 'region'] + list(OFFER_RESOURCE.fields.keys()) - labels = ['Cloud', 'Region'] + list(OFFER_RESOURCE.fields.values()) + columns = ["cloud", "region"] + list(OFFER_RESOURCE.fields.keys()) + labels = ["Cloud", "Region"] + list(OFFER_RESOURCE.fields.values()) - return (labels, - (oscutils.get_item_properties(s, columns) for s in data)) + return (labels, (oscutils.get_item_properties(s, columns) for s in data)) class MDCClaimOffer(command.Lister): @@ -127,52 +134,53 @@ def get_parser(self, prog_name): parser = super(MDCClaimOffer, self).get_parser(prog_name) parser.add_argument( - "node_count", - metavar="", - help="Number of nodes to claim") + "node_count", metavar="", help="Number of nodes to claim" + ) parser.add_argument( - 'start_time', - metavar='', - help="Time when the lease will start.") + "start_time", metavar="", help="Time when the lease will start." + ) parser.add_argument( - 'end_time', - metavar='', - help="Time when the lease will expire.") + "end_time", metavar="", help="Time when the lease will expire." + ) parser.add_argument( - '--clouds', - dest='clouds', - metavar='', + "--clouds", + dest="clouds", + metavar="", nargs="+", - help="Specify the cloud to use from clouds.yaml." + help="Specify the cloud to use from clouds.yaml.", ) parser.add_argument( - '--resource-type', - dest='resource_type', + "--resource-type", + dest="resource_type", required=False, - help="Specify offers' resource-type.") + help="Specify offers' resource-type.", + ) parser.add_argument( - '--resource-class', - dest='resource_class', + "--resource-class", + dest="resource_class", required=False, - help="Specify offers' resource-class.") + help="Specify offers' resource-class.", + ) return parser def take_action(self, parsed_args): - cloud_regions = openstack.config.loader.OpenStackConfig().\ - get_all_clouds() + cloud_regions = openstack.config.loader.OpenStackConfig().get_all_clouds() if parsed_args.clouds: - cloud_regions = filter(lambda c: c.name in parsed_args.clouds, - cloud_regions) + cloud_regions = filter( + lambda c: c.name in parsed_args.clouds, cloud_regions + ) node_count = int(parsed_args.node_count) filters = { - 'status': 'available', - 'available_start_time': str(parsed_args.start_time) if - parsed_args.start_time else None, - 'available_end_time': str(parsed_args.end_time) if - parsed_args.end_time else None, - 'resource_type': parsed_args.resource_type, - 'resource_class': parsed_args.resource_class, + "status": "available", + "available_start_time": str(parsed_args.start_time) + if parsed_args.start_time + else None, + "available_end_time": str(parsed_args.end_time) + if parsed_args.end_time + else None, + "resource_type": parsed_args.resource_type, + "resource_class": parsed_args.resource_class, } available_offers = [] @@ -182,12 +190,11 @@ def take_action(self, parsed_args): for offer in offers: offer.cloud_region = c offer.cloud = c.name - offer.region = c.config['region_name'] + offer.region = c.config["region_name"] available_offers += [offer] if node_count > len(available_offers): - raise exceptions.CommandError( - "ERROR: Not enough offers found") + raise exceptions.CommandError("ERROR: Not enough offers found") offers_to_claim = random.sample(available_offers, node_count) leases = [] @@ -196,19 +203,20 @@ def take_action(self, parsed_args): try: lease = client.claim_offer( offer.uuid, - **{'start_time': parsed_args.start_time, - 'end_time': parsed_args.end_time}) + **{ + "start_time": parsed_args.start_time, + "end_time": parsed_args.end_time, + }, + ) lease.cloud = offer.cloud lease.region = offer.region leases += [lease] except exceptions.CommandError: # offer is no longer available during this time range; continue # but let user know - print("Offer %s is no longer available; continuing" - % offer.uuid) + print("Offer %s is no longer available; continuing" % offer.uuid) - columns = ['cloud', 'region'] + list(LEASE_RESOURCE.fields.keys()) - labels = ['Cloud', 'Region'] + list(LEASE_RESOURCE.fields.values()) + columns = ["cloud", "region"] + list(LEASE_RESOURCE.fields.keys()) + labels = ["Cloud", "Region"] + list(LEASE_RESOURCE.fields.values()) - return (labels, - (oscutils.get_item_properties(s, columns) for s in leases)) + return (labels, (oscutils.get_item_properties(s, columns) for s in leases)) diff --git a/esileapclient/osc/v1/node.py b/esileapclient/osc/v1/node.py index 41d497a..e3daa09 100644 --- a/esileapclient/osc/v1/node.py +++ b/esileapclient/osc/v1/node.py @@ -30,46 +30,44 @@ def get_parser(self, prog_name): parser = super(ListNode, self).get_parser(prog_name) parser.add_argument( - '--long', + "--long", default=False, help="Show detailed information about the nodes.", - action='store_true') + action="store_true", + ) parser.add_argument( - '--resource-class', - dest='resource_class', + "--resource-class", + dest="resource_class", required=False, - help="Filter nodes by resource class.") + help="Filter nodes by resource class.", + ) parser.add_argument( - '--owner', - dest='owner', - required=False, - help="Filter nodes by owner.") + "--owner", dest="owner", required=False, help="Filter nodes by owner." + ) parser.add_argument( - '--lessee', - dest='lessee', - required=False, - help="Filter nodes by lessee.") + "--lessee", dest="lessee", required=False, help="Filter nodes by lessee." + ) parser.add_argument( - '--property', - dest='properties', + "--property", + dest="properties", required=False, - action='append', + action="append", help="Filter offers by properties. Format: 'key>=value'. " - "Can be specified multiple times. " - f"Supported operators are: {', '.join(utils.OPS.keys())}", - metavar='"key>=value"') + "Can be specified multiple times. " + f"Supported operators are: {', '.join(utils.OPS.keys())}", + metavar='"key>=value"', + ) return parser def take_action(self, parsed_args): - client = self.app.client_manager.lease # Initial filters dictionary filters = { - 'resource_class': parsed_args.resource_class, - 'owner': parsed_args.owner, - 'lessee': parsed_args.lessee + "resource_class": parsed_args.resource_class, + "owner": parsed_args.owner, + "lessee": parsed_args.lessee, } # Retrieve all nodes with initial filters @@ -87,6 +85,7 @@ def take_action(self, parsed_args): columns = NODE_RESOURCE.fields.keys() labels = NODE_RESOURCE.fields.values() - return (labels, - (oscutils.get_item_properties(s, columns) - for s in filtered_nodes)) + return ( + labels, + (oscutils.get_item_properties(s, columns) for s in filtered_nodes), + ) diff --git a/esileapclient/osc/v1/offer.py b/esileapclient/osc/v1/offer.py index fea16e6..714a0b9 100644 --- a/esileapclient/osc/v1/offer.py +++ b/esileapclient/osc/v1/offer.py @@ -21,7 +21,7 @@ from esileapclient.v1.offer import Offer as OFFER_RESOURCE from esileapclient.common import utils -END_OF_TIME = '9999-12-31T00:00:00' +END_OF_TIME = "9999-12-31T00:00:00" LOG = logging.getLogger(__name__) @@ -34,60 +34,65 @@ def get_parser(self, prog_name): parser = super(CreateOffer, self).get_parser(prog_name) parser.add_argument( - "resource_uuid", - metavar="", - help="Resource UUID") + "resource_uuid", metavar="", help="Resource UUID" + ) parser.add_argument( - '--end-time', - dest='end_time', + "--end-time", + dest="end_time", required=False, - help="Time when the offer will expire and no longer be " - "'available'.") + help="Time when the offer will expire and no longer be 'available'.", + ) parser.add_argument( - '--lessee', - dest='lessee_id', + "--lessee", + dest="lessee_id", required=False, - help="Project subtree to which this offer will be limited.") + help="Project subtree to which this offer will be limited.", + ) parser.add_argument( - '--name', - dest='name', + "--name", + dest="name", required=False, - help="Name of the offer being created. ") + help="Name of the offer being created. ", + ) parser.add_argument( - '--properties', - dest='properties', + "--properties", + dest="properties", required=False, help="Record arbitrary key/value resource property " - "information. Pass in as a json object.") + "information. Pass in as a json object.", + ) parser.add_argument( - '--resource-type', - dest='resource_type', + "--resource-type", + dest="resource_type", required=False, - help="Use this resource type instead of the default.") + help="Use this resource type instead of the default.", + ) parser.add_argument( - '--start-time', - dest='start_time', + "--start-time", + dest="start_time", required=False, - help="Time when the offer will be made 'available'.") + help="Time when the offer will be made 'available'.", + ) return parser def take_action(self, parsed_args): - client = self.app.client_manager.lease field_list = OFFER_RESOURCE._creation_attributes - fields = dict((k, v) for (k, v) in vars(parsed_args).items() - if k in field_list and v is not None) + fields = dict( + (k, v) + for (k, v) in vars(parsed_args).items() + if k in field_list and v is not None + ) - if 'properties' in fields: - fields['properties'] = json.loads(fields['properties']) + if "properties" in fields: + fields["properties"] = json.loads(fields["properties"]) offer = client.create_offer(**fields) - data = dict([(f, getattr(offer, f, '')) for f in - OFFER_RESOURCE.fields]) + data = dict([(f, getattr(offer, f, "")) for f in OFFER_RESOURCE.fields]) return self.dict2columns(data) @@ -101,108 +106,113 @@ def get_parser(self, prog_name): parser = super(ListOffer, self).get_parser(prog_name) parser.add_argument( - '--long', + "--long", default=False, help="Show detailed information about the offers.", - action='store_true') + action="store_true", + ) parser.add_argument( - '--status', - dest='status', + "--status", + dest="status", required=False, help="Show all offers with the given status. " - "Use --status 'any' to show offers with any status " - "(by default, offers with 'available' and 'error' statuses" - "are shown).") + "Use --status 'any' to show offers with any status " + "(by default, offers with 'available' and 'error' statuses" + "are shown).", + ) parser.add_argument( - '--time-range', - dest='time_range', + "--time-range", + dest="time_range", nargs=2, required=False, help="Show all offers with start and end times " - "which begin and end in the given range." - "Must pass in two valid datetime strings." - "Example: --time-range 2020-06-30T00:00:00" - " 2021-06-30T00:00:00") + "which begin and end in the given range." + "Must pass in two valid datetime strings." + "Example: --time-range 2020-06-30T00:00:00" + " 2021-06-30T00:00:00", + ) parser.add_argument( - '--availability-range', - dest='availability_range', + "--availability-range", + dest="availability_range", nargs=2, required=False, help="Show all offers with availabilities " - "which will have no conflicting leases within " - "the given range. Must pass in two valid datetime " - "strings." - "Example: --availability-range 2020-06-30T00:00:00" - " 2021-06-30T00:00:00") + "which will have no conflicting leases within " + "the given range. Must pass in two valid datetime " + "strings." + "Example: --availability-range 2020-06-30T00:00:00" + " 2021-06-30T00:00:00", + ) parser.add_argument( - '--project', - dest='project_id', + "--project", + dest="project_id", required=False, - help="Show all offers owned by given project ID or name.") + help="Show all offers owned by given project ID or name.", + ) parser.add_argument( - '--resource-type', - dest='resource_type', + "--resource-type", + dest="resource_type", required=False, - help="Show all offers with given resource-type.") + help="Show all offers with given resource-type.", + ) parser.add_argument( - '--resource-uuid', - dest='resource_uuid', + "--resource-uuid", + dest="resource_uuid", required=False, - help="Show all offers with given resource-uuid.") + help="Show all offers with given resource-uuid.", + ) parser.add_argument( - '--resource-class', - dest='resource_class', + "--resource-class", + dest="resource_class", required=False, - help="Show all leases with given resource-class.") + help="Show all leases with given resource-class.", + ) parser.add_argument( - '--property', - dest='properties', + "--property", + dest="properties", required=False, - action='append', + action="append", help="Filter offers by properties. Format: 'key>=value'. " - "Can be specified multiple times. " - f"Supported operators are: {', '.join(utils.OPS.keys())}", - metavar='"key>=value"') + "Can be specified multiple times. " + f"Supported operators are: {', '.join(utils.OPS.keys())}", + metavar='"key>=value"', + ) parser.add_argument( - '--now', - action='store_const', - dest='availability_range', - const=[ - datetime.datetime.now().isoformat(timespec='seconds'), - END_OF_TIME - ], - help='Only list offers that have availability right now', + "--now", + action="store_const", + dest="availability_range", + const=[datetime.datetime.now().isoformat(timespec="seconds"), END_OF_TIME], + help="Only list offers that have availability right now", ) return parser def take_action(self, parsed_args): - client = self.app.client_manager.lease filters = { - 'status': parsed_args.status, - - 'start_time': str(parsed_args.time_range[0]) if - parsed_args.time_range else None, - 'end_time': str(parsed_args.time_range[1]) if - parsed_args.time_range else None, - - 'available_start_time': str(parsed_args.availability_range[0]) if - parsed_args.availability_range else None, - 'available_end_time': str(parsed_args.availability_range[1]) if - parsed_args.availability_range else None, - - 'project_id': parsed_args.project_id, - 'resource_type': parsed_args.resource_type, - 'resource_uuid': parsed_args.resource_uuid, - 'resource_class': parsed_args.resource_class + "status": parsed_args.status, + "start_time": str(parsed_args.time_range[0]) + if parsed_args.time_range + else None, + "end_time": str(parsed_args.time_range[1]) + if parsed_args.time_range + else None, + "available_start_time": str(parsed_args.availability_range[0]) + if parsed_args.availability_range + else None, + "available_end_time": str(parsed_args.availability_range[1]) + if parsed_args.availability_range + else None, + "project_id": parsed_args.project_id, + "resource_type": parsed_args.resource_type, + "resource_uuid": parsed_args.resource_uuid, + "resource_class": parsed_args.resource_class, } data = list(client.offers(**filters)) - filtered_leases = utils.filter_nodes_by_properties( - data, parsed_args.properties) + filtered_leases = utils.filter_nodes_by_properties(data, parsed_args.properties) if parsed_args.long: columns = OFFER_RESOURCE.long_fields.keys() @@ -211,9 +221,10 @@ def take_action(self, parsed_args): columns = OFFER_RESOURCE.fields.keys() labels = OFFER_RESOURCE.fields.values() - return (labels, - (oscutils.get_item_properties(s, columns) - for s in filtered_leases)) + return ( + labels, + (oscutils.get_item_properties(s, columns) for s in filtered_leases), + ) class ShowOffer(command.ShowOne): @@ -223,25 +234,18 @@ class ShowOffer(command.ShowOne): def get_parser(self, prog_name): parser = super(ShowOffer, self).get_parser(prog_name) - parser.add_argument( - "uuid", - metavar="", - help="UUID of the offer") + parser.add_argument("uuid", metavar="", help="UUID of the offer") return parser def take_action(self, parsed_args): - client = self.app.client_manager.lease offer = client.get_offer(parsed_args.uuid) - offer_info = {k: getattr(offer, k, '') for k in - OFFER_RESOURCE.detailed_fields} + offer_info = {k: getattr(offer, k, "") for k in OFFER_RESOURCE.detailed_fields} - offer_info['resource_properties'] = getattr( - offer, 'resource_properties', {} - ) + offer_info["resource_properties"] = getattr(offer, "resource_properties", {}) return zip(*sorted(offer_info.items())) @@ -253,18 +257,14 @@ class DeleteOffer(command.Command): def get_parser(self, prog_name): parser = super(DeleteOffer, self).get_parser(prog_name) - parser.add_argument( - "uuid", - metavar="", - help="Offer to delete (UUID)") + parser.add_argument("uuid", metavar="", help="Offer to delete (UUID)") return parser def take_action(self, parsed_args): - client = self.app.client_manager.lease client.delete_offer(parsed_args.uuid) - print('Deleted offer %s' % parsed_args.uuid) + print("Deleted offer %s" % parsed_args.uuid) class ClaimOffer(command.ShowOne): @@ -275,45 +275,45 @@ class ClaimOffer(command.ShowOne): def get_parser(self, prog_name): parser = super(ClaimOffer, self).get_parser(prog_name) + parser.add_argument("offer_uuid", metavar="", help="Offer UUID") parser.add_argument( - "offer_uuid", - metavar="", - help="Offer UUID") - parser.add_argument( - '--end-time', - dest='end_time', + "--end-time", + dest="end_time", required=False, - help="Time when the offer will expire and no longer be " - "'available'.") + help="Time when the offer will expire and no longer be 'available'.", + ) parser.add_argument( - '--start-time', - dest='start_time', + "--start-time", + dest="start_time", required=False, - help="Time when the offer will be made 'available'.") + help="Time when the offer will be made 'available'.", + ) parser.add_argument( - '--properties', - dest='properties', + "--properties", + dest="properties", required=False, help="Record arbitrary key/value resource property " - "information. Pass in as a json object.") + "information. Pass in as a json object.", + ) return parser def take_action(self, parsed_args): - client = self.app.client_manager.lease field_list = LEASE_RESOURCE._creation_attributes - fields = dict((k, v) for (k, v) in vars(parsed_args).items() - if k in field_list and v is not None) + fields = dict( + (k, v) + for (k, v) in vars(parsed_args).items() + if k in field_list and v is not None + ) - if 'properties' in fields: - fields['properties'] = json.loads(fields['properties']) + if "properties" in fields: + fields["properties"] = json.loads(fields["properties"]) lease = client.claim_offer(parsed_args.offer_uuid, **fields) - data = dict([(f, lease.get(f, '')) for f in - LEASE_RESOURCE.fields]) + data = dict([(f, lease.get(f, "")) for f in LEASE_RESOURCE.fields]) return self.dict2columns(data) diff --git a/esileapclient/tests/functional/base.py b/esileapclient/tests/functional/base.py index 634b551..974604a 100644 --- a/esileapclient/tests/functional/base.py +++ b/esileapclient/tests/functional/base.py @@ -18,7 +18,7 @@ def setUpClass(cls): cls._cls_cleanups = [] cls._init_config(cls) - cls._init_client(cls, 'admin', 'admin') + cls._init_client(cls, "admin", "admin") cls._init_roles(cls) @classmethod @@ -34,146 +34,167 @@ def _get_clients(self): return {} def _init_config(self): - venv_name = os.environ.get('VENV_NAME', default='functional') - self.config['cli_dir'] = ( - os.path.join(os.path.abspath('.'), '.tox/%s/bin' % venv_name)) + venv_name = os.environ.get("VENV_NAME", default="functional") + self.config["cli_dir"] = os.path.join( + os.path.abspath("."), ".tox/%s/bin" % venv_name + ) # allow custom configuration to be passed in via env var - cfg_file_path = ( - os.environ.get('OS_ESI_CFG_PATH', '/etc/esi-leap/esi-leap.conf')) + cfg_file_path = os.environ.get("OS_ESI_CFG_PATH", "/etc/esi-leap/esi-leap.conf") cfg_parser = configparser.ConfigParser() if not cfg_parser.read(cfg_file_path): - self.fail('Could not open config file %s for reading' % - cfg_file_path) + self.fail("Could not open config file %s for reading" % cfg_file_path) auth_opts = {} # main cfg parsing loop try: - if cfg_parser.has_section('dummy_node'): - opt = 'dummy_node_dir' - self.config[opt] = cfg_parser.get('dummy_node', opt) + if cfg_parser.has_section("dummy_node"): + opt = "dummy_node_dir" + self.config[opt] = cfg_parser.get("dummy_node", opt) # TODO: add support for keystone v2 (this is v3-only atm) # attempts to read authentication credentials in this order: # 1) [keystone] section of config file # 2) [keystone_authtoken] section of config file # 3) from the environment variables (e.g. OS_PASSWORD, etc) - for opt in ('username', 'password', 'project_name', 'auth_type', - 'auth_url', 'user_domain_name', 'project_domain_name'): - for sect in 'keystone', 'keystone_authtoken': + for opt in ( + "username", + "password", + "project_name", + "auth_type", + "auth_url", + "user_domain_name", + "project_domain_name", + ): + for sect in "keystone", "keystone_authtoken": if cfg_parser.has_option(sect, opt): auth_opts[opt] = cfg_parser.get(sect, opt) break if opt not in auth_opts.keys(): - x = os.environ.get('OS_%s' % opt.upper()) + x = os.environ.get("OS_%s" % opt.upper()) if x is not None: auth_opts[opt] = x else: raise configparser.NoOptionerror - except (configparser.NoOptionError): + except configparser.NoOptionError: self.fail("Missing option %s in configuration file." % opt) - self.config['auth_type'] = auth_opts['auth_type'] - self.config['auth_url'] = auth_opts['auth_url'] + self.config["auth_type"] = auth_opts["auth_type"] + self.config["auth_url"] = auth_opts["auth_url"] - self.users['admin'] = { - 'name': auth_opts['username'], - 'password': auth_opts['password'], - 'domain': auth_opts['user_domain_name'] + self.users["admin"] = { + "name": auth_opts["username"], + "password": auth_opts["password"], + "domain": auth_opts["user_domain_name"], } - self.projects['admin'] = { - 'name': auth_opts['project_name'], - 'domain': auth_opts['project_domain_name'] + self.projects["admin"] = { + "name": auth_opts["project_name"], + "domain": auth_opts["project_domain_name"], } def _init_client(self, user, project): - self.clients[user] = ( - ESICLIClient(cli_dir=self.config['cli_dir'], - username=self.users[user]['name'], - password=self.users[user]['password'], - user_domain_name=self.users[user]['domain'], - tenant_name=self.projects[project]['name'], - project_domain_name=self.projects[project]['domain'], - identity_api_version='3', - uri=self.config['auth_url'])) + self.clients[user] = ESICLIClient( + cli_dir=self.config["cli_dir"], + username=self.users[user]["name"], + password=self.users[user]["password"], + user_domain_name=self.users[user]["domain"], + tenant_name=self.projects[project]["name"], + project_domain_name=self.projects[project]["domain"], + identity_api_version="3", + uri=self.config["auth_url"], + ) def _init_dummy_project(self, name, roles, parent=None): - admin_client = self.clients['admin'] + admin_client = self.clients["admin"] # NOTE: names created using tempest's data_utils.rand_name() function # will be prefixed with 'tempest-' and suffixed with randomly # generated characters to prevent name collision. - project_name = data_utils.rand_name('esi-%s-project' % name) - flags = '--domain default --enable -f json' + project_name = data_utils.rand_name("esi-%s-project" % name) + flags = "--domain default --enable -f json" if parent: if parent not in self.projects.keys(): - raise NameError('Invalid parent project: %s' % parent) - flags += ' --parent %s' % self.projects[parent]['name'] - output = admin_client.openstack('project create %s' % project_name, - '', flags) - self._cls_cleanups.append([admin_client.openstack, 'project delete', - '', '%s' % project_name]) - project_id = json.loads(output)['id'] + raise NameError("Invalid parent project: %s" % parent) + flags += " --parent %s" % self.projects[parent]["name"] + output = admin_client.openstack("project create %s" % project_name, "", flags) + self._cls_cleanups.append( + [admin_client.openstack, "project delete", "", "%s" % project_name] + ) + project_id = json.loads(output)["id"] self.projects[name] = { - 'name': project_name, - 'id': project_id, - 'parent': parent, - 'domain': 'default' + "name": project_name, + "id": project_id, + "parent": parent, + "domain": "default", } if not roles: - raise ValueError('No roles specified when initializing dummy \ - project %s' % name) + raise ValueError( + "No roles specified when initializing dummy \ + project %s" + % name + ) elif type(roles) is str: roles = [roles] for role in roles: - if role not in ('owner', 'lessee', 'member'): - raise ValueError('Unknown role: %s' % role) + if role not in ("owner", "lessee", "member"): + raise ValueError("Unknown role: %s" % role) - username = data_utils.rand_name('esi-%s-%s' % (name, role)) + username = data_utils.rand_name("esi-%s-%s" % (name, role)) password = data_utils.rand_password() - output = admin_client.openstack('user create %s' % username, '', - '--domain default --password %s \ - --enable -f json' % password) - self._cls_cleanups.append([admin_client.openstack, 'user delete', - '', '%s' % username]) - user_id = json.loads(output)['id'] - - client_name = '%s-%s' % (name, role) + output = admin_client.openstack( + "user create %s" % username, + "", + "--domain default --password %s \ + --enable -f json" + % password, + ) + self._cls_cleanups.append( + [admin_client.openstack, "user delete", "", "%s" % username] + ) + user_id = json.loads(output)["id"] + + client_name = "%s-%s" % (name, role) self.users[client_name] = { - 'name': username, - 'id': user_id, - 'password': password, - 'domain': 'default' + "name": username, + "id": user_id, + "password": password, + "domain": "default", } - if role != 'member': - role = 'esi_leap_%s' % role - admin_client.openstack('role add', '', '--user %s --project %s %s' - % (username, project_name, role)) - self._cls_cleanups.append([admin_client.openstack, 'role remove', - '', '--user %s --project %s %s' % - (username, project_name, role)]) + if role != "member": + role = "esi_leap_%s" % role + admin_client.openstack( + "role add", + "", + "--user %s --project %s %s" % (username, project_name, role), + ) + self._cls_cleanups.append( + [ + admin_client.openstack, + "role remove", + "", + "--user %s --project %s %s" % (username, project_name, role), + ] + ) self._init_client(self, client_name, name) def _init_roles(self): # TODO: find a way to make this play nice when running parallel tests. - for role in 'esi_leap_owner', 'esi_leap_lessee': + for role in "esi_leap_owner", "esi_leap_lessee": try: - self.clients['admin'].openstack('role show', '', '%s' % role) + self.clients["admin"].openstack("role show", "", "%s" % role) except CommandFailed: - self.clients['admin'].openstack('role create', '', '%s' % role) - self._cls_cleanups.append([self.clients['admin'].openstack, - 'role delete', '', - '%s' % role]) + self.clients["admin"].openstack("role create", "", "%s" % role) + self._cls_cleanups.append( + [self.clients["admin"].openstack, "role delete", "", "%s" % role] + ) class ESICLIClient(base.CLIClient): - def esi(self, action, flags='', params='', fail_ok=False, - merge_stderr=False): - return self.openstack('esi %s' % action, '', - '%s %s' % (flags, params), - fail_ok, - merge_stderr) + def esi(self, action, flags="", params="", fail_ok=False, merge_stderr=False): + return self.openstack( + "esi %s" % action, "", "%s %s" % (flags, params), fail_ok, merge_stderr + ) diff --git a/esileapclient/tests/functional/utils/dummy_node.py b/esileapclient/tests/functional/utils/dummy_node.py index 01af179..3fb7111 100644 --- a/esileapclient/tests/functional/utils/dummy_node.py +++ b/esileapclient/tests/functional/utils/dummy_node.py @@ -3,28 +3,28 @@ import tempfile -class DummyNode(): - def __init__(self, node_dir, project_uuid=''): +class DummyNode: + def __init__(self, node_dir, project_uuid=""): if not os.path.exists(node_dir): os.mkdir(node_dir) elif not os.path.isdir(node_dir): - raise NotADirectoryError('Invalid value for dummy_node_dir: %s' - % node_dir) + raise NotADirectoryError("Invalid value for dummy_node_dir: %s" % node_dir) dummy_node_info = { - 'project_owner_id': project_uuid, - 'server_config': { - 'example_attribute': 'example server config', - 'cpu_type': 'Intel Xeon', - 'cores': 16, - 'ram_gb': 512, - 'storage_type': 'Samsung SSD', - 'storage_size_gb': 1024 - } + "project_owner_id": project_uuid, + "server_config": { + "example_attribute": "example server config", + "cpu_type": "Intel Xeon", + "cores": 16, + "ram_gb": 512, + "storage_type": "Samsung SSD", + "storage_size_gb": 1024, + }, } - with tempfile.NamedTemporaryFile(prefix='', dir=node_dir, - mode='w+', delete=False) as node: + with tempfile.NamedTemporaryFile( + prefix="", dir=node_dir, mode="w+", delete=False + ) as node: json.dump(dummy_node_info, node) self.path = node.name self.uuid = os.path.basename(node.name) diff --git a/esileapclient/tests/functional/utils/esi_interfaces.py b/esileapclient/tests/functional/utils/esi_interfaces.py index 0bd9ef2..a9c791d 100644 --- a/esileapclient/tests/functional/utils/esi_interfaces.py +++ b/esileapclient/tests/functional/utils/esi_interfaces.py @@ -3,73 +3,145 @@ def _execute(client, cmd, valid_flags, kwargs, args, parse, fail_ok): - flag_str = utils.kwargs_to_flags(valid_flags, kwargs) if kwargs else '' - arg_str = '' if not len(args) else ' '.join(args) + flag_str = utils.kwargs_to_flags(valid_flags, kwargs) if kwargs else "" + arg_str = "" if not len(args) else " ".join(args) if parse: - flag_str = ' '.join((flag_str, '-f json')) + flag_str = " ".join((flag_str, "-f json")) return json.loads(client.esi(cmd, flag_str, arg_str, fail_ok)) else: return client.esi(cmd, flag_str, arg_str, fail_ok) def offer_create(client, node_uuid, parse=True, fail_ok=False, **kwargs): - valid_flags = ('resource_type', 'start_time', 'end_time', - 'lessee', 'name', 'properties') - return _execute(client, cmd='offer create', valid_flags=valid_flags, - kwargs=kwargs, args=(node_uuid,), parse=parse, - fail_ok=fail_ok) + valid_flags = ( + "resource_type", + "start_time", + "end_time", + "lessee", + "name", + "properties", + ) + return _execute( + client, + cmd="offer create", + valid_flags=valid_flags, + kwargs=kwargs, + args=(node_uuid,), + parse=parse, + fail_ok=fail_ok, + ) def offer_delete(client, offer_uuid, fail_ok=False): - return client.esi('offer delete', '', offer_uuid, fail_ok) + return client.esi("offer delete", "", offer_uuid, fail_ok) def offer_list(client, parse=True, fail_ok=False, **kwargs): - valid_flags = ('long', 'status', 'project', 'resource_uuid', - 'resource_type', 'time_range', 'availability_range') - return _execute(client, cmd='offer list', valid_flags=valid_flags, - kwargs=kwargs, args=(), parse=parse, fail_ok=fail_ok) + valid_flags = ( + "long", + "status", + "project", + "resource_uuid", + "resource_type", + "time_range", + "availability_range", + ) + return _execute( + client, + cmd="offer list", + valid_flags=valid_flags, + kwargs=kwargs, + args=(), + parse=parse, + fail_ok=fail_ok, + ) def offer_show(client, offer_uuid, parse=True, fail_ok=False): - return _execute(client, cmd='offer show', valid_flags=None, kwargs=None, - args=(offer_uuid,), parse=parse, fail_ok=fail_ok) + return _execute( + client, + cmd="offer show", + valid_flags=None, + kwargs=None, + args=(offer_uuid,), + parse=parse, + fail_ok=fail_ok, + ) def offer_claim(client, offer_uuid, parse=True, fail_ok=False, **kwargs): - valid_flags = ('start_time', 'end_time', 'properties') - return _execute(client, cmd='offer claim', valid_flags=valid_flags, - kwargs=kwargs, args=(offer_uuid,), parse=parse, - fail_ok=fail_ok) + valid_flags = ("start_time", "end_time", "properties") + return _execute( + client, + cmd="offer claim", + valid_flags=valid_flags, + kwargs=kwargs, + args=(offer_uuid,), + parse=parse, + fail_ok=fail_ok, + ) def node_list(client, parse=True, fail_ok=False, **kwargs): - valid_flags = ('long') - return _execute(client, cmd='node list', valid_flags=valid_flags, - kwargs=kwargs, args=(), parse=parse, - fail_ok=fail_ok) - - -def lease_create(client, node_uuid, lessee, parse=True, fail_ok=False, - **kwargs): - valid_flags = ('resource_type', 'start_time', 'end_time', - 'name', 'properties') - return _execute(client, cmd='lease create', valid_flags=valid_flags, - kwargs=kwargs, args=(node_uuid, lessee), parse=parse, - fail_ok=fail_ok) + valid_flags = "long" + return _execute( + client, + cmd="node list", + valid_flags=valid_flags, + kwargs=kwargs, + args=(), + parse=parse, + fail_ok=fail_ok, + ) + + +def lease_create(client, node_uuid, lessee, parse=True, fail_ok=False, **kwargs): + valid_flags = ("resource_type", "start_time", "end_time", "name", "properties") + return _execute( + client, + cmd="lease create", + valid_flags=valid_flags, + kwargs=kwargs, + args=(node_uuid, lessee), + parse=parse, + fail_ok=fail_ok, + ) def lease_list(client, parse=True, fail_ok=False, **kwargs): - valid_flags = ('long', 'all', 'status', 'offer_uuid', 'time_range', - 'project', 'owner', 'resource_type', 'resource_uuid') - return _execute(client, cmd='lease list', valid_flags=valid_flags, - kwargs=kwargs, args=(), parse=parse, fail_ok=fail_ok) + valid_flags = ( + "long", + "all", + "status", + "offer_uuid", + "time_range", + "project", + "owner", + "resource_type", + "resource_uuid", + ) + return _execute( + client, + cmd="lease list", + valid_flags=valid_flags, + kwargs=kwargs, + args=(), + parse=parse, + fail_ok=fail_ok, + ) def lease_delete(client, lease_uuid, fail_ok=False): - return client.esi('lease delete', '', lease_uuid, fail_ok) + return client.esi("lease delete", "", lease_uuid, fail_ok) def lease_show(client, lease_uuid, parse=True, fail_ok=False): - return _execute(client, cmd='lease show', valid_flags=None, kwargs=None, - args=(lease_uuid,), parse=parse, fail_ok=fail_ok) + return _execute( + client, + cmd="lease show", + valid_flags=None, + kwargs=None, + args=(lease_uuid,), + parse=parse, + fail_ok=fail_ok, + ) diff --git a/esileapclient/tests/functional/utils/output_utils.py b/esileapclient/tests/functional/utils/output_utils.py index 71fa9fc..84ec6a4 100644 --- a/esileapclient/tests/functional/utils/output_utils.py +++ b/esileapclient/tests/functional/utils/output_utils.py @@ -1,26 +1,29 @@ def kwargs_to_flags(valid_flags, arguments): - """ Takes an iterable containing a list of valid flags and a flattened - kwargs dict containing the flag values received by the function. - The key for each dict entry should be the name of a valid flag for the - command being run, with any hypnens in the flag name replaced with - underscores (e.g. end-time -> end_time). Its corresponding value - should be a string, True (if that flag is included by itself), - or None/False to indicate the flag should be excluded. - Returns a stringified version of kwargs for use with CLI commands. """ - flag_string = '' + """Takes an iterable containing a list of valid flags and a flattened + kwargs dict containing the flag values received by the function. + The key for each dict entry should be the name of a valid flag for the + command being run, with any hypnens in the flag name replaced with + underscores (e.g. end-time -> end_time). Its corresponding value + should be a string, True (if that flag is included by itself), + or None/False to indicate the flag should be excluded. + Returns a stringified version of kwargs for use with CLI commands.""" + flag_string = "" for flag in arguments.keys(): val = arguments[flag] if val is not None: if flag in valid_flags: - tmp = ' --%s' % flag.replace('_', '-') + tmp = " --%s" % flag.replace("_", "-") if isinstance(val, str): flag_string += '%s "%s"' % (tmp, val) elif isinstance(val, bool): - flag_string += tmp if val else '' + flag_string += tmp if val else "" else: - raise TypeError('Invalid value for flag %s, expected \ - type \'str\' or \'bool\' and got type \ - \'%s\'' % (flag, type(val).__name__)) + raise TypeError( + "Invalid value for flag %s, expected \ + type 'str' or 'bool' and got type \ + '%s'" + % (flag, type(val).__name__) + ) else: - raise NameError('Invalid flag with name %s' % flag) + raise NameError("Invalid flag with name %s" % flag) return flag_string diff --git a/esileapclient/tests/functional/v1/test_basic.py b/esileapclient/tests/functional/v1/test_basic.py index 4db2096..810d999 100644 --- a/esileapclient/tests/functional/v1/test_basic.py +++ b/esileapclient/tests/functional/v1/test_basic.py @@ -13,381 +13,388 @@ class BasicTests(ESIBaseTestClass): @classmethod def setUpClass(cls): super(BasicTests, cls).setUpClass() - cls._init_dummy_project(cls, 'parent', 'owner') - cls._init_dummy_project(cls, 'child', 'lessee', parent='parent') + cls._init_dummy_project(cls, "parent", "owner") + cls._init_dummy_project(cls, "child", "lessee", parent="parent") def setUp(self): super(BasicTests, self).setUp() self.clients = BasicTests.clients self.users = BasicTests.users self.projects = BasicTests.projects - self.dummy_node = DummyNode(BasicTests.config['dummy_node_dir'], - self.projects['parent']['id']) + self.dummy_node = DummyNode( + BasicTests.config["dummy_node_dir"], self.projects["parent"]["id"] + ) def test_offer_create_basic(self): - """ Tests that a node owner can create and delete an offer for a node - that they own. - Test steps: - 1) Create an offer for an owned node. - 2) Check that offer details were returned. - 3) (cleanup) Delete the offer created in step 1. """ - offer = esi.offer_create(self.clients['parent-owner'], - self.dummy_node.uuid, - resource_type='dummy_node') + """Tests that a node owner can create and delete an offer for a node + that they own. + Test steps: + 1) Create an offer for an owned node. + 2) Check that offer details were returned. + 3) (cleanup) Delete the offer created in step 1.""" + offer = esi.offer_create( + self.clients["parent-owner"], + self.dummy_node.uuid, + resource_type="dummy_node", + ) self.assertNotEqual(offer, {}) - self.addCleanup(esi.offer_delete, - self.clients['parent-owner'], - offer['uuid']) + self.addCleanup(esi.offer_delete, self.clients["parent-owner"], offer["uuid"]) def test_offer_list_basic(self): - """ Tests basic functionality of "esi offer list" when executed by - both node owners and lessees with access to offers. - Test steps: - 1) (owner) Create an offer for an owned node. - 2) Check that offer details were returned. - 3) (owner) Check that the output of 'offer list' contains the new - offer. - 4) (lessee) Check that the output of 'offer list' contains the - new offer. - 5) (cleanup) (owner) Delete the offer created in step 1. """ - offer = esi.offer_create(self.clients['parent-owner'], - self.dummy_node.uuid, - resource_type='dummy_node', - lessee=self.projects['child']['name']) + """Tests basic functionality of "esi offer list" when executed by + both node owners and lessees with access to offers. + Test steps: + 1) (owner) Create an offer for an owned node. + 2) Check that offer details were returned. + 3) (owner) Check that the output of 'offer list' contains the new + offer. + 4) (lessee) Check that the output of 'offer list' contains the + new offer. + 5) (cleanup) (owner) Delete the offer created in step 1.""" + offer = esi.offer_create( + self.clients["parent-owner"], + self.dummy_node.uuid, + resource_type="dummy_node", + lessee=self.projects["child"]["name"], + ) self.assertNotEqual(offer, {}) - self.addCleanup(esi.offer_delete, - self.clients['parent-owner'], - offer['uuid']) + self.addCleanup(esi.offer_delete, self.clients["parent-owner"], offer["uuid"]) - for client_name in 'parent-owner', 'child-lessee': + for client_name in "parent-owner", "child-lessee": listings = esi.offer_list(self.clients[client_name]) self.assertNotEqual(listings, []) - self.assertIn(offer['uuid'], [x['UUID'] for x in listings]) + self.assertIn(offer["uuid"], [x["UUID"] for x in listings]) def test_offer_show_basic(self): - """ Tests basic functionality of "esi offer show" when executed by - both node owners and lessees with access to offers. - Test steps: - 1) (owner) Create an offer for an owned node. - 2) Check that offer details were returned. - 3) (owner) Check that the output of 'offer show' contains the - details of the offer. - 4) (lessee) Check that the output of 'offer show' contains the - details of the new offer. - 5) (cleanup) (owner) Delete the offer created in step 1. """ - offer = esi.offer_create(self.clients['parent-owner'], - self.dummy_node.uuid, - resource_type='dummy_node', - lessee=self.projects['child']['name'], - start_time='9999-01-01') + """Tests basic functionality of "esi offer show" when executed by + both node owners and lessees with access to offers. + Test steps: + 1) (owner) Create an offer for an owned node. + 2) Check that offer details were returned. + 3) (owner) Check that the output of 'offer show' contains the + details of the offer. + 4) (lessee) Check that the output of 'offer show' contains the + details of the new offer. + 5) (cleanup) (owner) Delete the offer created in step 1.""" + offer = esi.offer_create( + self.clients["parent-owner"], + self.dummy_node.uuid, + resource_type="dummy_node", + lessee=self.projects["child"]["name"], + start_time="9999-01-01", + ) self.assertNotEqual(offer, {}) - self.addCleanup(esi.offer_delete, - self.clients['parent-owner'], - offer['uuid']) + self.addCleanup(esi.offer_delete, self.clients["parent-owner"], offer["uuid"]) - for client_name in 'parent-owner', 'child-lessee': - details = esi.offer_show(self.clients[client_name], offer['uuid']) + for client_name in "parent-owner", "child-lessee": + details = esi.offer_show(self.clients[client_name], offer["uuid"]) for field in offer.keys(): self.assertEqual(offer[field], details[field]) def test_offer_claim_basic(self): - """ Tests that a lessee can claim an offer made available to them - and delete the created lease when finished. - Test steps: - 1) (owner) Create an offer for an owned node. - 2) Check that offer details were returned. - 3) (lessee) Claim the offer created in step 1. - 4) Check that lease details were returned. - 5) (cleanup) (lessee) Delete the lease created in step 3. - 6) (cleanup) (owner) Delete the offer created in step 1. """ - offer = esi.offer_create(self.clients['parent-owner'], - self.dummy_node.uuid, - resource_type='dummy_node', - lessee=self.projects['child']['name']) + """Tests that a lessee can claim an offer made available to them + and delete the created lease when finished. + Test steps: + 1) (owner) Create an offer for an owned node. + 2) Check that offer details were returned. + 3) (lessee) Claim the offer created in step 1. + 4) Check that lease details were returned. + 5) (cleanup) (lessee) Delete the lease created in step 3. + 6) (cleanup) (owner) Delete the offer created in step 1.""" + offer = esi.offer_create( + self.clients["parent-owner"], + self.dummy_node.uuid, + resource_type="dummy_node", + lessee=self.projects["child"]["name"], + ) self.assertNotEqual(offer, {}) - self.addCleanup(esi.offer_delete, - self.clients['parent-owner'], - offer['uuid']) + self.addCleanup(esi.offer_delete, self.clients["parent-owner"], offer["uuid"]) - lease = esi.offer_claim(self.clients['child-lessee'], - offer['uuid']) + lease = esi.offer_claim(self.clients["child-lessee"], offer["uuid"]) self.assertNotEqual(lease, {}) - self.addCleanup(esi.lease_delete, - self.clients['child-lessee'], - lease['uuid']) + self.addCleanup(esi.lease_delete, self.clients["child-lessee"], lease["uuid"]) def test_lease_create_basic(self): - """ Tests that a node owner can create and delete a lease on a node - that they own. - Test steps: - 1) Create a lease on an owned node. - 2) Check that lease details were returned. - 3) (cleanup) Delete the lease created in step 1. """ - lease = esi.lease_create(self.clients['parent-owner'], - self.dummy_node.uuid, - self.projects['child']['name'], - resource_type='dummy_node', - start_time='9999-01-01') + """Tests that a node owner can create and delete a lease on a node + that they own. + Test steps: + 1) Create a lease on an owned node. + 2) Check that lease details were returned. + 3) (cleanup) Delete the lease created in step 1.""" + lease = esi.lease_create( + self.clients["parent-owner"], + self.dummy_node.uuid, + self.projects["child"]["name"], + resource_type="dummy_node", + start_time="9999-01-01", + ) self.assertNotEqual(lease, {}) - self.addCleanup(esi.lease_delete, - self.clients['parent-owner'], - lease['uuid']) + self.addCleanup(esi.lease_delete, self.clients["parent-owner"], lease["uuid"]) def test_lease_list_basic(self): - """ Tests basic functionality of "esi lease list" when executed by - a node owner. - Test steps: - 1) Create a lease on an owned node. - 2) Check that lease details were returned. - 3) Check that the output of 'lease list' contains the new lease. - 4) (cleanup) Delete the lease created in step 1. """ - lease = esi.lease_create(self.clients['parent-owner'], - self.dummy_node.uuid, - self.projects['child']['name'], - resource_type='dummy_node', - start_time='9999-01-01') + """Tests basic functionality of "esi lease list" when executed by + a node owner. + Test steps: + 1) Create a lease on an owned node. + 2) Check that lease details were returned. + 3) Check that the output of 'lease list' contains the new lease. + 4) (cleanup) Delete the lease created in step 1.""" + lease = esi.lease_create( + self.clients["parent-owner"], + self.dummy_node.uuid, + self.projects["child"]["name"], + resource_type="dummy_node", + start_time="9999-01-01", + ) self.assertNotEqual(lease, {}) - self.addCleanup(esi.lease_delete, - self.clients['parent-owner'], - lease['uuid']) + self.addCleanup(esi.lease_delete, self.clients["parent-owner"], lease["uuid"]) - listings = esi.lease_list(self.clients['parent-owner']) + listings = esi.lease_list(self.clients["parent-owner"]) self.assertNotEqual(listings, []) - self.assertIn(lease['uuid'], [x['UUID'] for x in listings]) + self.assertIn(lease["uuid"], [x["UUID"] for x in listings]) def test_lease_show_basic(self): - """ Tests basic functionality of "esi lease show" when executed by - both node owners and the lessee of the lease. - Test steps: - 1) (owner) Create a lease on an owned node. - 2) Check that offer details were returned. - 3) (owner) Check that the output of 'offer show' contains the - details of the offer. - 4) (lessee) Check that the output of 'offer show' contains the - details of the new offer. - 5) (cleanup) (owner) Delete the offer created in step 1. """ - lease = esi.lease_create(self.clients['parent-owner'], - self.dummy_node.uuid, - self.projects['child']['name'], - resource_type='dummy_node', - start_time='9999-01-01') + """Tests basic functionality of "esi lease show" when executed by + both node owners and the lessee of the lease. + Test steps: + 1) (owner) Create a lease on an owned node. + 2) Check that offer details were returned. + 3) (owner) Check that the output of 'offer show' contains the + details of the offer. + 4) (lessee) Check that the output of 'offer show' contains the + details of the new offer. + 5) (cleanup) (owner) Delete the offer created in step 1.""" + lease = esi.lease_create( + self.clients["parent-owner"], + self.dummy_node.uuid, + self.projects["child"]["name"], + resource_type="dummy_node", + start_time="9999-01-01", + ) self.assertNotEqual(lease, {}) - self.addCleanup(esi.lease_delete, - self.clients['parent-owner'], - lease['uuid']) + self.addCleanup(esi.lease_delete, self.clients["parent-owner"], lease["uuid"]) - for client_name in 'parent-owner', 'child-lessee': - details = esi.lease_show(self.clients[client_name], lease['uuid']) + for client_name in "parent-owner", "child-lessee": + details = esi.lease_show(self.clients[client_name], lease["uuid"]) for field in lease.keys(): self.assertEqual(lease[field], details[field]) def test_lease_show_offer_deleted(self): - """ Tests that leases created thru claiming an offer are deleted after - the claimed offer has been deleted. - Test steps: - 1) (owner) Create an offer for an owned node. - 2) Check that offer details were returned. - 3) (lessee) Claim the offer created in step 1. - 4) Check that lease details were returned. - 5) (owner) Delete the offer created in step 1. - 6) View the details of the lease created in step 4 to ensure the - lease's status is 'deleted'. - 7) (lessee) If not, delete the lease manually. """ - offer = esi.offer_create(self.clients['parent-owner'], - self.dummy_node.uuid, - resource_type='dummy_node', - lessee=self.projects['child']['name']) + """Tests that leases created thru claiming an offer are deleted after + the claimed offer has been deleted. + Test steps: + 1) (owner) Create an offer for an owned node. + 2) Check that offer details were returned. + 3) (lessee) Claim the offer created in step 1. + 4) Check that lease details were returned. + 5) (owner) Delete the offer created in step 1. + 6) View the details of the lease created in step 4 to ensure the + lease's status is 'deleted'. + 7) (lessee) If not, delete the lease manually.""" + offer = esi.offer_create( + self.clients["parent-owner"], + self.dummy_node.uuid, + resource_type="dummy_node", + lessee=self.projects["child"]["name"], + ) self.assertNotEqual(offer, {}) - self.addCleanup(esi.offer_delete, - self.clients['parent-owner'], - offer['uuid'], - fail_ok=True) + self.addCleanup( + esi.offer_delete, self.clients["parent-owner"], offer["uuid"], fail_ok=True + ) - lease = esi.offer_claim(self.clients['child-lessee'], - offer['uuid']) + lease = esi.offer_claim(self.clients["child-lessee"], offer["uuid"]) self.assertNotEqual(lease, {}) - self.addCleanup(esi.lease_delete, - self.clients['child-lessee'], - lease['uuid'], - fail_ok=True) + self.addCleanup( + esi.lease_delete, self.clients["child-lessee"], lease["uuid"], fail_ok=True + ) - esi.offer_delete(self.clients['parent-owner'], offer['uuid']) - details = esi.lease_show(self.clients['child-lessee'], lease['uuid']) - self.assertEqual(details['status'], 'deleted') + esi.offer_delete(self.clients["parent-owner"], offer["uuid"]) + details = esi.lease_show(self.clients["child-lessee"], lease["uuid"]) + self.assertEqual(details["status"], "deleted") - @unittest.skipIf(list(map(lambda x: os.getenv('OS_FUNCTIONAL_NODE_%s' % x), - ['NAME', 'UUID'])) == [None, None], - 'Neither env variable OS_FUNCTIONAL_NODE_UUID \ - nor OS_FUNCTIONAL_NODE_NAME is set') + @unittest.skipIf( + list(map(lambda x: os.getenv("OS_FUNCTIONAL_NODE_%s" % x), ["NAME", "UUID"])) + == [None, None], + "Neither env variable OS_FUNCTIONAL_NODE_UUID \ + nor OS_FUNCTIONAL_NODE_NAME is set", + ) def test_node_list_long(self): - """ Tests functionality "esi node list" using node_uuid or node name. - checks node_uuid or node_name is present in node list or not. - Test steps: - 1) Set either of the environment variables using - export OS_FUNCTIONAL_NODE_UUID=node_uuid or - export OS_FUNCTIONAL_NODE_NAME=node_name - 2) Checks that the output of "node list" contains - the node uuid or node name it's tested with. """ - node_uuid = os.getenv('OS_FUNCTIONAL_NODE_UUID') - node_name = os.getenv('OS_FUNCTIONAL_NODE_NAME') - listings = esi.node_list(self.clients['admin'], long=True) + """Tests functionality "esi node list" using node_uuid or node name. + checks node_uuid or node_name is present in node list or not. + Test steps: + 1) Set either of the environment variables using + export OS_FUNCTIONAL_NODE_UUID=node_uuid or + export OS_FUNCTIONAL_NODE_NAME=node_name + 2) Checks that the output of "node list" contains + the node uuid or node name it's tested with.""" + node_uuid = os.getenv("OS_FUNCTIONAL_NODE_UUID") + node_name = os.getenv("OS_FUNCTIONAL_NODE_NAME") + listings = esi.node_list(self.clients["admin"], long=True) self.assertNotEqual(listings, []) if node_uuid is not None: - self.assertIn(node_uuid, [x['UUID'] for x in listings]) + self.assertIn(node_uuid, [x["UUID"] for x in listings]) if node_name is not None: - self.assertIn(node_name, [x['Name'] for x in listings]) + self.assertIn(node_name, [x["Name"] for x in listings]) - @unittest.skipIf('OS_FUNCTIONAL_NODE_NAME' not in os.environ.keys(), - 'Environment variable OS_FUNCTIONAL_NODE_NAME not set') + @unittest.skipIf( + "OS_FUNCTIONAL_NODE_NAME" not in os.environ.keys(), + "Environment variable OS_FUNCTIONAL_NODE_NAME not set", + ) def test_node_list_basic(self): - """ Tests basic functionality of "esi node list" when default behavior - is invoked. Checks if node_name is present in node list. - Test steps: - 1) Set the environment variable using - export OS_FUNCTIONAL_NODE_IDENT_NAME=node_name - 2) Checks that the output of "node list" contains - the node name it's tested with. """ - node_name = os.getenv('OS_FUNCTIONAL_NODE_IDENT_NAME') - listings = esi.node_list(self.clients['admin']) + """Tests basic functionality of "esi node list" when default behavior + is invoked. Checks if node_name is present in node list. + Test steps: + 1) Set the environment variable using + export OS_FUNCTIONAL_NODE_IDENT_NAME=node_name + 2) Checks that the output of "node list" contains + the node name it's tested with.""" + node_name = os.getenv("OS_FUNCTIONAL_NODE_IDENT_NAME") + listings = esi.node_list(self.clients["admin"]) self.assertNotEqual(listings, []) - self.assertIn(node_name, [x['Name'] for x in listings]) + self.assertIn(node_name, [x["Name"] for x in listings]) @pytest.mark.negative def test_offer_show_invalid_id(self): - """ Tests that "esi offer show" properly handles being passed an - offer uuid that does not exist. - Test steps: - 1) Attempt to show details of an offer that does not exist. - 2) Check that the command failed. (returned non-zero exit code) - 3) Check that the proper error message was sent to stderr. """ - fake_name = data_utils.rand_name('does-not-exist', prefix='') - e = self.assertRaises(CommandFailed, - esi.offer_show, - self.clients['parent-owner'], - fake_name) - self.assertIn('Offer with name or uuid %s not found.' % fake_name, - e.stderr.decode()) + """Tests that "esi offer show" properly handles being passed an + offer uuid that does not exist. + Test steps: + 1) Attempt to show details of an offer that does not exist. + 2) Check that the command failed. (returned non-zero exit code) + 3) Check that the proper error message was sent to stderr.""" + fake_name = data_utils.rand_name("does-not-exist", prefix="") + e = self.assertRaises( + CommandFailed, esi.offer_show, self.clients["parent-owner"], fake_name + ) + self.assertIn( + "Offer with name or uuid %s not found." % fake_name, e.stderr.decode() + ) @pytest.mark.negative def test_lease_show_invalid_id(self): - """ Tests that "esi lease show" properly handles being passed a - lease uuid that does not exist. - Test steps: - 1) Attempt to show details of a lease that does not exist. - 2) Check that the command failed. (returned non-zero exit code) - 3) Check that the proper error message was sent to stderr. """ - fake_name = data_utils.rand_name('does-not-exist', prefix='') - e = self.assertRaises(CommandFailed, - esi.lease_show, - self.clients['parent-owner'], - fake_name) - self.assertIn('Lease with name or uuid %s not found.' % fake_name, - e.stderr.decode()) + """Tests that "esi lease show" properly handles being passed a + lease uuid that does not exist. + Test steps: + 1) Attempt to show details of a lease that does not exist. + 2) Check that the command failed. (returned non-zero exit code) + 3) Check that the proper error message was sent to stderr.""" + fake_name = data_utils.rand_name("does-not-exist", prefix="") + e = self.assertRaises( + CommandFailed, esi.lease_show, self.clients["parent-owner"], fake_name + ) + self.assertIn( + "Lease with name or uuid %s not found." % fake_name, e.stderr.decode() + ) @pytest.mark.negative def test_offer_delete_invalid_id(self): - """ Tests that "esi offer delete" properly handles being passed an - offer uuid that does not exist. - Test steps: - 1) Attempt to delete an offer that does not exist. - 2) Check that the command failed. (returned non-zero exit code) - 3) Check that the proper error message was sent to stderr. """ - fake_name = data_utils.rand_name('does-not-exist', prefix='') - e = self.assertRaises(CommandFailed, - esi.offer_delete, - self.clients['parent-owner'], - fake_name) - self.assertIn('Offer with name or uuid %s not found.' % fake_name, - e.stderr.decode()) + """Tests that "esi offer delete" properly handles being passed an + offer uuid that does not exist. + Test steps: + 1) Attempt to delete an offer that does not exist. + 2) Check that the command failed. (returned non-zero exit code) + 3) Check that the proper error message was sent to stderr.""" + fake_name = data_utils.rand_name("does-not-exist", prefix="") + e = self.assertRaises( + CommandFailed, esi.offer_delete, self.clients["parent-owner"], fake_name + ) + self.assertIn( + "Offer with name or uuid %s not found." % fake_name, e.stderr.decode() + ) @pytest.mark.negative def test_lease_delete_invalid_id(self): - """ Tests that "esi lease delete" properly handles being passed a - lease uuid that does not exist. - Test steps: - 1) Attempt to delete a lease that does not exist. - 2) Check that the command failed. (returned non-zero exit code) - 3) Check that the proper error message was sent to stderr. """ - fake_name = data_utils.rand_name('does-not-exist', prefix='') - e = self.assertRaises(CommandFailed, - esi.lease_delete, - self.clients['parent-owner'], - fake_name) - self.assertIn('Lease with name or uuid %s not found.' % fake_name, - e.stderr.decode()) + """Tests that "esi lease delete" properly handles being passed a + lease uuid that does not exist. + Test steps: + 1) Attempt to delete a lease that does not exist. + 2) Check that the command failed. (returned non-zero exit code) + 3) Check that the proper error message was sent to stderr.""" + fake_name = data_utils.rand_name("does-not-exist", prefix="") + e = self.assertRaises( + CommandFailed, esi.lease_delete, self.clients["parent-owner"], fake_name + ) + self.assertIn( + "Lease with name or uuid %s not found." % fake_name, e.stderr.decode() + ) @pytest.mark.negative def test_offer_claim_invalid_id(self): - """ Tests that "esi offer claim" properly handles being passed an - offer uuid that does not exist. - Test steps: - 1) Attempt to claim an offer that does not exist. - 2) Check that the command failed. (returned non-zero exit code) - 3) Check that the proper error message was sent to stderr. """ - fake_name = data_utils.rand_name('does-not-exist', prefix='') - e = self.assertRaises(CommandFailed, - esi.offer_claim, - self.clients['child-lessee'], - fake_name) - self.assertIn('Offer with name or uuid %s not found.' % fake_name, - e.stderr.decode()) + """Tests that "esi offer claim" properly handles being passed an + offer uuid that does not exist. + Test steps: + 1) Attempt to claim an offer that does not exist. + 2) Check that the command failed. (returned non-zero exit code) + 3) Check that the proper error message was sent to stderr.""" + fake_name = data_utils.rand_name("does-not-exist", prefix="") + e = self.assertRaises( + CommandFailed, esi.offer_claim, self.clients["child-lessee"], fake_name + ) + self.assertIn( + "Offer with name or uuid %s not found." % fake_name, e.stderr.decode() + ) @pytest.mark.negative def test_create_invalid_node(self): - """ Tests that "esi [offer/lease] create" properly handles being - passed a resource node uuid that does not exist. - Test steps: - 1) Attempt to create an offer for a node that does not exist. - 2) Check that the command failed. (returned non-zero exit code) - 3) Check that the proper error message was sent to stderr. - 4) Attempt to create a lease for a node that does not exist. - 5) Check that the command failed. (returned non-zero exit code) - 6) Check that the proper error message was sent to stderr. """ - fake_name = data_utils.rand_name('does-not-exist', prefix='') - e = self.assertRaises(CommandFailed, - esi.offer_create, - self.clients['parent-owner'], - fake_name, - resource_type='dummy_node') - self.assertIn('No such file or directory', e.stderr.decode()) + """Tests that "esi [offer/lease] create" properly handles being + passed a resource node uuid that does not exist. + Test steps: + 1) Attempt to create an offer for a node that does not exist. + 2) Check that the command failed. (returned non-zero exit code) + 3) Check that the proper error message was sent to stderr. + 4) Attempt to create a lease for a node that does not exist. + 5) Check that the command failed. (returned non-zero exit code) + 6) Check that the proper error message was sent to stderr.""" + fake_name = data_utils.rand_name("does-not-exist", prefix="") + e = self.assertRaises( + CommandFailed, + esi.offer_create, + self.clients["parent-owner"], + fake_name, + resource_type="dummy_node", + ) + self.assertIn("No such file or directory", e.stderr.decode()) - e = self.assertRaises(CommandFailed, - esi.lease_create, - self.clients['parent-owner'], - fake_name, - self.projects['child']['name'], - resource_type='dummy_node') - self.assertIn('No such file or directory', e.stderr.decode()) + e = self.assertRaises( + CommandFailed, + esi.lease_create, + self.clients["parent-owner"], + fake_name, + self.projects["child"]["name"], + resource_type="dummy_node", + ) + self.assertIn("No such file or directory", e.stderr.decode()) @pytest.mark.negative def test_create_invalid_resource_type(self): - """ Tests that "esi [offer/lease] create" properly handles being - passed a resource type that does not exist. - Test steps: - 1) Attempt to create an offer for a node with a resource type - that does not exist. - 2) Check that the command failed. (returned non-zero exit code) - 3) Check that the proper error message was sent to stderr. - 4) Attempt to create a lease on a node with a resource type - that does not exist. - 5) Check that the command failed. (returned non-zero exit code) - 6) Check that the proper error message was sent to stderr. """ - fake_node = data_utils.rand_name('does-not-exist', prefix='') - fake_type = data_utils.rand_name('does-not-exist', prefix='') + """Tests that "esi [offer/lease] create" properly handles being + passed a resource type that does not exist. + Test steps: + 1) Attempt to create an offer for a node with a resource type + that does not exist. + 2) Check that the command failed. (returned non-zero exit code) + 3) Check that the proper error message was sent to stderr. + 4) Attempt to create a lease on a node with a resource type + that does not exist. + 5) Check that the command failed. (returned non-zero exit code) + 6) Check that the proper error message was sent to stderr.""" + fake_node = data_utils.rand_name("does-not-exist", prefix="") + fake_type = data_utils.rand_name("does-not-exist", prefix="") - e = self.assertRaises(CommandFailed, - esi.offer_create, - self.clients['parent-owner'], - fake_node, - resource_type=fake_type) - self.assertIn('%s resource type unknown.' % fake_type, - e.stderr.decode()) + e = self.assertRaises( + CommandFailed, + esi.offer_create, + self.clients["parent-owner"], + fake_node, + resource_type=fake_type, + ) + self.assertIn("%s resource type unknown." % fake_type, e.stderr.decode()) - e = self.assertRaises(CommandFailed, - esi.lease_create, - self.clients['parent-owner'], - fake_node, - self.projects['child']['name'], - resource_type=fake_type) - self.assertIn('%s resource type unknown.' % fake_type, - e.stderr.decode()) + e = self.assertRaises( + CommandFailed, + esi.lease_create, + self.clients["parent-owner"], + fake_node, + self.projects["child"]["name"], + resource_type=fake_type, + ) + self.assertIn("%s resource type unknown." % fake_type, e.stderr.decode()) diff --git a/esileapclient/tests/functional/v1/test_policy.py b/esileapclient/tests/functional/v1/test_policy.py index b856c7c..e647081 100644 --- a/esileapclient/tests/functional/v1/test_policy.py +++ b/esileapclient/tests/functional/v1/test_policy.py @@ -10,188 +10,219 @@ class PolicyTests(ESIBaseTestClass): @classmethod def setUpClass(cls): super(PolicyTests, cls).setUpClass() - cls._init_dummy_project(cls, 'authorized', 'owner') - cls._init_dummy_project(cls, 'unauthorized', ['owner', 'lessee']) + cls._init_dummy_project(cls, "authorized", "owner") + cls._init_dummy_project(cls, "unauthorized", ["owner", "lessee"]) def setUp(self): super(PolicyTests, self).setUp() self.clients = PolicyTests.clients self.users = PolicyTests.users self.projects = PolicyTests.projects - self.dummy_node = DummyNode(PolicyTests.config['dummy_node_dir'], - self.projects['authorized']['id']) + self.dummy_node = DummyNode( + PolicyTests.config["dummy_node_dir"], self.projects["authorized"]["id"] + ) @pytest.mark.negative def test_offer_create_lessee(self): - """ Tests that a lessee cannot create an offer. - Test steps: - 1) Attempt to create an offer as a lessee. - 2) Check that the command failed. (returned non-zero exit code) - 3) Check that the proper error message was sent to stderr. """ - e = self.assertRaises(CommandFailed, - esi.offer_create, - self.clients['unauthorized-lessee'], - self.dummy_node.uuid, - resource_type='dummy_node') - self.assertIn('Access was denied to esi_leap:offer:create.', - e.stderr.decode()) + """Tests that a lessee cannot create an offer. + Test steps: + 1) Attempt to create an offer as a lessee. + 2) Check that the command failed. (returned non-zero exit code) + 3) Check that the proper error message was sent to stderr.""" + e = self.assertRaises( + CommandFailed, + esi.offer_create, + self.clients["unauthorized-lessee"], + self.dummy_node.uuid, + resource_type="dummy_node", + ) + self.assertIn("Access was denied to esi_leap:offer:create.", e.stderr.decode()) @pytest.mark.negative def test_create_lessee(self): - """ Tests that a lessee cannot create a lease. - Test steps: - 1) Attempt to create a lease as a lessee (using lease create). - 2) Check that the command failed. (returned non-zero exit code) - 3) Check that the proper error message was sent to stderr. """ - e = self.assertRaises(CommandFailed, - esi.lease_create, - self.clients['unauthorized-lessee'], - self.dummy_node.uuid, - self.projects['unauthorized']['name'], - resource_type='dummy_node') - self.assertIn('Access was denied to esi_leap:lease:create.', - e.stderr.decode()) + """Tests that a lessee cannot create a lease. + Test steps: + 1) Attempt to create a lease as a lessee (using lease create). + 2) Check that the command failed. (returned non-zero exit code) + 3) Check that the proper error message was sent to stderr.""" + e = self.assertRaises( + CommandFailed, + esi.lease_create, + self.clients["unauthorized-lessee"], + self.dummy_node.uuid, + self.projects["unauthorized"]["name"], + resource_type="dummy_node", + ) + self.assertIn("Access was denied to esi_leap:lease:create.", e.stderr.decode()) @pytest.mark.negative def test_offer_delete_lessee(self): - """ Tests that a lessee cannot delete an offer. - Test steps: - 1) (authorized-owner) Create an offer for an owned node for the - unauthorized project. - 2) Check that lease details were returned. - 3) (unauthorized-lessee) Attempt to delete the new offer. - 4) Check that the command failed. (returned non-zero exit code) - 5) Check that the proper error message was sent to stderr. - 6) (authorized-owner) (cleanup) Delete the offer from step 1. """ - offer = esi.offer_create(self.clients['authorized-owner'], - self.dummy_node.uuid, - lessee=self.projects['unauthorized']['name'], - resource_type='dummy_node') + """Tests that a lessee cannot delete an offer. + Test steps: + 1) (authorized-owner) Create an offer for an owned node for the + unauthorized project. + 2) Check that lease details were returned. + 3) (unauthorized-lessee) Attempt to delete the new offer. + 4) Check that the command failed. (returned non-zero exit code) + 5) Check that the proper error message was sent to stderr. + 6) (authorized-owner) (cleanup) Delete the offer from step 1.""" + offer = esi.offer_create( + self.clients["authorized-owner"], + self.dummy_node.uuid, + lessee=self.projects["unauthorized"]["name"], + resource_type="dummy_node", + ) self.assertNotEqual(offer, {}) - self.addCleanup(esi.offer_delete, - self.clients['authorized-owner'], - offer['uuid']) - - e = self.assertRaises(CommandFailed, - esi.offer_delete, - self.clients['unauthorized-lessee'], - offer['uuid']) - self.assertIn('Access was denied to offer %s.' % offer['uuid'], - e.stderr.decode()) + self.addCleanup( + esi.offer_delete, self.clients["authorized-owner"], offer["uuid"] + ) + + e = self.assertRaises( + CommandFailed, + esi.offer_delete, + self.clients["unauthorized-lessee"], + offer["uuid"], + ) + self.assertIn( + "Access was denied to offer %s." % offer["uuid"], e.stderr.decode() + ) @pytest.mark.negative def test_offer_create_unauthorized(self): - """ Tests that an owner can't create an offer for a node that they - do not own. - Test steps: - 1) (unauthorized-owner) Attempt to create an offer for the dummy - node owned by the authorized project. - 2) Check that the command failed. (returned non-zero exit code) - 3) Check that the proper error message was sent to stderr. """ - e = self.assertRaises(CommandFailed, - esi.offer_create, - self.clients['unauthorized-owner'], - self.dummy_node.uuid, - resource_type='dummy_node') - self.assertIn('Access was denied to dummy_node %s.' % - self.dummy_node.uuid, e.stderr.decode()) + """Tests that an owner can't create an offer for a node that they + do not own. + Test steps: + 1) (unauthorized-owner) Attempt to create an offer for the dummy + node owned by the authorized project. + 2) Check that the command failed. (returned non-zero exit code) + 3) Check that the proper error message was sent to stderr.""" + e = self.assertRaises( + CommandFailed, + esi.offer_create, + self.clients["unauthorized-owner"], + self.dummy_node.uuid, + resource_type="dummy_node", + ) + self.assertIn( + "Access was denied to dummy_node %s." % self.dummy_node.uuid, + e.stderr.decode(), + ) @pytest.mark.negative def test_lease_create_unauthorized(self): - """ Tests that an owner can't create a lease on a node that they - do not own. - Test steps: - 1) (unauthorized-owner) Attempt to create a lease on the dummy - node owned by the authorized project. - 2) Check that the command failed. (returned non-zero exit code) - 3) Check that the proper error message was sent to stderr. """ - e = self.assertRaises(CommandFailed, - esi.lease_create, - self.clients['unauthorized-owner'], - self.dummy_node.uuid, - self.projects['unauthorized']['name'], - resource_type='dummy_node') - self.assertIn('Access was denied to dummy_node %s.' % - self.dummy_node.uuid, e.stderr.decode()) + """Tests that an owner can't create a lease on a node that they + do not own. + Test steps: + 1) (unauthorized-owner) Attempt to create a lease on the dummy + node owned by the authorized project. + 2) Check that the command failed. (returned non-zero exit code) + 3) Check that the proper error message was sent to stderr.""" + e = self.assertRaises( + CommandFailed, + esi.lease_create, + self.clients["unauthorized-owner"], + self.dummy_node.uuid, + self.projects["unauthorized"]["name"], + resource_type="dummy_node", + ) + self.assertIn( + "Access was denied to dummy_node %s." % self.dummy_node.uuid, + e.stderr.decode(), + ) @pytest.mark.negative def test_offer_delete_unauthorized(self): - """ Tests that an owner can't delete an offer that they do not have - access to. - Test steps: - 1) (authorized-owner) Create an offer for an owned node. - 2) Check that offer details were returned. - 3) (unauthorized-owner) Attempt to delete the offer from step 1. - 4) Check that the command failed. (returned non-zero exit code) - 5) Check that the proper error message was sent to stderr. - 6) (authorized-owner) (cleanup) Delete the offer from step 1. """ - offer = esi.offer_create(self.clients['authorized-owner'], - self.dummy_node.uuid, - lessee=self.projects['authorized']['name'], - resource_type='dummy_node') + """Tests that an owner can't delete an offer that they do not have + access to. + Test steps: + 1) (authorized-owner) Create an offer for an owned node. + 2) Check that offer details were returned. + 3) (unauthorized-owner) Attempt to delete the offer from step 1. + 4) Check that the command failed. (returned non-zero exit code) + 5) Check that the proper error message was sent to stderr. + 6) (authorized-owner) (cleanup) Delete the offer from step 1.""" + offer = esi.offer_create( + self.clients["authorized-owner"], + self.dummy_node.uuid, + lessee=self.projects["authorized"]["name"], + resource_type="dummy_node", + ) self.assertNotEqual(offer, {}) - self.addCleanup(esi.offer_delete, - self.clients['authorized-owner'], - offer['uuid']) - - e = self.assertRaises(CommandFailed, - esi.offer_delete, - self.clients['unauthorized-owner'], - offer['uuid']) - self.assertIn('Access was denied to offer %s.' % offer['uuid'], - e.stderr.decode()) + self.addCleanup( + esi.offer_delete, self.clients["authorized-owner"], offer["uuid"] + ) + + e = self.assertRaises( + CommandFailed, + esi.offer_delete, + self.clients["unauthorized-owner"], + offer["uuid"], + ) + self.assertIn( + "Access was denied to offer %s." % offer["uuid"], e.stderr.decode() + ) @pytest.mark.negative def test_lease_delete_unauthorized(self): - """ Tests that an owner can't delete a lease that they do not have - access to. - Test steps: - 1) (authorized-owner) Create a lease on an owned node. - 2) Check that lease details were returned. - 3) (unauthorized-owner) Attempt to delete the lease from step 1. - 4) Check that the command failed. (returned non-zero exit code) - 5) Check that the proper error message was sent to stderr. - 6) (authorized-owner) (cleanup) Delete the lease from step 1. """ - lease = esi.lease_create(self.clients['authorized-owner'], - self.dummy_node.uuid, - self.projects['authorized']['name'], - resource_type='dummy_node') + """Tests that an owner can't delete a lease that they do not have + access to. + Test steps: + 1) (authorized-owner) Create a lease on an owned node. + 2) Check that lease details were returned. + 3) (unauthorized-owner) Attempt to delete the lease from step 1. + 4) Check that the command failed. (returned non-zero exit code) + 5) Check that the proper error message was sent to stderr. + 6) (authorized-owner) (cleanup) Delete the lease from step 1.""" + lease = esi.lease_create( + self.clients["authorized-owner"], + self.dummy_node.uuid, + self.projects["authorized"]["name"], + resource_type="dummy_node", + ) self.assertNotEqual(lease, {}) - self.addCleanup(esi.lease_delete, - self.clients['authorized-owner'], - lease['uuid']) - - e = self.assertRaises(CommandFailed, - esi.lease_delete, - self.clients['unauthorized-owner'], - lease['uuid']) - self.assertIn('Access was denied to lease %s.' % lease['uuid'], - e.stderr.decode()) + self.addCleanup( + esi.lease_delete, self.clients["authorized-owner"], lease["uuid"] + ) + + e = self.assertRaises( + CommandFailed, + esi.lease_delete, + self.clients["unauthorized-owner"], + lease["uuid"], + ) + self.assertIn( + "Access was denied to lease %s." % lease["uuid"], e.stderr.decode() + ) @pytest.mark.negative def test_offer_claim_unauthorized(self): - """ Tests that a lessee can't claim an offer that they don't have - access to. - Test steps: - 1) (authorized-owner) Create an offer for an owned node, - specifying a lessee that isn't the unauthorized project. - 2) Check that offer details were returned. - 3) (unauthorized-lessee) Attempt to claim the offer from step 1. - 4) Check that the command failed. (returned non-zero exit code) - 5) Check that the proper error message was sent to stderr. - 6) (authorized-owner) (cleanup) Delete the offer from step 1. """ - offer = esi.offer_create(self.clients['authorized-owner'], - self.dummy_node.uuid, - lessee=self.projects['authorized']['name'], - resource_type='dummy_node') + """Tests that a lessee can't claim an offer that they don't have + access to. + Test steps: + 1) (authorized-owner) Create an offer for an owned node, + specifying a lessee that isn't the unauthorized project. + 2) Check that offer details were returned. + 3) (unauthorized-lessee) Attempt to claim the offer from step 1. + 4) Check that the command failed. (returned non-zero exit code) + 5) Check that the proper error message was sent to stderr. + 6) (authorized-owner) (cleanup) Delete the offer from step 1.""" + offer = esi.offer_create( + self.clients["authorized-owner"], + self.dummy_node.uuid, + lessee=self.projects["authorized"]["name"], + resource_type="dummy_node", + ) self.assertNotEqual(offer, {}) - self.addCleanup(esi.offer_delete, - self.clients['authorized-owner'], - offer['uuid']) - - e = self.assertRaises(CommandFailed, - esi.offer_claim, - self.clients['unauthorized-lessee'], - offer['uuid']) - self.assertIn('Access was denied to offer %s.' % offer['uuid'], - e.stderr.decode()) + self.addCleanup( + esi.offer_delete, self.clients["authorized-owner"], offer["uuid"] + ) + + e = self.assertRaises( + CommandFailed, + esi.offer_claim, + self.clients["unauthorized-lessee"], + offer["uuid"], + ) + self.assertIn( + "Access was denied to offer %s." % offer["uuid"], e.stderr.decode() + ) diff --git a/esileapclient/tests/functional/v1/test_sublease.py b/esileapclient/tests/functional/v1/test_sublease.py index 10af8c5..ba6427e 100644 --- a/esileapclient/tests/functional/v1/test_sublease.py +++ b/esileapclient/tests/functional/v1/test_sublease.py @@ -10,211 +10,225 @@ class SubleaseTests(ESIBaseTestClass): @classmethod def setUpClass(cls): super(SubleaseTests, cls).setUpClass() - cls._init_dummy_project(cls, 'node', 'owner') - cls._init_dummy_project(cls, 'sublessee', 'owner') - cls._init_dummy_project(cls, 'project', 'lessee') + cls._init_dummy_project(cls, "node", "owner") + cls._init_dummy_project(cls, "sublessee", "owner") + cls._init_dummy_project(cls, "project", "lessee") def setUp(self): super(SubleaseTests, self).setUp() self.clients = SubleaseTests.clients self.users = SubleaseTests.users self.projects = SubleaseTests.projects - self.dummy_node = DummyNode(SubleaseTests.config['dummy_node_dir'], - self.projects['node']['id']) + self.dummy_node = DummyNode( + SubleaseTests.config["dummy_node_dir"], self.projects["node"]["id"] + ) @pytest.mark.slow def test_offer_create_sublease(self): - """ Tests that an owner of a project that has leased a node can - create offers for said leased node. - Test steps: - 1) (node-owner) Create a lease on an owned node, specifying - the sublessee project as the lessee. - 2) Check that offer details were returned. - 3) Wait for the esi-leap manager service to move the lease from - the created state to the active state. - 4) (sublessee-owner) Create an offer for the node leased to the - sublessee in step 1. - 5) Check that offer details were returned. - 6) (cleanup) (node-owner) Delete the offer from step 3. - 7) (cleanup) (authorized-owner) Delete the lease from step 1. """ - lease = esi.lease_create(self.clients['node-owner'], - self.dummy_node.uuid, - self.projects['sublessee']['name'], - resource_type='dummy_node') + """Tests that an owner of a project that has leased a node can + create offers for said leased node. + Test steps: + 1) (node-owner) Create a lease on an owned node, specifying + the sublessee project as the lessee. + 2) Check that offer details were returned. + 3) Wait for the esi-leap manager service to move the lease from + the created state to the active state. + 4) (sublessee-owner) Create an offer for the node leased to the + sublessee in step 1. + 5) Check that offer details were returned. + 6) (cleanup) (node-owner) Delete the offer from step 3. + 7) (cleanup) (authorized-owner) Delete the lease from step 1.""" + lease = esi.lease_create( + self.clients["node-owner"], + self.dummy_node.uuid, + self.projects["sublessee"]["name"], + resource_type="dummy_node", + ) self.assertNotEqual(lease, {}) - self.addCleanup(esi.lease_delete, - self.clients['node-owner'], - lease['uuid']) + self.addCleanup(esi.lease_delete, self.clients["node-owner"], lease["uuid"]) time.sleep(65) - offer = esi.offer_create(self.clients['sublessee-owner'], - self.dummy_node.uuid, - resource_type='dummy_node') + offer = esi.offer_create( + self.clients["sublessee-owner"], + self.dummy_node.uuid, + resource_type="dummy_node", + ) self.assertNotEqual(offer, {}) - self.addCleanup(esi.offer_delete, - self.clients['sublessee-owner'], - offer['uuid']) + self.addCleanup( + esi.offer_delete, self.clients["sublessee-owner"], offer["uuid"] + ) @pytest.mark.slow def test_lease_create_sublease(self): - """ Tests that an owner of a project that has leased a node can - create a lease on said leased node. - Test steps: - 1) (node-owner) Create a lease on an owned node, specifying - the sublessee project as the lessee. - 2) Check that offer details were returned. - 3) Wait for the esi-leap manager service to move the lease from - the created state to the active state. - 4) (sublessee-owner) Create a lease on the node leased to the - sublessee in step 1. - 5) Check that lease details were returned. - 6) (cleanup) (sublessee-owner) Delete the lease from step 3. - 7) (cleanup) (node-owner) Delete the lease from step 1. """ - lease = esi.lease_create(self.clients['node-owner'], - self.dummy_node.uuid, - self.projects['sublessee']['name'], - resource_type='dummy_node') + """Tests that an owner of a project that has leased a node can + create a lease on said leased node. + Test steps: + 1) (node-owner) Create a lease on an owned node, specifying + the sublessee project as the lessee. + 2) Check that offer details were returned. + 3) Wait for the esi-leap manager service to move the lease from + the created state to the active state. + 4) (sublessee-owner) Create a lease on the node leased to the + sublessee in step 1. + 5) Check that lease details were returned. + 6) (cleanup) (sublessee-owner) Delete the lease from step 3. + 7) (cleanup) (node-owner) Delete the lease from step 1.""" + lease = esi.lease_create( + self.clients["node-owner"], + self.dummy_node.uuid, + self.projects["sublessee"]["name"], + resource_type="dummy_node", + ) self.assertNotEqual(lease, {}) - self.addCleanup(esi.lease_delete, - self.clients['node-owner'], - lease['uuid']) + self.addCleanup(esi.lease_delete, self.clients["node-owner"], lease["uuid"]) time.sleep(65) - sublease = esi.lease_create(self.clients['sublessee-owner'], - self.dummy_node.uuid, - self.projects['project']['name'], - resource_type='dummy_node') + sublease = esi.lease_create( + self.clients["sublessee-owner"], + self.dummy_node.uuid, + self.projects["project"]["name"], + resource_type="dummy_node", + ) self.assertNotEqual(sublease, {}) - self.addCleanup(esi.lease_delete, - self.clients['sublessee-owner'], - sublease['uuid']) + self.addCleanup( + esi.lease_delete, self.clients["sublessee-owner"], sublease["uuid"] + ) @pytest.mark.slow def test_offer_claim_sublease(self): - """ Tests that an offer for a subleased node can be claimed. - Test steps: - 1) (node-owner) Create a lease on an owned node, specifying - the sublessee project as the lessee. - 2) Check that lease details were returned. - 3) Wait for the esi-leap manager service to move the lease from - the created state to the active state. - 4) (sublessee-owner) Create an offer for the node leased to the - sublessee in step 1. - 5) Check that offer details were returned. - 6) (project-lessee) Claim the offer created in step 3. - 7( Check that lease details were returned. - 8) (cleanup) (project-lessee) Delete the lease from step 5. - 9) (cleanup) (sublessee-owner) Delete the offer from step 3. - 10) (cleanup) (node-owner) Delete the lease from step 1. """ - lease = esi.lease_create(self.clients['node-owner'], - self.dummy_node.uuid, - self.projects['sublessee']['name'], - resource_type='dummy_node') + """Tests that an offer for a subleased node can be claimed. + Test steps: + 1) (node-owner) Create a lease on an owned node, specifying + the sublessee project as the lessee. + 2) Check that lease details were returned. + 3) Wait for the esi-leap manager service to move the lease from + the created state to the active state. + 4) (sublessee-owner) Create an offer for the node leased to the + sublessee in step 1. + 5) Check that offer details were returned. + 6) (project-lessee) Claim the offer created in step 3. + 7( Check that lease details were returned. + 8) (cleanup) (project-lessee) Delete the lease from step 5. + 9) (cleanup) (sublessee-owner) Delete the offer from step 3. + 10) (cleanup) (node-owner) Delete the lease from step 1.""" + lease = esi.lease_create( + self.clients["node-owner"], + self.dummy_node.uuid, + self.projects["sublessee"]["name"], + resource_type="dummy_node", + ) self.assertNotEqual(lease, {}) - self.addCleanup(esi.lease_delete, - self.clients['node-owner'], - lease['uuid']) + self.addCleanup(esi.lease_delete, self.clients["node-owner"], lease["uuid"]) time.sleep(65) - offer = esi.offer_create(self.clients['sublessee-owner'], - self.dummy_node.uuid, - resource_type='dummy_node') + offer = esi.offer_create( + self.clients["sublessee-owner"], + self.dummy_node.uuid, + resource_type="dummy_node", + ) self.assertNotEqual(offer, {}) - self.addCleanup(esi.offer_delete, - self.clients['sublessee-owner'], - offer['uuid']) + self.addCleanup( + esi.offer_delete, self.clients["sublessee-owner"], offer["uuid"] + ) - sublease = esi.offer_claim(self.clients['project-lessee'], - offer['uuid']) + sublease = esi.offer_claim(self.clients["project-lessee"], offer["uuid"]) self.assertNotEqual(sublease, {}) - self.addCleanup(esi.lease_delete, - self.clients['project-lessee'], - sublease['uuid']) + self.addCleanup( + esi.lease_delete, self.clients["project-lessee"], sublease["uuid"] + ) @pytest.mark.slow def test_offer_show_sublease_parent_deleted(self): - """ Tests that offers made for a leased node are deleted after the - node owning project deletes the original lease. - Test steps: - 1) (node-owner) Create a lease on an owned node, specifying the - sublessee project as the lessee. - 2) Check that lease details were returned. - 3) Wait for the esi-leap manager service to move the lease from - the created state to the active state. - 4) (sublessee-owner) Create an offer for the node leased to the - sublessee in step 1. - 5) Check that offer details were returned. - 6) Delete the offer created in step 1. - 7) View the details of the offer created in step 4 to ensure the - offer's status is 'deleted'. - 8) (sublessee-owner) If not, delete the offer manually. """ - lease = esi.lease_create(self.clients['node-owner'], - self.dummy_node.uuid, - self.projects['sublessee']['name'], - resource_type='dummy_node') + """Tests that offers made for a leased node are deleted after the + node owning project deletes the original lease. + Test steps: + 1) (node-owner) Create a lease on an owned node, specifying the + sublessee project as the lessee. + 2) Check that lease details were returned. + 3) Wait for the esi-leap manager service to move the lease from + the created state to the active state. + 4) (sublessee-owner) Create an offer for the node leased to the + sublessee in step 1. + 5) Check that offer details were returned. + 6) Delete the offer created in step 1. + 7) View the details of the offer created in step 4 to ensure the + offer's status is 'deleted'. + 8) (sublessee-owner) If not, delete the offer manually.""" + lease = esi.lease_create( + self.clients["node-owner"], + self.dummy_node.uuid, + self.projects["sublessee"]["name"], + resource_type="dummy_node", + ) self.assertNotEqual(lease, {}) - self.addCleanup(esi.lease_delete, - self.clients['node-owner'], - lease['uuid'], - fail_ok=True) + self.addCleanup( + esi.lease_delete, self.clients["node-owner"], lease["uuid"], fail_ok=True + ) time.sleep(65) - offer = esi.offer_create(self.clients['sublessee-owner'], - self.dummy_node.uuid, - resource_type='dummy_node') + offer = esi.offer_create( + self.clients["sublessee-owner"], + self.dummy_node.uuid, + resource_type="dummy_node", + ) self.assertNotEqual(offer, {}) - self.addCleanup(esi.offer_delete, - self.clients['sublessee-owner'], - offer['uuid'], - fail_ok=True) + self.addCleanup( + esi.offer_delete, + self.clients["sublessee-owner"], + offer["uuid"], + fail_ok=True, + ) - esi.lease_delete(self.clients['node-owner'], lease['uuid']) - details = esi.offer_show(self.clients['sublessee-owner'], - offer['uuid']) - self.assertEqual(details['status'], 'deleted') + esi.lease_delete(self.clients["node-owner"], lease["uuid"]) + details = esi.offer_show(self.clients["sublessee-owner"], offer["uuid"]) + self.assertEqual(details["status"], "deleted") @pytest.mark.slow def test_lease_show_sublease_parent_deleted(self): - """ Tests that leases made on a leased node are deleted after the - node owning project deletes the original lease. - Test steps: - 1) (node-owner) Create a lease on an owned node, specifying the - sublessee project as the lessee. - 2) Check that lease details were returned. - 3) Wait for the esi-leap manager service to move the lease from - the created state to the active state. - 4) (sublessee-owner) Create a lease on the node leased to the - sublessee in step 1. - 5) Check that lease details were returned. - 6) Delete the original lease created in step 1. - 7) View the details of the lease created in step 4 to ensure the - lease's status is 'deleted'. - 8) (sublessee-owner) If not, delete the lease manually. """ - lease = esi.lease_create(self.clients['node-owner'], - self.dummy_node.uuid, - self.projects['sublessee']['name'], - resource_type='dummy_node') + """Tests that leases made on a leased node are deleted after the + node owning project deletes the original lease. + Test steps: + 1) (node-owner) Create a lease on an owned node, specifying the + sublessee project as the lessee. + 2) Check that lease details were returned. + 3) Wait for the esi-leap manager service to move the lease from + the created state to the active state. + 4) (sublessee-owner) Create a lease on the node leased to the + sublessee in step 1. + 5) Check that lease details were returned. + 6) Delete the original lease created in step 1. + 7) View the details of the lease created in step 4 to ensure the + lease's status is 'deleted'. + 8) (sublessee-owner) If not, delete the lease manually.""" + lease = esi.lease_create( + self.clients["node-owner"], + self.dummy_node.uuid, + self.projects["sublessee"]["name"], + resource_type="dummy_node", + ) self.assertNotEqual(lease, {}) - self.addCleanup(esi.lease_delete, - self.clients['node-owner'], - lease['uuid'], - fail_ok=True) + self.addCleanup( + esi.lease_delete, self.clients["node-owner"], lease["uuid"], fail_ok=True + ) time.sleep(65) - sublease = esi.lease_create(self.clients['sublessee-owner'], - self.dummy_node.uuid, - self.projects['project']['name'], - resource_type='dummy_node') + sublease = esi.lease_create( + self.clients["sublessee-owner"], + self.dummy_node.uuid, + self.projects["project"]["name"], + resource_type="dummy_node", + ) self.assertNotEqual(sublease, {}) - self.addCleanup(esi.lease_delete, - self.clients['sublessee-owner'], - sublease['uuid'], - fail_ok=True) - - esi.lease_delete(self.clients['node-owner'], lease['uuid']) - details = esi.lease_show(self.clients['sublessee-owner'], - sublease['uuid']) - self.assertEqual(details['status'], 'deleted') + self.addCleanup( + esi.lease_delete, + self.clients["sublessee-owner"], + sublease["uuid"], + fail_ok=True, + ) + + esi.lease_delete(self.clients["node-owner"], lease["uuid"]) + details = esi.lease_show(self.clients["sublessee-owner"], sublease["uuid"]) + self.assertEqual(details["status"], "deleted") diff --git a/esileapclient/tests/functional/v1/test_time.py b/esileapclient/tests/functional/v1/test_time.py index bd031f4..0181c67 100644 --- a/esileapclient/tests/functional/v1/test_time.py +++ b/esileapclient/tests/functional/v1/test_time.py @@ -12,44 +12,42 @@ class TimeTests(ESIBaseTestClass): @classmethod def setUpClass(cls): super(TimeTests, cls).setUpClass() - cls._init_dummy_project(cls, 'main', 'owner') - cls._init_dummy_project(cls, 'subproj1', ['owner', 'lessee'], - parent='main') - cls._init_dummy_project(cls, 'subproj2', 'lessee', parent='main') + cls._init_dummy_project(cls, "main", "owner") + cls._init_dummy_project(cls, "subproj1", ["owner", "lessee"], parent="main") + cls._init_dummy_project(cls, "subproj2", "lessee", parent="main") def setUp(self): super(TimeTests, self).setUp() self.clients = TimeTests.clients self.users = TimeTests.users self.projects = TimeTests.projects - self.dummy_node = DummyNode(TimeTests.config['dummy_node_dir'], - self.projects['main']['id']) + self.dummy_node = DummyNode( + TimeTests.config["dummy_node_dir"], self.projects["main"]["id"] + ) def test_offer_claim_multiple(self): - """ Tests that more that one lessee can claim the same offer provided - that the times specified do not conflict. - Test steps: - 1) (owner) Create an offer for an owned node. - 2) Check that offer details were returned. - 3) Record what the time will be in five minutes. - 4) (subproj1) Claim the offer from step 1, starting at the time - recorded in step 3 and ending 30 minutes from then. - 5) Check that lease details were returned. - 6) (subproj2) Claim the offer from step 1, starting five minutes - after the end time of the lease created in step 4 and ending - 30 minutes from then. - 7) Check that lease details were returned. - 8) (owner) Check that both leases show up when listing leases. - 9) (subproj2) (cleanup) Delete the lease created in step 6. - 10) (subproj1) (cleanup) Delete the lease created in step 4. - 11) (owner) (cleanup) Delete the offer created in step 1. """ - offer = esi.offer_create(self.clients['main-owner'], - self.dummy_node.uuid, - resource_type='dummy_node') + """Tests that more that one lessee can claim the same offer provided + that the times specified do not conflict. + Test steps: + 1) (owner) Create an offer for an owned node. + 2) Check that offer details were returned. + 3) Record what the time will be in five minutes. + 4) (subproj1) Claim the offer from step 1, starting at the time + recorded in step 3 and ending 30 minutes from then. + 5) Check that lease details were returned. + 6) (subproj2) Claim the offer from step 1, starting five minutes + after the end time of the lease created in step 4 and ending + 30 minutes from then. + 7) Check that lease details were returned. + 8) (owner) Check that both leases show up when listing leases. + 9) (subproj2) (cleanup) Delete the lease created in step 6. + 10) (subproj1) (cleanup) Delete the lease created in step 4. + 11) (owner) (cleanup) Delete the offer created in step 1.""" + offer = esi.offer_create( + self.clients["main-owner"], self.dummy_node.uuid, resource_type="dummy_node" + ) self.assertNotEqual(offer, {}) - self.addCleanup(esi.offer_delete, - self.clients['main-owner'], - offer['uuid']) + self.addCleanup(esi.offer_delete, self.clients["main-owner"], offer["uuid"]) time_now = datetime.now() lease1_start_time = time_now + timedelta(minutes=5) @@ -57,277 +55,290 @@ def test_offer_claim_multiple(self): lease2_start_time = lease1_end_time + timedelta(minutes=5) lease2_end_time = lease2_start_time + timedelta(minutes=30) - lease1 = esi.offer_claim(self.clients['subproj1-lessee'], - offer['uuid'], - start_time=str(lease1_start_time), - end_time=str(lease1_end_time)) + lease1 = esi.offer_claim( + self.clients["subproj1-lessee"], + offer["uuid"], + start_time=str(lease1_start_time), + end_time=str(lease1_end_time), + ) self.assertNotEqual(lease1, {}) - self.addCleanup(esi.lease_delete, - self.clients['subproj1-lessee'], - lease1['uuid']) - - lease2 = esi.offer_claim(self.clients['subproj2-lessee'], - offer['uuid'], - start_time=str(lease2_start_time), - end_time=str(lease2_end_time)) + self.addCleanup( + esi.lease_delete, self.clients["subproj1-lessee"], lease1["uuid"] + ) + + lease2 = esi.offer_claim( + self.clients["subproj2-lessee"], + offer["uuid"], + start_time=str(lease2_start_time), + end_time=str(lease2_end_time), + ) self.assertNotEqual(lease2, {}) - self.addCleanup(esi.lease_delete, - self.clients['subproj2-lessee'], - lease2['uuid']) + self.addCleanup( + esi.lease_delete, self.clients["subproj2-lessee"], lease2["uuid"] + ) - listings = esi.lease_list(self.clients['main-owner']) - uuid_listings = [x['UUID'] for x in listings] + listings = esi.lease_list(self.clients["main-owner"]) + uuid_listings = [x["UUID"] for x in listings] self.assertNotEqual(listings, []) - for lease_id in lease1['uuid'], lease2['uuid']: + for lease_id in lease1["uuid"], lease2["uuid"]: self.assertIn(lease_id, uuid_listings) def test_offer_create_multiple(self): - """ Tests that more than one offer can be created for the same - resource provided that the times specified do not conflict. - Test steps: - 1) Record what the time will be in five minutes. - 2) Create an offer for an owned node, starting at the time - recorded in step 1 and ending 30 minutes from then. - 3) Check that offer details were returned. - 4) Create an offer for the same node, starting five minutes after - the end time of the offer created in step 2 and ending 30 - minutes from then. - 5) Check that offer details were returned. - 6) Check that both offers show up when listing offers. - 7) (cleanup) Delete the offer created in step 4. - 8) (cleanup) Delete the offer created in step 2. """ + """Tests that more than one offer can be created for the same + resource provided that the times specified do not conflict. + Test steps: + 1) Record what the time will be in five minutes. + 2) Create an offer for an owned node, starting at the time + recorded in step 1 and ending 30 minutes from then. + 3) Check that offer details were returned. + 4) Create an offer for the same node, starting five minutes after + the end time of the offer created in step 2 and ending 30 + minutes from then. + 5) Check that offer details were returned. + 6) Check that both offers show up when listing offers. + 7) (cleanup) Delete the offer created in step 4. + 8) (cleanup) Delete the offer created in step 2.""" time_now = datetime.now() offer1_start_time = time_now + timedelta(minutes=5) offer1_end_time = offer1_start_time + timedelta(minutes=30) offer2_start_time = offer1_end_time + timedelta(minutes=5) offer2_end_time = offer2_start_time + timedelta(minutes=30) - offer1 = esi.offer_create(self.clients['main-owner'], - self.dummy_node.uuid, - resource_type='dummy_node', - start_time=str(offer1_start_time), - end_time=str(offer1_end_time)) + offer1 = esi.offer_create( + self.clients["main-owner"], + self.dummy_node.uuid, + resource_type="dummy_node", + start_time=str(offer1_start_time), + end_time=str(offer1_end_time), + ) self.assertNotEqual(offer1, {}) - self.addCleanup(esi.offer_delete, - self.clients['main-owner'], - offer1['uuid']) - - offer2 = esi.offer_create(self.clients['main-owner'], - self.dummy_node.uuid, - resource_type='dummy_node', - start_time=str(offer2_start_time), - end_time=str(offer2_end_time)) + self.addCleanup(esi.offer_delete, self.clients["main-owner"], offer1["uuid"]) + + offer2 = esi.offer_create( + self.clients["main-owner"], + self.dummy_node.uuid, + resource_type="dummy_node", + start_time=str(offer2_start_time), + end_time=str(offer2_end_time), + ) self.assertNotEqual(offer2, {}) - self.addCleanup(esi.offer_delete, - self.clients['main-owner'], - offer2['uuid']) + self.addCleanup(esi.offer_delete, self.clients["main-owner"], offer2["uuid"]) - listings = esi.offer_list(self.clients['main-owner']) - uuid_listings = [x['UUID'] for x in listings] + listings = esi.offer_list(self.clients["main-owner"]) + uuid_listings = [x["UUID"] for x in listings] self.assertNotEqual(listings, []) - for offer_id in offer1['uuid'], offer2['uuid']: + for offer_id in offer1["uuid"], offer2["uuid"]: self.assertIn(offer_id, uuid_listings) def test_lease_create_multiple(self): - """ Tests that more than one lease can be created for the same - resource provided that the times specified do not conflict. - Test steps: - 1) Record what the time will be in five minutes. - 2) Create a lease on an owned node, starting at the time recorded - in step 1 and ending 30 minutes from then. - 3) Check that lease details were returned. - 4) Create a lease on the same node, starting five minutes after - the end time of the lease created in step 2 and ending 30 - minutes from then. - 5) Check that lease details were returned. - 6) Check that both lease show up when listing leases. - 7) (cleanup) Delete the lease created in step 4. - 8) (cleanup) Delete the lease created in step 2. """ + """Tests that more than one lease can be created for the same + resource provided that the times specified do not conflict. + Test steps: + 1) Record what the time will be in five minutes. + 2) Create a lease on an owned node, starting at the time recorded + in step 1 and ending 30 minutes from then. + 3) Check that lease details were returned. + 4) Create a lease on the same node, starting five minutes after + the end time of the lease created in step 2 and ending 30 + minutes from then. + 5) Check that lease details were returned. + 6) Check that both lease show up when listing leases. + 7) (cleanup) Delete the lease created in step 4. + 8) (cleanup) Delete the lease created in step 2.""" time_now = datetime.now() lease1_start_time = time_now + timedelta(minutes=5) lease1_end_time = lease1_start_time + timedelta(minutes=30) lease2_start_time = lease1_end_time + timedelta(minutes=5) lease2_end_time = lease2_start_time + timedelta(minutes=30) - lease1 = esi.lease_create(self.clients['main-owner'], - self.dummy_node.uuid, - self.projects['main']['name'], - resource_type='dummy_node', - start_time=str(lease1_start_time), - end_time=str(lease1_end_time)) + lease1 = esi.lease_create( + self.clients["main-owner"], + self.dummy_node.uuid, + self.projects["main"]["name"], + resource_type="dummy_node", + start_time=str(lease1_start_time), + end_time=str(lease1_end_time), + ) self.assertNotEqual(lease1, {}) - self.addCleanup(esi.lease_delete, - self.clients['main-owner'], - lease1['uuid']) - - lease2 = esi.lease_create(self.clients['main-owner'], - self.dummy_node.uuid, - self.projects['main']['name'], - resource_type='dummy_node', - start_time=str(lease2_start_time), - end_time=str(lease2_end_time)) + self.addCleanup(esi.lease_delete, self.clients["main-owner"], lease1["uuid"]) + + lease2 = esi.lease_create( + self.clients["main-owner"], + self.dummy_node.uuid, + self.projects["main"]["name"], + resource_type="dummy_node", + start_time=str(lease2_start_time), + end_time=str(lease2_end_time), + ) self.assertNotEqual(lease2, {}) - self.addCleanup(esi.lease_delete, - self.clients['main-owner'], - lease2['uuid']) + self.addCleanup(esi.lease_delete, self.clients["main-owner"], lease2["uuid"]) - listings = esi.lease_list(self.clients['main-owner']) - uuid_listings = [x['UUID'] for x in listings] + listings = esi.lease_list(self.clients["main-owner"]) + uuid_listings = [x["UUID"] for x in listings] self.assertNotEqual(listings, []) - for lease_id in lease1['uuid'], lease2['uuid']: + for lease_id in lease1["uuid"], lease2["uuid"]: self.assertIn(lease_id, uuid_listings) @pytest.mark.negative def test_offer_claim_conflict(self): - """ Tests that two lessees cannot make overlapping claims on the - same offer. - Test steps: - 1) (owner) Create an offer for an owned node. - 2) Check that offer details were returned. - 3) Record the current time. - 4) (subproj1) Claim the offer from step 1, ending 30 minutes - after the time recorded in step 3. - 5) Check that lease details were returned. - 6) (subproj2) Attempt to claim the offer from step 1, starting - 15 minutes after the time recorded in step 3, and ending 30 - minutes after that. - 7) Check that the command failed. (returned non-zero exit code) - 8) Check that the proper error message was sent to stderr. - 9) (subproj1) (cleanup) Delete the lease created in step 4. - 10) (owner) (cleanup) Delete the offer created in step 1. """ - offer = esi.offer_create(self.clients['main-owner'], - self.dummy_node.uuid, - resource_type='dummy_node') + """Tests that two lessees cannot make overlapping claims on the + same offer. + Test steps: + 1) (owner) Create an offer for an owned node. + 2) Check that offer details were returned. + 3) Record the current time. + 4) (subproj1) Claim the offer from step 1, ending 30 minutes + after the time recorded in step 3. + 5) Check that lease details were returned. + 6) (subproj2) Attempt to claim the offer from step 1, starting + 15 minutes after the time recorded in step 3, and ending 30 + minutes after that. + 7) Check that the command failed. (returned non-zero exit code) + 8) Check that the proper error message was sent to stderr. + 9) (subproj1) (cleanup) Delete the lease created in step 4. + 10) (owner) (cleanup) Delete the offer created in step 1.""" + offer = esi.offer_create( + self.clients["main-owner"], self.dummy_node.uuid, resource_type="dummy_node" + ) self.assertNotEqual(offer, {}) - self.addCleanup(esi.offer_delete, - self.clients['main-owner'], - offer['uuid']) + self.addCleanup(esi.offer_delete, self.clients["main-owner"], offer["uuid"]) time_now = datetime.now() lease1_end_time = time_now + timedelta(minutes=30) lease2_start_time = time_now + timedelta(minutes=15) lease2_end_time = lease2_start_time + timedelta(minutes=30) - lease1 = esi.offer_claim(self.clients['subproj1-lessee'], - offer['uuid'], - end_time=str(lease1_end_time)) + lease1 = esi.offer_claim( + self.clients["subproj1-lessee"], + offer["uuid"], + end_time=str(lease1_end_time), + ) self.assertNotEqual(lease1, {}) - self.addCleanup(esi.lease_delete, - self.clients['subproj1-lessee'], - lease1['uuid']) - - e = self.assertRaises(CommandFailed, - esi.offer_claim, - self.clients['subproj2-lessee'], - offer['uuid'], - start_time=str(lease2_start_time), - end_time=str(lease2_end_time)) - err = ('Offer %s has no availabilities at given time range %s, %s' % - (offer['uuid'], str(lease2_start_time), str(lease2_end_time))) + self.addCleanup( + esi.lease_delete, self.clients["subproj1-lessee"], lease1["uuid"] + ) + + e = self.assertRaises( + CommandFailed, + esi.offer_claim, + self.clients["subproj2-lessee"], + offer["uuid"], + start_time=str(lease2_start_time), + end_time=str(lease2_end_time), + ) + err = "Offer %s has no availabilities at given time range %s, %s" % ( + offer["uuid"], + str(lease2_start_time), + str(lease2_end_time), + ) self.assertIn(err, e.stderr.decode()) @pytest.mark.negative def test_offer_create_conflict(self): - """ Tests that two overlapping offers cannot be created for the - same node. - Test steps: - 1) Record the current time. - 2) Create an offer for an owned node, ending 30 minutes after the - time recorded in step 1. - 3) Check that offer details were returned. - 4) Attempt to create another offer for the same node as in step 2, - starting 15 minutes after the time recorded in step 1, and - ending 30 minutes after that. - 5) Check that the command failed. (returned non-zero exit code) - 6) Check that the proper error message was sent to stderr. - 7) (cleanup) Delete the offer created in step 2. """ + """Tests that two overlapping offers cannot be created for the + same node. + Test steps: + 1) Record the current time. + 2) Create an offer for an owned node, ending 30 minutes after the + time recorded in step 1. + 3) Check that offer details were returned. + 4) Attempt to create another offer for the same node as in step 2, + starting 15 minutes after the time recorded in step 1, and + ending 30 minutes after that. + 5) Check that the command failed. (returned non-zero exit code) + 6) Check that the proper error message was sent to stderr. + 7) (cleanup) Delete the offer created in step 2.""" time_now = datetime.now() offer1_end_time = time_now + timedelta(minutes=30) offer2_start_time = time_now + timedelta(minutes=15) offer2_end_time = offer2_start_time + timedelta(minutes=30) - offer1 = esi.offer_create(self.clients['main-owner'], - self.dummy_node.uuid, - resource_type='dummy_node', - end_time=str(offer1_end_time)) + offer1 = esi.offer_create( + self.clients["main-owner"], + self.dummy_node.uuid, + resource_type="dummy_node", + end_time=str(offer1_end_time), + ) self.assertNotEqual(offer1, {}) - self.addCleanup(esi.offer_delete, - self.clients['main-owner'], - offer1['uuid']) - - e = self.assertRaises(CommandFailed, - esi.offer_create, - self.clients['main-owner'], - self.dummy_node.uuid, - resource_type='dummy_node', - start_time=str(offer2_start_time), - end_time=str(offer2_end_time)) - self.assertIn('Time conflict for dummy_node %s.' % - self.dummy_node.uuid, - e.stderr.decode()) + self.addCleanup(esi.offer_delete, self.clients["main-owner"], offer1["uuid"]) + + e = self.assertRaises( + CommandFailed, + esi.offer_create, + self.clients["main-owner"], + self.dummy_node.uuid, + resource_type="dummy_node", + start_time=str(offer2_start_time), + end_time=str(offer2_end_time), + ) + self.assertIn( + "Time conflict for dummy_node %s." % self.dummy_node.uuid, e.stderr.decode() + ) @pytest.mark.negative def test_lease_create_conflict(self): - """ Tests that two overlapping leases cannot be created on the - same node. - Test steps: - 1) Record the current time. - 2) Create a lease on an owned node, ending 30 minutes after the - time recorded in step 1. - 3) Check that lease details were returned. - 4) Attempt to create another lease on the same node as in step 2, - starting 15 minutes after the time recorded in step 1, and - ending 30 minutes after that. - 5) Check that the command failed. (returned non-zero exit code) - 6) Check that the proper error message was sent to stderr. - 7) (cleanup) Delete the lease created in step 2. """ + """Tests that two overlapping leases cannot be created on the + same node. + Test steps: + 1) Record the current time. + 2) Create a lease on an owned node, ending 30 minutes after the + time recorded in step 1. + 3) Check that lease details were returned. + 4) Attempt to create another lease on the same node as in step 2, + starting 15 minutes after the time recorded in step 1, and + ending 30 minutes after that. + 5) Check that the command failed. (returned non-zero exit code) + 6) Check that the proper error message was sent to stderr. + 7) (cleanup) Delete the lease created in step 2.""" time_now = datetime.now() lease1_end_time = time_now + timedelta(minutes=30) lease2_start_time = time_now + timedelta(minutes=15) lease2_end_time = lease2_start_time + timedelta(minutes=30) - lease1 = esi.lease_create(self.clients['main-owner'], - self.dummy_node.uuid, - self.projects['main']['name'], - resource_type='dummy_node', - end_time=str(lease1_end_time)) + lease1 = esi.lease_create( + self.clients["main-owner"], + self.dummy_node.uuid, + self.projects["main"]["name"], + resource_type="dummy_node", + end_time=str(lease1_end_time), + ) self.assertNotEqual(lease1, {}) - self.addCleanup(esi.lease_delete, - self.clients['main-owner'], - lease1['uuid']) - - e = self.assertRaises(CommandFailed, - esi.lease_create, - self.clients['main-owner'], - self.dummy_node.uuid, - self.projects['main']['name'], - resource_type='dummy_node', - start_time=str(lease2_start_time), - end_time=str(lease2_end_time)) - self.assertIn('Time conflict for dummy_node %s.' % - self.dummy_node.uuid, - e.stderr.decode()) + self.addCleanup(esi.lease_delete, self.clients["main-owner"], lease1["uuid"]) + + e = self.assertRaises( + CommandFailed, + esi.lease_create, + self.clients["main-owner"], + self.dummy_node.uuid, + self.projects["main"]["name"], + resource_type="dummy_node", + start_time=str(lease2_start_time), + end_time=str(lease2_end_time), + ) + self.assertIn( + "Time conflict for dummy_node %s." % self.dummy_node.uuid, e.stderr.decode() + ) @pytest.mark.negative def test_offer_claim_out_of_range(self): - """ Tests to ensure offers cannot be claimed for a time period that - is outside of the range of the offer's availability. - Test steps: - 1) Record the current time. - 2) (owner) Create an offer for an owned node, starting 15 minutes - after the time recorded in step 1, and ending 30 minutes - after that. - 3) Check that offer details were returned. - 4) Repeat steps 5 thru 7 with the following ranges (times are - relative to the time recorded in step 1): - - 5 minutes after thru 20 minutes after - - 20 minutes after thru 60 minutes after - - 5 minutes after thru 60 minutes after - 5) (subproj1) Attempt to claim the offer created in step 2 for a - time range outside of what was specified during creation. - 6) Check that the command failed. (returned non-zero exit code) - 7) Check that the proper error message was sent to stderr. - 8) (owner) (cleanup) Delete the offer created in step 2. """ + """Tests to ensure offers cannot be claimed for a time period that + is outside of the range of the offer's availability. + Test steps: + 1) Record the current time. + 2) (owner) Create an offer for an owned node, starting 15 minutes + after the time recorded in step 1, and ending 30 minutes + after that. + 3) Check that offer details were returned. + 4) Repeat steps 5 thru 7 with the following ranges (times are + relative to the time recorded in step 1): + - 5 minutes after thru 20 minutes after + - 20 minutes after thru 60 minutes after + - 5 minutes after thru 60 minutes after + 5) (subproj1) Attempt to claim the offer created in step 2 for a + time range outside of what was specified during creation. + 6) Check that the command failed. (returned non-zero exit code) + 7) Check that the proper error message was sent to stderr. + 8) (owner) (cleanup) Delete the offer created in step 2.""" time_now = datetime.now() offer_start_time = time_now + timedelta(minutes=15) offer_end_time = time_now + timedelta(minutes=30) @@ -335,166 +346,180 @@ def test_offer_claim_out_of_range(self): claim_time_valid = offer_start_time + timedelta(minutes=15) claim_time_late = offer_end_time + timedelta(minutes=15) - offer = esi.offer_create(self.clients['main-owner'], - self.dummy_node.uuid, - resource_type='dummy_node', - start_time=str(offer_start_time), - end_time=str(offer_end_time)) + offer = esi.offer_create( + self.clients["main-owner"], + self.dummy_node.uuid, + resource_type="dummy_node", + start_time=str(offer_start_time), + end_time=str(offer_end_time), + ) self.assertNotEqual(offer, {}) - self.addCleanup(esi.offer_delete, - self.clients['main-owner'], - offer['uuid']) - - for (start, end) in ((claim_time_early, claim_time_valid), - (claim_time_valid, claim_time_late), - (claim_time_early, claim_time_late)): - err = ('Offer %s has no availabilities at given time range %s, %s.' - % (offer['uuid'], str(start), str(end))) - e = self.assertRaises(CommandFailed, - esi.offer_claim, - self.clients['subproj1-lessee'], - offer['uuid'], - start_time=str(start), - end_time=str(end)) + self.addCleanup(esi.offer_delete, self.clients["main-owner"], offer["uuid"]) + + for start, end in ( + (claim_time_early, claim_time_valid), + (claim_time_valid, claim_time_late), + (claim_time_early, claim_time_late), + ): + err = "Offer %s has no availabilities at given time range %s, %s." % ( + offer["uuid"], + str(start), + str(end), + ) + e = self.assertRaises( + CommandFailed, + esi.offer_claim, + self.clients["subproj1-lessee"], + offer["uuid"], + start_time=str(start), + end_time=str(end), + ) self.assertIn(err, e.stderr.decode()) @pytest.mark.negative @pytest.mark.slow def test_offer_create_sublease_out_of_range(self): - """ Tests to ensure an offer for a leased node cannot be created for - a time period outside of the original lease's availability. - Test steps: - 1) Record the current time. - 2) (main-owner) Create a lease for an owned node, ending 30 - minutes after the time recorded in step 1. - 3) Check that lease details were returned. - 4) Wait for the esi-leap manager service to move the lease from - the created state to the active state. - 5) (subproj1-owner) Attempt to create an offer on the node leased - in step 2, starting 15 minutes after the time recorded in - step 1, and ending 45 minutes after. - 6) Check that the command failed. (returned non-zero exit code) - 7) Check that the proper error message was sent to stderr. - 8) (main-owner) (cleanup) Delete the offer created in step 2. """ + """Tests to ensure an offer for a leased node cannot be created for + a time period outside of the original lease's availability. + Test steps: + 1) Record the current time. + 2) (main-owner) Create a lease for an owned node, ending 30 + minutes after the time recorded in step 1. + 3) Check that lease details were returned. + 4) Wait for the esi-leap manager service to move the lease from + the created state to the active state. + 5) (subproj1-owner) Attempt to create an offer on the node leased + in step 2, starting 15 minutes after the time recorded in + step 1, and ending 45 minutes after. + 6) Check that the command failed. (returned non-zero exit code) + 7) Check that the proper error message was sent to stderr. + 8) (main-owner) (cleanup) Delete the offer created in step 2.""" time_now = datetime.now() lease_end_time = time_now + timedelta(minutes=30) offer_start_time = time_now + timedelta(minutes=15) offer_end_time = time_now + timedelta(minutes=45) - lease = esi.lease_create(self.clients['main-owner'], - self.dummy_node.uuid, - self.projects['subproj1']['name'], - resource_type='dummy_node', - end_time=str(lease_end_time)) + lease = esi.lease_create( + self.clients["main-owner"], + self.dummy_node.uuid, + self.projects["subproj1"]["name"], + resource_type="dummy_node", + end_time=str(lease_end_time), + ) self.assertNotEqual(lease, {}) - self.addCleanup(esi.lease_delete, - self.clients['main-owner'], - lease['uuid']) + self.addCleanup(esi.lease_delete, self.clients["main-owner"], lease["uuid"]) time.sleep(65) - err = ('You do not have permissions on dummy_node %s for the time ' - 'range %s - %s.') % (self.dummy_node.uuid, - str(offer_start_time), str(offer_end_time)) - e = self.assertRaises(CommandFailed, - esi.offer_create, - self.clients['subproj1-owner'], - self.dummy_node.uuid, - resource_type='dummy_node', - start_time=str(offer_start_time), - end_time=str(offer_end_time)) + err = ( + "You do not have permissions on dummy_node %s for the time range %s - %s." + ) % (self.dummy_node.uuid, str(offer_start_time), str(offer_end_time)) + e = self.assertRaises( + CommandFailed, + esi.offer_create, + self.clients["subproj1-owner"], + self.dummy_node.uuid, + resource_type="dummy_node", + start_time=str(offer_start_time), + end_time=str(offer_end_time), + ) self.assertIn(err, e.stderr.decode()) @pytest.mark.negative @pytest.mark.slow def test_offer_expire(self): - """ Tests to ensure expired offers cannot be claimed and that they - do not show up in the list of offers after expiring. - Test steps: - 1) Record what the time will be in 30 seconds. - 2) (owner) Create an offer for an owned node that ends at the time - recorded in step 1. - 3) Check that offer details were returned and that the offer's - status is 'available'. - 4) Wait 100 seconds to allow the esi-leap manager to move the - offer from the 'available' state to the 'expired' state. - 5) (owner) Check that state of the offer from step 2 is 'expired'. - 6) (subproj1) Attempt to claim the expired offer. - 7) Check that the command failed. (returned non-zero exit code) - 8) Check that the proper error message was sent to stderr. - 9) (subproj1) Check that the offer does not show up in the list - of available offers. - 10) (owner) (cleanup) Delete the offer from step 2 if needed. """ + """Tests to ensure expired offers cannot be claimed and that they + do not show up in the list of offers after expiring. + Test steps: + 1) Record what the time will be in 30 seconds. + 2) (owner) Create an offer for an owned node that ends at the time + recorded in step 1. + 3) Check that offer details were returned and that the offer's + status is 'available'. + 4) Wait 100 seconds to allow the esi-leap manager to move the + offer from the 'available' state to the 'expired' state. + 5) (owner) Check that state of the offer from step 2 is 'expired'. + 6) (subproj1) Attempt to claim the expired offer. + 7) Check that the command failed. (returned non-zero exit code) + 8) Check that the proper error message was sent to stderr. + 9) (subproj1) Check that the offer does not show up in the list + of available offers. + 10) (owner) (cleanup) Delete the offer from step 2 if needed.""" time_now = datetime.now() offer_end_time = time_now + timedelta(seconds=30) - offer = esi.offer_create(self.clients['main-owner'], - self.dummy_node.uuid, - resource_type='dummy_node', - lessee=self.projects['subproj1']['name'], - end_time=str(offer_end_time)) + offer = esi.offer_create( + self.clients["main-owner"], + self.dummy_node.uuid, + resource_type="dummy_node", + lessee=self.projects["subproj1"]["name"], + end_time=str(offer_end_time), + ) self.assertNotEqual(offer, {}) # NOTE: this ensures the offer is deleted, ignoring failed attempts # to delete offers that expired correctly. - self.addCleanup(esi.offer_delete, - self.clients['main-owner'], - offer['uuid'], - fail_ok=True) - self.assertEqual(offer['status'], 'available') + self.addCleanup( + esi.offer_delete, self.clients["main-owner"], offer["uuid"], fail_ok=True + ) + self.assertEqual(offer["status"], "available") time.sleep(100) - details = esi.offer_show(self.clients['main-owner'], offer['uuid']) - self.assertEqual(details['status'], 'expired') + details = esi.offer_show(self.clients["main-owner"], offer["uuid"]) + self.assertEqual(details["status"], "expired") - e = self.assertRaises(CommandFailed, - esi.offer_claim, - self.clients['subproj1-lessee'], - offer['uuid']) - self.assertIn('Offer with name or uuid %s not found.' % offer['uuid'], - e.stderr.decode()) + e = self.assertRaises( + CommandFailed, + esi.offer_claim, + self.clients["subproj1-lessee"], + offer["uuid"], + ) + self.assertIn( + "Offer with name or uuid %s not found." % offer["uuid"], e.stderr.decode() + ) - listings = esi.offer_list(self.clients['subproj1-lessee']) - self.assertNotIn(offer['uuid'], [x['UUID'] for x in listings]) + listings = esi.offer_list(self.clients["subproj1-lessee"]) + self.assertNotIn(offer["uuid"], [x["UUID"] for x in listings]) @pytest.mark.negative @pytest.mark.slow def test_lease_expire(self): - """ Tests to ensure expired leases do not show up in the list of - leases after expiring. - Test steps: - 1) Record what the time will be in 30 seconds. - 2) Create an lease on an owned node that ends at the time recorded - in step 1. - 3) Check that lease details were returned and that the lease's - status is either 'created' or 'active'. - 4) Wait 100 seconds to allow the esi-leap manager to move the - lease into the 'expired' state. - 5) Check that state of the lease from step 2 is 'expired'. - 6) Check that the lease does not show up in the list - of leases. - 7) (cleanup) Delete the lease from step 2 if needed. """ + """Tests to ensure expired leases do not show up in the list of + leases after expiring. + Test steps: + 1) Record what the time will be in 30 seconds. + 2) Create an lease on an owned node that ends at the time recorded + in step 1. + 3) Check that lease details were returned and that the lease's + status is either 'created' or 'active'. + 4) Wait 100 seconds to allow the esi-leap manager to move the + lease into the 'expired' state. + 5) Check that state of the lease from step 2 is 'expired'. + 6) Check that the lease does not show up in the list + of leases. + 7) (cleanup) Delete the lease from step 2 if needed.""" time_now = datetime.now() lease_end_time = time_now + timedelta(seconds=30) - lease = esi.lease_create(self.clients['main-owner'], - self.dummy_node.uuid, - self.projects['main']['name'], - resource_type='dummy_node', - end_time=str(lease_end_time)) + lease = esi.lease_create( + self.clients["main-owner"], + self.dummy_node.uuid, + self.projects["main"]["name"], + resource_type="dummy_node", + end_time=str(lease_end_time), + ) self.assertNotEqual(lease, {}) # NOTE: this ensures the lease is deleted, ignoring failed attempts # to delete leases that expired correctly. - self.addCleanup(esi.lease_delete, - self.clients['main-owner'], - lease['uuid'], - fail_ok=True) - self.assertIn(lease['status'], ('created', 'active')) + self.addCleanup( + esi.lease_delete, self.clients["main-owner"], lease["uuid"], fail_ok=True + ) + self.assertIn(lease["status"], ("created", "active")) time.sleep(100) - details = esi.lease_show(self.clients['main-owner'], lease['uuid']) - self.assertEqual(details['status'], 'expired') + details = esi.lease_show(self.clients["main-owner"], lease["uuid"]) + self.assertEqual(details["status"], "expired") - listings = esi.lease_list(self.clients['main-owner']) - self.assertNotIn(lease['uuid'], [x['UUID'] for x in listings]) + listings = esi.lease_list(self.clients["main-owner"]) + self.assertNotIn(lease["uuid"], [x["UUID"] for x in listings]) diff --git a/esileapclient/tests/unit/common/test_base.py b/esileapclient/tests/unit/common/test_base.py index d3f9399..c9ce57a 100644 --- a/esileapclient/tests/unit/common/test_base.py +++ b/esileapclient/tests/unit/common/test_base.py @@ -18,38 +18,37 @@ FAKE_RESOURCE = { - 'uuid': '11111111-2222-3333-4444-555555555555', - 'attribute1': '1', - 'attribute2': '2', + "uuid": "11111111-2222-3333-4444-555555555555", + "attribute1": "1", + "attribute2": "2", } FAKE_RESOURCE_2 = { - 'uuid': '66666666-7777-8888-9999-000000000000', - 'attribute1': '3', - 'attribute2': '4', + "uuid": "66666666-7777-8888-9999-000000000000", + "attribute1": "3", + "attribute2": "4", } CREATE_FAKE_RESOURCE = copy.deepcopy(FAKE_RESOURCE) -del CREATE_FAKE_RESOURCE['uuid'] +del CREATE_FAKE_RESOURCE["uuid"] UPDATE_FAKE_RESOURCE = { - 'attribute1': '5', + "attribute1": "5", } INVALID_UPDATE_FAKE_RESOURCE = { - 'attribute2': '6', + "attribute2": "6", } INVALID_ATTRIBUTE_FAKE_RESOURCE = { - 'non-existent-attribute': 'bad', - 'attribute1': '1', - 'attribute2': '2', + "non-existent-attribute": "bad", + "attribute1": "1", + "attribute2": "2", } class FakeResponse(object): - def __init__(self, headers=None, body=None, status=None, - request_headers={}): + def __init__(self, headers=None, body=None, status=None, request_headers={}): """Fake object to help testing. :param headers: dict representing HTTP response headers :param body: file-like object @@ -66,22 +65,21 @@ def __init__(self, headers=None, body=None, status=None, class FakeResource(base.Resource): - fields = { - 'uuid': 'UUID', - 'attribute1': 'Attribute 1', - 'attribute2': 'Attribute 2', + "uuid": "UUID", + "attribute1": "Attribute 1", + "attribute2": "Attribute 2", } detailed_fields = { - 'uuid': 'UUID', - 'attribute1': 'Attribute 1', - 'attribute2': 'Attribute 2', - 'attribute3': 'Attribute 3', + "uuid": "UUID", + "attribute1": "Attribute 1", + "attribute2": "Attribute 2", + "attribute3": "Attribute 3", } - _creation_attributes = ['attribute1', 'attribute2'] - _update_attributes = ['attribute1'] + _creation_attributes = ["attribute1", "attribute2"] + _update_attributes = ["attribute1"] def __repr__(self): return "" % self._info @@ -89,231 +87,207 @@ def __repr__(self): class FakeResourceManager(base.Manager): resource_class = FakeResource - _resource_name = 'fakeresources' + _resource_name = "fakeresources" class ManagerTestCase(testtools.TestCase): - def test__create(self): - manager = FakeResourceManager(None) - with mock.patch.object(manager, 'api') as mock_api: - - mock_api.json_request.return_value = ( - VALID_CREATE_RESPONSE, - FAKE_RESOURCE) + with mock.patch.object(manager, "api") as mock_api: + mock_api.json_request.return_value = (VALID_CREATE_RESPONSE, FAKE_RESOURCE) resource = manager._create(**CREATE_FAKE_RESOURCE) mock_api.json_request.assert_called_once_with( - 'POST', '/v1/fakeresources', - **{'body': CREATE_FAKE_RESOURCE}) + "POST", "/v1/fakeresources", **{"body": CREATE_FAKE_RESOURCE} + ) self.assertIsInstance(resource, FakeResource) self.assertEqual(resource._info, FAKE_RESOURCE) def test__create_microversion_override(self): - manager = FakeResourceManager(None) - with mock.patch.object(manager, 'api') as mock_api: - - mock_api.json_request.return_value = ( - VALID_CREATE_RESPONSE, - FAKE_RESOURCE) + with mock.patch.object(manager, "api") as mock_api: + mock_api.json_request.return_value = (VALID_CREATE_RESPONSE, FAKE_RESOURCE) - resource = manager._create(os_esileap_api_version='1.10', - **CREATE_FAKE_RESOURCE) + resource = manager._create( + os_esileap_api_version="1.10", **CREATE_FAKE_RESOURCE + ) mock_api.json_request.assert_called_once_with( - 'POST', '/v1/fakeresources', - **{'body': CREATE_FAKE_RESOURCE, - 'headers': {'X-OpenStack-ESI-Leap-API-Version': '1.10'}}) + "POST", + "/v1/fakeresources", + **{ + "body": CREATE_FAKE_RESOURCE, + "headers": {"X-OpenStack-ESI-Leap-API-Version": "1.10"}, + }, + ) self.assertIsInstance(resource, FakeResource) self.assertEqual(resource._info, FAKE_RESOURCE) def test__create_with_invalid_attribute(self): - manager = FakeResourceManager(None) - with mock.patch.object(manager, 'api'): - + with mock.patch.object(manager, "api"): self.assertRaises( - Exception, - manager._create, - **INVALID_ATTRIBUTE_FAKE_RESOURCE) + Exception, manager._create, **INVALID_ATTRIBUTE_FAKE_RESOURCE + ) def test__update(self): manager = FakeResourceManager(None) - with mock.patch.object(manager, 'api') as mock_api: + with mock.patch.object(manager, "api") as mock_api: + mock_api.json_request.return_value = (VALID_RESPONSE, FAKE_RESOURCE) - mock_api.json_request.return_value = ( - VALID_RESPONSE, - FAKE_RESOURCE) - - resource = manager._update(FAKE_RESOURCE['uuid'], - **UPDATE_FAKE_RESOURCE) + resource = manager._update(FAKE_RESOURCE["uuid"], **UPDATE_FAKE_RESOURCE) mock_api.json_request.assert_called_once_with( - 'PATCH', '/v1/fakeresources/%s' % FAKE_RESOURCE['uuid'], - **{'body': UPDATE_FAKE_RESOURCE}) + "PATCH", + "/v1/fakeresources/%s" % FAKE_RESOURCE["uuid"], + **{"body": UPDATE_FAKE_RESOURCE}, + ) self.assertIsInstance(resource, FakeResource) self.assertEqual(resource._info, FAKE_RESOURCE) def test__update_with_invalid_attribute(self): manager = FakeResourceManager(None) - with mock.patch.object(manager, 'api'): - + with mock.patch.object(manager, "api"): self.assertRaises( Exception, manager._update, - FAKE_RESOURCE['uuid'], - **INVALID_UPDATE_FAKE_RESOURCE) + FAKE_RESOURCE["uuid"], + **INVALID_UPDATE_FAKE_RESOURCE, + ) def test__list(self): - manager = FakeResourceManager(None) - with mock.patch.object(manager, 'api') as mock_api: - + with mock.patch.object(manager, "api") as mock_api: mock_api.json_request.return_value = ( VALID_RESPONSE, - {'fakeresources': [FAKE_RESOURCE, FAKE_RESOURCE_2]}) + {"fakeresources": [FAKE_RESOURCE, FAKE_RESOURCE_2]}, + ) resources_list = manager._list(manager._path()) - mock_api.json_request.assert_called_once_with( - 'GET', '/v1/fakeresources') + mock_api.json_request.assert_called_once_with("GET", "/v1/fakeresources") - expected_resources = [FakeResource(None, FAKE_RESOURCE), - FakeResource(None, FAKE_RESOURCE_2)] + expected_resources = [ + FakeResource(None, FAKE_RESOURCE), + FakeResource(None, FAKE_RESOURCE_2), + ] self.assertIsInstance(resources_list, list) - assert (len(expected_resources) == 2) + assert len(expected_resources) == 2 self.assertIsInstance(resources_list[0], FakeResource) - self.assertEqual(resources_list[0]._info, - expected_resources[0]._info) - self.assertEqual(resources_list[1]._info, - expected_resources[1]._info) + self.assertEqual(resources_list[0]._info, expected_resources[0]._info) + self.assertEqual(resources_list[1]._info, expected_resources[1]._info) def test__list_microversion_override(self): - manager = FakeResourceManager(None) - with mock.patch.object(manager, 'api') as mock_api: - + with mock.patch.object(manager, "api") as mock_api: mock_api.json_request.return_value = ( VALID_RESPONSE, - {'fakeresources': [FAKE_RESOURCE, FAKE_RESOURCE_2]}) + {"fakeresources": [FAKE_RESOURCE, FAKE_RESOURCE_2]}, + ) - resources_list = manager._list(manager._path(), - os_esileap_api_version='1.10') + resources_list = manager._list( + manager._path(), os_esileap_api_version="1.10" + ) mock_api.json_request.assert_called_once_with( - 'GET', '/v1/fakeresources', - **{'headers': {'X-OpenStack-ESI-Leap-API-Version': '1.10'}}) + "GET", + "/v1/fakeresources", + **{"headers": {"X-OpenStack-ESI-Leap-API-Version": "1.10"}}, + ) - expected_resources = [FakeResource(None, FAKE_RESOURCE), - FakeResource(None, FAKE_RESOURCE_2)] + expected_resources = [ + FakeResource(None, FAKE_RESOURCE), + FakeResource(None, FAKE_RESOURCE_2), + ] self.assertIsInstance(resources_list, list) - assert (len(expected_resources) == 2) + assert len(expected_resources) == 2 self.assertIsInstance(resources_list[0], FakeResource) - self.assertEqual(resources_list[0]._info, - expected_resources[0]._info) - self.assertEqual(resources_list[1]._info, - expected_resources[1]._info) + self.assertEqual(resources_list[0]._info, expected_resources[0]._info) + self.assertEqual(resources_list[1]._info, expected_resources[1]._info) def test__get(self): - manager = FakeResourceManager(None) - with mock.patch.object(manager, 'api') as mock_api: + with mock.patch.object(manager, "api") as mock_api: + mock_api.json_request.return_value = (VALID_RESPONSE, FAKE_RESOURCE) - mock_api.json_request.return_value = ( - VALID_RESPONSE, - FAKE_RESOURCE) - - resource = manager._get(FAKE_RESOURCE['uuid']) + resource = manager._get(FAKE_RESOURCE["uuid"]) mock_api.json_request.assert_called_once_with( - 'GET', '/v1/fakeresources/%s' % FAKE_RESOURCE['uuid'],) + "GET", + "/v1/fakeresources/%s" % FAKE_RESOURCE["uuid"], + ) self.assertIsInstance(resource, FakeResource) self.assertEqual(FAKE_RESOURCE, resource._info) def test__get_microversion_override(self): - manager = FakeResourceManager(None) - with mock.patch.object(manager, 'api') as mock_api: + with mock.patch.object(manager, "api") as mock_api: + mock_api.json_request.return_value = (VALID_RESPONSE, FAKE_RESOURCE) - mock_api.json_request.return_value = ( - VALID_RESPONSE, - FAKE_RESOURCE) - - resource = manager._get(FAKE_RESOURCE['uuid'], - os_esileap_api_version='1.10') + resource = manager._get( + FAKE_RESOURCE["uuid"], os_esileap_api_version="1.10" + ) mock_api.json_request.assert_called_once_with( - 'GET', '/v1/fakeresources/%s' % FAKE_RESOURCE['uuid'], - **{'headers': {'X-OpenStack-ESI-Leap-API-Version': '1.10'}}) + "GET", + "/v1/fakeresources/%s" % FAKE_RESOURCE["uuid"], + **{"headers": {"X-OpenStack-ESI-Leap-API-Version": "1.10"}}, + ) self.assertIsInstance(resource, FakeResource) self.assertEqual(FAKE_RESOURCE, resource._info) def test__get_invalid_resource_id_raises(self): - manager = FakeResourceManager(None) - with mock.patch.object(manager, 'api'): - resource_ids = [[], {}, False, '', 0, None, (), 'hi'] + with mock.patch.object(manager, "api"): + resource_ids = [[], {}, False, "", 0, None, (), "hi"] for resource_id in resource_ids: - self.assertRaises(Exception, manager._get, - resource_id=resource_id) + self.assertRaises(Exception, manager._get, resource_id=resource_id) def test__delete(self): - manager = FakeResourceManager(None) - with mock.patch.object(manager, 'api') as mock_api: + with mock.patch.object(manager, "api") as mock_api: + mock_api.json_request.return_value = (VALID_RESPONSE, None) - mock_api.json_request.return_value = ( - VALID_RESPONSE, - None) - - resp = manager._delete( - resource_id=FAKE_RESOURCE['uuid']) + resp = manager._delete(resource_id=FAKE_RESOURCE["uuid"]) mock_api.json_request.assert_called_once_with( - 'DELETE', - '/v1/fakeresources/%s' % FAKE_RESOURCE['uuid']) + "DELETE", "/v1/fakeresources/%s" % FAKE_RESOURCE["uuid"] + ) self.assertEqual(resp, None) def test__delete_microversion_override(self): - manager = FakeResourceManager(None) - with mock.patch.object(manager, 'api') as mock_api: - - mock_api.json_request.return_value = ( - VALID_RESPONSE, - None) + with mock.patch.object(manager, "api") as mock_api: + mock_api.json_request.return_value = (VALID_RESPONSE, None) resp = manager._delete( - resource_id=FAKE_RESOURCE['uuid'], - os_esileap_api_version='1.10') + resource_id=FAKE_RESOURCE["uuid"], os_esileap_api_version="1.10" + ) mock_api.json_request.assert_called_once_with( - 'DELETE', - '/v1/fakeresources/%s' % FAKE_RESOURCE['uuid'], - **{'headers': {'X-OpenStack-ESI-Leap-API-Version': '1.10'}}) + "DELETE", + "/v1/fakeresources/%s" % FAKE_RESOURCE["uuid"], + **{"headers": {"X-OpenStack-ESI-Leap-API-Version": "1.10"}}, + ) self.assertEqual(resp, None) def test__delete_invalid_resource_id_raises(self): - manager = FakeResourceManager(None) - with mock.patch.object(manager, 'api'): - resource_ids = [[], {}, False, '', 0, None, (), 'hi'] + with mock.patch.object(manager, "api"): + resource_ids = [[], {}, False, "", 0, None, (), "hi"] for resource_id in resource_ids: - self.assertRaises(Exception, manager._delete, - resource_id=resource_id) + self.assertRaises(Exception, manager._delete, resource_id=resource_id) diff --git a/esileapclient/tests/unit/common/test_utils.py b/esileapclient/tests/unit/common/test_utils.py index bd802e8..bda62d2 100644 --- a/esileapclient/tests/unit/common/test_utils.py +++ b/esileapclient/tests/unit/common/test_utils.py @@ -3,89 +3,88 @@ class TestUtils(unittest.TestCase): - def setUp(self): self.nodes = [ - {'properties': {'cpus': '40', 'memory_mb': '131072'}}, - {'properties': {'cpus': '80', 'memory_mb': '262144'}}, - {'properties': {'cpus': '20', 'memory_mb': '65536'}}, + {"properties": {"cpus": "40", "memory_mb": "131072"}}, + {"properties": {"cpus": "80", "memory_mb": "262144"}}, + {"properties": {"cpus": "20", "memory_mb": "65536"}}, ] def test_convert_value(self): - self.assertEqual(utils.convert_value('10'), 10) - self.assertEqual(utils.convert_value('10.5'), 10.5) - self.assertEqual(utils.convert_value('text'), 'text') + self.assertEqual(utils.convert_value("10"), 10) + self.assertEqual(utils.convert_value("10.5"), 10.5) + self.assertEqual(utils.convert_value("text"), "text") def test_parse_property_filter(self): - key, op, value = utils.parse_property_filter('cpus>=40') - self.assertEqual(key, 'cpus') - self.assertEqual(op, utils.OPS['>=']) + key, op, value = utils.parse_property_filter("cpus>=40") + self.assertEqual(key, "cpus") + self.assertEqual(op, utils.OPS[">="]) self.assertEqual(value, 40) - key, op, value = utils.parse_property_filter('memory_mb<=131072') - self.assertEqual(key, 'memory_mb') - self.assertEqual(op, utils.OPS['<=']) + key, op, value = utils.parse_property_filter("memory_mb<=131072") + self.assertEqual(key, "memory_mb") + self.assertEqual(op, utils.OPS["<="]) self.assertEqual(value, 131072) # Test for invalid filter format self.assertRaisesRegex( ValueError, - 'Invalid property filter format: invalid_filter', - utils.parse_property_filter, 'invalid_filter' + "Invalid property filter format: invalid_filter", + utils.parse_property_filter, + "invalid_filter", ) # Test for invalid operator self.assertRaisesRegex( ValueError, - 'Invalid property filter format: cpus!40', - utils.parse_property_filter, 'cpus!40' + "Invalid property filter format: cpus!40", + utils.parse_property_filter, + "cpus!40", ) def test_node_matches_property_filters(self): filters = [ - utils.parse_property_filter('cpus>=40'), - utils.parse_property_filter('memory_mb>=131072') + utils.parse_property_filter("cpus>=40"), + utils.parse_property_filter("memory_mb>=131072"), ] - self.assertTrue(utils.node_matches_property_filters( - self.nodes[1], filters)) - self.assertFalse(utils.node_matches_property_filters( - self.nodes[2], filters)) + self.assertTrue(utils.node_matches_property_filters(self.nodes[1], filters)) + self.assertFalse(utils.node_matches_property_filters(self.nodes[2], filters)) # Test for non-existent property - filters = [utils.parse_property_filter('non_existent_property>=100')] - self.assertFalse(utils.node_matches_property_filters( - self.nodes[0], filters)) + filters = [utils.parse_property_filter("non_existent_property>=100")] + self.assertFalse(utils.node_matches_property_filters(self.nodes[0], filters)) def test_filter_nodes_by_properties(self): - properties = ['cpus>=40'] - filtered_nodes = utils.filter_nodes_by_properties( - self.nodes, properties) + properties = ["cpus>=40"] + filtered_nodes = utils.filter_nodes_by_properties(self.nodes, properties) self.assertEqual(len(filtered_nodes), 2) - properties = ['memory_mb<=131072'] - filtered_nodes = utils.filter_nodes_by_properties( - self.nodes, properties) + properties = ["memory_mb<=131072"] + filtered_nodes = utils.filter_nodes_by_properties(self.nodes, properties) self.assertEqual(len(filtered_nodes), 2) - properties = ['cpus>100'] - filtered_nodes = utils.filter_nodes_by_properties( - self.nodes, properties) + properties = ["cpus>100"] + filtered_nodes = utils.filter_nodes_by_properties(self.nodes, properties) self.assertEqual(len(filtered_nodes), 0) - properties = ['cpus<40'] - filtered_nodes = utils.filter_nodes_by_properties( - self.nodes, properties) + properties = ["cpus<40"] + filtered_nodes = utils.filter_nodes_by_properties(self.nodes, properties) self.assertEqual(len(filtered_nodes), 1) - self.assertEqual(filtered_nodes[0]['properties']['cpus'], '20') + self.assertEqual(filtered_nodes[0]["properties"]["cpus"], "20") # Test for error parsing property filter - properties = ['invalid_filter'] - with self.assertLogs('esileapclient.common.utils', level='ERROR') as c: + properties = ["invalid_filter"] + with self.assertLogs("esileapclient.common.utils", level="ERROR") as c: self.assertRaisesRegex( ValueError, "Invalid property filter format: invalid_filter", - utils.filter_nodes_by_properties, self.nodes, properties + utils.filter_nodes_by_properties, + self.nodes, + properties, + ) + self.assertTrue( + any( + "Invalid property filter format: invalid_filter" in message + for message in c.output + ) ) - self.assertTrue(any( - "Invalid property filter format: invalid_filter" in message - for message in c.output)) diff --git a/esileapclient/tests/unit/osc/test_plugin.py b/esileapclient/tests/unit/osc/test_plugin.py index b6eda4f..442c474 100644 --- a/esileapclient/tests/unit/osc/test_plugin.py +++ b/esileapclient/tests/unit/osc/test_plugin.py @@ -17,45 +17,44 @@ from esi import connection -API_VERSION = '1' +API_VERSION = "1" class FakeClientManager(object): def __init__(self): self.identity = None self.auth_ref = None - self.interface = 'public' - self._region_name = 'RegionOne' - self.session = 'fake session' - self._api_version = {'lease': API_VERSION} + self.interface = "public" + self._region_name = "RegionOne" + self.session = "fake session" + self._api_version = {"lease": API_VERSION} self._cli_options = None class MakeClientTest(testtools.TestCase): - - @mock.patch.object(connection, 'ESIConnection') + @mock.patch.object(connection, "ESIConnection") def test_make_client_explicit_version(self, mock_conn): instance = FakeClientManager() mock_conn.return_value.lease = mock.Mock() - instance._api_version = {'lease': API_VERSION} + instance._api_version = {"lease": API_VERSION} lease = plugin.make_client(instance) mock_conn.assert_called_once_with(config=None) self.assertEqual(lease, mock_conn.return_value.lease) - @mock.patch.object(connection, 'ESIConnection') + @mock.patch.object(connection, "ESIConnection") def test_make_client_latest(self, mock_conn): instance = FakeClientManager() mock_conn.return_value.lease = mock.Mock() - instance._api_version = {'lease': plugin.LATEST_VERSION} + instance._api_version = {"lease": plugin.LATEST_VERSION} lease = plugin.make_client(instance) mock_conn.assert_called_once_with(config=None) self.assertEqual(lease, mock_conn.return_value.lease) - @mock.patch.object(connection, 'ESIConnection') + @mock.patch.object(connection, "ESIConnection") def test_make_client_v1(self, mock_conn): instance = FakeClientManager() mock_conn.return_value.lease = mock.Mock() - instance._api_version = {'lease': '1'} + instance._api_version = {"lease": "1"} lease = plugin.make_client(instance) mock_conn.assert_called_once_with(config=None) self.assertEqual(lease, mock_conn.return_value.lease) diff --git a/esileapclient/tests/unit/osc/v1/base.py b/esileapclient/tests/unit/osc/v1/base.py index db7cde7..4617bf0 100644 --- a/esileapclient/tests/unit/osc/v1/base.py +++ b/esileapclient/tests/unit/osc/v1/base.py @@ -16,7 +16,6 @@ class TestESILeapCommand(utils.TestCommand): - def setUp(self): super(TestESILeapCommand, self).setUp() @@ -28,5 +27,5 @@ class FakeResource(object): def __init__(self, info): self.__name__ = type(self).__name__ self._info = info - for (k, v) in info.items(): + for k, v in info.items(): setattr(self, k, v) diff --git a/esileapclient/tests/unit/osc/v1/fakes.py b/esileapclient/tests/unit/osc/v1/fakes.py index 730f4c7..5667424 100644 --- a/esileapclient/tests/unit/osc/v1/fakes.py +++ b/esileapclient/tests/unit/osc/v1/fakes.py @@ -16,22 +16,22 @@ lease_availabilities = "[]" lease_end_time = "3000-00-00T13" lease_expire_time = "3000-00-00T13" -lease_owner = 'owner-project' +lease_owner = "owner-project" lease_owner_id = "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy" -lease_project = 'lease-project' +lease_project = "lease-project" lease_project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" lease_properties = "{}" lease_resource = "dummy-node-1213123123" lease_resource_type = "dummy_node" lease_resource_uuid = "1213123123" -lease_resource_class = 'baremetal' +lease_resource_class = "baremetal" lease_start_time = "2010" lease_fulfill_time = "2010" lease_status = "fake_status" lease_uuid = "9999999" lease_purpose = "fake_purpose" offer_uuid = "111111111" -offer_lessee = 'lease-project' +offer_lessee = "lease-project" offer_lessee_id = "zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz" offer_name = "o1" parent_lease_uuid = "parent-lease-uuid" @@ -40,84 +40,84 @@ node_uuid = "fake-uuid" node_owner = "fake-owner" event_id = 7 -event_type = 'fake.event' +event_type = "fake.event" event_time = "3000-07-01T12" -object_type = 'lease' -token_ttl = '60' +object_type = "lease" +token_ttl = "60" node_properties = { - 'cpus': '40', - 'memory_mb': '131072', - 'local_gb': '1200', - 'cpu_arch': 'x86_64', - 'vendor': 'fake-vendor', - 'cpu_model_name': 'fake-model', - 'cpu_frequency': '2000.0', - 'traits': ['trait1', 'trait2'] - } + "cpus": "40", + "memory_mb": "131072", + "local_gb": "1200", + "cpu_arch": "x86_64", + "vendor": "fake-vendor", + "cpu_model_name": "fake-model", + "cpu_frequency": "2000.0", + "traits": ["trait1", "trait2"], +} OFFER = { - 'availabilities': json.loads(lease_availabilities), - 'end_time': lease_end_time, - 'lessee': offer_lessee, - 'lessee_id': offer_lessee_id, - 'name': offer_name, - 'parent_lease_uuid': parent_lease_uuid, - 'project': lease_project, - 'project_id': lease_project_id, - 'properties': json.loads(lease_properties), - 'resource': lease_resource, - 'resource_properties': node_properties, - 'resource_type': lease_resource_type, - 'resource_uuid': lease_resource_uuid, - 'resource_class': lease_resource_class, - 'start_time': lease_start_time, - 'status': lease_status, - 'uuid': offer_uuid + "availabilities": json.loads(lease_availabilities), + "end_time": lease_end_time, + "lessee": offer_lessee, + "lessee_id": offer_lessee_id, + "name": offer_name, + "parent_lease_uuid": parent_lease_uuid, + "project": lease_project, + "project_id": lease_project_id, + "properties": json.loads(lease_properties), + "resource": lease_resource, + "resource_properties": node_properties, + "resource_type": lease_resource_type, + "resource_uuid": lease_resource_uuid, + "resource_class": lease_resource_class, + "start_time": lease_start_time, + "status": lease_status, + "uuid": offer_uuid, } LEASE = { - 'end_time': lease_end_time, - 'expire_time': lease_expire_time, - 'fulfill_time': lease_fulfill_time, - 'name': lease_name, - 'offer_uuid': offer_uuid, - 'parent_lease_uuid': parent_lease_uuid, - 'project': lease_project, - 'project_id': lease_project_id, - 'owner': lease_owner, - 'owner_id': lease_owner_id, - 'properties': json.loads(lease_properties), - 'resource': lease_resource, - 'resource_properties': node_properties, - 'resource_type': lease_resource_type, - 'resource_uuid': lease_resource_uuid, - 'resource_class': lease_resource_class, - 'start_time': lease_start_time, - 'status': lease_status, - 'uuid': lease_uuid, - 'purpose': lease_purpose, + "end_time": lease_end_time, + "expire_time": lease_expire_time, + "fulfill_time": lease_fulfill_time, + "name": lease_name, + "offer_uuid": offer_uuid, + "parent_lease_uuid": parent_lease_uuid, + "project": lease_project, + "project_id": lease_project_id, + "owner": lease_owner, + "owner_id": lease_owner_id, + "properties": json.loads(lease_properties), + "resource": lease_resource, + "resource_properties": node_properties, + "resource_type": lease_resource_type, + "resource_uuid": lease_resource_uuid, + "resource_class": lease_resource_class, + "start_time": lease_start_time, + "status": lease_status, + "uuid": lease_uuid, + "purpose": lease_purpose, } NODE = { - 'name': node_name, - 'uuid': node_uuid, - 'owner': node_owner, - 'resource_class': lease_resource_class, - 'properties': node_properties, + "name": node_name, + "uuid": node_uuid, + "owner": node_owner, + "resource_class": lease_resource_class, + "properties": node_properties, } EVENT = { - 'id': event_id, - 'event_type': event_type, - 'event_time': event_time, - 'object_type': object_type, - 'object_uuid': lease_uuid, - 'resource_type': lease_resource_type, - 'resource_uuid': lease_resource_uuid, - 'lessee_id': lease_project_id, - 'owner_id': lease_owner_id, + "id": event_id, + "event_type": event_type, + "event_time": event_time, + "object_type": object_type, + "object_uuid": lease_uuid, + "resource_type": lease_resource_type, + "resource_uuid": lease_resource_uuid, + "lessee_id": lease_project_id, + "owner_id": lease_owner_id, } CONSOLE_AUTH_TOKEN = { - 'node_uuid': node_uuid, + "node_uuid": node_uuid, } diff --git a/esileapclient/tests/unit/osc/v1/mdc/test_mdc_lease.py b/esileapclient/tests/unit/osc/v1/mdc/test_mdc_lease.py index f964d0a..873aaf4 100644 --- a/esileapclient/tests/unit/osc/v1/mdc/test_mdc_lease.py +++ b/esileapclient/tests/unit/osc/v1/mdc/test_mdc_lease.py @@ -21,7 +21,6 @@ class TestMDCLease(base.TestESILeapCommand): - def setUp(self): super(TestMDCLease, self).setUp() @@ -36,24 +35,23 @@ def setUp(self): class FakeCloudRegion(object): def __init__(self, name, region): self.name = name - self.config = {'region_name': region} + self.config = {"region_name": region} def get_session(self): return None - self.cloud1 = FakeCloudRegion('cloud1', 'regionOne') - self.cloud2 = FakeCloudRegion('cloud2', 'regionTwo') + self.cloud1 = FakeCloudRegion("cloud1", "regionOne") + self.cloud2 = FakeCloudRegion("cloud2", "regionTwo") self.lease1 = base.FakeResource(copy.deepcopy(fakes.LEASE)) self.lease2 = base.FakeResource(copy.deepcopy(fakes.LEASE)) self.cmd = mdc_lease.MDCListLease(self.app, None) - @mock.patch('openstack.config.loader.OpenStackConfig.get_all_clouds') - @mock.patch.object(connection, 'ESIConnection') + @mock.patch("openstack.config.loader.OpenStackConfig.get_all_clouds") + @mock.patch.object(connection, "ESIConnection") def test_mdc_lease_list(self, mock_conn, mock_clouds): mock_clouds.return_value = [self.cloud1, self.cloud2] mock_conn.return_value.lease = self.client_mock - self.client_mock.leases.side_effect = [[self.lease1], - [self.lease2]] + self.client_mock.leases.side_effect = [[self.lease1], [self.lease2]] arglist = [] verifylist = [] @@ -62,14 +60,16 @@ def test_mdc_lease_list(self, mock_conn, mock_clouds): columns, data = self.cmd.take_action(parsed_args) filters = { - 'status': parsed_args.status, - 'start_time': str(parsed_args.time_range[0]) if - parsed_args.time_range else None, - 'end_time': str(parsed_args.time_range[1]) if - parsed_args.time_range else None, - 'resource_type': parsed_args.resource_type, - 'resource_class': parsed_args.resource_class, - 'purpose': parsed_args.purpose, + "status": parsed_args.status, + "start_time": str(parsed_args.time_range[0]) + if parsed_args.time_range + else None, + "end_time": str(parsed_args.time_range[1]) + if parsed_args.time_range + else None, + "resource_type": parsed_args.resource_type, + "resource_class": parsed_args.resource_class, + "purpose": parsed_args.purpose, } self.client_mock.leases.assert_called_with(**filters) @@ -89,52 +89,60 @@ def test_mdc_lease_list(self, mock_conn, mock_clouds): self.assertEqual(collist, list(columns)) - datalist = (('cloud1', 'regionOne', - fakes.lease_uuid, - fakes.lease_resource, - fakes.lease_resource_class, - fakes.lease_project, - fakes.lease_start_time, - fakes.lease_end_time, - fakes.offer_uuid, - fakes.lease_status, - fakes.lease_purpose, - ), - ('cloud2', 'regionTwo', - fakes.lease_uuid, - fakes.lease_resource, - fakes.lease_resource_class, - fakes.lease_project, - fakes.lease_start_time, - fakes.lease_end_time, - fakes.offer_uuid, - fakes.lease_status, - fakes.lease_purpose, - )) + datalist = ( + ( + "cloud1", + "regionOne", + fakes.lease_uuid, + fakes.lease_resource, + fakes.lease_resource_class, + fakes.lease_project, + fakes.lease_start_time, + fakes.lease_end_time, + fakes.offer_uuid, + fakes.lease_status, + fakes.lease_purpose, + ), + ( + "cloud2", + "regionTwo", + fakes.lease_uuid, + fakes.lease_resource, + fakes.lease_resource_class, + fakes.lease_project, + fakes.lease_start_time, + fakes.lease_end_time, + fakes.offer_uuid, + fakes.lease_status, + fakes.lease_purpose, + ), + ) self.assertEqual(datalist, tuple(data)) - @mock.patch('openstack.config.loader.OpenStackConfig.get_all_clouds') - @mock.patch.object(connection, 'ESIConnection') + @mock.patch("openstack.config.loader.OpenStackConfig.get_all_clouds") + @mock.patch.object(connection, "ESIConnection") def test_mdc_lease_list_filter(self, mock_conn, mock_clouds): mock_clouds.return_value = [self.cloud1, self.cloud2] mock_conn.return_value.lease = self.client_mock self.client_mock.leases.return_value = [self.lease2] - arglist = ['--clouds', 'cloud2'] + arglist = ["--clouds", "cloud2"] verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) filters = { - 'status': parsed_args.status, - 'start_time': str(parsed_args.time_range[0]) if - parsed_args.time_range else None, - 'end_time': str(parsed_args.time_range[1]) if - parsed_args.time_range else None, - 'resource_type': parsed_args.resource_type, - 'resource_class': parsed_args.resource_class, - 'purpose': parsed_args.purpose, + "status": parsed_args.status, + "start_time": str(parsed_args.time_range[0]) + if parsed_args.time_range + else None, + "end_time": str(parsed_args.time_range[1]) + if parsed_args.time_range + else None, + "resource_type": parsed_args.resource_type, + "resource_class": parsed_args.resource_class, + "purpose": parsed_args.purpose, } self.client_mock.leases.assert_called_with(**filters) @@ -155,15 +163,19 @@ def test_mdc_lease_list_filter(self, mock_conn, mock_clouds): self.assertEqual(collist, list(columns)) - datalist = (('cloud2', 'regionTwo', - fakes.lease_uuid, - fakes.lease_resource, - fakes.lease_resource_class, - fakes.lease_project, - fakes.lease_start_time, - fakes.lease_end_time, - fakes.offer_uuid, - fakes.lease_status, - fakes.lease_purpose, - ),) + datalist = ( + ( + "cloud2", + "regionTwo", + fakes.lease_uuid, + fakes.lease_resource, + fakes.lease_resource_class, + fakes.lease_project, + fakes.lease_start_time, + fakes.lease_end_time, + fakes.offer_uuid, + fakes.lease_status, + fakes.lease_purpose, + ), + ) self.assertEqual(datalist, tuple(data)) diff --git a/esileapclient/tests/unit/osc/v1/mdc/test_mdc_offer.py b/esileapclient/tests/unit/osc/v1/mdc/test_mdc_offer.py index 0e2f343..619d00c 100644 --- a/esileapclient/tests/unit/osc/v1/mdc/test_mdc_offer.py +++ b/esileapclient/tests/unit/osc/v1/mdc/test_mdc_offer.py @@ -24,7 +24,6 @@ class TestMDCOffer(base.TestESILeapCommand): - def setUp(self): super(TestMDCOffer, self).setUp() @@ -39,24 +38,23 @@ def setUp(self): class FakeCloudRegion(object): def __init__(self, name, region): self.name = name - self.config = {'region_name': region} + self.config = {"region_name": region} def get_session(self): return None - self.cloud1 = FakeCloudRegion('cloud1', 'regionOne') - self.cloud2 = FakeCloudRegion('cloud2', 'regionTwo') + self.cloud1 = FakeCloudRegion("cloud1", "regionOne") + self.cloud2 = FakeCloudRegion("cloud2", "regionTwo") self.offer1 = base.FakeResource(copy.deepcopy(fakes.OFFER)) self.offer2 = base.FakeResource(copy.deepcopy(fakes.OFFER)) self.cmd = mdc_offer.MDCListOffer(self.app, None) - @mock.patch('openstack.config.loader.OpenStackConfig.get_all_clouds') - @mock.patch.object(connection, 'ESIConnection') + @mock.patch("openstack.config.loader.OpenStackConfig.get_all_clouds") + @mock.patch.object(connection, "ESIConnection") def test_mdc_offer_list(self, mock_conn, mock_clouds): mock_clouds.return_value = [self.cloud1, self.cloud2] mock_conn.return_value.lease = self.client_mock - self.client_mock.offers.side_effect = [[self.offer1], - [self.offer2]] + self.client_mock.offers.side_effect = [[self.offer1], [self.offer2]] arglist = [] verifylist = [] @@ -65,17 +63,21 @@ def test_mdc_offer_list(self, mock_conn, mock_clouds): columns, data = self.cmd.take_action(parsed_args) filters = { - 'status': parsed_args.status, - 'start_time': str(parsed_args.time_range[0]) if - parsed_args.time_range else None, - 'end_time': str(parsed_args.time_range[1]) if - parsed_args.time_range else None, - 'available_start_time': str(parsed_args.availability_range[0]) if - parsed_args.availability_range else None, - 'available_end_time': str(parsed_args.availability_range[1]) if - parsed_args.availability_range else None, - 'resource_type': parsed_args.resource_type, - 'resource_class': parsed_args.resource_class, + "status": parsed_args.status, + "start_time": str(parsed_args.time_range[0]) + if parsed_args.time_range + else None, + "end_time": str(parsed_args.time_range[1]) + if parsed_args.time_range + else None, + "available_start_time": str(parsed_args.availability_range[0]) + if parsed_args.availability_range + else None, + "available_end_time": str(parsed_args.availability_range[1]) + if parsed_args.availability_range + else None, + "resource_type": parsed_args.resource_type, + "resource_class": parsed_args.resource_class, } self.client_mock.offers.assert_called_with(**filters) @@ -95,53 +97,63 @@ def test_mdc_offer_list(self, mock_conn, mock_clouds): self.assertEqual(collist, list(columns)) - datalist = (('cloud1', 'regionOne', - fakes.offer_uuid, - fakes.lease_resource, - fakes.lease_resource_class, - fakes.offer_lessee, - fakes.lease_start_time, - fakes.lease_end_time, - fakes.lease_status, - json.loads(fakes.lease_availabilities), - ), - ('cloud2', 'regionTwo', - fakes.offer_uuid, - fakes.lease_resource, - fakes.lease_resource_class, - fakes.offer_lessee, - fakes.lease_start_time, - fakes.lease_end_time, - fakes.lease_status, - json.loads(fakes.lease_availabilities), - )) + datalist = ( + ( + "cloud1", + "regionOne", + fakes.offer_uuid, + fakes.lease_resource, + fakes.lease_resource_class, + fakes.offer_lessee, + fakes.lease_start_time, + fakes.lease_end_time, + fakes.lease_status, + json.loads(fakes.lease_availabilities), + ), + ( + "cloud2", + "regionTwo", + fakes.offer_uuid, + fakes.lease_resource, + fakes.lease_resource_class, + fakes.offer_lessee, + fakes.lease_start_time, + fakes.lease_end_time, + fakes.lease_status, + json.loads(fakes.lease_availabilities), + ), + ) self.assertEqual(datalist, tuple(data)) - @mock.patch('openstack.config.loader.OpenStackConfig.get_all_clouds') - @mock.patch.object(connection, 'ESIConnection') + @mock.patch("openstack.config.loader.OpenStackConfig.get_all_clouds") + @mock.patch.object(connection, "ESIConnection") def test_mdc_offer_list_filter(self, mock_conn, mock_clouds): mock_clouds.return_value = [self.cloud1, self.cloud2] mock_conn.return_value.lease = self.client_mock self.client_mock.offers.return_value = [self.offer2] - arglist = ['--clouds', 'cloud2'] + arglist = ["--clouds", "cloud2"] verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) filters = { - 'status': parsed_args.status, - 'start_time': str(parsed_args.time_range[0]) if - parsed_args.time_range else None, - 'end_time': str(parsed_args.time_range[1]) if - parsed_args.time_range else None, - 'available_start_time': str(parsed_args.availability_range[0]) if - parsed_args.availability_range else None, - 'available_end_time': str(parsed_args.availability_range[1]) if - parsed_args.availability_range else None, - 'resource_type': parsed_args.resource_type, - 'resource_class': parsed_args.resource_class, + "status": parsed_args.status, + "start_time": str(parsed_args.time_range[0]) + if parsed_args.time_range + else None, + "end_time": str(parsed_args.time_range[1]) + if parsed_args.time_range + else None, + "available_start_time": str(parsed_args.availability_range[0]) + if parsed_args.availability_range + else None, + "available_end_time": str(parsed_args.availability_range[1]) + if parsed_args.availability_range + else None, + "resource_type": parsed_args.resource_type, + "resource_class": parsed_args.resource_class, } self.client_mock.offers.assert_called_with(**filters) @@ -161,16 +173,20 @@ def test_mdc_offer_list_filter(self, mock_conn, mock_clouds): self.assertEqual(collist, list(columns)) - datalist = (('cloud2', 'regionTwo', - fakes.offer_uuid, - fakes.lease_resource, - fakes.lease_resource_class, - fakes.offer_lessee, - fakes.lease_start_time, - fakes.lease_end_time, - fakes.lease_status, - json.loads(fakes.lease_availabilities), - ),) + datalist = ( + ( + "cloud2", + "regionTwo", + fakes.offer_uuid, + fakes.lease_resource, + fakes.lease_resource_class, + fakes.offer_lessee, + fakes.lease_start_time, + fakes.lease_end_time, + fakes.lease_status, + json.loads(fakes.lease_availabilities), + ), + ) self.assertEqual(datalist, tuple(data)) @@ -181,13 +197,13 @@ def setUp(self): class FakeCloudRegion(object): def __init__(self, name, region): self.name = name - self.config = {'region_name': region} + self.config = {"region_name": region} def get_session(self): return None - self.cloud1 = FakeCloudRegion('cloud1', 'regionOne') - self.cloud2 = FakeCloudRegion('cloud2', 'regionTwo') + self.cloud1 = FakeCloudRegion("cloud1", "regionOne") + self.cloud2 = FakeCloudRegion("cloud2", "regionTwo") self.offer1 = base.FakeResource(copy.deepcopy(fakes.OFFER)) self.offer2 = base.FakeResource(copy.deepcopy(fakes.OFFER)) self.offer3 = base.FakeResource(copy.deepcopy(fakes.OFFER)) @@ -196,28 +212,33 @@ def get_session(self): self.lease3 = base.FakeResource(copy.deepcopy(fakes.LEASE)) self.cmd = mdc_offer.MDCClaimOffer(self.app, None) - @mock.patch('openstack.config.loader.OpenStackConfig.get_all_clouds') - @mock.patch.object(connection, 'ESIConnection') + @mock.patch("openstack.config.loader.OpenStackConfig.get_all_clouds") + @mock.patch.object(connection, "ESIConnection") def test_mdc_offer_claim(self, mock_conn, mock_clouds): mock_clouds.return_value = [self.cloud1, self.cloud2] mock_conn.return_value.lease = self.client_mock - self.client_mock.offers.side_effect = [[self.offer1, self.offer2], - [self.offer3]] - self.client_mock.claim_offer.side_effect = [self.lease1, self.lease2, - self.lease3] + self.client_mock.offers.side_effect = [ + [self.offer1, self.offer2], + [self.offer3], + ] + self.client_mock.claim_offer.side_effect = [ + self.lease1, + self.lease2, + self.lease3, + ] - arglist = ['3', fakes.lease_start_time, fakes.lease_end_time] + arglist = ["3", fakes.lease_start_time, fakes.lease_end_time] verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) list_filters = { - 'status': 'available', - 'available_start_time': str(parsed_args.start_time), - 'available_end_time': str(parsed_args.end_time), - 'resource_type': parsed_args.resource_type, - 'resource_class': parsed_args.resource_class, + "status": "available", + "available_start_time": str(parsed_args.start_time), + "available_end_time": str(parsed_args.end_time), + "resource_type": parsed_args.resource_type, + "resource_class": parsed_args.resource_class, } self.client_mock.offers.assert_called_with(**list_filters) @@ -225,7 +246,8 @@ def test_mdc_offer_claim(self, mock_conn, mock_clouds): self.client_mock.claim_offer.assert_called_with( fakes.offer_uuid, start_time=str(parsed_args.start_time), - end_time=str(parsed_args.end_time)) + end_time=str(parsed_args.end_time), + ) collist = [ "Cloud", @@ -243,62 +265,72 @@ def test_mdc_offer_claim(self, mock_conn, mock_clouds): self.assertEqual(collist, list(columns)) - cloud1_lease = ('cloud1', 'regionOne', - fakes.lease_uuid, - fakes.lease_resource, - fakes.lease_resource_class, - fakes.lease_project, - fakes.lease_start_time, - fakes.lease_end_time, - fakes.offer_uuid, - fakes.lease_status, - fakes.lease_purpose - ) - cloud2_lease = ('cloud2', 'regionTwo', - fakes.lease_uuid, - fakes.lease_resource, - fakes.lease_resource_class, - fakes.lease_project, - fakes.lease_start_time, - fakes.lease_end_time, - fakes.offer_uuid, - fakes.lease_status, - fakes.lease_purpose - ) + cloud1_lease = ( + "cloud1", + "regionOne", + fakes.lease_uuid, + fakes.lease_resource, + fakes.lease_resource_class, + fakes.lease_project, + fakes.lease_start_time, + fakes.lease_end_time, + fakes.offer_uuid, + fakes.lease_status, + fakes.lease_purpose, + ) + cloud2_lease = ( + "cloud2", + "regionTwo", + fakes.lease_uuid, + fakes.lease_resource, + fakes.lease_resource_class, + fakes.lease_project, + fakes.lease_start_time, + fakes.lease_end_time, + fakes.offer_uuid, + fakes.lease_status, + fakes.lease_purpose, + ) parsed_data = tuple(data) self.assertEqual(3, len(parsed_data)) self.assertEqual(2, parsed_data.count(cloud1_lease)) self.assertEqual(1, parsed_data.count(cloud2_lease)) - @mock.patch('openstack.config.loader.OpenStackConfig.get_all_clouds') - @mock.patch.object(connection, 'ESIConnection') + @mock.patch("openstack.config.loader.OpenStackConfig.get_all_clouds") + @mock.patch.object(connection, "ESIConnection") def test_mdc_offer_claim_filter(self, mock_conn, mock_clouds): mock_clouds.return_value = [self.cloud1, self.cloud2] mock_conn.return_value.lease = self.client_mock self.client_mock.offers.return_value = [self.offer1, self.offer2] self.client_mock.claim_offer.side_effect = [self.lease1, self.lease2] - arglist = ['2', fakes.lease_start_time, fakes.lease_end_time, - '--clouds', 'cloud1'] + arglist = [ + "2", + fakes.lease_start_time, + fakes.lease_end_time, + "--clouds", + "cloud1", + ] verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) list_filters = { - 'status': 'available', - 'available_start_time': str(parsed_args.start_time), - 'available_end_time': str(parsed_args.end_time), - 'resource_type': parsed_args.resource_type, - 'resource_class': parsed_args.resource_class, + "status": "available", + "available_start_time": str(parsed_args.start_time), + "available_end_time": str(parsed_args.end_time), + "resource_type": parsed_args.resource_type, + "resource_class": parsed_args.resource_class, } self.client_mock.offers.assert_called_with(**list_filters) self.client_mock.claim_offer.assert_called_with( fakes.offer_uuid, start_time=str(parsed_args.start_time), - end_time=str(parsed_args.end_time)) + end_time=str(parsed_args.end_time), + ) collist = [ "Cloud", @@ -316,43 +348,46 @@ def test_mdc_offer_claim_filter(self, mock_conn, mock_clouds): self.assertEqual(collist, list(columns)) - cloud1_lease = ('cloud1', 'regionOne', - fakes.lease_uuid, - fakes.lease_resource, - fakes.lease_resource_class, - fakes.lease_project, - fakes.lease_start_time, - fakes.lease_end_time, - fakes.offer_uuid, - fakes.lease_status, - fakes.lease_purpose, - ) + cloud1_lease = ( + "cloud1", + "regionOne", + fakes.lease_uuid, + fakes.lease_resource, + fakes.lease_resource_class, + fakes.lease_project, + fakes.lease_start_time, + fakes.lease_end_time, + fakes.offer_uuid, + fakes.lease_status, + fakes.lease_purpose, + ) parsed_data = tuple(data) self.assertEqual(2, len(parsed_data)) self.assertEqual(2, parsed_data.count(cloud1_lease)) - @mock.patch('openstack.config.loader.OpenStackConfig.get_all_clouds') - @mock.patch.object(connection, 'ESIConnection') + @mock.patch("openstack.config.loader.OpenStackConfig.get_all_clouds") + @mock.patch.object(connection, "ESIConnection") def test_mdc_offer_claim_not_enough_offers(self, mock_conn, mock_clouds): mock_clouds.return_value = [self.cloud1, self.cloud2] mock_conn.return_value.lease = self.client_mock - self.client_mock.offers.side_effect = [[self.offer1, self.offer2], - [self.offer3]] + self.client_mock.offers.side_effect = [ + [self.offer1, self.offer2], + [self.offer3], + ] - arglist = ['4', fakes.lease_start_time, fakes.lease_end_time] + arglist = ["4", fakes.lease_start_time, fakes.lease_end_time] verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - self.assertRaises(exceptions.CommandError, - self.cmd.take_action, parsed_args) + self.assertRaises(exceptions.CommandError, self.cmd.take_action, parsed_args) list_filters = { - 'status': 'available', - 'available_start_time': str(parsed_args.start_time), - 'available_end_time': str(parsed_args.end_time), - 'resource_type': parsed_args.resource_type, - 'resource_class': parsed_args.resource_class, + "status": "available", + "available_start_time": str(parsed_args.start_time), + "available_end_time": str(parsed_args.end_time), + "resource_type": parsed_args.resource_type, + "resource_class": parsed_args.resource_class, } self.client_mock.offers.assert_called_with(**list_filters) diff --git a/esileapclient/tests/unit/osc/v1/test_console_auth_token.py b/esileapclient/tests/unit/osc/v1/test_console_auth_token.py index ff38d53..8627efd 100644 --- a/esileapclient/tests/unit/osc/v1/test_console_auth_token.py +++ b/esileapclient/tests/unit/osc/v1/test_console_auth_token.py @@ -18,7 +18,6 @@ class TestConsoleAuthToken(base.TestESILeapCommand): - def setUp(self): super(TestConsoleAuthToken, self).setUp() @@ -27,34 +26,29 @@ def setUp(self): class TestCreateConsoleAuthToken(TestConsoleAuthToken): - def setUp(self): super(TestCreateConsoleAuthToken, self).setUp() - self.client_mock.create_console_auth_token.return_value = ( - base.FakeResource(copy.deepcopy(fakes.CONSOLE_AUTH_TOKEN)) + self.client_mock.create_console_auth_token.return_value = base.FakeResource( + copy.deepcopy(fakes.CONSOLE_AUTH_TOKEN) ) # Get the command object to test self.cmd = console_auth_token.CreateConsoleAuthToken(self.app, None) def test_console_auth_token_create(self): - arglist = [fakes.node_uuid, '--token-ttl', fakes.token_ttl] + arglist = [fakes.node_uuid, "--token-ttl", fakes.token_ttl] verifylist = [ - ('node_uuid_or_name', fakes.node_uuid), - ('token_ttl', fakes.token_ttl) + ("node_uuid_or_name", fakes.node_uuid), + ("token_ttl", fakes.token_ttl), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) self.cmd.take_action(parsed_args) - args = { - 'node_uuid_or_name': fakes.node_uuid, - 'token_ttl': fakes.token_ttl - } + args = {"node_uuid_or_name": fakes.node_uuid, "token_ttl": fakes.token_ttl} - self.client_mock.create_console_auth_token.assert_called_once_with( - **args) + self.client_mock.create_console_auth_token.assert_called_once_with(**args) class TestConsoleAuthTokenDelete(TestConsoleAuthToken): @@ -65,10 +59,11 @@ def setUp(self): def test_console_auth_token_delete(self): arglist = [fakes.node_uuid] - verifylist = [('node_uuid_or_name', fakes.node_uuid)] + verifylist = [("node_uuid_or_name", fakes.node_uuid)] parsed_args = self.check_parser(self.cmd, arglist, verifylist) self.cmd.take_action(parsed_args) self.client_mock.delete_console_auth_token.assert_called_once_with( - fakes.node_uuid) + fakes.node_uuid + ) diff --git a/esileapclient/tests/unit/osc/v1/test_event.py b/esileapclient/tests/unit/osc/v1/test_event.py index 6325d21..339161e 100644 --- a/esileapclient/tests/unit/osc/v1/test_event.py +++ b/esileapclient/tests/unit/osc/v1/test_event.py @@ -18,7 +18,6 @@ class TestEvent(base.TestESILeapCommand): - def setUp(self): super(TestEvent, self).setUp() @@ -27,7 +26,6 @@ def setUp(self): class TestEventList(TestEvent): - def setUp(self): super(TestEventList, self).setUp() @@ -44,12 +42,12 @@ def test_event_list(self): columns, data = self.cmd.take_action(parsed_args) filters = { - 'lessee_or_owner_id': parsed_args.project_id, - 'last_event_id': parsed_args.last_event_id, - 'last_event_time': parsed_args.last_event_time, - 'event_type': parsed_args.event_type, - 'resource_type': parsed_args.resource_type, - 'resource_uuid': parsed_args.resource_uuid, + "lessee_or_owner_id": parsed_args.project_id, + "last_event_id": parsed_args.last_event_id, + "last_event_time": parsed_args.last_event_time, + "event_type": parsed_args.event_type, + "resource_type": parsed_args.resource_type, + "resource_uuid": parsed_args.resource_uuid, } self.client_mock.events.assert_called_with(**filters) @@ -68,14 +66,17 @@ def test_event_list(self): self.assertEqual(collist, list(columns)) - datalist = ((fakes.event_id, - fakes.event_type, - fakes.event_time, - fakes.object_type, - fakes.lease_uuid, - fakes.lease_resource_type, - fakes.lease_resource_uuid, - fakes.lease_project_id, - fakes.lease_owner_id, - ),) + datalist = ( + ( + fakes.event_id, + fakes.event_type, + fakes.event_time, + fakes.object_type, + fakes.lease_uuid, + fakes.lease_resource_type, + fakes.lease_resource_uuid, + fakes.lease_project_id, + fakes.lease_owner_id, + ), + ) self.assertEqual(datalist, tuple(data)) diff --git a/esileapclient/tests/unit/osc/v1/test_lease.py b/esileapclient/tests/unit/osc/v1/test_lease.py index f018ac0..c27f764 100644 --- a/esileapclient/tests/unit/osc/v1/test_lease.py +++ b/esileapclient/tests/unit/osc/v1/test_lease.py @@ -21,7 +21,6 @@ class TestLease(base.TestESILeapCommand): - def setUp(self): super(TestLease, self).setUp() @@ -30,39 +29,43 @@ def setUp(self): class TestCreateLease(TestLease): - def setUp(self): super(TestCreateLease, self).setUp() - self.client_mock.create_lease.return_value = ( - base.FakeResource(copy.deepcopy(fakes.LEASE)) + self.client_mock.create_lease.return_value = base.FakeResource( + copy.deepcopy(fakes.LEASE) ) # Get the command object to test self.cmd = lease.CreateLease(self.app, None) def test_lease_create(self): - arglist = [ fakes.lease_resource_uuid, fakes.lease_project_id, - '--end-time', fakes.lease_end_time, - '--name', fakes.lease_name, - '--properties', fakes.lease_properties, - '--resource-type', fakes.lease_resource_type, - '--start-time', fakes.lease_start_time, - '--purpose', fakes.lease_purpose, + "--end-time", + fakes.lease_end_time, + "--name", + fakes.lease_name, + "--properties", + fakes.lease_properties, + "--resource-type", + fakes.lease_resource_type, + "--start-time", + fakes.lease_start_time, + "--purpose", + fakes.lease_purpose, ] verifylist = [ - ('end_time', fakes.lease_end_time), - ('name', fakes.lease_name), - ('project_id', fakes.lease_project_id), - ('properties', fakes.lease_properties), - ('resource_type', fakes.lease_resource_type), - ('resource_uuid', fakes.lease_resource_uuid), - ('start_time', fakes.lease_start_time), - ('purpose', fakes.lease_purpose), + ("end_time", fakes.lease_end_time), + ("name", fakes.lease_name), + ("project_id", fakes.lease_project_id), + ("properties", fakes.lease_properties), + ("resource_type", fakes.lease_resource_type), + ("resource_uuid", fakes.lease_resource_uuid), + ("start_time", fakes.lease_start_time), + ("purpose", fakes.lease_purpose), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -70,40 +73,37 @@ def test_lease_create(self): self.cmd.take_action(parsed_args) args = { - 'resource_type': fakes.lease_resource_type, - 'resource_uuid': fakes.lease_resource_uuid, - 'project_id': fakes.lease_project_id, - 'end_time': fakes.lease_end_time, - 'name': fakes.lease_name, - 'properties': json.loads(fakes.lease_properties), - 'start_time': fakes.lease_start_time, - 'purpose': fakes.lease_purpose, + "resource_type": fakes.lease_resource_type, + "resource_uuid": fakes.lease_resource_uuid, + "project_id": fakes.lease_project_id, + "end_time": fakes.lease_end_time, + "name": fakes.lease_name, + "properties": json.loads(fakes.lease_properties), + "start_time": fakes.lease_start_time, + "purpose": fakes.lease_purpose, } self.client_mock.create_lease.assert_called_once_with(**args) class TestUpdateLease(TestLease): - def setUp(self): super(TestUpdateLease, self).setUp() lease_return = base.FakeResource(copy.deepcopy(fakes.LEASE)) - self.client_mock.update_lease.return_value = ( - dict(lease_return.__dict__) - ) + self.client_mock.update_lease.return_value = dict(lease_return.__dict__) # Get the command object to test self.cmd = lease.UpdateLease(self.app, None) def test_lease_update(self): - arglist = [ fakes.lease_uuid, - '--end-time', fakes.lease_end_time, + "--end-time", + fakes.lease_end_time, ] verifylist = [ - ('uuid', fakes.lease_uuid), + ("uuid", fakes.lease_uuid), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -111,18 +111,22 @@ def test_lease_update(self): self.cmd.take_action(parsed_args) self.client_mock.update_lease.assert_called_once_with( - fakes.lease_uuid, end_time=fakes.lease_end_time) + fakes.lease_uuid, end_time=fakes.lease_end_time + ) def test_update_show_no_id(self): arglist = [] verifylist = [] - self.assertRaises(osctestutils.ParserException, - self.check_parser, - self.cmd, arglist, verifylist) + self.assertRaises( + osctestutils.ParserException, + self.check_parser, + self.cmd, + arglist, + verifylist, + ) class TestLeaseList(TestLease): - def setUp(self): super(TestLeaseList, self).setUp() @@ -139,19 +143,21 @@ def test_lease_list(self): columns, data = self.cmd.take_action(parsed_args) filters = { - 'status': parsed_args.status, - 'offer_uuid': parsed_args.offer_uuid, - 'start_time': str(parsed_args.time_range[0]) if - parsed_args.time_range else None, - 'end_time': str(parsed_args.time_range[1]) if - parsed_args.time_range else None, - 'project_id': parsed_args.project_id, - 'owner_id': parsed_args.owner_id, - 'view': 'all' if parsed_args.all else None, - 'resource_type': parsed_args.resource_type, - 'resource_uuid': parsed_args.resource_uuid, - 'resource_class': parsed_args.resource_class, - 'purpose': parsed_args.purpose + "status": parsed_args.status, + "offer_uuid": parsed_args.offer_uuid, + "start_time": str(parsed_args.time_range[0]) + if parsed_args.time_range + else None, + "end_time": str(parsed_args.time_range[1]) + if parsed_args.time_range + else None, + "project_id": parsed_args.project_id, + "owner_id": parsed_args.owner_id, + "view": "all" if parsed_args.all else None, + "resource_type": parsed_args.resource_type, + "resource_uuid": parsed_args.resource_uuid, + "resource_class": parsed_args.resource_class, + "purpose": parsed_args.purpose, } self.client_mock.leases.assert_called_with(**filters) @@ -170,128 +176,140 @@ def test_lease_list(self): self.assertEqual(collist, list(columns)) - datalist = ((fakes.lease_uuid, - fakes.lease_resource, - fakes.lease_resource_class, - fakes.lease_project, - fakes.lease_start_time, - fakes.lease_end_time, - fakes.offer_uuid, - fakes.lease_status, - fakes.lease_purpose - ),) + datalist = ( + ( + fakes.lease_uuid, + fakes.lease_resource, + fakes.lease_resource_class, + fakes.lease_project, + fakes.lease_start_time, + fakes.lease_end_time, + fakes.offer_uuid, + fakes.lease_status, + fakes.lease_purpose, + ), + ) self.assertEqual(datalist, tuple(data)) - @mock.patch('esileapclient.common.utils.filter_nodes_by_properties') + @mock.patch("esileapclient.common.utils.filter_nodes_by_properties") def test_lease_list_with_property_filter(self, mock_filter_nodes): - arglist = ['--property', 'cpus>=40'] - verifylist = [('properties', ['cpus>=40'])] + arglist = ["--property", "cpus>=40"] + verifylist = [("properties", ["cpus>=40"])] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) filters = { - 'status': parsed_args.status, - 'offer_uuid': parsed_args.offer_uuid, - 'start_time': str(parsed_args.time_range[0]) if - parsed_args.time_range else None, - 'end_time': str(parsed_args.time_range[1]) if - parsed_args.time_range else None, - 'project_id': parsed_args.project_id, - 'owner_id': parsed_args.owner_id, - 'view': 'all' if parsed_args.all else None, - 'resource_type': parsed_args.resource_type, - 'resource_uuid': parsed_args.resource_uuid, - 'resource_class': parsed_args.resource_class, - 'purpose': parsed_args.purpose + "status": parsed_args.status, + "offer_uuid": parsed_args.offer_uuid, + "start_time": str(parsed_args.time_range[0]) + if parsed_args.time_range + else None, + "end_time": str(parsed_args.time_range[1]) + if parsed_args.time_range + else None, + "project_id": parsed_args.project_id, + "owner_id": parsed_args.owner_id, + "view": "all" if parsed_args.all else None, + "resource_type": parsed_args.resource_type, + "resource_uuid": parsed_args.resource_uuid, + "resource_class": parsed_args.resource_class, + "purpose": parsed_args.purpose, } self.client_mock.leases.assert_called_with(**filters) mock_filter_nodes.assert_called_with(mock.ANY, parsed_args.properties) def test_lease_list_long(self): - arglist = ['--long'] - verifylist = [('long', True)] + arglist = ["--long"] + verifylist = [("long", True)] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) filters = { - 'status': parsed_args.status, - 'offer_uuid': parsed_args.offer_uuid, - 'start_time': str(parsed_args.time_range[0]) if - parsed_args.time_range else None, - 'end_time': str(parsed_args.time_range[1]) if - parsed_args.time_range else None, - 'project_id': parsed_args.project_id, - 'owner_id': parsed_args.owner_id, - 'view': 'all' if parsed_args.all else None, - 'resource_type': parsed_args.resource_type, - 'resource_uuid': parsed_args.resource_uuid, - 'resource_class': parsed_args.resource_class, - 'purpose': parsed_args.purpose + "status": parsed_args.status, + "offer_uuid": parsed_args.offer_uuid, + "start_time": str(parsed_args.time_range[0]) + if parsed_args.time_range + else None, + "end_time": str(parsed_args.time_range[1]) + if parsed_args.time_range + else None, + "project_id": parsed_args.project_id, + "owner_id": parsed_args.owner_id, + "view": "all" if parsed_args.all else None, + "resource_type": parsed_args.resource_type, + "resource_uuid": parsed_args.resource_uuid, + "resource_class": parsed_args.resource_class, + "purpose": parsed_args.purpose, } self.client_mock.leases.assert_called_with(**filters) long_collist = [ - 'UUID', - 'Resource', - 'Resource Class', - 'Resource Properties', - 'Project', - 'Start Time', - 'End Time', - 'Expire Time', - 'Fulfill Time', - 'Offer UUID', - 'Owner', - 'Parent Lease UUID', - 'Status', - 'Purpose' + "UUID", + "Resource", + "Resource Class", + "Resource Properties", + "Project", + "Start Time", + "End Time", + "Expire Time", + "Fulfill Time", + "Offer UUID", + "Owner", + "Parent Lease UUID", + "Status", + "Purpose", ] self.assertEqual(long_collist, list(columns)) - datalist = ((fakes.lease_uuid, - fakes.lease_resource, - fakes.lease_resource_class, - fakes.node_properties, - fakes.lease_project, - fakes.lease_start_time, - fakes.lease_end_time, - fakes.lease_expire_time, - fakes.lease_fulfill_time, - fakes.offer_uuid, - fakes.lease_owner, - fakes.parent_lease_uuid, - fakes.lease_status, - fakes.lease_purpose, - ),) + datalist = ( + ( + fakes.lease_uuid, + fakes.lease_resource, + fakes.lease_resource_class, + fakes.node_properties, + fakes.lease_project, + fakes.lease_start_time, + fakes.lease_end_time, + fakes.lease_expire_time, + fakes.lease_fulfill_time, + fakes.offer_uuid, + fakes.lease_owner, + fakes.parent_lease_uuid, + fakes.lease_status, + fakes.lease_purpose, + ), + ) self.assertEqual(datalist, tuple(data)) - @mock.patch('esileapclient.common.utils.filter_nodes_by_properties') + @mock.patch("esileapclient.common.utils.filter_nodes_by_properties") def test_lease_list_long_with_property_filter(self, mock_filter_nodes): - arglist = ['--long', '--property', 'memory_mb<=262144'] - verifylist = [('long', True), ('properties', ['memory_mb<=262144'])] + arglist = ["--long", "--property", "memory_mb<=262144"] + verifylist = [("long", True), ("properties", ["memory_mb<=262144"])] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) filters = { - 'status': parsed_args.status, - 'offer_uuid': parsed_args.offer_uuid, - 'start_time': str(parsed_args.time_range[0]) if - parsed_args.time_range else None, - 'end_time': str(parsed_args.time_range[1]) if - parsed_args.time_range else None, - 'project_id': parsed_args.project_id, - 'owner_id': parsed_args.owner_id, - 'view': 'all' if parsed_args.all else None, - 'resource_type': parsed_args.resource_type, - 'resource_uuid': parsed_args.resource_uuid, - 'resource_class': parsed_args.resource_class, - 'purpose': parsed_args.purpose + "status": parsed_args.status, + "offer_uuid": parsed_args.offer_uuid, + "start_time": str(parsed_args.time_range[0]) + if parsed_args.time_range + else None, + "end_time": str(parsed_args.time_range[1]) + if parsed_args.time_range + else None, + "project_id": parsed_args.project_id, + "owner_id": parsed_args.owner_id, + "view": "all" if parsed_args.all else None, + "resource_type": parsed_args.resource_type, + "resource_uuid": parsed_args.resource_uuid, + "resource_class": parsed_args.resource_class, + "purpose": parsed_args.purpose, } self.client_mock.leases.assert_called_with(**filters) @@ -302,20 +320,20 @@ class TestLeaseShow(TestLease): def setUp(self): super(TestLeaseShow, self).setUp() - self.client_mock.get_lease.return_value = \ - base.FakeResource(copy.deepcopy(fakes.LEASE)) + self.client_mock.get_lease.return_value = base.FakeResource( + copy.deepcopy(fakes.LEASE) + ) self.cmd = lease.ShowLease(self.app, None) def test_lease_show(self): arglist = [fakes.lease_uuid] - verifylist = [('uuid', fakes.lease_uuid)] + verifylist = [("uuid", fakes.lease_uuid)] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) - self.client_mock.get_lease.assert_called_once_with( - fakes.lease_uuid) + self.client_mock.get_lease.assert_called_once_with(fakes.lease_uuid) collist = ( "end_time", @@ -337,40 +355,45 @@ def test_lease_show(self): "resource_uuid", "start_time", "status", - "uuid" + "uuid", ) self.assertEqual(collist, columns) - datalist = (fakes.lease_end_time, - fakes.lease_expire_time, - fakes.lease_fulfill_time, - fakes.lease_name, - fakes.offer_uuid, - fakes.lease_owner, - fakes.lease_owner_id, - fakes.parent_lease_uuid, - fakes.lease_project, - fakes.lease_project_id, - json.loads(fakes.lease_properties), - fakes.lease_purpose, - fakes.lease_resource, - fakes.lease_resource_class, - fakes.node_properties, - fakes.lease_resource_type, - fakes.lease_resource_uuid, - fakes.lease_start_time, - fakes.lease_status, - fakes.lease_uuid - ) + datalist = ( + fakes.lease_end_time, + fakes.lease_expire_time, + fakes.lease_fulfill_time, + fakes.lease_name, + fakes.offer_uuid, + fakes.lease_owner, + fakes.lease_owner_id, + fakes.parent_lease_uuid, + fakes.lease_project, + fakes.lease_project_id, + json.loads(fakes.lease_properties), + fakes.lease_purpose, + fakes.lease_resource, + fakes.lease_resource_class, + fakes.node_properties, + fakes.lease_resource_type, + fakes.lease_resource_uuid, + fakes.lease_start_time, + fakes.lease_status, + fakes.lease_uuid, + ) self.assertEqual(datalist, tuple(data)) def test_lease_show_no_id(self): arglist = [] verifylist = [] - self.assertRaises(osctestutils.ParserException, - self.check_parser, - self.cmd, arglist, verifylist) + self.assertRaises( + osctestutils.ParserException, + self.check_parser, + self.cmd, + arglist, + verifylist, + ) class TestLeaseDelete(TestLease): @@ -381,17 +404,20 @@ def setUp(self): def test_lease_delete(self): arglist = [fakes.lease_uuid] - verifylist = [('uuid', fakes.lease_uuid)] + verifylist = [("uuid", fakes.lease_uuid)] parsed_args = self.check_parser(self.cmd, arglist, verifylist) self.cmd.take_action(parsed_args) - self.client_mock.delete_lease.assert_called_once_with( - fakes.lease_uuid) + self.client_mock.delete_lease.assert_called_once_with(fakes.lease_uuid) def test_lease_delete_no_id(self): arglist = [] verifylist = [] - self.assertRaises(osctestutils.ParserException, - self.check_parser, - self.cmd, arglist, verifylist) + self.assertRaises( + osctestutils.ParserException, + self.check_parser, + self.cmd, + arglist, + verifylist, + ) diff --git a/esileapclient/tests/unit/osc/v1/test_node.py b/esileapclient/tests/unit/osc/v1/test_node.py index 6cf0d76..26e4ab7 100644 --- a/esileapclient/tests/unit/osc/v1/test_node.py +++ b/esileapclient/tests/unit/osc/v1/test_node.py @@ -19,7 +19,6 @@ class TestNode(base.TestESILeapCommand): - def setUp(self): super(TestNode, self).setUp() @@ -28,7 +27,6 @@ def setUp(self): class TestNodeList(TestNode): - def setUp(self): super(TestNodeList, self).setUp() @@ -45,9 +43,9 @@ def test_node_list(self): columns, data = self.cmd.take_action(parsed_args) filters = { - 'resource_class': parsed_args.resource_class, - 'owner': parsed_args.owner, - 'lessee': parsed_args.lessee + "resource_class": parsed_args.resource_class, + "owner": parsed_args.owner, + "lessee": parsed_args.lessee, } self.client_mock.nodes.assert_called_with(**filters) @@ -65,24 +63,31 @@ def test_node_list(self): self.assertEqual(collist, list(columns)) - datalist = ((fakes.node_name, - fakes.node_owner, - '', fakes.lease_resource_class, - '', '', '', '' - ),) + datalist = ( + ( + fakes.node_name, + fakes.node_owner, + "", + fakes.lease_resource_class, + "", + "", + "", + "", + ), + ) self.assertEqual(datalist, tuple(data)) def test_node_list_long(self): - arglist = ['--long'] - verifylist = [('long', True)] + arglist = ["--long"] + verifylist = [("long", True)] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) filters = { - 'resource_class': parsed_args.resource_class, - 'owner': parsed_args.owner, - 'lessee': parsed_args.lessee + "resource_class": parsed_args.resource_class, + "owner": parsed_args.owner, + "lessee": parsed_args.lessee, } self.client_mock.nodes.assert_called_with(**filters) @@ -97,65 +102,72 @@ def test_node_list_long(self): "Offer UUID", "Lease UUID", "Future Offers", - "Future Leases" + "Future Leases", ] long_collist = [ - 'UUID', - 'Name', - 'Owner', - 'Lessee', - 'Resource Class', - 'Provision State', - 'Maintenance', - 'Properties', - 'Offer UUID', - 'Lease UUID', - 'Future Offers', - 'Future Leases' + "UUID", + "Name", + "Owner", + "Lessee", + "Resource Class", + "Provision State", + "Maintenance", + "Properties", + "Offer UUID", + "Lease UUID", + "Future Offers", + "Future Leases", ] self.assertEqual(long_collist, list(columns)) - datalist = ((fakes.node_uuid, - fakes.node_name, - fakes.node_owner, - '', - fakes.lease_resource_class, - '', '', - fakes.node_properties, - '', '', '', '' - ),) + datalist = ( + ( + fakes.node_uuid, + fakes.node_name, + fakes.node_owner, + "", + fakes.lease_resource_class, + "", + "", + fakes.node_properties, + "", + "", + "", + "", + ), + ) self.assertEqual(datalist, tuple(data)) - @mock.patch('esileapclient.common.utils.filter_nodes_by_properties') + @mock.patch("esileapclient.common.utils.filter_nodes_by_properties") def test_node_list_with_property_filter(self, mock_filter_nodes): - arglist = ['--property', 'cpus>=40'] - verifylist = [('properties', ['cpus>=40'])] + arglist = ["--property", "cpus>=40"] + verifylist = [("properties", ["cpus>=40"])] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) filters = { - 'resource_class': parsed_args.resource_class, - 'owner': parsed_args.owner, - 'lessee': parsed_args.lessee + "resource_class": parsed_args.resource_class, + "owner": parsed_args.owner, + "lessee": parsed_args.lessee, } self.client_mock.nodes.assert_called_with(**filters) mock_filter_nodes.assert_called_with(mock.ANY, parsed_args.properties) - @mock.patch('esileapclient.common.utils.filter_nodes_by_properties') + @mock.patch("esileapclient.common.utils.filter_nodes_by_properties") def test_node_list_long_with_property_filter(self, mock_filter_nodes): - arglist = ['--long', '--property', 'memory_mb>=131072'] - verifylist = [('long', True), ('properties', ['memory_mb>=131072'])] + arglist = ["--long", "--property", "memory_mb>=131072"] + verifylist = [("long", True), ("properties", ["memory_mb>=131072"])] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) filters = { - 'resource_class': parsed_args.resource_class, - 'owner': parsed_args.owner, - 'lessee': parsed_args.lessee + "resource_class": parsed_args.resource_class, + "owner": parsed_args.owner, + "lessee": parsed_args.lessee, } self.client_mock.nodes.assert_called_with(**filters) diff --git a/esileapclient/tests/unit/osc/v1/test_offer.py b/esileapclient/tests/unit/osc/v1/test_offer.py index c380b23..61464a4 100644 --- a/esileapclient/tests/unit/osc/v1/test_offer.py +++ b/esileapclient/tests/unit/osc/v1/test_offer.py @@ -21,7 +21,6 @@ class TestOffer(base.TestESILeapCommand): - def setUp(self): super(TestOffer, self).setUp() @@ -30,37 +29,41 @@ def setUp(self): class TestOfferCreate(TestOffer): - def setUp(self): super(TestOfferCreate, self).setUp() - self.client_mock.create_offer.return_value = ( - base.FakeResource(copy.deepcopy(fakes.OFFER)) + self.client_mock.create_offer.return_value = base.FakeResource( + copy.deepcopy(fakes.OFFER) ) # Get the command object to test self.cmd = offer.CreateOffer(self.app, None) def test_offer_create(self): - arglist = [ fakes.lease_resource_uuid, - '--end-time', fakes.lease_end_time, - '--lessee', fakes.offer_lessee_id, - '--name', fakes.offer_name, - '--properties', fakes.lease_properties, - '--resource-type', fakes.lease_resource_type, - '--start-time', fakes.lease_start_time, + "--end-time", + fakes.lease_end_time, + "--lessee", + fakes.offer_lessee_id, + "--name", + fakes.offer_name, + "--properties", + fakes.lease_properties, + "--resource-type", + fakes.lease_resource_type, + "--start-time", + fakes.lease_start_time, ] verifylist = [ - ('end_time', fakes.lease_end_time), - ('lessee_id', fakes.offer_lessee_id), - ('name', fakes.offer_name), - ('properties', fakes.lease_properties), - ('resource_type', fakes.lease_resource_type), - ('resource_uuid', fakes.lease_resource_uuid), - ('start_time', fakes.lease_start_time), + ("end_time", fakes.lease_end_time), + ("lessee_id", fakes.offer_lessee_id), + ("name", fakes.offer_name), + ("properties", fakes.lease_properties), + ("resource_type", fakes.lease_resource_type), + ("resource_uuid", fakes.lease_resource_uuid), + ("start_time", fakes.lease_start_time), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -68,13 +71,13 @@ def test_offer_create(self): self.cmd.take_action(parsed_args) args = { - 'end_time': fakes.lease_end_time, - 'lessee_id': fakes.offer_lessee_id, - 'name': fakes.offer_name, - 'properties': json.loads(fakes.lease_properties), - 'resource_type': fakes.lease_resource_type, - 'resource_uuid': fakes.lease_resource_uuid, - 'start_time': fakes.lease_start_time, + "end_time": fakes.lease_end_time, + "lessee_id": fakes.offer_lessee_id, + "name": fakes.offer_name, + "properties": json.loads(fakes.lease_properties), + "resource_type": fakes.lease_resource_type, + "resource_uuid": fakes.lease_resource_uuid, + "start_time": fakes.lease_start_time, } self.client_mock.create_offer.assert_called_once_with(**args) @@ -97,19 +100,23 @@ def test_offer_list(self): columns, data = self.cmd.take_action(parsed_args) filters = { - 'status': parsed_args.status, - 'start_time': str(parsed_args.time_range[0]) if - parsed_args.time_range else None, - 'end_time': str(parsed_args.time_range[1]) if - parsed_args.time_range else None, - 'available_start_time': str(parsed_args.availability_range[0]) if - parsed_args.availability_range else None, - 'available_end_time': str(parsed_args.availability_range[1]) if - parsed_args.availability_range else None, - 'project_id': parsed_args.project_id, - 'resource_type': parsed_args.resource_type, - 'resource_uuid': parsed_args.resource_uuid, - 'resource_class': parsed_args.resource_class + "status": parsed_args.status, + "start_time": str(parsed_args.time_range[0]) + if parsed_args.time_range + else None, + "end_time": str(parsed_args.time_range[1]) + if parsed_args.time_range + else None, + "available_start_time": str(parsed_args.availability_range[0]) + if parsed_args.availability_range + else None, + "available_end_time": str(parsed_args.availability_range[1]) + if parsed_args.availability_range + else None, + "project_id": parsed_args.project_id, + "resource_type": parsed_args.resource_type, + "resource_uuid": parsed_args.resource_uuid, + "resource_class": parsed_args.resource_class, } self.client_mock.offers.assert_called_with(**filters) @@ -127,121 +134,139 @@ def test_offer_list(self): self.assertEqual(collist, list(columns)) - datalist = ((fakes.offer_uuid, - fakes.lease_resource, - fakes.lease_resource_class, - fakes.offer_lessee, - fakes.lease_start_time, - fakes.lease_end_time, - fakes.lease_status, - json.loads(fakes.lease_availabilities) - ),) + datalist = ( + ( + fakes.offer_uuid, + fakes.lease_resource, + fakes.lease_resource_class, + fakes.offer_lessee, + fakes.lease_start_time, + fakes.lease_end_time, + fakes.lease_status, + json.loads(fakes.lease_availabilities), + ), + ) self.assertEqual(datalist, tuple(data)) - @mock.patch('esileapclient.common.utils.filter_nodes_by_properties') + @mock.patch("esileapclient.common.utils.filter_nodes_by_properties") def test_offer_list_with_property_filter(self, mock_filter_nodes): - arglist = ['--property', 'cpus>=40'] - verifylist = [('properties', ['cpus>=40'])] + arglist = ["--property", "cpus>=40"] + verifylist = [("properties", ["cpus>=40"])] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) filters = { - 'status': parsed_args.status, - 'start_time': str(parsed_args.time_range[0]) if - parsed_args.time_range else None, - 'end_time': str(parsed_args.time_range[1]) if - parsed_args.time_range else None, - 'available_start_time': str(parsed_args.availability_range[0]) if - parsed_args.availability_range else None, - 'available_end_time': str(parsed_args.availability_range[1]) if - parsed_args.availability_range else None, - 'project_id': parsed_args.project_id, - 'resource_type': parsed_args.resource_type, - 'resource_uuid': parsed_args.resource_uuid, - 'resource_class': parsed_args.resource_class + "status": parsed_args.status, + "start_time": str(parsed_args.time_range[0]) + if parsed_args.time_range + else None, + "end_time": str(parsed_args.time_range[1]) + if parsed_args.time_range + else None, + "available_start_time": str(parsed_args.availability_range[0]) + if parsed_args.availability_range + else None, + "available_end_time": str(parsed_args.availability_range[1]) + if parsed_args.availability_range + else None, + "project_id": parsed_args.project_id, + "resource_type": parsed_args.resource_type, + "resource_uuid": parsed_args.resource_uuid, + "resource_class": parsed_args.resource_class, } self.client_mock.offers.assert_called_with(**filters) mock_filter_nodes.assert_called_with(mock.ANY, parsed_args.properties) def test_offer_list_long(self): - arglist = ['--long'] - verifylist = [('long', True)] + arglist = ["--long"] + verifylist = [("long", True)] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) filters = { - 'status': parsed_args.status, - 'start_time': str(parsed_args.time_range[0]) if - parsed_args.time_range else None, - 'end_time': str(parsed_args.time_range[1]) if - parsed_args.time_range else None, - 'available_start_time': str(parsed_args.availability_range[0]) if - parsed_args.availability_range else None, - 'available_end_time': str(parsed_args.availability_range[1]) if - parsed_args.availability_range else None, - 'project_id': parsed_args.project_id, - 'resource_type': parsed_args.resource_type, - 'resource_uuid': parsed_args.resource_uuid, - 'resource_class': parsed_args.resource_class + "status": parsed_args.status, + "start_time": str(parsed_args.time_range[0]) + if parsed_args.time_range + else None, + "end_time": str(parsed_args.time_range[1]) + if parsed_args.time_range + else None, + "available_start_time": str(parsed_args.availability_range[0]) + if parsed_args.availability_range + else None, + "available_end_time": str(parsed_args.availability_range[1]) + if parsed_args.availability_range + else None, + "project_id": parsed_args.project_id, + "resource_type": parsed_args.resource_type, + "resource_uuid": parsed_args.resource_uuid, + "resource_class": parsed_args.resource_class, } self.client_mock.offers.assert_called_with(**filters) long_collist = [ - 'UUID', - 'Resource', - 'Resource Class', - 'Resource Properties', - 'Lessee', - 'Start Time', - 'End Time', - 'Status', - 'Availabilities', - 'Project', - 'Parent Lease UUID' + "UUID", + "Resource", + "Resource Class", + "Resource Properties", + "Lessee", + "Start Time", + "End Time", + "Status", + "Availabilities", + "Project", + "Parent Lease UUID", ] self.assertEqual(long_collist, list(columns)) - datalist = ((fakes.offer_uuid, - fakes.lease_resource, - fakes.lease_resource_class, - fakes.node_properties, - fakes.offer_lessee, - fakes.lease_start_time, - fakes.lease_end_time, - fakes.lease_status, - json.loads(fakes.lease_availabilities), - fakes.lease_project, - fakes.parent_lease_uuid - ),) + datalist = ( + ( + fakes.offer_uuid, + fakes.lease_resource, + fakes.lease_resource_class, + fakes.node_properties, + fakes.offer_lessee, + fakes.lease_start_time, + fakes.lease_end_time, + fakes.lease_status, + json.loads(fakes.lease_availabilities), + fakes.lease_project, + fakes.parent_lease_uuid, + ), + ) self.assertEqual(datalist, tuple(data)) - @mock.patch('esileapclient.common.utils.filter_nodes_by_properties') + @mock.patch("esileapclient.common.utils.filter_nodes_by_properties") def test_offer_list_long_with_property_filter(self, mock_filter_nodes): - arglist = ['--long', '--property', 'memory_mb>=131072'] - verifylist = [('long', True), ('properties', ['memory_mb>=131072'])] + arglist = ["--long", "--property", "memory_mb>=131072"] + verifylist = [("long", True), ("properties", ["memory_mb>=131072"])] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) filters = { - 'status': parsed_args.status, - 'start_time': str(parsed_args.time_range[0]) if - parsed_args.time_range else None, - 'end_time': str(parsed_args.time_range[1]) if - parsed_args.time_range else None, - 'available_start_time': str(parsed_args.availability_range[0]) if - parsed_args.availability_range else None, - 'available_end_time': str(parsed_args.availability_range[1]) if - parsed_args.availability_range else None, - 'project_id': parsed_args.project_id, - 'resource_type': parsed_args.resource_type, - 'resource_uuid': parsed_args.resource_uuid, - 'resource_class': parsed_args.resource_class + "status": parsed_args.status, + "start_time": str(parsed_args.time_range[0]) + if parsed_args.time_range + else None, + "end_time": str(parsed_args.time_range[1]) + if parsed_args.time_range + else None, + "available_start_time": str(parsed_args.availability_range[0]) + if parsed_args.availability_range + else None, + "available_end_time": str(parsed_args.availability_range[1]) + if parsed_args.availability_range + else None, + "project_id": parsed_args.project_id, + "resource_type": parsed_args.resource_type, + "resource_uuid": parsed_args.resource_uuid, + "resource_class": parsed_args.resource_class, } self.client_mock.offers.assert_called_with(**filters) @@ -252,20 +277,20 @@ class TestOfferShow(TestOffer): def setUp(self): super(TestOfferShow, self).setUp() - self.client_mock.get_offer.return_value = \ - base.FakeResource(copy.deepcopy(fakes.OFFER)) + self.client_mock.get_offer.return_value = base.FakeResource( + copy.deepcopy(fakes.OFFER) + ) self.cmd = offer.ShowOffer(self.app, None) def test_offer_show(self): arglist = [fakes.offer_uuid] - verifylist = [('uuid', fakes.offer_uuid)] + verifylist = [("uuid", fakes.offer_uuid)] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) - self.client_mock.get_offer.assert_called_once_with( - fakes.offer_uuid) + self.client_mock.get_offer.assert_called_once_with(fakes.offer_uuid) collist = ( "availabilities", @@ -284,37 +309,42 @@ def test_offer_show(self): "resource_uuid", "start_time", "status", - "uuid" + "uuid", ) self.assertEqual(collist, columns) - datalist = (json.loads(fakes.lease_availabilities), - fakes.lease_end_time, - fakes.offer_lessee, - fakes.offer_lessee_id, - fakes.offer_name, - fakes.parent_lease_uuid, - fakes.lease_project, - fakes.lease_project_id, - json.loads(fakes.lease_properties), - fakes.lease_resource, - fakes.lease_resource_class, - fakes.node_properties, - fakes.lease_resource_type, - fakes.lease_resource_uuid, - fakes.lease_start_time, - fakes.lease_status, - fakes.offer_uuid, - ) + datalist = ( + json.loads(fakes.lease_availabilities), + fakes.lease_end_time, + fakes.offer_lessee, + fakes.offer_lessee_id, + fakes.offer_name, + fakes.parent_lease_uuid, + fakes.lease_project, + fakes.lease_project_id, + json.loads(fakes.lease_properties), + fakes.lease_resource, + fakes.lease_resource_class, + fakes.node_properties, + fakes.lease_resource_type, + fakes.lease_resource_uuid, + fakes.lease_start_time, + fakes.lease_status, + fakes.offer_uuid, + ) self.assertEqual(datalist, tuple(data)) def test_offer_show_no_id(self): arglist = [] verifylist = [] - self.assertRaises(osctestutils.ParserException, - self.check_parser, - self.cmd, arglist, verifylist) + self.assertRaises( + osctestutils.ParserException, + self.check_parser, + self.cmd, + arglist, + verifylist, + ) class TestOfferDelete(TestOffer): @@ -325,20 +355,23 @@ def setUp(self): def test_offer_delete(self): arglist = [fakes.offer_uuid] - verifylist = [('uuid', fakes.offer_uuid)] + verifylist = [("uuid", fakes.offer_uuid)] parsed_args = self.check_parser(self.cmd, arglist, verifylist) self.cmd.take_action(parsed_args) - self.client_mock.delete_offer.assert_called_once_with( - fakes.offer_uuid) + self.client_mock.delete_offer.assert_called_once_with(fakes.offer_uuid) def test_offer_delete_no_id(self): arglist = [] verifylist = [] - self.assertRaises(osctestutils.ParserException, - self.check_parser, - self.cmd, arglist, verifylist) + self.assertRaises( + osctestutils.ParserException, + self.check_parser, + self.cmd, + arglist, + verifylist, + ) class TestOfferClaim(TestOffer): @@ -350,32 +383,40 @@ def setUp(self): def test_offer_claim(self): arglist = [ fakes.offer_uuid, - '--end-time', fakes.lease_end_time, - '--properties', fakes.lease_properties, - '--start-time', fakes.lease_start_time, + "--end-time", + fakes.lease_end_time, + "--properties", + fakes.lease_properties, + "--start-time", + fakes.lease_start_time, ] verifylist = [ - ('offer_uuid', fakes.offer_uuid), - ('end_time', fakes.lease_end_time), - ('properties', fakes.lease_properties), - ('start_time', fakes.lease_start_time), + ("offer_uuid", fakes.offer_uuid), + ("end_time", fakes.lease_end_time), + ("properties", fakes.lease_properties), + ("start_time", fakes.lease_start_time), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) self.cmd.take_action(parsed_args) lease_args = { - 'end_time': fakes.lease_end_time, - 'properties': json.loads(fakes.lease_properties), - 'start_time': fakes.lease_start_time, + "end_time": fakes.lease_end_time, + "properties": json.loads(fakes.lease_properties), + "start_time": fakes.lease_start_time, } self.client_mock.claim_offer.assert_called_once_with( - fakes.offer_uuid, **lease_args) + fakes.offer_uuid, **lease_args + ) def test_offer_claim_no_id(self): arglist = [] verifylist = [] - self.assertRaises(osctestutils.ParserException, - self.check_parser, - self.cmd, arglist, verifylist) + self.assertRaises( + osctestutils.ParserException, + self.check_parser, + self.cmd, + arglist, + verifylist, + ) diff --git a/esileapclient/v1/console_auth_token.py b/esileapclient/v1/console_auth_token.py index d582655..89de743 100644 --- a/esileapclient/v1/console_auth_token.py +++ b/esileapclient/v1/console_auth_token.py @@ -18,14 +18,13 @@ class ConsoleAuthToken(base.Resource): - fields = { - 'node_uuid': "Node UUID", - 'token': "Token", - 'access_url': "Access URL", + "node_uuid": "Node UUID", + "token": "Token", + "access_url": "Access URL", } - _creation_attributes = ['node_uuid_or_name', 'token_ttl'] + _creation_attributes = ["node_uuid_or_name", "token_ttl"] def __repr__(self): return "" % self._info diff --git a/esileapclient/v1/event.py b/esileapclient/v1/event.py index 8a641d8..4a176a0 100644 --- a/esileapclient/v1/event.py +++ b/esileapclient/v1/event.py @@ -18,35 +18,41 @@ class Event(base.Resource): - detailed_fields = { - 'id': "ID", - 'event_type': "Event Type", - 'event_time': "Event Time", - 'object_type': "Object Type", - 'object_uuid': "Object UUID", - 'resource_type': "Resource Type", - 'resource_uuid': "Resource UUID", - 'lessee_id': "Lessee ID", - 'owner_id': "Owner ID", + "id": "ID", + "event_type": "Event Type", + "event_time": "Event Time", + "object_type": "Object Type", + "object_uuid": "Object UUID", + "resource_type": "Resource Type", + "resource_uuid": "Resource UUID", + "lessee_id": "Lessee ID", + "owner_id": "Owner ID", } fields = { - 'id': "ID", - 'event_type': "Event Type", - 'event_time': "Event Time", - 'object_type': "Object Type", - 'object_uuid': "Object UUID", - 'resource_type': "Resource Type", - 'resource_uuid': "Resource UUID", - 'lessee_id': "Lessee ID", - 'owner_id': "Owner ID", + "id": "ID", + "event_type": "Event Type", + "event_time": "Event Time", + "object_type": "Object Type", + "object_uuid": "Object UUID", + "resource_type": "Resource Type", + "resource_uuid": "Resource UUID", + "lessee_id": "Lessee ID", + "owner_id": "Owner ID", } - _creation_attributes = ['id', 'event_type', 'event_time', - 'object_type', 'object_uuid', - 'resource_type', 'resource_uuid', - 'lessee_id', 'owner_id'] + _creation_attributes = [ + "id", + "event_type", + "event_time", + "object_type", + "object_uuid", + "resource_type", + "resource_uuid", + "lessee_id", + "owner_id", + ] def __repr__(self): return "" % self._info diff --git a/esileapclient/v1/lease.py b/esileapclient/v1/lease.py index 78470c1..4ddcaee 100644 --- a/esileapclient/v1/lease.py +++ b/esileapclient/v1/lease.py @@ -19,63 +19,70 @@ class Lease(base.Resource): - detailed_fields = { - 'end_time': "End Time", - 'expire_time': "Expire Time", - 'fulfill_time': "Fulfill Time", - 'name': "Name", - 'offer_uuid': "Offer UUID", - 'owner': "Owner", - 'owner_id': "Owner ID", - 'parent_lease_uuid': "Parent Lease UUID", - 'project': "Project", - 'project_id': "Project ID", - 'properties': "Properties", - 'resource': "Resource", - 'resource_class': "Resource Class", - 'resource_properties': "Resource Properties", - 'resource_type': "Resource Type", - 'resource_uuid': "Resource UUID", - 'start_time': "Start Time", - 'status': "Status", - 'uuid': "UUID", - 'purpose': "Purpose", + "end_time": "End Time", + "expire_time": "Expire Time", + "fulfill_time": "Fulfill Time", + "name": "Name", + "offer_uuid": "Offer UUID", + "owner": "Owner", + "owner_id": "Owner ID", + "parent_lease_uuid": "Parent Lease UUID", + "project": "Project", + "project_id": "Project ID", + "properties": "Properties", + "resource": "Resource", + "resource_class": "Resource Class", + "resource_properties": "Resource Properties", + "resource_type": "Resource Type", + "resource_uuid": "Resource UUID", + "start_time": "Start Time", + "status": "Status", + "uuid": "UUID", + "purpose": "Purpose", } long_fields = { - 'uuid': "UUID", - 'resource': "Resource", - 'resource_class': "Resource Class", - 'resource_properties': "Resource Properties", - 'project': "Project", - 'start_time': "Start Time", - 'end_time': "End Time", - 'expire_time': "Expire Time", - 'fulfill_time': "Fulfill Time", - 'offer_uuid': "Offer UUID", - 'owner': "Owner", - 'parent_lease_uuid': "Parent Lease UUID", - 'status': "Status", - 'purpose': "Purpose", + "uuid": "UUID", + "resource": "Resource", + "resource_class": "Resource Class", + "resource_properties": "Resource Properties", + "project": "Project", + "start_time": "Start Time", + "end_time": "End Time", + "expire_time": "Expire Time", + "fulfill_time": "Fulfill Time", + "offer_uuid": "Offer UUID", + "owner": "Owner", + "parent_lease_uuid": "Parent Lease UUID", + "status": "Status", + "purpose": "Purpose", } fields = { - 'uuid': "UUID", - 'resource': "Resource", - 'resource_class': "Resource Class", - 'project': "Project", - 'start_time': "Start Time", - 'end_time': "End Time", - 'offer_uuid': "Offer UUID", - 'status': "Status", - 'purpose': "Purpose", + "uuid": "UUID", + "resource": "Resource", + "resource_class": "Resource Class", + "project": "Project", + "start_time": "Start Time", + "end_time": "End Time", + "offer_uuid": "Offer UUID", + "status": "Status", + "purpose": "Purpose", } - _creation_attributes = ['start_time', 'end_time', 'status', 'name', - 'properties', 'project_id', 'resource_type', - 'resource_uuid', 'purpose'] - _update_attributes = ['end_time'] + _creation_attributes = [ + "start_time", + "end_time", + "status", + "name", + "properties", + "project_id", + "resource_type", + "resource_uuid", + "purpose", + ] + _update_attributes = ["end_time"] def __repr__(self): return "" % self._info diff --git a/esileapclient/v1/node.py b/esileapclient/v1/node.py index b7841e7..72e951f 100644 --- a/esileapclient/v1/node.py +++ b/esileapclient/v1/node.py @@ -19,37 +19,45 @@ class Node(base.Resource): - detailed_fields = { - 'uuid': "UUID", - 'name': "Name", - 'owner': "Owner", - 'lessee': "Lessee", - 'resource_class': "Resource Class", - 'provision_state': "Provision State", - 'maintenance': "Maintenance", - 'properties': "Properties", - 'offer_uuid': "Offer UUID", - 'lease_uuid': "Lease UUID", - 'future_offers': "Future Offers", - 'future_leases': "Future Leases" + "uuid": "UUID", + "name": "Name", + "owner": "Owner", + "lessee": "Lessee", + "resource_class": "Resource Class", + "provision_state": "Provision State", + "maintenance": "Maintenance", + "properties": "Properties", + "offer_uuid": "Offer UUID", + "lease_uuid": "Lease UUID", + "future_offers": "Future Offers", + "future_leases": "Future Leases", } fields = { - 'name': "Name", - 'owner': "Owner", - 'lessee': "Lessee", - 'resource_class': "Resource Class", - 'provision_state': "Provision State", - 'maintenance': "Maintenance", - 'offer_uuid': "Offer UUID", - 'lease_uuid': "Lease UUID", + "name": "Name", + "owner": "Owner", + "lessee": "Lessee", + "resource_class": "Resource Class", + "provision_state": "Provision State", + "maintenance": "Maintenance", + "offer_uuid": "Offer UUID", + "lease_uuid": "Lease UUID", } - _creation_attributes = ['name', 'uuid', 'owner', 'offer_uuid', - 'lessee', 'lease_uuid', 'future_offers', - 'future_leases', 'resource_class', - 'provision_state', 'maintenance'] + _creation_attributes = [ + "name", + "uuid", + "owner", + "offer_uuid", + "lessee", + "lease_uuid", + "future_offers", + "future_leases", + "resource_class", + "provision_state", + "maintenance", + ] def __repr__(self): return "" % self._info diff --git a/esileapclient/v1/offer.py b/esileapclient/v1/offer.py index e0ab7ca..be2ff7b 100644 --- a/esileapclient/v1/offer.py +++ b/esileapclient/v1/offer.py @@ -18,56 +18,62 @@ class Offer(base.Resource): - detailed_fields = { - 'availabilities': "Availabilities", - 'end_time': "End Time", - 'lessee': "Lessee", - 'lessee_id': "Lessee ID", - 'name': "Name", - 'parent_lease_uuid': "Parent Lease UUID", - 'project': "Project", - 'project_id': "Project ID", - 'properties': "Properties", - 'resource': "Resource", - 'resource_class': "Resource Class", - 'resource_properties': "Resource Properties", - 'resource_type': "Resource Type", - 'resource_uuid': "Resource UUID", - 'start_time': "Start Time", - 'status': "Status", - 'uuid': "UUID", + "availabilities": "Availabilities", + "end_time": "End Time", + "lessee": "Lessee", + "lessee_id": "Lessee ID", + "name": "Name", + "parent_lease_uuid": "Parent Lease UUID", + "project": "Project", + "project_id": "Project ID", + "properties": "Properties", + "resource": "Resource", + "resource_class": "Resource Class", + "resource_properties": "Resource Properties", + "resource_type": "Resource Type", + "resource_uuid": "Resource UUID", + "start_time": "Start Time", + "status": "Status", + "uuid": "UUID", } long_fields = { - 'uuid': "UUID", - 'resource': "Resource", - 'resource_class': "Resource Class", - 'resource_properties': "Resource Properties", - 'lessee': "Lessee", - 'start_time': "Start Time", - 'end_time': "End Time", - 'status': "Status", - 'availabilities': "Availabilities", - 'project': "Project", - 'parent_lease_uuid': "Parent Lease UUID", + "uuid": "UUID", + "resource": "Resource", + "resource_class": "Resource Class", + "resource_properties": "Resource Properties", + "lessee": "Lessee", + "start_time": "Start Time", + "end_time": "End Time", + "status": "Status", + "availabilities": "Availabilities", + "project": "Project", + "parent_lease_uuid": "Parent Lease UUID", } fields = { - 'uuid': "UUID", - 'resource': "Resource", - 'resource_class': "Resource Class", - 'lessee': "Lessee", - 'start_time': "Start Time", - 'end_time': "End Time", - 'status': "Status", - 'availabilities': "Availabilities", + "uuid": "UUID", + "resource": "Resource", + "resource_class": "Resource Class", + "lessee": "Lessee", + "start_time": "Start Time", + "end_time": "End Time", + "status": "Status", + "availabilities": "Availabilities", } - _creation_attributes = ['resource_type', 'resource_uuid', - 'start_time', 'end_time', 'status', - 'project_id', 'properties', 'name', - 'lessee_id'] + _creation_attributes = [ + "resource_type", + "resource_uuid", + "start_time", + "end_time", + "status", + "project_id", + "properties", + "name", + "lessee_id", + ] def __repr__(self): return "" % self._info diff --git a/setup.py b/setup.py index d256922..996f8f4 100644 --- a/setup.py +++ b/setup.py @@ -21,10 +21,12 @@ pass from pathlib import Path + this_directory = Path(__file__).parent long_description = (this_directory / "README.md").read_text() setuptools.setup( - setup_requires=['pbr>=2.0.0'], + setup_requires=["pbr>=2.0.0"], long_description=long_description, - long_description_content_type='text/markdown', - pbr=True) + long_description_content_type="text/markdown", + pbr=True, +)