From f4705f9169233142ed6ced04f7bf109290e6a477 Mon Sep 17 00:00:00 2001 From: miaohb Date: Sat, 27 May 2017 11:06:16 +0800 Subject: [PATCH] OSC support service api This patch adds osc client support for service api(including list, delete, enable, disable and forcedown). Change-Id: Ibfc67bc5f2147864d0808dd9c929865b5d10ce48 Implements: blueprint enhance-service-api --- setup.cfg | 5 ++ zunclient/osc/v1/services.py | 159 +++++++++++++++++++++++++++++++++++ 2 files changed, 164 insertions(+) create mode 100644 zunclient/osc/v1/services.py diff --git a/setup.cfg b/setup.cfg index 24f1ce02..679cd060 100644 --- a/setup.cfg +++ b/setup.cfg @@ -30,6 +30,11 @@ openstack.cli.extension = container = zunclient.osc.plugin openstack.container.v1 = + appcontainer_service_list = zunclient.osc.v1.services:ListService + appcontainer_service_delete = zunclient.osc.v1.services:DeleteService + appcontainer_service_enable = zunclient.osc.v1.services:EnableService + appcontainer_service_disable = zunclient.osc.v1.services:DisableService + appcontainer_service_forcedown = zunclient.osc.v1.services:ForceDownService appcontainer_create = zunclient.osc.v1.containers:CreateContainer appcontainer_show = zunclient.osc.v1.containers:ShowContainer appcontainer_list = zunclient.osc.v1.containers:ListContainer diff --git a/zunclient/osc/v1/services.py b/zunclient/osc/v1/services.py new file mode 100644 index 00000000..274bf6e6 --- /dev/null +++ b/zunclient/osc/v1/services.py @@ -0,0 +1,159 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import logging + +from osc_lib.command import command +from osc_lib import utils + + +def _get_client(obj, parsed_args): + obj.log.debug("take_action(%s)" % parsed_args) + return obj.app.client_manager.container + + +class ListService(command.Lister): + """Print a list of zun services.""" + + log = logging.getLogger(__name__ + ".ListService") + + def get_parser(self, prog_name): + parser = super(ListService, self).get_parser(prog_name) + return parser + + def take_action(self, parsed_args): + client = _get_client(self, parsed_args) + services = client.services.list() + columns = ('Id', 'Host', 'Binary', 'State', 'Disabled', + 'Disabled Reason', 'Created At', 'Updated At') + return (columns, (utils.get_item_properties(service, columns) + for service in services)) + + +class DeleteService(command.Command): + """Delete the Zun binaries/services.""" + + log = logging.getLogger(__name__ + ".DeleteService") + + def get_parser(self, prog_name): + parser = super(DeleteService, self).get_parser(prog_name) + parser.add_argument( + 'host', + metavar='', + help='Name of host') + parser.add_argument( + 'binary', + metavar='', + help='Name of the binary to delete') + return parser + + def take_action(self, parsed_args): + client = _get_client(self, parsed_args) + host = parsed_args.host + binary = parsed_args.binary + try: + client.services.delete(host, binary) + print("Request to delete binary %s on host %s has been accepted." % + (binary, host)) + except Exception as e: + print("Delete for binary %s on host %s failed: %s" % + (binary, host, e)) + + +class EnableService(command.ShowOne): + """Enable the Zun service.""" + log = logging.getLogger(__name__ + ".EnableService") + + def get_parser(self, prog_name): + parser = super(EnableService, self).get_parser(prog_name) + parser.add_argument( + 'host', + metavar='', + help='Name of host') + parser.add_argument( + 'binary', + metavar='', + help='Name of the binary to enable') + return parser + + def take_action(self, parsed_args): + client = _get_client(self, parsed_args) + host = parsed_args.host + binary = parsed_args.binary + res = client.services.enable(host, binary) + columns = ('Host', 'Binary', 'Disabled', 'Disabled Reason') + return columns, (utils.get_dict_properties(res[1]['service'], + columns)) + + +class DisableService(command.ShowOne): + """Disable the Zun service.""" + log = logging.getLogger(__name__ + ".DisableService") + + def get_parser(self, prog_name): + parser = super(DisableService, self).get_parser(prog_name) + parser.add_argument( + 'host', + metavar='', + help='Name of host') + parser.add_argument( + 'binary', + metavar='', + help='Name of the binary to disable') + parser.add_argument( + '--reason', + metavar='', + help='Reason for disabling service') + return parser + + def take_action(self, parsed_args): + client = _get_client(self, parsed_args) + host = parsed_args.host + binary = parsed_args.binary + reason = parsed_args.reason + res = client.services.disable(host, binary, reason) + columns = ('Host', 'Binary', 'Disabled', 'Disabled Reason') + return columns, (utils.get_dict_properties(res[1]['service'], + columns)) + + +class ForceDownService(command.ShowOne): + """Force the Zun service to down or up.""" + log = logging.getLogger(__name__ + ".ForceDownService") + + def get_parser(self, prog_name): + parser = super(ForceDownService, self).get_parser(prog_name) + parser.add_argument( + 'host', + metavar='', + help='Name of host') + parser.add_argument( + 'binary', + metavar='', + help='Name of the binary to disable') + parser.add_argument( + '--unset', + dest='force_down', + help='Unset the force state down of service', + action='store_false', + default=True) + return parser + + def take_action(self, parsed_args): + client = _get_client(self, parsed_args) + host = parsed_args.host + binary = parsed_args.binary + force_down = parsed_args.force_down + res = client.services.force_down(host, binary, force_down) + columns = ('Host', 'Binary', 'Forced_down') + return columns, (utils.get_dict_properties(res[1]['service'], + columns))