v2 - rebased
https://www.aeolusproject.org/redmine/issues/2803
---
lib/aeolus_cli.rb | 1 +
lib/aeolus_cli/command/config_parser.rb | 24 +++++++++-
lib/aeolus_cli/command/status_command.rb | 45 ++++++++++++++++++
man/aeolus-cli-build.1 | 2 +-
man/aeolus-cli-list.1 | 2 +-
man/aeolus-cli-push.1 | 2 +-
man/aeolus-cli-status.1 | 36 ++++++++++++++
man/aeolus-cli.1 | 4 +-
spec/command/config_parser_spec.rb | 7 +++
spec/command/status_command_spec.rb | 49 ++++++++++++++++++++
spec/spec_helper.rb | 1 +
.../command/status_command/providerimage.yml | 42 +++++++++++++++++
.../command/status_command/targetimage.yml | 38 +++++++++++++++
13 files changed, 247 insertions(+), 6 deletions(-)
create mode 100644 lib/aeolus_cli/command/status_command.rb
create mode 100644 man/aeolus-cli-status.1
create mode 100644 spec/command/status_command_spec.rb
create mode 100644 spec/vcr/cassettes/command/status_command/providerimage.yml
create mode 100644 spec/vcr/cassettes/command/status_command/targetimage.yml
diff --git a/lib/aeolus_cli.rb b/lib/aeolus_cli.rb
index 46dd8e5..a5a6bce 100644
--- a/lib/aeolus_cli.rb
+++ b/lib/aeolus_cli.rb
@@ -20,6 +20,7 @@ require File.join(File.dirname(__FILE__), 'aeolus_cli/command',
'build_command')
require File.join(File.dirname(__FILE__), 'aeolus_cli/command',
'push_command')
require File.join(File.dirname(__FILE__), 'aeolus_cli/command',
'import_command')
require File.join(File.dirname(__FILE__), 'aeolus_cli/command',
'delete_command')
+require File.join(File.dirname(__FILE__), 'aeolus_cli/command',
'status_command')
require File.join(File.dirname(__FILE__), 'aeolus_cli/command',
'config_parser')
require File.join(File.dirname(__FILE__), 'aeolus_cli/model', 'base')
diff --git a/lib/aeolus_cli/command/config_parser.rb
b/lib/aeolus_cli/command/config_parser.rb
index 05e0ed4..e67ffb8 100644
--- a/lib/aeolus_cli/command/config_parser.rb
+++ b/lib/aeolus_cli/command/config_parser.rb
@@ -18,7 +18,7 @@ require 'logger'
module Aeolus
module CLI
class ConfigParser
- COMMANDS = %w(list build push import delete)
+ COMMANDS = %w(list build push import delete status)
attr_accessor :options, :command, :args
def initialize(argv)
@@ -138,9 +138,21 @@ module Aeolus
end
opts.separator ""
+ opts.separator "Status options:"
+ opts.on('-t', '--targetimage ID', 'target image
status') do |id|
+ @options[:subcommand] = :target_image
+ @options[:targetimage] = id
+ end
+ opts.on('-P', '--providerimage ID', 'provider image
status') do |id|
+ @options[:subcommand] = :provider_image
+ @options[:providerimage] = id
+ end
+
+ opts.separator ""
opts.separator "URL with credentials to Conductor are set in
~/.aeolus-cli"
opts.separator "Conductor URL should point to
https://<host_where_conductor_runs>/conductor/api"
+
opts.separator ""
opts.separator "List Examples:"
opts.separator "aeolus-cli list --images # list
available images"
@@ -178,6 +190,11 @@ module Aeolus
opts.separator "aeolus-cli delete --build $build_id #
deletes a build and all associated targetimages"
opts.separator "aeolus-cli delete --targetimage $target_image #
deletes a target image and all associated provider images"
opts.separator "aeolus-cli delete --providerimage $provider_image #
deletes a provider image"
+
+ opts.separator ""
+ opts.separator "Status examples:"
+ opts.separator "aeolus-cli status --targetimage $target_image # status
of target image build"
+ opts.separator "aeolus-cli status --providerimage $provider_image # status
of provider image push"
end
begin
@@ -235,6 +252,11 @@ module Aeolus
delete_command.send(@options[:subcommand])
end
end
+
+ def status
+ status_command = StatusCommand.new(@options)
+ status_command.run
+ end
end
end
end
diff --git a/lib/aeolus_cli/command/status_command.rb
b/lib/aeolus_cli/command/status_command.rb
new file mode 100644
index 0000000..a3f5a6a
--- /dev/null
+++ b/lib/aeolus_cli/command/status_command.rb
@@ -0,0 +1,45 @@
+# Copyright 2011 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#
http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+require 'rest_client'
+
+module Aeolus
+ module CLI
+ class StatusCommand < BaseCommand
+ attr_accessor :console
+ def initialize(opts={}, logger=nil)
+ super(opts, logger)
+ end
+
+ def run
+ begin
+ if @options[:targetimage]
+ ti = Aeolus::CLI::ProviderImage.find(@options[:targetimage])
+ puts "Build Status: " + ti.status
+ elsif @options[:providerimage]
+ pi = Aeolus::CLI::ProviderImage.find(@options[:providerimage])
+ puts "Push Status: " + pi.status
+ else
+ puts "Error: You must specify either a target or provider image to check
their status"
+ quit(1)
+ end
+
+ quit(0)
+ rescue => e
+ handle_exception(e)
+ end
+ end
+ end
+ end
+end
diff --git a/man/aeolus-cli-build.1 b/man/aeolus-cli-build.1
index b3e4332..faf0b74 100644
--- a/man/aeolus-cli-build.1
+++ b/man/aeolus-cli-build.1
@@ -33,4 +33,4 @@ Build a new image for ec2 based on the specified template TDL file
template.tdl
.TP
Martyn Taylor (mtaylor(a)redhat.com), Jason Guiditta (jguiditta(a)redhat.com)
.SH SEE ALSO
-aeolus-cli-list(1), aeolus-cli-push(1), aeolus-cli-import(1)
+aeolus-cli-list(1), aeolus-cli-push(1), aeolus-cli-import(1), aeolus-cli-status(1)
diff --git a/man/aeolus-cli-list.1 b/man/aeolus-cli-list.1
index d8b0dde..40c20ec 100644
--- a/man/aeolus-cli-list.1
+++ b/man/aeolus-cli-list.1
@@ -85,4 +85,4 @@ List all available accounts
.SH AUTHOR
Martyn Taylor (mtaylor(a)redhat.com), Jason Guiditta (jguiditta(a)redhat.com)
.SH SEE ALSO
-aeolus-cli-build(1), aeolus-cli-push(1), aeolus-cli-import(1), aeolus-cli-delete(1)
+aeolus-cli-build(1), aeolus-cli-push(1), aeolus-cli-import(1), aeolus-cli-delete(1),
aeolus-cli-status(1)
diff --git a/man/aeolus-cli-push.1 b/man/aeolus-cli-push.1
index dfc4848..3f86d40 100644
--- a/man/aeolus-cli-push.1
+++ b/man/aeolus-cli-push.1
@@ -40,4 +40,4 @@ Push a target image to each of the specified accounts
.SH AUTHOR
Martyn Taylor (mtaylor(a)redhat.com), Jason Guiditta (jguiditta(a)redhat.com)
.SH SEE ALSO
-aeolus-cli-list(1), aeolus-cli-build(1), aeolus-cli-import(1)
+aeolus-cli-list(1), aeolus-cli-build(1), aeolus-cli-import(1), aeolus-cli-status(1)
diff --git a/man/aeolus-cli-status.1 b/man/aeolus-cli-status.1
new file mode 100644
index 0000000..e283071
--- /dev/null
+++ b/man/aeolus-cli-status.1
@@ -0,0 +1,36 @@
+.TH aeolus-cli 1 "November 23, 2011" "version 0.1" "USER
COMMANDS"
+.SH NAME
+aeolus-cli status \- command for querying build and push status
+.SH SYNOPSIS
+.B aeolus-cli status [\-h|--help] [\-u|--username] [\-w|--password] [\-t|--targetimage
[target-image-id]] [\-P|--providerimage [provider-image-id]]
+.SH DESCRIPTION
+aeolus-cli status command allows users to query for the status of builds and pushes.
+.SH OPTIONS
+.TP
+\-u, --user <username>
+Conductor username
+.TP
+\-w, --password <password>
+Conductor password
+.TP
+\-t, --targetimage
+A target image id to query for build status
+.TP
+\-P, --providerimage
+A provider image id to query for push status
+.TP
+Get usage information for this command and associated commmands
+\-h, --help
+.SH EXAMPLES
+.TP
+Retrieve build status for target image A
+.B aeolus-cli status
+\--targetimage A
+.TP
+Retrieve push status for provider image B
+.B aeolus-cli status
+\--providerimage B
+.TP
+Martyn Taylor (mtaylor(a)redhat.com), Jason Guiditta (jguiditta(a)redhat.com)
+.SH SEE ALSO
+aeolus-cli-list(1), aeolus-cli-build(1), aeolus-cli-push(1), aeolus-cli-import(1)
diff --git a/man/aeolus-cli.1 b/man/aeolus-cli.1
index 8e7dcb0..d10017c 100644
--- a/man/aeolus-cli.1
+++ b/man/aeolus-cli.1
@@ -5,7 +5,7 @@ aeolus-cli \- command line tool for managing aeolus images
.B aeolus-cli
[\-h]
.SH DESCRIPTION
-aeolus-cli is a tool that allows users to control their aeolus images through image
builder and aeolus conductor. aeolus-cli offers four commands options; list, build, push,
import. For more information on each command please run man aeolus-cli <command> or
aeolus-cli --help
+aeolus-cli is a tool that allows users to control their aeolus images through image
builder and aeolus conductor. aeolus-cli offers five commands options; list, build, push,
import, status. For more information on each command please run man aeolus-cli
<command> or aeolus-cli --help
.SH OPTIONS
.TP
\-h, --help
@@ -24,4 +24,4 @@ If setup differs from default one, those should be changed accordingly.
Conducto
.SH AUTHOR
Martyn Taylor (mtaylor(a)redhat.com), Jason Guiditta (jguiditta(a)redhat.com)
.SH SEE ALSO
-aeolus-cli-build(1), aeolus-cli-push(1), aeolus-cli-list(1), aeolus-cli-import(1)
+aeolus-cli-build(1), aeolus-cli-push(1), aeolus-cli-list(1), aeolus-cli-import(1),
aeolus-cli-status(1)
diff --git a/spec/command/config_parser_spec.rb b/spec/command/config_parser_spec.rb
index f4e48ec..7a39c20 100644
--- a/spec/command/config_parser_spec.rb
+++ b/spec/command/config_parser_spec.rb
@@ -83,6 +83,13 @@ module Aeolus
config_parser.options[:build].should == '12345'
end
+ it "should set options hash for valid status options" do
+ config_parser = ConfigParser.new(%w(status --targetimage 789))
+ config_parser.options[:targetimage].should == '789'
+ config_parser = ConfigParser.new(%w(status --providerimage 123))
+ config_parser.options[:providerimage].should == '123'
+ end
+
it "should set options hash for valid import options" do
config_parser = ConfigParser.new(%w(import --provider ec2-us-east-1a
--description /path/to/file --id ami-123456 --target ec2))
config_parser.options[:provider].should == ['ec2-us-east-1a']
diff --git a/spec/command/status_command_spec.rb b/spec/command/status_command_spec.rb
new file mode 100644
index 0000000..ab4f119
--- /dev/null
+++ b/spec/command/status_command_spec.rb
@@ -0,0 +1,49 @@
+# Copyright 2011 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#
http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+require 'spec_helper'
+
+module Aeolus
+ module CLI
+ describe StatusCommand do
+ it "should return status for target image" do
+ VCR.use_cassette('command/status_command/targetimage') do
+ @options[:targetimage] = ['1a0b179b-eb8a-4ce5-96e5-2b01ef2089cb']
+
+ s = StatusCommand.new(@options, @output)
+ begin
+ s.run
+ rescue SystemExit => e
+ e.status.should == 0
+ end
+ $stdout.string.should include("Build Status: FAILED")
+ end
+ end
+
+ it "should return status for provider image" do
+ VCR.use_cassette('command/status_command/providerimage') do
+ @options[:providerimage] = ['1ad1ca1d-d6d8-4892-a255-c4d49c03ed9b']
+
+ s = StatusCommand.new(@options, @output)
+ begin
+ s.run
+ rescue SystemExit => e
+ e.status.should == 0
+ end
+ $stdout.string.should include("Push Status: COMPLETE")
+ end
+ end
+ end
+ end
+end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 7cb20ca..1c20c7a 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -32,6 +32,7 @@ require 'build_command'
require 'push_command'
require 'import_command'
require 'delete_command'
+require 'status_command'
require 'vcr_setup'
diff --git a/spec/vcr/cassettes/command/status_command/providerimage.yml
b/spec/vcr/cassettes/command/status_command/providerimage.yml
new file mode 100644
index 0000000..3aba6f6
--- /dev/null
+++ b/spec/vcr/cassettes/command/status_command/providerimage.yml
@@ -0,0 +1,42 @@
+---
+- !ruby/struct:VCR::HTTPInteraction
+ request: !ruby/struct:VCR::Request
+ method: :get
+ uri:
https://admin:password@localhost:443/conductor/api/provider_images/1ad1ca...
+ body:
+ headers:
+ accept:
+ - application/xml
+ response: !ruby/struct:VCR::Response
+ status: !ruby/struct:VCR::ResponseStatus
+ code: 200
+ message: OK
+ headers:
+ x-ua-compatible:
+ - IE=Edge,chrome=1
+ etag:
+ - "\"f06d14fc7ff951eef3ca560ad60f380d\""
+ content-type:
+ - application/xml; charset=utf-8
+ server:
+ - thin 1.2.11 codename Bat-Shit Crazy
+ date:
+ - Tue, 22 Nov 2011 23:47:13 GMT
+ x-runtime:
+ - "0.273658"
+ set-cookie:
+ -
_session_id=BAh7CCIPc2Vzc2lvbl9pZCIlNDY1OWU3YzgxNGZkOWQ4ZmY1ZDE5MzVkY2VhYzA4ZmYiGXdhcmRlbi51c2VyLnVzZXIua2V5aQYiEGJyZWFkY3J1bWJzWwA%3D--661d13e5a47633d15df8970235041aea2a860b31;
path=/; HttpOnly
+ cache-control:
+ - max-age=0, private, must-revalidate
+ transfer-encoding:
+ - chunked
+ body: |+
+ <provider_image
href='https://localhost/conductor/api/provider_images/1ad1ca1d-d6d8-4892-a255-c4d49c03ed9b'
id='1ad1ca1d-d6d8-4892-a255-c4d49c03ed9b'>
+ <object_type>provider_image</object_type>
+
<target_identifier>Mock_mock_1ad1ca1d-d6d8-4892-a255-c4d49c03ed9b</target_identifier>
+ <status>COMPLETE</status>
+ <provider>mock</provider>
+ <target_image
href='https://localhost/conductor/api/target_images/31a7fee4-37de-42ac-a573-2ab844145698'
id='31a7fee4-37de-42ac-a573-2ab844145698'></target_image>
+ </provider_image>
+
+ http_version: "1.1"
diff --git a/spec/vcr/cassettes/command/status_command/targetimage.yml
b/spec/vcr/cassettes/command/status_command/targetimage.yml
new file mode 100644
index 0000000..3e77a6d
--- /dev/null
+++ b/spec/vcr/cassettes/command/status_command/targetimage.yml
@@ -0,0 +1,38 @@
+---
+- !ruby/struct:VCR::HTTPInteraction
+ request: !ruby/struct:VCR::Request
+ method: :get
+ uri:
https://admin:password@localhost:443/conductor/api/provider_images/1a0b17...
+ body:
+ headers:
+ accept:
+ - application/xml
+ response: !ruby/struct:VCR::Response
+ status: !ruby/struct:VCR::ResponseStatus
+ code: 200
+ message: OK
+ headers:
+ x-ua-compatible:
+ - IE=Edge,chrome=1
+ etag:
+ - "\"a61cb9f4c82824a7fe5c8107f167cff1\""
+ content-type:
+ - application/xml; charset=utf-8
+ server:
+ - thin 1.2.11 codename Bat-Shit Crazy
+ date:
+ - Tue, 22 Nov 2011 23:45:27 GMT
+ x-runtime:
+ - "0.049840"
+ set-cookie:
+ -
_session_id=BAh7CCIPc2Vzc2lvbl9pZCIlNjBhMDU4NTY2MWI2MGRjMWNlNjI2ZmY4YTFkYjQ2ODAiGXdhcmRlbi51c2VyLnVzZXIua2V5aQYiEGJyZWFkY3J1bWJzWwA%3D--ecfe1e213920f3ba82c9b9c191118ee60d03f44c;
path=/; HttpOnly
+ cache-control:
+ - max-age=0, private, must-revalidate
+ transfer-encoding:
+ - chunked
+ body: |+
+ <provider_image
href='https://localhost/conductor/api/provider_images/1a0b179b-eb8a-4ce5-96e5-2b01ef2089cb'
id='1a0b179b-eb8a-4ce5-96e5-2b01ef2089cb'>
+ <status>FAILED</status>
+ </provider_image>
+
+ http_version: "1.1"
--
1.7.6.4