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
320
1
Share
OpenStack and PHP
An introduction to OpenStack and how to access it using PHP.
Glen Campbell
March 15, 2014
More Decks by Glen Campbell
See All by Glen Campbell
Cache Strategies for Web Apps
gecampbell
0
410
Succeeding at Open Source
gecampbell
0
120
Cache strategies for microservice-based web apps
gecampbell
1
4.6k
OpenStack: the good, the bad, and the ugly
gecampbell
0
240
Open-Source in the Real World
gecampbell
1
230
The Future of PHP is in the Clouds
gecampbell
0
48
Other Decks in Programming
See All in Programming
色即是空、空即是色、データサイエンス
kamoneggi
1
200
LLM Plugin for Node-REDの利用方法と開発について
404background
0
120
デフォルト運用のCodeRabbit、1年で何が変わったか / How CodeRabbit Changed Our Code Review in 1 Year
bake0937
1
110
Inspired By RubyKaigi (EN)
atzzcokek
0
120
誰も頼んでない機能を出荷した話
zekutax
0
140
oxlintはeslint/typescript-eslintを置き換えられるのか
shomafujita
2
250
開発とはなにか、Essenceカーネルで見えるもの
ukin0k0
0
210
CLIであることを活かしたGitHub Copilot CLI活用術 / GitHub Copilot CLI Pro Tips & Tricks
nao_mk2
1
1.1k
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
2
740
Stage 3 Decorators でできること / できないこと / TSKaigi 2026
susisu
1
1.2k
3Dシーンの圧縮
fadis
1
360
New "Type" system on PicoRuby
pocke
1
210
Featured
See All Featured
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
210
GraphQLとの向き合い方2022年版
quramy
50
15k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
180
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.2k
Practical Orchestrator
shlominoach
191
11k
A designer walks into a library…
pauljervisheath
211
24k
Exploring anti-patterns in Rails
aemeredith
3
370
Making the Leap to Tech Lead
cromwellryan
135
9.8k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
120
エンジニアに許された特別な時間の終わり
watany
107
240k
Raft: Consensus for Rubyists
vanstee
141
7.4k
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