def run_alarm_action(stk, actions, details): for action in actions: action(details=details) for res in stk._explicit_dependencies(): res.metadata_update() stk_defn.update_resource_data(stk.defn, res.name, res.node_data())
def create_volume(self, t, stack, resource_name, az='nova', validate=True, no_create=False): rsrc = self.get_volume(t, stack, resource_name) if isinstance(rsrc, os_vol.CinderVolume): self.patchobject(rsrc, '_store_config_default_properties') self.assertIsNone(rsrc.validate()) scheduler.TaskRunner(rsrc.create)() self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) stk_defn.update_resource_data(stack.defn, resource_name, rsrc.node_data()) if validate: if no_create: self.cinder_fc.volumes.create.assert_not_called() else: self.vol_name = utils.PhysName(self.stack_name, 'DataVolume') self.cinder_fc.volumes.create.assert_called_once_with( size=1, availability_zone=az, description=self.vol_name, name=self.vol_name, metadata={u'Usage': u'Wiki Data Volume'}) return rsrc
def test_update_restored_from_db(self): self.stack = self.create_stack() self.m.ReplayAll() self.stack.create() rsrc = self.stack['WaitForTheHandle'] self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) self.m.VerifyAll() self.m.UnsetStubs() handle_stack = self.stack wait_condition_handle = handle_stack['WaitHandle'] test_metadata = {'Data': 'foo', 'Reason': 'bar', 'Status': 'SUCCESS', 'UniqueId': '1'} self._handle_signal(wait_condition_handle, test_metadata, 2) self.stack.store() self.stack = self.get_stack(self.stack_id) rsrc = self.stack['WaitForTheHandle'] self._handle_signal(wait_condition_handle, test_metadata, 3) uprops = copy.copy(rsrc.properties.data) uprops['Count'] = '5' update_snippet = rsrc_defn.ResourceDefinition(rsrc.name, rsrc.type(), uprops) stk_defn.update_resource_data(self.stack.defn, 'WaitHandle', self.stack['WaitHandle'].node_data()) updater = scheduler.TaskRunner(rsrc.update, update_snippet) updater() self.assertEqual((rsrc.UPDATE, rsrc.COMPLETE), rsrc.state)
def _create_trunk(self, stack): trunk = stack['trunk'] scheduler.TaskRunner(trunk.create)() stk_defn.update_resource_data(stack.defn, trunk.name, trunk.node_data()) self.assertEqual((trunk.CREATE, trunk.COMPLETE), trunk.state)
def test_create_one_subport(self): t = template_format.parse(create_template) del t['resources']['trunk']['properties']['sub_ports'][1:] del t['resources']['subport_2'] stack = utils.parse_stack(t) parent_port = stack['parent_port'] self.patchobject(parent_port, 'get_reference_id', return_value='parent port id') stk_defn.update_resource_data(stack.defn, parent_port.name, parent_port.node_data()) subport_1 = stack['subport_1'] self.patchobject(subport_1, 'get_reference_id', return_value='subport id') stk_defn.update_resource_data(stack.defn, subport_1.name, subport_1.node_data()) self._create_trunk(stack) self.create_trunk_mock.assert_called_once_with({ 'trunk': { 'description': 'trunk description', 'name': 'trunk name', 'port_id': 'parent port id', 'sub_ports': [ {'port_id': 'subport id', 'segmentation_type': 'vlan', 'segmentation_id': 101}, ], }} )
def test_create_parent_port_by_name(self): t = template_format.parse(create_template) t['resources']['parent_port'][ 'properties']['name'] = 'parent port name' t['resources']['trunk'][ 'properties']['port'] = 'parent port name' del t['resources']['trunk']['properties']['sub_ports'] stack = utils.parse_stack(t) parent_port = stack['parent_port'] self.patchobject(parent_port, 'get_reference_id', return_value='parent port id') stk_defn.update_resource_data(stack.defn, parent_port.name, parent_port.node_data()) def find_resourceid_by_name_or_id( _client, _resource, name_or_id, **_kwargs): name_to_id = { 'parent port name': 'parent port id', 'parent port id': 'parent port id', } return name_to_id[name_or_id] self.find_resource_mock.side_effect = find_resourceid_by_name_or_id self._create_trunk(stack) self.create_trunk_mock.assert_called_once_with({ 'trunk': { 'description': 'trunk description', 'name': 'trunk name', 'port_id': 'parent port id', }} )
def test_update_restored_from_db(self): self.stack = self.create_stack() rsrc = self.stack['WaitForTheHandle'] handle_stack = self.stack wait_condition_handle = handle_stack['WaitHandle'] test_metadata = { 'Data': 'foo', 'Reason': 'bar', 'Status': 'SUCCESS', 'UniqueId': '1' } self._handle_signal(wait_condition_handle, test_metadata, 2) self.stack.store() self.stack = self.get_stack(self.stack_id) rsrc = self.stack['WaitForTheHandle'] self._handle_signal(wait_condition_handle, test_metadata, 3) uprops = copy.copy(rsrc.properties.data) uprops['Count'] = '5' update_snippet = rsrc_defn.ResourceDefinition(rsrc.name, rsrc.type(), uprops) stk_defn.update_resource_data(self.stack.defn, 'WaitHandle', self.stack['WaitHandle'].node_data()) updater = scheduler.TaskRunner(rsrc.update, update_snippet) updater() self.assertEqual((rsrc.UPDATE, rsrc.COMPLETE), rsrc.state)
def test_deprecated_network_id(self): template = """ heat_template_version: 2015-04-30 resources: net: type: OS::Neutron::Net properties: name: test subnet: type: OS::Neutron::Subnet properties: network_id: { get_resource: net } cidr: 10.0.0.0/24 """ t = template_format.parse(template) stack = utils.parse_stack(t) rsrc = stack['subnet'] nd = {'reference_id': 'fc68ea2c-b60b-4b4f-bd82-94ec81110766'} stk_defn.update_resource_data(stack.defn, 'net', node_data.NodeData.from_dict(nd)) self.create_mock.return_value = { "subnet": { "id": "91e47a57-7508-46fe-afc9-fc454e8580e1", "ip_version": 4, "name": "name", "network_id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766", "tenant_id": "c1210485b2424d48804aad5d39c61b8f" } } stack.create() self.assertEqual(hot_funcs.GetResource(stack.defn, 'get_resource', 'net'), rsrc.properties.get('network')) self.assertIsNone(rsrc.properties.get('network_id'))
def test_deprecated_network_id(self): template = """ heat_template_version: 2015-04-30 resources: net: type: OS::Neutron::Net properties: name: test subnet: type: OS::Neutron::Subnet properties: network_id: { get_resource: net } cidr: 10.0.0.0/24 """ t = template_format.parse(template) stack = utils.parse_stack(t) rsrc = stack['subnet'] nd = {'reference_id': 'fc68ea2c-b60b-4b4f-bd82-94ec81110766'} stk_defn.update_resource_data(stack.defn, 'net', node_data.NodeData.from_dict(nd)) self.create_mock.return_value = { "subnet": { "id": "91e47a57-7508-46fe-afc9-fc454e8580e1", "ip_version": 4, "name": "name", "network_id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766", "tenant_id": "c1210485b2424d48804aad5d39c61b8f" } } stack.create() self.assertEqual( hot_funcs.GetResource(stack.defn, 'get_resource', 'net'), rsrc.properties.get('network')) self.assertIsNone(rsrc.properties.get('network_id'))
def test_create_parent_port_by_name(self): t = template_format.parse(create_template) t['resources']['parent_port']['properties'][ 'name'] = 'parent port name' t['resources']['trunk']['properties']['port'] = 'parent port name' del t['resources']['trunk']['properties']['sub_ports'] stack = utils.parse_stack(t) parent_port = stack['parent_port'] self.patchobject(parent_port, 'get_reference_id', return_value='parent port id') stk_defn.update_resource_data(stack.defn, parent_port.name, parent_port.node_data()) def find_resourceid_by_name_or_id(_client, _resource, name_or_id, **_kwargs): name_to_id = { 'parent port name': 'parent port id', 'parent port id': 'parent port id', } return name_to_id[name_or_id] self.find_resource_mock.side_effect = find_resourceid_by_name_or_id self._create_trunk(stack) self.create_trunk_mock.assert_called_once_with({ 'trunk': { 'description': 'trunk description', 'name': 'trunk name', 'port_id': 'parent port id', } })
def create_association(self, t, stack, resource_name): resource_defn = stack.defn.resource_definition(resource_name) rsrc = eip.ElasticIpAssociation(resource_name, resource_defn, stack) self.assertIsNone(rsrc.validate()) scheduler.TaskRunner(rsrc.create)() self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) stk_defn.update_resource_data(stack.defn, resource_name, rsrc.node_data()) return rsrc
def create_eip(self, t, stack, resource_name): rsrc = eip.ElasticIp(resource_name, stack.defn.resource_definition(resource_name), stack) self.assertIsNone(rsrc.validate()) scheduler.TaskRunner(rsrc.create)() self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) stk_defn.update_resource_data(stack.defn, resource_name, rsrc.node_data()) return rsrc
def test_FnGetAtt_metadata_updated(self, mock_get, mock_check, mock_handle, *args): """Tests that metadata gets updated when FnGetAtt return changes.""" # Setup temp = template_format.parse(TEST_TEMPLATE_METADATA) template = tmpl.Template(temp, env=environment.Environment({})) ctx = utils.dummy_context() stack = stk.Stack(ctx, 'test_stack', template, disable_rollback=True) stack.store() self.stub_KeypairConstraint_validate() # Configure FnGetAtt to return different values on subsequent calls mock_get.side_effect = [ '10.0.0.1', '10.0.0.2', ] # Initial resolution of the metadata stack.create() self.assertEqual((stack.CREATE, stack.COMPLETE), stack.state) # Sanity check on S2 s2 = stack['S2'] self.assertEqual((s2.CREATE, s2.COMPLETE), s2.state) # Verify S1 is using the initial value from S2 s1 = stack['S1'] content = self._get_metadata_content(s1.metadata_get()) self.assertEqual('s2-ip=10.0.0.1', content) # This is not a terribly realistic test - the metadata updates below # happen in run_alarm_action() in service_stack_watch, and actually # operate on a freshly loaded stack so there's no cached attributes. # Clear the attributes cache here to keep it passing. s2.attributes.reset_resolved_values() # Run metadata update to pick up the new value from S2 # (simulating run_alarm_action() in service_stack_watch) s2.metadata_update() stk_defn.update_resource_data(stack.defn, s2.name, s2.node_data()) s1.metadata_update() stk_defn.update_resource_data(stack.defn, s1.name, s1.node_data()) # Verify the updated value is correct in S1 content = self._get_metadata_content(s1.metadata_get()) self.assertEqual('s2-ip=10.0.0.2', content) # Verify outgoing calls mock_get.assert_has_calls([ mock.call('PublicIp'), mock.call('PublicIp')]) self.assertEqual(2, mock_handle.call_count) self.assertEqual(2, mock_check.call_count)
def create_volume(self, t, stack, resource_name): rsrc = self.get_volume(t, stack, resource_name) if isinstance(rsrc, os_vol.CinderVolume): self.patchobject(rsrc, '_store_config_default_properties') self.assertIsNone(rsrc.validate()) scheduler.TaskRunner(rsrc.create)() self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) stk_defn.update_resource_data(stack.defn, resource_name, rsrc.node_data()) return rsrc
def create_user(self, t, stack, resource_name, project_id='stackproject', user_id='dummy_user', password=None): self.patchobject(user.User, 'keystone', return_value=self.fc) rsrc = stack[resource_name] self.assertIsNone(rsrc.validate()) scheduler.TaskRunner(rsrc.create)() self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) stk_defn.update_resource_data(stack.defn, resource_name, rsrc.node_data()) return rsrc
def _update_resource_data(self, resource): # Use the *new* template to determine the attrs to cache node_data = resource.node_data(self.new_stack.defn) stk_defn.update_resource_data(self.existing_stack.defn, resource.name, node_data) # Also update the new stack's definition with the data, so that # following resources can calculate dep_attr values correctly (e.g. if # the actual attribute name in a get_attr function also comes from a # get_attr function.) stk_defn.update_resource_data(self.new_stack.defn, resource.name, node_data)
def test_resource_no_attribute_with_overwritten_fn_get_att(self): res_defn = rsrc_defn.ResourceDefinition('test_rsrc', 'OS::Test::FakeResource') self.rsrc = resource.Resource('test_rsrc', res_defn, self.stack) self.rsrc.attributes_schema = {} self.stack.add_resource(self.rsrc) stk_defn.update_resource_data(self.stack.defn, self.rsrc.name, self.rsrc.node_data()) self.stack.validate() func = functions.GetAtt(self.stack.defn, 'Fn::GetAtt', [self.rsrc.name, 'Foo']) self.assertIsNone(func.validate())
def create_attachment(self, t, stack, resource_name): if self.use_cinder: Attachment = os_vol.CinderVolumeAttachment else: Attachment = aws_vol.VolumeAttachment rsrc = Attachment(resource_name, stack.defn.resource_definition(resource_name), stack) self.assertIsNone(rsrc.validate()) scheduler.TaskRunner(rsrc.create)() self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) stk_defn.update_resource_data(stack.defn, resource_name, rsrc.node_data()) return rsrc
def create_user(self, t, stack, resource_name, project_id='stackproject', user_id='dummy_user', password=None): self.m.StubOutWithMock(user.User, 'keystone') user.User.keystone().MultipleTimes().AndReturn(self.fc) self.m.ReplayAll() rsrc = stack[resource_name] self.assertIsNone(rsrc.validate()) scheduler.TaskRunner(rsrc.create)() self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) stk_defn.update_resource_data(stack.defn, resource_name, rsrc.node_data()) return rsrc
def test_update_association_with_AllocationId_or_EIP(self): self._mock_server(mock_interface=True) self.mock_create_floatingip() self.mock_list_instance_ports('WebServer') self.mock_show_network() self.mock_no_router_for_vpc() self.mock_list_floatingips() self.mock_update_floatingip() self.mock_list_floatingips() self.mock_update_floatingip(delete_assc=True) self.mock_update_floatingip( port_id='a000228d-b40b-4124-8394-a4082ae1b76c', with_address=False) self.mock_list_floatingips(ip_addr='11.0.0.2') self.mock_update_floatingip(delete_assc=True, with_address=False) self.mock_update_floatingip() self.m.ReplayAll() t = template_format.parse(eip_template_ipassoc) stack = utils.parse_stack(t) self.create_eip(t, stack, 'IPAddress') ass = self.create_association(t, stack, 'IPAssoc') self.assertEqual('11.0.0.1', ass.properties['EIP']) # change EIP to AllocationId props = copy.deepcopy(ass.properties.data) update_allocationId = 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' props['AllocationId'] = update_allocationId props.pop('EIP') update_snippet = rsrc_defn.ResourceDefinition(ass.name, ass.type(), stack.t.parse(stack.defn, props)) scheduler.TaskRunner(ass.update, update_snippet)() self.assertEqual((ass.UPDATE, ass.COMPLETE), ass.state) stk_defn.update_resource_data(stack.defn, ass.name, ass.node_data()) # change AllocationId to EIP props = copy.deepcopy(ass.properties.data) update_eip = '11.0.0.2' props['EIP'] = update_eip props.pop('AllocationId') update_snippet = rsrc_defn.ResourceDefinition(ass.name, ass.type(), stack.t.parse(stack.defn, props)) scheduler.TaskRunner(ass.update, update_snippet)() self.assertEqual((ass.UPDATE, ass.COMPLETE), ass.state) self.m.VerifyAll()
def test_resource_no_attribute_with_default_fn_get_att(self): res_defn = rsrc_defn.ResourceDefinition('test_rsrc', 'ResWithStringPropAndAttr') self.rsrc = resource.Resource('test_rsrc', res_defn, self.stack) self.stack.add_resource(self.rsrc) stk_defn.update_resource_data(self.stack.defn, self.rsrc.name, self.rsrc.node_data()) self.stack.validate() func = functions.GetAtt(self.stack.defn, 'Fn::GetAtt', [self.rsrc.name, 'Bar']) ex = self.assertRaises(exception.InvalidTemplateAttribute, func.validate) self.assertEqual('The Referenced Attribute (test_rsrc Bar) ' 'is incorrect.', six.text_type(ex))
def test_resource_no_attribute_with_default_fn_get_att(self): res_defn = rsrc_defn.ResourceDefinition('test_rsrc', 'ResWithStringPropAndAttr') self.rsrc = resource.Resource('test_rsrc', res_defn, self.stack) self.stack.add_resource(self.rsrc) stk_defn.update_resource_data(self.stack.defn, self.rsrc.name, self.rsrc.node_data()) self.stack.validate() func = functions.GetAtt(self.stack.defn, 'Fn::GetAtt', [self.rsrc.name, 'Bar']) ex = self.assertRaises(exception.InvalidTemplateAttribute, func.validate) self.assertEqual('The Referenced Attribute (test_rsrc Bar) ' 'is incorrect.', str(ex))
def test_update_association_with_AllocationId_or_EIP(self): server = self.fc.servers.list()[0] self._mock_server_get(mock_server=server, multiple=True) self.mock_create_floatingip() self.mock_list_instance_ports('WebServer') self.mock_show_network() self.mock_no_router_for_vpc() self.mock_update_floatingip( port='a000228d-b40b-4124-8394-a4082ae1b76c') self.mock_update_floatingip(port=None) self.m.ReplayAll() t = template_format.parse(eip_template_ipassoc) stack = utils.parse_stack(t) self.create_eip(t, stack, 'IPAddress') ass = self.create_association(t, stack, 'IPAssoc') self.assertEqual('11.0.0.1', ass.properties['EIP']) # change EIP to AllocationId props = copy.deepcopy(ass.properties.data) update_allocationId = 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' props['AllocationId'] = update_allocationId props.pop('EIP') update_snippet = rsrc_defn.ResourceDefinition(ass.name, ass.type(), stack.t.parse(stack.defn, props)) scheduler.TaskRunner(ass.update, update_snippet)() self.assertEqual((ass.UPDATE, ass.COMPLETE), ass.state) stk_defn.update_resource_data(stack.defn, ass.name, ass.node_data()) # change AllocationId to EIP props = copy.deepcopy(ass.properties.data) update_eip = '11.0.0.2' props['EIP'] = update_eip props.pop('AllocationId') update_snippet = rsrc_defn.ResourceDefinition(ass.name, ass.type(), stack.t.parse(stack.defn, props)) scheduler.TaskRunner(ass.update, update_snippet)() self.assertEqual((ass.UPDATE, ass.COMPLETE), ass.state) self.m.VerifyAll()
def test_FnGetAtt_metadata_update(self, mock_get, mock_check, mock_handle, *args): temp = template_format.parse(TEST_TEMPLATE_SERVER) template = tmpl.Template(temp, env=environment.Environment({})) ctx = utils.dummy_context() stack = stk.Stack(ctx, 'test-stack', template, disable_rollback=True) stack.store() self.stub_KeypairConstraint_validate() # Note dummy addresses are from TEST-NET-1 ref rfc5737 mock_get.side_effect = ['192.0.2.1', '192.0.2.2'] # Test stack.create() self.assertEqual((stack.CREATE, stack.COMPLETE), stack.state) s1 = stack['instance1'] s2 = stack['instance2'] md = s1.metadata_get() self.assertEqual({u'template_data': '192.0.2.1'}, md) # Now set some metadata via the resource, like is done by # _populate_deployments_metadata. This should be persisted over # calls to metadata_update() new_md = {u'template_data': '192.0.2.2', 'set_by_rsrc': 'orange'} s1.metadata_set(new_md) md = s1.metadata_get(refresh=True) self.assertEqual(new_md, md) s2.attributes.reset_resolved_values() stk_defn.update_resource_data(stack.defn, s2.name, s2.node_data()) s1.metadata_update() md = s1.metadata_get(refresh=True) self.assertEqual(new_md, md) # Verify outgoing calls mock_get.assert_has_calls([ mock.call('networks'), mock.call('networks')]) self.assertEqual(2, mock_handle.call_count) self.assertEqual(2, mock_check.call_count)
def test_update_association_with_AllocationId_or_EIP(self): server = self.fc.servers.list()[0] self.patchobject(self.fc.servers, 'get', return_value=server) iface = self.mock_interface('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '1.2.3.4') self.patchobject(server, 'interface_list', return_value=[iface]) self.mock_create_floatingip() self.mock_list_floatingips() self.mock_list_instance_ports() self.mock_show_network() self.mock_no_router_for_vpc() t = template_format.parse(eip_template_ipassoc) stack = utils.parse_stack(t) self.create_eip(t, stack, 'IPAddress') ass = self.create_association(t, stack, 'IPAssoc') self.assertEqual('11.0.0.1', ass.properties['EIP']) # change EIP to AllocationId props = copy.deepcopy(ass.properties.data) update_allocationId = 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' props['AllocationId'] = update_allocationId props.pop('EIP') update_snippet = rsrc_defn.ResourceDefinition(ass.name, ass.type(), stack.t.parse(stack.defn, props)) scheduler.TaskRunner(ass.update, update_snippet)() self.assertEqual((ass.UPDATE, ass.COMPLETE), ass.state) stk_defn.update_resource_data(stack.defn, ass.name, ass.node_data()) # change AllocationId to EIP props = copy.deepcopy(ass.properties.data) update_eip = '11.0.0.2' props['EIP'] = update_eip props.pop('AllocationId') update_snippet = rsrc_defn.ResourceDefinition(ass.name, ass.type(), stack.t.parse(stack.defn, props)) scheduler.TaskRunner(ass.update, update_snippet)() self.assertEqual((ass.UPDATE, ass.COMPLETE), ass.state)
def _process_new_resource_update(self, new_res): res_name = new_res.name if res_name in self.existing_stack: existing_res = self.existing_stack[res_name] is_substituted = existing_res.check_is_substituted(type(new_res)) if type(existing_res) is type(new_res) or is_substituted: try: yield self._update_in_place(existing_res, new_res, is_substituted) except resource.UpdateReplace: pass else: # Save updated resource definition to backup stack # cause it allows the backup stack resources to be # synchronized LOG.debug("Storing definition of updated Resource %s", res_name) self.previous_stack.t.add_resource(new_res.t) self.previous_stack.t.store(self.previous_stack.context) LOG.info( "Resource %(res_name)s for stack " "%(stack_name)s updated", { 'res_name': res_name, 'stack_name': self.existing_stack.name }) stk_defn.update_resource_data(self.existing_stack.defn, res_name, existing_res.node_data()) return else: self._check_replace_restricted(new_res) yield self._create_resource(new_res) node_data = self.existing_stack[res_name].node_data() stk_defn.update_resource_data(self.existing_stack.defn, res_name, node_data)
def test_create_one_subport(self): t = template_format.parse(create_template) del t['resources']['trunk']['properties']['sub_ports'][1:] del t['resources']['subport_2'] stack = utils.parse_stack(t) parent_port = stack['parent_port'] self.patchobject(parent_port, 'get_reference_id', return_value='parent port id') stk_defn.update_resource_data(stack.defn, parent_port.name, parent_port.node_data()) subport_1 = stack['subport_1'] self.patchobject(subport_1, 'get_reference_id', return_value='subport id') stk_defn.update_resource_data(stack.defn, subport_1.name, subport_1.node_data()) self._create_trunk(stack) self.create_trunk_mock.assert_called_once_with({ 'trunk': { 'description': 'trunk description', 'name': 'trunk name', 'port_id': 'parent port id', 'sub_ports': [ { 'port_id': 'subport id', 'segmentation_type': 'vlan', 'segmentation_id': 101 }, ], } })
def _process_new_resource_update(self, new_res): res_name = new_res.name if res_name in self.existing_stack: existing_res = self.existing_stack[res_name] is_substituted = existing_res.check_is_substituted(type(new_res)) if type(existing_res) is type(new_res) or is_substituted: try: yield self._update_in_place(existing_res, new_res, is_substituted) except resource.UpdateReplace: pass else: # Save updated resource definition to backup stack # cause it allows the backup stack resources to be # synchronized LOG.debug("Storing definition of updated Resource %s", res_name) self.previous_stack.t.add_resource(new_res.t) self.previous_stack.t.store(self.previous_stack.context) LOG.info("Resource %(res_name)s for stack " "%(stack_name)s updated", {'res_name': res_name, 'stack_name': self.existing_stack.name}) stk_defn.update_resource_data(self.existing_stack.defn, res_name, existing_res.node_data()) return else: self._check_replace_restricted(new_res) yield self._create_resource(new_res) node_data = self.existing_stack[res_name].node_data() stk_defn.update_resource_data(self.existing_stack.defn, res_name, node_data)
def test_floatip_port(self): t = template_format.parse(neutron_floating_no_assoc_template) t['resources']['port_floating']['properties']['network'] = "xyz1234" t['resources']['port_floating']['properties']['fixed_ips'][0][ 'subnet'] = "sub1234" t['resources']['router_interface']['properties']['subnet'] = "sub1234" stack = utils.parse_stack(t) self.mockclient.create_port.return_value = { 'port': { "status": "BUILD", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } } self.mockclient.show_port.side_effect = [ { 'port': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } }, # delete qe.PortNotFoundClient(status_code=404), ] self.mockclient.create_floatingip.return_value = { 'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } } self.mockclient.update_floatingip.return_value = { 'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } } self.mockclient.delete_floatingip.return_value = None self.mockclient.delete_port.return_value = None self.mockclient.show_floatingip.side_effect = (qe.PortNotFoundClient( status_code=404)) self.stub_PortConstraint_validate() # check dependencies for fip resource required_by = set( stack.dependencies.required_by(stack['router_interface'])) self.assertIn(stack['floating_ip'], required_by) p = stack['port_floating'] scheduler.TaskRunner(p.create)() self.assertEqual((p.CREATE, p.COMPLETE), p.state) stk_defn.update_resource_data(stack.defn, p.name, p.node_data()) fip = stack['floating_ip'] scheduler.TaskRunner(fip.create)() self.assertEqual((fip.CREATE, fip.COMPLETE), fip.state) stk_defn.update_resource_data(stack.defn, fip.name, fip.node_data()) # test update FloatingIp with port_id props = copy.deepcopy(fip.properties.data) update_port_id = '2146dfbf-ba77-4083-8e86-d052f671ece5' props['port_id'] = update_port_id update_snippet = rsrc_defn.ResourceDefinition( fip.name, fip.type(), stack.t.parse(stack.defn, props)) scheduler.TaskRunner(fip.update, update_snippet)() self.assertEqual((fip.UPDATE, fip.COMPLETE), fip.state) stk_defn.update_resource_data(stack.defn, fip.name, fip.node_data()) # test update FloatingIp with None port_id props = copy.deepcopy(fip.properties.data) del (props['port_id']) update_snippet = rsrc_defn.ResourceDefinition( fip.name, fip.type(), stack.t.parse(stack.defn, props)) scheduler.TaskRunner(fip.update, update_snippet)() self.assertEqual((fip.UPDATE, fip.COMPLETE), fip.state) scheduler.TaskRunner(fip.delete)() scheduler.TaskRunner(p.delete)() self.mockclient.create_port.assert_called_once_with({ 'port': { 'network_id': u'xyz1234', 'fixed_ips': [{ 'subnet_id': u'sub1234', 'ip_address': u'10.0.0.10' }], 'name': utils.PhysName(stack.name, 'port_floating'), 'admin_state_up': True, 'binding:vnic_type': 'normal', 'device_owner': '', 'device_id': '' } }) self.mockclient.show_port.assert_called_with( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766') self.mockclient.create_floatingip.assert_called_once_with({ 'floatingip': { 'floating_network_id': u'abcd1234', 'port_id': u'fc68ea2c-b60b-4b4f-bd82-94ec81110766' } }) self.mockclient.update_floatingip.assert_has_calls([ # update with new port_id mock.call( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', { 'floatingip': { 'port_id': u'2146dfbf-ba77-4083-8e86-d052f671ece5', 'fixed_ip_address': None } }), # update with None port_id mock.call( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', {'floatingip': { 'port_id': None, 'fixed_ip_address': None }}) ]) self.mockclient.delete_floatingip.assert_called_once_with( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766') self.mockclient.show_floatingip.assert_called_once_with( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766') self.mockclient.delete_port.assert_called_once_with( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766')
def test_floatip_port(self): t = template_format.parse(neutron_floating_no_assoc_template) t['resources']['port_floating']['properties']['network'] = "xyz1234" t['resources']['port_floating']['properties']['fixed_ips'][0][ 'subnet'] = "sub1234" t['resources']['router_interface']['properties']['subnet'] = "sub1234" stack = utils.parse_stack(t) neutronV20.find_resourceid_by_name_or_id( mox.IsA(neutronclient.Client), 'network', 'xyz1234', cmd_resource=None, ).MultipleTimes().AndReturn('xyz1234') neutronV20.find_resourceid_by_name_or_id( mox.IsA(neutronclient.Client), 'subnet', 'sub1234', cmd_resource=None, ).MultipleTimes().AndReturn('sub1234') neutronclient.Client.create_port({ 'port': { 'network_id': u'xyz1234', 'fixed_ips': [{ 'subnet_id': u'sub1234', 'ip_address': u'10.0.0.10' }], 'name': utils.PhysName(stack.name, 'port_floating'), 'admin_state_up': True } }).AndReturn({ 'port': { "status": "BUILD", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } }) neutronclient.Client.show_port( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766').AndReturn({ 'port': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } }) neutronV20.find_resourceid_by_name_or_id( mox.IsA(neutronclient.Client), 'network', 'abcd1234', cmd_resource=None, ).MultipleTimes().AndReturn('abcd1234') neutronclient.Client.create_floatingip({ 'floatingip': { 'floating_network_id': u'abcd1234', 'port_id': u'fc68ea2c-b60b-4b4f-bd82-94ec81110766' } }).AndReturn({ 'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } }) # update with new port_id neutronclient.Client.update_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', { 'floatingip': { 'port_id': u'2146dfbf-ba77-4083-8e86-d052f671ece5', 'fixed_ip_address': None } }).AndReturn({ 'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } }) # update with None port_id neutronclient.Client.update_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', { 'floatingip': { 'port_id': None, 'fixed_ip_address': None } }).AndReturn({ 'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } }) neutronclient.Client.delete_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766').AndReturn(None) neutronclient.Client.show_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766').AndRaise( qe.NeutronClientException(status_code=404)) neutronclient.Client.delete_port( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766').AndReturn(None) neutronclient.Client.show_port( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766').AndRaise( qe.PortNotFoundClient(status_code=404)) self.stub_PortConstraint_validate() self.m.ReplayAll() # check dependencies for fip resource required_by = set( stack.dependencies.required_by(stack['router_interface'])) self.assertIn(stack['floating_ip'], required_by) p = stack['port_floating'] scheduler.TaskRunner(p.create)() self.assertEqual((p.CREATE, p.COMPLETE), p.state) stk_defn.update_resource_data(stack.defn, p.name, p.node_data()) fip = stack['floating_ip'] scheduler.TaskRunner(fip.create)() self.assertEqual((fip.CREATE, fip.COMPLETE), fip.state) stk_defn.update_resource_data(stack.defn, fip.name, fip.node_data()) # test update FloatingIp with port_id props = copy.deepcopy(fip.properties.data) update_port_id = '2146dfbf-ba77-4083-8e86-d052f671ece5' props['port_id'] = update_port_id update_snippet = rsrc_defn.ResourceDefinition( fip.name, fip.type(), stack.t.parse(stack.defn, props)) scheduler.TaskRunner(fip.update, update_snippet)() self.assertEqual((fip.UPDATE, fip.COMPLETE), fip.state) stk_defn.update_resource_data(stack.defn, fip.name, fip.node_data()) # test update FloatingIp with None port_id props = copy.deepcopy(fip.properties.data) del (props['port_id']) update_snippet = rsrc_defn.ResourceDefinition( fip.name, fip.type(), stack.t.parse(stack.defn, props)) scheduler.TaskRunner(fip.update, update_snippet)() self.assertEqual((fip.UPDATE, fip.COMPLETE), fip.state) scheduler.TaskRunner(fip.delete)() scheduler.TaskRunner(p.delete)() self.m.VerifyAll()
def test_floatip_association_port(self): t = template_format.parse(neutron_floating_template) stack = utils.parse_stack(t) neutronV20.find_resourceid_by_name_or_id( mox.IsA(neutronclient.Client), 'network', 'abcd1234', cmd_resource=None, ).MultipleTimes().AndReturn('abcd1234') neutronV20.find_resourceid_by_name_or_id( mox.IsA(neutronclient.Client), 'subnet', 'sub1234', cmd_resource=None, ).MultipleTimes().AndReturn('sub1234') neutronclient.Client.create_floatingip({ 'floatingip': { 'floating_network_id': u'abcd1234' } }).AndReturn({ 'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } }) neutronclient.Client.create_port({ 'port': { 'network_id': u'abcd1234', 'fixed_ips': [{ 'subnet_id': u'sub1234', 'ip_address': u'10.0.0.10' }], 'name': utils.PhysName(stack.name, 'port_floating'), 'admin_state_up': True } }).AndReturn({ 'port': { "status": "BUILD", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } }) neutronclient.Client.show_port( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766').AndReturn({ 'port': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } }) # create as neutronclient.Client.update_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', { 'floatingip': { 'port_id': u'fc68ea2c-b60b-4b4f-bd82-94ec81110766' } }).AndReturn({ 'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } }) # update as with port_id neutronclient.Client.update_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', { 'floatingip': { 'port_id': u'2146dfbf-ba77-4083-8e86-d052f671ece5', 'fixed_ip_address': None } }).AndReturn({ 'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } }) # update as with floatingip_id neutronclient.Client.update_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', { 'floatingip': { 'port_id': None } }).AndReturn(None) neutronclient.Client.update_floatingip( '2146dfbf-ba77-4083-8e86-d052f671ece5', { 'floatingip': { 'port_id': u'2146dfbf-ba77-4083-8e86-d052f671ece5', 'fixed_ip_address': None } }).AndReturn({ 'floatingip': { "status": "ACTIVE", "id": "2146dfbf-ba77-4083-8e86-d052f671ece5" } }) # update as with both neutronclient.Client.update_floatingip( '2146dfbf-ba77-4083-8e86-d052f671ece5', { 'floatingip': { 'port_id': None } }).AndReturn(None) neutronclient.Client.update_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', { 'floatingip': { 'port_id': u'ade6fcac-7d47-416e-a3d7-ad12efe445c1', 'fixed_ip_address': None } }).AndReturn({ 'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } }) # delete as neutronclient.Client.update_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', { 'floatingip': { 'port_id': None } }).AndReturn(None) neutronclient.Client.delete_port( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766').AndReturn(None) neutronclient.Client.show_port( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766').AndRaise( qe.PortNotFoundClient(status_code=404)) neutronclient.Client.delete_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766').AndReturn(None) neutronclient.Client.show_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766').AndRaise( qe.NeutronClientException(status_code=404)) neutronclient.Client.delete_port( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766').AndRaise( qe.PortNotFoundClient(status_code=404)) neutronclient.Client.delete_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766').AndRaise( qe.NeutronClientException(status_code=404)) self.stub_PortConstraint_validate() self.m.ReplayAll() fip = stack['floating_ip'] scheduler.TaskRunner(fip.create)() self.assertEqual((fip.CREATE, fip.COMPLETE), fip.state) stk_defn.update_resource_data(stack.defn, fip.name, fip.node_data()) p = stack['port_floating'] scheduler.TaskRunner(p.create)() self.assertEqual((p.CREATE, p.COMPLETE), p.state) stk_defn.update_resource_data(stack.defn, p.name, p.node_data()) fipa = stack['floating_ip_assoc'] scheduler.TaskRunner(fipa.create)() self.assertEqual((fipa.CREATE, fipa.COMPLETE), fipa.state) stk_defn.update_resource_data(stack.defn, fipa.name, fipa.node_data()) self.assertIsNotNone(fipa.id) self.assertEqual(fipa.id, fipa.resource_id) fipa.validate() # test update FloatingIpAssociation with port_id props = copy.deepcopy(fipa.properties.data) update_port_id = '2146dfbf-ba77-4083-8e86-d052f671ece5' props['port_id'] = update_port_id update_snippet = rsrc_defn.ResourceDefinition( fipa.name, fipa.type(), stack.t.parse(stack.defn, props)) scheduler.TaskRunner(fipa.update, update_snippet)() self.assertEqual((fipa.UPDATE, fipa.COMPLETE), fipa.state) # test update FloatingIpAssociation with floatingip_id props = copy.deepcopy(fipa.properties.data) update_flip_id = '2146dfbf-ba77-4083-8e86-d052f671ece5' props['floatingip_id'] = update_flip_id update_snippet = rsrc_defn.ResourceDefinition(fipa.name, fipa.type(), props) scheduler.TaskRunner(fipa.update, update_snippet)() self.assertEqual((fipa.UPDATE, fipa.COMPLETE), fipa.state) # test update FloatingIpAssociation with port_id and floatingip_id props = copy.deepcopy(fipa.properties.data) update_flip_id = 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' update_port_id = 'ade6fcac-7d47-416e-a3d7-ad12efe445c1' props['floatingip_id'] = update_flip_id props['port_id'] = update_port_id update_snippet = rsrc_defn.ResourceDefinition(fipa.name, fipa.type(), props) scheduler.TaskRunner(fipa.update, update_snippet)() self.assertEqual((fipa.UPDATE, fipa.COMPLETE), fipa.state) scheduler.TaskRunner(fipa.delete)() scheduler.TaskRunner(p.delete)() scheduler.TaskRunner(fip.delete)() fip.state_set(fip.CREATE, fip.COMPLETE, 'to delete again') p.state_set(p.CREATE, p.COMPLETE, 'to delete again') self.assertIsNone(scheduler.TaskRunner(p.delete)()) scheduler.TaskRunner(fip.delete)() self.m.VerifyAll()
def test_floatip_association_port(self): t = template_format.parse(neutron_floating_template) stack = utils.parse_stack(t) self.mockclient.create_floatingip.return_value = { 'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } } self.mockclient.create_port.return_value = { 'port': { "status": "BUILD", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } } self.mockclient.show_port.side_effect = [ { 'port': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } }, # delete qe.PortNotFoundClient(status_code=404), ] self.mockclient.update_floatingip.side_effect = [ # create as { 'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } }, # update as with port_id { 'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } }, # update as with floatingip_id None, { 'floatingip': { "status": "ACTIVE", "id": "2146dfbf-ba77-4083-8e86-d052f671ece5" } }, # update as with both None, { 'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" } }, # delete as None, ] self.mockclient.delete_port.side_effect = [ None, qe.PortNotFoundClient(status_code=404), ] self.mockclient.delete_floatingip.side_effect = [ None, qe.PortNotFoundClient(status_code=404), ] self.mockclient.show_floatingip.side_effect = ( qe.NeutronClientException(status_code=404)) self.stub_PortConstraint_validate() fip = stack['floating_ip'] scheduler.TaskRunner(fip.create)() self.assertEqual((fip.CREATE, fip.COMPLETE), fip.state) stk_defn.update_resource_data(stack.defn, fip.name, fip.node_data()) p = stack['port_floating'] scheduler.TaskRunner(p.create)() self.assertEqual((p.CREATE, p.COMPLETE), p.state) stk_defn.update_resource_data(stack.defn, p.name, p.node_data()) fipa = stack['floating_ip_assoc'] scheduler.TaskRunner(fipa.create)() self.assertEqual((fipa.CREATE, fipa.COMPLETE), fipa.state) stk_defn.update_resource_data(stack.defn, fipa.name, fipa.node_data()) self.assertIsNotNone(fipa.id) self.assertEqual(fipa.id, fipa.resource_id) fipa.validate() # test update FloatingIpAssociation with port_id props = copy.deepcopy(fipa.properties.data) update_port_id = '2146dfbf-ba77-4083-8e86-d052f671ece5' props['port_id'] = update_port_id update_snippet = rsrc_defn.ResourceDefinition( fipa.name, fipa.type(), stack.t.parse(stack.defn, props)) scheduler.TaskRunner(fipa.update, update_snippet)() self.assertEqual((fipa.UPDATE, fipa.COMPLETE), fipa.state) # test update FloatingIpAssociation with floatingip_id props = copy.deepcopy(fipa.properties.data) update_flip_id = '2146dfbf-ba77-4083-8e86-d052f671ece5' props['floatingip_id'] = update_flip_id update_snippet = rsrc_defn.ResourceDefinition(fipa.name, fipa.type(), props) scheduler.TaskRunner(fipa.update, update_snippet)() self.assertEqual((fipa.UPDATE, fipa.COMPLETE), fipa.state) # test update FloatingIpAssociation with port_id and floatingip_id props = copy.deepcopy(fipa.properties.data) update_flip_id = 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' update_port_id = 'ade6fcac-7d47-416e-a3d7-ad12efe445c1' props['floatingip_id'] = update_flip_id props['port_id'] = update_port_id update_snippet = rsrc_defn.ResourceDefinition(fipa.name, fipa.type(), props) scheduler.TaskRunner(fipa.update, update_snippet)() self.assertEqual((fipa.UPDATE, fipa.COMPLETE), fipa.state) scheduler.TaskRunner(fipa.delete)() scheduler.TaskRunner(p.delete)() scheduler.TaskRunner(fip.delete)() fip.state_set(fip.CREATE, fip.COMPLETE, 'to delete again') p.state_set(p.CREATE, p.COMPLETE, 'to delete again') self.assertIsNone(scheduler.TaskRunner(p.delete)()) scheduler.TaskRunner(fip.delete)() self.mockclient.create_floatingip.assert_called_once_with( {'floatingip': { 'floating_network_id': u'abcd1234' }}) self.mockclient.create_port.assert_called_once_with({ 'port': { 'network_id': u'abcd1234', 'fixed_ips': [{ 'subnet_id': u'sub1234', 'ip_address': u'10.0.0.10' }], 'name': utils.PhysName(stack.name, 'port_floating'), 'admin_state_up': True, 'device_owner': '', 'device_id': '', 'binding:vnic_type': 'normal' } }) self.mockclient.show_port.assert_called_with( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766') self.mockclient.update_floatingip.assert_has_calls([ # create as mock.call('fc68ea2c-b60b-4b4f-bd82-94ec81110766', { 'floatingip': { 'port_id': u'fc68ea2c-b60b-4b4f-bd82-94ec81110766' } }), # update as with port_id mock.call( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', { 'floatingip': { 'port_id': u'2146dfbf-ba77-4083-8e86-d052f671ece5', 'fixed_ip_address': None } }), # update as with floatingip_id mock.call('fc68ea2c-b60b-4b4f-bd82-94ec81110766', {'floatingip': { 'port_id': None }}), mock.call( '2146dfbf-ba77-4083-8e86-d052f671ece5', { 'floatingip': { 'port_id': u'2146dfbf-ba77-4083-8e86-d052f671ece5', 'fixed_ip_address': None } }), # update as with both mock.call('2146dfbf-ba77-4083-8e86-d052f671ece5', {'floatingip': { 'port_id': None }}), mock.call( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', { 'floatingip': { 'port_id': u'ade6fcac-7d47-416e-a3d7-ad12efe445c1', 'fixed_ip_address': None } }), # delete as mock.call('fc68ea2c-b60b-4b4f-bd82-94ec81110766', {'floatingip': { 'port_id': None }}) ]) self.mockclient.delete_port.assert_called_with( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766') self.mockclient.delete_floatingip.assert_called_with( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766') self.mockclient.show_floatingip.assert_called_with( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766')
def test_floatip_association_port(self): t = template_format.parse(neutron_floating_template) stack = utils.parse_stack(t) neutronV20.find_resourceid_by_name_or_id( mox.IsA(neutronclient.Client), 'network', 'abcd1234', cmd_resource=None, ).MultipleTimes().AndReturn('abcd1234') neutronV20.find_resourceid_by_name_or_id( mox.IsA(neutronclient.Client), 'subnet', 'sub1234', cmd_resource=None, ).MultipleTimes().AndReturn('sub1234') neutronclient.Client.create_floatingip({ 'floatingip': {'floating_network_id': u'abcd1234'} }).AndReturn({'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" }}) neutronclient.Client.create_port({'port': { 'network_id': u'abcd1234', 'fixed_ips': [ {'subnet_id': u'sub1234', 'ip_address': u'10.0.0.10'} ], 'name': utils.PhysName(stack.name, 'port_floating'), 'admin_state_up': True, 'device_owner': '', 'device_id': '', 'binding:vnic_type': 'normal' }} ).AndReturn({'port': { "status": "BUILD", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" }}) neutronclient.Client.show_port( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' ).AndReturn({'port': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" }}) # create as neutronclient.Client.update_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', { 'floatingip': { 'port_id': u'fc68ea2c-b60b-4b4f-bd82-94ec81110766'}} ).AndReturn({'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" }}) # update as with port_id neutronclient.Client.update_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', { 'floatingip': { 'port_id': u'2146dfbf-ba77-4083-8e86-d052f671ece5', 'fixed_ip_address': None}} ).AndReturn({'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" }}) # update as with floatingip_id neutronclient.Client.update_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', {'floatingip': { 'port_id': None }}).AndReturn(None) neutronclient.Client.update_floatingip( '2146dfbf-ba77-4083-8e86-d052f671ece5', { 'floatingip': { 'port_id': u'2146dfbf-ba77-4083-8e86-d052f671ece5', 'fixed_ip_address': None}} ).AndReturn({'floatingip': { "status": "ACTIVE", "id": "2146dfbf-ba77-4083-8e86-d052f671ece5" }}) # update as with both neutronclient.Client.update_floatingip( '2146dfbf-ba77-4083-8e86-d052f671ece5', {'floatingip': { 'port_id': None }}).AndReturn(None) neutronclient.Client.update_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', { 'floatingip': { 'port_id': u'ade6fcac-7d47-416e-a3d7-ad12efe445c1', 'fixed_ip_address': None}} ).AndReturn({'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" }}) # delete as neutronclient.Client.update_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', {'floatingip': { 'port_id': None }}).AndReturn(None) neutronclient.Client.delete_port( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' ).AndReturn(None) neutronclient.Client.show_port( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' ).AndRaise(qe.PortNotFoundClient(status_code=404)) neutronclient.Client.delete_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' ).AndReturn(None) neutronclient.Client.show_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766').AndRaise( qe.NeutronClientException(status_code=404)) neutronclient.Client.delete_port( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' ).AndRaise(qe.PortNotFoundClient(status_code=404)) neutronclient.Client.delete_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' ).AndRaise(qe.NeutronClientException(status_code=404)) self.stub_PortConstraint_validate() self.m.ReplayAll() fip = stack['floating_ip'] scheduler.TaskRunner(fip.create)() self.assertEqual((fip.CREATE, fip.COMPLETE), fip.state) stk_defn.update_resource_data(stack.defn, fip.name, fip.node_data()) p = stack['port_floating'] scheduler.TaskRunner(p.create)() self.assertEqual((p.CREATE, p.COMPLETE), p.state) stk_defn.update_resource_data(stack.defn, p.name, p.node_data()) fipa = stack['floating_ip_assoc'] scheduler.TaskRunner(fipa.create)() self.assertEqual((fipa.CREATE, fipa.COMPLETE), fipa.state) stk_defn.update_resource_data(stack.defn, fipa.name, fipa.node_data()) self.assertIsNotNone(fipa.id) self.assertEqual(fipa.id, fipa.resource_id) fipa.validate() # test update FloatingIpAssociation with port_id props = copy.deepcopy(fipa.properties.data) update_port_id = '2146dfbf-ba77-4083-8e86-d052f671ece5' props['port_id'] = update_port_id update_snippet = rsrc_defn.ResourceDefinition(fipa.name, fipa.type(), stack.t.parse(stack.defn, props)) scheduler.TaskRunner(fipa.update, update_snippet)() self.assertEqual((fipa.UPDATE, fipa.COMPLETE), fipa.state) # test update FloatingIpAssociation with floatingip_id props = copy.deepcopy(fipa.properties.data) update_flip_id = '2146dfbf-ba77-4083-8e86-d052f671ece5' props['floatingip_id'] = update_flip_id update_snippet = rsrc_defn.ResourceDefinition(fipa.name, fipa.type(), props) scheduler.TaskRunner(fipa.update, update_snippet)() self.assertEqual((fipa.UPDATE, fipa.COMPLETE), fipa.state) # test update FloatingIpAssociation with port_id and floatingip_id props = copy.deepcopy(fipa.properties.data) update_flip_id = 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' update_port_id = 'ade6fcac-7d47-416e-a3d7-ad12efe445c1' props['floatingip_id'] = update_flip_id props['port_id'] = update_port_id update_snippet = rsrc_defn.ResourceDefinition(fipa.name, fipa.type(), props) scheduler.TaskRunner(fipa.update, update_snippet)() self.assertEqual((fipa.UPDATE, fipa.COMPLETE), fipa.state) scheduler.TaskRunner(fipa.delete)() scheduler.TaskRunner(p.delete)() scheduler.TaskRunner(fip.delete)() fip.state_set(fip.CREATE, fip.COMPLETE, 'to delete again') p.state_set(p.CREATE, p.COMPLETE, 'to delete again') self.assertIsNone(scheduler.TaskRunner(p.delete)()) scheduler.TaskRunner(fip.delete)() self.m.VerifyAll()
def test_floatip_port(self): t = template_format.parse(neutron_floating_no_assoc_template) t['resources']['port_floating']['properties']['network'] = "xyz1234" t['resources']['port_floating']['properties'][ 'fixed_ips'][0]['subnet'] = "sub1234" t['resources']['router_interface']['properties']['subnet'] = "sub1234" stack = utils.parse_stack(t) neutronV20.find_resourceid_by_name_or_id( mox.IsA(neutronclient.Client), 'network', 'xyz1234', cmd_resource=None, ).MultipleTimes().AndReturn('xyz1234') neutronV20.find_resourceid_by_name_or_id( mox.IsA(neutronclient.Client), 'subnet', 'sub1234', cmd_resource=None, ).MultipleTimes().AndReturn('sub1234') neutronclient.Client.create_port({'port': { 'network_id': u'xyz1234', 'fixed_ips': [ {'subnet_id': u'sub1234', 'ip_address': u'10.0.0.10'} ], 'name': utils.PhysName(stack.name, 'port_floating'), 'admin_state_up': True, 'binding:vnic_type': 'normal', 'device_owner': '', 'device_id': ''}} ).AndReturn({'port': { "status": "BUILD", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" }}) neutronclient.Client.show_port( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' ).AndReturn({'port': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" }}) neutronV20.find_resourceid_by_name_or_id( mox.IsA(neutronclient.Client), 'network', 'abcd1234', cmd_resource=None, ).MultipleTimes().AndReturn('abcd1234') neutronclient.Client.create_floatingip({ 'floatingip': { 'floating_network_id': u'abcd1234', 'port_id': u'fc68ea2c-b60b-4b4f-bd82-94ec81110766' } }).AndReturn({'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" }}) # update with new port_id neutronclient.Client.update_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', { 'floatingip': { 'port_id': u'2146dfbf-ba77-4083-8e86-d052f671ece5', 'fixed_ip_address': None}} ).AndReturn({'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" }}) # update with None port_id neutronclient.Client.update_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766', { 'floatingip': { 'port_id': None, 'fixed_ip_address': None}} ).AndReturn({'floatingip': { "status": "ACTIVE", "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766" }}) neutronclient.Client.delete_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' ).AndReturn(None) neutronclient.Client.show_floatingip( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766').AndRaise( qe.NeutronClientException(status_code=404)) neutronclient.Client.delete_port( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' ).AndReturn(None) neutronclient.Client.show_port( 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' ).AndRaise(qe.PortNotFoundClient(status_code=404)) self.stub_PortConstraint_validate() self.m.ReplayAll() # check dependencies for fip resource required_by = set(stack.dependencies.required_by( stack['router_interface'])) self.assertIn(stack['floating_ip'], required_by) p = stack['port_floating'] scheduler.TaskRunner(p.create)() self.assertEqual((p.CREATE, p.COMPLETE), p.state) stk_defn.update_resource_data(stack.defn, p.name, p.node_data()) fip = stack['floating_ip'] scheduler.TaskRunner(fip.create)() self.assertEqual((fip.CREATE, fip.COMPLETE), fip.state) stk_defn.update_resource_data(stack.defn, fip.name, fip.node_data()) # test update FloatingIp with port_id props = copy.deepcopy(fip.properties.data) update_port_id = '2146dfbf-ba77-4083-8e86-d052f671ece5' props['port_id'] = update_port_id update_snippet = rsrc_defn.ResourceDefinition(fip.name, fip.type(), stack.t.parse(stack.defn, props)) scheduler.TaskRunner(fip.update, update_snippet)() self.assertEqual((fip.UPDATE, fip.COMPLETE), fip.state) stk_defn.update_resource_data(stack.defn, fip.name, fip.node_data()) # test update FloatingIp with None port_id props = copy.deepcopy(fip.properties.data) del(props['port_id']) update_snippet = rsrc_defn.ResourceDefinition(fip.name, fip.type(), stack.t.parse(stack.defn, props)) scheduler.TaskRunner(fip.update, update_snippet)() self.assertEqual((fip.UPDATE, fip.COMPLETE), fip.state) scheduler.TaskRunner(fip.delete)() scheduler.TaskRunner(p.delete)() self.m.VerifyAll()