Skip to content

Commit dd8da6d

Browse files
kyubifireDavid Pickle
authored andcommitted
Implementation of slcli block/file volume-count
1 parent 3b9b0f9 commit dd8da6d

11 files changed

Lines changed: 179 additions & 8 deletions

File tree

SoftLayer/CLI/block/count.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
"""List number of block storage volumes per datacenter."""
2+
# :license: MIT, see LICENSE for more details.
3+
4+
import click
5+
import SoftLayer
6+
from SoftLayer.CLI import columns as column_helper
7+
from SoftLayer.CLI import environment
8+
from SoftLayer.CLI import formatting
9+
10+
COLUMNS = [
11+
column_helper.Column('Datacenter',
12+
('serviceResource', 'datacenter', 'name'),
13+
mask="serviceResource.datacenter.name"),
14+
column_helper.Column('Count',
15+
'',
16+
mask=None)
17+
]
18+
19+
DEFAULT_COLUMNS = [
20+
'Datacenter',
21+
'Count'
22+
]
23+
24+
25+
@click.command()
26+
@click.option('--datacenter', '-d', help='Datacenter shortname')
27+
@click.option('--sortby', help='Column to sort by', default='Datacenter')
28+
@click.option('--columns',
29+
callback=column_helper.get_formatter(COLUMNS),
30+
help='Columns to display. Options: {0}'.format(
31+
', '.join(column.name for column in COLUMNS)),
32+
default=','.join(DEFAULT_COLUMNS))
33+
@environment.pass_env
34+
def cli(env, sortby, columns, datacenter):
35+
"""List number of block storage volumes per datacenter."""
36+
block_manager = SoftLayer.BlockStorageManager(env.client)
37+
block_volumes = block_manager.list_block_volumes(datacenter=datacenter,
38+
mask=columns.mask())
39+
40+
# cycle through all block volumes and count datacenter occurences.
41+
datacenters = dict()
42+
for volume in block_volumes:
43+
service_resource = volume['serviceResource']
44+
if 'datacenter' in service_resource:
45+
datacenter = service_resource['datacenter']['name']
46+
if datacenter not in datacenters.keys():
47+
datacenters[datacenter] = 1
48+
else:
49+
datacenters[datacenter] += 1
50+
51+
table = formatting.KeyValueTable(columns.columns)
52+
table.sortby = sortby
53+
for datacenter in datacenters:
54+
table.add_row([datacenter, datacenters[datacenter]])
55+
env.fout(table)

SoftLayer/CLI/block/detail.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ def cli(env, volume_id):
1616
block_manager = SoftLayer.BlockStorageManager(env.client)
1717
block_volume = block_manager.get_block_volume_details(volume_id)
1818
block_volume = utils.NestedDict(block_volume)
19-
2019
table = formatting.KeyValueTable(['Name', 'Value'])
2120
table.align['Name'] = 'r'
2221
table.align['Value'] = 'l'

SoftLayer/CLI/block/list.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
column_helper.Column('lunId', ('lunId',), mask="lunId"),
2929
column_helper.Column('active_transactions', ('activeTransactionCount',),
3030
mask="activeTransactionCount"),
31+
column_helper.Column('rep_partner_count', ('replicationPartnerCount',),
32+
mask="replicationPartnerCount"),
3133
column_helper.Column(
3234
'created_by',
3335
('billingItem', 'orderItem', 'order', 'userRecord', 'username')),
@@ -42,7 +44,8 @@
4244
'bytes_used',
4345
'ip_addr',
4446
'lunId',
45-
'active_transactions'
47+
'active_transactions',
48+
'rep_partner_count'
4649
]
4750

4851

