deltacloud-core 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/COPYING +502 -0
- data/Rakefile +108 -0
- data/bin/deltacloudd +88 -0
- data/config.ru +5 -0
- data/deltacloud.rb +14 -0
- data/lib/converters/xml_converter.rb +133 -0
- data/lib/deltacloud/base_driver.rb +19 -0
- data/lib/deltacloud/base_driver/base_driver.rb +189 -0
- data/lib/deltacloud/base_driver/features.rb +144 -0
- data/lib/deltacloud/drivers/ec2/ec2_driver.rb +318 -0
- data/lib/deltacloud/drivers/ec2/ec2_mock_driver.rb +170 -0
- data/lib/deltacloud/drivers/gogrid/gogrid_client.rb +45 -0
- data/lib/deltacloud/drivers/gogrid/gogrid_driver.rb +239 -0
- data/lib/deltacloud/drivers/mock/mock_driver.rb +275 -0
- data/lib/deltacloud/drivers/opennebula/cloud_client.rb +116 -0
- data/lib/deltacloud/drivers/opennebula/occi_client.rb +204 -0
- data/lib/deltacloud/drivers/opennebula/opennebula_driver.rb +241 -0
- data/lib/deltacloud/drivers/rackspace/rackspace_client.rb +129 -0
- data/lib/deltacloud/drivers/rackspace/rackspace_driver.rb +150 -0
- data/lib/deltacloud/drivers/rhevm/rhevm_driver.rb +254 -0
- data/lib/deltacloud/drivers/rimu/rimu_hosting_client.rb +87 -0
- data/lib/deltacloud/drivers/rimu/rimu_hosting_driver.rb +143 -0
- data/lib/deltacloud/hardware_profile.rb +131 -0
- data/lib/deltacloud/helpers.rb +5 -0
- data/lib/deltacloud/helpers/application_helper.rb +38 -0
- data/lib/deltacloud/helpers/conversion_helper.rb +39 -0
- data/lib/deltacloud/helpers/hardware_profiles_helper.rb +35 -0
- data/lib/deltacloud/models/base_model.rb +58 -0
- data/lib/deltacloud/models/image.rb +26 -0
- data/lib/deltacloud/models/instance.rb +37 -0
- data/lib/deltacloud/models/instance_profile.rb +47 -0
- data/lib/deltacloud/models/realm.rb +25 -0
- data/lib/deltacloud/models/storage_snapshot.rb +26 -0
- data/lib/deltacloud/models/storage_volume.rb +27 -0
- data/lib/deltacloud/state_machine.rb +84 -0
- data/lib/deltacloud/validation.rb +70 -0
- data/lib/drivers.rb +37 -0
- data/lib/sinatra/lazy_auth.rb +56 -0
- data/lib/sinatra/rabbit.rb +272 -0
- data/lib/sinatra/respond_to.rb +262 -0
- data/lib/sinatra/static_assets.rb +83 -0
- data/lib/sinatra/url_for.rb +44 -0
- data/public/favicon.ico +0 -0
- data/public/images/grid.png +0 -0
- data/public/images/logo-wide.png +0 -0
- data/public/images/rails.png +0 -0
- data/public/images/topbar-bg.png +0 -0
- data/public/javascripts/application.js +2 -0
- data/public/javascripts/controls.js +963 -0
- data/public/javascripts/dragdrop.js +973 -0
- data/public/javascripts/effects.js +1128 -0
- data/public/javascripts/prototype.js +4320 -0
- data/public/stylesheets/compiled/application.css +613 -0
- data/public/stylesheets/compiled/ie.css +31 -0
- data/public/stylesheets/compiled/print.css +27 -0
- data/public/stylesheets/compiled/screen.css +456 -0
- data/server.rb +340 -0
- data/tests/deltacloud_test.rb +60 -0
- data/tests/images_test.rb +94 -0
- data/tests/instances_test.rb +136 -0
- data/tests/realms_test.rb +56 -0
- data/tests/storage_snapshots_test.rb +48 -0
- data/tests/storage_volumes_test.rb +48 -0
- data/views/accounts/index.html.haml +11 -0
- data/views/accounts/show.html.haml +30 -0
- data/views/api/show.html.haml +15 -0
- data/views/api/show.xml.haml +5 -0
- data/views/docs/collection.html.haml +37 -0
- data/views/docs/collection.xml.haml +14 -0
- data/views/docs/index.html.haml +15 -0
- data/views/docs/index.xml.haml +5 -0
- data/views/docs/operation.html.haml +31 -0
- data/views/docs/operation.xml.haml +10 -0
- data/views/errors/auth_exception.html.haml +8 -0
- data/views/errors/auth_exception.xml.haml +2 -0
- data/views/errors/backend_error.html.haml +17 -0
- data/views/errors/backend_error.xml.haml +8 -0
- data/views/errors/validation_failure.html.haml +11 -0
- data/views/errors/validation_failure.xml.haml +7 -0
- data/views/hardware_profiles/index.html.haml +25 -0
- data/views/hardware_profiles/index.xml.haml +4 -0
- data/views/hardware_profiles/show.html.haml +19 -0
- data/views/hardware_profiles/show.xml.haml +17 -0
- data/views/images/index.html.haml +30 -0
- data/views/images/index.xml.haml +7 -0
- data/views/images/show.html.haml +21 -0
- data/views/images/show.xml.haml +5 -0
- data/views/instance_states/show.gv.erb +45 -0
- data/views/instance_states/show.html.haml +31 -0
- data/views/instance_states/show.xml.haml +8 -0
- data/views/instances/index.html.haml +29 -0
- data/views/instances/index.xml.haml +23 -0
- data/views/instances/new.html.haml +49 -0
- data/views/instances/show.html.haml +42 -0
- data/views/instances/show.xml.haml +28 -0
- data/views/layout.html.haml +23 -0
- data/views/realms/index.html.haml +29 -0
- data/views/realms/index.xml.haml +12 -0
- data/views/realms/show.html.haml +15 -0
- data/views/realms/show.xml.haml +10 -0
- data/views/root/index.html.haml +4 -0
- data/views/storage_snapshots/index.html.haml +20 -0
- data/views/storage_snapshots/index.xml.haml +11 -0
- data/views/storage_snapshots/show.html.haml +14 -0
- data/views/storage_snapshots/show.xml.haml +9 -0
- data/views/storage_volumes/index.html.haml +21 -0
- data/views/storage_volumes/index.xml.haml +13 -0
- data/views/storage_volumes/show.html.haml +20 -0
- data/views/storage_volumes/show.xml.haml +13 -0
- metadata +311 -0
data/Rakefile
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (C) 2009 Red Hat, Inc.
|
|
3
|
+
#
|
|
4
|
+
# This library is free software; you can redistribute it and/or
|
|
5
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
6
|
+
# License as published by the Free Software Foundation; either
|
|
7
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
8
|
+
#
|
|
9
|
+
# This library is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
12
|
+
# Lesser General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
15
|
+
# License along with this library; if not, write to the Free Software
|
|
16
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
17
|
+
|
|
18
|
+
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
|
19
|
+
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
|
20
|
+
|
|
21
|
+
require 'rake'
|
|
22
|
+
require 'rake/testtask'
|
|
23
|
+
require 'rake/gempackagetask'
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
desc "Run basic unit tests"
|
|
28
|
+
Rake::TestTask.new("test") { |t|
|
|
29
|
+
t.test_files = FileList[
|
|
30
|
+
'tests/realms_test.rb',
|
|
31
|
+
'tests/images_test.rb',
|
|
32
|
+
'tests/instances_test.rb',
|
|
33
|
+
'tests/storage_volumes_test.rb',
|
|
34
|
+
'tests/storage_snapshots_test.rb',
|
|
35
|
+
]
|
|
36
|
+
t.verbose = false
|
|
37
|
+
t.warning = false
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
begin
|
|
41
|
+
require 'cucumber'
|
|
42
|
+
require 'cucumber/rake/task'
|
|
43
|
+
|
|
44
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
|
45
|
+
t.cucumber_opts = "features --format html --out tmp/cucumber.html"
|
|
46
|
+
t.rcov = false
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
Cucumber::Rake::Task.new(:rcov) do |t|
|
|
50
|
+
t.cucumber_opts = "features --format pretty"
|
|
51
|
+
t.rcov = true
|
|
52
|
+
t.rcov_opts << %[-o "tmp/coverage"]
|
|
53
|
+
end
|
|
54
|
+
rescue LoadError
|
|
55
|
+
desc 'Cucumber rake task not available'
|
|
56
|
+
task :features do
|
|
57
|
+
abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem'
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
load 'deltacloud-core.gemspec'
|
|
63
|
+
Rake::GemPackageTask.new(@spec) do |pkg|
|
|
64
|
+
pkg.need_tar = true
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
desc "Install API"
|
|
68
|
+
task :install, [:install_dir, :bin_dir] do |t, args|
|
|
69
|
+
|
|
70
|
+
require 'fileutils'
|
|
71
|
+
require 'pp'
|
|
72
|
+
|
|
73
|
+
files = FileList[
|
|
74
|
+
Dir["config/**/**"],
|
|
75
|
+
Dir["features/**/**"],
|
|
76
|
+
Dir["lib/**/**"],
|
|
77
|
+
Dir["public/**/**"],
|
|
78
|
+
Dir["views/**/**"],
|
|
79
|
+
"config.ru",
|
|
80
|
+
"COPYING",
|
|
81
|
+
"README",
|
|
82
|
+
"*.rb"
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
INSTALL_DIR=args.install_dir || "/usr/local/share/deltacloud-core"
|
|
86
|
+
BIN_DIR=args.bin_dir || "/usr/local/bin"
|
|
87
|
+
|
|
88
|
+
exit(1) unless FileUtils.mkdir_p(INSTALL_DIR)
|
|
89
|
+
exit(1) unless FileUtils.mkdir_p(BIN_DIR)
|
|
90
|
+
|
|
91
|
+
files.each do |f|
|
|
92
|
+
install_path = "#{INSTALL_DIR}/#{File.dirname(f)}"
|
|
93
|
+
unless File.directory?(install_path)
|
|
94
|
+
FileUtils.mkdir_p(install_path, :mode => 0755, :verbose => true)
|
|
95
|
+
end
|
|
96
|
+
next if File.directory?(f)
|
|
97
|
+
FileUtils.install(f, "#{INSTALL_DIR}/#{File.dirname(f)}", :verbose => true)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
FileUtils.install('bin/deltacloudd', BIN_DIR, :verbose => true, :mode => 0755)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
desc "Uninstall API"
|
|
104
|
+
task :uninstall do
|
|
105
|
+
require 'fileutils'
|
|
106
|
+
INSTALL_DIR="/usr/share/deltacloud-core"
|
|
107
|
+
FileUtils.rm_rf(INSTALL_DIR)
|
|
108
|
+
end
|
data/bin/deltacloudd
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'rubygems'
|
|
4
|
+
require 'optparse'
|
|
5
|
+
require 'thin'
|
|
6
|
+
|
|
7
|
+
options = {
|
|
8
|
+
:env => 'development'
|
|
9
|
+
}
|
|
10
|
+
optparse = OptionParser.new do |opts|
|
|
11
|
+
|
|
12
|
+
opts.banner = <<BANNER
|
|
13
|
+
Usage:
|
|
14
|
+
deltacloudd -i <driver> [options]
|
|
15
|
+
|
|
16
|
+
Options:
|
|
17
|
+
BANNER
|
|
18
|
+
opts.on( '-i', '--driver DRIVER', 'Driver to use') do |driver|
|
|
19
|
+
ENV["API_DRIVER"] = driver
|
|
20
|
+
end
|
|
21
|
+
opts.on( '-r', '--hostname HOSTNAME',
|
|
22
|
+
'Bind to HOST address (default: localhost)') do |host|
|
|
23
|
+
ENV["API_HOST"] = host
|
|
24
|
+
end
|
|
25
|
+
opts.on( '-p', '--port PORT', 'Use PORT (default: 3001)') do |port|
|
|
26
|
+
ENV["API_PORT"] = port
|
|
27
|
+
end
|
|
28
|
+
opts.on( '-e', '--env ENV', 'Environment (default: "development")') { |env| options[:env] = env }
|
|
29
|
+
opts.on( '-h', '--help', '') { options[:help] = true }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
optparse.parse!
|
|
33
|
+
|
|
34
|
+
if options[:help]
|
|
35
|
+
puts optparse
|
|
36
|
+
exit(0)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
unless ENV["API_DRIVER"]
|
|
40
|
+
puts "You need to specify a driver to use (-i <driver>)"
|
|
41
|
+
exit(1)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
ENV["API_HOST"] = "localhost" unless ENV["API_HOST"]
|
|
45
|
+
ENV["API_PORT"] = "3001" unless ENV["API_PORT"]
|
|
46
|
+
|
|
47
|
+
dirname="#{File.dirname(__FILE__)}/.."
|
|
48
|
+
|
|
49
|
+
argv_opts = ARGV.clone
|
|
50
|
+
argv_opts << ['start'] unless Thin::Runner.commands.include?(options[0])
|
|
51
|
+
argv_opts << ['--address', ENV["API_HOST"] ]
|
|
52
|
+
argv_opts << ['--port', ENV["API_PORT"] ]
|
|
53
|
+
argv_opts << ['--rackup', 'config.ru' ]
|
|
54
|
+
argv_opts << ['--chdir', dirname ]
|
|
55
|
+
argv_opts << ['-e', options[:env] ]
|
|
56
|
+
argv_opts << ['--threaded', '-D', '--stats', '/stats']
|
|
57
|
+
|
|
58
|
+
argv_opts.flatten!
|
|
59
|
+
|
|
60
|
+
if options[:env] == "development"
|
|
61
|
+
use_rerun = false
|
|
62
|
+
begin
|
|
63
|
+
require "rerun"
|
|
64
|
+
use_rerun = true
|
|
65
|
+
rescue
|
|
66
|
+
# Do nothing
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
puts "Starting Deltacloud API :: #{ENV["API_DRIVER"]} :: http://#{ENV["API_HOST"]}:#{ENV["API_PORT"]}/api"
|
|
71
|
+
puts
|
|
72
|
+
|
|
73
|
+
if use_rerun
|
|
74
|
+
argv_opts.unshift "thin"
|
|
75
|
+
command = argv_opts.join(" ")
|
|
76
|
+
topdir = File::expand_path(File::join(File::dirname(__FILE__), ".."))
|
|
77
|
+
rerun = Rerun::Runner.new(command, :dir => topdir)
|
|
78
|
+
rerun.start
|
|
79
|
+
rerun.join
|
|
80
|
+
else
|
|
81
|
+
thin = Thin::Runner.new(argv_opts)
|
|
82
|
+
|
|
83
|
+
begin
|
|
84
|
+
thin.run!
|
|
85
|
+
rescue Exception => e
|
|
86
|
+
puts "ERROR: #{e.message}"
|
|
87
|
+
end
|
|
88
|
+
end
|
data/config.ru
ADDED
data/deltacloud.rb
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Add ./lib into load path
|
|
2
|
+
$:.unshift File.join(File.dirname(__FILE__), 'lib')
|
|
3
|
+
|
|
4
|
+
require 'deltacloud/base_driver'
|
|
5
|
+
require 'deltacloud/hardware_profile'
|
|
6
|
+
require 'deltacloud/state_machine'
|
|
7
|
+
|
|
8
|
+
require 'deltacloud/models/base_model'
|
|
9
|
+
require 'deltacloud/models/realm'
|
|
10
|
+
require 'deltacloud/models/image'
|
|
11
|
+
require 'deltacloud/models/instance'
|
|
12
|
+
require 'deltacloud/models/instance_profile'
|
|
13
|
+
require 'deltacloud/models/storage_snapshot'
|
|
14
|
+
require 'deltacloud/models/storage_volume'
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (C) 2009 Red Hat, Inc.
|
|
3
|
+
#
|
|
4
|
+
# This library is free software; you can redistribute it and/or
|
|
5
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
6
|
+
# License as published by the Free Software Foundation; either
|
|
7
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
8
|
+
#
|
|
9
|
+
# This library is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
12
|
+
# Lesser General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
15
|
+
# License along with this library; if not, write to the Free Software
|
|
16
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
17
|
+
|
|
18
|
+
module Converters
|
|
19
|
+
|
|
20
|
+
( ALIASES = {
|
|
21
|
+
:owner=>nil,
|
|
22
|
+
:volume=>:storage_volume,
|
|
23
|
+
} ) unless defined?( ALIASES )
|
|
24
|
+
|
|
25
|
+
def self.url_type(type)
|
|
26
|
+
type = type.to_sym
|
|
27
|
+
return ALIASES[type] if ( ALIASES.keys.include?( type ) )
|
|
28
|
+
type
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.tag_name(type)
|
|
32
|
+
tag_name = type.to_s
|
|
33
|
+
tag_name.gsub( /_/, '-' )
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class XMLConverter
|
|
37
|
+
def initialize(link_builder, type)
|
|
38
|
+
@link_builder = link_builder
|
|
39
|
+
@type = type
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def convert(obj, builder=nil)
|
|
43
|
+
builder ||= Builder::XmlMarkup.new( :indent=>2 )
|
|
44
|
+
if ( obj.is_a?( Array ) )
|
|
45
|
+
builder.__send__( @type.to_s.pluralize.gsub( /_/, '-' ).to_sym ) do
|
|
46
|
+
obj.each do |e|
|
|
47
|
+
convert( e, builder )
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
else
|
|
51
|
+
case ( obj )
|
|
52
|
+
when Image
|
|
53
|
+
builder.image( :href=>@link_builder.send( :image_url, obj.id ) ) {
|
|
54
|
+
builder.id( obj.id )
|
|
55
|
+
builder.owner_id( obj.owner_id )
|
|
56
|
+
builder.name( obj.name )
|
|
57
|
+
builder.description( obj.description )
|
|
58
|
+
builder.architecture( obj.architecture )
|
|
59
|
+
}
|
|
60
|
+
when Realm
|
|
61
|
+
builder.realm( :href=>@link_builder.send( :realm_url, obj.id ) ) {
|
|
62
|
+
builder.id( obj.id )
|
|
63
|
+
builder.name( obj.name )
|
|
64
|
+
builder.state( obj.state )
|
|
65
|
+
if ( obj.limit == :unlimited )
|
|
66
|
+
builder.limit()
|
|
67
|
+
else
|
|
68
|
+
builder.limit( obj.limit )
|
|
69
|
+
end
|
|
70
|
+
}
|
|
71
|
+
when Instance
|
|
72
|
+
builder.instance( :href=>@link_builder.send( :instance_url, obj.id ) ) {
|
|
73
|
+
builder.id( obj.id )
|
|
74
|
+
builder.name( obj.name )
|
|
75
|
+
builder.owner_id( obj.owner_id )
|
|
76
|
+
builder.image( :href=>@link_builder.send( :image_url, obj.image_id ) )
|
|
77
|
+
builder.__send__( 'hardware-profile', :href=>@link_builder.send( :hardware_profile_url, obj.instance_profile.name) ) do
|
|
78
|
+
builder.id( obj.instance_profile.name )
|
|
79
|
+
obj.instance_profile.overrides.each do |p, v|
|
|
80
|
+
u = ::Deltacloud::HardwareProfile::unit(p)
|
|
81
|
+
builder.property( :kind=>:fixed, :name=>p, :unit=>u, :value=>v )
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
builder.realm( :href=>@link_builder.send( :realm_url, obj.realm_id ) ) if obj.realm_id
|
|
85
|
+
builder.state( obj.state )
|
|
86
|
+
builder.actions {
|
|
87
|
+
if ( obj.actions )
|
|
88
|
+
obj.actions.each do |action|
|
|
89
|
+
builder.link( :rel=>action, :href=>@link_builder.send( "#{action}_instance_url", obj.id ) )
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
}
|
|
93
|
+
builder.__send__( 'public-addresses' ) {
|
|
94
|
+
obj.public_addresses.each do |address|
|
|
95
|
+
builder.address( address )
|
|
96
|
+
end
|
|
97
|
+
}
|
|
98
|
+
builder.__send__( 'private-addresses' ) {
|
|
99
|
+
obj.private_addresses.each do |address|
|
|
100
|
+
builder.address( address )
|
|
101
|
+
end
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
when StorageVolume
|
|
105
|
+
builder.__send__('storage-volume', :href=>@link_builder.send( :storage_volume_url, obj.id )) {
|
|
106
|
+
builder.id( obj.id )
|
|
107
|
+
builder.created( obj.created )
|
|
108
|
+
builder.state( obj.state )
|
|
109
|
+
builder.capacity( obj.capacity )
|
|
110
|
+
builder.device( obj.device )
|
|
111
|
+
if ( obj.instance_id )
|
|
112
|
+
builder.instance( :href=>@link_builder.send( :instance_url, obj.instance_id ) )
|
|
113
|
+
else
|
|
114
|
+
builder.instance()
|
|
115
|
+
end
|
|
116
|
+
}
|
|
117
|
+
when StorageSnapshot
|
|
118
|
+
builder.__send__('storage-snapshot', :href=>@link_builder.send( :storage_snapshot_url, obj.id )) {
|
|
119
|
+
builder.id( obj.id )
|
|
120
|
+
builder.created( obj.created )
|
|
121
|
+
builder.state( obj.state )
|
|
122
|
+
if ( obj.storage_volume_id )
|
|
123
|
+
builder.__send__('storage-volume', :href=>@link_builder.send( :storage_volume_url, obj.storage_volume_id ) )
|
|
124
|
+
else
|
|
125
|
+
builder.__send( 'storage-volume' )
|
|
126
|
+
end
|
|
127
|
+
}
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
return builder.target!
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (C) 2009 Red Hat, Inc.
|
|
3
|
+
#
|
|
4
|
+
# This library is free software; you can redistribute it and/or
|
|
5
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
6
|
+
# License as published by the Free Software Foundation; either
|
|
7
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
8
|
+
#
|
|
9
|
+
# This library is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
12
|
+
# Lesser General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
15
|
+
# License along with this library; if not, write to the Free Software
|
|
16
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
17
|
+
|
|
18
|
+
require 'deltacloud/base_driver/base_driver'
|
|
19
|
+
require 'deltacloud/base_driver/features'
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (C) 2009 Red Hat, Inc.
|
|
3
|
+
#
|
|
4
|
+
# This library is free software; you can redistribute it and/or
|
|
5
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
6
|
+
# License as published by the Free Software Foundation; either
|
|
7
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
8
|
+
#
|
|
9
|
+
# This library is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
12
|
+
# Lesser General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
15
|
+
# License along with this library; if not, write to the Free Software
|
|
16
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
17
|
+
|
|
18
|
+
module Deltacloud
|
|
19
|
+
|
|
20
|
+
class AuthException < Exception
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
class BackendError < StandardError
|
|
24
|
+
attr_reader :code, :cause, :details
|
|
25
|
+
def initialize(code, cause, message, details)
|
|
26
|
+
super(message)
|
|
27
|
+
@code = code
|
|
28
|
+
@cause = cause
|
|
29
|
+
@details = details
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class BaseDriver
|
|
34
|
+
|
|
35
|
+
def self.define_hardware_profile(name,&block)
|
|
36
|
+
@hardware_profiles ||= []
|
|
37
|
+
hw_profile = @hardware_profiles.find{|e| e.name == name}
|
|
38
|
+
return if hw_profile
|
|
39
|
+
hw_profile = ::Deltacloud::HardwareProfile.new( name, &block )
|
|
40
|
+
@hardware_profiles << hw_profile
|
|
41
|
+
hw_params = hw_profile.params
|
|
42
|
+
unless hw_params.empty?
|
|
43
|
+
feature :instances, :hardware_profiles do
|
|
44
|
+
decl.operation(:create) { add_params(hw_params) }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def self.hardware_profiles
|
|
50
|
+
@hardware_profiles ||= []
|
|
51
|
+
@hardware_profiles
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def hardware_profiles(credentials, opts = nil)
|
|
55
|
+
results = self.class.hardware_profiles
|
|
56
|
+
filter_hardware_profiles(results, opts)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def hardware_profile(credentials, name)
|
|
60
|
+
hardware_profiles(credentials, :name => name).first
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def filter_hardware_profiles(profiles, opts)
|
|
64
|
+
if opts
|
|
65
|
+
if v = opts[:architecture]
|
|
66
|
+
profiles = profiles.select { |hwp| hwp.include?(:architecture, v) }
|
|
67
|
+
end
|
|
68
|
+
if v = opts[:name]
|
|
69
|
+
profiles = profiles.select { |hwp| hwp.name == v }
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
profiles
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def find_hardware_profile(credentials, name, image_id)
|
|
76
|
+
hwp = nil
|
|
77
|
+
if name
|
|
78
|
+
unless hwp = hardware_profiles(credentials, :name => name).first
|
|
79
|
+
raise BackendError.new(400, "bad-hardware-profile-name",
|
|
80
|
+
"Hardware profile '#{name}' does not exist", nil)
|
|
81
|
+
end
|
|
82
|
+
else
|
|
83
|
+
unless image = image(credentials, :id=>image_id)
|
|
84
|
+
raise BackendError.new(400, "bad-image-id",
|
|
85
|
+
"Image with ID '#{image_id}' does not exist", nil)
|
|
86
|
+
end
|
|
87
|
+
hwp = hardware_profiles(credentials,
|
|
88
|
+
:architecture=>image.architecture).first
|
|
89
|
+
end
|
|
90
|
+
return hwp
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def self.define_instance_states(&block)
|
|
94
|
+
machine = ::Deltacloud::StateMachine.new(&block)
|
|
95
|
+
@instance_state_machine = machine
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def self.instance_state_machine
|
|
99
|
+
@instance_state_machine
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def instance_state_machine
|
|
103
|
+
self.class.instance_state_machine
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def instance_actions_for(state)
|
|
107
|
+
actions = []
|
|
108
|
+
state_key = state.downcase.to_sym
|
|
109
|
+
states = instance_state_machine.states()
|
|
110
|
+
current_state = states.find{|e| e.name == state.underscore.to_sym }
|
|
111
|
+
if ( current_state )
|
|
112
|
+
actions = current_state.transitions.collect{|e|e.action}
|
|
113
|
+
actions.reject!{|e| e.nil?}
|
|
114
|
+
end
|
|
115
|
+
actions
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def realm(credentials, opts)
|
|
119
|
+
realms = realms(credentials, opts)
|
|
120
|
+
return realms.first unless realms.empty?
|
|
121
|
+
nil
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def realms(credentials, opts=nil)
|
|
125
|
+
[]
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def image(credentials, opts)
|
|
129
|
+
images = images(credentials, opts)
|
|
130
|
+
return images.first unless images.empty?
|
|
131
|
+
nil
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def images(credentials, ops)
|
|
135
|
+
[]
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def instance(credentials, opts)
|
|
139
|
+
instances = instances(credentials, opts)
|
|
140
|
+
return instances.first unless instances.empty?
|
|
141
|
+
nil
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def instances(credentials, ops)
|
|
145
|
+
[]
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def create_instance(credentials, image_id, opts)
|
|
149
|
+
end
|
|
150
|
+
def start_instance(credentials, id)
|
|
151
|
+
end
|
|
152
|
+
def stop_instance(credentials, id)
|
|
153
|
+
end
|
|
154
|
+
def reboot_instance(credentials, id)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def storage_volume(credentials, opts)
|
|
158
|
+
volumes = storage_volumes(credentials, opts)
|
|
159
|
+
return volumes.first unless volumes.empty?
|
|
160
|
+
nil
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def storage_volumes(credentials, ops)
|
|
164
|
+
[]
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def storage_snapshot(credentials, opts)
|
|
168
|
+
snapshots = storage_snapshots(credentials, opts)
|
|
169
|
+
return snapshots.first unless snapshots.empty?
|
|
170
|
+
nil
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def storage_snapshots(credentials, ops)
|
|
174
|
+
[]
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def filter_on(collection, attribute, opts)
|
|
178
|
+
return collection if opts.nil?
|
|
179
|
+
return collection if opts[attribute].nil?
|
|
180
|
+
filter = opts[attribute]
|
|
181
|
+
if ( filter.is_a?( Array ) )
|
|
182
|
+
return collection.select{|e| filter.include?( e.send(attribute) ) }
|
|
183
|
+
else
|
|
184
|
+
return collection.select{|e| filter == e.send(attribute) }
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
end
|