Skip to content

Commit 335579f

Browse files
Merge pull request #1350 from FernandoOjeda/ft_block_file_volume_order
Add to block and file storage volume list order.
2 parents 48306c4 + 157f624 commit 335579f

File tree

10 files changed

+136
-11
lines changed

10 files changed

+136
-11
lines changed

SoftLayer/CLI/block/list.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
@click.command()
5959
@click.option('--username', '-u', help='Volume username')
6060
@click.option('--datacenter', '-d', help='Datacenter shortname')
61+
@click.option('--order', '-o', type=int, help='Filter by ID of the order that purchased the block storage')
6162
@click.option('--storage-type',
6263
help='Type of storage volume',
6364
type=click.Choice(['performance', 'endurance']))
@@ -68,12 +69,13 @@
6869
', '.join(column.name for column in COLUMNS)),
6970
default=','.join(DEFAULT_COLUMNS))
7071
@environment.pass_env
71-
def cli(env, sortby, columns, datacenter, username, storage_type):
72+
def cli(env, sortby, columns, datacenter, username, storage_type, order):
7273
"""List block storage."""
7374
block_manager = SoftLayer.BlockStorageManager(env.client)
7475
block_volumes = block_manager.list_block_volumes(datacenter=datacenter,
7576
username=username,
7677
storage_type=storage_type,
78+
order=order,
7779
mask=columns.mask())
7880

7981
table = formatting.Table(columns.columns)

SoftLayer/CLI/block/order.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from SoftLayer.CLI import environment
77
from SoftLayer.CLI import exceptions
88

9-
109
CONTEXT_SETTINGS = {'token_normalize_func': lambda x: x.upper()}
1110

1211

@@ -128,5 +127,8 @@ def cli(env, storage_type, size, iops, tier, os_type,
128127
order['placedOrder']['id']))
129128
for item in order['placedOrder']['items']:
130129
click.echo(" > %s" % item['description'])
130+
click.echo(
131+
'\nYou may run "slcli block volume-list --order {0}" to find this block volume after it '
132+
'is ready.'.format(order['placedOrder']['id']))
131133
else:
132134
click.echo("Order could not be placed! Please verify your options and try again.")

SoftLayer/CLI/file/list.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
@click.command()
5757
@click.option('--username', '-u', help='Volume username')
5858
@click.option('--datacenter', '-d', help='Datacenter shortname')
59+
@click.option('--order', '-o', type=int, help='Filter by ID of the order that purchased the block storage')
5960
@click.option('--storage-type',
6061
help='Type of storage volume',
6162
type=click.Choice(['performance', 'endurance']))
@@ -66,12 +67,13 @@
6667
', '.join(column.name for column in COLUMNS)),
6768
default=','.join(DEFAULT_COLUMNS))
6869
@environment.pass_env
69-
def cli(env, sortby, columns, datacenter, username, storage_type):
70+
def cli(env, sortby, columns, datacenter, username, storage_type, order):
7071
"""List file storage."""
7172
file_manager = SoftLayer.FileStorageManager(env.client)
7273
file_volumes = file_manager.list_file_volumes(datacenter=datacenter,
7374
username=username,
7475
storage_type=storage_type,
76+
order=order,
7577
mask=columns.mask())
7678

7779
table = formatting.Table(columns.columns)

SoftLayer/CLI/file/order.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,5 +115,8 @@ def cli(env, storage_type, size, iops, tier,
115115
order['placedOrder']['id']))
116116
for item in order['placedOrder']['items']:
117117
click.echo(" > %s" % item['description'])
118+
click.echo(
119+
'\nYou may run "slcli file volume-list --order {0}" to find this file volume after it '
120+
'is ready.'.format(order['placedOrder']['id']))
118121
else:
119122
click.echo("Order could not be placed! Please verify your options and try again.")

SoftLayer/managers/block.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,13 @@ def list_block_volume_limit(self):
2525
"""
2626
return self.get_volume_count_limits()
2727

28-
def list_block_volumes(self, datacenter=None, username=None, storage_type=None, **kwargs):
28+
def list_block_volumes(self, datacenter=None, username=None, storage_type=None, order=None, **kwargs):
2929
"""Returns a list of block volumes.
3030
3131
:param datacenter: Datacenter short name (e.g.: dal09)
3232
:param username: Name of volume.
3333
:param storage_type: Type of volume: Endurance or Performance
34+
:param order: Volume order id.
3435
:param kwargs:
3536
:return: Returns a list of block volumes.
3637
"""
@@ -67,6 +68,10 @@ def list_block_volumes(self, datacenter=None, username=None, storage_type=None,
6768
_filter['iscsiNetworkStorage']['username'] = \
6869
(utils.query_filter(username))
6970

71+
if order:
72+
_filter['iscsiNetworkStorage']['billingItem']['orderItem'][
73+
'order']['id'] = (utils.query_filter(order))
74+
7075
kwargs['filter'] = _filter.to_dict()
7176
return self.client.call('Account', 'getIscsiNetworkStorage', **kwargs)
7277

SoftLayer/managers/file.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,13 @@ def list_file_volume_limit(self):
2222
"""
2323
return self.get_volume_count_limits()
2424

