From 8f262e5e5b55f2249147b33e33ad705a5d7062ef Mon Sep 17 00:00:00 2001 From: Naveed Massjouni Date: Sat, 14 Jan 2012 06:00:50 -0500 Subject: [PATCH] Can now show or delete a server by name in oscompute. --- Changes | 3 ++ bin/oscompute | 46 ++++++++++++++++++++---------- dist.ini | 2 +- lib/Net/OpenStack/Compute.pm | 54 ++++++++++++++++++++++++++++++------ 4 files changed, 80 insertions(+), 25 deletions(-) diff --git a/Changes b/Changes index 6c85b6b..c54df88 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,8 @@ Revision history for Net-OpenStack-Compute +1.0400 2012-01-14 + Can now show or delete a server by name in oscompute. + 1.0302 2012-01-03 Added token() and base_url() methods. diff --git a/bin/oscompute b/bin/oscompute index 148e60f..c9569d6 100644 --- a/bin/oscompute +++ b/bin/oscompute @@ -23,21 +23,21 @@ sub setup { Server commands: server [list] - server show [] + server show server create - server delete + server delete Image commands: image [list] - image show [] + image show image create image delete Flavor commands: flavor [list] - flavor show [] + flavor show EOD my $msg = "%s env var is missing. Did you forget to source novarc?\n"; @@ -72,9 +72,12 @@ sub server { } when ('show') { die "Usage: $0 server show \n" unless @args == 1; - my $s = $compute->get_server($args[0]); + my $id = $args[0]; + my $s = $compute->get_server($id); + $s = $compute->get_servers_by_name($id)->[0] unless $s; + return 'No such server' unless $s; return _to_json($s) if $c->options->{verbose}; - return $s ? _format_servers($s) : 'No such server'; + return _format_servers($s); } when ('create') { die "Usage: $0 server create \n" @@ -88,8 +91,12 @@ sub server { when ('delete') { die "Usage: $0 server delete \n" unless @args == 1; my ($id) = @args; - $compute->delete_server($id); - return "Server $id has been marked for deletion"; + if (not $compute->delete_server($id)) { + my $s = $compute->get_servers_by_name($id)->[0]; + return "Could not delete server $id" + unless $s and $compute->delete_server($s->{id}); + } + return "Server $id has been marked for deletion."; } default { die "Supported server commands are list, show, create and delete." @@ -220,25 +227,34 @@ sub _to_json { Usage: oscompute command [arguments] Available Commands: - flavor flavor [--verbose|-v] [show []] + f alias for flavor + flavor perform flavor actions help show syntax and available commands - image image [--verbose|-v] [show []] [create ] [delete ] - server server [--verbose|-v] [show []] [create ] [delete ] + i alias for image + image perform image actions + s alias for server + server perform server actions Examples: # List all servers. + oscompute s + + # Same thing. oscompute server # Same thing. - oscompute server show + oscompute server list # Show all details. - oscompute server -v show + oscompute server -v list - # Show info for a particular server. + # Show info for a particular server by id. oscompute server show ec05b52e-f575-469c-a91e-7f0ddd4fab95 + # Show info for a particular server by name. + oscompute server show bob + # Create a new server. # Order of arguments are server create `name` `flavor` `image` oscompute server create bob 1 11b2a5bf-590c-4dd4-931f-a65751a4db0e @@ -247,7 +263,7 @@ sub _to_json { oscompute server delete ec05b52e-f575-469c-a91e-7f0ddd4fab95 # List all available images. - oscompute image + oscompute image list # Create a snapshot image of a given server. oscompute image create myimg ec05b52e-f575-469c-a91e-7f0ddd4fab95 diff --git a/dist.ini b/dist.ini index 99ba259..52c8cad 100644 --- a/dist.ini +++ b/dist.ini @@ -4,7 +4,7 @@ license = Perl_5 copyright_holder = Naveed Massjouni copyright_year = 2011 -version = 1.0302 +version = 1.0400 [Prereqs] Any::Moose = 0 diff --git a/lib/Net/OpenStack/Compute.pm b/lib/Net/OpenStack/Compute.pm index 33a424c..a6ea64c 100644 --- a/lib/Net/OpenStack/Compute.pm +++ b/lib/Net/OpenStack/Compute.pm @@ -52,9 +52,16 @@ sub get_servers { sub get_server { my ($self, $id) = @_; my $res = $self->_ua->get($self->_url("/servers/$id")); + return undef unless $res->is_success; return from_json($res->content)->{server}; } +sub get_servers_by_name { + my ($self, $name) = @_; + my $servers = $self->get_servers(detail => 1); + return [ grep { $_->{name} eq $name } @$servers ]; +} + sub create_server { my ($self, %params) = @_; my ($name, $flavor, $image) = @params{qw(name flavor image)}; @@ -81,8 +88,7 @@ sub delete_server { my ($self, $id) = @_; my $req = HTTP::Request->new(DELETE => $self->_url("/servers/$id")); my $res = $self->_ua->request($req); - _check_res($res); - return 1; + return $res->is_success; } sub get_images { @@ -147,7 +153,7 @@ sub _url { sub _check_res { croak $_[0]->content unless $_[0]->is_success } -# ABSTRACT: Bindings for the OpenStack compute api. +# ABSTRACT: Bindings for the OpenStack Compute API. =head1 SYNOPSIS @@ -163,9 +169,8 @@ sub _check_res { croak $_[0]->content unless $_[0]->is_success } =head1 DESCRIPTION -This is the main class responsible for interacting with OpenStack Compute. -Also see L for the command line tool that is a wrapper for this -class. +This class is an interface to the OpenStack Compute API. +Also see the L command line tool. =head1 METHODS @@ -173,10 +178,20 @@ class. get_server($id) +Returns the server with the given id or undef if it doesn't exist. + =head2 get_servers get_servers() - get_servers(detail => 0) # Detail defaults to 1. + get_servers(detail => 1) # Detail defaults to 0. + +Returns an arrayref of all the servers. + +=head2 get_servers_by_name + + get_servers_by_name($name) + +Returns an arrayref of servers with the given name. =head2 create_server @@ -193,7 +208,7 @@ class. =head2 get_images get_images() - get_images(detail => 0) # Detail defaults to 1. + get_images(detail => 1) # Detail defaults to 0. =head2 create_image @@ -210,7 +225,28 @@ class. =head2 get_flavors get_flavors() - get_flavors(detail => 0) # Detail defaults to 1. + get_flavors(detail => 1) # Detail defaults to 0. + +=head2 token + + token() + +Returns the OpenStack Compute API auth token. + +=head2 base_url + + base_url() + +Returns the base url for the OpenStack Compute API, which is returned by the +server after authenticating. + +=head1 SEE ALSO + +=over + +=item L + +=back =cut