Skip to content

Commit 02184d3

Browse files
Merge pull request #1688 from allmightyspiff/issues1687
fixed issues where a message warned users about closing datacenter
2 parents 1c7591d + 9e9d70c commit 02184d3

File tree

8 files changed

+87
-27
lines changed

8 files changed

+87
-27
lines changed

SoftLayer/CLI/hardware/create.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ def cli(env, **args):
4444
network = SoftLayer.NetworkManager(env.client)
4545

4646
pods = network.get_closed_pods()
47-
closure = []
4847

4948
# Get the SSH keys
5049
ssh_keys = []
@@ -104,9 +103,8 @@ def cli(env, **args):
104103

105104
if do_create:
106105
for pod in pods:
107-
if args.get('datacenter') in str(pod['name']):
108-
closure.append(pod['name'])
109-
click.secho(click.style('Warning: Closed soon: %s' % (', '.join(closure)), fg='yellow'))
106+
if args.get('datacenter') in pod['name']:
107+
click.secho('Warning: Closed soon: {}'.format(pod['name']), fg='yellow')
110108
if not (env.skip_confirmations or formatting.confirm(
111109
"This action will incur charges on your account. Continue?")):
112110
raise exceptions.CLIAbort('Aborting dedicated server order.')

SoftLayer/CLI/order/place.py

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,20 @@
1212
from SoftLayer.managers import NetworkManager
1313
from SoftLayer.managers import ordering
1414

15-
COLUMNS = ['keyName',
16-
'description',
17-
'cost', ]
15+
16+
COLUMNS = ['keyName', 'description', 'cost']
1817

1918

