import itertools
from heat.common import exception
+from heat.engine import dependencies
from heat.engine import parser
from heat.engine import resource
from heat.engine import scheduler
+from heat.engine import template
from heat.engine import environment
from heat.openstack.common import uuidutils
import heat.db.api as db_api
)
+class ResourceDependenciesTest(HeatTestCase):
+ def setUp(self):
+ super(ResourceDependenciesTest, self).setUp()
+ utils.setup_dummy_db()
+
+ resource._register_class('GenericResourceType',
+ generic_rsrc.GenericResource)
+ resource._register_class('ResourceWithPropsType',
+ generic_rsrc.ResourceWithProps)
+
+ self.deps = dependencies.Dependencies()
+
+ def test_no_deps(self):
+ tmpl = template.Template({
+ 'Resources': {
+ 'foo': {'Type': 'GenericResourceType'},
+ }
+ })
+ stack = parser.Stack(None, 'test', tmpl)
+
+ res = stack['foo']
+ res.add_dependencies(self.deps)
+ graph = self.deps.graph()
+
+ self.assertIn(res, graph)
+
+ def test_ref(self):
+ tmpl = template.Template({
+ 'Resources': {
+ 'foo': {'Type': 'GenericResourceType'},
+ 'bar': {
+ 'Type': 'ResourceWithPropsType',
+ 'Properties': {
+ 'Foo': {'Ref': 'foo'},
+ }
+ }
+ }
+ })
+ stack = parser.Stack(None, 'test', tmpl)
+
+ res = stack['bar']
+ res.add_dependencies(self.deps)
+ graph = self.deps.graph()
+
+ self.assertIn(res, graph)
+ self.assertIn(stack['foo'], graph[res])
+
+ def test_ref_nested_dict(self):
+ tmpl = template.Template({
+ 'Resources': {
+ 'foo': {'Type': 'GenericResourceType'},
+ 'bar': {
+ 'Type': 'ResourceWithPropsType',
+ 'Properties': {
+ 'Foo': {'Fn::Base64': {'Ref': 'foo'}},
+ }
+ }
+ }
+ })
+ stack = parser.Stack(None, 'test', tmpl)
+
+ res = stack['bar']
+ res.add_dependencies(self.deps)
+ graph = self.deps.graph()
+
+ self.assertIn(res, graph)
+ self.assertIn(stack['foo'], graph[res])
+
+ def test_ref_nested_deep(self):
+ tmpl = template.Template({
+ 'Resources': {
+ 'foo': {'Type': 'GenericResourceType'},
+ 'bar': {
+ 'Type': 'ResourceWithPropsType',
+ 'Properties': {
+ 'Foo': {'Fn::Join': [",", ["blarg",
+ {'Ref': 'foo'},
+ "wibble"]]},
+ }
+ }
+ }
+ })
+ stack = parser.Stack(None, 'test', tmpl)
+
+ res = stack['bar']
+ res.add_dependencies(self.deps)
+ graph = self.deps.graph()
+
+ self.assertIn(res, graph)
+ self.assertIn(stack['foo'], graph[res])
+
+ def test_getatt(self):
+ tmpl = template.Template({
+ 'Resources': {
+ 'foo': {'Type': 'GenericResourceType'},
+ 'bar': {
+ 'Type': 'ResourceWithPropsType',
+ 'Properties': {
+ 'Foo': {'Fn::GetAtt': ['foo', 'bar']},
+ }
+ }
+ }
+ })
+ stack = parser.Stack(None, 'test', tmpl)
+
+ res = stack['bar']
+ res.add_dependencies(self.deps)
+ graph = self.deps.graph()
+
+ self.assertIn(res, graph)
+ self.assertIn(stack['foo'], graph[res])
+
+ def test_getatt_nested_dict(self):
+ tmpl = template.Template({
+ 'Resources': {
+ 'foo': {'Type': 'GenericResourceType'},
+ 'bar': {
+ 'Type': 'ResourceWithPropsType',
+ 'Properties': {
+ 'Foo': {'Fn::Base64': {'Fn::GetAtt': ['foo', 'bar']}},
+ }
+ }
+ }
+ })
+ stack = parser.Stack(None, 'test', tmpl)
+
+ res = stack['bar']
+ res.add_dependencies(self.deps)
+ graph = self.deps.graph()
+
+ self.assertIn(res, graph)
+ self.assertIn(stack['foo'], graph[res])
+
+ def test_getatt_nested_deep(self):
+ tmpl = template.Template({
+ 'Resources': {
+ 'foo': {'Type': 'GenericResourceType'},
+ 'bar': {
+ 'Type': 'ResourceWithPropsType',
+ 'Properties': {
+ 'Foo': {'Fn::Join': [",", ["blarg",
+ {'Fn::GetAtt': ['foo',
+ 'bar']},
+ "wibble"]]},
+ }
+ }
+ }
+ })
+ stack = parser.Stack(None, 'test', tmpl)
+
+ res = stack['bar']
+ res.add_dependencies(self.deps)
+ graph = self.deps.graph()
+
+ self.assertIn(res, graph)
+ self.assertIn(stack['foo'], graph[res])
+
+ def test_dependson(self):
+ tmpl = template.Template({
+ 'Resources': {
+ 'foo': {'Type': 'GenericResourceType'},
+ 'bar': {
+ 'Type': 'GenericResourceType',
+ 'DependsOn': 'foo',
+ }
+ }
+ })
+ stack = parser.Stack(None, 'test', tmpl)
+
+ res = stack['bar']
+ res.add_dependencies(self.deps)
+ graph = self.deps.graph()
+
+ self.assertIn(res, graph)
+ self.assertIn(stack['foo'], graph[res])
+
+
class MetadataTest(HeatTestCase):
def setUp(self):
super(MetadataTest, self).setUp()