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"
  1. 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                                    |