Adding 'magnum service-list'

The client changes after introducing API/backend implementations.

Change-Id: I81e84c98e63dc0a1eafb1c1429cd6316c3852e88
Partially-Implements: blueprint magnum-service-list
Closes-bug: #1498228
Depends-On: Ib816f595ba2edef29edaec40fa940570755b10aa
This commit is contained in:
Surojit Pathak 2015-09-21 22:39:49 +00:00
parent 07a3a105c2
commit b452363e92
7 changed files with 150 additions and 1 deletions

View File

@ -827,3 +827,9 @@ class TestCommandLineArgument(utils.TestCase):
def test_container_execute_failure_no_arg(self, mock_execute):
self._test_arg_failure('container-exec', self._few_argument_error)
self.assertFalse(mock_execute.called)
@mock.patch('magnumclient.v1.mservices.MServiceManager.list')
def test_magnum_service_list_failure(self, mock_list):
self._test_arg_failure('service-list --wrong',
self._unrecognized_arg_error)
self.assertFalse(mock_list.called)

View File

@ -0,0 +1,55 @@
# 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 testtools
from testtools import matchers
from magnumclient.tests import utils
from magnumclient.v1 import mservices
SERVICE1 = {'id': 123,
'host': 'fake-host1',
'binary': 'fake-bin1',
'state': 'up',
}
SERVICE2 = {'id': 124,
'host': 'fake-host2',
'binary': 'fake-bin2',
'state': 'down',
}
fake_responses = {
'/v1/mservices':
{
'GET': (
{},
{'mservices': [SERVICE1, SERVICE2]},
),
},
}
class MServiceManagerTest(testtools.TestCase):
def setUp(self):
super(MServiceManagerTest, self).setUp()
self.api = utils.FakeAPI(fake_responses)
self.mgr = mservices.MServiceManager(self.api)
def test_coe_service_list(self):
mservices = self.mgr.list()
expect = [
('GET', '/v1/mservices', {}, None),
]
self.assertEqual(expect, self.api.calls)
self.assertThat(mservices, matchers.HasLength(2))

View File

@ -596,3 +596,10 @@ class ShellTest(base.TestCase):
shell.do_container_exec(client_mock, args)
client_mock.containers.execute.assert_called_once_with(
container_id, command)
def test_do_service_list(self):
client_mock = mock.MagicMock()
args = mock.MagicMock()
shell.do_service_list(client_mock, args)
client_mock.mservices.list.assert_called_once_with()

View File

@ -20,6 +20,7 @@ from magnumclient.common import httpclient
from magnumclient.v1 import baymodels
from magnumclient.v1 import bays
from magnumclient.v1 import containers
from magnumclient.v1 import mservices
from magnumclient.v1 import nodes
from magnumclient.v1 import pods
from magnumclient.v1 import replicationcontrollers as rcs
@ -78,6 +79,7 @@ class Client(object):
self.pods = pods.PodManager(self.http_client)
self.rcs = rcs.ReplicationControllerManager(self.http_client)
self.services = services.ServiceManager(self.http_client)
self.mservices = mservices.MServiceManager(self.http_client)
@staticmethod
def get_keystone_client(username=None, api_key=None, auth_url=None,

View File

@ -0,0 +1,71 @@
# 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 magnumclient.common import base
from magnumclient.common import utils
class MService(base.Resource):
def __repr__(self):
return "<Service %s>" % self._info
class MServiceManager(base.Manager):
resource_class = MService
@staticmethod
def _path(id=None):
return '/v1/mservices/%s' % id if id else '/v1/mservices'
def list(self, marker=None, limit=None, sort_key=None,
sort_dir=None, detail=False):
"""Retrieve list of magnum services.
:param marker: Optional, the ID of a magnum service, eg the last
services from a previous result set. Return
the next result set.
:param limit: The maximum number of results to return per
request, if:
1) limit > 0, the maximum number of services to return.
2) limit == 0, return the entire list of services.
3) limit param is NOT specified (None), the number of items
returned respect the maximum imposed by the Magnum API
(see Magnum's api.max_limit option).
:param sort_key: Optional, field used for sorting.
:param sort_dir: Optional, direction of sorting, either 'asc' (the
default) or 'desc'.
:param detail: Optional, boolean whether to return detailed information
about services.
:returns: A list of services.
"""
if limit is not None:
limit = int(limit)
filters = utils.common_filters(marker, limit, sort_key, sort_dir)
path = ''
if detail:
path += 'detail'
if filters:
path += '?' + '&'.join(filters)
if limit is None:
return self._list(self._path(path), "mservices")
else:
return self._list_pagination(self._path(path), "mservices",
limit=limit)

View File

@ -21,7 +21,7 @@ CREATION_ATTRIBUTES = ['bay_uuid', 'manifest', 'manifest_url']
class Service(base.Resource):
def __repr__(self):
return "<Service %s>" % self._info
return "<COE-Service %s>" % self._info
class ServiceManager(base.Manager):

View File

@ -472,6 +472,14 @@ def do_coe_service_list(cs, args):
{'versions': _print_list_field('versions')})
def do_service_list(cs, args):
"""Print a list of magnum services."""
mservices = cs.mservices.list()
columns = ('id', 'host', 'binary', 'state')
utils.print_list(mservices, columns,
{'versions': _print_list_field('versions')})
@utils.arg('--manifest-url',
metavar='<manifest-url>',
help='Name/URL of the serivce file to use for creating services.')