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
280
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
380
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
200
Open-Source in the Real World
gecampbell
1
190
The Future of PHP is in the Clouds
gecampbell
0
38
Other Decks in Programming
See All in Programming
dynamic!
moro
9
6.5k
メモリ不足との戦い〜大量データを扱うアプリでの実践例〜
kwzr
1
860
Breaking Up with Big ViewModels — Without Breaking Your Architecture (droidcon Berlin 2025)
steliosf
PRO
1
330
Conquering Massive Traffic Spikes in Ruby Applications with Pitchfork
riseshia
0
150
猫と暮らすネットワークカメラ生活🐈 ~Vision frameworkでペットを愛でよう~ / iOSDC Japan 2025
yutailang0119
0
220
なぜGoのジェネリクスはこの形なのか? Featherweight Goが明かす設計の核心
ryotaros
7
1k
2分台で1500examples完走!爆速CIを支える環境構築術 - Kaigi on Rails 2025
falcon8823
3
3.1k
デミカツ切り抜きで面倒くさいことはPythonにやらせよう
aokswork3
0
190
Swift Concurrency - 状態監視の罠
objectiveaudio
2
450
Django Ninja による API 開発効率化とリプレースの実践
kashewnuts
0
930
高度なUI/UXこそHotwireで作ろう Kaigi on Rails 2025
naofumi
4
3.5k
Let's Write a Train Tracking Algorithm
twocentstudios
0
220
Featured
See All Featured
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.1k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.7k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
9
580
We Have a Design System, Now What?
morganepeng
53
7.8k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
A Modern Web Designer's Workflow
chriscoyier
697
190k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.1k
Navigating Team Friction
lara
189
15k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6.1k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.7k
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