Google PlusFacebookTwitter

Lister les conteneurs (buckets) Swift de tous les tenants

By on Fév 13, 2014 in OpenStack | 0 comments

Share On GoogleShare On FacebookShare On Twitter

DevOps, watching you !

Et oui, il faut bien les surveiller vos clients, non ? Ah non, pardon, je voulais dire : « les accompagner » !

Le sysadmin que vous êtes, se doit d’être en mesure de récupérer le plus rapidement possible la consommation (quelle qu’elle soit) d’un utilisateur.

Depuis quelques semaines, je joue avec Swift (OpenStack Object Storage). Dans l’ensemble j’arrive à faire ce que je veux mais (car il y a toujours un « mais ») récupérer de l’information sur d’autres utilisateurs que le sien n’est pas une mince affaire.

En effet, utiliser le client python-swiftclient pour lister ses propres conteneurs (buckets chez Amazon), ses propres fichiers, etc… c’est simple.

$ swift --os-auth-url http://identity.enocloud.com:5000/v2.0/ --os-tenant-name goldyfruit-bidouilles --os-username goldyfruit --os-password regardeDTC list --lh

Résultat :

    0    0 2014-02-12 19:37:55 c002
    4   25 2013-11-27 14:20:20 c001
    4   25

On voit très rapidement que le tenant (projet) goldyfruit-bidouilles possède deux conteneurs, le conteneur c001 contient quatre fichiers et ces quatre fichiers utilisent un espace de 25Ko.

Hélas, le client ci-dessus ne permet pas de lister les conteneurs du tenant de bob-leponge (et pourtant j’en ai vraiment envie). Je vous vois venir, vous allez essayer de remplacer la valeur de l’option –os-tenant-name, ça ne fonctionnera pas :mrgreen: !

Que l’API de Swift soit !

Comme tout élément de la plate-forme OpenStack, Swift possède une API plutôt bien faite et bien documentée. C’est donc cette API (entre autre) qui va nous permettre de récupérer les informations souhaitées.

Avant de jouer avec les API de Keystone et de Swift, il est nécessaire de s’assurer que le compte admin (ou celui de votre choix) soit bien présent dans le rôle ResellerAdmin.

Récupération des ID nécessaires :

$ USER_ID=$(keystone user-get admin | awk -v var="id" '$0 ~ var { print $4 }')
$ TENANT_ID=$(keystone tenant-get admin | awk -v var="id" '$0 ~ var { print $4 }')
$ ROLE_ID=$(keystone role-get ResellerAdmin | awk -v var="id" '$0 ~ var { print $4 }')

Ajout du rôle ResellerAdmin à l’utilisateur admin :

$ keystone user-role-add --user-id $USER_ID --role-id $ROLE_ID --tenant-id $TENANT_ID

Ou, vous pouvez directement utiliser les noms au lieu des ID (c’est un peu plus lisible) :

$ keystone user-role-add --user admin --role-id ResellerAdmin --tenant-id admin

Une petite vérification de routine :

$ keystone user-role-list --user admin

Résultat :

+----------------------------------+---------------+----------------------------------+----------------------------------+
|                id                |      name     |             user_id              |            tenant_id             |
+----------------------------------+---------------+----------------------------------+----------------------------------+
| cc26edf3d13447a8a67cd80f2483b139 | ResellerAdmin | 8ccddb2afd0e461bb1acf1ce8dbcdc3b | 8823540f42ec420ba6b9786a05553d50 |
| 120c2e8e66e44e558e9cfe2ec9d4e39c |     admin     | 8ccddb2afd0e461bb1acf1ce8dbcdc3b | 8823540f42ec420ba6b9786a05553d50 |
+----------------------------------+---------------+----------------------------------+----------------------------------+

Désormais l’utilisateur admin fait partie du rôle ResellerAdmin, il reste une dernière chose à vérifier. Le rôle ResellerAdmin est-t’il bien celui utilisé par Swift ? Pour le vérifier il suffit de grepper le fichier de configuration Swif.

$ grep reseller_admin_role /etc/swift/proxy-server.conf

Résultat :

reseller_admin_role = ResellerAdmin

Tout est correctement configuré ? Non ? Try Again 😛

L’API qui chante (nul…)

Pour ceux qui n’ont pas compris la référence, allez faire un petit tour ici et pour ceux à qui je fais de la peine, désolé…

Trêve de plaisanteries, la récupération des informations va se dérouler en trois étapes :

  1. Récupérer un token Keystone
  2. Récupérer l’ID du tenant souhaité
  3. Récupérer la liste des conteneurs du tenant

Récupérer un token Keystone

$ curl -s -d '{"auth": {"tenantName": "admin", "passwordCredentials": {"username": "admin", "password": "regarde-en-toi"}}}' -H 'Content-type: application/json' http://identity.enocloud.com:5000/v2.0/tokens | python -mjson.tool | awk -v var="\"id\": \"M" '$0 ~ var { print $2 }' | sed -e 's/"//g' -e 's/,//g > /tmp/token

Résultat :

MIINmgYJKoZIhvcNAQcCoIINizCCDYcCAQExCTAHBgUrDgMCGjCCDHMGCSqGSIb3DQEH < . . . >

Le token est normalement bien plus long, pour l’exemple je l’ai pas mal raccourci.

Récupérer l’ID du tenant souhaité

