Native Keystone Resources¶
https://blueprints.launchpad.net/heat/+spec/keystone-resources
Problem description¶
Some cloud operators would like to be able to use Heat templates to manage users, projects and roles in Keystone. Currently we can only create users, and only through an AWS IAM resource type.
This was discussed on the mailing list in the thread beginning here:
http://lists.openstack.org/pipermail/openstack-dev/2015-January/055554.html
Proposed change¶
Implement the following native resource types:
OS::Keystone::User
name (optional - defaults to self.physical_resource_name())
default_project_id (optional)
email (optional)
domain (optional)
password (optional)
enabled (default True)
groups (list)
roles (list)
domain (optional - domain or project or both must be specified)
project (optional - domain or project or both must be specified)
role
OS::Keystone::Group
name (optional - defaults to self.physical_resource_name())
domain (optional)
description (optional)
roles (list)
domain (optional - domain or project or both must be specified)
project (optional - domain or project or both must be specified)
role
OS::Keystone::Role
name (optional - defaults to self.physical_resource_name())
OS::Keystone::Project
name (optional - defaults to self.physical_resource_name())
domain (optional)
description (optional)
enabled (default True)
Since in the default policy.json configuration these APIs are available only to administrative users, the plugin would be in the /contrib tree and not installed by default.
Alternatives¶
Another possible data model would be to have a separate RoleAssignment resource (or similar) to grant roles to users or groups, rather that having the roles listed in the user or group resources. A similar thing could apply to the list of users in a group, which could be implemented instead as a GroupMembership resource.
However, there are a couple of problems with that data model. The first is that adding a user to a group or granting a role to a user/group does not create a physical resource with its own UUID. This makes it difficult for Heat to manage the resources.
The second issue is that such an approach tends to create dependency problems for users - for example in this model if another resource depends on a User, then Heat may begin creating it before the User has been assigned a Role that it may need to perform the operation. This is possibly less of an issue with Keystone resources than it has proven with Neutron resources, but it is a known anti-pattern in Heat data modelling.
A similar issue occurs with Users and Groups - an alternative implementation would be for the Group definition to contain a list of Users rather than for the User definition to contain a list of Groups. The advantage of that is that it more closely follows how the API is implemented, but this way was chosen because it is more likely to automatically generate correct dependencies: anything that depends on a User will always wait for all groups to be assigned. Both approaches are likely to make some (different) subset of use cases awkward, but the only solution would be a separate GroupMembership resources type and that would suffer from all of the problems with a RoleAssignment discussed above.
Implementation¶
Assignee(s)¶
- Primary Assignee:
kanagaraj-manickam
Milestones¶
- Target Milestone for completion:
Kilo-3
Work Items¶
User plugin
Project plugin
Group plugin
Role plugin
Custom constraint for keystone.project
Custom constraint for keystone.group
Custom constraint for keystone.role
Custom constraint for keystone.domain
Dependencies¶
None