Skip to content

Commit 0045d37

Browse files
Merge pull request #836 from camporter/check_for_billing_on_firewall_cancel
Check for billing before attempting to cancel a firewall.
2 parents 148cf05 + 12d9204 commit 0045d37

File tree

2 files changed

+49
-7
lines changed

2 files changed

+49
-7
lines changed

SoftLayer/managers/firewall.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
66
:license: MIT, see LICENSE for more details.
77
"""
8+
from SoftLayer import exceptions
89
from SoftLayer import utils
910

1011
RULE_MASK = ('mask[orderValue,action,destinationIpAddress,'
@@ -87,9 +88,8 @@ def cancel_firewall(self, firewall_id, dedicated=False):
8788
"""
8889

8990
fwl_billing = self._get_fwl_billing_item(firewall_id, dedicated)
90-
billing_id = fwl_billing['billingItem']['id']
91-
billing_item = self.client['Billing_Item']
92-
return billing_item.cancelService(id=billing_id)
91+
billing_item_service = self.client['Billing_Item']
92+
return billing_item_service.cancelService(id=fwl_billing['id'])
9393

9494
def add_standard_firewall(self, server_id, is_virt=True):
9595
"""Creates a firewall for the specified virtual/hardware server.
@@ -150,12 +150,20 @@ def _get_fwl_billing_item(self, firewall_id, dedicated=False):
150150
:returns: A dictionary of the firewall billing item.
151151
"""
152152

153-
mask = ('mask[id,billingItem[id]]')
153+
mask = 'mask[id,billingItem[id]]'
154154
if dedicated:
155-
fwl_svc = self.client['Network_Vlan_Firewall']
155+
firewall_service = self.client['Network_Vlan_Firewall']
156156
else:
157-
fwl_svc = self.client['Network_Component_Firewall']
158-
return fwl_svc.getObject(id=firewall_id, mask=mask)
157+
firewall_service = self.client['Network_Component_Firewall']
158+
firewall = firewall_service.getObject(id=firewall_id, mask=mask)
159+
if firewall is None:
160+
raise exceptions.SoftLayerError(
161+
"Unable to find firewall %d" % firewall_id)
162+
if firewall.get('billingItem') is None:
163+
raise exceptions.SoftLayerError(
164+
"Unable to find billing item for firewall %d" % firewall_id)
165+
166+
return firewall['billingItem']
159167

160168
def _get_fwl_port_speed(self, server_id, is_virt=True):
161169
"""Determines the appropriate speed for a firewall.

tests/managers/firewall_tests.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"""
77

88
import SoftLayer
9+
from SoftLayer import exceptions
910
from SoftLayer import fixtures
1011
from SoftLayer import testing
1112

@@ -137,6 +138,23 @@ def test_cancel_firewall(self):
137138
self.assert_called_with('SoftLayer_Billing_Item', 'cancelService',
138139
identifier=21370814)
139140

141+
def test_cancel_firewall_no_firewall(self):
142+
mock = self.set_mock('SoftLayer_Network_Component_Firewall', 'getObject')
143+
mock.return_value = None
144+
145+
self.assertRaises(exceptions.SoftLayerError,
146+
self.firewall.cancel_firewall, 6327, dedicated=False)
147+
148+
def test_cancel_firewall_no_billing(self):
149+
mock = self.set_mock('SoftLayer_Network_Component_Firewall', 'getObject')
150+
mock.return_value = {
151+
'id': 6327,
152+
'billingItem': None
153+
}
154+
155+
self.assertRaises(exceptions.SoftLayerError,
156+
self.firewall.cancel_firewall, 6327, dedicated=False)
157+
140158
def test_cancel_dedicated_firewall(self):
141159
# test dedicated firewalls
142160
result = self.firewall.cancel_firewall(6327, dedicated=True)
@@ -149,6 +167,22 @@ def test_cancel_dedicated_firewall(self):
149167
self.assert_called_with('SoftLayer_Billing_Item', 'cancelService',
150168
identifier=21370815)
151169

170+
def test_cancel_dedicated_firewall_no_firewall(self):
171+
mock = self.set_mock('SoftLayer_Network_Vlan_Firewall', 'getObject')
172+
mock.return_value = None
173+
174+
self.assertRaises(exceptions.SoftLayerError,
175+
self.firewall.cancel_firewall, 6327, dedicated=True)
176+
177+
def test_cancel_dedicated_firewall_no_billing(self):
178+
mock = self.set_mock('SoftLayer_Network_Vlan_Firewall', 'getObject')
179+
mock.return_value = {
180+
'id': 6327,
181+
'billingItem': None
182+
}
183+
self.assertRaises(exceptions.SoftLayerError,
184+
self.firewall.cancel_firewall, 6327, dedicated=True)
185+
152186
def test_add_standard_firewall_virtual_server(self):
153187
# test standard firewalls for virtual servers
154188
self.firewall.add_standard_firewall(6327, is_virt=True)

0 commit comments

Comments
 (0)