Come attivare le nested quotas per i volumi Cinder¶
Prerequisiti¶
Avere Keystone API v3 attive e impersonare utente cloud_admin.
Procedura¶
1. Carico le variabili di ambiente per il cloud_admin. N.B. la sessione deve esportare i riferimenti al progetto admin (openstack project list -> segnare id del project admin):
export OS_USER_DOMAIN_NAME=admin_domain
export OS_DOMAIN_NAME=admin_domain
export OS_USERNAME=admin
export OS_PASSWORD=<pass>
export OS_AUTH_URL=http://keystone.cloud.garr.it:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_AUTH_VERSION=3
export OS_PROJECT_ID=<admin_domain project ID>
export OS_PROJECT_NAME="admin"
Cinder deve operare con il driver di default. Cioè NON devono essere presenti config-flags relativi a quota_driver:
juju config cinder-ba1-prod config-flags
Se risulta:
quota_driver=cinder.quota.NestedDbQuotaDriver
Eseguire:
juju config cinder-ba1-prod config-flags=””
Creazione dei progetti annidati e verifica delle quote standard¶
Creo un albero di progetti specificando i parametri –domain e –parent da CLI openstack. Ancora una volta la GUI è inefficace. Come da esempi:
+-----------+
| |
| A |
| / \ |
| B C |
| / |
| D |
+-----------+
Si veda qui per i dettagli, http://docs.openstack.org/mitaka/config-reference/block-storage/nested-quota.html
I comandi sono:
export OS_DOMAIN=default
openstack project create --domain $OS_DOMAIN A
openstack project create --domain $OS_DOMAIN --parent A B
openstack project create --domain $OS_DOMAIN --parent A C
openstack project create --domain $OS_DOMAIN --parent B D
Il listing delle quote riporta le informazioni puntuali per ogni progetto:
root@openstackclient:~# cinder quota-show A
+----------------------+-------+
| Property | Value |
+----------------------+-------+
| backup_gigabytes | 1000 |
| backups | 10 |
| gigabytes | 1000 |
| gigabytes_LUKS | -1 |
| per_volume_gigabytes | -1 |
| snapshots | 10 |
| snapshots_LUKS | -1 |
| volumes | 10 |
| volumes_LUKS | -1 |
+----------------------+-------+
root@openstackclient:~# cinder quota-show B
+----------------------+-------+
| Property | Value |
+----------------------+-------+
| backup_gigabytes | 1000 |
| backups | 10 |
| gigabytes | 1000 |
| gigabytes_LUKS | -1 |
| per_volume_gigabytes | -1 |
| snapshots | 10 |
| snapshots_LUKS | -1 |
| volumes | 10 |
| volumes_LUKS | -1 |
+----------------------+-------+
root@openstackclient:~# cinder quota-show D
+----------------------+-------+
| Property | Value |
+----------------------+-------+
| backup_gigabytes | 1000 |
| backups | 10 |
| gigabytes | 1000 |
| gigabytes_LUKS | -1 |
| per_volume_gigabytes | -1 |
| snapshots | 10 |
| snapshots_LUKS | -1 |
| volumes | 10 |
| volumes_LUKS | -1 |
+----------------------+-------+
root@openstackclient:~# cinder quota-show C
+----------------------+-------+
| Property | Value |
+----------------------+-------+
| backup_gigabytes | 1000 |
| backups | 10 |
| gigabytes | 1000 |
| gigabytes_LUKS | -1 |
| per_volume_gigabytes | -1 |
| snapshots | 10 |
| snapshots_LUKS | -1 |
| volumes | 10 |
| volumes_LUKS | -1 |
+----------------------+-------+
Le stesse informazioni, riportate con le altre quote relative agli altri tipi di risorsa, possono essere visualizzate con i seguenti comandi:
root@openstackclient:~# openstack quota show A
+-----------------------+----------------------------------+
| Field | Value |
+-----------------------+----------------------------------+
| backup_gigabytes | 1000 |
| backups | 10 |
| cores | 20 |
| endpoint_group | -1 |
...
| gigabytes | 1000 |
...
+-----------------------+----------------------------------+
root@openstackclient:~# openstack quota show B
+-----------------------+----------------------------------+
| Field | Value |
+-----------------------+----------------------------------+
| backup_gigabytes | 1000 |
| backups | 10 |
| cores | 20 |
...
| gigabytes | 1000 |
...
+-----------------------+----------------------------------+
Attivare la notazione differenziale dell’uso delle quote nei progetti annidati¶
Attivazione automatica delle API per le quote annidate¶
Abbiamo sviluppato uno script che attiva le quote annidate in modo automatico.
È sufficiente invicare il seguente comando (TODO: lo script è su gitlab, nel progetto csd-install):
csd-install/enableQuota.sh <keystone Endpoint IPaddr> <Cinder Endpoint IPaddr>
Se i requisiti sono rispettati il risultato dell’esecuzione è il seguente:
$ csd-install/enableQuota.sh 90.147.161.123 10.4.1.168
Keystone_IP= 90.147.161.123
Cinder_IP = 10.4.1.168
Project_UUID=dbe114c8ffa34dbc85cf1d336463d376
OStoken=a0953012f1484817a181acf6829e4310
curl -i -s -H "X-Auth-Token: ${OS_TOKEN}" http://10.4.1.168:8776/v2/dbe114c8ffa34dbc85cf1d336463d376/os-quota-sets/validate_setup_for_nested_quota_use?fix_allocated_quotas=True
HTTP/1.1 200 OK
Content-Length: 0
X-Compute-Request-Id: req-718bf8fd-e49c-461f-8f18-2cf9c52b1647
Content-Type: application/json
X-Openstack-Request-Id: req-718bf8fd-e49c-461f-8f18-2cf9c52b1647
Date: Mon, 07 Nov 2016 10:12:03 GMT
In particolare occorre che il risultato riporti “HTTP/1.1 200 OK” affinchè si abbia la certezza che le API ora sono pronte a supportare le quote annidate.
Attivazione Manuale¶
È possibile svolgere le azioni effettuate dallo script anche manualmente. Il livello di complessità delle singole operazioni è ovviamente maggiore, a meno di esigenze specifiche si consiglia di utilizzare lo script in dotazione.
Occorre ottenere un token domain e project scoped per il progetto admin:
OS_TOKEN=$(\
curl -i -H "Content-Type: application/json" -d '
{ "auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"name": "admin",
"domain": { "id": "admin_cloud" },
"password": "<SET_PASSWSORD>"
}
}
},
"scope": {
"project": {
"name": "admin",
"domain": { "id": "default" }
}
}
}
}' \
http://<keystone Endpoint IPaddr>:5000/v3/auth/tokens | grep ^X-Subject-Token: | awk '{print $2}' )
Poi è necessario invocare la API che attiva il setup delle Nested quota per Cinder. L’API non disponibile da GUI e nemmeno da CLI, l’unica via percorribile è la API REST:
curl -i -s -H "X-Auth-Token: $OS_TOKEN" http://<Cinder Endpoint IPaddr>:8776/v2/<UUDI progetto admin>/os-quota-sets/validate_setup_for_nested_quota_use?fix_allocated_quotas=True
Attivazione del driver per le quote annidate di Cinder¶
Riattivare il driver per la quota nel charm cinder:
Juju config cinder-ba1-prod config-flags=”quota_driver=cinder.quota.NestedDbQuotaDriver”
( Aggiungere la seguente opzione al bundle:
cinder:
options:
config-flags: quota_driver=cinder.quota.NestedDbQuotaDriver
)
Verifica delle quote annidate¶
Se i passi sopra sono stati eseguiti correttamente, il listing delle quote ora opera in maniera differenziale. I sottoprogetti riportano le proprie quote tutte a zero, solo il progetto padre indica i valori assoluti assegnati.
La chiamata effettuata con la CLI openstack opera regolarmente usando i nomi mnemonici.
Infatti i progetti A, B, C e D riportano:
root@openstackclient:~# cinder quota-show <UUID progetto A>
+----------------------+-------+
| Property | Value |
+----------------------+-------+
| backup_gigabytes | 1000 |
| backups | 10 |
| gigabytes | 1000 |
| gigabytes_LUKS | -1 |
| per_volume_gigabytes | -1 |
| snapshots | 10 |
| snapshots_LUKS | -1 |
| volumes | 5 |
| volumes_LUKS | -1 |
+----------------------+-------+
root@openstackclient:~# cinder quota-show <UUID progetto B>
+----------------------+-------+
| Property | Value |
+----------------------+-------+
| backup_gigabytes | 0 |
| backups | 0 |
| gigabytes | 0 |
| gigabytes_LUKS | 0 |
| per_volume_gigabytes | 0 |
| snapshots | 0 |
| snapshots_LUKS | 0 |
| volumes | 0 |
| volumes_LUKS | 0 |
+----------------------+-------+
root@openstackclient:~# cinder quota-show <UUID progetto D>
+----------------------+-------+
| Property | Value |
+----------------------+-------+
| backup_gigabytes | 0 |
| backups | 0 |
| gigabytes | 0 |
| gigabytes_LUKS | 0 |
| per_volume_gigabytes | 0 |
| snapshots | 0 |
| snapshots_LUKS | 0 |
| volumes | 0 |
| volumes_LUKS | 0 |
+----------------------+-------+
root@openstackclient:~# cinder quota-show <UUID progetto C>
+----------------------+-------+
| Property | Value |
+----------------------+-------+
| backup_gigabytes | 0 |
| backups | 0 |
| gigabytes | 0 |
| gigabytes_LUKS | 0 |
| per_volume_gigabytes | 0 |
| snapshots | 0 |
| snapshots_LUKS | 0 |
| volumes | 0 |
| volumes_LUKS | 0 |
+----------------------+-------+
Utilizzando la CLI unificata openstack si ottiene in maniera del tutto analoga:
root@openstackclient:~# openstack quota show A
+-----------------------+----------------------------------+
| Field | Value |
+-----------------------+----------------------------------+
| backup_gigabytes | 1000 |
| backups | 10 |
| cores | 20 |
| endpoint_group | -1 |
| firewall | 10 |
| firewall_policy | 10 |
| firewall_rule | 100 |
| fixed-ips | -1 |
| floating-ips | 50 |
| gigabytes | 1000 |
| health_monitor | -1 |
| ikepolicy | -1 |
| injected-file-size | 10240 |
| injected-files | 5 |
| injected-path-size | 255 |
| instances | 10 |
| ipsec_site_connection | -1 |
| ipsecpolicy | -1 |
| key-pairs | 100 |
| member | -1 |
| network | 10 |
| per_volume_gigabytes | -1 |
| pool | 10 |
| port | 50 |
| project | 1b92617a712642b39892d6c34973d1b2 |
| properties | 128 |
| ram | 51200 |
| rbac_policy | 10 |
| router | 10 |
| secgroup-rules | 100 |
| secgroups | 10 |
| server_group_members | 10 |
| server_groups | 10 |
| snapshots | 10 |
| subnet | 10 |
| subnetpool | -1 |
| vip | 10 |
| volumes | 10 |
| vpnservice | -1 |
+-----------------------+----------------------------------+
root@openstackclient:~# openstack quota show B
+-----------------------+----------------------------------+
| Field | Value |
+-----------------------+----------------------------------+
| backup_gigabytes | 0 |
| backups | 0 |
| cores | 20 |
| endpoint_group | -1 |
| firewall | 10 |
| firewall_policy | 10 |
| firewall_rule | 100 |
| fixed-ips | -1 |
| floating-ips | 50 |
| gigabytes | 0 |
| health_monitor | -1 |
| ikepolicy | -1 |
| injected-file-size | 10240 |
| injected-files | 5 |
| injected-path-size | 255 |
| instances | 10 |
| ipsec_site_connection | -1 |
| ipsecpolicy | -1 |
| key-pairs | 100 |
| member | -1 |
| network | 10 |
| per_volume_gigabytes | 0 |
| pool | 10 |
| port | 50 |
| project | 54131d0ddd0145f8894d12d2c0b80e31 |
| properties | 128 |
| ram | 51200 |
| rbac_policy | 10 |
| router | 10 |
| secgroup-rules | 100 |
| secgroups | 10 |
| server_group_members | 10 |
| server_groups | 10 |
| snapshots | 0 |
| subnet | 10 |
| subnetpool | -1 |
| vip | 10 |
| volumes | 0 |
| vpnservice | -1 |
+-----------------------+----------------------------------+
Provo a modificare la quota del progetto B:
$ openstack quota set --volumes 15 B
Quota exceeded for resources: %(overs)s (HTTP 400) (Request-ID: req-a55ea7cb-4902-4c0e-b220-39dbdbb8a5c9)
$ openstack quota set --volumes 6 B
$ openstack quota show B | grep volumes
| volumes | 6 |