PHP-Opencloud pour Cloudwatt


Site officiel : Php-opencloud
Documentation : Documentation
Remonter un bug : GitHub


Ce tutoriel a pour but de vous expliquer comment utiliser les APIs Cloudwatt pour le développement de vos applications PHP avec php-opencloud.

Cloudwatt propose une gamme d’APIs puissantes qui peuvent être utilisées pour piloter vos Services Cloud (serveurs cloud, stockage block, stockage objet, réseau, …). Pour en savoir plus, veuillez consulter notre référentiel des APIs Cloudwatt.

Installation de php-opencloud

Pour installer les SDK, vous aurez d’abord besoin de Composer. Il existe des guide d’instalation pour Linux et Windows

Installez php-opencloud via composer:

$ composer require php-opencloud/openstack

Utiliser php-opencloud

Voici un scénario dont les différentes étapes serviront d’exemple à l’utilisation de la librairie client pkgcloud :

  • Déclarer les informations d’identification
  • Créer un réseau
  • Mettre à jour un réseau
  • Supprimer un réseau
  • Lancer une instance
  • Mettre à jour une instance
  • Supprimer une instance

Dépendances

Ajouter ceci au début de votre fichier :

<?php
require 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use OpenStack\Identity\v2\Service;
use OpenStack\Common\Transport\Utils as TransportUtils;
use OpenStack\OpenStack;
?>

Déclarer vos informations d’identification

Pour commencer à travailler avec les APIs vous devez récupérer vos informations d’identification depuis la console Cloudwatt. Vous devez utiliser l’identifiant (username) et le mot de passe (password) que vous avez utilisé pour créer votre compte. L’URL d’authenfication est disponible dans la console. Actuellement, cette URL est la suivante :

  • https://identity.fr1.cloudwatt.com/v2.0
<?php
$authUrl = 'https://identity.fr1.cloudwatt.com/v2.0';

$credentials = [
    'authUrl'         => $authUrl,
    'region'          => 'fr1',
    'username'        => '',
    'password'        => '',
    'tenantName'      => '',
    'identityService' => Service::factory($httpClient = new Client([
	    'base_uri' => TransportUtils::normalizeUrl($authUrl),
	    'handler'  => HandlerStack::create(),
	])),
];
?>

Nous allons creer un classe qui nous aidera à utiliser les differents services de PHP-opencloud et nous lui ajouterons ensuite différentes fonctions pour chaque cas de figure.

<?php
class opencloud_Cloudwatt {

	private $_openstack;
	private $_compute;

	public function __construct(array $options){
		$this->_openstack = new OpenStack($options);
		$this->_compute = $this->_openstack->computeV2(['region' => $options['region']]);
	}

}
?>

Créer un réseau :

Cette fonction nous permettra de créer un nouveau réseau, elle prendra en paramètre le nom de votre réseau ($name) et son statut admin ($adminStateUp) de type booléen. ~~~ php _openstack->networkingV2()->createNetwork(compact('name', 'adminStateUp')); } ?> ~~~

Vous pouvez désormais créer un réseau de cette façon:

<?php
$service = new opencloud_Cloudwatt($credentials); // Instancier la classe avec vos informations d'identification si ce n'est pas déjà fait 
$network = $service->createNetwork('mon-network');
?>

Mettre à jour un réseau :

Cette fonction nous permettra de mettre à jour un réseau, elle prendra en paramètre l’id du réseau que vous souhaitez modifier ($id) et un tableau représentant la propriété à modifier et sa nouvelle valeur ($property). ~~~ php _openstack->networkingV2()->getNetwork($id); $prop = array_keys($property)[0]; $network->$prop = $property[$prop]; $network->update(); } ?> ~~~

Vous pouvez désormais mettre à jour un réseau de cette façon:

<?php
$service = new opencloud_Cloudwatt($credentials); // Instancier la classe avec vos informations d'identification si ce n'est pas déjà fait
$service->updateNetwork('{network-id}', ['name' => strtoupper('mon-network')]); // Le nom de votre réseau est désormais "MON-NETWORK"
?>

Supprimer un réseau :

Cette fonction nous permettra de supprimer un réseau, elle prendra en paramètre l’id du réseau que vous souhaitez supprimer ($id). ~~~ php _openstack->networkingV2()->getNetwork($id)->delete(); } ?> ~~~

Vous pouvez désormais supprimer un réseau de cette façon:

<?php
$service = new opencloud_Cloudwatt($credentials); // Instancier la classe avec vos informations d'identification si ce n'est pas déjà fait
$service->deleteNetwork('{network-id}');
?>

Lancer une instance

Cette fonction nous permettra de lancer une instance, elle prendra en paramètre le nom de votre instance à créer ($instanceName), du gabarit ($flavorName) et de l’image ($imageName) ainsi que l’id du réseau à associer ($networkId). Nous ajouterons aussi deux fonctions qui nous permettrons de récuperer une image et un gabarit à partir de son nom. ~~~ php <?php public function launchInstance(string $instanceName, string $flavorName, string $imageName, string $networkId){ return $this->_compute->createServer([ ‘name’ => $instanceName, ‘imageId’ => $this->findImage($imageName)->id, ‘flavorId’ => $this->findFlavor($flavorName)->id, ‘networks’ => [ [‘uuid’ => $networkId] ], ]); }

