heat/heat/tests/aws/test_network_interface.py

138 lines
5.0 KiB
Python

#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import copy
from heat.engine import rsrc_defn
from heat.engine import scheduler
from heat.tests import common
from heat.tests import utils
try:
from neutronclient.v2_0 import client as neutronclient
except ImportError:
neutronclient = None
test_template = {
'heat_template_version': '2013-05-23',
'resources': {
'my_nic': {
'type': 'AWS::EC2::NetworkInterface',
'properties': {
'SubnetId': 'ssss'
}
}
}
}
class NetworkInterfaceTest(common.HeatTestCase):
def setUp(self):
super(NetworkInterfaceTest, self).setUp()
self.ctx = utils.dummy_context()
self.m_ss = self.patchobject(neutronclient.Client, 'show_subnet')
self.m_cp = self.patchobject(neutronclient.Client, 'create_port')
self.m_dp = self.patchobject(neutronclient.Client, 'delete_port')
self.m_up = self.patchobject(neutronclient.Client, 'update_port')
def mock_show_subnet(self):
self.m_ss.return_value = {
'subnet': {
'name': 'my_subnet',
'network_id': 'nnnn',
'tenant_id': 'c1210485b2424d48804aad5d39c61b8f',
'allocation_pools': [{'start': '10.0.0.2',
'end': '10.0.0.254'}],
'gateway_ip': '10.0.0.1',
'ip_version': 4,
'cidr': '10.0.0.0/24',
'id': 'ssss',
'enable_dhcp': False,
}}
def mock_create_network_interface(self, stack_name='my_stack',
resource_name='my_nic',
security_groups=None):
self.nic_name = utils.PhysName(stack_name, resource_name)
self.port = {'network_id': 'nnnn',
'fixed_ips': [{
'subnet_id': u'ssss'
}],
'name': self.nic_name,
'admin_state_up': True}
port_info = {
'port': {
'admin_state_up': True,
'device_id': '',
'device_owner': '',
'fixed_ips': [
{
'ip_address': '10.0.0.100',
'subnet_id': 'ssss'
}
],
'id': 'pppp',
'mac_address': 'fa:16:3e:25:32:5d',
'name': self.nic_name,
'network_id': 'nnnn',
'status': 'ACTIVE',
'tenant_id': 'c1210485b2424d48804aad5d39c61b8f'
}
}
if security_groups is not None:
self.port['security_groups'] = security_groups
port_info['security_groups'] = security_groups
else:
port_info['security_groups'] = ['default']
self.m_cp.return_value = port_info
def test_network_interface_create_update_delete(self):
my_stack = utils.parse_stack(test_template,
stack_name='test_nif_cud_stack')
nic_rsrc = my_stack['my_nic']
self.mock_show_subnet()
self.stub_SubnetConstraint_validate()
self.mock_create_network_interface(my_stack.name)
update_props = {}
update_sg_ids = ['0389f747-7785-4757-b7bb-2ab07e4b09c3']
update_props['security_groups'] = update_sg_ids
# create the nic without GroupSet
self.assertIsNone(nic_rsrc.validate())
scheduler.TaskRunner(nic_rsrc.create)()
self.assertEqual((nic_rsrc.CREATE, my_stack.COMPLETE),
nic_rsrc.state)
# update the nic with GroupSet
props = copy.deepcopy(nic_rsrc.properties.data)
props['GroupSet'] = update_sg_ids
update_snippet = rsrc_defn.ResourceDefinition(nic_rsrc.name,
nic_rsrc.type(),
props)
scheduler.TaskRunner(nic_rsrc.update, update_snippet)()
self.assertEqual((nic_rsrc.UPDATE, nic_rsrc.COMPLETE), nic_rsrc.state)
# delete the nic
scheduler.TaskRunner(nic_rsrc.delete)()
self.assertEqual((nic_rsrc.DELETE, nic_rsrc.COMPLETE), nic_rsrc.state)
self.m_ss.assert_called_once_with('ssss')
self.m_cp.assert_called_once_with({'port': self.port})
self.m_up.assert_called_once_with('pppp', {'port': update_props})
self.m_dp.assert_called_once_with('pppp')