php-opencloud/openstack
PHP OpenStack SDK for connecting to OpenStack APIs from PHP. Simple, idiomatic clients with support for multiple OpenStack services and versions, semantic versioning, and active docs and tests. Requires PHP 7.2.5+ and ext-curl.
Pros:
Service/<version>/ directories, enabling gradual migration paths for OpenStack upgrades.OperatorResource and OperatorTrait for CRUD operations, aligning with Laravel’s Eloquent patterns (e.g., create(), update(), delete()). Models like Compute\Server or BlockStorage\Volume encapsulate business logic (e.g., suspend(), resume()), easing integration with Laravel services/repositories.HandlerStack and Promise utilities, which Laravel’s HTTP client also uses. This enables reuse of middleware (e.g., retries, logging) and async operations.ErrorBuilder) and errorVerbosity flag provide granular control over API failure responses, critical for debugging in production.Cons:
Cache::remember), or queue workers (e.g., dispatch()). Requires manual bridging (e.g., via Illuminate\Support\Facades).Laravel Stack Compatibility:
use Illuminate\Support\Facades\Http;
use OpenStack\OpenStack;
$client = new OpenStack([
'authUrl' => config('openstack.auth_url'),
'username' => config('openstack.username'),
// ... other credentials
]);
$compute = $client->compute();
$this->app->singleton(OpenStack::class, fn() => new OpenStack(config('openstack')));
config() system can centralize OpenStack credentials, reducing hardcoded values in business logic.Database/ORM Synergy:
Volume::find($id) → VolumeModel::find($id)) for hybrid cloud-local data management.HasFactory to generate test VMs for CI pipelines.Queue/Jobs:
dispatch() and retried via retryAfter():
CreateVolumeJob::dispatch($volumeData)->onQueue('openstack');
Authentication Complexity:
Auth::guard('openstack') facade to centralize auth logic.API Versioning:
config/openstack.php and validate during boot.Performance Overhead:
OperatorTrait, execute()). For latency-sensitive ops (e.g., auto-scaling), raw Guzzle calls may outperform the SDK.Error Handling:
errorVerbosity flag must be tuned to avoid logging noise in Laravel’s log() system.App\Exceptions\Handler to normalize OpenStack errors into Laravel exceptions.Key Questions:
segmentIndexFormat and chunking strategies to avoid memory issues in Laravel’s request lifecycle.OperatorTrait can be extended to log requests/responses via Laravel’s Log facade.Laravel Core:
// app/Providers/OpenStackServiceProvider.php
public function register()
{
$this->app->singleton(OpenStack::class, function ($app) {
return new OpenStack([
'authUrl' => $app['config']['openstack.auth_url'],
'credentials' => $app['config']['openstack.credentials'],
]);
});
}
OpenStack facade to simplify SDK usage in controllers/blades:
use Illuminate\Support\Facades\Facade;
class OpenStack extends Facade {
protected static function getFacadeAccessor() { return 'openstack'; }
}
config/openstack.php:
return [
'auth_url' => env('OPENSTACK_AUTH_URL'),
'username' => env('OPENSTACK_USERNAME'),
'password' => env('OPENSTACK_PASSWORD'),
'project_name' => env('OPENSTACK_PROJECT'),
'region' => env('OPENSTACK_REGION', 'RegionOne'),
'services' => [
'compute' => ['version' => '3.65'],
'block_storage' => ['version' => '3.58'],
],
];
Laravel Ecosystem:
CreateServerJob::dispatch().server.created → send Slack notification).Third-Party Packages:
Http facade for shared middleware (e.g., retries, logging).nimbusoft/flysystem-openstack-swift (note: requires SDK v3.13+ fix for json-schema conflicts).Phase 1: Proof of Concept (2–4 weeks)
composer require php-opencloud/openstack.Http::fake() to mock responses.Compute\Server) work end-to-end.Phase 2: Core Services (4–6 weeks)
How can I help you explore Laravel packages today?