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{CLOUDSERVERS_USER} if exists $ENV{CLOUDSERVERS_USER};
12 confess "Need api_username or CLOUDSERVERS_USER in environment";
15 has 'api_password' => ( is => 'ro', isa => 'Str', required => 1, default => sub {
16 return $ENV{CLOUDSERVERS_KEY} if exists $ENV{CLOUDSERVERS_KEY};
17 confess "Need api_password or CLOUDSERVERS_KEY in environment";
20 has '_rs' => ( is => 'rw', isa => 'Net::RackSpace::CloudServers', default => sub {
22 my $rs = Net::RackSpace::CloudServers->new(
23 user => $self->api_username,
24 key => $self->api_password,
31 # get api username and key from config?
32 my $config = $self->config;
42 # Do nothing if the server named $self->name already exists
43 return if scalar grep { $_->name eq $self->name } $self->_rs->get_server();
45 # Check the ssh pub key exists and is <10K
46 confess "SSH pubkey needs to exist" if !-f $self->pub_ssh;
49 open my $fh, '<', $self->pub_ssh or die "Cannot open ", $self->pub_ssh, ": $!";
51 close $fh or die "Cannot close ", $self->pub_ssh, ": $!";
54 confess "SSH pubkey needs to be < 10KiB" if length $pub_ssh > 10*1024;
57 my $server = Net::RackSpace::CloudServers::Server->new(
58 cloudservers => $self->_cs,
60 flavor => $self->size,
61 image => $self->image,
64 path => $self->pub_ssh,
65 contents => encode_base64($pub_ssh),
69 $server->create_server;
71 warn "Server public IP is: ", ($server->public_address)[0], "\n";
72 warn "Server root password: ", $server->adminpass, "\n";
74 # Connect to server and execute installation routines?
81 # Die if the server named $self->name already exists
82 my ($server) = grep { $_->name eq $self->name } $self->_rs->get_server();
83 confess "No such server: ", $self->name if !$server;
86 $server->delete_server();
101 Oyster::Provision::Rackspace -- Provision your Oyster on Rackspace
105 Use the Rackspace backend on your Oyster configuration file
107 =head1 REQUIRED PARAMETERS
109 The following are required to instantiate a backend:
115 The rackspace API username, or C<$ENV{RACKSPACE_USER}> will be used if that is
120 This is your rackspace API Key
122 The rackspace API key, or C<$ENV{RACKSPACE_KEY}> will be used if that is not
127 The name of your new/existing rackspace server.
131 The size ID of the rackspace server you want to create.
132 Use the following incantation to see them:
134 perl -MNet::RackSpace::CloudServers -e'
135 $r=Net::RackSpace::CloudServers->new(
136 user=>$ENV{CLOUDSERVERS_USER},
137 key=>$ENV{CLOUDSERVERS_KEY},
140 { "id $_->{id} ram $_->{ram} disk $_->{disk}\n" }
141 $r->get_flavor_detail
145 id 3 ram 1024 disk 40
146 id 4 ram 2048 disk 80
147 id 5 ram 4096 disk 160
148 id 6 ram 8192 disk 320
149 id 7 ram 15872 disk 620
153 The image ID of the rackspace server you want to create.
154 Use the following incantation to see them:
156 perl -MNet::RackSpace::CloudServers -e'
157 $r=Net::RackSpace::CloudServers->new(
158 user=>$ENV{CLOUDSERVERS_USER},
159 key=>$ENV{CLOUDSERVERS_KEY},
162 { "id $_->{id} name $_->{name}\n" }
165 id 29 name Windows Server 2003 R2 SP2 x86
166 id 69 name Ubuntu 10.10 (maverick)
167 id 41 name Oracle EL JeOS Release 5 Update 3
168 id 40 name Oracle EL Server Release 5 Update 4
169 id 187811 name CentOS 5.4
170 id 4 name Debian 5.0 (lenny)
171 id 10 name Ubuntu 8.04.2 LTS (hardy)
172 id 23 name Windows Server 2003 R2 SP2 x64
173 id 24 name Windows Server 2008 SP2 x64
174 id 49 name Ubuntu 10.04 LTS (lucid)
175 id 14362 name Ubuntu 9.10 (karmic)
176 id 62 name Red Hat Enterprise Linux 5.5
180 id 31 name Windows Server 2008 SP2 x86
181 id 51 name CentOS 5.5
182 id 14 name Red Hat Enterprise Linux 5.4
183 id 19 name Gentoo 10.1
184 id 28 name Windows Server 2008 R2 x64
185 id 55 name Arch 2010.05
187 Oyster only supports Linux images, specifically
188 Ubuntu 10.10 (maverick).
192 The public ssh key you would like copied to the
193 new server's C</root/.ssh/authorized_keys> file
194 to allow you to ssh in the box without providing