Hierarchical Multitenancy is coming. Look busy.
Until we get CLI support for creating projects with parent relationships, we have to test via curl. This has given me a chance to clean up a few little techniques on using jq andd heredocs.
#!/usr/bin/bash -x . ./keystonerc_admin TOKEN=$( curl -si -H "Content-type: application/json" -d@- $OS_AUTH_URL/auth/tokens <<EOF | awk '/X-Subject-Token/ {print $2}' { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "domain": { "name": "$OS_USER_DOMAIN_NAME" }, "name": "admin", "password": "$OS_PASSWORD" } } }, "scope": { "project": { "domain": { "name": "$OS_PROJECT_DOMAIN_NAME" }, "name": "$OS_PROJECT_NAME" } } } } EOF ) PARENT_PROJECT=$( curl -H "Content-type: application/json" -H"X-Auth-Token:$TOKEN" -d@- $OS_AUTH_URL/projects <<EOF | jq -r '.project | {id}[] ' { "project": { "description": "parent project", "domain_id": "default", "enabled": true, "name": "Parent" } } EOF ) echo $PARENT_PROJECT curl -H "Content-type: application/json" -H"X-Auth-Token:$TOKEN" -d@- $OS_AUTH_URL/projects <<EOF { "project": { "description": "demo-project", "parent_project_id": "$PARENT_PROJECT", "domain_id": "default", "enabled": true, "name": "child" } } EOF
Note that this uses V3 of the API. I have the following keystone_adminrc
export OS_USERNAME=admin export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_DOMAIN_NAME=Default export OS_PROJECT_NAME=admin export OS_PASSWORD=cf8dcb8aae804722 export OS_AUTH_URL=http://192.168.1.80:5000/v3/ export OS_IDENTITY_API_VERSION=3 export OS_REGION_NAME=RegionOne export PS1='[\u@\h \W(keystone_admin)]\$ '
This is really a great feature. Cannot wait to use it. Any plans about the integration in the python-openstackclient?
Patches posted. One has one +2. Need more eyes from the OSC team.
Nice! This combined with domains will give great flexibility in access control. I found handy also this:
# curl -H “Content-type: application/json” -H”X-Auth-Token:$TOKEN” $OS_AUTH_URL/projects/$PARENT_PROJECT?subtree_as_list | python -m json.tool
{
“project”: {
“description”: “parent project”,
“domain_id”: “default”,
“enabled”: true,
“id”: “30e3012fdefa4175886232eace09d8ce”,
“links”: {
“self”: “http://192.168.178.2:5000/v3/projects/30e3012fdefa4175886232eace09d8ce”
},
“name”: “Parent”
}
}
to retrieve the list of parent projects. One question: how deep can the tree be?