aeolus-image 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +62 -0
- data/bin/aeolus-image +6 -0
- data/examples/aeolus-cli +9 -0
- data/examples/custom_repo.tdl +18 -0
- data/examples/image_description.xml +3 -0
- data/examples/tdl.rng +207 -0
- data/lib/base_command.rb +134 -0
- data/lib/build_command.rb +68 -0
- data/lib/config_parser.rb +212 -0
- data/lib/delete_command.rb +9 -0
- data/lib/import_command.rb +44 -0
- data/lib/list_command.rb +141 -0
- data/lib/push_command.rb +72 -0
- data/man/aeolus-image-build.1 +36 -0
- data/man/aeolus-image-import.1 +57 -0
- data/man/aeolus-image-list.1 +80 -0
- data/man/aeolus-image-push.1 +40 -0
- data/man/aeolus-image.1 +16 -0
- data/spec/base_command_spec.rb +76 -0
- data/spec/build_command_spec.rb +63 -0
- data/spec/config_parser_spec.rb +82 -0
- data/spec/fixtures/invalid_template.tdl +18 -0
- data/spec/fixtures/valid_template.tdl +18 -0
- data/spec/import_command_spec.rb +43 -0
- data/spec/list_command_spec.rb +21 -0
- data/spec/push_command_spec.rb +56 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +52 -0
- metadata +155 -0
data/lib/push_command.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'rest_client'
|
2
|
+
|
3
|
+
module Aeolus
|
4
|
+
module Image
|
5
|
+
class PushCommand < BaseCommand
|
6
|
+
attr_accessor :console
|
7
|
+
def initialize(opts={}, logger=nil)
|
8
|
+
super(opts, logger)
|
9
|
+
default = {
|
10
|
+
:provider => [],
|
11
|
+
:id => '',
|
12
|
+
:build => ''
|
13
|
+
}
|
14
|
+
@options = default.merge(@options)
|
15
|
+
@console = ImageFactoryConsole.new()
|
16
|
+
@console.start
|
17
|
+
end
|
18
|
+
def run
|
19
|
+
begin
|
20
|
+
if combo_implemented?
|
21
|
+
if !@options[:id].empty? && pushed?(@options[:id])
|
22
|
+
puts "ERROR: This image has already been pushed, to push to another provider please push via build-id rather than image-id"
|
23
|
+
puts "e.g. aeolus-image push --provider <provider> --build <build-id>"
|
24
|
+
quit(1)
|
25
|
+
end
|
26
|
+
|
27
|
+
sleep(5)
|
28
|
+
@console.push(@options[:provider], get_creds, @options[:id], @options[:build]).each do |adaptor|
|
29
|
+
puts ""
|
30
|
+
puts "Provider Image: #{adaptor.image_id}"
|
31
|
+
puts "Image: #{adaptor.image}"
|
32
|
+
puts "Build: #{adaptor.build}"
|
33
|
+
puts "Status: #{adaptor.status}"
|
34
|
+
puts "Percent Complete: #{adaptor.percent_complete}"
|
35
|
+
end
|
36
|
+
quit(0)
|
37
|
+
end
|
38
|
+
rescue
|
39
|
+
puts "An Error occured whilst trying to push this build, please check aeolus-image --help for details on how to use this command"
|
40
|
+
quit(1)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def get_creds
|
45
|
+
conductor['provider_accounts'].get
|
46
|
+
end
|
47
|
+
|
48
|
+
def combo_implemented?
|
49
|
+
if @options[:provider].empty? || (@options[:build].empty? && @options[:id].empty?)
|
50
|
+
puts "This combination of parameters is not currently supported"
|
51
|
+
quit(1)
|
52
|
+
end
|
53
|
+
true
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
def quit(code)
|
58
|
+
@console.shutdown
|
59
|
+
exit(code)
|
60
|
+
end
|
61
|
+
|
62
|
+
def pushed?(image)
|
63
|
+
begin
|
64
|
+
uuid = Regexp.new('[\w]{8}[-][\w]{4}[-][\w]{4}[-][\w]{4}[-][\w]{12}')
|
65
|
+
uuid.match(iwhd["/images/" + image + "/latest_unpushed"].get).nil? ? true : false
|
66
|
+
rescue
|
67
|
+
true
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
.TH aeolus-image 1 "July 07, 2011" "version 0.4" "USER COMMANDS"
|
2
|
+
.SH NAME
|
3
|
+
aeolus-image build \- command for building aeolus images
|
4
|
+
.SH SYNOPSIS
|
5
|
+
.B aeolus-image build [\-h|--help] [\-u|--username] [\-w|--password] [\-I|--image [image-id]] [\-e|--template [path-to-template]] [\-t|--targets [targets]] [\-d|--daemon]
|
6
|
+
.SH DESCRIPTION
|
7
|
+
aeolus-image build command allows users to build new images based on a given TDL template file for a set of specified targets such e.g. EC2, RHEVM etc...
|
8
|
+
.SH OPTIONS
|
9
|
+
.TP
|
10
|
+
\-u, --user <username>
|
11
|
+
Conductor username
|
12
|
+
.TP
|
13
|
+
\-w, --password <password>
|
14
|
+
Conductor password
|
15
|
+
.TP
|
16
|
+
\-T, --target
|
17
|
+
Provide a list of targets for the build
|
18
|
+
.TP
|
19
|
+
\-e, --template
|
20
|
+
Provide path to a TDL template file for building against
|
21
|
+
.TP
|
22
|
+
\-d, --daemon
|
23
|
+
Run as a background process
|
24
|
+
.TP
|
25
|
+
Get usage information for this command and associated commmands
|
26
|
+
\-h, --help
|
27
|
+
.SH EXAMPLES
|
28
|
+
.TP
|
29
|
+
Build a new image for ec2 based on the specified template TDL file template.tdl
|
30
|
+
.B aeolus-image build
|
31
|
+
\--targets ec2
|
32
|
+
\--template ./template.tdl
|
33
|
+
.TP
|
34
|
+
Martyn Taylor (mtaylor@redhat.com), Jason Guiditta (jguiditta@redhat.com)
|
35
|
+
.SH SEE ALSO
|
36
|
+
aeolus-image-list(1), aeolus-image-push(1), aeolus-image-import(1)
|
@@ -0,0 +1,57 @@
|
|
1
|
+
.TH aeolus-image 1 "July 07, 2011" "version 0.4" "USER COMMANDS"
|
2
|
+
.SH NAME
|
3
|
+
aeolus-image import \- command for importing existing provider images into aeolus
|
4
|
+
.SH SYNOPSIS
|
5
|
+
.B aeolus-image import [\-h|--help] [\-u|--username] [\-w|--password] [\-r|--provider [provider-name]] [\--id [provider-image-id]] [--description [path-to-file|xml string]] [\T|--target [target]] [\-d|--daemon]
|
6
|
+
.SH DESCRIPTION
|
7
|
+
aeolus-image import allows users to import pre-existing images that exist in cloud provders for example AMI from EC2, into aeolus.
|
8
|
+
.SH OPTIONS
|
9
|
+
.TP
|
10
|
+
\-u, --user <username>
|
11
|
+
Conductor username
|
12
|
+
.TP
|
13
|
+
\-w, --password <password>
|
14
|
+
Conductor password
|
15
|
+
.TP
|
16
|
+
\-r, --provider <provider-name>
|
17
|
+
The provider name as it exists in conductor from where the importing image resides
|
18
|
+
.TP
|
19
|
+
\--id <provider-image-id>
|
20
|
+
The providers ID given to the importing image
|
21
|
+
.TP
|
22
|
+
\-T, --target
|
23
|
+
The target type for the given provider
|
24
|
+
.TP
|
25
|
+
\--description <path-to-xml-description|xml string>
|
26
|
+
A user defined description to associate with the importing image
|
27
|
+
.TP
|
28
|
+
\-d, --daemon
|
29
|
+
Run as a background process
|
30
|
+
.TP
|
31
|
+
Get usage information for this command and associated commmands
|
32
|
+
\-h, --help
|
33
|
+
.SH EXAMPLES
|
34
|
+
.TP
|
35
|
+
Import the AMI ami-1234567 from the provider ec2-us-east-1 into aeolus
|
36
|
+
.B aeolus-image import
|
37
|
+
\--provider ec2-us-east-1
|
38
|
+
\--target ec2
|
39
|
+
\--id ami-1234567
|
40
|
+
.TP
|
41
|
+
Import the AMI ami-1234567 from the provider ec2-us-west-1 into aeolus with a given xml description
|
42
|
+
.B aeolus-image import
|
43
|
+
\--provider ec2-us-west-1
|
44
|
+
\--target ec2
|
45
|
+
\--id ami-1234567
|
46
|
+
\--description '<image><name>myAMI</name></image>'
|
47
|
+
.TP
|
48
|
+
Import the AMI ami-1234567 from the provider ec2-us-west-1 into aeolus providing a path to the description XML file
|
49
|
+
.B aeolus-image import
|
50
|
+
\--provider ec2-us-west-1
|
51
|
+
\--target ec23
|
52
|
+
\--id ami-1234567
|
53
|
+
\--description /foo/bar/description.xml
|
54
|
+
.SH AUTHOR
|
55
|
+
Martyn Taylor (mtaylor@redhat.com), Jason Guiditta (jguiditta@redhat.com)
|
56
|
+
.SH SEE ALSO
|
57
|
+
aeolus-image-list(1), aeolus-image-push(1), aeolus-image-build(1)
|
@@ -0,0 +1,80 @@
|
|
1
|
+
.TH aeolus-image 1 "July 07, 2011" "version 0.4" "USER COMMANDS"
|
2
|
+
.SH NAME
|
3
|
+
aeolus-image \- command for listing aeolus image associated objects.
|
4
|
+
.SH SYNOPSIS
|
5
|
+
.B aeolus-image list [\-h|--help] [\-u|--username] [\-w|--password] [\-i|--images] [\-b|--builds [image id]] [\-t|--targetimages [build id]] [\-g|--targets] [\-a|--accounts] [\-p|--providers]
|
6
|
+
.SH DESCRIPTION
|
7
|
+
aeolus-image list commands allows users to list information on the contents of particular objects in image warehouse including:
|
8
|
+
.P
|
9
|
+
images: high level image representation associated with underlying provider and target images
|
10
|
+
.br
|
11
|
+
builds: an object representation of a particular build that has taken place for a high level image
|
12
|
+
.br
|
13
|
+
targets: particular targets available to build against, for example 'ec2'
|
14
|
+
.br
|
15
|
+
targetimages: represents builds of particular image against a target. For example building against target 'ec2' would create an AMI specific image
|
16
|
+
.br
|
17
|
+
providerimages: represents the actual images that have been uploaded to a provider. Similiar to a target image but specific to a particular provider
|
18
|
+
.SH OPTIONS
|
19
|
+
.TP
|
20
|
+
\-u, --user <username>
|
21
|
+
Conductor username
|
22
|
+
.TP
|
23
|
+
\-w, --password <password>
|
24
|
+
Conductor password
|
25
|
+
Get usage information for this command and associated commmands
|
26
|
+
.TP
|
27
|
+
\-i, --images
|
28
|
+
Retrieve a list of images
|
29
|
+
.TP
|
30
|
+
\-b, --builds <image id>
|
31
|
+
Retrieve the builds of an image
|
32
|
+
.TP
|
33
|
+
\-t, --targetimages <build id>
|
34
|
+
Retrieve the target images from a build
|
35
|
+
.TP
|
36
|
+
\-P, --providerimages
|
37
|
+
Retrieve the provider images from a target image
|
38
|
+
.TP
|
39
|
+
\-g, --targets
|
40
|
+
Retrieve a list of available targets
|
41
|
+
.TP
|
42
|
+
\-p, --providers
|
43
|
+
Retrieve a list of available providers
|
44
|
+
.TP
|
45
|
+
\-a, --accounts
|
46
|
+
Retrieve a list of available accounts
|
47
|
+
.TP
|
48
|
+
\-d, --daemon
|
49
|
+
Run as a background process
|
50
|
+
.TP
|
51
|
+
\-h, --help
|
52
|
+
.SH EXAMPLES
|
53
|
+
.TP
|
54
|
+
List all images
|
55
|
+
.B aeolus-image list
|
56
|
+
\--images
|
57
|
+
.TP
|
58
|
+
List all builds for an image with id: 12345678-aaaa-1234--1234567890ab
|
59
|
+
.B aeolus-image list
|
60
|
+
\--builds 12345678-aaaa-1234--1234567890ab
|
61
|
+
.TP
|
62
|
+
List all target images for a given build with id: 12345678-bbbb-1234--1234567890ab
|
63
|
+
.B aeolus-image list
|
64
|
+
\--builds 12345678-bbbb-1234--1234567890ab
|
65
|
+
.TP
|
66
|
+
List all available targets
|
67
|
+
.B aeolus-image list
|
68
|
+
\--targets
|
69
|
+
.TP
|
70
|
+
List all available providers
|
71
|
+
.B aeolus-image list
|
72
|
+
\--providers
|
73
|
+
.TP
|
74
|
+
List all available accounts
|
75
|
+
.B aeolus-image list
|
76
|
+
\--account
|
77
|
+
.SH AUTHOR
|
78
|
+
Martyn Taylor (mtaylor@redhat.com), Jason Guiditta (jguiditta@redhat.com)
|
79
|
+
.SH SEE ALSO
|
80
|
+
aeolus-image-build(1), aeolus-image-push(1), aeolus-image-import(1), aeolus-image-delete(1)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
.TH aeolus-image 1 "July 07, 2011" "version 0.4" "USER COMMANDS"
|
2
|
+
.SH NAME
|
3
|
+
aeolus-image push \- command for pushing aeolus images to back end providers
|
4
|
+
.SH SYNOPSIS
|
5
|
+
.B aeolus-image push [\-h|--help] [\-u|--username] [\-w|--password] [\-id [image-id]] [-r|--provider [provider-name]]
|
6
|
+
.SH DESCRIPTION
|
7
|
+
aeolus-image push allows users to push built images to a particular backend provider
|
8
|
+
.SH OPTIONS
|
9
|
+
.TP
|
10
|
+
\-u, --user <username>
|
11
|
+
Conductor username
|
12
|
+
.TP
|
13
|
+
\-w, --password <password>
|
14
|
+
Conductor password
|
15
|
+
.TP
|
16
|
+
\-r|--provider
|
17
|
+
The provider name this image should be pushed to
|
18
|
+
.TP
|
19
|
+
\--id <id>
|
20
|
+
The id of the image for pushing
|
21
|
+
.TP
|
22
|
+
\-d, --daemon
|
23
|
+
Run as a background process
|
24
|
+
.TP
|
25
|
+
Get usage information for this command and associated commmands
|
26
|
+
\-h, --help
|
27
|
+
.SH EXAMPLES
|
28
|
+
.TP
|
29
|
+
Initial push of an image with id 12345678-bbbb-1234--1234567890ab to provider ec2-us-east-1
|
30
|
+
.B aeolus-image push
|
31
|
+
\--id 12345678-bbbb-1234--1234567890ab
|
32
|
+
\--provider ec2-us-east-1
|
33
|
+
Push a build with id 12345678-bbbb-1234--1234567890ab to provider ec2-us-east-1
|
34
|
+
.B aeolus-image push
|
35
|
+
\--build 12345678-bbbb-1234--1234567890ab
|
36
|
+
\--provider ec2-us-east-1
|
37
|
+
.SH AUTHOR
|
38
|
+
Martyn Taylor (mtaylor@redhat.com), Jason Guiditta (jguiditta@redhat.com)
|
39
|
+
.SH SEE ALSO
|
40
|
+
aeolus-image-list(1), aeolus-image-build(1), aeolus-image-import(1)
|
data/man/aeolus-image.1
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
.TH aeolus-image 1 "July 07, 2011" "version 0.4" "USER COMMANDS"
|
2
|
+
.SH NAME
|
3
|
+
aeolus-image \- command line tool for managing aeolus images
|
4
|
+
.SH SYNOPSIS
|
5
|
+
.B aeolus-image
|
6
|
+
[\-h]
|
7
|
+
.SH DESCRIPTION
|
8
|
+
aeolus-image is a tool that allows users to control their aeolus images through image builder and aeolus conductor. aeolus-image offers four commands options; list, build, push, import. For more information on each command please run man aeolus-image <command> or aeolus-image --help
|
9
|
+
.SH OPTIONS
|
10
|
+
.TP
|
11
|
+
\-h, --help
|
12
|
+
Get usage information for this tool and subcommands
|
13
|
+
.SH AUTHOR
|
14
|
+
Martyn Taylor (mtaylor@redhat.com), Jason Guiditta (jguiditta@redhat.com)
|
15
|
+
.SH SEE ALSO
|
16
|
+
aeolus-image-build(1), aeolus-image-push(1), aeolus-image-list(1), aeolus-image-import(1)
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Aeolus
|
4
|
+
module Image
|
5
|
+
describe BaseCommand do
|
6
|
+
|
7
|
+
it "should determine the correct credentials for HTTP Authentication" do
|
8
|
+
basec = BaseCommand.new
|
9
|
+
iwhd = basec.send :iwhd
|
10
|
+
iwhd.user.should == nil
|
11
|
+
|
12
|
+
conductor = basec.send :conductor
|
13
|
+
conductor.user.should == "admin"
|
14
|
+
conductor.password.should == "password"
|
15
|
+
|
16
|
+
basec = BaseCommand.new({:username => "testusername", :password=> "testpassword"})
|
17
|
+
conductor = basec.send :conductor
|
18
|
+
conductor.user.should == "testusername"
|
19
|
+
conductor.password.should == "testpassword"
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#read_file" do
|
23
|
+
|
24
|
+
it "should return nil when it cannot find file" do
|
25
|
+
b = BaseCommand.new
|
26
|
+
b.send(:read_file, "foo.fake").should be_nil
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should read file content into string variable" do
|
30
|
+
b = BaseCommand.new
|
31
|
+
template_str = b.send(:read_file, "#{File.dirname(__FILE__)}" + "/../examples/custom_repo.tdl")
|
32
|
+
template_str.should include("<template>")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#is_file?" do
|
37
|
+
it "should return false if no file found" do
|
38
|
+
b = BaseCommand.new
|
39
|
+
b.send(:is_file?, "foo.fake").should be_false
|
40
|
+
end
|
41
|
+
it "should return true if file found" do
|
42
|
+
b = BaseCommand.new
|
43
|
+
valid_file = "#{File.dirname(__FILE__)}" + "/../examples/aeolus-cli"
|
44
|
+
b.instance_eval {@config_location = valid_file}
|
45
|
+
b.send(:is_file?, valid_file).should be_true
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#write_file" do
|
50
|
+
it "should write a new file" do
|
51
|
+
b = BaseCommand.new
|
52
|
+
new_file = "/tmp/foo.fake"
|
53
|
+
b.instance_eval {@config_location = new_file}
|
54
|
+
b.send(:write_file)
|
55
|
+
conf = YAML::load(File.open(File.expand_path(new_file)))
|
56
|
+
conf.has_key?(:iwhd).should be_true
|
57
|
+
File.delete(new_file)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "#validate_xml_document?" do
|
62
|
+
it "should return errors given non compliant xml" do
|
63
|
+
b = BaseCommand.new
|
64
|
+
errors = b.send(:validate_xml_document, "examples/tdl.rng", File.read("spec/fixtures/invalid_template.tdl"))
|
65
|
+
errors.length.should > 0
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should return no errors" do
|
69
|
+
b = BaseCommand.new
|
70
|
+
errors = b.send(:validate_xml_document, "examples/tdl.rng", File.read("spec/fixtures/valid_template.tdl"))
|
71
|
+
errors.length.should == 0
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Aeolus
|
4
|
+
module Image
|
5
|
+
describe BuildCommand do
|
6
|
+
before(:each) do
|
7
|
+
@options[:target] = ['mock','ec2']
|
8
|
+
@options[:template] = "#{File.dirname(__FILE__)}" + "/../examples/custom_repo.tdl"
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#run" do
|
12
|
+
it "should kick off a build with valid options" do
|
13
|
+
b = BuildCommand.new(@options, @output)
|
14
|
+
begin
|
15
|
+
b.run
|
16
|
+
rescue SystemExit => e
|
17
|
+
e.status.should == 0
|
18
|
+
end
|
19
|
+
$stdout.string.should include("Image:")
|
20
|
+
$stdout.string.should include("Target Image:")
|
21
|
+
$stdout.string.should include("Build:")
|
22
|
+
end
|
23
|
+
it "should exit with a message if only image id is provided" do
|
24
|
+
@options.delete(:template)
|
25
|
+
@options.delete(:target)
|
26
|
+
@options[:image] = '825c94d1-1353-48ca-87b9-36f02e069a8d'
|
27
|
+
b = BuildCommand.new(@options, @output)
|
28
|
+
begin
|
29
|
+
b.run
|
30
|
+
rescue SystemExit => e
|
31
|
+
e.status.should == 1
|
32
|
+
end
|
33
|
+
$stdout.string.should include("This combination of parameters is not currently supported")
|
34
|
+
end
|
35
|
+
it "should exit with appropriate message when a non compliant template is given" do
|
36
|
+
@options[:template] = "spec/fixtures/invalid_template.tdl"
|
37
|
+
@options[:image] = '825c94d1-1353-48ca-87b9-36f02e069a8d'
|
38
|
+
b = BuildCommand.new(@options, @output)
|
39
|
+
begin
|
40
|
+
b.run
|
41
|
+
rescue SystemExit => e
|
42
|
+
e.status.should == 1
|
43
|
+
end
|
44
|
+
$stdout.string.should include("ERROR: The given Template does not conform to the TDL Schema")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "#combo_implemented?" do
|
49
|
+
it "should give useful feedback if no template or target is specified" do
|
50
|
+
@options[:template] = ''
|
51
|
+
@options[:target] = []
|
52
|
+
b = BuildCommand.new(@options, @output)
|
53
|
+
begin
|
54
|
+
b.combo_implemented?
|
55
|
+
rescue SystemExit => e
|
56
|
+
e.status.should == 1
|
57
|
+
end
|
58
|
+
$stdout.string.should include("This combination of parameters is not currently supported")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|