aeolus-image 0.4.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +2 -0
- data/README.md +36 -0
- data/Rakefile +17 -14
- data/examples/aeolus-cli +9 -0
- data/lib/aeolus_image/active_resource_oauth_client.rb +7 -1
- data/rake/rpmtask.rb +126 -0
- metadata +47 -25
data/.rspec
ADDED
data/README.md
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# aeolus-image-rubygem #
|
2
|
+
**aeolus-image-rubygem** is a Ruby library used by [Conductor](https://github.com/aeolusproject/conductor) to connect with Image Factory and Image Warehouse.
|
3
|
+
|
4
|
+
It provides a gem named **aeolus-image**, which shouldn't be confused with the [aeolus-image](https://github.com/aeolusproject/aeolus-image) command-line tool. (There's talk of renaming these shortly to alleviate this confusion.)
|
5
|
+
|
6
|
+
## Configuration ##
|
7
|
+
aeolus-image-rubygem is meant to be leveraged in code. You might check out [config/initializers/aeolus-image.rb](https://github.com/aeolusproject/conductor/blob/master/src/config/initializers/aeolus-image.rb) in Conductor for an example.
|
8
|
+
|
9
|
+
## Usage ##
|
10
|
+
After configurating Factory and/or Warehouse hosts, you can do things like the following:
|
11
|
+
|
12
|
+
### Warehouse ###
|
13
|
+
|
14
|
+
~~~
|
15
|
+
images = Aeolus::Image::Warehouse::Image.all
|
16
|
+
|
17
|
+
image1 = images.first
|
18
|
+
image1.name # => ""
|
19
|
+
image1.image_builds # => an array of ImageBuild objects
|
20
|
+
~~~
|
21
|
+
|
22
|
+
### Factory ###
|
23
|
+
|
24
|
+
~~~
|
25
|
+
builds_in_progress = Aeolus::Image::Factory::Builder.all
|
26
|
+
~~~
|
27
|
+
|
28
|
+
#### Start a build with Factory ####
|
29
|
+
|
30
|
+
~~~
|
31
|
+
img = Aeolus::Image::Factory::Image.new(
|
32
|
+
:targets => 'ec2',
|
33
|
+
:template => IO.read('/home/mawagner/template.tpl')
|
34
|
+
)
|
35
|
+
img.save!
|
36
|
+
~~~
|
data/Rakefile
CHANGED
@@ -24,25 +24,28 @@ require './rake/rpmtask'
|
|
24
24
|
RPMBUILD_DIR = "#{File.expand_path('~')}/rpmbuild"
|
25
25
|
RPM_SPEC = "rubygem-aeolus-image.spec"
|
26
26
|
RPM_SPEC_IN = "rubygem-aeolus-image.spec.in"
|
27
|
-
PKG_VERSION = "0.
|
27
|
+
PKG_VERSION = "0.5.1"
|
28
28
|
|
29
29
|
spec = Gem::Specification.new do |s|
|
30
|
-
s.name
|
31
|
-
s.version
|
32
|
-
s.
|
33
|
-
s.
|
34
|
-
s.
|
35
|
-
s.
|
36
|
-
s.
|
37
|
-
s.
|
38
|
-
s.
|
30
|
+
s.name = 'aeolus-image'
|
31
|
+
s.version = PKG_VERSION
|
32
|
+
s.platform = Gem::Platform::RUBY
|
33
|
+
s.authors = 'Jason Guiditta, Martyn Taylor'
|
34
|
+
s.email = 'jguiditt@redhat.com, mtaylor@redhat.com'
|
35
|
+
s.license = 'ASL 2.0'
|
36
|
+
s.homepage = "https://github.com/aeolusproject/aeolus-image-rubygem"
|
37
|
+
s.summary = 'Ruby Client for Image Warehouse and Image Factory for the Aeolus cloud suite'
|
38
|
+
s.description = "aeolus-image is a Ruby library used by Conductor to connect with Image Factory and Image Warehouse."
|
39
|
+
|
40
|
+
s.files = Dir["lib/**/*.rb","README.md","COPYING","Rakefile","rake/rpmtask.rb"]
|
41
|
+
s.test_files = Dir["spec/**/*.*",".rspec","examples/aeolus-cli"]
|
39
42
|
s.require_path = "lib"
|
40
|
-
s.add_dependency('
|
41
|
-
s.add_dependency('
|
42
|
-
s.add_dependency('activeresource', '~>3.0.10')
|
43
|
+
s.add_dependency('activeresource')
|
44
|
+
s.add_dependency('nokogiri')
|
43
45
|
s.add_dependency('oauth')
|
46
|
+
s.add_dependency('rest-client')
|
44
47
|
|
45
|
-
s.add_development_dependency('rspec', '
|
48
|
+
s.add_development_dependency('rspec', '>=1.3.0')
|
46
49
|
end
|
47
50
|
|
48
51
|
Gem::PackageTask.new(spec) do |p|
|
data/examples/aeolus-cli
ADDED
@@ -26,7 +26,7 @@ module ActiveResourceOAuthClient
|
|
26
26
|
def request_with_oauth(method, path, *arguments)
|
27
27
|
@oauth_config = Aeolus::Image::Factory::Base.config || {}
|
28
28
|
# Take care to fall back to the standard request method if we don't have full OAuth credentials
|
29
|
-
unless
|
29
|
+
unless use_oauth_for_url?("#{site.scheme}://#{site.host}:#{site.port}#{path}")
|
30
30
|
return request_without_oauth(method, path, *arguments)
|
31
31
|
end
|
32
32
|
result = ActiveSupport::Notifications.instrument("request.active_resource") do |payload|
|
@@ -56,6 +56,12 @@ module ActiveResourceOAuthClient
|
|
56
56
|
raise SSLError.new(e.message)
|
57
57
|
end
|
58
58
|
|
59
|
+
# Currently, only Factory calls should use OAuth -- extend as needed
|
60
|
+
def use_oauth_for_url?(url)
|
61
|
+
Aeolus::Image::Factory::Base.use_oauth? and
|
62
|
+
url.include?(Aeolus::Image::Factory::Base.config[:site])
|
63
|
+
end
|
64
|
+
|
59
65
|
alias_method_chain :request, :oauth
|
60
66
|
|
61
67
|
end
|
data/rake/rpmtask.rb
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
# Copyright 2011 Red Hat, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
# Define a package task library to aid in the definition of RPM
|
16
|
+
# packages.
|
17
|
+
|
18
|
+
require 'rubygems'
|
19
|
+
require 'rake'
|
20
|
+
require 'rake/packagetask'
|
21
|
+
|
22
|
+
require 'rbconfig' # used to get system arch
|
23
|
+
|
24
|
+
module Rake
|
25
|
+
|
26
|
+
# Create a package based upon a RPM spec.
|
27
|
+
# RPM packages, can be produced by this task.
|
28
|
+
class RpmTask < PackageTask
|
29
|
+
# filename for output RPM spec
|
30
|
+
attr_accessor :rpm_spec
|
31
|
+
|
32
|
+
# RPM build dir
|
33
|
+
attr_accessor :topdir
|
34
|
+
|
35
|
+
# Include extra_release information in the rpm
|
36
|
+
attr_accessor :include_extra_release
|
37
|
+
|
38
|
+
def initialize(rpm_spec, args = {})
|
39
|
+
init(rpm_spec,args)
|
40
|
+
yield self if block_given?
|
41
|
+
define if block_given?
|
42
|
+
end
|
43
|
+
|
44
|
+
def init(rpm_spec,args)
|
45
|
+
@rpm_spec = rpm_spec
|
46
|
+
|
47
|
+
if args[:suffix]
|
48
|
+
rpm_spec_in = @rpm_spec + args[:suffix]
|
49
|
+
@include_extra_release = eval `grep -q '^[[:space:]]*Release:[[:space:]]*0' #{rpm_spec_in} && echo true || echo false`
|
50
|
+
|
51
|
+
git_head = `git log -1 --pretty=format:%h`
|
52
|
+
extra_release = @include_extra_release ? ("." + Time.now.strftime("%Y%m%d%H%M%S").gsub(/\s/, '') + "git" + "#{git_head}") : ''
|
53
|
+
|
54
|
+
if args[:pkg_version]
|
55
|
+
pkg_version = args[:pkg_version]
|
56
|
+
`sed -e "s|@VERSION@|#{pkg_version}|;s|^\\(Release:[^%]*\\)|\\1#{extra_release}|" #{rpm_spec_in} > #{@rpm_spec}`
|
57
|
+
else
|
58
|
+
`sed -e "s|^\\(Release:[^%]*\\)|\\1#{extra_release}|" #{rpm_spec_in} > #{@rpm_spec}`
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# parse this out of the rpmbuild macros,
|
63
|
+
# not ideal but better than hardcoding this
|
64
|
+
File.open('/etc/rpm/macros.dist', "r") { |f|
|
65
|
+
f.read.scan(/%dist\s*\.(.*)\n/)
|
66
|
+
@distro = $1
|
67
|
+
}
|
68
|
+
|
69
|
+
# Parse rpm name / version out of spec
|
70
|
+
# FIXME hacky way to do this for now
|
71
|
+
# (would be nice to implement a full blown rpm spec parser for ruby)
|
72
|
+
File.open(rpm_spec, "r") { |f|
|
73
|
+
contents = f.read
|
74
|
+
# Parse out definitions and crudely expand them
|
75
|
+
contents.scan(/%define .*\n/).each do |definition|
|
76
|
+
words = definition.strip.split(' ')
|
77
|
+
key = words[1]
|
78
|
+
value = words[2..-1].to_s
|
79
|
+
# Modify the contents with expanded values, unless they contain
|
80
|
+
# a shell command (since we're not modifying them)
|
81
|
+
contents.gsub!("%{#{key}}", value) unless value.match('%\(')
|
82
|
+
end
|
83
|
+
@name = contents.scan(/\nName: .*\n/).first.split.last
|
84
|
+
@version = contents.scan(/\nVersion: .*\n/).first.split.last
|
85
|
+
@release = contents.scan(/\nRelease: .*\n/).first.split.last
|
86
|
+
@release.gsub!("%{?dist}", ".#{@distro}")
|
87
|
+
@arch = contents.scan(/\nBuildArch: .*\n/) # TODO grab local arch if not defined
|
88
|
+
if @arch.nil?
|
89
|
+
@arch = Config::CONFIG["target_cpu"] # hoping this will work for all cases,
|
90
|
+
# can just run the 'arch' cmd if we want
|
91
|
+
else
|
92
|
+
@arch = @arch.first.split.last
|
93
|
+
end
|
94
|
+
}
|
95
|
+
super(@name, @version)
|
96
|
+
|
97
|
+
@rpmbuild_cmd = 'rpmbuild'
|
98
|
+
end
|
99
|
+
|
100
|
+
def define
|
101
|
+
super
|
102
|
+
|
103
|
+
directory "#{@topdir}/SOURCES"
|
104
|
+
directory "#{@topdir}/SPECS"
|
105
|
+
|
106
|
+
desc "Build the rpms"
|
107
|
+
task :rpms, [:include_extra_release] => [rpm_file]
|
108
|
+
|
109
|
+
# FIXME properly determine :package build artifact(s) to copy to sources dir
|
110
|
+
file rpm_file, [:include_extra_release] => [:package, "#{@topdir}/SOURCES", "#{@topdir}/SPECS"] do |t,args|
|
111
|
+
cp "#{package_dir}/#{@name}-#{@version}.tgz", "#{@topdir}/SOURCES/"
|
112
|
+
# FIXME - This seems like a hack, but we don't know the gem's name
|
113
|
+
cp "#{package_dir}/#{@name.gsub('rubygem-', '')}-#{@version}.gem", "#{@topdir}/SOURCES/"
|
114
|
+
cp @rpm_spec, "#{@topdir}/SPECS"
|
115
|
+
sh "#{@rpmbuild_cmd} " +
|
116
|
+
"--define '_topdir #{@topdir}' " +
|
117
|
+
"-ba #{@rpm_spec}"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def rpm_file
|
122
|
+
# FIXME support all a spec's subpackages as well
|
123
|
+
"#{@topdir}/RPMS/#{@arch}/#{@name}-#{@version}-#{@release}.#{@arch}.rpm"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aeolus-image
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 9
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 5
|
9
|
+
- 1
|
10
|
+
version: 0.5.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jason Guiditta, Martyn Taylor
|
@@ -15,26 +15,24 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-08-08 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
21
|
+
name: activeresource
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
25
25
|
requirements:
|
26
26
|
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
hash:
|
28
|
+
hash: 3
|
29
29
|
segments:
|
30
30
|
- 0
|
31
|
-
|
32
|
-
- 0
|
33
|
-
version: 0.4.0
|
31
|
+
version: "0"
|
34
32
|
type: :runtime
|
35
33
|
version_requirements: *id001
|
36
34
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
35
|
+
name: nokogiri
|
38
36
|
prerelease: false
|
39
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
40
38
|
none: false
|
@@ -48,23 +46,21 @@ dependencies:
|
|
48
46
|
type: :runtime
|
49
47
|
version_requirements: *id002
|
50
48
|
- !ruby/object:Gem::Dependency
|
51
|
-
name:
|
49
|
+
name: oauth
|
52
50
|
prerelease: false
|
53
51
|
requirement: &id003 !ruby/object:Gem::Requirement
|
54
52
|
none: false
|
55
53
|
requirements:
|
56
|
-
- -
|
54
|
+
- - ">="
|
57
55
|
- !ruby/object:Gem::Version
|
58
|
-
hash:
|
56
|
+
hash: 3
|
59
57
|
segments:
|
60
|
-
- 3
|
61
58
|
- 0
|
62
|
-
|
63
|
-
version: 3.0.10
|
59
|
+
version: "0"
|
64
60
|
type: :runtime
|
65
61
|
version_requirements: *id003
|
66
62
|
- !ruby/object:Gem::Dependency
|
67
|
-
name:
|
63
|
+
name: rest-client
|
68
64
|
prerelease: false
|
69
65
|
requirement: &id004 !ruby/object:Gem::Requirement
|
70
66
|
none: false
|
@@ -83,7 +79,7 @@ dependencies:
|
|
83
79
|
requirement: &id005 !ruby/object:Gem::Requirement
|
84
80
|
none: false
|
85
81
|
requirements:
|
86
|
-
- -
|
82
|
+
- - ">="
|
87
83
|
- !ruby/object:Gem::Version
|
88
84
|
hash: 27
|
89
85
|
segments:
|
@@ -93,7 +89,7 @@ dependencies:
|
|
93
89
|
version: 1.3.0
|
94
90
|
type: :development
|
95
91
|
version_requirements: *id005
|
96
|
-
description:
|
92
|
+
description: aeolus-image is a Ruby library used by Conductor to connect with Image Factory and Image Warehouse.
|
97
93
|
email: jguiditt@redhat.com, mtaylor@redhat.com
|
98
94
|
executables: []
|
99
95
|
|
@@ -102,7 +98,6 @@ extensions: []
|
|
102
98
|
extra_rdoc_files: []
|
103
99
|
|
104
100
|
files:
|
105
|
-
- Rakefile
|
106
101
|
- lib/aeolus_image/model/factory/build.rb
|
107
102
|
- lib/aeolus_image/model/factory/provider_image.rb
|
108
103
|
- lib/aeolus_image/model/factory/builder.rb
|
@@ -120,6 +115,10 @@ files:
|
|
120
115
|
- lib/aeolus_image/import.rb
|
121
116
|
- lib/aeolus_image/active_resource_oauth_client.rb
|
122
117
|
- lib/aeolus_image.rb
|
118
|
+
- README.md
|
119
|
+
- COPYING
|
120
|
+
- Rakefile
|
121
|
+
- rake/rpmtask.rb
|
123
122
|
- spec/vcr_setup.rb
|
124
123
|
- spec/aeolus_image/model/factory/provider_image_spec.rb
|
125
124
|
- spec/vcr/cassettes/oauth_fail_invalid.yml
|
@@ -141,8 +140,9 @@ files:
|
|
141
140
|
- spec/models/warehouse/provider_image_spec.rb
|
142
141
|
- spec/fixtures/invalid_template.tdl
|
143
142
|
- spec/fixtures/valid_template.tdl
|
144
|
-
-
|
145
|
-
|
143
|
+
- .rspec
|
144
|
+
- examples/aeolus-cli
|
145
|
+
homepage: https://github.com/aeolusproject/aeolus-image-rubygem
|
146
146
|
licenses:
|
147
147
|
- ASL 2.0
|
148
148
|
post_install_message:
|
@@ -175,5 +175,27 @@ rubygems_version: 1.8.11
|
|
175
175
|
signing_key:
|
176
176
|
specification_version: 3
|
177
177
|
summary: Ruby Client for Image Warehouse and Image Factory for the Aeolus cloud suite
|
178
|
-
test_files:
|
179
|
-
|
178
|
+
test_files:
|
179
|
+
- spec/vcr_setup.rb
|
180
|
+
- spec/aeolus_image/model/factory/provider_image_spec.rb
|
181
|
+
- spec/vcr/cassettes/oauth_fail_invalid.yml
|
182
|
+
- spec/vcr/cassettes/oauth.yml
|
183
|
+
- spec/vcr/cassettes/oauth_success_valid.yml
|
184
|
+
- spec/vcr/cassettes/builder.yml
|
185
|
+
- spec/vcr/cassettes/oauth_fail_no.yml
|
186
|
+
- spec/spec_helper.rb
|
187
|
+
- spec/models/factory/base_spec.rb
|
188
|
+
- spec/models/factory/builder_spec.rb
|
189
|
+
- spec/models/factory/target_image_spec.rb
|
190
|
+
- spec/models/factory/provider_image_spec.rb
|
191
|
+
- spec/models/warehouse/warehouse_client_spec.rb
|
192
|
+
- spec/models/warehouse/image_spec.rb
|
193
|
+
- spec/models/warehouse/template_spec.rb
|
194
|
+
- spec/models/warehouse/image_build_spec.rb
|
195
|
+
- spec/models/warehouse/target_image_spec.rb
|
196
|
+
- spec/models/warehouse/warehouse_model_spec.rb
|
197
|
+
- spec/models/warehouse/provider_image_spec.rb
|
198
|
+
- spec/fixtures/invalid_template.tdl
|
199
|
+
- spec/fixtures/valid_template.tdl
|
200
|
+
- .rspec
|
201
|
+
- examples/aeolus-cli
|