SoftLayer/CLI/file/count.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
"""List number of file storage volumes per datacenter."""
2+
# :license: MIT, see LICENSE for more details.
3+
4+
import click
5+
import SoftLayer
6+
from SoftLayer.CLI import columns as column_helper
7+
from SoftLayer.CLI import environment
8+
from SoftLayer.CLI import formatting
9+
10+
COLUMNS = [
11+
column_helper.Column('Datacenter',
12+
('serviceResource', 'datacenter', 'name'),
13+
mask="serviceResource.datacenter.name"),
14+
column_helper.Column('Count',
15+
'',
16+
mask=None)
17+
]
18+
19+
DEFAULT_COLUMNS = [
20+
'Datacenter',
21+
'Count'
22+
]
23+
24+
25+
@click.command()
26+
@click.option('--datacenter', '-d', help='Datacenter shortname')
27+
@click.option('--sortby', help='Column to sort by', default='Datacenter')
28+
@click.option('--columns',
29+
callback=column_helper.get_formatter(COLUMNS),
30+
help='Columns to display. Options: {0}'.format(
31+
', '.join(column.name for column in COLUMNS)),
32+
default=','.join(DEFAULT_COLUMNS))
33+
@environment.pass_env
34+
def cli(env, sortby, columns, datacenter):
35+
"""List number of file storage volumes per datacenter."""
36+
37+
file_manager = SoftLayer.FileStorageManager(env.client)
38+
file_volumes = file_manager.list_file_volumes(datacenter=datacenter,
39+
mask=columns.mask())
40+
41+
datacenters = dict()
42+
for volume in file_volumes:
43+
service_resource = volume['serviceResource']
44+
if 'datacenter' in service_resource:
45+
datacenter = service_resource['datacenter']['name']
46+
if datacenter not in datacenters.keys():
47+
datacenters[datacenter] = 1
48+
else:
49+
datacenters[datacenter] += 1
50+
51+
table = formatting.KeyValueTable(columns.columns)
52+
table.sortby = sortby
53+
for datacenter in datacenters:
54+
table.add_row([datacenter, datacenters[datacenter]])
55+
env.fout(table)

SoftLayer/CLI/file/list.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
mask="activeTransactionCount"),
3030
column_helper.Column('mount_addr', ('fileNetworkMountAddress',),
3131
mask="fileNetworkMountAddress",),
32+
column_helper.Column('rep_partner_count', ('replicationPartnerCount',),
33+
mask="replicationPartnerCount"),
3234
column_helper.Column(
3335
'created_by',
3436
('billingItem', 'orderItem', 'order', 'userRecord', 'username')),
@@ -43,7 +45,8 @@
4345
'bytes_used',
4446
'ip_addr',
4547
'active_transactions',
46-
'mount_addr'
48+
'mount_addr',
49+
'rep_partner_count'
4750
]
4851

4952

SoftLayer/CLI/routes.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
('block:snapshot-order', 'SoftLayer.CLI.block.snapshot.order:cli'),
7777
('block:snapshot-restore', 'SoftLayer.CLI.block.snapshot.restore:cli'),
7878
('block:volume-cancel', 'SoftLayer.CLI.block.cancel:cli'),
79+
('block:volume-count', 'SoftLayer.CLI.block.count:cli'),
7980
('block:volume-detail', 'SoftLayer.CLI.block.detail:cli'),
8081
('block:volume-duplicate', 'SoftLayer.CLI.block.duplicate:cli'),
8182
('block:volume-list', 'SoftLayer.CLI.block.list:cli'),
@@ -100,6 +101,7 @@
100101
('file:snapshot-order', 'SoftLayer.CLI.file.snapshot.order:cli'),
101102
('file:snapshot-restore', 'SoftLayer.CLI.file.snapshot.restore:cli'),
102103
('file:volume-cancel', 'SoftLayer.CLI.file.cancel:cli'),
104+
('file:volume-count', 'SoftLayer.CLI.file.count:cli'),
103105
('file:volume-detail', 'SoftLayer.CLI.file.detail:cli'),
104106
('file:volume-duplicate', 'SoftLayer.CLI.file.duplicate:cli'),
105107
('file:volume-list', 'SoftLayer.CLI.file.list:cli'),

SoftLayer/fixtures/SoftLayer_Account.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@
536536
'notes': """{'status': 'available'}""",
537537
'password': '',
538538
'serviceProviderId': 1,
539-
'serviceResource': {'datacenter': {'id': 449500}},
539+
'serviceResource': {'datacenter': {'name': 'dal05', 'id': 449500}},
540540
'serviceResourceBackendIpAddress': '10.1.2.3',
541541
'serviceResourceName': 'Storage Type 01 Aggregate staaspar0101_pc01',
542542
'username': 'username',

