OVH Community, votre nouvel espace communautaire.

OpenStack : CURL & limite en montant


Abazada
03/11/2015, 05h51
Bonjour Romain,
Tu n'as visiblement fait que passer sur ce forum pour 3 petits messages,
mais ils sont fort intéressantsn et fournissent la doc!
Je cherchais un moyen de ne pas utiliser Swift; j'ai la solution. Merci

Yannick.Biet
05/08/2015, 14h04
J'ai honte de dire que ca fait une heure trente que je fais une boucle shell pour faire des appels curl de listing puis récupérer le timestamp de création puis comparer puis supprimer.........

En une ligne ca pouvait être réglé !

Merci Dieu de l'openStack !

Ps : En ayant googlisé ton nom je commence à comprendre pourquoi tu est pointu sur le sujet Merci encore et au plaisir !

romain.ledisez
05/08/2015, 13h59
Pour l'auto suppression, il y a deux headers fait pour : X-Delete-At et X-Delete-After. Le premier supprime l'objet à une date spécifiée (timestamp unix habituel), le second supprime l'objet dans le nombre de secondes spécifiées.

Il faut poser le header lors de l'upload (ou faire un post ensuite)

Exemple:
Code:
curl -X PUT -H 'X-Delete-At: 1438779398' ... => supprimer l'objet le 5 aout 2015 à 12:56:38 (utc)
curl -X PUT -H 'X-Delete-After: 3600' ... => supprimer l'objet 1h après l'upload
La doc : http://docs.openstack.org/developer/...g_objects.html

Yannick.Biet
05/08/2015, 11h22
Du coup j'ai un tout petit peu changé le script pour mon usage.


Code:
FILE=/path/fileToSave
DATACENTER=gra1 # gra1 ou sbg1

AUTH= # on trouve cette chaine dans le manager quand on arrive sur le container
TOKEN= Cloud > OpenStack > a coté du mot de passe>
CONTAINER=

STORAGE_URL=https://storage.${DATACENTER}.cloud.ovh.net:443/v1/AUTH_${AUTH}

OBJECT=`basename ${FILE}`
CHUNK_SIZE=5G


# Variables pour la date
format_year='%Y'
format_month='%m'
format_day='%d'
year=`date +${format_year}`
month=`date +${format_month}`
day=`date +${format_day}`

# Vérification que le fichier existe avant tout
if [ ! -f "$FILE" ]; then
    echo "Le fichier source n'existe pas"
    exit 100
fi


# Créé un dossier temporaire pour les chunks
TMPDIR="$(mktemp -d)"
echo "Création d'un repertoire temporaire ${TMPDIR}"
cd "${TMPDIR}"

# Split le fichier en chunks
echo "Split le fichier source en chunks"
split -d -b "${CHUNK_SIZE}" "${FILE}" ""

# Créé les containers
echo "Création des containers"
curl -X PUT -H "X-Auth-Token: ${TOKEN}" "${STORAGE_URL}/${CONTAINER}"
curl -X PUT -H "X-Auth-Token: ${TOKEN}" "${STORAGE_URL}/${CONTAINER}_segments"

# Upload les chunks
for chunk in *; do
    echo "Upload d'un nouveau chunk de ${CHUNK_SIZE}..."
    curl -X PUT -H "X-Auth-Token: ${TOKEN}" -T "${chunk}" "${STORAGE_URL}/${CONTAINER}_segments/${year}/${month}/${day}/${OBJECT}/${chunk}"
done


# Créé le manifest
echo "Création de l'objet manifest dans le container"
curl -X PUT -H "X-Auth-Token: ${TOKEN}" -H "X-Object-Manifest: ${CONTAINER}_segments/${OBJECT}/" --data-binary "" "${STORAGE_URL}/${CONTAINER}/${OBJECT}"

# Nettoyage
cd
echo "Nettoyage du répertoire temporaire"
rm -rf "${TMPDIR}"

Yannick.Biet
05/08/2015, 10h02
Tiens une autre question qui va arriver vite juste après : si je me sers de ce genre de script pour stocker des gizaines de Go, il faudra tot ou tard que je fasse du nettoyage

As tu une idée sur la manière de pouvoir effacer les fichiers de plus de X jours (idéallement selon le format du nom de fichier car généralement je stocke les x dernières sauvegardes du jour, les y dernieres sauvegardes hebdo, et les z dernieres sauvegardes mensuelles)

