diff --git a/heat/engine/resources/openstack/keystone/endpoint.py b/heat/engine/resources/openstack/keystone/endpoint.py index 6a75c49a7c..4a77e75187 100644 --- a/heat/engine/resources/openstack/keystone/endpoint.py +++ b/heat/engine/resources/openstack/keystone/endpoint.py @@ -111,7 +111,10 @@ class KeystoneEndpoint(resource.Resource): service = prop_diff.get(self.SERVICE) interface = prop_diff.get(self.INTERFACE) url = prop_diff.get(self.SERVICE_URL) - name = prop_diff.get(self.NAME) or self.physical_resource_name() + name = None + # Don't update the name if no change + if self.NAME in prop_diff: + name = prop_diff[self.NAME] or self.physical_resource_name() enabled = prop_diff.get(self.ENABLED) self.client().endpoints.update( diff --git a/heat/engine/resources/openstack/keystone/group.py b/heat/engine/resources/openstack/keystone/group.py index 51a3dae588..c7d466dd98 100644 --- a/heat/engine/resources/openstack/keystone/group.py +++ b/heat/engine/resources/openstack/keystone/group.py @@ -91,7 +91,11 @@ class KeystoneGroup(resource.Resource, def handle_update(self, json_snippet, tmpl_diff, prop_diff): if prop_diff: - name = prop_diff.get(self.NAME) or self.physical_resource_name() + name = None + # Don't update the name if no change + if self.NAME in prop_diff: + name = prop_diff[self.NAME] or self.physical_resource_name() + description = prop_diff.get(self.DESCRIPTION) domain = (prop_diff.get(self.DOMAIN) or self._stored_properties_data.get(self.DOMAIN)) diff --git a/heat/engine/resources/openstack/keystone/project.py b/heat/engine/resources/openstack/keystone/project.py index 11c2c39617..20950981b0 100644 --- a/heat/engine/resources/openstack/keystone/project.py +++ b/heat/engine/resources/openstack/keystone/project.py @@ -100,7 +100,11 @@ class KeystoneProject(resource.Resource): def handle_update(self, json_snippet, tmpl_diff, prop_diff): if prop_diff: - name = prop_diff.get(self.NAME) or self.physical_resource_name() + name = None + # Don't update the name if no change + if self.NAME in prop_diff: + name = prop_diff[self.NAME] or self.physical_resource_name() + description = prop_diff.get(self.DESCRIPTION) enabled = prop_diff.get(self.ENABLED) domain = (prop_diff.get(self.DOMAIN) or diff --git a/heat/engine/resources/openstack/keystone/role.py b/heat/engine/resources/openstack/keystone/role.py index daeacc0e94..785783fc51 100644 --- a/heat/engine/resources/openstack/keystone/role.py +++ b/heat/engine/resources/openstack/keystone/role.py @@ -60,8 +60,10 @@ class KeystoneRole(resource.Resource): def handle_update(self, json_snippet, tmpl_diff, prop_diff): if prop_diff: - name = prop_diff.get(self.NAME) or self.physical_resource_name() - self.client().roles.update(role=self.resource_id, name=name) + # Don't update the name if no change + if self.NAME in prop_diff: + name = prop_diff[self.NAME] or self.physical_resource_name() + self.client().roles.update(role=self.resource_id, name=name) def resource_mapping(): diff --git a/heat/engine/resources/openstack/keystone/service.py b/heat/engine/resources/openstack/keystone/service.py index 399d1bd089..c0774c76fc 100644 --- a/heat/engine/resources/openstack/keystone/service.py +++ b/heat/engine/resources/openstack/keystone/service.py @@ -83,8 +83,10 @@ class KeystoneService(resource.Resource): def handle_update(self, json_snippet, tmpl_diff, prop_diff): if prop_diff: - name = (prop_diff.get(self.NAME) or - self.physical_resource_name()) + name = None + # Don't update the name if no change + if self.NAME in prop_diff: + name = prop_diff[self.NAME] or self.physical_resource_name() description = prop_diff.get(self.DESCRIPTION) type = prop_diff.get(self.TYPE) enabled = prop_diff.get(self.ENABLED) diff --git a/heat/tests/openstack/keystone/test_endpoint.py b/heat/tests/openstack/keystone/test_endpoint.py index b2b73e04a7..d147ca1e86 100644 --- a/heat/tests/openstack/keystone/test_endpoint.py +++ b/heat/tests/openstack/keystone/test_endpoint.py @@ -193,6 +193,26 @@ class KeystoneEndpointTest(common.HeatTestCase): enabled=None ) + def test_endpoint_handle_update_only_enabled(self): + rsrc = self._setup_endpoint_resource('test_endpoint_update_enabled') + rsrc.resource_id = '477e8273-60a7-4c41-b683-fdb0bc7cd151' + + prop_diff = {endpoint.KeystoneEndpoint.ENABLED: True} + + rsrc.handle_update(json_snippet=None, + tmpl_diff=None, + prop_diff=prop_diff) + + self.endpoints.update.assert_called_once_with( + endpoint=rsrc.resource_id, + region=None, + interface=None, + service=None, + url=None, + name=None, + enabled=prop_diff[endpoint.KeystoneEndpoint.ENABLED] + ) + def test_resource_mapping(self): rsrc = self._setup_endpoint_resource('test_resource_mapping') mapping = endpoint.resource_mapping() diff --git a/heat/tests/openstack/keystone/test_group.py b/heat/tests/openstack/keystone/test_group.py index ed4f334f36..4c8301a91c 100644 --- a/heat/tests/openstack/keystone/test_group.py +++ b/heat/tests/openstack/keystone/test_group.py @@ -269,8 +269,6 @@ class KeystoneGroupTest(common.HeatTestCase): def test_group_handle_update_default(self): self.test_group.resource_id = '477e8273-60a7-4c41-b683-fdb0bc7cd151' self.test_group._stored_properties_data = dict(domain='default') - self.test_group.physical_resource_name = mock.MagicMock() - self.test_group.physical_resource_name.return_value = 'foo' prop_diff = {group.KeystoneGroup.DESCRIPTION: 'Test Project updated'} @@ -282,7 +280,7 @@ class KeystoneGroupTest(common.HeatTestCase): # domain is set from stored properties used during creation. self.groups.update.assert_called_once_with( group=self.test_group.resource_id, - name='foo', + name=None, description=prop_diff[group.KeystoneGroup.DESCRIPTION], domain_id='default' ) diff --git a/heat/tests/openstack/keystone/test_project.py b/heat/tests/openstack/keystone/test_project.py index 93c343e4d3..92573a58e1 100644 --- a/heat/tests/openstack/keystone/test_project.py +++ b/heat/tests/openstack/keystone/test_project.py @@ -317,8 +317,6 @@ class KeystoneProjectTest(common.HeatTestCase): def test_project_handle_update_default(self): self.test_project.resource_id = '477e8273-60a7-4c41-b683-fdb0bc7cd151' self.test_project._stored_properties_data = dict(domain='default') - self.test_project.physical_resource_name = mock.MagicMock() - self.test_project.physical_resource_name.return_value = 'foo' prop_diff = {project.KeystoneProject.DESCRIPTION: 'Test Project updated', @@ -332,12 +330,29 @@ class KeystoneProjectTest(common.HeatTestCase): # domain is set from stored properties used during creation. self.projects.update.assert_called_once_with( project=self.test_project.resource_id, - name='foo', + name=None, description=prop_diff[project.KeystoneProject.DESCRIPTION], enabled=prop_diff[project.KeystoneProject.ENABLED], domain='default' ) + def test_project_handle_update_only_enabled(self): + self.test_project.resource_id = '477e8273-60a7-4c41-b683-fdb0bc7cd151' + self.test_project._stored_properties_data = dict(domain='default') + prop_diff = {project.KeystoneProject.ENABLED: False} + + self.test_project.handle_update(json_snippet=None, + tmpl_diff=None, + prop_diff=prop_diff) + + self.projects.update.assert_called_once_with( + project=self.test_project.resource_id, + name=None, + description=None, + enabled=prop_diff[project.KeystoneProject.ENABLED], + domain='default' + ) + def test_show_resource(self): project = mock.Mock() project.to_dict.return_value = {'attr': 'val'} diff --git a/heat/tests/openstack/keystone/test_service.py b/heat/tests/openstack/keystone/test_service.py index c98c047ab8..ec1837b1d4 100644 --- a/heat/tests/openstack/keystone/test_service.py +++ b/heat/tests/openstack/keystone/test_service.py @@ -178,6 +178,24 @@ class KeystoneServiceTest(common.HeatTestCase): enabled=None ) + def test_service_handle_update_only_enabled(self): + rsrc = self._setup_service_resource('test_update_enabled_only') + rsrc.resource_id = '477e8273-60a7-4c41-b683-fdb0bc7cd151' + + prop_diff = {service.KeystoneService.ENABLED: False} + + rsrc.handle_update(json_snippet=None, + tmpl_diff=None, + prop_diff=prop_diff) + + self.services.update.assert_called_once_with( + service=rsrc.resource_id, + name=None, + description=None, + type=None, + enabled=prop_diff[service.KeystoneService.ENABLED] + ) + def test_resource_mapping(self): rsrc = self._setup_service_resource( 'test_resource_mapping')