Slide 1

Slide 1 text

March 2014 OpenStack and PHP Glen Campbell • Midwest PHP 2014

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

http://rack.to/mwphp14

Slide 4

Slide 4 text

01

Slide 5

Slide 5 text

01

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

OpenStack concepts ✤ virtual infrastructure services ✤ accessed via HTTP (RESTful) API ✤ developed by an open-source community ✤ highly configurable

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

OpenStack APIs ✤ Native REST ✤ EC2-compatible ✤ Internal (python)

Slide 10

Slide 10 text

Compute ✤ Project “Nova” ✤ Supports multiple hypervisors including KVM, Xen ✤ Massively-scalable architecture ✤ Working towards interoperable workloads

Slide 11

Slide 11 text

Storage ✤ Project “Swift” ✤ Elastic “blob” storage ✤ Can scale to regional or even global deployments ✤ Eventually consistent

Slide 12

Slide 12 text

Networking ✤ Project “Neutron” (formerly “Quantum”) ✤ Dynamically create and manage L2/L3 networks ✤ Works with plugins for virtual network devices (OpenVSwitch, others)

Slide 13

Slide 13 text

Dashboard ✤ Project “Horizon” ✤ Clean, simple user interface ✤ Uses native API to communicate to services

Slide 14

Slide 14 text

Shared Services ✤ Identity—“Keystone” ✤ Image—“Glance” ✤ Telemetry—“Ceilometer” ✤ Orchestration—“Heat”

Slide 15

Slide 15 text

Other Projects ✤ OpenStack-SDKs ✤ Savanna—Hadoop provisioning ✤ Trove—Database ✤ Bare metal—Ironic ✤ Queue—Marconi

Slide 16

Slide 16 text

How to interact with OpenStack ✤ Control panel ✤ Command line client ✤ cURL ✤ SDK

Slide 17

Slide 17 text

First Q&A

Slide 18

Slide 18 text

Resources ✤ http://github.com/rackspace/php-opencloud ✤ http://developer.rackspace.com/ ✤ http://docs.openstack.org/

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

Example 1. Create a server

Slide 21

Slide 21 text

1.1 Authentication getenv('OS_USERNAME'), 'apiKey' => getenv('NOVA_API_KEY'), 'tenantName' => getenv('OS_TENANT_NAME') ));

Slide 22

Slide 22 text

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"); }

Slide 23

Slide 23 text

1.3 Image print "Getting an image...\n"; $centos = $compute->image('85019bd8-fb5d-4230-b3bc-63b192800f28');

Slide 24

Slide 24 text

1.4 Flavor print "Getting a flavor...\n"; $flavor = $compute->flavor('performance1-1');

Slide 25

Slide 25 text

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) ) ));

Slide 26

Slide 26 text

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)); }

Slide 27

Slide 27 text

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);

Slide 28

Slide 28 text

1.8 Let's try it out LIVE DEMO

Slide 29

Slide 29 text

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()); }

Slide 30

Slide 30 text

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"); }

Slide 31

Slide 31 text

3.1 create a container // create a container $container = $storage->createContainer('MidWestPHP'); if ($container === false) $container = $storage-

Slide 32

Slide 32 text

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+'));

Slide 33

Slide 33 text

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()); }

Slide 34

Slide 34 text

Final Q&A

Slide 35

Slide 35 text

https://github.com/gecampbell/mwphp14

Slide 36

Slide 36 text

Let's keep in touch ✤ [email protected] ✤ Twitter: @glenc ✤ http://developer.rackspace.com