$ curl -s -H "X-Auth-Token: $(cat /tmp/token)" http://identity.enocloud.com:35357/v2.0/tenants | python -mjson.tool | grep -B1 name | awk -F":" '{ print $2 }' | sed -e 's/"//g' -e 's/,//g' -e 's/^ //g'

Résultat :

f9bb26c6523e4e7d9ef5376e40301655 
bob.leponge

fa7075f571f64847920d136a0fe970aa 
goldyfruit-bidouilles

fc47c4103c9b4aaf9271c581786a268f 
cest.pasmafaute

ffb92d3eb09a49a08bc6ec2391ecc108 
edithpiaf.estmorte

ffd9a89e084e441f97ff56b8341bbb2b 
odile.deray

Il ne reste plus qu’à choisir l’ID en relation avec le nom du tenant que vous souhaitez analyser. Exemple, pour le tenant odile.deray, l’ID sera ffd9a89e084e441f97ff56b8341bbb2b

Récupérer la liste des conteneurs du tenant

$ curl -s -H "X-Auth-Token: $(cat /tmp/token)" http://swift-api.enocloud.com:8080/v1/AUTH_ffd9a89e084e441f97ff56b8341bbb2b

Résultat :

kinoton
gencives-de-porc
émile

Le résultat est significatif, le tenant odile.deray possède trois conteneurs (et pas n’importe lesquels ^^).

Feignant ? Ce script est pour toi !

Ce script permet de lister tous les conteneurs Swift de tous les tenants recensés dans Keystone. Il fournit les informations suivantes :

Utilisation :

Usage: ./get_all_swift_containers_per_tenant [OPTIONS]
   -h|--help                    Display this help \o/
   -a|--all-containers          Display all containers per tenant
#!/bin/bash
#
# Get all Swift containers per Keystone tenants
#
# Author: Gaëtan Trellu <gaetan.trellu@incloudus.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License                                                                                                                                                               
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Requirement: curl python
#

# Tenant informations
USER_ADMIN="admin"
PASSWORD_ADMIN="password"
TENANT_ADMIN="admin"

# Keystone endpoints (user and admin)
KEYSTONE_ADMIN_URL="http://identity.enocloud.com:35357/v2.0"
KEYSTONE_URL="http://identity.enocloud.com:5000/v2.0"

# Swift endpoint
SWIFT_URl="http://swift-api.enocloud.com:8080/v1"

if [ "$1" == "-h" -o "$1" == "--help" ]
then
    echo
    echo "Usage: $0 [OPTIONS]"
    echo "   -h|--help                    Display this help \o/"
    echo "   -a|--all-containers          Display all containers per tenant"
    echo
    exit 0
fi

# Get a Keystone token
TOKEN=$(curl -s -d '{"auth": {"tenantName": "'$TENANT_ADMIN'", "passwordCredentials": {"username": "'$USER_ADMIN'", "password": "'$PASSWORD_ADMIN'"}}}' -H 'Content-type: application/json' "$KEYSTONE_URL"/tokens | python -mjson.tool | awk -v var="\"id\": \"M" '$0 ~ var { print $2 }' | sed -e 's/"//g' -e 's/,//g')

# Get all Keystone tenants ID
TENANTS_ID=$(curl -s -H "X-Auth-Token: $TOKEN"  "$KEYSTONE_ADMIN_URL"/tenants | python -mjson.tool | awk -v var="id" '$0 ~ var { print $2 }' | sed -e 's/"//g' -e 's/,//g' | grep -e "[a-z][0-9]")

# Set the TOTAL variable
TOTAL=0

echo
echo "====================================="
echo "# Display the Swift containers list #"
echo "====================================="
echo

for TENANT in $TENANTS_ID
do
    # Set the COUNT variable
    COUNT=0

    # Get the Keystone tenant name
    TENANT_NAME=$(curl -s -H "X-Auth-Token: $TOKEN"  "$KEYSTONE_ADMIN_URL"/tenants/"$TENANT" | python -mjson.tool | awk -v var="name" '$0 ~ var { print $2 }' | sed 's/"//g')

    # Get the Swift containers list per Keystone tenant
    CONTAINERS_LIST=$(curl -s -H "X-Auth-Token: $TOKEN"  "$SWIFT_URl"/AUTH_"$TENANT")

    # Count the Swift containers per Keystone tenant and make a sum
    for CONTAINER in $CONTAINERS_LIST
    do
        COUNT=$((COUNT+1))
        TOTAL=$((TOTAL+1))
    done

    # If Keystone tenant had Swift containers, there are displayed
    if [ ! -z "$CONTAINERS_LIST" ]
    then
        echo "[#] $TENANT_NAME | Container(s) : ["$COUNT"]"

        if [ "$1" == "--all-containers" -o "$1" == "-a" ]
        then
            for CONTAINER in $(echo $CONTAINERS_LIST | tr ' ' '\n')
            do
                echo "   - $CONTAINER"
            done
            echo
        fi

    fi

done

if [ -z "$1" ]
then
    echo
fi

echo "====================================="
echo "# Total Swift containers : [ "$TOTAL" ] #"
echo "====================================="

Liens

The following two tabs change content below.

Gaëtan Trellu (goldyfruit)

Technical Operation Manager chez Ormuco
Autodidacte en informatique, depuis 2005 je parcours l’écosystème Unix à la recherche de nouvelles connaissances et de nouvelles rencontres.

CC BY 4.0 Lister les conteneurs (buckets) Swift de tous les tenants par Gaëtan Trellu (goldyfruit) est sous Licence Creative Commons Internationale Attribution 4.0.