2
# Licensed under the Apache License, Version 2.0 (the "License"); you may
3
# not use this file except in compliance with the License. You may obtain
4
# a copy of the License at
6
# http://www.apache.org/licenses/LICENSE-2.0
8
# Unless required by applicable law or agreed to in writing, software
9
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
10
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
11
# License for the specific language governing permissions and limitations
14
from heat.common.i18n import _
15
from heat.engine import constraints
16
from heat.engine import properties
17
from heat.engine import resource
18
from heat.engine import support
21
class KeystoneProject(resource.Resource):
23
Heat Template Resource for Keystone Project.
25
heat_template_version: 2013-05-23
27
description: Sample Keystone Project template
32
description: Keystone project name
35
description: Keystone project description
38
description: Keystone project is enabled or disabled
41
description: Keystone project domain name or id
45
type: OS::Keystone::Project
47
name: {get_param: project_name}
48
domain: {get_param: project_domain}
49
description: {get_param: project_description}
50
enabled: {get_param: project_enabled}
54
support_status = support.SupportStatus(
56
message=_('Supported versions: keystone v3'))
59
NAME, DOMAIN, DESCRIPTION, ENABLED
61
'name', 'domain', 'description', 'enabled'
65
NAME: properties.Schema(
66
properties.Schema.STRING,
67
_('Name of keystone project.'),
70
DOMAIN: properties.Schema(
71
properties.Schema.STRING,
72
_('Name or id of keystone domain.'),
75
constraints=[constraints.CustomConstraint('keystone.domain')]
77
DESCRIPTION: properties.Schema(
78
properties.Schema.STRING,
79
_('Description of keystone project.'),
83
ENABLED: properties.Schema(
84
properties.Schema.BOOLEAN,
85
_('This project is enabled or disabled.'),
91
def _create_project(self,
96
domain = (self.client_plugin('keystone').
97
get_domain_id(domain))
99
return self.keystone().client.projects.create(
102
description=description,
105
def _delete_project(self, project_id):
106
return self.keystone().client.projects.delete(project_id)
108
def _update_project(self,
112
new_description=None,
116
if new_name is not None:
117
values['name'] = new_name
118
if new_description is not None:
119
values['description'] = new_description
120
if enabled is not None:
121
values['enabled'] = enabled
123
values['project'] = project_id
124
domain = (self.client_plugin('keystone').
125
get_domain_id(domain))
127
values['domain'] = domain
129
return self.keystone().client.projects.update(**values)
131
def handle_create(self):
132
project_name = (self.properties.get(self.NAME) or
133
self.physical_resource_name())
134
description = self.properties.get(self.DESCRIPTION)
135
domain = self.properties.get(self.DOMAIN)
136
enabled = self.properties.get(self.ENABLED)
138
project = self._create_project(
139
project_name=project_name,
140
description=description,
145
self.resource_id_set(project.id)
147
def handle_update(self,
151
name = prop_diff.get(self.NAME) or self.physical_resource_name()
152
description = prop_diff.get(self.DESCRIPTION)
153
enabled = prop_diff.get(self.ENABLED)
154
domain = (prop_diff.get(self.DOMAIN) or
155
self._stored_properties_data.get(self.DOMAIN))
157
self._update_project(
158
project_id=self.resource_id,
161
new_description=description,
165
def handle_delete(self):
166
if self.resource_id is not None:
168
self._delete_project(project_id=self.resource_id)
169
except Exception as ex:
170
self.client_plugin('keystone').ignore_not_found(ex)
173
def resource_mapping():
175
'OS::Keystone::Project': KeystoneProject