Add show storage detail command
Add new command 'rsd storage show' to allow user to display the storage service details. Change-Id: Ibfa97f277ddfdae3511445a3ffd5323239eda8f0
This commit is contained in:
parent
834e086e87
commit
d19e8f5410
@ -13,14 +13,36 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
from rsdclient.common import command
|
from rsdclient.common import command
|
||||||
|
|
||||||
|
|
||||||
class ListStorage(command.Command):
|
class ListStorageServices(command.Command):
|
||||||
_description = "List all storage services"
|
_description = "List all storage services"
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
def take_action(self, parsed_args):
|
||||||
self.log.debug("take_action(%s)", parsed_args)
|
self.log.debug("take_action(%s)", parsed_args)
|
||||||
rsd_client = self.app.client_manager.rsd
|
rsd_client = self.app.client_manager.rsd
|
||||||
storage_service_list = rsd_client.storage.list()
|
storage_service_list = rsd_client.storage_service.list()
|
||||||
print(storage_service_list)
|
print(storage_service_list)
|
||||||
|
|
||||||
|
|
||||||
|
class ShowStorageServices(command.Command):
|
||||||
|
_description = "Display storage service details"
|
||||||
|
|
||||||
|
def get_parser(self, prog_name):
|
||||||
|
parser = super(ShowStorageServices, self).get_parser(prog_name)
|
||||||
|
parser.add_argument(
|
||||||
|
'storageservice',
|
||||||
|
metavar='<storage service>',
|
||||||
|
help='ID of the storage service.')
|
||||||
|
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def take_action(self, parsed_args):
|
||||||
|
self.log.debug("take_action(%s)", parsed_args)
|
||||||
|
rsd_client = self.app.client_manager.rsd
|
||||||
|
storage_detail = rsd_client.storage_service.show(
|
||||||
|
parsed_args.storageservice)
|
||||||
|
print("{0}".format(json.dumps(storage_detail, indent=2)))
|
@ -13,7 +13,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
#
|
#
|
||||||
|
|
||||||
from rsdclient.common import utils
|
import mock
|
||||||
|
|
||||||
|
|
||||||
FAKE_NODE_PYTHON_DICT = {
|
FAKE_NODE_PYTHON_DICT = {
|
||||||
@ -78,6 +78,54 @@ class FakeNode(object):
|
|||||||
self.memory_summary = FakeMemorySummary()
|
self.memory_summary = FakeMemorySummary()
|
||||||
self.uuid = "fd011520-86a2-11e7-b4d4-5d323196a3e4"
|
self.uuid = "fd011520-86a2-11e7-b4d4-5d323196a3e4"
|
||||||
|
|
||||||
|
FAKE_STORAGE_PYTHON_DICT = {
|
||||||
|
'description': 'Storage Service for Testing',
|
||||||
|
'identity': '1',
|
||||||
|
'name': 'Storage Service',
|
||||||
|
'redfish_version': '1.0.0',
|
||||||
|
'remote_targets': [{
|
||||||
|
'addresses': [{
|
||||||
|
'iSCSI': {
|
||||||
|
'TargetIQN': 'base_logical_volume_target',
|
||||||
|
'TargetLUN': [{
|
||||||
|
'LUN': 1,
|
||||||
|
'LogicalDrive': {
|
||||||
|
'@odata.id': '/redfish/v1/Services/1/LogicalDrives/2'
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
'TargetPortalIP': '10.2.0.4',
|
||||||
|
'TargetPortalPort': 3260
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
'identity': '1',
|
||||||
|
'initiator': [{'iSCSI': {'InitiatorIQN': 'ALL'}}],
|
||||||
|
'redfish_version': '1.0.0',
|
||||||
|
'target_type': 'iSCSITargets'
|
||||||
|
}],
|
||||||
|
'physical_drives': [{
|
||||||
|
'capacity_gib': 931,
|
||||||
|
'drive_type': 'HDD',
|
||||||
|
'identity': '1',
|
||||||
|
'interface': 'SATA',
|
||||||
|
'manufacturer': 'fake manufacture',
|
||||||
|
'model': 'ST1000NM0033-9ZM',
|
||||||
|
'redfish_version': '1.0.0',
|
||||||
|
'rpm': 7200,
|
||||||
|
'serial_number': 'Z1W23Q3V'
|
||||||
|
}],
|
||||||
|
'logical_drives': [{
|
||||||
|
'bootable': True,
|
||||||
|
'capacity_gib': 5589,
|
||||||
|
'drive_type': 'LVM',
|
||||||
|
'identity': '2',
|
||||||
|
'image': 'fake image',
|
||||||
|
'mode': 'LVG',
|
||||||
|
'protected': False,
|
||||||
|
'redfish_version': '1.0.0',
|
||||||
|
'snapshot': False
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class FakeRemoteTarget(object):
|
class FakeRemoteTarget(object):
|
||||||
|
|
||||||
@ -136,9 +184,9 @@ class FakeStorageSerice(object):
|
|||||||
self.identity = '1'
|
self.identity = '1'
|
||||||
self.name = 'Storage Service'
|
self.name = 'Storage Service'
|
||||||
self.redfish_version = '1.0.0'
|
self.redfish_version = '1.0.0'
|
||||||
self.remote_targets = [FakeRemoteTarget()]
|
self.remote_targets = mock.Mock()
|
||||||
self.physical_drives = [FakePhysicalDrive()]
|
self.remote_targets.get_members.return_value = [FakeRemoteTarget()]
|
||||||
self.logical_drives = [FakeLogicalDrive()]
|
self.physical_drives = mock.Mock()
|
||||||
|
self.physical_drives.get_members.return_value = [FakePhysicalDrive()]
|
||||||
|
self.logical_drives = mock.Mock()
|
||||||
FAKE_STORAGE_PYTHON_DICT = utils.extract_attr(FakeStorageSerice())
|
self.logical_drives.get_members.return_value = [FakeLogicalDrive()]
|
||||||
|
@ -17,7 +17,7 @@ import mock
|
|||||||
import testtools
|
import testtools
|
||||||
|
|
||||||
from rsdclient.tests.common import fakes
|
from rsdclient.tests.common import fakes
|
||||||
from rsdclient.v1 import storage
|
from rsdclient.v1 import storage_service
|
||||||
|
|
||||||
|
|
||||||
class NodeTest(testtools.TestCase):
|
class NodeTest(testtools.TestCase):
|
||||||
@ -26,7 +26,7 @@ class NodeTest(testtools.TestCase):
|
|||||||
super(NodeTest, self).setUp()
|
super(NodeTest, self).setUp()
|
||||||
self.client = mock.Mock()
|
self.client = mock.Mock()
|
||||||
self.client._storage_service_path = '/redfish/v1/Services'
|
self.client._storage_service_path = '/redfish/v1/Services'
|
||||||
self.mgr = storage.StorageManager(self.client)
|
self.mgr = storage_service.StorageServiceManager(self.client)
|
||||||
|
|
||||||
def test_list_storage(self):
|
def test_list_storage(self):
|
||||||
mock_storage_collection = mock.Mock()
|
mock_storage_collection = mock.Mock()
|
||||||
@ -49,3 +49,10 @@ class NodeTest(testtools.TestCase):
|
|||||||
self.mgr.client.get_storage_service.assert_called_once_with(
|
self.mgr.client.get_storage_service.assert_called_once_with(
|
||||||
'/redfish/v1/Services/1')
|
'/redfish/v1/Services/1')
|
||||||
self.assertEqual(str(result), expected)
|
self.assertEqual(str(result), expected)
|
||||||
|
|
||||||
|
def test_show_storage(self):
|
||||||
|
self.client.get_storage_service.return_value = \
|
||||||
|
fakes.FakeStorageSerice()
|
||||||
|
result = self.mgr.show('1')
|
||||||
|
expected = fakes.FAKE_STORAGE_PYTHON_DICT
|
||||||
|
self.assertEqual(result, expected)
|
@ -16,7 +16,7 @@
|
|||||||
import rsd_lib
|
import rsd_lib
|
||||||
|
|
||||||
from rsdclient.v1 import node
|
from rsdclient.v1 import node
|
||||||
from rsdclient.v1 import storage
|
from rsdclient.v1 import storage_service
|
||||||
|
|
||||||
|
|
||||||
class Client(object):
|
class Client(object):
|
||||||
@ -25,4 +25,5 @@ class Client(object):
|
|||||||
self.client = rsd_lib.RSDLib(base_url, username, password,
|
self.client = rsd_lib.RSDLib(base_url, username, password,
|
||||||
verify=verify)
|
verify=verify)
|
||||||
self.node = node.NodeManager(self.client)
|
self.node = node.NodeManager(self.client)
|
||||||
self.storage = storage.StorageManager(self.client)
|
self.storage_service = \
|
||||||
|
storage_service.StorageServiceManager(self.client)
|
||||||
|
@ -19,11 +19,11 @@ from rsdclient.common import base
|
|||||||
from rsdclient.common import utils
|
from rsdclient.common import utils
|
||||||
|
|
||||||
|
|
||||||
class StorageManager(base.Manager):
|
class StorageServiceManager(base.Manager):
|
||||||
_resource_name = 'storages'
|
_resource_name = 'storages'
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(StorageManager, self).__init__(*args, **kwargs)
|
super(StorageServiceManager, self).__init__(*args, **kwargs)
|
||||||
self.storage_service_path = self.client._storage_service_path
|
self.storage_service_path = self.client._storage_service_path
|
||||||
|
|
||||||
def _get_storage_service_uri(self, storage_service_id):
|
def _get_storage_service_uri(self, storage_service_id):
|
||||||
@ -39,3 +39,21 @@ class StorageManager(base.Manager):
|
|||||||
storage_info_table = utils.print_dict(
|
storage_info_table = utils.print_dict(
|
||||||
storages, ["Identity", "Name", "Description"])
|
storages, ["Identity", "Name", "Description"])
|
||||||
return storage_info_table
|
return storage_info_table
|
||||||
|
|
||||||
|
def show(self, storage_id):
|
||||||
|
storage = self.client.get_storage_service(
|
||||||
|
self._get_storage_service_uri(storage_id))
|
||||||
|
storage_dict = utils.extract_attr(storage)
|
||||||
|
|
||||||
|
# Append sub-items attributions
|
||||||
|
storage_dict['remote_targets'] = [
|
||||||
|
utils.extract_attr(item)
|
||||||
|
for item in storage.remote_targets.get_members()]
|
||||||
|
storage_dict['physical_drives'] = [
|
||||||
|
utils.extract_attr(item)
|
||||||
|
for item in storage.physical_drives.get_members()]
|
||||||
|
storage_dict['logical_drives'] = [
|
||||||
|
utils.extract_attr(item)
|
||||||
|
for item in storage.logical_drives.get_members()]
|
||||||
|
|
||||||
|
return storage_dict
|
@ -33,7 +33,8 @@ openstack.rsd.v1 =
|
|||||||
rsd_node_show = rsdclient.osc.v1.node:ShowNode
|
rsd_node_show = rsdclient.osc.v1.node:ShowNode
|
||||||
rsd_node_list = rsdclient.osc.v1.node:ListNode
|
rsd_node_list = rsdclient.osc.v1.node:ListNode
|
||||||
|
|
||||||
rsd_storage_list = rsdclient.osc.v1.storage:ListStorage
|
rsd_storage_list = rsdclient.osc.v1.storage_service:ListStorageServices
|
||||||
|
rsd_storage_show = rsdclient.osc.v1.storage_service:ShowStorageServices
|
||||||
|
|
||||||
[build_sphinx]
|
[build_sphinx]
|
||||||
all-files = 1
|
all-files = 1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user