Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
OpenStack and PHP
Search
Glen Campbell
March 15, 2014
Programming
1
310
OpenStack and PHP
An introduction to OpenStack and how to access it using PHP.
Glen Campbell
March 15, 2014
Tweet
Share
More Decks by Glen Campbell
See All by Glen Campbell
Cache Strategies for Web Apps
gecampbell
0
400
Succeeding at Open Source
gecampbell
0
110
Cache strategies for microservice-based web apps
gecampbell
1
4.6k
OpenStack: the good, the bad, and the ugly
gecampbell
0
220
Open-Source in the Real World
gecampbell
1
220
The Future of PHP is in the Clouds
gecampbell
0
47
Other Decks in Programming
See All in Programming
コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions
handlename
0
230
PHP でエミュレータを自作して Ubuntu を動かそう
m3m0r7
PRO
2
140
new(1.26) ← これすき / kamakura.go #8
utgwkk
0
2.7k
RailsのValidatesをSwift Macrosで再現してみた
hokuron
0
130
ふつうのRubyist、ちいさなデバイス、大きな一年 / Ordinary Rubyists, Tiny Devices, Big Year
chobishiba
1
500
コードレビューをしない選択 #でぃーぷらすトウキョウ
kajitack
3
1.1k
Rethinking API Platform Filters
vinceamstoutz
0
450
今からFlash開発できるわけないじゃん、ムリムリ! (※ムリじゃなかった!?)
arkw
0
150
我々はなぜ「層」を分けるのか〜「関心の分離」と「抽象化」で手に入れる変更に強いシンプルな設計〜 #phperkaigi / PHPerKaigi 2026
shogogg
2
380
野球解説AI Agentを開発してみた - 2026/02/27 LayerX社内LT会資料
shinyorke
PRO
0
370
GC言語のWasm化とComponent Modelサポートの実践と課題 - Scalaの場合
tanishiking
0
130
安いハードウェアでVulkan
fadis
1
780
Featured
See All Featured
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.2k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.2k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.2k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9k
Are puppies a ranking factor?
jonoalderson
1
3.2k
Being A Developer After 40
akosma
91
590k
Making the Leap to Tech Lead
cromwellryan
135
9.8k
The Curious Case for Waylosing
cassininazir
0
280
Ruling the World: When Life Gets Gamed
codingconduct
0
180
Side Projects
sachag
455
43k
Transcript
March 2014 OpenStack and PHP Glen Campbell • Midwest PHP
2014
None
http://rack.to/mwphp14
01
01
None
OpenStack concepts ✤ virtual infrastructure services ✤ accessed via HTTP
(RESTful) API ✤ developed by an open-source community ✤ highly configurable
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
OpenStack APIs ✤ Native REST ✤ EC2-compatible ✤ Internal (python)
Compute ✤ Project “Nova” ✤ Supports multiple hypervisors including KVM,
Xen ✤ Massively-scalable architecture ✤ Working towards interoperable workloads
Storage ✤ Project “Swift” ✤ Elastic “blob” storage ✤ Can
scale to regional or even global deployments ✤ Eventually consistent
Networking ✤ Project “Neutron” (formerly “Quantum”) ✤ Dynamically create and
manage L2/L3 networks ✤ Works with plugins for virtual network devices (OpenVSwitch, others)
Dashboard ✤ Project “Horizon” ✤ Clean, simple user interface ✤
Uses native API to communicate to services
Shared Services ✤ Identity—“Keystone” ✤ Image—“Glance” ✤ Telemetry—“Ceilometer” ✤ Orchestration—“Heat”
Other Projects ✤ OpenStack-SDKs ✤ Savanna—Hadoop provisioning ✤ Trove—Database ✤
Bare metal—Ironic ✤ Queue—Marconi
How to interact with OpenStack ✤ Control panel ✤ Command
line client ✤ cURL ✤ SDK
First Q&A
Resources ✤ http://github.com/rackspace/php-opencloud ✤ http://developer.rackspace.com/ ✤ http://docs.openstack.org/
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
Example 1. Create a server
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') ));
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"); }
1.3 Image print "Getting an image...\n"; $centos = $compute->image('85019bd8-fb5d-4230-b3bc-63b192800f28');
1.4 Flavor print "Getting a flavor...\n"; $flavor = $compute->flavor('performance1-1');
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) ) ));
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)); }
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);
1.8 Let's try it out LIVE DEMO
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()); }
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"); }
3.1 create a container // create a container $container =
$storage->createContainer('MidWestPHP'); if ($container === false) $container = $storage-
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+'));
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()); }
Final Q&A
https://github.com/gecampbell/mwphp14
Let's keep in touch ✤
[email protected]
✤ Twitter: @glenc ✤
http://developer.rackspace.com