Merge "Add availability-zone-list command"
This commit is contained in:
commit
3a3801635c
@ -558,3 +558,58 @@ class FakeHTTPClient(base_client.HTTPClient):
|
||||
def put_os_services_disable(self, body, **kw):
|
||||
return (200, {}, {'host': body['host'], 'binary': body['binary'],
|
||||
'status': 'enabled'})
|
||||
|
||||
def get_os_availability_zone(self, **kw):
|
||||
return (200, {}, {
|
||||
"availabilityZoneInfo": [
|
||||
{
|
||||
"zoneName": "zone-1",
|
||||
"zoneState": {"available": True},
|
||||
"hosts": None,
|
||||
},
|
||||
{
|
||||
"zoneName": "zone-2",
|
||||
"zoneState": {"available": False},
|
||||
"hosts": None,
|
||||
},
|
||||
]
|
||||
})
|
||||
|
||||
def get_os_availability_zone_detail(self, **kw):
|
||||
return (200, {}, {
|
||||
"availabilityZoneInfo": [
|
||||
{
|
||||
"zoneName": "zone-1",
|
||||
"zoneState": {"available": True},
|
||||
"hosts": {
|
||||
"fake_host-1": {
|
||||
"cinder-volume": {
|
||||
"active": True,
|
||||
"available": True,
|
||||
"updated_at":
|
||||
datetime(2012, 12, 26, 14, 45, 25, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"zoneName": "internal",
|
||||
"zoneState": {"available": True},
|
||||
"hosts": {
|
||||
"fake_host-1": {
|
||||
"cinder-sched": {
|
||||
"active": True,
|
||||
"available": True,
|
||||
"updated_at":
|
||||
datetime(2012, 12, 26, 14, 45, 24, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"zoneName": "zone-2",
|
||||
"zoneState": {"available": False},
|
||||
"hosts": None,
|
||||
},
|
||||
]
|
||||
})
|
||||
|
87
cinderclient/tests/v1/test_availability_zone.py
Normal file
87
cinderclient/tests/v1/test_availability_zone.py
Normal file
@ -0,0 +1,87 @@
|
||||
# Copyright 2011-2013 OpenStack Foundation
|
||||
# Copyright 2013 IBM Corp.
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# 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 six
|
||||
|
||||
from cinderclient.v1 import availability_zones
|
||||
from cinderclient.v1 import shell
|
||||
from cinderclient.tests import utils
|
||||
from cinderclient.tests.v1 import fakes
|
||||
|
||||
|
||||
cs = fakes.FakeClient()
|
||||
|
||||
|
||||
class AvailabilityZoneTest(utils.TestCase):
|
||||
|
||||
def _assertZone(self, zone, name, status):
|
||||
self.assertEqual(zone.zoneName, name)
|
||||
self.assertEqual(zone.zoneState, status)
|
||||
|
||||
def test_list_availability_zone(self):
|
||||
zones = cs.availability_zones.list(detailed=False)
|
||||
cs.assert_called('GET', '/os-availability-zone')
|
||||
|
||||
for zone in zones:
|
||||
self.assertTrue(isinstance(zone,
|
||||
availability_zones.AvailabilityZone))
|
||||
|
||||
self.assertEqual(2, len(zones))
|
||||
|
||||
l0 = [six.u('zone-1'), six.u('available')]
|
||||
l1 = [six.u('zone-2'), six.u('not available')]
|
||||
|
||||
z0 = shell._treeizeAvailabilityZone(zones[0])
|
||||
z1 = shell._treeizeAvailabilityZone(zones[1])
|
||||
|
||||
self.assertEqual((len(z0), len(z1)), (1, 1))
|
||||
|
||||
self._assertZone(z0[0], l0[0], l0[1])
|
||||
self._assertZone(z1[0], l1[0], l1[1])
|
||||
|
||||
def test_detail_availability_zone(self):
|
||||
zones = cs.availability_zones.list(detailed=True)
|
||||
cs.assert_called('GET', '/os-availability-zone/detail')
|
||||
|
||||
for zone in zones:
|
||||
self.assertTrue(isinstance(zone,
|
||||
availability_zones.AvailabilityZone))
|
||||
|
||||
self.assertEqual(3, len(zones))
|
||||
|
||||
l0 = [six.u('zone-1'), six.u('available')]
|
||||
l1 = [six.u('|- fake_host-1'), six.u('')]
|
||||
l2 = [six.u('| |- cinder-volume'),
|
||||
six.u('enabled :-) 2012-12-26 14:45:25')]
|
||||
l3 = [six.u('internal'), six.u('available')]
|
||||
l4 = [six.u('|- fake_host-1'), six.u('')]
|
||||
l5 = [six.u('| |- cinder-sched'),
|
||||
six.u('enabled :-) 2012-12-26 14:45:24')]
|
||||
l6 = [six.u('zone-2'), six.u('not available')]
|
||||
|
||||
z0 = shell._treeizeAvailabilityZone(zones[0])
|
||||
z1 = shell._treeizeAvailabilityZone(zones[1])
|
||||
z2 = shell._treeizeAvailabilityZone(zones[2])
|
||||
|
||||
self.assertEqual((len(z0), len(z1), len(z2)), (3, 3, 1))
|
||||
|
||||
self._assertZone(z0[0], l0[0], l0[1])
|
||||
self._assertZone(z0[1], l1[0], l1[1])
|
||||
self._assertZone(z0[2], l2[0], l2[1])
|
||||
self._assertZone(z1[0], l3[0], l3[1])
|
||||
self._assertZone(z1[1], l4[0], l4[1])
|
||||
self._assertZone(z1[2], l5[0], l5[1])
|
||||
self._assertZone(z2[0], l6[0], l6[1])
|
@ -105,6 +105,10 @@ class ShellTest(utils.TestCase):
|
||||
self.run_command('list --all-tenants=1')
|
||||
self.assert_called('GET', '/volumes/detail?all_tenants=1')
|
||||
|
||||
def test_list_availability_zone(self):
|
||||
self.run_command('availability-zone-list')
|
||||
self.assert_called('GET', '/os-availability-zone')
|
||||
|
||||
def test_show(self):
|
||||
self.run_command('show 1234')
|
||||
self.assert_called('GET', '/volumes/1234')
|
||||
|
@ -565,3 +565,58 @@ class FakeHTTPClient(base_client.HTTPClient):
|
||||
def put_os_services_disable(self, body, **kw):
|
||||
return (200, {}, {'host': body['host'], 'binary': body['binary'],
|
||||
'status': 'enabled'})
|
||||
|
||||
def get_os_availability_zone(self, **kw):
|
||||
return (200, {}, {
|
||||
"availabilityZoneInfo": [
|
||||
{
|
||||
"zoneName": "zone-1",
|
||||
"zoneState": {"available": True},
|
||||
"hosts": None,
|
||||
},
|
||||
{
|
||||
"zoneName": "zone-2",
|
||||
"zoneState": {"available": False},
|
||||
"hosts": None,
|
||||
},
|
||||
]
|
||||
})
|
||||
|
||||
def get_os_availability_zone_detail(self, **kw):
|
||||
return (200, {}, {
|
||||
"availabilityZoneInfo": [
|
||||
{
|
||||
"zoneName": "zone-1",
|
||||
"zoneState": {"available": True},
|
||||
"hosts": {
|
||||
"fake_host-1": {
|
||||
"cinder-volume": {
|
||||
"active": True,
|
||||
"available": True,
|
||||
"updated_at":
|
||||
datetime(2012, 12, 26, 14, 45, 25, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"zoneName": "internal",
|
||||
"zoneState": {"available": True},
|
||||
"hosts": {
|
||||
"fake_host-1": {
|
||||
"cinder-sched": {
|
||||
"active": True,
|
||||
"available": True,
|
||||
"updated_at":
|
||||
datetime(2012, 12, 26, 14, 45, 24, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"zoneName": "zone-2",
|
||||
"zoneState": {"available": False},
|
||||
"hosts": None,
|
||||
},
|
||||
]
|
||||
})
|
||||
|
87
cinderclient/tests/v2/test_availability_zone.py
Normal file
87
cinderclient/tests/v2/test_availability_zone.py
Normal file
@ -0,0 +1,87 @@
|
||||
# Copyright 2011-2013 OpenStack Foundation
|
||||
# Copyright 2013 IBM Corp.
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# 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 six
|
||||
|
||||
from cinderclient.v1 import availability_zones
|
||||
from cinderclient.v1 import shell
|
||||
from cinderclient.tests import utils
|
||||
from cinderclient.tests.v1 import fakes
|
||||
|
||||
|
||||
cs = fakes.FakeClient()
|
||||
|
||||
|
||||
class AvailabilityZoneTest(utils.TestCase):
|
||||
|
||||
def _assertZone(self, zone, name, status):
|
||||
self.assertEqual(zone.zoneName, name)
|
||||
self.assertEqual(zone.zoneState, status)
|
||||
|
||||
def test_list_availability_zone(self):
|
||||
zones = cs.availability_zones.list(detailed=False)
|
||||
cs.assert_called('GET', '/os-availability-zone')
|
||||
|
||||
for zone in zones:
|
||||
self.assertTrue(isinstance(zone,
|
||||
availability_zones.AvailabilityZone))
|
||||
|
||||
self.assertEqual(2, len(zones))
|
||||
|
||||
l0 = [six.u('zone-1'), six.u('available')]
|
||||
l1 = [six.u('zone-2'), six.u('not available')]
|
||||
|
||||
z0 = shell._treeizeAvailabilityZone(zones[0])
|
||||
z1 = shell._treeizeAvailabilityZone(zones[1])
|
||||
|
||||
self.assertEqual((len(z0), len(z1)), (1, 1))
|
||||
|
||||
self._assertZone(z0[0], l0[0], l0[1])
|
||||
self._assertZone(z1[0], l1[0], l1[1])
|
||||
|
||||
def test_detail_availability_zone(self):
|
||||
zones = cs.availability_zones.list(detailed=True)
|
||||
cs.assert_called('GET', '/os-availability-zone/detail')
|
||||
|
||||
for zone in zones:
|
||||
self.assertTrue(isinstance(zone,
|
||||
availability_zones.AvailabilityZone))
|
||||
|
||||
self.assertEqual(3, len(zones))
|
||||
|
||||
l0 = [six.u('zone-1'), six.u('available')]
|
||||
l1 = [six.u('|- fake_host-1'), six.u('')]
|
||||
l2 = [six.u('| |- cinder-volume'),
|
||||
six.u('enabled :-) 2012-12-26 14:45:25')]
|
||||
l3 = [six.u('internal'), six.u('available')]
|
||||
l4 = [six.u('|- fake_host-1'), six.u('')]
|
||||
l5 = [six.u('| |- cinder-sched'),
|
||||
six.u('enabled :-) 2012-12-26 14:45:24')]
|
||||
l6 = [six.u('zone-2'), six.u('not available')]
|
||||
|
||||
z0 = shell._treeizeAvailabilityZone(zones[0])
|
||||
z1 = shell._treeizeAvailabilityZone(zones[1])
|
||||
z2 = shell._treeizeAvailabilityZone(zones[2])
|
||||
|
||||
self.assertEqual((len(z0), len(z1), len(z2)), (3, 3, 1))
|
||||
|
||||
self._assertZone(z0[0], l0[0], l0[1])
|
||||
self._assertZone(z0[1], l1[0], l1[1])
|
||||
self._assertZone(z0[2], l2[0], l2[1])
|
||||
self._assertZone(z1[0], l3[0], l3[1])
|
||||
self._assertZone(z1[1], l4[0], l4[1])
|
||||
self._assertZone(z1[2], l5[0], l5[1])
|
||||
self._assertZone(z2[0], l6[0], l6[1])
|
@ -83,6 +83,10 @@ class ShellTest(utils.TestCase):
|
||||
self.run_command('list --all-tenants=1')
|
||||
self.assert_called('GET', '/volumes/detail?all_tenants=1')
|
||||
|
||||
def test_list_availability_zone(self):
|
||||
self.run_command('availability-zone-list')
|
||||
self.assert_called('GET', '/os-availability-zone')
|
||||
|
||||
def test_show(self):
|
||||
self.run_command('show 1234')
|
||||
self.assert_called('GET', '/volumes/1234')
|
||||
|
42
cinderclient/v1/availability_zones.py
Normal file
42
cinderclient/v1/availability_zones.py
Normal file
@ -0,0 +1,42 @@
|
||||
# Copyright 2011-2013 OpenStack Foundation
|
||||
# Copyright 2013 IBM Corp.
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# 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.
|
||||
|
||||
"""Availability Zone interface (v1 extension)"""
|
||||
|
||||
from cinderclient import base
|
||||
|
||||
|
||||
class AvailabilityZone(base.Resource):
|
||||
NAME_ATTR = 'display_name'
|
||||
|
||||
def __repr__(self):
|
||||
return "<AvailabilityZone: %s>" % self.zoneName
|
||||
|
||||
|
||||
class AvailabilityZoneManager(base.ManagerWithFind):
|
||||
"""Manage :class:`AvailabilityZone` resources."""
|
||||
resource_class = AvailabilityZone
|
||||
|
||||
def list(self, detailed=False):
|
||||
"""Get a list of all availability zones
|
||||
|
||||
:rtype: list of :class:`AvailabilityZone`
|
||||
"""
|
||||
if detailed is True:
|
||||
return self._list("/os-availability-zone/detail",
|
||||
"availabilityZoneInfo")
|
||||
else:
|
||||
return self._list("/os-availability-zone", "availabilityZoneInfo")
|
@ -14,6 +14,7 @@
|
||||
# under the License.
|
||||
|
||||
from cinderclient import client
|
||||
from cinderclient.v1 import availability_zones
|
||||
from cinderclient.v1 import limits
|
||||
from cinderclient.v1 import quota_classes
|
||||
from cinderclient.v1 import quotas
|
||||
@ -64,6 +65,8 @@ class Client(object):
|
||||
self.restores = volume_backups_restore.VolumeBackupRestoreManager(self)
|
||||
self.transfers = volume_transfers.VolumeTransferManager(self)
|
||||
self.services = services.ServiceManager(self)
|
||||
self.availability_zones = \
|
||||
availability_zones.AvailabilityZoneManager(self)
|
||||
|
||||
# Add in any extensions...
|
||||
if extensions:
|
||||
|
@ -18,12 +18,14 @@
|
||||
from __future__ import print_function
|
||||
|
||||
import argparse
|
||||
import copy
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
from cinderclient import exceptions
|
||||
from cinderclient import utils
|
||||
from cinderclient.v1 import availability_zones
|
||||
|
||||
|
||||
def _poll_for_status(poll_fn, obj_id, action, final_ok_states,
|
||||
@ -108,6 +110,11 @@ def _translate_volume_snapshot_keys(collection):
|
||||
_translate_keys(collection, convert)
|
||||
|
||||
|
||||
def _translate_availability_zone_keys(collection):
|
||||
convert = [('zoneName', 'name'), ('zoneState', 'status')]
|
||||
_translate_keys(collection, convert)
|
||||
|
||||
|
||||
def _extract_metadata(args):
|
||||
metadata = {}
|
||||
for metadatum in args.metadata:
|
||||
@ -863,3 +870,63 @@ def do_service_enable(cs, args):
|
||||
def do_service_disable(cs, args):
|
||||
"""Disable the service."""
|
||||
cs.services.disable(args.host, args.binary)
|
||||
|
||||
|
||||
def _treeizeAvailabilityZone(zone):
|
||||
"""Build a tree view for availability zones."""
|
||||
AvailabilityZone = availability_zones.AvailabilityZone
|
||||
|
||||
az = AvailabilityZone(zone.manager,
|
||||
copy.deepcopy(zone._info), zone._loaded)
|
||||
result = []
|
||||
|
||||
# Zone tree view item
|
||||
az.zoneName = zone.zoneName
|
||||
az.zoneState = ('available'
|
||||
if zone.zoneState['available'] else 'not available')
|
||||
az._info['zoneName'] = az.zoneName
|
||||
az._info['zoneState'] = az.zoneState
|
||||
result.append(az)
|
||||
|
||||
if getattr(zone, "hosts", None) and zone.hosts is not None:
|
||||
for (host, services) in zone.hosts.items():
|
||||
# Host tree view item
|
||||
az = AvailabilityZone(zone.manager,
|
||||
copy.deepcopy(zone._info), zone._loaded)
|
||||
az.zoneName = '|- %s' % host
|
||||
az.zoneState = ''
|
||||
az._info['zoneName'] = az.zoneName
|
||||
az._info['zoneState'] = az.zoneState
|
||||
result.append(az)
|
||||
|
||||
for (svc, state) in services.items():
|
||||
# Service tree view item
|
||||
az = AvailabilityZone(zone.manager,
|
||||
copy.deepcopy(zone._info), zone._loaded)
|
||||
az.zoneName = '| |- %s' % svc
|
||||
az.zoneState = '%s %s %s' % (
|
||||
'enabled' if state['active'] else 'disabled',
|
||||
':-)' if state['available'] else 'XXX',
|
||||
state['updated_at'])
|
||||
az._info['zoneName'] = az.zoneName
|
||||
az._info['zoneState'] = az.zoneState
|
||||
result.append(az)
|
||||
return result
|
||||
|
||||
|
||||
@utils.service_type('volume')
|
||||
def do_availability_zone_list(cs, _args):
|
||||
"""List all the availability zones."""
|
||||
try:
|
||||
availability_zones = cs.availability_zones.list()
|
||||
except exceptions.Forbidden as e: # policy doesn't allow probably
|
||||
try:
|
||||
availability_zones = cs.availability_zones.list(detailed=False)
|
||||
except Exception:
|
||||
raise e
|
||||
|
||||
result = []
|
||||
for zone in availability_zones:
|
||||
result += _treeizeAvailabilityZone(zone)
|
||||
_translate_availability_zone_keys(result)
|
||||
utils.print_list(result, ['Name', 'Status'])
|
||||
|
42
cinderclient/v2/availability_zones.py
Normal file
42
cinderclient/v2/availability_zones.py
Normal file
@ -0,0 +1,42 @@
|
||||
# Copyright 2011-2013 OpenStack Foundation
|
||||
# Copyright 2013 IBM Corp.
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# 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.
|
||||
|
||||
"""Availability Zone interface (v2 extension)"""
|
||||
|
||||
from cinderclient import base
|
||||
|
||||
|
||||
class AvailabilityZone(base.Resource):
|
||||
NAME_ATTR = 'display_name'
|
||||
|
||||
def __repr__(self):
|
||||
return "<AvailabilityZone: %s>" % self.zoneName
|
||||
|
||||
|
||||
class AvailabilityZoneManager(base.ManagerWithFind):
|
||||
"""Manage :class:`AvailabilityZone` resources."""
|
||||
resource_class = AvailabilityZone
|
||||
|
||||
def list(self, detailed=False):
|
||||
"""Get a list of all availability zones
|
||||
|
||||
:rtype: list of :class:`AvailabilityZone`
|
||||
"""
|
||||
if detailed is True:
|
||||
return self._list("/os-availability-zone/detail",
|
||||
"availabilityZoneInfo")
|
||||
else:
|
||||
return self._list("/os-availability-zone", "availabilityZoneInfo")
|
@ -14,6 +14,7 @@
|
||||
# under the License.
|
||||
|
||||
from cinderclient import client
|
||||
from cinderclient.v1 import availability_zones
|
||||
from cinderclient.v2 import limits
|
||||
from cinderclient.v2 import quota_classes
|
||||
from cinderclient.v2 import quotas
|
||||
@ -62,6 +63,8 @@ class Client(object):
|
||||
self.restores = volume_backups_restore.VolumeBackupRestoreManager(self)
|
||||
self.transfers = volume_transfers.VolumeTransferManager(self)
|
||||
self.services = services.ServiceManager(self)
|
||||
self.availability_zones = \
|
||||
availability_zones.AvailabilityZoneManager(self)
|
||||
|
||||
# Add in any extensions...
|
||||
if extensions:
|
||||
|
@ -16,6 +16,7 @@
|
||||
from __future__ import print_function
|
||||
|
||||
import argparse
|
||||
import copy
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
@ -24,6 +25,7 @@ import six
|
||||
|
||||
from cinderclient import exceptions
|
||||
from cinderclient import utils
|
||||
from cinderclient.v2 import availability_zones
|
||||
|
||||
|
||||
def _poll_for_status(poll_fn, obj_id, action, final_ok_states,
|
||||
@ -102,6 +104,11 @@ def _translate_volume_snapshot_keys(collection):
|
||||
_translate_keys(collection, convert)
|
||||
|
||||
|
||||
def _translate_availability_zone_keys(collection):
|
||||
convert = [('zoneName', 'name'), ('zoneState', 'status')]
|
||||
_translate_keys(collection, convert)
|
||||
|
||||
|
||||
def _extract_metadata(args):
|
||||
metadata = {}
|
||||
for metadatum in args.metadata[0]:
|
||||
@ -948,3 +955,63 @@ def do_service_enable(cs, args):
|
||||
def do_service_disable(cs, args):
|
||||
"""Disable the service."""
|
||||
cs.services.disable(args.host, args.binary)
|
||||
|
||||
|
||||
def _treeizeAvailabilityZone(zone):
|
||||
"""Build a tree view for availability zones."""
|
||||
AvailabilityZone = availability_zones.AvailabilityZone
|
||||
|
||||
az = AvailabilityZone(zone.manager,
|
||||
copy.deepcopy(zone._info), zone._loaded)
|
||||
result = []
|
||||
|
||||
# Zone tree view item
|
||||
az.zoneName = zone.zoneName
|
||||
az.zoneState = ('available'
|
||||
if zone.zoneState['available'] else 'not available')
|
||||
az._info['zoneName'] = az.zoneName
|
||||
az._info['zoneState'] = az.zoneState
|
||||
result.append(az)
|
||||
|
||||
if getattr(zone, "hosts", None) and zone.hosts is not None:
|
||||
for (host, services) in zone.hosts.items():
|
||||
# Host tree view item
|
||||
az = AvailabilityZone(zone.manager,
|
||||
copy.deepcopy(zone._info), zone._loaded)
|
||||
az.zoneName = '|- %s' % host
|
||||
az.zoneState = ''
|
||||
az._info['zoneName'] = az.zoneName
|
||||
az._info['zoneState'] = az.zoneState
|
||||
result.append(az)
|
||||
|
||||
for (svc, state) in services.items():
|
||||
# Service tree view item
|
||||
az = AvailabilityZone(zone.manager,
|
||||
copy.deepcopy(zone._info), zone._loaded)
|
||||
az.zoneName = '| |- %s' % svc
|
||||
az.zoneState = '%s %s %s' % (
|
||||
'enabled' if state['active'] else 'disabled',
|
||||
':-)' if state['available'] else 'XXX',
|
||||
state['updated_at'])
|
||||
az._info['zoneName'] = az.zoneName
|
||||
az._info['zoneState'] = az.zoneState
|
||||
result.append(az)
|
||||
return result
|
||||
|
||||
|
||||
@utils.service_type('volume')
|
||||
def do_availability_zone_list(cs, _args):
|
||||
"""List all the availability zones."""
|
||||
try:
|
||||
availability_zones = cs.availability_zones.list()
|
||||
except exceptions.Forbidden as e: # policy doesn't allow probably
|
||||
try:
|
||||
availability_zones = cs.availability_zones.list(detailed=False)
|
||||
except Exception:
|
||||
raise e
|
||||
|
||||
result = []
|
||||
for zone in availability_zones:
|
||||
result += _treeizeAvailabilityZone(zone)
|
||||
_translate_availability_zone_keys(result)
|
||||
utils.print_list(result, ['Name', 'Status'])
|
||||
|
Loading…
x
Reference in New Issue
Block a user