25-
def list_file_volumes(self, datacenter=None, username=None, storage_type=None, **kwargs):
25+
def list_file_volumes(self, datacenter=None, username=None, storage_type=None, order=None, **kwargs):
2626
"""Returns a list of file volumes.
2727
2828
:param datacenter: Datacenter short name (e.g.: dal09)
2929
:param username: Name of volume.
3030
:param storage_type: Type of volume: Endurance or Performance
31+
:param order: Volume order id.
3132
:param kwargs:
3233
:return: Returns a list of file volumes.
3334
"""
@@ -64,6 +65,10 @@ def list_file_volumes(self, datacenter=None, username=None, storage_type=None, *
6465
_filter['nasNetworkStorage']['username'] = \
6566
(utils.query_filter(username))
6667

68+
if order:
69+
_filter['nasNetworkStorage']['billingItem']['orderItem'][
70+
'order']['id'] = (utils.query_filter(order))
71+
6772
kwargs['filter'] = _filter.to_dict()
6873
return self.client.call('Account', 'getNasNetworkStorage', **kwargs)
6974

tests/CLI/modules/block_tests.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,13 @@ def test_volume_list(self):
141141
}],
142142
json.loads(result.output))
143143

144+
def test_volume_list_order(self):
145+
result = self.run_command(['block', 'volume-list', '--order=1234567'])
146+
147+
self.assert_no_fail(result)
148+
json_result = json.loads(result.output)
149+
self.assertEqual(json_result[0]['id'], 100)
150+
144151
@mock.patch('SoftLayer.BlockStorageManager.list_block_volumes')
145152
def test_volume_count(self, list_mock):
146153
list_mock.return_value = [
@@ -199,7 +206,9 @@ def test_volume_order_performance(self, order_mock):
199206
'Order #478 placed successfully!\n'
200207
' > Performance Storage\n > Block Storage\n'
201208
' > 0.25 IOPS per GB\n > 20 GB Storage Space\n'
202-
' > 10 GB Storage Space (Snapshot Space)\n')
209+
' > 10 GB Storage Space (Snapshot Space)\n'
210+
'\nYou may run "slcli block volume-list --order 478" to find this block volume '
211+
'after it is ready.\n')
203212

204213
def test_volume_order_endurance_tier_not_given(self):
205214
result = self.run_command(['block', 'volume-order',
@@ -232,7 +241,9 @@ def test_volume_order_endurance(self, order_mock):
232241
'Order #478 placed successfully!\n'
233242
' > Endurance Storage\n > Block Storage\n'
234243
' > 0.25 IOPS per GB\n > 20 GB Storage Space\n'
235-
' > 10 GB Storage Space (Snapshot Space)\n')
244+
' > 10 GB Storage Space (Snapshot Space)\n'
245+
'\nYou may run "slcli block volume-list --order 478" to find this block volume '
246+
'after it is ready.\n')
236247

237248
@mock.patch('SoftLayer.BlockStorageManager.order_block_volume')
238249
def test_volume_order_order_not_placed(self, order_mock):
@@ -281,7 +292,9 @@ def test_volume_order_hourly_billing(self, order_mock):
281292
' > Storage as a Service\n'
282293
' > Block Storage\n'
283294
' > 20 GB Storage Space\n'
284-
' > 200 IOPS\n')
295+
' > 200 IOPS\n'
296+
'\nYou may run "slcli block volume-list --order 10983647" to find this block volume '
297+
'after it is ready.\n')
285298

286299
@mock.patch('SoftLayer.BlockStorageManager.order_block_volume')
287300
def test_volume_order_performance_manager_error(self, order_mock):

tests/CLI/modules/file_tests.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ def test_volume_list(self):
5555
}],
5656
json.loads(result.output))
5757

58+
def test_volume_list_order(self):
59+
result = self.run_command(['file', 'volume-list', '--order=1234567'])
60+
61+
self.assert_no_fail(result)
62+
json_result = json.loads(result.output)
63+
self.assertEqual(json_result[0]['id'], 1)
64+
5865
@mock.patch('SoftLayer.FileStorageManager.list_file_volumes')
5966
def test_volume_count(self, list_mock):
6067
list_mock.return_value = [
@@ -223,7 +230,9 @@ def test_volume_order_performance(self, order_mock):
223230
'Order #478 placed successfully!\n'
224231
' > Performance Storage\n > File Storage\n'
225232
' > 0.25 IOPS per GB\n > 20 GB Storage Space\n'
226-
' > 10 GB Storage Space (Snapshot Space)\n')
233+
' > 10 GB Storage Space (Snapshot Space)\n'
234+
'\nYou may run "slcli file volume-list --order 478" to find this file volume after it is '
235+
'ready.\n')
227236

