Fix for validating firewall resource status

In case of firewall resource, Stack creation is not waiting for
resource status and returning as stack COMPLETE status.
Following fix validate for create complete.

Change-Id: I71bd16b3a5c851e16ddc9cd963be73501cdced8d
Closes-Bug: 1648059
This commit is contained in:
Ashutosh Mishra 2016-12-07 18:05:44 +05:30 committed by ashutosh mishra
parent b6e1be2f7a
commit ae1ebcc760
2 changed files with 54 additions and 1 deletions

View File

@ -11,6 +11,7 @@
# License for the specific language governing permissions and limitations
# under the License.
from heat.common import exception
from heat.common.i18n import _
from heat.engine import attributes
from heat.engine import constraints
@ -137,6 +138,22 @@ class Firewall(neutron.NeutronResource):
def _show_resource(self):
return self.client().show_firewall(self.resource_id)['firewall']
def check_create_complete(self, data):
attributes = self._show_resource()
status = attributes['status']
if status == 'PENDING_CREATE':
return False
elif status == 'ACTIVE':
return True
elif status == 'ERROR':
raise exception.ResourceInError(
resource_status=status,
status_reason=_('Error in Firewall'))
else:
raise exception.ResourceUnknownStatus(
resource_status=status,
result=_('Firewall creation failed'))
def handle_create(self):
props = self.prepare_properties(
self.properties,

View File

@ -13,6 +13,7 @@
from neutronclient.common import exceptions
from neutronclient.v2_0 import client as neutronclient
from oslo_config import cfg
import six
from heat.common import exception
@ -109,11 +110,31 @@ class FirewallTest(common.HeatTestCase):
def test_create(self):
rsrc = self.create_firewall()
neutronclient.Client.show_firewall('5678').AndReturn(
{'firewall': {'status': 'ACTIVE'}})
self.m.ReplayAll()
scheduler.TaskRunner(rsrc.create)()
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
self.m.VerifyAll()
def test_create_failed_error_status(self):
cfg.CONF.set_override('action_retry_limit', 0, enforce_type=True)
rsrc = self.create_firewall()
neutronclient.Client.show_firewall('5678').AndReturn(
{'firewall': {'status': 'PENDING_CREATE'}})
neutronclient.Client.show_firewall('5678').AndReturn(
{'firewall': {'status': 'ERROR'}})
self.m.ReplayAll()
error = self.assertRaises(exception.ResourceFailure,
scheduler.TaskRunner(rsrc.create))
self.assertEqual(
'ResourceInError: resources.firewall: '
'Went to status ERROR due to "Error in Firewall"',
six.text_type(error))
self.assertEqual((rsrc.CREATE, rsrc.FAILED), rsrc.state)
self.m.VerifyAll()
def test_create_failed(self):
neutronclient.Client.create_firewall({
'firewall': {
@ -139,11 +160,14 @@ class FirewallTest(common.HeatTestCase):
self.m.VerifyAll()
def test_delete(self):
rsrc = self.create_firewall()
neutronclient.Client.show_firewall('5678').AndReturn(
{'firewall': {'status': 'ACTIVE'}})
neutronclient.Client.delete_firewall('5678')
neutronclient.Client.show_firewall('5678').AndRaise(
exceptions.NeutronClientException(status_code=404))
rsrc = self.create_firewall()
self.m.ReplayAll()
scheduler.TaskRunner(rsrc.create)()
scheduler.TaskRunner(rsrc.delete)()
@ -155,6 +179,8 @@ class FirewallTest(common.HeatTestCase):
exceptions.NeutronClientException(status_code=404))
rsrc = self.create_firewall()
neutronclient.Client.show_firewall('5678').AndReturn(
{'firewall': {'status': 'ACTIVE'}})
self.m.ReplayAll()
scheduler.TaskRunner(rsrc.create)()
scheduler.TaskRunner(rsrc.delete)()
@ -166,6 +192,8 @@ class FirewallTest(common.HeatTestCase):
exceptions.NeutronClientException(status_code=400))
rsrc = self.create_firewall()
neutronclient.Client.show_firewall('5678').AndReturn(
{'firewall': {'status': 'ACTIVE'}})
self.m.ReplayAll()
scheduler.TaskRunner(rsrc.create)()
error = self.assertRaises(exception.ResourceFailure,
@ -179,6 +207,8 @@ class FirewallTest(common.HeatTestCase):
def test_attribute(self):
rsrc = self.create_firewall()
neutronclient.Client.show_firewall('5678').AndReturn(
{'firewall': {'status': 'ACTIVE'}})
neutronclient.Client.show_firewall('5678').MultipleTimes(
).AndReturn(
{'firewall': {'admin_state_up': True,
@ -194,6 +224,8 @@ class FirewallTest(common.HeatTestCase):
def test_attribute_failed(self):
rsrc = self.create_firewall()
neutronclient.Client.show_firewall('5678').AndReturn(
{'firewall': {'status': 'ACTIVE'}})
self.m.ReplayAll()
scheduler.TaskRunner(rsrc.create)()
error = self.assertRaises(exception.InvalidTemplateAttribute,
@ -205,6 +237,8 @@ class FirewallTest(common.HeatTestCase):
def test_update(self):
rsrc = self.create_firewall()
neutronclient.Client.show_firewall('5678').AndReturn(
{'firewall': {'status': 'ACTIVE'}})
neutronclient.Client.update_firewall(
'5678', {'firewall': {'admin_state_up': False}})
self.m.ReplayAll()
@ -219,6 +253,8 @@ class FirewallTest(common.HeatTestCase):
def test_update_with_value_specs(self):
rsrc = self.create_firewall(value_specs=False)
neutronclient.Client.show_firewall('5678').AndReturn(
{'firewall': {'status': 'ACTIVE'}})
neutronclient.Client.update_firewall(
'5678', {'firewall': {'router_ids': ['router_1',
'router_2']}})