From 0a6ac9895cd275662e8e38f610308565765ea17b Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Tue, 3 Jul 2012 14:03:47 +0200 Subject: [PATCH] Remove parsed template from database It is no longer used since we now store the parameters and can recreate the parsed template from the raw template. Change-Id: Id725bcde7b30ce33d122ccf9c6d5c571f7d754da Signed-off-by: Zane Bitter --- heat/db/api.py | 12 ----- heat/db/sqlalchemy/api.py | 35 ++----------- .../versions/009_remove_parsed_template.py | 49 +++++++++++++++++++ heat/db/sqlalchemy/models.py | 16 ------ heat/engine/manager.py | 15 ++---- heat/engine/parser.py | 47 ------------------ heat/engine/resources.py | 1 - heat/engine/stack.py | 7 +-- heat/tests/test_stacks.py | 12 ----- heat/tests/test_waitcondition.py | 5 -- 10 files changed, 57 insertions(+), 142 deletions(-) create mode 100644 heat/db/sqlalchemy/migrate_repo/versions/009_remove_parsed_template.py diff --git a/heat/db/api.py b/heat/db/api.py index 66d611b872..5c21b1ed08 100644 --- a/heat/db/api.py +++ b/heat/db/api.py @@ -62,18 +62,6 @@ def raw_template_create(context, values): return IMPL.raw_template_create(context, values) -def parsed_template_get(context, template_id): - return IMPL.parsed_template_get(context, template_id) - - -def parsed_template_get_all(context): - return IMPL.parsed_template_get_all(context) - - -def parsed_template_create(context, values): - return IMPL.parsed_template_create(context, values) - - def resource_get(context, resource_id): return IMPL.resource_get(context, resource_id) diff --git a/heat/db/sqlalchemy/api.py b/heat/db/sqlalchemy/api.py index 7ff6de48f2..f68560ccc4 100644 --- a/heat/db/sqlalchemy/api.py +++ b/heat/db/sqlalchemy/api.py @@ -58,28 +58,6 @@ def raw_template_create(context, values): return raw_template_ref -def parsed_template_get(context, template_id): - result = model_query(context, models.ParsedTemplate).\ - filter_by(id=template_id).first() - return result - - -def parsed_template_get_all(context): - results = model_query(context, models.ParsedTemplate).all() - - if not results: - raise NotFound('no parsed templates were found') - - return results - - -def parsed_template_create(context, values): - parsed_template_ref = models.ParsedTemplate() - parsed_template_ref.update(values) - parsed_template_ref.save() - return parsed_template_ref - - def resource_get(context, resource_id): result = model_query(context, models.Resource).\ filter_by(id=resource_id).first() @@ -184,21 +162,14 @@ def stack_delete(context, stack_id): for e in s.events: session.delete(e) - rpt = {} - rrt = {} for r in s.resources: - rpt[r.parsed_template.id] = r.parsed_template - rrt[r.parsed_template.raw_template.id] = \ - r.parsed_template.raw_template session.delete(r) - for pt in rpt.values(): - session.delete(pt) - - for rt in rrt.values(): - session.delete(rt) + rt = s.raw_template session.delete(s) + session.delete(rt) + session.flush() diff --git a/heat/db/sqlalchemy/migrate_repo/versions/009_remove_parsed_template.py b/heat/db/sqlalchemy/migrate_repo/versions/009_remove_parsed_template.py new file mode 100644 index 0000000000..8b485460b5 --- /dev/null +++ b/heat/db/sqlalchemy/migrate_repo/versions/009_remove_parsed_template.py @@ -0,0 +1,49 @@ +from sqlalchemy import * +from migrate import * + + +def upgrade(migrate_engine): + meta = MetaData(bind=migrate_engine) + + def fk_name(table, ref_column): + for fk in table.foreign_keys: + if fk.column == ref_column: + return fk.name + + resource = Table('resource', meta, autoload=True) + parsed_template = Table('parsed_template', meta, autoload=True) + + res_kc = ForeignKeyConstraint([resource.c.parsed_template_id], + [parsed_template.c.id], + name=fk_name(resource, + parsed_template.c.id)) + try: + res_kc.drop() + except NotSupportedError: + # SQLite (used in unit tests) cannot drop a Foreign Key constraint + pass + + resource.c.parsed_template_id.drop() + + parsed_template.drop() + + +def downgrade(migrate_engine): + meta = MetaData(bind=migrate_engine) + + raw_template = Table('raw_template', meta, autoload=True) + + parsed_template = Table( + 'parsed_template', meta, + Column('id', Integer, primary_key=True), + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('raw_template_id', Integer, ForeignKey("raw_template.id"), + nullable=False), + Column('template', Text()) + ) + parsed_template.create() + + resource = Table('resource', meta, autoload=True) + Column('parsed_template_id', Integer, ForeignKey('parsed_template.id'), + nullable=True).create(resource) diff --git a/heat/db/sqlalchemy/models.py b/heat/db/sqlalchemy/models.py index 07cf6f1db1..337ca728b5 100644 --- a/heat/db/sqlalchemy/models.py +++ b/heat/db/sqlalchemy/models.py @@ -132,18 +132,6 @@ class RawTemplate(BASE, HeatBase): __tablename__ = 'raw_template' id = Column(Integer, primary_key=True) template = Column(Json) - parsed_template = relationship("ParsedTemplate", - uselist=False, backref="raw_template") - - -class ParsedTemplate(BASE, HeatBase): - """Represents a parsed template.""" - - __tablename__ = 'parsed_template' - id = Column(Integer, primary_key=True) - template = Column(Json) - raw_template_id = Column(Integer, ForeignKey('raw_template.id'), - nullable=False) class Stack(BASE, HeatBase): @@ -217,10 +205,6 @@ class Resource(BASE, HeatBase): state_description = Column('state_description', String) # odd name as "metadata" is reserved rsrc_metadata = Column('rsrc_metadata', Json) - parsed_template_id = Column(Integer, ForeignKey('parsed_template.id'), - nullable=True) - parsed_template = relationship(ParsedTemplate, - backref=backref('resources')) stack_id = Column(Integer, ForeignKey('stack.id'), nullable=False) diff --git a/heat/engine/manager.py b/heat/engine/manager.py index 41728c10c0..011461c5a8 100644 --- a/heat/engine/manager.py +++ b/heat/engine/manager.py @@ -106,8 +106,8 @@ class EngineManager(manager.Manager): return res for s in stacks: ps = parser.Stack(context, s.name, - s.raw_template.parsed_template.template, - s.id, _extract_user_params(params)) + s.raw_template.template, + s.id, s.parameters) mem = {} mem['StackId'] = "/".join([s.name, str(s.id)]) mem['StackName'] = s.name @@ -145,8 +145,8 @@ class EngineManager(manager.Manager): s = db_api.stack_get_by_name(context, stack) if s: ps = parser.Stack(context, s.name, - s.raw_template.parsed_template.template, - s.id, _extract_user_params(params)) + s.raw_template.template, + s.id, s.parameters) mem = {} mem['StackId'] = "/".join([s.name, str(s.id)]) mem['StackName'] = s.name @@ -219,13 +219,6 @@ class EngineManager(manager.Manager): new_s = db_api.stack_create(context, s) stack.id = new_s.id - pt = {} - pt['template'] = stack.t - pt['raw_template_id'] = new_rt.id - new_pt = db_api.parsed_template_create(None, pt) - - stack.parsed_template_id = new_pt.id - greenpool.spawn_n(stack.create, **_extract_args(params)) return {'StackId': "/".join([new_s.name, str(new_s.id)])} diff --git a/heat/engine/parser.py b/heat/engine/parser.py index 2544cca41a..d9ced512a0 100644 --- a/heat/engine/parser.py +++ b/heat/engine/parser.py @@ -44,7 +44,6 @@ class Stack(object): self.res = {} self.doc = None self.name = stack_name - self.parsed_template_id = 0 self.metadata_server = metadata_server # Default Parameters @@ -148,36 +147,6 @@ class Stack(object): response['ValidateTemplateResult']['Parameters'].append(res) return response - def parsed_template_get(self): - stack = None - if self.parsed_template_id == 0: - if self.id == 0: - stack = db_api.stack_get(self.context, self.id) - else: - stack = db_api.stack_get_by_name(self.context, self.name) - - if stack is None: - return None - - self.parsed_template_id = stack.raw_template.parsed_template.id - return db_api.parsed_template_get(self.context, - self.parsed_template_id) - - def update_parsed_template(self): - ''' - Update the parsed template after each resource has been - created, so commands like describe will work. - ''' - pt = self.parsed_template_get() - if pt: - template = self.t.copy() - template['Resources'] = dict((k, r.parsed_template()) - for (k, r) in self.resources.items()) - pt.update_and_save({'template': template}) - else: - logger.warn('Cant find parsed template to update %d' % - self.parsed_template_id) - def state_set(self, new_status, reason='change in resource state'): if self.id != 0: stack = db_api.stack_get(self.context, self.id) @@ -214,11 +183,6 @@ class Stack(object): reason = 'Resource %s failed with: %s' % (str(res), result) - try: - self.update_parsed_template() - except Exception as ex: - logger.exception('update_parsed_template') - else: res.state_set(res.CREATE_FAILED, 'Stack creation aborted') @@ -271,12 +235,6 @@ class Stack(object): stop resource_name and all that depend on it start resource_name and all that depend on it ''' - - if self.parsed_template_id == 0: - stack = db_api.stack_get(self.context, self.id) - if stack: - self.parsed_template_id = stack.raw_template.parsed_template.id - deps = self.dependencies[self[resource_name]] failed = False @@ -296,11 +254,6 @@ class Stack(object): except Exception as ex: logger.exception('create') failed = True - - try: - self.update_parsed_template() - except Exception as ex: - logger.exception('update_parsed_template') else: res.state_set(res.CREATE_FAILED) # TODO(asalkeld) if any of this fails we Should diff --git a/heat/engine/resources.py b/heat/engine/resources.py index b577b80279..e2051befd0 100644 --- a/heat/engine/resources.py +++ b/heat/engine/resources.py @@ -213,7 +213,6 @@ class Resource(object): try: rs = {'state': self.state, 'stack_id': self.stack.id, - 'parsed_template_id': self.stack.parsed_template_id, 'nova_instance': self.instance_id, 'name': self.name, 'rsrc_metadata': metadata, diff --git a/heat/engine/stack.py b/heat/engine/stack.py index 2b9ae4e894..0902cb7d34 100644 --- a/heat/engine/stack.py +++ b/heat/engine/stack.py @@ -54,7 +54,7 @@ class Stack(Resource): raise exception.NotFound('Nested stack not found in DB') n = parser.Stack(self.stack.context, st.name, - st.raw_template.parsed_template.template, + st.raw_template.template, self.instance_id, self._params()) self._nested = n @@ -83,11 +83,6 @@ class Stack(Resource): new_s = db_api.stack_create(None, s) self._nested.id = new_s.id - pt = {'template': self._nested.t, 'raw_template_id': new_rt.id} - new_pt = db_api.parsed_template_create(None, pt) - - self._nested.parsed_template_id = new_pt.id - self._nested.create() self.instance_id_set(self._nested.id) diff --git a/heat/tests/test_stacks.py b/heat/tests/test_stacks.py index ed804d74d7..ab758e3770 100644 --- a/heat/tests/test_stacks.py +++ b/heat/tests/test_stacks.py @@ -83,10 +83,6 @@ class stacksTest(unittest.TestCase): s['username'] = ct['username'] new_s = db_api.stack_create(None, s) stack.id = new_s.id - pt = {} - pt['template'] = stack.t - pt['raw_template_id'] = new_rt.id - new_pt = db_api.parsed_template_create(None, pt) stack.create() self.assertNotEqual(stack.resources['WebServer'], None) self.assertTrue(stack.resources['WebServer'].instance_id > 0) @@ -113,10 +109,6 @@ class stacksTest(unittest.TestCase): s['username'] = ct['username'] new_s = db_api.stack_create(None, s) stack.id = new_s.id - pt = {} - pt['template'] = stack.t - pt['raw_template_id'] = new_rt.id - new_pt = db_api.parsed_template_create(None, pt) stack.create() self.assertNotEqual(stack.resources['WebServer'], None) @@ -165,10 +157,6 @@ class stacksTest(unittest.TestCase): s['username'] = ct['username'] new_s = db_api.stack_create(ctx, s) stack.id = new_s.id - pt = {} - pt['template'] = stack.t - pt['raw_template_id'] = new_rt.id - new_pt = db_api.parsed_template_create(ctx, pt) instances.Instance.nova().AndReturn(self.fc) self.m.ReplayAll() stack.create() diff --git a/heat/tests/test_waitcondition.py b/heat/tests/test_waitcondition.py index 03ebedcc71..f881bb5628 100644 --- a/heat/tests/test_waitcondition.py +++ b/heat/tests/test_waitcondition.py @@ -66,12 +66,7 @@ class stacksTest(unittest.TestCase): s['username'] = ct['username'] new_s = db_api.stack_create(None, s) stack.id = new_s.id - pt = {} - pt['template'] = stack.t - pt['raw_template_id'] = new_rt.id - new_pt = db_api.parsed_template_create(None, pt) - stack.parsed_template_id = new_pt.id return stack def test_post_success_to_handle(self):