Yannick.Biet
05/08/2015, 09h54
Bonjour Romain,

En un seul message tu es mon dieu du code de la journée !
Merci d'avoir partagé ton savoir !

- Le script fonctionne bien
- As tu une solution pour que Horizon (le browser web OVH de openstack) permette de télécharger le fichier concaténé dans le container ? (horizon affiche un bete objet de 0 octets non téléchargeables mais les métadata font bien 10Go)

Je vais également regarder ta réponse sur curl et les entêtes et je posterai le script définitif ici.

Ps : pour information (suis je le seul ?) J'ai mon object storage sur GRA1 et non SBG1. Tout le monde semble dire que seul SBG1 est accessible, je suis surpris d'avoir le choix dans Horizon de mon data center

romain.ledisez
05/08/2015, 09h19
Bonjour Yannick,

la taille limite d'un objet est de 5G. Pour envoyer des objets de plus grande taille, il faut les découper en segment (ou chunk) et les envoyer. Le plus souvent, les segments sont placés dans un conteneur séparé pour ne pas polluer le conteneur principal, mais ce n'est pas obligatoire. La convention est de nommé ce conteneur séparé du même nom que le conteneur principal avec le suffixe _segments (ex: default -> default_segments). Il y a 2 techniques pour faire du Large Object : le DLO et le SLO. Je te présente ici le DLO qui est le plus simple.

Remplace les variables par les valeurs qui correspondent à ton compte.

La dernière étape créé un manifest, qui est en faite juste un objet vide avec une metadata indiquant à Swift ou retrouver les différents chunk. Il assemble les chunk dans l'ordre de listing (donc alphabétique).

Code:
FILE=/root/random.data
STORAGE_URL=https://storage.sbg1.cloud.ovh.net:443/v1/AUTH_xxxxxxxxxx
TOKEN=xxxxxxxxxx
CONTAINER=default
OBJECT=myobject
CHUNK_SIZE=1M

# Créé un dossier temporaire pour les chunks
TMPDIR="$(mktemp -d)"
cd "${TMPDIR}"

# Split le fichier en chunks
split -d -b "${CHUNK_SIZE}" "${FILE}" ""

# Créé les containers
curl -X PUT -H "X-Auth-Token: ${TOKEN}" "${STORAGE_URL}/${CONTAINER}"
curl -X PUT -H "X-Auth-Token: ${TOKEN}" "${STORAGE_URL}/${CONTAINER}_segments"

# Upload les chunks
for chunk in *; do
    curl -X PUT -H "X-Auth-Token: ${TOKEN}" -T "${chunk}" "${STORAGE_URL}/${CONTAINER}_segments/${OBJECT}/${chunk}"
done

# Créé le manifest
curl -X PUT -H "X-Auth-Token: ${TOKEN}" -H "X-Object-Manifest: ${CONTAINER}_segments/${OBJECT}/" --data-binary "" "${STORAGE_URL}/${CONTAINER}/${OBJECT}"

# Nettoyage
cd 
rm -rf "${TMPDIR}"

Yannick.Biet
04/08/2015, 15h29
Bonjour,

Après avoir joué toute la journée sur openstack, j'ai pu enfin envoyer mes premiers fichiers à mon conteneur privé.

J'ai décidé d'utiliser Curl et j'ai réussi à envoyer des fichiers compris entre 0-1Go
Rien à dire, la vitesse est même surprenante !

Par contre je voulais tester la manière d'envoyer des fichiers vraiments volumineux et là je me heurte apparemment à la limite du point d'entrée pour Curl :

Request Entity Too Large
The body of your request was too large for this server.


Du coup je me posais la question :
comment faire pour envoyer des fichiers larges ?

J'ai googlisé le sujet et j'arrive à la page (indiqué ce matin par le support VIP)
http://docs.openstack.org/developer/...e_objects.html

Le problème c'est que je ne suis pas sur le client SWIFT que j'ai installé sur un VPS debian 7 64 bits (installé exprès pour l'occasion) et je n'arrive rien à en tirer j'ai erreur sur erreur et je ne comprends pas déjà comment m'authentifier.

Avec Curl on passe le token du manager OVH en paramètre, c'est simple mais sous Swift ???

N'y a t'il aucun moyen "simple" de spliter un fichier pour envoi en Curl et de suivre la doc mentionnée ci-dessus ?
Qu'en pensez vous ? Quel retour d'expérience avez vous ?