summaryrefslogtreecommitdiff
path: root/openstackclient/compute
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/compute')
-rw-r--r--openstackclient/compute/v2/service.py63
1 files changed, 56 insertions, 7 deletions
diff --git a/openstackclient/compute/v2/service.py b/openstackclient/compute/v2/service.py
index f59f85de..80c0be7e 100644
--- a/openstackclient/compute/v2/service.py
+++ b/openstackclient/compute/v2/service.py
@@ -163,6 +163,33 @@ class SetService(command.Command):
)
return parser
+ @staticmethod
+ def _find_service_by_host_and_binary(cs, host, binary):
+ """Utility method to find a compute service by host and binary
+
+ :param host: the name of the compute service host
+ :param binary: the compute service binary, e.g. nova-compute
+ :returns: novaclient.v2.services.Service dict-like object
+ :raises: CommandError if no or multiple results were found
+ """
+ services = cs.list(host=host, binary=binary)
+ # Did we find anything?
+ if not len(services):
+ msg = _('Compute service for host "%(host)s" and binary '
+ '"%(binary)s" not found.') % {
+ 'host': host, 'binary': binary}
+ raise exceptions.CommandError(msg)
+ # Did we find more than one result? This should not happen but let's
+ # be safe.
+ if len(services) > 1:
+ # TODO(mriedem): If we have an --id option for 2.53+ then we can
+ # say to use that option to uniquely identify the service.
+ msg = _('Multiple compute services found for host "%(host)s" and '
+ 'binary "%(binary)s". Unable to proceed.') % {
+ 'host': host, 'binary': binary}
+ raise exceptions.CommandError(msg)
+ return services[0]
+
def take_action(self, parsed_args):
compute_client = self.app.client_manager.compute
cs = compute_client.services
@@ -173,6 +200,20 @@ class SetService(command.Command):
"--disable specified.")
raise exceptions.CommandError(msg)
+ # Starting with microversion 2.53, there is a single
+ # PUT /os-services/{service_id} API for updating nova-compute
+ # services. If 2.53+ is used we need to find the nova-compute
+ # service using the --host and --service (binary) values.
+ requires_service_id = (
+ compute_client.api_version >= api_versions.APIVersion('2.53'))
+ service_id = None
+ if requires_service_id:
+ # TODO(mriedem): Add an --id option so users can pass the service
+ # id (as a uuid) directly rather than make us look it up using
+ # host/binary.
+ service_id = SetService._find_service_by_host_and_binary(
+ cs, parsed_args.host, parsed_args.service).id
+
result = 0
enabled = None
try:
@@ -183,14 +224,21 @@ class SetService(command.Command):
if enabled is not None:
if enabled:
- cs.enable(parsed_args.host, parsed_args.service)
+ args = (service_id,) if requires_service_id else (
+ parsed_args.host, parsed_args.service)
+ cs.enable(*args)
else:
if parsed_args.disable_reason:
- cs.disable_log_reason(parsed_args.host,
- parsed_args.service,
- parsed_args.disable_reason)
+ args = (service_id, parsed_args.disable_reason) if \
+ requires_service_id else (
+ parsed_args.host,
+ parsed_args.service,
+ parsed_args.disable_reason)
+ cs.disable_log_reason(*args)
else:
- cs.disable(parsed_args.host, parsed_args.service)
+ args = (service_id,) if requires_service_id else (
+ parsed_args.host, parsed_args.service)
+ cs.disable(*args)
except Exception:
status = "enabled" if enabled else "disabled"
LOG.error("Failed to set service status to %s", status)
@@ -208,8 +256,9 @@ class SetService(command.Command):
'required')
raise exceptions.CommandError(msg)
try:
- cs.force_down(parsed_args.host, parsed_args.service,
- force_down=force_down)
+ args = (service_id, force_down) if requires_service_id else (
+ parsed_args.host, parsed_args.service, force_down)
+ cs.force_down(*args)
except Exception:
state = "down" if force_down else "up"
LOG.error("Failed to set service state to %s", state)