private function findImage(string $name){
	foreach($this->_compute->listImages(['status' => 'ACTIVE']) as $image){
		if($image->name === $name)
			return $image;
	}
	return false;
}

private function findFlavor(string $name){
	foreach($this->_compute->listFlavors() as $flavor){
		if($flavor->name === $name)
			return $flavor;
	}
	return false;
} ?> ~~~

Vous pouvez désormais lancer une instance de cette façon:

<?php
$service = new opencloud_Cloudwatt($credentials); // Instancier la classe avec vos informations d'identification si ce n'est pas déjà fait 
$service->launchInstance('mon-instance', '{flavor-name}', '{image-name}', '{network-id}');
?>

Mettre à jour une instance

Cette fonction nous permettra de mettre à jour une instance, elle prendra en paramètre le nom de l’instance à modifier ($name) et un tableau représentant la propriété à modifier et sa nouvelle valeur ($property). Nous ajouterons aussi une fonction qui nous permettras de trouver une instance à partir de son nom.

<?php
	public function updateInstance(string $name, array $property){
		$instance = $this->_compute->getServer(['id' => $this->findInstance($name)->id]);
		$prop = array_keys($property)[0];
		$instance->$prop = $property[$prop];
		$instance->update();
	}

	private function findInstance(string $name){
		foreach($this->_compute->listServers() as $instance){
			if($instance->name === $name)
				return $instance;
		}
		return false;
	}
?>

Vous pouvez désormais mettre à jour une instance de cette façon:

<?php
$service = new opencloud_Cloudwatt($credentials); // Instancier la classe avec vos informations d'identification si ce n'est pas déjà fait 
$service->updateInstance('{instance-name}', ['name' => 'new-name']);
?>

Supprimer une instance

Cette fonction nous permettra de supprimer une instance, elle prendra en paramètre le nom de l’instance à supprimer ($name).

<?php
	public function deleteInstance(string $name){
		$this->_compute->getServer(['id' => $this->findInstance($name)->id])->delete();
	}
?>

Vous pouvez désormais supprimer une instance de cette façon:

<?php
$service = new opencloud_Cloudwatt($credentials); // Instancier la classe avec vos informations d'identification si ce n'est pas déjà fait 
$service->deleteInstance('mon-instance');
?>

Code complet

<?php
require 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use OpenStack\Identity\v2\Service;
use OpenStack\Common\Transport\Utils as TransportUtils;
use OpenStack\OpenStack;

$authUrl = 'https://identity.fr1.cloudwatt.com/v2.0';

$credentials = [
    'authUrl'         => $authUrl,
    'region'          => 'fr1',
    'username'        => '',
    'password'        => '',
    'tenantName'      => '',
    'identityService' => Service::factory($httpClient = new Client([
	    'base_uri' => TransportUtils::normalizeUrl($authUrl),
	    'handler'  => HandlerStack::create(),
	])),
];

class opencloud_Cloudwatt {

	private $_openstack;
	private $_compute;

	public function __construct(array $options){
		$this->_openstack = new OpenStack($options);
		$this->_compute = $this->_openstack->computeV2(['region' => $options['region']]);
	}

	public function createNetwork(string $name, bool $adminStateUp = true){
		return $this->_openstack->networkingV2()->createNetwork(compact('name', 'adminStateUp'));
	}

	public function deleteNetwork(string $id){
		$this->_openstack->networkingV2()->getNetwork($id)->delete();
	}

	public function updateNetwork(string $id, array $property){
		$network = $this->_openstack->networkingV2()->getNetwork($id);
		$prop = array_keys($property)[0];
		$network->$prop = $property[$prop];
		$network->update();
	}

	public function launchInstance(string $instanceName, string $flavorName, string $imageName, string $networkId){
		return $this->_compute->createServer([
		    'name'     => $instanceName,
		    'imageId'  => $this->findImage($imageName)->id,
		    'flavorId' => $this->findFlavor($flavorName)->id,
		    'networks'  => [
		        ['uuid' => $networkId]
		    ],
		]);
	}

	public function deleteInstance(string $name){
		$this->_compute->getServer(['id' => $this->findInstance($name)->id])->delete();
	}

	public function updateInstance(string $name, array $property){
		$instance = $this->_compute->getServer(['id' => $this->findInstance($name)->id]);
		$prop = array_keys($property)[0];
		$instance->$prop = $property[$prop];
		$instance->update();
	}

	private function findInstance(string $name){
		foreach($this->_compute->listServers() as $instance){
			if($instance->name === $name)
				return $instance;
		}
		return false;
	}

	private function findImage(string $name){
		foreach($this->_compute->listImages(['status' => 'ACTIVE']) as $image){
			if($image->name === $name)
				return $image;
		}
		return false;
	}

	private function findFlavor(string $name){
		foreach($this->_compute->listFlavors() as $flavor){
			if($flavor->name === $name)
				return $flavor;
		}
		return false;
	}

}

$service = new opencloud_Cloudwatt($credentials);

?>