4892f98f8e16c4a1b394f6000807adbc2683f81c
[yardstick.git] / tests / unit / orchestrator / test_heat.py
1 #!/usr/bin/env python
2
3 ##############################################################################
4 # Copyright (c) 2017 Intel Corporation
5 #
6 # All rights reserved. This program and the accompanying materials
7 # are made available under the terms of the Apache License, Version 2.0
8 # which accompanies this distribution, and is available at
9 # http://www.apache.org/licenses/LICENSE-2.0
10 ##############################################################################
11
12 # Unittest for yardstick.benchmark.orchestrator.heat
13
14 from tempfile import NamedTemporaryFile
15 import unittest
16 import uuid
17 import mock
18
19 from yardstick.benchmark.contexts import node
20 from yardstick.orchestrator import heat
21
22
23 class HeatContextTestCase(unittest.TestCase):
24
25     def test_get_short_key_uuid(self):
26         u = uuid.uuid4()
27         k = heat.get_short_key_uuid(u)
28         self.assertEqual(heat.HEAT_KEY_UUID_LENGTH, len(k))
29         self.assertIn(k, str(u))
30
31 class HeatTemplateTestCase(unittest.TestCase):
32
33     def setUp(self):
34         self.template = heat.HeatTemplate('test')
35
36     def test_add_tenant_network(self):
37         self.template.add_network('some-network')
38
39         self.assertEqual(self.template.resources['some-network']['type'], 'OS::Neutron::Net')
40
41     def test_add_provider_network(self):
42         self.template.add_network('some-network', 'physnet2', 'sriov')
43
44         self.assertEqual(self.template.resources['some-network']['type'], 'OS::Neutron::ProviderNet')
45         self.assertEqual(self.template.resources['some-network']['properties']['physical_network'], 'physnet2')
46
47     def test_add_subnet(self):
48         netattrs = {'cidr': '10.0.0.0/24', 'provider': None, 'external_network': 'ext_net'}
49         self.template.add_subnet('some-subnet', "some-network", netattrs['cidr'])
50
51         self.assertEqual(self.template.resources['some-subnet']['type'], 'OS::Neutron::Subnet')
52         self.assertEqual(self.template.resources['some-subnet']['properties']['cidr'], '10.0.0.0/24')
53
54     def test_add_router(self):
55         self.template.add_router('some-router', 'ext-net', 'some-subnet')
56
57         self.assertEqual(self.template.resources['some-router']['type'], 'OS::Neutron::Router')
58         self.assertIn('some-subnet', self.template.resources['some-router']['depends_on'])
59
60     def test_add_router_interface(self):
61         self.template.add_router_interface('some-router-if', 'some-router', 'some-subnet')
62
63         self.assertEqual(self.template.resources['some-router-if']['type'], 'OS::Neutron::RouterInterface')
64         self.assertIn('some-subnet', self.template.resources['some-router-if']['depends_on'])
65
66     def test_add_servergroup(self):
67         self.template.add_servergroup('some-server-group', 'anti-affinity')
68
69         self.assertEqual(self.template.resources['some-server-group']['type'], 'OS::Nova::ServerGroup')
70         self.assertEqual(self.template.resources['some-server-group']['properties']['policies'], ['anti-affinity'])
71
72     def test__add_resources_to_template_raw(self):
73
74         self.test_context = node.NodeContext()
75         self.test_context.name = 'foo'
76         self.test_context.template_file = '/tmp/some-heat-file'
77         self.test_context.heat_parameters = {'image': 'cirros'}
78         self.test_context.key_filename = "/tmp/1234"
79         self.test_context.keypair_name = "foo-key"
80         self.test_context.secgroup_name = "foo-secgroup"
81         self.test_context.key_uuid = "2f2e4997-0a8e-4eb7-9fa4-f3f8fbbc393b"
82         self._template = {
83             'outputs' : {},
84             'resources' : {}
85         }
86
87         self.heat_object = heat.HeatObject()
88         self.heat_tmp_object = heat.HeatObject()
89
90         self.heat_stack = heat.HeatStack("tmpStack")
91         self.heat_stack.stacks_exist()
92
93         self.test_context.tmpfile = NamedTemporaryFile(delete=True, mode='w+t')
94         self.test_context.tmpfile.write("heat_template_version: 2015-04-30")
95         self.test_context.tmpfile.flush()
96         self.test_context.tmpfile.seek(0)
97         self.heat_tmp_template = heat.HeatTemplate(self.heat_tmp_object, self.test_context.tmpfile.name,
98                                                    heat_parameters= {"dict1": 1, "dict2": 2})
99
100         self.heat_template = heat.HeatTemplate(self.heat_object)
101         self.heat_template.resources = {}
102
103         self.heat_template.add_network("network1")
104         self.heat_template.add_network("network2")
105         self.heat_template.add_security_group("sec_group1")
106         self.heat_template.add_security_group("sec_group2")
107         self.heat_template.add_subnet("subnet1", "network1", "cidr1")
108         self.heat_template.add_subnet("subnet2", "network2", "cidr2")
109         self.heat_template.add_router("router1", "gw1", "subnet1")
110         self.heat_template.add_router_interface("router_if1", "router1", "subnet1")
111         self.heat_template.add_port("port1", "network1", "subnet1")
112         self.heat_template.add_port("port2", "network2", "subnet2", sec_group_id="sec_group1",provider="not-sriov")
113         self.heat_template.add_port("port3", "network2", "subnet2", sec_group_id="sec_group1",provider="sriov")
114         self.heat_template.add_floating_ip("floating_ip1", "network1", "port1", "router_if1")
115         self.heat_template.add_floating_ip("floating_ip2", "network2", "port2", "router_if2", "foo-secgroup")
116         self.heat_template.add_floating_ip_association("floating_ip1_association", "floating_ip1", "port1")
117         self.heat_template.add_servergroup("server_grp2", "affinity")
118         self.heat_template.add_servergroup("server_grp3", "anti-affinity")
119         self.heat_template.add_security_group("security_group")
120         self.heat_template.add_server(name="server1", image="image1", flavor="flavor1", flavors=[])
121         self.heat_template.add_server_group(name="servergroup", policies=["policy1","policy2"])
122         self.heat_template.add_server_group(name="servergroup", policies="policy1")
123         self.heat_template.add_server(name="server2", image="image1", flavor="flavor1", flavors=[], ports=["port1", "port2"],
124                                  networks=["network1", "network2"], scheduler_hints="hints1", user="user1",
125                                  key_name="foo-key", user_data="user", metadata={"cat": 1, "doc": 2},
126                                  additional_properties={"prop1": 1, "prop2": 2})
127         self.heat_template.add_server(name="server2", image="image1", flavor="flavor1", flavors=["flavor1", "flavor2"],
128                                  ports=["port1", "port2"],
129                                  networks=["network1", "network2"], scheduler_hints="hints1", user="user1",
130                                  key_name="foo-key", user_data="user", metadata={"cat": 1, "doc": 2},
131                                  additional_properties={"prop1": 1, "prop2": 2} )
132         self.heat_template.add_server(name="server2", image="image1", flavor="flavor1", flavors=["flavor3", "flavor4"],
133                                  ports=["port1", "port2"],
134                                  networks=["network1", "network2"], scheduler_hints="hints1", user="user1",
135                                  key_name="foo-key", user_data="user", metadata={"cat": 1, "doc": 2},
136                                  additional_properties={"prop1": 1, "prop2": 2})
137         self.heat_template.add_flavor(name="flavor1", vcpus=1, ram=2048, disk=1,extra_specs={"cat": 1, "dog": 2})
138         self.heat_template.add_flavor(name=None, vcpus=1, ram=2048)
139         self.heat_template.add_server(name="server1",
140                                       image="image1",
141                                       flavor="flavor1",
142                                       flavors=[],
143                                       ports=["port1", "port2"],
144                                       networks=["network1", "network2"],
145                                       scheduler_hints="hints1",
146                                       user="user1",
147                                       key_name="foo-key",
148                                       user_data="user",
149                                       metadata={"cat": 1, "doc": 2},
150                                       additional_properties= {"prop1": 1, "prop2": 2} )
151         self.heat_template.add_network("network1")
152
153         self.heat_template.add_flavor("test")
154         self.assertEqual(self.heat_template.resources['test']['type'], 'OS::Nova::Flavor')
155
156
157 class HeatStackTestCase(unittest.TestCase):
158
159     def test_delete_calls__delete_multiple_times(self):
160         stack = heat.HeatStack('test')
161         stack.uuid = 1
162         with mock.patch.object(stack, "_delete") as delete_mock:
163             stack.delete()
164         # call once and then call again if uuid is not none
165         self.assertGreater(delete_mock.call_count, 1)
166
167     def test_delete_all_calls_delete(self):
168         stack = heat.HeatStack('test')
169         stack.uuid = 1
170         with mock.patch.object(stack, "delete") as delete_mock:
171             stack.delete_all()
172         self.assertGreater(delete_mock.call_count, 0)