summaryrefslogtreecommitdiff
path: root/heat
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-05-31 20:45:21 +0000
committerGerrit Code Review <review@openstack.org>2014-05-31 20:45:21 +0000
commit9d1872ca8f94b13d649c8facae05433e6579f72f (patch)
tree8a7a7326fbff80a869688088a666bafa5f056697 /heat
parentd2d06cd588bcc76f983c081538e99932ff89e2c8 (diff)
parent4b9ff4ff9e966915cf7538e963457db9b4031ba0 (diff)
downloadheat-9d1872ca8f94b13d649c8facae05433e6579f72f.tar.gz
Merge "Truncate status_reason to column length" into stable/icehouse
Diffstat (limited to 'heat')
-rw-r--r--heat/db/sqlalchemy/models.py41
-rw-r--r--heat/tests/test_sqlalchemy_api.py16
2 files changed, 44 insertions, 13 deletions
diff --git a/heat/db/sqlalchemy/models.py b/heat/db/sqlalchemy/models.py
index cf9d5ea77..5fe3b225d 100644
--- a/heat/db/sqlalchemy/models.py
+++ b/heat/db/sqlalchemy/models.py
@@ -79,6 +79,21 @@ class SoftDelete(object):
session=session)
+class StateAware(object):
+
+ action = sqlalchemy.Column('action', sqlalchemy.String(255))
+ status = sqlalchemy.Column('status', sqlalchemy.String(255))
+ _status_reason = sqlalchemy.Column('status_reason', sqlalchemy.String(255))
+
+ @property
+ def status_reason(self):
+ return self._status_reason
+
+ @status_reason.setter
+ def status_reason(self, reason):
+ self._status_reason = reason and reason[:255] or ''
+
+
class RawTemplate(BASE, HeatBase):
"""Represents an unparsed template which should be in JSON format."""
@@ -88,7 +103,7 @@ class RawTemplate(BASE, HeatBase):
files = sqlalchemy.Column(Json)
-class Stack(BASE, HeatBase, SoftDelete):
+class Stack(BASE, HeatBase, SoftDelete, StateAware):
"""Represents a stack created by the heat engine."""
__tablename__ = 'stack'
@@ -103,9 +118,6 @@ class Stack(BASE, HeatBase, SoftDelete):
raw_template = relationship(RawTemplate, backref=backref('stack'))
username = sqlalchemy.Column(sqlalchemy.String(256))
tenant = sqlalchemy.Column(sqlalchemy.String(256))
- action = sqlalchemy.Column('action', sqlalchemy.String(255))
- status = sqlalchemy.Column('status', sqlalchemy.String(255))
- status_reason = sqlalchemy.Column('status_reason', sqlalchemy.String(255))
parameters = sqlalchemy.Column('parameters', Json)
user_creds_id = sqlalchemy.Column(
sqlalchemy.Integer,
@@ -172,10 +184,19 @@ class Event(BASE, HeatBase):
resource_status = sqlalchemy.Column(sqlalchemy.String(255))
resource_name = sqlalchemy.Column(sqlalchemy.String(255))
physical_resource_id = sqlalchemy.Column(sqlalchemy.String(255))
- resource_status_reason = sqlalchemy.Column(sqlalchemy.String(255))
+ _resource_status_reason = sqlalchemy.Column(
+ 'resource_status_reason', sqlalchemy.String(255))
resource_type = sqlalchemy.Column(sqlalchemy.String(255))
resource_properties = sqlalchemy.Column(sqlalchemy.PickleType)
+ @property
+ def resource_status_reason(self):
+ return self._resource_status_reason
+
+ @resource_status_reason.setter
+ def resource_status_reason(self, reason):
+ self._resource_status_reason = reason and reason[:255] or ''
+
class ResourceData(BASE, HeatBase):
"""Key/value store of arbitrary, resource-specific data."""
@@ -196,7 +217,7 @@ class ResourceData(BASE, HeatBase):
nullable=False)
-class Resource(BASE, HeatBase):
+class Resource(BASE, HeatBase, StateAware):
"""Represents a resource created by the heat engine."""
__tablename__ = 'resource'
@@ -204,11 +225,8 @@ class Resource(BASE, HeatBase):
id = sqlalchemy.Column(sqlalchemy.String(36),
primary_key=True,
default=lambda: str(uuid.uuid4()))
- action = sqlalchemy.Column('action', sqlalchemy.String(255))
- status = sqlalchemy.Column('status', sqlalchemy.String(255))
name = sqlalchemy.Column('name', sqlalchemy.String(255), nullable=True)
nova_instance = sqlalchemy.Column('nova_instance', sqlalchemy.String(255))
- status_reason = sqlalchemy.Column('status_reason', sqlalchemy.String(255))
# odd name as "metadata" is reserved
rsrc_metadata = sqlalchemy.Column('rsrc_metadata', Json)
@@ -277,7 +295,7 @@ class SoftwareConfig(BASE, HeatBase):
'tenant', sqlalchemy.String(256), nullable=False)
-class SoftwareDeployment(BASE, HeatBase):
+class SoftwareDeployment(BASE, HeatBase, StateAware):
"""
Represents applying a software configuration resource to a
single server resource.
@@ -301,6 +319,3 @@ class SoftwareDeployment(BASE, HeatBase):
'tenant', sqlalchemy.String(256), nullable=False)
stack_user_project_id = sqlalchemy.Column(sqlalchemy.String(64),
nullable=True)
- action = sqlalchemy.Column('action', sqlalchemy.String(255))
- status = sqlalchemy.Column('status', sqlalchemy.String(255))
- status_reason = sqlalchemy.Column('status_reason', sqlalchemy.String(255))
diff --git a/heat/tests/test_sqlalchemy_api.py b/heat/tests/test_sqlalchemy_api.py
index 829ad228a..a91273c8e 100644
--- a/heat/tests/test_sqlalchemy_api.py
+++ b/heat/tests/test_sqlalchemy_api.py
@@ -1221,6 +1221,11 @@ class DBAPIStackTest(HeatTestCase):
self.assertIsNone(db_api.stack_get(ctx, stacks[s].id,
show_deleted=True))
+ def test_stack_status_reason_truncate(self):
+ stack = create_stack(self.ctx, self.template, self.user_creds,
+ status_reason='a' * 1024)
+ self.assertEqual('a' * 255, stack.status_reason)
+
class DBAPIResourceTest(HeatTestCase):
def setUp(self):
@@ -1307,6 +1312,12 @@ class DBAPIResourceTest(HeatTestCase):
self.assertRaises(exception.NotFound, db_api.resource_get_all_by_stack,
self.ctx, self.stack2.id)
+ def test_resource_status_reason_truncate(self):
+ res = create_resource(self.ctx, self.stack,
+ status_reason='a' * 1024)
+ ret_res = db_api.resource_get(self.ctx, res.id)
+ self.assertEqual('a' * 255, ret_res.status_reason)
+
class DBAPIStackLockTest(HeatTestCase):
def setUp(self):
@@ -1511,6 +1522,11 @@ class DBAPIEventTest(HeatTestCase):
self.assertEqual(1, db_api.event_count_all_by_stack(self.ctx,
self.stack2.id))
+ def test_event_resource_status_reason_truncate(self):
+ event = create_event(self.ctx, resource_status_reason='a' * 1024)
+ ret_event = db_api.event_get(self.ctx, event.id)
+ self.assertEqual('a' * 255, ret_event.resource_status_reason)
+
class DBAPIWatchRuleTest(HeatTestCase):
def setUp(self):