Acquire NSB specific data from Heat.
[yardstick.git] / tests / unit / benchmark / contexts / test_heat.py
1 #!/usr/bin/env python
2
3 ##############################################################################
4 # Copyright (c) 2015 Ericsson AB and others.
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.contexts.heat
13
14 from __future__ import absolute_import
15
16 import logging
17 import os
18 import unittest
19 import uuid
20 from collections import OrderedDict
21
22 import mock
23
24 from yardstick.benchmark.contexts import heat
25 from yardstick.benchmark.contexts import model
26
27
28 LOG = logging.getLogger(__name__)
29
30
31 class HeatContextTestCase(unittest.TestCase):
32
33     def setUp(self):
34         self.test_context = heat.HeatContext()
35         self.mock_context = mock.Mock(spec=heat.HeatContext())
36
37     def test_construct(self):
38
39         self.assertIsNone(self.test_context.name)
40         self.assertIsNone(self.test_context.stack)
41         self.assertEqual(self.test_context.networks, OrderedDict())
42         self.assertEqual(self.test_context.servers, [])
43         self.assertEqual(self.test_context.placement_groups, [])
44         self.assertEqual(self.test_context.server_groups, [])
45         self.assertIsNone(self.test_context.keypair_name)
46         self.assertIsNone(self.test_context.secgroup_name)
47         self.assertEqual(self.test_context._server_map, {})
48         self.assertIsNone(self.test_context._image)
49         self.assertIsNone(self.test_context._flavor)
50         self.assertIsNone(self.test_context._user)
51         self.assertIsNone(self.test_context.template_file)
52         self.assertIsNone(self.test_context.heat_parameters)
53         self.assertIsNotNone(self.test_context.key_uuid)
54         self.assertIsNotNone(self.test_context.key_filename)
55
56     @mock.patch('yardstick.benchmark.contexts.heat.PlacementGroup')
57     @mock.patch('yardstick.benchmark.contexts.heat.ServerGroup')
58     @mock.patch('yardstick.benchmark.contexts.heat.Network')
59     @mock.patch('yardstick.benchmark.contexts.heat.Server')
60     def test_init(self, mock_server, mock_network, mock_sg, mock_pg):
61
62         pgs = {'pgrp1': {'policy': 'availability'}}
63         sgs = {'servergroup1': {'policy': 'affinity'}}
64         networks = {'bar': {'cidr': '10.0.1.0/24'}}
65         servers = {'baz': {'floating_ip': True, 'placement': 'pgrp1'}}
66         attrs = {'name': 'foo',
67                  'placement_groups': pgs,
68                  'server_groups': sgs,
69                  'networks': networks,
70                  'servers': servers}
71
72         self.test_context.init(attrs)
73
74         self.assertEqual(self.test_context.name, "foo")
75         self.assertEqual(self.test_context.keypair_name, "foo-key")
76         self.assertEqual(self.test_context.secgroup_name, "foo-secgroup")
77
78         mock_pg.assert_called_with('pgrp1', self.test_context,
79                                    pgs['pgrp1']['policy'])
80         mock_sg.assert_called_with('servergroup1', self.test_context,
81                                    sgs['servergroup1']['policy'])
82         self.assertTrue(len(self.test_context.placement_groups) == 1)
83         self.assertTrue(len(self.test_context.server_groups) == 1)
84
85         mock_network.assert_called_with(
86             'bar', self.test_context, networks['bar'])
87         self.assertTrue(len(self.test_context.networks) == 1)
88
89         mock_server.assert_called_with('baz', self.test_context,
90                                        servers['baz'])
91         self.assertTrue(len(self.test_context.servers) == 1)
92
93         if os.path.exists(self.test_context.key_filename):
94             try:
95                 os.remove(self.test_context.key_filename)
96                 os.remove(self.test_context.key_filename + ".pub")
97             except OSError:
98                 LOG.exception("key_filename: %s",
99                               self.test_context.key_filename)
100
101     @mock.patch('yardstick.benchmark.contexts.heat.HeatTemplate')
102     def test__add_resources_to_template_no_servers(self, mock_template):
103
104         self.test_context.keypair_name = "foo-key"
105         self.test_context.secgroup_name = "foo-secgroup"
106         self.test_context.key_uuid = "2f2e4997-0a8e-4eb7-9fa4-f3f8fbbc393b"
107         netattrs = {'cidr': '10.0.0.0/24', 'provider': None, 'external_network': 'ext_net'}
108         self.mock_context.name = 'bar'
109         self.test_context.networks = OrderedDict(
110             {"fool-network": model.Network("fool-network", self.mock_context,
111                                            netattrs)})
112
113         self.test_context._add_resources_to_template(mock_template)
114         mock_template.add_keypair.assert_called_with(
115             "foo-key",
116             "2f2e4997-0a8e-4eb7-9fa4-f3f8fbbc393b")
117         mock_template.add_security_group.assert_called_with("foo-secgroup")
118 #        mock_template.add_network.assert_called_with("bar-fool-network", 'physnet1', None)
119         mock_template.add_router.assert_called_with("bar-fool-network-router", netattrs["external_network"], "bar-fool-network-subnet")
120         mock_template.add_router_interface.assert_called_with("bar-fool-network-router-if0", "bar-fool-network-router", "bar-fool-network-subnet")
121
122     @mock.patch('yardstick.benchmark.contexts.heat.HeatTemplate')
123     def test_deploy(self, mock_template):
124
125         self.test_context.name = 'foo'
126         self.test_context.template_file = '/bar/baz/some-heat-file'
127         self.test_context.heat_parameters = {'image': 'cirros'}
128         self.test_context.heat_timeout = 5
129         self.test_context.deploy()
130
131         mock_template.assert_called_with(self.test_context.name,
132                                          self.test_context.template_file,
133                                          self.test_context.heat_parameters)
134         self.assertIsNotNone(self.test_context.stack)
135
136     @mock.patch('yardstick.benchmark.contexts.heat.HeatTemplate')
137     def test_undeploy(self, mock_template):
138
139         self.test_context.stack = mock_template
140         self.test_context.undeploy()
141
142         self.assertTrue(mock_template.delete.called)
143
144     def test__get_server(self):
145
146         self.mock_context.name = 'bar'
147         self.mock_context.stack.outputs = {'public_ip': '127.0.0.1',
148                                            'private_ip': '10.0.0.1'}
149         self.mock_context.key_uuid = uuid.uuid4()
150
151         attr_name = {'name': 'foo.bar',
152                      'public_ip_attr': 'public_ip',
153                      'private_ip_attr': 'private_ip'}
154         result = heat.HeatContext._get_server(self.mock_context, attr_name)
155
156         self.assertEqual(result['ip'], '127.0.0.1')
157         self.assertEqual(result['private_ip'], '10.0.0.1')