aeolus-image 0.0.1 → 0.4.0
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/COPYING +161 -0
- data/Rakefile +32 -19
- data/lib/aeolus_image.rb +35 -0
- data/lib/aeolus_image/active_resource_oauth_client.rb +62 -0
- data/lib/aeolus_image/import.rb +44 -0
- data/lib/aeolus_image/model/factory/base.rb +93 -0
- data/lib/aeolus_image/model/factory/build.rb +23 -0
- data/lib/aeolus_image/model/factory/builder.rb +46 -0
- data/lib/aeolus_image/model/factory/image.rb +23 -0
- data/lib/aeolus_image/model/factory/provider_image.rb +35 -0
- data/lib/aeolus_image/model/factory/target_image.rb +45 -0
- data/lib/aeolus_image/model/warehouse/icicle.rb +60 -0
- data/lib/aeolus_image/model/warehouse/image.rb +135 -0
- data/lib/aeolus_image/model/warehouse/image_build.rb +60 -0
- data/lib/aeolus_image/model/warehouse/provider_image.rb +36 -0
- data/lib/aeolus_image/model/warehouse/target_image.rb +53 -0
- data/lib/aeolus_image/model/warehouse/template.rb +35 -0
- data/lib/aeolus_image/model/warehouse/warehouse_client.rb +201 -0
- data/lib/aeolus_image/model/warehouse/warehouse_model.rb +236 -0
- data/spec/aeolus_image/model/factory/provider_image_spec.rb +12 -0
- data/spec/models/factory/base_spec.rb +94 -0
- data/spec/models/factory/builder_spec.rb +31 -0
- data/spec/models/factory/provider_image_spec.rb +21 -0
- data/spec/models/factory/target_image_spec.rb +21 -0
- data/spec/models/warehouse/image_build_spec.rb +189 -0
- data/spec/models/warehouse/image_spec.rb +241 -0
- data/spec/models/warehouse/provider_image_spec.rb +115 -0
- data/spec/models/warehouse/target_image_spec.rb +180 -0
- data/spec/models/warehouse/template_spec.rb +76 -0
- data/spec/models/warehouse/warehouse_client_spec.rb +445 -0
- data/spec/models/warehouse/warehouse_model_spec.rb +94 -0
- data/spec/spec_helper.rb +34 -47
- data/spec/vcr/cassettes/builder.yml +24 -0
- data/spec/vcr/cassettes/oauth.yml +80 -0
- data/spec/vcr/cassettes/oauth_fail_invalid.yml +30 -0
- data/spec/vcr/cassettes/oauth_fail_no.yml +22 -0
- data/spec/vcr/cassettes/oauth_success_valid.yml +30 -0
- data/spec/vcr_setup.rb +26 -0
- metadata +70 -46
- data/bin/aeolus-image +0 -6
- data/examples/aeolus-cli +0 -9
- data/examples/custom_repo.tdl +0 -18
- data/examples/image_description.xml +0 -3
- data/examples/tdl.rng +0 -207
- data/lib/base_command.rb +0 -134
- data/lib/build_command.rb +0 -68
- data/lib/config_parser.rb +0 -212
- data/lib/delete_command.rb +0 -9
- data/lib/import_command.rb +0 -44
- data/lib/list_command.rb +0 -141
- data/lib/push_command.rb +0 -72
- data/man/aeolus-image-build.1 +0 -36
- data/man/aeolus-image-import.1 +0 -57
- data/man/aeolus-image-list.1 +0 -80
- data/man/aeolus-image-push.1 +0 -40
- data/man/aeolus-image.1 +0 -16
- data/spec/base_command_spec.rb +0 -76
- data/spec/build_command_spec.rb +0 -63
- data/spec/config_parser_spec.rb +0 -82
- data/spec/import_command_spec.rb +0 -43
- data/spec/list_command_spec.rb +0 -21
- data/spec/push_command_spec.rb +0 -56
- data/spec/spec.opts +0 -3
data/bin/aeolus-image
DELETED
data/examples/aeolus-cli
DELETED
data/examples/custom_repo.tdl
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
<template>
|
2
|
-
<name>tmpl1</name>
|
3
|
-
<description>foo</description>
|
4
|
-
<os>
|
5
|
-
<name>Fedora</name>
|
6
|
-
<arch>x86_64</arch>
|
7
|
-
<version>14</version>
|
8
|
-
<install type="url">
|
9
|
-
<url>http://download.fedoraproject.org/pub/fedora/linux/releases/14/Fedora/x86_64/os/</url>
|
10
|
-
</install>
|
11
|
-
</os>
|
12
|
-
<repositories>
|
13
|
-
<repository name="custom">
|
14
|
-
<url>http://repos.fedorapeople.org/repos/aeolus/demo/webapp/</url>
|
15
|
-
<signed>false</signed>
|
16
|
-
</repository>
|
17
|
-
</repositories>
|
18
|
-
</template>
|
data/examples/tdl.rng
DELETED
@@ -1,207 +0,0 @@
|
|
1
|
-
<?xml version="1.0"?>
|
2
|
-
<!-- This Schema is lifted from the OZ project: http://www.aeolusproject.org/oz.html any changes to this schema should be done in the upstream project, then added here-->
|
3
|
-
<!-- A Relax NG schema for the TDL (template description language) format -->
|
4
|
-
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
5
|
-
<start>
|
6
|
-
<ref name='template'/>
|
7
|
-
</start>
|
8
|
-
|
9
|
-
<define name='template'>
|
10
|
-
<element name='template'>
|
11
|
-
<interleave>
|
12
|
-
<element name='name'>
|
13
|
-
<text/>
|
14
|
-
</element>
|
15
|
-
<element name='os'>
|
16
|
-
<interleave>
|
17
|
-
<element name='name'>
|
18
|
-
<text/>
|
19
|
-
</element>
|
20
|
-
<element name='version'>
|
21
|
-
<text/>
|
22
|
-
</element>
|
23
|
-
<element name='arch'>
|
24
|
-
<choice>
|
25
|
-
<value>i386</value>
|
26
|
-
<value>x86_64</value>
|
27
|
-
</choice>
|
28
|
-
</element>
|
29
|
-
<element name='install'>
|
30
|
-
<choice>
|
31
|
-
<ref name='url'/>
|
32
|
-
<ref name='iso'/>
|
33
|
-
</choice>
|
34
|
-
</element>
|
35
|
-
<optional>
|
36
|
-
<element name='rootpw'>
|
37
|
-
<text/>
|
38
|
-
</element>
|
39
|
-
</optional>
|
40
|
-
<optional>
|
41
|
-
<element name='key'>
|
42
|
-
<text/>
|
43
|
-
</element>
|
44
|
-
</optional>
|
45
|
-
</interleave>
|
46
|
-
</element>
|
47
|
-
<optional>
|
48
|
-
<element name='description'>
|
49
|
-
<text/>
|
50
|
-
</element>
|
51
|
-
</optional>
|
52
|
-
<optional>
|
53
|
-
<element name='packages'>
|
54
|
-
<zeroOrMore>
|
55
|
-
<element name='package'>
|
56
|
-
<attribute name='name'>
|
57
|
-
<text/>
|
58
|
-
</attribute>
|
59
|
-
<interleave>
|
60
|
-
<optional>
|
61
|
-
<element name='repository'>
|
62
|
-
<text/>
|
63
|
-
</element>
|
64
|
-
</optional>
|
65
|
-
<optional>
|
66
|
-
<element name='file'>
|
67
|
-
<text/>
|
68
|
-
</element>
|
69
|
-
</optional>
|
70
|
-
<optional>
|
71
|
-
<element name='arguments'>
|
72
|
-
<text/>
|
73
|
-
</element>
|
74
|
-
</optional>
|
75
|
-
</interleave>
|
76
|
-
</element>
|
77
|
-
</zeroOrMore>
|
78
|
-
</element>
|
79
|
-
</optional>
|
80
|
-
<optional>
|
81
|
-
<element name='files'>
|
82
|
-
<zeroOrMore>
|
83
|
-
<element name='file'>
|
84
|
-
<attribute name='name'>
|
85
|
-
<text/>
|
86
|
-
</attribute>
|
87
|
-
<choice>
|
88
|
-
<ref name='rawtype'/>
|
89
|
-
<ref name='base64type'/>
|
90
|
-
</choice>
|
91
|
-
</element>
|
92
|
-
</zeroOrMore>
|
93
|
-
</element>
|
94
|
-
</optional>
|
95
|
-
<optional>
|
96
|
-
<element name='commands'>
|
97
|
-
<zeroOrMore>
|
98
|
-
<element name='command'>
|
99
|
-
<attribute name='name'>
|
100
|
-
<text/>
|
101
|
-
</attribute>
|
102
|
-
<choice>
|
103
|
-
<ref name='rawtype'/>
|
104
|
-
<ref name='base64type'/>
|
105
|
-
</choice>
|
106
|
-
</element>
|
107
|
-
</zeroOrMore>
|
108
|
-
</element>
|
109
|
-
</optional>
|
110
|
-
<optional>
|
111
|
-
<element name='repositories'>
|
112
|
-
<zeroOrMore>
|
113
|
-
<element name='repository'>
|
114
|
-
<attribute name='name'>
|
115
|
-
<text/>
|
116
|
-
</attribute>
|
117
|
-
<interleave>
|
118
|
-
<element name='url'>
|
119
|
-
<text/>
|
120
|
-
</element>
|
121
|
-
<optional>
|
122
|
-
<element name='signed'>
|
123
|
-
<ref name='bool'/>
|
124
|
-
</element>
|
125
|
-
</optional>
|
126
|
-
</interleave>
|
127
|
-
</element>
|
128
|
-
</zeroOrMore>
|
129
|
-
</element>
|
130
|
-
</optional>
|
131
|
-
</interleave>
|
132
|
-
</element>
|
133
|
-
</define>
|
134
|
-
|
135
|
-
<define name='url'>
|
136
|
-
<attribute name='type'>
|
137
|
-
<value>url</value>
|
138
|
-
</attribute>
|
139
|
-
<element name='url'>
|
140
|
-
<text/>
|
141
|
-
</element>
|
142
|
-
</define>
|
143
|
-
|
144
|
-
<define name='iso'>
|
145
|
-
<attribute name='type'>
|
146
|
-
<value>iso</value>
|
147
|
-
</attribute>
|
148
|
-
<interleave>
|
149
|
-
<element name='iso'>
|
150
|
-
<text/>
|
151
|
-
</element>
|
152
|
-
<optional>
|
153
|
-
<choice>
|
154
|
-
<element name='md5sum'>
|
155
|
-
<text/>
|
156
|
-
</element>
|
157
|
-
<element name='sha1sum'>
|
158
|
-
<text/>
|
159
|
-
</element>
|
160
|
-
<element name='sha256sum'>
|
161
|
-
<text/>
|
162
|
-
</element>
|
163
|
-
</choice>
|
164
|
-
</optional>
|
165
|
-
</interleave>
|
166
|
-
</define>
|
167
|
-
|
168
|
-
<define name='bool'>
|
169
|
-
<choice>
|
170
|
-
<data type="string">
|
171
|
-
<param name="pattern">[Tt][Rr][Uu][Ee]</param>
|
172
|
-
</data>
|
173
|
-
<data type="string">
|
174
|
-
<param name="pattern">[Ff][Aa][Ll][Ss][Ee]</param>
|
175
|
-
</data>
|
176
|
-
<data type="string">
|
177
|
-
<param name="pattern">[Yy][Ee][Ss]</param>
|
178
|
-
</data>
|
179
|
-
<data type="string">
|
180
|
-
<param name="pattern">[Nn][Oo]</param>
|
181
|
-
</data>
|
182
|
-
</choice>
|
183
|
-
</define>
|
184
|
-
|
185
|
-
<define name='rawtype'>
|
186
|
-
<optional>
|
187
|
-
<attribute name='type'>
|
188
|
-
<value>raw</value>
|
189
|
-
</attribute>
|
190
|
-
</optional>
|
191
|
-
<text/>
|
192
|
-
</define>
|
193
|
-
|
194
|
-
<define name='base64'>
|
195
|
-
<data type="string">
|
196
|
-
<param name="pattern">[a-zA-Z0-9+/]+={0,2}</param>
|
197
|
-
</data>
|
198
|
-
</define>
|
199
|
-
|
200
|
-
<define name='base64type'>
|
201
|
-
<attribute name='type'>
|
202
|
-
<value>base64</value>
|
203
|
-
</attribute>
|
204
|
-
<ref name='base64'/>
|
205
|
-
</define>
|
206
|
-
|
207
|
-
</grammar>
|
data/lib/base_command.rb
DELETED
@@ -1,134 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
require 'rest_client'
|
3
|
-
require 'nokogiri'
|
4
|
-
|
5
|
-
module Aeolus
|
6
|
-
module Image
|
7
|
-
#This will house some methods that multiple Command classes need to use.
|
8
|
-
class BaseCommand
|
9
|
-
attr_accessor :options
|
10
|
-
|
11
|
-
def initialize(opts={}, logger=nil)
|
12
|
-
logger(logger)
|
13
|
-
@options = opts
|
14
|
-
@config_location = "~/.aeolus-cli"
|
15
|
-
@config = load_config
|
16
|
-
end
|
17
|
-
|
18
|
-
protected
|
19
|
-
def not_implemented
|
20
|
-
"This option or combination is not yet implemented"
|
21
|
-
end
|
22
|
-
|
23
|
-
def logger(logger=nil)
|
24
|
-
@logger ||= logger
|
25
|
-
unless @logger
|
26
|
-
@logger = Logger.new(STDOUT)
|
27
|
-
@logger.level = Logger::INFO
|
28
|
-
@logger.datetime_format = "%Y-%m-%d %H:%M:%S"
|
29
|
-
end
|
30
|
-
return @logger
|
31
|
-
end
|
32
|
-
|
33
|
-
def iwhd
|
34
|
-
create_resource(:iwhd)
|
35
|
-
end
|
36
|
-
|
37
|
-
def conductor
|
38
|
-
create_resource(:conductor)
|
39
|
-
end
|
40
|
-
|
41
|
-
def read_file(path)
|
42
|
-
begin
|
43
|
-
full_path = File.expand_path(path)
|
44
|
-
if is_file?(path)
|
45
|
-
File.read(full_path)
|
46
|
-
else
|
47
|
-
return nil
|
48
|
-
end
|
49
|
-
rescue
|
50
|
-
nil
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# TODO: Consider ripping all this file-related stuff into a module or
|
55
|
-
# class for better encapsulation and testability
|
56
|
-
def is_file?(path)
|
57
|
-
full_path = File.expand_path(path)
|
58
|
-
if File.exist?(full_path) && !File.directory?(full_path)
|
59
|
-
return true
|
60
|
-
end
|
61
|
-
false
|
62
|
-
end
|
63
|
-
|
64
|
-
def quit(code)
|
65
|
-
exit(code)
|
66
|
-
end
|
67
|
-
|
68
|
-
def validate_xml_document(schema_path, xml_string)
|
69
|
-
schema = Nokogiri::XML::RelaxNG(File.read(schema_path))
|
70
|
-
doc = Nokogiri::XML xml_string
|
71
|
-
schema.validate(doc)
|
72
|
-
end
|
73
|
-
|
74
|
-
private
|
75
|
-
def load_config
|
76
|
-
begin
|
77
|
-
file_str = read_file(@config_location)
|
78
|
-
if is_file?(@config_location) && !file_str.include?(":url")
|
79
|
-
lines = File.readlines(File.expand_path(@config_location)).map do |line|
|
80
|
-
"#" + line
|
81
|
-
end
|
82
|
-
File.open(File.expand_path(@config_location), 'w') do |file|
|
83
|
-
file.puts lines
|
84
|
-
end
|
85
|
-
write_file
|
86
|
-
end
|
87
|
-
write_file unless is_file?(@config_location)
|
88
|
-
YAML::load(File.open(File.expand_path(@config_location)))
|
89
|
-
rescue Errno::ENOENT
|
90
|
-
#TODO: Create a custom exception to wrap CLI Exceptions
|
91
|
-
raise "Unable to locate or write configuration file: \"" + @config_location + "\""
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def write_file
|
96
|
-
example = File.read(File.expand_path(File.dirname(__FILE__) + "/../examples/aeolus-cli"))
|
97
|
-
File.open(File.expand_path(@config_location), 'a+') do |f|
|
98
|
-
f.write(example)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def create_resource(resource_name)
|
103
|
-
# Check to see if config has a resource with this name
|
104
|
-
if !@config.has_key?(resource_name)
|
105
|
-
raise "Unable to determine resource: " + resource_name.to_s + " from configuration file. Please check: " + @config_location
|
106
|
-
return
|
107
|
-
end
|
108
|
-
|
109
|
-
#Use command line arguments for username/password
|
110
|
-
if @options.has_key?(:username)
|
111
|
-
if @options.has_key?(:password)
|
112
|
-
RestClient::Resource.new(@config[resource_name][:url], :user => @options[:username], :password => @options[:password])
|
113
|
-
else
|
114
|
-
#TODO: Create a custom exception to wrap CLI Exceptions
|
115
|
-
raise "Password not found for user: " + @options[:username]
|
116
|
-
end
|
117
|
-
|
118
|
-
#Use config for username/password
|
119
|
-
elsif @config[resource_name].has_key?(:username)
|
120
|
-
if @config[resource_name].has_key?(:password)
|
121
|
-
RestClient::Resource.new(@config[resource_name][:url], :user => @config[resource_name][:username], :password => @config[resource_name][:password])
|
122
|
-
else
|
123
|
-
#TODO: Create a custom exception to wrap CLI Exceptions
|
124
|
-
raise "Password not found for user: " + @config[resource_name][:username]
|
125
|
-
end
|
126
|
-
|
127
|
-
# Do not use authentication
|
128
|
-
else
|
129
|
-
RestClient::Resource.new(@config[resource_name][:url])
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
data/lib/build_command.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
require 'imagefactory'
|
2
|
-
|
3
|
-
module Aeolus
|
4
|
-
module Image
|
5
|
-
class BuildCommand < BaseCommand
|
6
|
-
attr_accessor :console
|
7
|
-
def initialize(opts={}, logger=nil)
|
8
|
-
super(opts, logger)
|
9
|
-
default = {
|
10
|
-
:template_str => '',
|
11
|
-
:template => '',
|
12
|
-
:target => [],
|
13
|
-
:image => '',
|
14
|
-
:build => ''
|
15
|
-
}
|
16
|
-
@options = default.merge(@options)
|
17
|
-
@console = ImageFactoryConsole.new()
|
18
|
-
@console.start
|
19
|
-
end
|
20
|
-
|
21
|
-
def run
|
22
|
-
if combo_implemented?
|
23
|
-
@options[:template_str] = read_file(@options[:template])
|
24
|
-
if @options[:template_str].nil?
|
25
|
-
puts "Cannot find specified file"
|
26
|
-
quit(1)
|
27
|
-
end
|
28
|
-
|
29
|
-
# Validate XML against TDL Schema
|
30
|
-
errors = validate_xml_document(File.dirname(__FILE__) + "/../examples/tdl.rng", @options[:template_str])
|
31
|
-
if errors.length > 0
|
32
|
-
puts "ERROR: The given Template does not conform to the TDL Schema, see below for specific details:"
|
33
|
-
errors.each do |error|
|
34
|
-
puts "- " + error.message
|
35
|
-
end
|
36
|
-
quit(1)
|
37
|
-
end
|
38
|
-
|
39
|
-
#This is a temporary hack in case the agent doesn't show up on bus immediately
|
40
|
-
sleep(5)
|
41
|
-
@console.build(@options[:template_str], @options[:target], @options[:image], @options[:build]).each do |adaptor|
|
42
|
-
puts ""
|
43
|
-
puts "Target Image: #{adaptor.image_id}"
|
44
|
-
puts "Image: #{adaptor.image}"
|
45
|
-
puts "Build: #{adaptor.build}"
|
46
|
-
puts "Status: #{adaptor.status}"
|
47
|
-
puts "Percent Complete: #{adaptor.percent_complete}"
|
48
|
-
end
|
49
|
-
quit(0)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def combo_implemented?
|
54
|
-
if @options[:template].empty? || @options[:target].empty?
|
55
|
-
puts "This combination of parameters is not currently supported"
|
56
|
-
quit(1)
|
57
|
-
end
|
58
|
-
true
|
59
|
-
end
|
60
|
-
|
61
|
-
def quit(code)
|
62
|
-
@console.shutdown
|
63
|
-
super
|
64
|
-
end
|
65
|
-
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|