diff options
author | Jenkins <jenkins@review.openstack.org> | 2014-05-31 20:45:21 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2014-05-31 20:45:21 +0000 |
commit | 9d1872ca8f94b13d649c8facae05433e6579f72f (patch) | |
tree | 8a7a7326fbff80a869688088a666bafa5f056697 /heat | |
parent | d2d06cd588bcc76f983c081538e99932ff89e2c8 (diff) | |
parent | 4b9ff4ff9e966915cf7538e963457db9b4031ba0 (diff) | |
download | heat-9d1872ca8f94b13d649c8facae05433e6579f72f.tar.gz |
Merge "Truncate status_reason to column length" into stable/icehouse
Diffstat (limited to 'heat')
-rw-r--r-- | heat/db/sqlalchemy/models.py | 41 | ||||
-rw-r--r-- | heat/tests/test_sqlalchemy_api.py | 16 |
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): |