228237
def test_volume_order_endurance_tier_not_given(self):
229238
result = self.run_command(['file', 'volume-order',
@@ -256,7 +265,9 @@ def test_volume_order_endurance(self, order_mock):
256265
'Order #478 placed successfully!\n'
257266
' > Endurance Storage\n > File Storage\n'
258267
' > 0.25 IOPS per GB\n > 20 GB Storage Space\n'
259-
' > 10 GB Storage Space (Snapshot Space)\n')
268+
' > 10 GB Storage Space (Snapshot Space)\n'
269+
'\nYou may run "slcli file volume-list --order 478" to find this file volume after it is '
270+
'ready.\n')
260271

261272
@mock.patch('SoftLayer.FileStorageManager.order_file_volume')
262273
def test_volume_order_order_not_placed(self, order_mock):
@@ -307,7 +318,9 @@ def test_volume_order_hourly_billing(self, order_mock):
307318
' > File Storage\n'
308319
' > 20 GB Storage Space\n'
309320
' > 0.25 IOPS per GB\n'
310-
' > 10 GB Storage Space (Snapshot Space)\n')
321+
' > 10 GB Storage Space (Snapshot Space)\n'
322+
'\nYou may run "slcli file volume-list --order 479" to find this file volume after it is '
323+
'ready.\n')
311324

312325
@mock.patch('SoftLayer.FileStorageManager.order_file_volume')
313326
def test_volume_order_performance_manager_error(self, order_mock):

tests/managers/block_tests.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,46 @@ def test_list_block_volumes(self):
157157
mask='mask[%s]' % expected_mask
158158
)
159159

160+
def test_list_block_volumes_additional_filter_order(self):
161+
result = self.block.list_block_volumes(order=1234567)
162+
163+
self.assertEqual(SoftLayer_Account.getIscsiNetworkStorage,
164+
result)
165+
166+
expected_filter = {
167+
'iscsiNetworkStorage': {
168+
'storageType': {
169+
'keyName': {'operation': '*= BLOCK_STORAGE'}
170+
},
171+
'serviceResource': {
172+
'type': {
173+
'type': {'operation': '!~ ISCSI'}
174+
}
175+
},
176+
'billingItem': {
177+
'orderItem': {
178+
'order': {
179+
'id': {'operation': 1234567}}}}
180+
}
181+
}
182+
183+
expected_mask = 'id,' \
184+
'username,' \
185+
'lunId,' \
186+
'capacityGb,' \
187+
'bytesUsed,' \
188+
'serviceResource.datacenter[name],' \
189+
'serviceResourceBackendIpAddress,' \
190+
'activeTransactionCount,' \
191+
'replicationPartnerCount'
192+
193+
self.assert_called_with(
194+
'SoftLayer_Account',
195+
'getIscsiNetworkStorage',
196+
filter=expected_filter,
197+
mask='mask[%s]' % expected_mask
198+
)
199+
160200
def test_list_block_volumes_with_additional_filters(self):
161201
result = self.block.list_block_volumes(datacenter="dal09",
162202
storage_type="Endurance",

tests/managers/file_tests.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,46 @@ def test_list_file_volumes(self):
365365
mask='mask[%s]' % expected_mask
366366
)
367367

368+
def test_list_file_volumes_additional_filter_order(self):
369+
result = self.file.list_file_volumes(order=1234567)
370+
371+
self.assertEqual(SoftLayer_Account.getNasNetworkStorage,
372+
result)
373+
374+
expected_filter = {
375+
'nasNetworkStorage': {
376+
'storageType': {
377+
'keyName': {'operation': '*= FILE_STORAGE'}
378+
},
379+
'serviceResource': {
380+
'type': {
381+
'type': {'operation': '!~ NAS'}
382+
}
383+
},
384+
'billingItem': {
385+
'orderItem': {
386+
'order': {
387+
'id': {'operation': 1234567}}}}
388+
}
389+
}
390+
391+
expected_mask = 'id,'\
392+
'username,'\
393+
'capacityGb,'\
394+
'bytesUsed,'\
395+
'serviceResource.datacenter[name],'\
396+
'serviceResourceBackendIpAddress,'\
397+
'activeTransactionCount,'\
398+
'fileNetworkMountAddress,'\
399+
'replicationPartnerCount'
400+
401+
self.assert_called_with(
402+
'SoftLayer_Account',
403+
'getNasNetworkStorage',
404+
filter=expected_filter,
405+
mask='mask[%s]' % expected_mask
406+
)
407+
368408
def test_list_file_volumes_with_additional_filters(self):
369409
result = self.file.list_file_volumes(datacenter="dal09",
370410
storage_type="Endurance",

0 commit comments

Comments
 (0)