SoftLayer/managers/block.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,33 @@ def list_block_volumes(self, datacenter=None, username=None,
4343
'bytesUsed',
4444
'serviceResource.datacenter[name]',
4545
'serviceResourceBackendIpAddress',
46-
'activeTransactionCount'
46+
'activeTransactionCount',
47+
'replicationPartnerCount',
48+
',replicationPartners[id,username,'
49+
'serviceResourceBackendIpAddress,'
50+
'serviceResource[datacenter[name]],'
51+
'storageType,capacityGb,lunId,bytesUsed,'
52+
'activeTransactionCount,'
53+
'replicationSchedule[type[keyname]]]',
4754
]
4855
kwargs['mask'] = ','.join(items)
4956

57+
# Retrieve relevant replicant information to be displayed.
58+
kwargs['mask'] += ',replicationPartners[id,username,'\
59+
'serviceResourceBackendIpAddress,'\
60+
'serviceResource[datacenter[name]],'\
61+
'storageType,capacityGb,lunId,bytesUsed,'\
62+
'activeTransactionCount,'\
63+
'replicationSchedule[type[keyname]]]'
64+
5065
_filter = utils.NestedDict(kwargs.get('filter') or {})
5166

5267
_filter['iscsiNetworkStorage']['serviceResource']['type']['type'] = \
5368
(utils.query_filter('!~ ISCSI'))
5469

5570
_filter['iscsiNetworkStorage']['storageType']['keyName'] = (
5671
utils.query_filter('*BLOCK_STORAGE*'))
72+
5773
if storage_type:
5874
_filter['iscsiNetworkStorage']['storageType']['keyName'] = (
5975
utils.query_filter('%s_BLOCK_STORAGE' % storage_type.upper()))

SoftLayer/managers/file.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,25 @@ def list_file_volumes(self, datacenter=None, username=None,
3838
'serviceResource.datacenter[name]',
3939
'serviceResourceBackendIpAddress',
4040
'activeTransactionCount',
41-
'fileNetworkMountAddress'
41+
'fileNetworkMountAddress',
42+
'replicationPartnerCount',
43+
',replicationPartners[id,username,'
44+
'serviceResourceBackendIpAddress,'
45+
'serviceResource[datacenter[name]],'
46+
'storageType,capacityGb,lunId,bytesUsed,'
47+
'activeTransactionCount,'
48+
'replicationSchedule[type[keyname]]]',
4249
]
4350
kwargs['mask'] = ','.join(items)
4451

52+
# Retrieve relevant replicant information to be displayed.
53+
kwargs['mask'] += ',replicationPartners[id,username,'\
54+
'serviceResourceBackendIpAddress,'\
55+
'serviceResource[datacenter[name]],'\
56+
'storageType,capacityGb,lunId,bytesUsed,'\
57+
'activeTransactionCount,'\
58+
'replicationSchedule[type[keyname]]]'
59+
4560
_filter = utils.NestedDict(kwargs.get('filter') or {})
4661

4762
_filter['nasNetworkStorage']['serviceResource']['type']['type'] = \

tests/CLI/modules/block_tests.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,16 +102,27 @@ def test_volume_list(self):
102102
{
103103
'bytes_used': None,
104104
'capacity_gb': 20,
105-
'datacenter': None,
105+
'datacenter': 'dal05',
106106
'id': 100,
107107
'ip_addr': '10.1.2.3',
108108
'lunId': None,
109+
'rep_partner_count': None,
109110
'storage_type': 'ENDURANCE',
110111
'username': 'username',
111112
'active_transactions': None
112113
}],
113114
json.loads(result.output))
114115

116+
def test_volume_count(self):
117+
result = self.run_command(['block', 'volume-count'])
118+
119+
self.assert_no_fail(result)
120+
self.assertEqual(
121+
{
122+
'dal05': 1
123+
},
124+
json.loads(result.output))
125+
115126
def test_volume_order_performance_iops_not_given(self):
116127
result = self.run_command(['block', 'volume-order',
117128
'--storage-type=performance', '--size=20',
@@ -354,6 +365,7 @@ def test_replication_locations(self):
354365
def test_replication_locations_unsuccessful(self, locations_mock):
355366
locations_mock.return_value = False
356367
result = self.run_command(['block', 'replica-locations', '1234'])
368+
self.assert_no_fail(result)
357369
self.assertEqual('No data centers compatible for replication.\n',
358370
result.output)
359371

0 commit comments

Comments
 (0)