1 package Oyster::Provision::Rackspace;
4 use Net::RackSpace::CloudServers;
5 use Net::RackSpace::CloudServers::Server;
10 has 'api_username' => ( is => 'ro', isa => 'Str', required => 1, default => sub {
11 return $ENV{RACKSPACE_USER} if exists $ENV{RACKSPACE_USER};
12 confess "Need api_username or RACKSPACE_USER in environment";
14 has 'api_key' => ( is => 'ro', isa => 'Str', required => 1, default => sub {
15 return $ENV{RACKSPACE_KEY} if exists $ENV{RACKSPACE_KEY};
16 confess "Need api_key or RACKSPACE_KEY in environment";
19 has '_rs' => ( is => 'rw', isa => 'Net::RackSpace::CloudServers', lazy_build => 1, default => sub {
21 my $rs = Net::RackSpace::CloudServers->new(
22 user => $self->api_username,
23 key => $self->api_key,
30 # get api username and key from config?
31 my $config = $self->config;
38 # Do nothing if the server named $self->name already exists
39 return if scalar grep { $_->name eq $self->name } $self->_rs->get_server();
41 # Check the ssh pub key exists and is <10K
42 confess "SSH pubkey needs to exist" if !-f $self->pub_ssh;
45 open my $fh, '<', $self->pub_ssh or die "Cannot open ", $self->pub_ssh, ": $!";
47 close $fh or die "Cannot close ", $self->pub_ssh, ": $!";
50 confess "SSH pubkey needs to be < 10KiB" if length $pub_ssh > 10*1024;
53 my $server = Net::RackSpace::CloudServers::Server->new(
54 cloudservers => $self->_cs,
56 flavor => $self->size,
57 image => $self->image,
60 path => $self->pub_ssh,
61 contents => encode_base64($pub_ssh),
65 $server->create_server;
67 warn "Server public IP is: ", ($server->public_address)[0], "\n";
68 warn "Server root password: ", $server->adminpass, "\n";
70 # Connect to server and execute installation routines?
77 # Die if the server named $self->name already exists
78 my ($server) = grep { $_->name eq $self->name } $self->_rs->get_server();
79 confess "No such server: ", $self->name if !$server;
82 $server->delete_server();
97 Oyster::Provision::Rackspace -- Provision your Oyster on Rackspace
101 Use the Rackspace backend on your Oyster configuration file
103 =head1 REQUIRED PARAMETERS
105 The following are required to instantiate a backend:
111 The rackspace API username, or C<$ENV{RACKSPACE_USER}> will be used if that is
116 The rackspace API key, or C<$ENV{RACKSPACE_KEY}> will be used if that is not
121 The name of your new/existing rackspace server.
125 The size ID of the rackspace server you want to create.
126 Use the following incantation to see them:
128 perl -MNet::RackSpace::CloudServers -e'
129 $r=Net::RackSpace::CloudServers->new(
130 user=>$ENV{CLOUDSERVERS_USER},
131 key=>$ENV{CLOUDSERVERS_KEY},
134 { "id $_->{id} ram $_->{ram} disk $_->{disk}\n" }
135 $r->get_flavor_detail
139 id 3 ram 1024 disk 40
140 id 4 ram 2048 disk 80
141 id 5 ram 4096 disk 160
142 id 6 ram 8192 disk 320
143 id 7 ram 15872 disk 620
147 The image ID of the rackspace server you want to create.
148 Use the following incantation to see them:
150 perl -MNet::RackSpace::CloudServers -e'
151 $r=Net::RackSpace::CloudServers->new(
152 user=>$ENV{CLOUDSERVERS_USER},
153 key=>$ENV{CLOUDSERVERS_KEY},
156 { "id $_->{id} name $_->{name}\n" }
159 id 29 name Windows Server 2003 R2 SP2 x86
160 id 69 name Ubuntu 10.10 (maverick)
161 id 41 name Oracle EL JeOS Release 5 Update 3
162 id 40 name Oracle EL Server Release 5 Update 4
163 id 187811 name CentOS 5.4
164 id 4 name Debian 5.0 (lenny)
165 id 10 name Ubuntu 8.04.2 LTS (hardy)
166 id 23 name Windows Server 2003 R2 SP2 x64
167 id 24 name Windows Server 2008 SP2 x64
168 id 49 name Ubuntu 10.04 LTS (lucid)
169 id 14362 name Ubuntu 9.10 (karmic)
170 id 62 name Red Hat Enterprise Linux 5.5
174 id 31 name Windows Server 2008 SP2 x86
175 id 51 name CentOS 5.5
176 id 14 name Red Hat Enterprise Linux 5.4
177 id 19 name Gentoo 10.1
178 id 28 name Windows Server 2008 R2 x64
179 id 55 name Arch 2010.05
181 Oyster only supports Linux images, specifically
182 Ubuntu 10.10 (maverick).
186 The public ssh key you would like copied to the
187 new server's C</root/.ssh/authorized_keys> file
188 to allow you to ssh in the box without providing