Skip to content

Commit 8f23c78

Browse files
[Fix] CLI Server Set/Unset tags and properties (#614)
[Fix] CLI Server Set/Unset tags and properties Update server tags setting according latest python-openstackclient changes Reviewed-by: Tino Schr
1 parent 1ffd559 commit 8f23c78

File tree

10 files changed

+94
-45
lines changed

10 files changed

+94
-45
lines changed

.stestr.blacklist.functional

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
otcextensions.tests.unit.sdk.cce*
2+
otcextensions.tests.functional.osclient.compute*
23
otcextensions.tests.functional.osclient.dcaas
34
otcextensions.tests.functional.osclient.dns*
45
otcextensions.tests.functional.osclient.obs*

AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Irina Pereiaslavskaia <[email protected]>
1414
Irina Pereiaslavskaia <[email protected]>
1515
Nils Magnus <[email protected]>
1616
Nils-Magnus <[email protected]>
17+
1718
Polina Gubina <[email protected]>
1819
Reik Keutterling <[email protected]>
1920
Rodion Gyrbu <[email protected]>

otcextensions/osclient/compute/v2/server.py

Lines changed: 48 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@
1818
import getpass
1919
import logging
2020

21-
from novaclient import api_versions
2221
from osc_lib.cli import parseractions
2322
from osc_lib.command import command
2423
from osc_lib import exceptions
25-
from osc_lib import utils
2624

2725
from openstackclient.i18n import _
2826

27+
from openstack import utils as sdk_utils
28+
2929
from otcextensions import sdk
3030

3131

@@ -53,11 +53,14 @@ def get_parser(self, prog_name):
5353
help=_('Set new root password (interactive only)'),
5454
)
5555
parser.add_argument(
56-
"--property",
57-
metavar="<key=value>",
56+
'--property',
57+
metavar='<key=value>',
5858
action=parseractions.KeyValueAction,
59-
help=_('Property to add/change for this server '
60-
'(repeat option to set multiple properties)'),
59+
dest='properties',
60+
help=_(
61+
'Property to add/change for this server '
62+
'(repeat option to set multiple properties)'
63+
),
6164
)
6265
parser.add_argument(
6366
'--state',
@@ -83,18 +86,16 @@ def get_parser(self, prog_name):
8386
def take_action(self, parsed_args):
8487

8588
compute_client = self.app.client_manager.compute
86-
server = utils.find_resource(
87-
compute_client.servers,
88-
parsed_args.server,
89+
server = compute_client.find_server(
90+
parsed_args.server, ignore_missing=False
8991
)
9092

9193
if parsed_args.name:
9294
server.update(name=parsed_args.name)
9395

94-
if parsed_args.property:
95-
compute_client.servers.set_meta(
96-
server,
97-
parsed_args.property,
96+
if parsed_args.properties:
97+
compute_client.set_server_metadata(
98+
server, **parsed_args.properties
9899
)
99100

100101
if parsed_args.state:
@@ -110,16 +111,20 @@ def take_action(self, parsed_args):
110111
raise exceptions.CommandError(msg)
111112

112113
if parsed_args.description:
113-
if server.api_version < api_versions.APIVersion("2.19"):
114-
msg = _("Description is not supported for "
115-
"--os-compute-api-version less than 2.19")
114+
if not sdk_utils.supports_microversion(compute_client, '2.19'):
115+
msg = _(
116+
'--os-compute-api-version 2.19 or greater is required to '
117+
'support the --description option'
118+
)
116119
raise exceptions.CommandError(msg)
117120
server.update(description=parsed_args.description)
118121

119122
if parsed_args.tag:
120-
if server.api_version < api_versions.APIVersion("2.26"):
121-
msg = _("Modifying tags is not supported for "
122-
"--os-compute-api-version less than 2.26")
123+
if not sdk_utils.supports_microversion(compute_client, '2.26'):
124+
msg = _(
125+
'--os-compute-api-version 2.26 or greater is required to '
126+
'support the --tag option'
127+
)
123128
raise exceptions.CommandError(msg)
124129
sdk.load(self.app.client_manager.sdk_connection)
125130
client = self.app.client_manager.sdk_connection.compute
@@ -140,11 +145,13 @@ def get_parser(self, prog_name):
140145
)
141146
parser.add_argument(
142147
'--property',
143-
metavar='<key>',
144-
action='append',
145-
default=[],
146-
help=_('Property key to remove from server '
147-
'(repeat option to remove multiple values)'),
148+
metavar='<key=value>',
149+
action=parseractions.KeyValueAction,
150+
dest='properties',
151+
help=_(
152+
'Property to add/change for this server '
153+
'(repeat option to set multiple properties)'
154+
),
148155
)
149156
parser.add_argument(
150157
'--description',
@@ -164,31 +171,31 @@ def get_parser(self, prog_name):
164171

165172
def take_action(self, parsed_args):
166173
compute_client = self.app.client_manager.compute
167-
server = utils.find_resource(
168-
compute_client.servers,
169-
parsed_args.server,
174+
server = compute_client.find_server(
175+
parsed_args.server, ignore_missing=False
170176
)
171177

172-
if parsed_args.property:
173-
compute_client.servers.delete_meta(
174-
server,
175-
parsed_args.property,
178+
if parsed_args.properties:
179+
compute_client.delete_server_metadata(
180+
server, parsed_args.properties or None
176181
)
177182

178183
if parsed_args.description:
179-
if compute_client.api_version < api_versions.APIVersion("2.19"):
180-
msg = _("Description is not supported for "
181-
"--os-compute-api-version less than 2.19")
184+
if not sdk_utils.supports_microversion(compute_client, '2.19'):
185+
msg = _(
186+
'--os-compute-api-version 2.19 or greater is required to '
187+
'support the --description option'
188+
)
182189
raise exceptions.CommandError(msg)
183-
compute_client.servers.update(
184-
server,
185-
description="",
186-
)
190+
191+
compute_client.update_server(server, description="")
187192

188193
if parsed_args.tag:
189-
if compute_client.api_version < api_versions.APIVersion("2.26"):
190-
msg = _("Modifying tags is not supported for "
191-
"--os-compute-api-version less than 2.26")
194+
if not sdk_utils.supports_microversion(compute_client, '2.26'):
195+
msg = _(
196+
'--os-compute-api-version 2.26 or greater is required to '
197+
'support the --tag option'
198+
)
192199
raise exceptions.CommandError(msg)
193200
sdk.load(self.app.client_manager.sdk_connection)
194201
client = self.app.client_manager.sdk_connection.compute

otcextensions/sdk/apig/v2/backend_server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,15 @@ def send_request(session, gateway_id, vpc_channel_id, method,
7474

7575
def enable_server(self, session, gateway_id, vpc_channel_id, **attrs):
7676
uri = f'apigw/instances/{gateway_id}/vpc-channels/'\
77-
f'{vpc_channel_id}/members/batch-enable'
77+
f'{vpc_channel_id}/members/batch-enable'
7878
response = session.post(uri, json=attrs)
7979
exceptions.raise_from_response(response)
8080
self._translate_response(response)
8181
return response
8282

8383
def disable_server(self, session, gateway_id, vpc_channel_id, **attrs):
8484
uri = f'apigw/instances/{gateway_id}/vpc-channels/'\
85-
f'{vpc_channel_id}/members/batch-disable'
85+
f'{vpc_channel_id}/members/batch-disable'
8686
response = session.post(uri, json=attrs)
8787
exceptions.raise_from_response(response)
8888
self._translate_response(response)

otcextensions/sdk/obs/v1/_proxy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def get_container_endpoint(self, container):
6565
split_url = urlsplit(self.get_endpoint())
6666

6767
return f'{split_url.scheme}://%(container)s.{split_url.netloc}' % \
68-
{'container': container}
68+
{'container': container}
6969

7070
def _get_req_auth(self, host=None):
7171
auth = getattr(self, '_ak_auth', None)

otcextensions/tests/functional/osclient/compute/__init__.py

Whitespace-only changes.

otcextensions/tests/functional/osclient/compute/v2/__init__.py

Whitespace-only changes.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
2+
# not use this file except in compliance with the License. You may obtain
3+
# a copy of the License at
4+
#
5+
# http://www.apache.org/licenses/LICENSE-2.0
6+
#
7+
# Unless required by applicable law or agreed to in writing, software
8+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10+
# License for the specific language governing permissions and limitations
11+
# under the License.
12+
13+
import json
14+
15+
from openstackclient.tests.functional import base
16+
17+
18+
class TestCce(base.TestCase):
19+
"""Functional tests for Compute Instance. """
20+
SERVER_ID = "d420440b-834d-4af2-92a2-e7eb03119123"
21+
22+
def test_01_server_get(self):
23+
cmd = (
24+
f'server show {self.SERVER_ID} -f json '
25+
)
26+
json_output = json.loads(self.openstack(cmd))
27+
self.assertIsNotNone(json_output['id'])
28+
29+
def test_02_create_server_tag(self):
30+
cmd = (
31+
f'server set {self.SERVER_ID} '
32+
f'--tag test=tag'
33+
)
34+
35+
json_output = json.loads(self.openstack(cmd))
36+
print(json_output)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
fixes:
3+
- |
4+
Fixed Compute CLI overrides according latest upstream changes

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ commands =
8787
# W503 Is supposed to be off by default but in the latest pycodestyle isn't.
8888
# Also, both openstacksdk and Donald Knuth disagree with the rule. Line
8989
# breaks should occur before the binary operator for readability.
90-
ignore = H306,H4,W503
90+
ignore = H306,H4,W503,E231
9191
show-source = True
9292
exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build,openstack/_services_mixin.py
9393

0 commit comments

Comments
 (0)