2019
@click.command(cls=SLCommand)
2120
@click.argument('package_keyname')
2221
@click.argument('location')
2322
@click.option('--preset',
2423
help="The order preset (if required by the package)")
25-
@click.option('--verify',
26-
is_flag=True,
24+
@click.option('--verify', is_flag=True,
2725
help="Flag denoting whether or not to only verify the order, not place it")
28-
@click.option('--quantity',
29-
type=int,
30-
default=1,
26+
@click.option('--quantity', type=int, default=1,
3127
help="The quantity of the item being ordered")
32-
@click.option('--billing',
33-
type=click.Choice(['hourly', 'monthly']),
34-
default='hourly',
35-
show_default=True,
28+
@click.option('--billing', type=click.Choice(['hourly', 'monthly']), default='hourly', show_default=True,
3629
help="Billing rate")
3730
@click.option('--complex-type',
3831
help=("The complex type of the order. Starts with 'SoftLayer_Container_Product_Order'."))
@@ -68,8 +61,12 @@ def cli(env, package_keyname, location, preset, verify, billing, complex_type,
6861
manager = ordering.OrderingManager(env.client)
6962
network = NetworkManager(env.client)
7063

64+
# Check if this location is going to be shutdown soon.
7165
pods = network.get_closed_pods()
72-
closure = []
66+
location_dc = network.get_datacenter_by_keyname(location)
67+
for pod in pods:
68+
if location_dc.get('name') in pod.get('name'):
69+
click.secho('Warning: Closed soon: {}'.format(pod.get('name')), fg='yellow')
7370

7471
if extras:
7572
try:
@@ -96,9 +93,6 @@ def cli(env, package_keyname, location, preset, verify, billing, complex_type,
9693
])
9794

9895
else:
99-
for pod in pods:
100-
closure.append(pod['name'])
101-
click.secho(click.style('Warning: Closed soon: %s' % (', '.join(closure)), fg='yellow'))
10296
if not (env.skip_confirmations or formatting.confirm(
10397
"This action will incur charges on your account. Continue?")):
10498
raise exceptions.CLIAbort("Aborting order.")

SoftLayer/CLI/virt/create.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,13 +221,11 @@ def cli(env, **args):
221221
network = SoftLayer.NetworkManager(env.client)
222222

223223
pods = network.get_closed_pods()
224-
closure = []
225224

226225
if do_create:
227226
for pod in pods:
228227
if args.get('datacenter') in str(pod['name']):
229-
closure.append(pod['name'])
230-
click.secho(click.style('Warning: Closed soon: %s' % (', '.join(closure)), fg='yellow'))
228+
click.secho('Warning: Closed soon: {}'.format(pod['name']), fg='yellow')
231229
if not (env.skip_confirmations or formatting.confirm(
232230
"This action will incur charges on your account. Continue?")):
233231
raise exceptions.CLIAbort('Aborting virtual server order.')

SoftLayer/managers/network.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,3 +851,18 @@ def get_datacenter(self, _filter=None, datacenter=None):
851851
_filter = {"name": {"operation": datacenter}}
852852

853853
return self.client.call('SoftLayer_Location', 'getDatacenters', filter=_filter, limit=1)
854+
855+
def get_datacenter_by_keyname(self, keyname=None):
856+
"""Calls SoftLayer_Location::getDatacenters()
857+
858+
returns datacenter list.
859+
"""
860+
mask = "mask[id,longName,name,regions[keyname,description]]"
861+
_filter = {}
862+
if keyname:
863+
_filter = {"regions": {"keyname": {"operation": keyname}}}
864+
865+
result = self.client.call('SoftLayer_Location', 'getDatacenters', filter=_filter, limit=1, mask=mask)
866+
if len(result) >= 1:
867+
return result[0]
868+
return {}

tests/CLI/modules/order_tests.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import sys
88
import tempfile
99

10+
from unittest import mock as mock
11+
1012
from SoftLayer.CLI import exceptions
1113
from SoftLayer import testing
1214

@@ -141,10 +143,12 @@ def test_place(self):
141143

142144
self.assert_no_fail(result)
143145
self.assert_called_with('SoftLayer_Product_Order', 'placeOrder')
144-
self.assertIn('Warning: Closed soon: ams01.pod01, wdc07.pod01, TEST00.pod2', result.output)
146+
self.assertNotIn('Warning: Closed soon: dal13', result.output)
145147
self.assertIn('"status": "APPROVED"', result.output)
146148

147-
def test_place_with_quantity(self):
149+
@mock.patch('SoftLayer.managers.network.NetworkManager.get_datacenter_by_keyname')
150+
def test_place_with_quantity(self, keyname_mock):
151+
keyname_mock.return_value = {"name": "ams01"}
148152
order_date = '2017-04-04 07:39:20'
149153
order = {'orderId': 1234, 'orderDate': order_date, 'placedOrder': {'status': 'APPROVED'}}
150154
verify_mock = self.set_mock('SoftLayer_Product_Order', 'verifyOrder')
@@ -155,12 +159,12 @@ def test_place_with_quantity(self):
155159
place_mock.return_value = order
156160
items_mock.return_value = self._get_order_items()
157161

158-
result = self.run_command(['-y', 'order', 'place', '--quantity=2', 'package', 'DALLAS13', 'ITEM1',
162+
result = self.run_command(['-y', 'order', 'place', '--quantity=2', 'package', 'AMSTERDAM', 'ITEM1',
159163
'--complex-type', 'SoftLayer_Container_Product_Order_Thing'])
160164

161165
self.assert_no_fail(result)
162166
self.assert_called_with('SoftLayer_Product_Order', 'placeOrder')
163-
self.assertIn('Warning: Closed soon: ams01.pod01, wdc07.pod01, TEST00.pod2', result.output)
167+
self.assertIn('Warning: Closed soon: ams01.pod01', result.output)
164168
self.assertIn('"status": "APPROVED"', result.output)
165169

166170
def test_place_extras_parameter_fail(self):

tests/CLI/modules/server_tests.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,17 @@ def test_create_server(self, order_mock):
401401
self.assertIn('Warning: Closed soon: TEST00.pod2', result.output)
402402
self.assertIn('"id": 98765', result.output)
403403

404+
result = self.run_command(['--really', 'server', 'create',
405+
'--size=S1270_8GB_2X1TBSATA_NORAID',
406+
'--hostname=test',
407+
'--domain=example.com',
408+
'--datacenter=mex01',
409+
'--os=OS_UBUNTU_14_04_LTS_TRUSTY_TAHR_64_BIT',
410+
])
411+
412+
self.assert_no_fail(result)
413+
self.assertNotIn('Warning: Closed soon: mex01', result.output)
414+
404415
@mock.patch('SoftLayer.CLI.template.export_to_template')
405416
def test_create_server_with_export(self, export_mock):
406417

@@ -1015,3 +1026,15 @@ def test_sensor_discrete(self):
10151026
def test_monitoring(self):
10161027
result = self.run_command(['hardware', 'monitoring', '100'])
10171028
self.assert_no_fail(result)
1029+
1030+
@mock.patch('SoftLayer.CLI.formatting.confirm')
1031+
def test_check_for_closing(self, confirm_mock):
1032+
confirm_mock.return_value = True
1033+
result = self.run_command(['vs', 'create', '--hostname', 'TEST', '--domain', 'TESTING',
1034+
'--flavor', 'B1_2X8X25', '--datacenter', 'ams01', '--os', 'UBUNTU_LATEST'])
1035+
self.assert_no_fail(result)
1036+
self.assertIn('Warning: Closed soon: ams01', result.output)
1037+
result = self.run_command(['vs', 'create', '--hostname', 'TEST', '--domain', 'TESTING',
1038+
'--flavor', 'B1_2X8X25', '--datacenter', 'mex01', '--os', 'UBUNTU_LATEST'])
1039+
self.assert_no_fail(result)
1040+
self.assertNotIn('Warning: Closed soon: mex01', result.output)

tests/CLI/modules/vs/vs_create_tests.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,3 +722,15 @@ def test_create_with_userdata(self, confirm_mock):
722722
api_call = self.calls('SoftLayer_Product_Order', 'placeOrder')
723723
# Doing this because the placeOrder args are huge and mostly not needed to test
724724
self.assertEqual(api_call[0].args[0]['virtualGuests'], expected_guest)
725+
726+
@mock.patch('SoftLayer.CLI.formatting.confirm')
727+
def test_check_for_closing(self, confirm_mock):
728+
confirm_mock.return_value = True
729+
result = self.run_command(['vs', 'create', '--hostname', 'TEST', '--domain', 'TESTING',
730+
'--flavor', 'B1_2X8X25', '--datacenter', 'ams01', '--os', 'UBUNTU_LATEST'])
731+
self.assert_no_fail(result)
732+
self.assertIn('Warning: Closed soon: ams01', result.output)
733+
result = self.run_command(['vs', 'create', '--hostname', 'TEST', '--domain', 'TESTING',
734+
'--flavor', 'B1_2X8X25', '--datacenter', 'mex01', '--os', 'UBUNTU_LATEST'])
735+
self.assert_no_fail(result)
736+
self.assertNotIn('Warning: Closed soon: mex01', result.output)

tests/managers/network_tests.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,3 +637,19 @@ def test_route(self):
637637
def test_get_all_datacenter(self):
638638
self.network.get_datacenter()
639639
self.assert_called_with('SoftLayer_Location', 'getDatacenters')
640+
self.network.get_datacenter(datacenter="dal11")
641+
expected_filter = {"name": {"operation": "dal11"}}
642+
self.assert_called_with('SoftLayer_Location', 'getDatacenters', filter=expected_filter)
643+
644+
def test_get_datacenter_by_keyname(self):
645+
# normal operation
646+
result = self.network.get_datacenter_by_keyname("TEST01")
647+
expected_filter = {"regions": {"keyname": {"operation": "TEST01"}}}
648+
self.assert_called_with('SoftLayer_Location', 'getDatacenters', filter=expected_filter)
649+
self.assertEqual(result.get('name'), 'dal13')
650+
651+
# an "empty" result
652+
SoftLayer_Location = self.set_mock('SoftLayer_Location', 'getDatacenters')
653+
SoftLayer_Location.return_value = []
654+
result = self.network.get_datacenter_by_keyname("TEST01")
655+
self.assertEqual(result, {})

0 commit comments

Comments
 (0)