Exemple #1
0
 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())
Exemple #2
0
    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
Exemple #3
0
    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)
Exemple #4
0
    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 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())
Exemple #6
0
    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},
                ],
            }}
        )
Exemple #7
0
    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',
            }}
        )
Exemple #8
0
    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)
Exemple #9
0
    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)
Exemple #10
0
    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'))
Exemple #11
0
    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'))
Exemple #12
0
    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',
            }
        })
Exemple #13
0
 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
Exemple #14
0
 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 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)
Exemple #17
0
    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
Exemple #18
0
 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
Exemple #19
0
    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)
Exemple #20
0
    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)
Exemple #21
0
    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())
Exemple #22
0
 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
Exemple #23
0
    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())
Exemple #24
0
    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 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
Exemple #26
0
    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()
Exemple #27
0
    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))
Exemple #28
0
 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
Exemple #29
0
    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))
Exemple #30
0
    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
Exemple #31
0
    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_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)
Exemple #34
0
    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)
Exemple #35
0
    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)
Exemple #36
0
    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 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
Exemple #38
0
    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
                    },
                ],
            }
        })
Exemple #39
0
    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)
Exemple #40
0
    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()
Exemple #43
0
    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()