From 05b396bfa1e6224efa57d7da92b575aaf8778edb Mon Sep 17 00:00:00 2001 From: Endre Karlson Date: Wed, 24 Feb 2016 13:11:08 +0100 Subject: [PATCH] Add support for service status Change-Id: I5349524d262ffcadf88b3c914f187dfc26563156 Depends-On: Iaf10d8486ac8015ecf9f394dfbf074bfb863fb78 --- .../tests/v2/test_service_statuses.py | 46 ++++++++++ designateclient/v2/cli/service_statuses.py | 87 +++++++++++++++++++ designateclient/v2/client.py | 2 + designateclient/v2/service_statuses.py | 28 ++++++ setup.cfg | 3 + 5 files changed, 166 insertions(+) create mode 100644 designateclient/tests/v2/test_service_statuses.py create mode 100644 designateclient/v2/cli/service_statuses.py create mode 100644 designateclient/v2/service_statuses.py diff --git a/designateclient/tests/v2/test_service_statuses.py b/designateclient/tests/v2/test_service_statuses.py new file mode 100644 index 0000000..9dd571d --- /dev/null +++ b/designateclient/tests/v2/test_service_statuses.py @@ -0,0 +1,46 @@ +# Copyright 2016 Hewlett Packard Enterprise Development Company LP +# +# Author: Endre Karlson +# +# 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. +from designateclient.tests import v2 + + +class TestServiceStatuses(v2.APIV2TestCase, v2.CrudMixin): + RESOURCE = 'service_statuses' + + def new_ref(self, **kwargs): + ref = super(TestServiceStatuses, self).new_ref(**kwargs) + ref["name"] = "foo" + return ref + + def test_get(self): + ref = self.new_ref() + + self.stub_entity("GET", entity=ref, id=ref["id"]) + + response = self.client.service_statuses.get(ref["id"]) + self.assertEqual(ref, response) + + def test_list(self): + items = [ + self.new_ref(), + self.new_ref() + ] + + self.stub_url("GET", parts=[self.RESOURCE], + json={"service_statuses": items}) + + listed = self.client.service_statuses.list() + self.assertList(items, listed) + self.assertQueryStringIs("") diff --git a/designateclient/v2/cli/service_statuses.py b/designateclient/v2/cli/service_statuses.py new file mode 100644 index 0000000..9be0429 --- /dev/null +++ b/designateclient/v2/cli/service_statuses.py @@ -0,0 +1,87 @@ +# Copyright 2016 Hewlett Packard Enterprise Development Company LP +# +# Author: Endre Karlson +# +# 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 cliff import lister +from cliff import show +import six + +from designateclient import utils +from designateclient.v2 import utils as v2_utils + +LOG = logging.getLogger(__name__) + + +def _format_status(status): + status.pop("links", None) + # Remove unneeded fields for display output formatting + for k in ("capabilities", "stats"): + status[k] = "\n".join(status[k]) if status[k] else "-" + return status + + +class ListServiceStatusesCommand(lister.Lister): + """List service statuses""" + + columns = ['id', 'hostname', 'service_name', 'status', 'stats', + 'capabilities'] + + def get_parser(self, prog_name): + parser = super(ListServiceStatusesCommand, self).get_parser(prog_name) + + parser.add_argument("--hostname", help="Hostname", required=False) + parser.add_argument("--service_name", help="Service Name", + required=False) + parser.add_argument("--status", help="Status", required=False) + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.dns + + cols = self.columns + + criterion = {} + for i in ["hostname", "service_name", "status"]: + v = getattr(parsed_args, i) + if v is not None: + criterion[i] = v + + data = v2_utils.get_all(client.service_statuses.list, + criterion=criterion) + + for i, s in enumerate(data): + data[i] = _format_status(s) + + return cols, (utils.get_item_properties(s, cols) for s in data) + + +class ShowServiceStatusCommand(show.ShowOne): + """Show service status details""" + + def get_parser(self, prog_name): + parser = super(ShowServiceStatusCommand, self).get_parser(prog_name) + + parser.add_argument('id', help="Service Status ID") + + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.dns + data = client.service_statuses.get(parsed_args.id) + + _format_status(data) + return six.moves.zip(*sorted(six.iteritems(data))) diff --git a/designateclient/v2/client.py b/designateclient/v2/client.py index 2dc3f80..911b6ef 100644 --- a/designateclient/v2/client.py +++ b/designateclient/v2/client.py @@ -21,6 +21,7 @@ from designateclient.v2.limits import LimitController from designateclient.v2.nameservers import NameServerController from designateclient.v2.recordsets import RecordSetController from designateclient.v2.reverse import FloatingIPController +from designateclient.v2.service_statuses import ServiceStatusesController from designateclient.v2.tlds import TLDController from designateclient.v2.zones import ZoneController from designateclient.v2.zones import ZoneExportsController @@ -97,6 +98,7 @@ class Client(object): self.limits = LimitController(self) self.nameservers = NameServerController(self) self.recordsets = RecordSetController(self) + self.service_statuses = ServiceStatusesController(self) self.tlds = TLDController(self) self.zones = ZoneController(self) self.zone_transfers = ZoneTransfersController(self) diff --git a/designateclient/v2/service_statuses.py b/designateclient/v2/service_statuses.py new file mode 100644 index 0000000..9477e97 --- /dev/null +++ b/designateclient/v2/service_statuses.py @@ -0,0 +1,28 @@ +# Copyright 2016 Hewlett Packard Enterprise Development Company LP +# +# Author: Endre Karlson +# +# 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. +from designateclient.v2 import base + + +class ServiceStatusesController(base.V2Controller): + def list(self, criterion=None, marker=None, limit=None): + url = self.build_url('/service_statuses', criterion, marker, limit) + + return self._get(url, response_key="service_statuses") + + def get(self, service_status_id): + url = '/service_statuses/%s' % service_status_id + + return self._get(url) diff --git a/setup.cfg b/setup.cfg index df44212..ce353ef 100644 --- a/setup.cfg +++ b/setup.cfg @@ -139,6 +139,9 @@ openstack.dns.v2 = ptr_record_set = designateclient.v2.cli.reverse:SetFloatingIPCommand ptr_record_unset = designateclient.v2.cli.reverse:UnsetFloatingIPCommand + dns_service_list = designateclient.v2.cli.service_statuses:ListServiceStatusesCommand + dns_service_show = designateclient.v2.cli.service_statuses:ShowServiceStatusCommand + [build_sphinx] all_files = 1 build-dir = doc/build