Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OpenStack and PHP

OpenStack and PHP

An introduction to OpenStack and how to access it using PHP.

Glen Campbell

March 15, 2014
Tweet

More Decks by Glen Campbell

Other Decks in Programming

Transcript

  1. 01

  2. 01

  3. OpenStack concepts ✤ virtual infrastructure services ✤ accessed via HTTP

    (RESTful) API ✤ developed by an open-source community ✤ highly configurable
  4. OpenStack governance ✤ Independent foundation ✤ Board of Directors: some

    directors appointed by funding companies, others elected at-large ✤ Technical Committee: elected by active members ✤ Biannual releases and summit/workshops ✤ Project Technical Leaders
  5. Compute ✤ Project “Nova” ✤ Supports multiple hypervisors including KVM,

    Xen ✤ Massively-scalable architecture ✤ Working towards interoperable workloads
  6. Storage ✤ Project “Swift” ✤ Elastic “blob” storage ✤ Can

    scale to regional or even global deployments ✤ Eventually consistent
  7. Networking ✤ Project “Neutron” (formerly “Quantum”) ✤ Dynamically create and

    manage L2/L3 networks ✤ Works with plugins for virtual network devices (OpenVSwitch, others)
  8. Installing php-opencloud # Install Composer curl -sS https://getcomposer.org/installer | php

    # Require php-opencloud as a dependency php composer.phar require rackspace/php- opencloud:dev-master
  9. 1.1 Authentication <?php require 'vendor/autoload.php'; use OpenCloud\Rackspace; print "Creating client...\n";

    $client = new Rackspace(Rackspace::US_IDENTITY_ENDPOINT, array( 'username' => getenv('OS_USERNAME'), 'apiKey' => getenv('NOVA_API_KEY'), 'tenantName' => getenv('OS_TENANT_NAME') ));
  10. 1.2 Attach print "Attaching to compute...\n"; try { $compute =

    $client->computeService( 'cloudServersOpenStack', 'IAD'); } catch (\Guzzle\Http\Exception\BadResponseException $e) { echo $e->getResponse(); die("OOPS\n"); }
  11. 1.5 Create print "Creating a server...\n"; use OpenCloud\Compute\Constants\Network; $server =

    $compute->server(); try { $response = $server->create(array( 'name' => 'My lovely server', 'image' => $centos, 'flavor' => $flavor, 'networks' => array( $compute->network(Network::RAX_PUBLIC), $compute->network(Network::RAX_PRIVATE) ) ));
  12. 1.6 Exception Handling } catch (\Guzzle\Http\Exception\BadResponseException $e) { // No!

    Something failed. Let's find out: $responseBody = (string) $e->getResponse()->getBody(); $statusCode = $e->getResponse()->getStatusCode(); $headers = $e->getResponse()->getHeaderLines(); echo sprintf("Status: %s\nBody: %s\nHeaders: %s", $statusCode, $responseBody, implode(', ', $headers)); }
  13. 1.7 Poll use OpenCloud\Compute\Constants\ServerState; $callback = function($server) { if (!empty($server->error))

    { var_dump($server->error); exit; } else { echo sprintf( "\rWaiting on %s/%-12s %4s%%", $server->name(), $server->status(), isset($server->progress) ? $server->progress : 0 ); } }; $server->waitFor(ServerState::ACTIVE, 600, $callback);
  14. Example 2. Listing flavors print "Attaching to compute...\n"; try {

    $compute = $client->computeService( 'cloudServersOpenStack', getenv('OS_REGION_NAME')); } catch (\Guzzle\Http\Exception\BadResponseException $e) { echo $e->getResponse(); } $list = $compute->flavorList(true); foreach($list as $flavor) { printf("%20s %-20s\n", $flavor->id(), $flavor->name()); }
  15. Example 3. File upload print "Attaching to object storage...\n"; try

    { $storage = $client->objectStoreService( 'cloudFiles', getenv('OS_REGION_NAME')); } catch (\Guzzle\Http\Exception\BadResponseException $e) { echo $e->getResponse(); die("OOPS\n"); }
  16. 3.1 create a container // create a container $container =

    $storage->createContainer('MidWestPHP'); if ($container === false) $container = $storage-
  17. 3.2 upload a file // create an object (empty) print

    "Creating an object...\n"; use OpenCloud\ObjectStore\Resource\DataObject; $container->uploadObject('myfile', fopen('upload_file.php', 'r+'));
  18. 3.3 list objects // list objects print "Listing objects:\n"; $files

    = $container->objectList(); while ($file = $files->next()) { printf("* %s (%d)\n.", $file->getName(), $file->getContentLength()); }