deltacloud-core 0.1.2 → 0.3.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/DISCLAIMER +8 -0
- data/{COPYING → LICENSE} +0 -0
- data/NOTICE +13 -0
- data/Rakefile +50 -51
- data/bin/deltacloudd +8 -1
- data/config.ru +0 -2
- data/config/drivers.yaml +48 -0
- data/deltacloud-core.gemspec +75 -0
- data/deltacloud.rb +3 -2
- data/lib/deltacloud/backend_capability.rb +15 -3
- data/lib/deltacloud/base_driver.rb +0 -2
- data/lib/deltacloud/base_driver/base_driver.rb +85 -89
- data/lib/deltacloud/base_driver/features.rb +61 -7
- data/lib/deltacloud/base_driver/mock_driver.rb +42 -43
- data/lib/deltacloud/core_ext.rb +18 -0
- data/lib/deltacloud/core_ext/integer.rb +31 -0
- data/lib/deltacloud/core_ext/string.rb +50 -0
- data/lib/deltacloud/drivers/azure/azure_driver.rb +71 -22
- data/lib/deltacloud/drivers/ec2/ec2_driver.rb +641 -584
- data/lib/deltacloud/drivers/ec2/ec2_mock_driver.rb +0 -2
- data/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb +167 -0
- data/lib/deltacloud/drivers/gogrid/gogrid_client.rb +39 -1
- data/lib/deltacloud/drivers/gogrid/gogrid_driver.rb +41 -25
- data/lib/deltacloud/drivers/mock/data/buckets/blobs/blob1.yml +6 -3
- data/lib/deltacloud/drivers/mock/data/buckets/blobs/blob2.yml +6 -3
- data/lib/deltacloud/drivers/mock/data/buckets/blobs/blob3.yml +4 -2
- data/lib/deltacloud/drivers/mock/data/buckets/blobs/blob4.yml +5 -2
- data/lib/deltacloud/drivers/mock/data/buckets/blobs/blob5.yml +4 -2
- data/lib/deltacloud/drivers/mock/data/instances/inst0.yml +1 -0
- data/lib/deltacloud/drivers/mock/data/instances/inst1.yml +1 -0
- data/lib/deltacloud/drivers/mock/data/instances/inst2.yml +1 -0
- data/lib/deltacloud/drivers/mock/data/storage_volumes/vol1.yml +1 -0
- data/lib/deltacloud/drivers/mock/data/storage_volumes/vol2.yml +1 -0
- data/lib/deltacloud/drivers/mock/data/storage_volumes/vol3.yml +1 -0
- data/lib/deltacloud/drivers/mock/mock_driver.rb +138 -30
- data/lib/deltacloud/drivers/opennebula/cloud_client.rb +13 -15
- data/lib/deltacloud/drivers/opennebula/occi_client.rb +13 -15
- data/lib/deltacloud/drivers/opennebula/opennebula_driver.rb +13 -15
- data/lib/deltacloud/drivers/rackspace/rackspace_driver.rb +224 -113
- data/lib/deltacloud/drivers/rhevm/rhevm_client.rb +332 -0
- data/lib/deltacloud/drivers/rhevm/rhevm_driver.rb +221 -170
- data/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb +0 -1
- data/lib/deltacloud/drivers/sbc/sbc_client.rb +247 -0
- data/lib/deltacloud/drivers/sbc/sbc_driver.rb +297 -0
- data/lib/deltacloud/drivers/terremark/terremark_driver.rb +0 -2
- data/lib/deltacloud/hardware_profile.rb +1 -3
- data/lib/deltacloud/helpers.rb +0 -2
- data/lib/deltacloud/helpers/application_helper.rb +86 -12
- data/lib/deltacloud/helpers/blob_stream.rb +19 -2
- data/lib/deltacloud/helpers/conversion_helper.rb +0 -2
- data/lib/deltacloud/helpers/hardware_profiles_helper.rb +0 -2
- data/lib/deltacloud/method_serializer.rb +0 -2
- data/lib/deltacloud/models/base_model.rb +0 -2
- data/lib/deltacloud/models/blob.rb +1 -2
- data/lib/deltacloud/models/bucket.rb +0 -2
- data/lib/deltacloud/models/image.rb +0 -2
- data/lib/deltacloud/models/instance.rb +19 -2
- data/lib/deltacloud/models/instance_profile.rb +4 -2
- data/lib/deltacloud/models/key.rb +0 -2
- data/lib/deltacloud/models/load_balancer.rb +0 -2
- data/lib/deltacloud/models/realm.rb +0 -2
- data/lib/deltacloud/models/storage_snapshot.rb +0 -2
- data/lib/deltacloud/models/storage_volume.rb +4 -2
- data/lib/deltacloud/runner.rb +132 -0
- data/lib/deltacloud/state_machine.rb +0 -2
- data/lib/deltacloud/validation.rb +9 -7
- data/lib/drivers.rb +36 -48
- data/lib/sinatra/accept_media_types.rb +26 -0
- data/lib/sinatra/lazy_auth.rb +16 -0
- data/lib/sinatra/rabbit.rb +112 -54
- data/lib/sinatra/rack_driver_select.rb +50 -16
- data/lib/sinatra/rack_etag.rb +79 -0
- data/lib/sinatra/rack_matrix_params.rb +84 -0
- data/lib/sinatra/rack_runtime.rb +47 -0
- data/lib/sinatra/static_assets.rb +16 -0
- data/lib/sinatra/url_for.rb +31 -4
- data/public/favicon.ico +0 -0
- data/public/images/bread-bg.png +0 -0
- data/public/images/error.png +0 -0
- data/public/images/pending.png +0 -0
- data/public/images/running.png +0 -0
- data/public/images/stopped.png +0 -0
- data/public/javascripts/application.js +35 -0
- data/public/stylesheets/compiled/application.css +59 -5
- data/public/stylesheets/compiled/screen.css +1 -1
- data/server.rb +293 -29
- data/support/fedora/deltacloud-core +78 -0
- data/support/fedora/deltacloud-core.spec +143 -0
- data/support/fedora/deltacloudd +78 -18
- data/support/fedora/rubygem-deltacloud-core.spec +76 -40
- data/tests/common.rb +172 -0
- data/tests/drivers/mock/api_test.rb +133 -0
- data/tests/drivers/mock/hardware_profiles_test.rb +134 -0
- data/tests/drivers/mock/images_test.rb +126 -0
- data/tests/drivers/mock/instance_states_test.rb +71 -0
- data/tests/drivers/mock/instances_test.rb +236 -0
- data/tests/drivers/mock/realms_test.rb +93 -0
- data/tests/drivers/mock/setup.rb +3 -0
- data/tests/drivers/mock/url_for_test.rb +67 -0
- data/tests/drivers/rackspace/api_test.rb +41 -0
- data/tests/drivers/rackspace/hardware_profiles_test.rb +53 -0
- data/tests/drivers/rackspace/images_test.rb +40 -0
- data/tests/drivers/rackspace/instances_test.rb +161 -0
- data/tests/drivers/rackspace/realms_test.rb +36 -0
- data/tests/drivers/rackspace/setup.rb +14 -0
- data/tests/drivers/rhevm/api_test.rb +39 -0
- data/tests/drivers/rhevm/hardware_profiles_test.rb +53 -0
- data/tests/drivers/rhevm/images_test.rb +42 -0
- data/tests/drivers/rhevm/instances_test.rb +179 -0
- data/tests/drivers/rhevm/realms_test.rb +35 -0
- data/tests/drivers/rhevm/setup.rb +14 -0
- data/tests/rabbit_test.rb +52 -0
- data/views/api/show.html.haml +2 -5
- data/views/blobs/new.html.haml +17 -1
- data/views/blobs/show.html.haml +6 -0
- data/views/blobs/show.xml.haml +5 -1
- data/views/buckets/index.html.haml +1 -12
- data/views/buckets/index.xml.haml +3 -5
- data/views/docs/operation.html.haml +23 -11
- data/views/drivers/index.html.haml +15 -0
- data/views/drivers/index.xml.haml +7 -0
- data/views/drivers/show.html.haml +20 -0
- data/views/drivers/show.xml.haml +7 -0
- data/views/error.html.haml +31 -0
- data/views/errors/auth_exception.xml.haml +2 -1
- data/views/errors/backend_capability_failure.xml.haml +2 -1
- data/views/errors/backend_error.html.haml +3 -0
- data/views/errors/backend_error.xml.haml +2 -2
- data/views/errors/validation_failure.xml.haml +3 -2
- data/views/images/index.html.haml +1 -6
- data/views/images/index.xml.haml +2 -0
- data/views/images/new.html.haml +14 -0
- data/views/images/show.xml.haml +2 -0
- data/views/instances/index.html.haml +8 -6
- data/views/instances/index.xml.haml +4 -0
- data/views/instances/new.html.haml +40 -11
- data/views/instances/run.html.haml +9 -0
- data/views/instances/run.xml.haml +7 -0
- data/views/instances/run_command.html.haml +16 -0
- data/views/instances/show.html.haml +14 -0
- data/views/instances/show.xml.haml +12 -4
- data/views/layout.html.haml +7 -2
- data/views/load_balancers/index.html.haml +1 -1
- data/views/load_balancers/new.html.haml +2 -2
- data/views/load_balancers/show.html.haml +1 -1
- data/views/storage_snapshots/index.html.haml +3 -0
- data/views/storage_snapshots/new.html.haml +9 -0
- data/views/storage_volumes/attach.html.haml +20 -0
- data/views/storage_volumes/index.html.haml +16 -1
- data/views/storage_volumes/index.xml.haml +1 -10
- data/views/storage_volumes/new.html.haml +17 -0
- data/views/storage_volumes/show.html.haml +8 -0
- data/views/storage_volumes/show.xml.haml +25 -3
- metadata +197 -127
- data/lib/deltacloud/drivers/rackspace/rackspace_client.rb +0 -130
- data/parse.rb +0 -7
- data/test.rb +0 -3
- data/views/api/drivers.xml.haml +0 -6
data/DISCLAIMER
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
Apache Deltacloud is an effort undergoing incubation at The Apache Software
|
|
2
|
+
Foundation (ASF), sponsored by the Incubator PMC. Incubation is required of
|
|
3
|
+
all newly accepted projects until a further review indicates that the
|
|
4
|
+
infrastructure, communications, and decision making process have stabilized
|
|
5
|
+
in a manner consistent with other successful ASF projects. While
|
|
6
|
+
incubation status is not necessarily a reflection of the completeness or
|
|
7
|
+
stability of the code, it does indicate that the project has yet to be
|
|
8
|
+
fully endorsed by the ASF.
|
data/{COPYING → LICENSE}
RENAMED
|
File without changes
|
data/NOTICE
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Apache Deltacloud
|
|
2
|
+
Copyright 2010 The Apache Software Foundation
|
|
3
|
+
|
|
4
|
+
This product includes software developed at The Apache Software Foundation
|
|
5
|
+
(http://www.apache.org/).
|
|
6
|
+
|
|
7
|
+
This product includes software developed by Red Hat,
|
|
8
|
+
Inc. (http://www.redhat.com/)
|
|
9
|
+
|
|
10
|
+
This product includes software developed by IBM Corporation
|
|
11
|
+
|
|
12
|
+
This product includes software developed by the OpenNebula Project
|
|
13
|
+
(http://opennebula.org/)
|
data/Rakefile
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
#
|
|
2
|
-
# Copyright (C) 2009 Red Hat, Inc.
|
|
3
|
-
#
|
|
4
2
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
|
5
3
|
# contributor license agreements. See the NOTICE file distributed with
|
|
6
4
|
# this work for additional information regarding copyright ownership. The
|
|
@@ -28,65 +26,66 @@ begin
|
|
|
28
26
|
rescue LoadError
|
|
29
27
|
end
|
|
30
28
|
|
|
31
|
-
desc "Run basic unit tests"
|
|
32
|
-
Rake::TestTask.new("test") { |t|
|
|
33
|
-
t.test_files = FileList.new('tests/**/*_test.rb')
|
|
34
|
-
t.verbose = true
|
|
35
|
-
t.warning = false
|
|
36
|
-
}
|
|
37
|
-
|
|
38
29
|
begin
|
|
39
|
-
require '
|
|
40
|
-
|
|
41
|
-
|
|
30
|
+
require 'cucumber'
|
|
31
|
+
require 'cucumber/rake/task'
|
|
32
|
+
namespace :cucumber do
|
|
33
|
+
%w(mock ec2 sbc).each do |driver|
|
|
34
|
+
namespace driver do
|
|
35
|
+
Cucumber::Rake::Task.new(:test) do |t|
|
|
36
|
+
t.cucumber_opts = "../tests/#{driver} --format pretty"
|
|
37
|
+
t.rcov = false
|
|
38
|
+
end
|
|
39
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
|
40
|
+
t.cucumber_opts = "../tests/#{driver} --format html --out ../tests/tmp/cucumber_#{driver}.html"
|
|
41
|
+
t.rcov = false
|
|
42
|
+
end
|
|
43
|
+
Cucumber::Rake::Task.new(:junit) do |t|
|
|
44
|
+
t.cucumber_opts = "../tests/#{driver} --format junit --out #{File.join(File.dirname(__FILE__), "tmp", "junit_#{driver}")}"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
42
48
|
end
|
|
43
49
|
rescue LoadError
|
|
44
50
|
end
|
|
45
51
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
52
|
+
namespace :test do
|
|
53
|
+
%w(mock rackspace rhevm).each do |driver|
|
|
54
|
+
desc "Run #{driver} unit tests"
|
|
55
|
+
Rake::TestTask.new(driver) { |t|
|
|
56
|
+
t.test_files = ['tests/common.rb', "tests/drivers/#{driver}/setup.rb"] + FileList.new("tests/drivers/#{driver}/*_test.rb") + FileList.new('tests/rabbit_test.rb')
|
|
57
|
+
t.options = "-v -v"
|
|
58
|
+
t.verbose = true
|
|
59
|
+
t.warning = false
|
|
60
|
+
}
|
|
61
|
+
end
|
|
49
62
|
end
|
|
50
63
|
|
|
51
|
-
desc "
|
|
52
|
-
task :
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
Dir["config/**/**"],
|
|
59
|
-
Dir["features/**/**"],
|
|
60
|
-
Dir["lib/**/**"],
|
|
61
|
-
Dir["public/**/**"],
|
|
62
|
-
Dir["views/**/**"],
|
|
63
|
-
"config.ru",
|
|
64
|
-
"COPYING",
|
|
65
|
-
"README",
|
|
66
|
-
"*.rb"
|
|
67
|
-
]
|
|
68
|
-
|
|
69
|
-
INSTALL_DIR=args.install_dir || "/usr/local/share/deltacloud-core"
|
|
70
|
-
BIN_DIR=args.bin_dir || "/usr/local/bin"
|
|
71
|
-
|
|
72
|
-
exit(1) unless FileUtils.mkdir_p(INSTALL_DIR)
|
|
73
|
-
exit(1) unless FileUtils.mkdir_p(BIN_DIR)
|
|
64
|
+
desc "Call our Test::Unit suite"
|
|
65
|
+
task :test do
|
|
66
|
+
%w(mock rackspace rhevm).each do |driver|
|
|
67
|
+
Rake::Task["test:#{driver}"].reenable
|
|
68
|
+
Rake::Task["test:#{driver}"].invoke
|
|
69
|
+
end
|
|
70
|
+
end
|
|
74
71
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
next if File.directory?(f)
|
|
81
|
-
FileUtils.install(f, "#{INSTALL_DIR}/#{File.dirname(f)}", :verbose => true)
|
|
72
|
+
desc "Call our Cucumber suite"
|
|
73
|
+
task :cucumber do
|
|
74
|
+
%w(mock ec2 sbc).each do |driver|
|
|
75
|
+
Rake::Task["cucumber:#{driver}:test"].reenable
|
|
76
|
+
Rake::Task["cucumber:#{driver}:test"].invoke
|
|
82
77
|
end
|
|
78
|
+
end
|
|
83
79
|
|
|
84
|
-
|
|
80
|
+
begin
|
|
81
|
+
require 'yard'
|
|
82
|
+
YARD::Rake::YardocTask.new do |t|
|
|
83
|
+
t.files = ['lib/**/*.rb', '*.rb'] # optional
|
|
84
|
+
end
|
|
85
|
+
rescue LoadError
|
|
85
86
|
end
|
|
86
87
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
INSTALL_DIR="/usr/share/deltacloud-core"
|
|
91
|
-
FileUtils.rm_rf(INSTALL_DIR)
|
|
88
|
+
spec = Gem::Specification.load('deltacloud-core.gemspec')
|
|
89
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
|
90
|
+
pkg.need_tar = true
|
|
92
91
|
end
|
data/bin/deltacloudd
CHANGED
|
@@ -36,6 +36,9 @@ BANNER
|
|
|
36
36
|
opts.on( '-p', '--port PORT', 'Use PORT (default: 3001)') do |port|
|
|
37
37
|
ENV["API_PORT"] = port
|
|
38
38
|
end
|
|
39
|
+
opts.on( '-P', '--provider PROVIDER', 'Use PROVIDER (default is set in the driver)') do |provider|
|
|
40
|
+
ENV['API_PROVIDER'] = provider
|
|
41
|
+
end
|
|
39
42
|
opts.on( '-e', '--env ENV', 'Environment (default: "development")') { |env| options[:env] = env }
|
|
40
43
|
opts.on( '-h', '--help', '') { options[:help] = true }
|
|
41
44
|
end
|
|
@@ -55,7 +58,10 @@ end
|
|
|
55
58
|
ENV["API_HOST"] = "localhost" unless ENV["API_HOST"]
|
|
56
59
|
ENV["API_PORT"] = "3001" unless ENV["API_PORT"]
|
|
57
60
|
|
|
58
|
-
|
|
61
|
+
msg = "Starting Deltacloud API :: #{ENV["API_DRIVER"]} "
|
|
62
|
+
msg << ":: #{ENV['API_PROVIDER']} " if ENV['API_PROVIDER']
|
|
63
|
+
msg << ":: http://#{ENV["API_HOST"]}:#{ENV["API_PORT"]}/api"
|
|
64
|
+
puts msg
|
|
59
65
|
puts
|
|
60
66
|
|
|
61
67
|
dirname="#{File.dirname(__FILE__)}/.."
|
|
@@ -99,6 +105,7 @@ else
|
|
|
99
105
|
argv_opts << ['--rackup', 'config.ru' ]
|
|
100
106
|
argv_opts << ['--chdir', dirname ]
|
|
101
107
|
argv_opts << ['-e', options[:env] ]
|
|
108
|
+
argv_opts << ['--timeout', '60']
|
|
102
109
|
argv_opts << ['--threaded', '-D', '--stats', '/stats']
|
|
103
110
|
|
|
104
111
|
argv_opts.flatten!
|
data/config.ru
CHANGED
data/config/drivers.yaml
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
:gogrid:
|
|
3
|
+
:name: Gogrid
|
|
4
|
+
:mock:
|
|
5
|
+
:name: Mock
|
|
6
|
+
:rhevm:
|
|
7
|
+
:name: RHEVM
|
|
8
|
+
:entrypoints:
|
|
9
|
+
default:
|
|
10
|
+
default: "https://rhev-m.localhost:8443/rhevm-api-powershell"
|
|
11
|
+
:rimuhosting:
|
|
12
|
+
:name: RimuHosting
|
|
13
|
+
:opennebula:
|
|
14
|
+
:class: OpennebulaDriver
|
|
15
|
+
:name: Opennebula
|
|
16
|
+
:sbc:
|
|
17
|
+
:name: SBC
|
|
18
|
+
:terremark:
|
|
19
|
+
:name: Terremark
|
|
20
|
+
:rackspace:
|
|
21
|
+
:name: Rackspace
|
|
22
|
+
:azure:
|
|
23
|
+
:name: Azure
|
|
24
|
+
:eucalyptus:
|
|
25
|
+
:name: Eucalyptus
|
|
26
|
+
:username: Access Key ID
|
|
27
|
+
:password: Secret Access Key
|
|
28
|
+
:entrypoints:
|
|
29
|
+
default:
|
|
30
|
+
default: "ec2=EUCALYPTUS_IP[:PORT];s3=WALRUS_IP[:PORT]"
|
|
31
|
+
:ec2:
|
|
32
|
+
:entrypoints:
|
|
33
|
+
s3:
|
|
34
|
+
us-west-1: s3-us-west-1.amazonaws.com
|
|
35
|
+
ap-southeast-1: s3-ap-southeast-1.amazonaws.com
|
|
36
|
+
eu-west-1: s3-eu-west-1.amazonaws.com
|
|
37
|
+
us-east-1: s3.amazonaws.com
|
|
38
|
+
elb:
|
|
39
|
+
us-west-1: elasticloadbalancing.us-west-1.amazonaws.com
|
|
40
|
+
ap-southeast-1: elasticloadbalancing.ap-southeast-1.amazonaws.com
|
|
41
|
+
eu-west-1: elasticloadbalancing.eu-west-1.amazonaws.com
|
|
42
|
+
us-east-1: elasticloadbalancing.us-east-1.amazonaws.com
|
|
43
|
+
ec2:
|
|
44
|
+
us-west-1: ec2.us-west-1.amazonaws.com
|
|
45
|
+
ap-southeast-1: ec2.ap-southeast-1.amazonaws.com
|
|
46
|
+
eu-west-1: ec2.eu-west-1.amazonaws.com
|
|
47
|
+
us-east-1: ec2.us-east-1.amazonaws.com
|
|
48
|
+
:name: EC2
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Licensed to the Apache Software Foundation (ASF) under one or more
|
|
3
|
+
# contributor license agreements. See the NOTICE file distributed with
|
|
4
|
+
# this work for additional information regarding copyright ownership. The
|
|
5
|
+
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
6
|
+
# "License"); you may not use this file except in compliance with the
|
|
7
|
+
# License. You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
13
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
14
|
+
# License for the specific language governing permissions and limitations
|
|
15
|
+
# under the License.
|
|
16
|
+
|
|
17
|
+
require 'rake'
|
|
18
|
+
|
|
19
|
+
Gem::Specification.new do |s|
|
|
20
|
+
s.author = 'Red Hat, Inc.'
|
|
21
|
+
s.homepage = "http://www.deltacloud.org"
|
|
22
|
+
s.email = 'deltacloud-users@lists.fedorahosted.org'
|
|
23
|
+
s.name = 'deltacloud-core'
|
|
24
|
+
|
|
25
|
+
s.description = <<-EOF
|
|
26
|
+
The Deltacloud API is built as a service-based REST API.
|
|
27
|
+
You do not directly link a Deltacloud library into your program to use it.
|
|
28
|
+
Instead, a client speaks the Deltacloud API over HTTP to a server
|
|
29
|
+
which implements the REST interface.
|
|
30
|
+
EOF
|
|
31
|
+
|
|
32
|
+
s.version = '0.3.0'
|
|
33
|
+
s.date = Time.now
|
|
34
|
+
s.summary = %q{Deltacloud REST API}
|
|
35
|
+
s.files = FileList[
|
|
36
|
+
'Rakefile',
|
|
37
|
+
'*.gemspec',
|
|
38
|
+
'config.ru',
|
|
39
|
+
'*.rb',
|
|
40
|
+
'log',
|
|
41
|
+
'config/drivers.yaml',
|
|
42
|
+
'tmp',
|
|
43
|
+
'support/fedora/**',
|
|
44
|
+
'lib/**/*.rb',
|
|
45
|
+
'lib/**/*.yml',
|
|
46
|
+
'tests/**/*.rb',
|
|
47
|
+
'views/**/*.haml',
|
|
48
|
+
'views/instance_states/*.erb',
|
|
49
|
+
'public/favicon.ico',
|
|
50
|
+
'public/images/*.png',
|
|
51
|
+
'public/javascripts/*.js',
|
|
52
|
+
'public/stylesheets/compiled/*.css',
|
|
53
|
+
'bin/deltacloudd'
|
|
54
|
+
].to_a
|
|
55
|
+
|
|
56
|
+
s.bindir = 'bin'
|
|
57
|
+
s.executables = 'deltacloudd'
|
|
58
|
+
s.test_files= Dir.glob("tests/*_test.rb")
|
|
59
|
+
s.extra_rdoc_files = Dir["LICENSE", "DISCLAIMER", "NOTICE"]
|
|
60
|
+
s.required_ruby_version = '>= 1.8.1'
|
|
61
|
+
|
|
62
|
+
s.add_dependency('rake', '>= 0.8.7')
|
|
63
|
+
s.add_dependency('haml', '>= 2.2.17')
|
|
64
|
+
s.add_dependency('sinatra', '>= 0.9.4')
|
|
65
|
+
s.add_dependency('rack', '>= 1.0.0', '<=1.1.0')
|
|
66
|
+
s.add_dependency('rack-accept', '~> 0.4.3')
|
|
67
|
+
s.add_dependency('json', '>= 1.1.9')
|
|
68
|
+
s.add_dependency('net-ssh', '>= 2.0.0')
|
|
69
|
+
s.add_development_dependency('compass', '>= 0.8.17')
|
|
70
|
+
s.add_development_dependency('nokogiri', '>= 1.4.1', '< 1.4.4')
|
|
71
|
+
s.add_development_dependency('rack-test', '>= 0.5.3')
|
|
72
|
+
s.add_development_dependency('cucumber', '>= 0.6.3')
|
|
73
|
+
s.add_development_dependency('rcov', '>= 0.9.8')
|
|
74
|
+
|
|
75
|
+
end
|
data/deltacloud.rb
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
#
|
|
2
|
-
# Copyright (C) 2009,2010 Red Hat, Inc.
|
|
3
|
-
#
|
|
4
2
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
|
5
3
|
# contributor license agreements. See the NOTICE file distributed with
|
|
6
4
|
# this work for additional information regarding copyright ownership. The
|
|
@@ -20,6 +18,8 @@ $:.unshift File.join(File.dirname(__FILE__), 'lib')
|
|
|
20
18
|
|
|
21
19
|
require 'drivers'
|
|
22
20
|
|
|
21
|
+
require 'deltacloud/core_ext'
|
|
22
|
+
|
|
23
23
|
require 'deltacloud/base_driver'
|
|
24
24
|
require 'deltacloud/hardware_profile'
|
|
25
25
|
require 'deltacloud/state_machine'
|
|
@@ -38,3 +38,4 @@ require 'deltacloud/models/load_balancer'
|
|
|
38
38
|
|
|
39
39
|
require 'deltacloud/validation'
|
|
40
40
|
require 'deltacloud/helpers'
|
|
41
|
+
require 'deltacloud/runner'
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
#
|
|
2
|
-
# Copyright (C) 2009, 2010 Red Hat, Inc.
|
|
3
|
-
#
|
|
4
2
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
|
5
3
|
# contributor license agreements. See the NOTICE file distributed with
|
|
6
4
|
# this work for additional information regarding copyright ownership. The
|
|
@@ -20,6 +18,7 @@ module Deltacloud::BackendCapability
|
|
|
20
18
|
|
|
21
19
|
class Failure < StandardError
|
|
22
20
|
attr_reader :capability
|
|
21
|
+
|
|
23
22
|
def initialize(capability, msg='')
|
|
24
23
|
super(msg)
|
|
25
24
|
@capability = capability
|
|
@@ -27,13 +26,26 @@ module Deltacloud::BackendCapability
|
|
|
27
26
|
end
|
|
28
27
|
|
|
29
28
|
attr_reader :capability
|
|
29
|
+
|
|
30
30
|
def with_capability(capability)
|
|
31
31
|
@capability = capability
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
+
def has_capability?(backend)
|
|
35
|
+
!capability or backend.has_capability?(capability)
|
|
36
|
+
end
|
|
37
|
+
|
|
34
38
|
def check_capability(backend)
|
|
35
|
-
if
|
|
39
|
+
if !has_capability?(backend)
|
|
36
40
|
raise Failure.new(capability, "#{capability} capability not supported by backend #{backend.class.name}")
|
|
37
41
|
end
|
|
38
42
|
end
|
|
43
|
+
|
|
44
|
+
module Helpers
|
|
45
|
+
def operations_for_collection(collection)
|
|
46
|
+
collections[collection].operations.values.select { |op| op.has_capability?(driver) }
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
helpers Helpers
|
|
39
51
|
end
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
#
|
|
2
|
-
# Copyright (C) 2009 Red Hat, Inc.
|
|
3
|
-
#
|
|
4
2
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
|
5
3
|
# contributor license agreements. See the NOTICE file distributed with
|
|
6
4
|
# this work for additional information regarding copyright ownership. The
|
|
@@ -42,7 +40,7 @@ module Deltacloud
|
|
|
42
40
|
end
|
|
43
41
|
|
|
44
42
|
class BaseDriver
|
|
45
|
-
|
|
43
|
+
|
|
46
44
|
def self.define_hardware_profile(name,&block)
|
|
47
45
|
@hardware_profiles ||= []
|
|
48
46
|
hw_profile = @hardware_profiles.find{|e| e.name == name}
|
|
@@ -68,7 +66,7 @@ module Deltacloud
|
|
|
68
66
|
end
|
|
69
67
|
|
|
70
68
|
def hardware_profile(credentials, name)
|
|
71
|
-
hardware_profiles(credentials, :
|
|
69
|
+
hardware_profiles(credentials, :id => name).first
|
|
72
70
|
end
|
|
73
71
|
|
|
74
72
|
def filter_hardware_profiles(profiles, opts)
|
|
@@ -76,7 +74,8 @@ module Deltacloud
|
|
|
76
74
|
if v = opts[:architecture]
|
|
77
75
|
profiles = profiles.select { |hwp| hwp.include?(:architecture, v) }
|
|
78
76
|
end
|
|
79
|
-
|
|
77
|
+
# As a request param, we call 'name' 'id'
|
|
78
|
+
if v = opts[:id]
|
|
80
79
|
profiles = profiles.select { |hwp| hwp.name == v }
|
|
81
80
|
end
|
|
82
81
|
end
|
|
@@ -86,7 +85,7 @@ module Deltacloud
|
|
|
86
85
|
def find_hardware_profile(credentials, name, image_id)
|
|
87
86
|
hwp = nil
|
|
88
87
|
if name
|
|
89
|
-
unless hwp = hardware_profiles(credentials, :
|
|
88
|
+
unless hwp = hardware_profiles(credentials, :id => name).first
|
|
90
89
|
raise BackendError.new(400, "bad-hardware-profile-name",
|
|
91
90
|
"Hardware profile '#{name}' does not exist", nil)
|
|
92
91
|
end
|
|
@@ -126,100 +125,90 @@ module Deltacloud
|
|
|
126
125
|
actions
|
|
127
126
|
end
|
|
128
127
|
|
|
128
|
+
## Capabilities
|
|
129
|
+
# The rabbit dsl supports declaring a capability that is required
|
|
130
|
+
# in the backend driver for the call to succeed. A driver can
|
|
131
|
+
# provide a capability by implementing the method with the same
|
|
132
|
+
# name as the capability. Below is a list of the capabilities as
|
|
133
|
+
# the expected method signatures.
|
|
134
|
+
#
|
|
135
|
+
# Following the capability list are the resource member show
|
|
136
|
+
# methods. They each require that the corresponding collection
|
|
137
|
+
# method be defined
|
|
138
|
+
#
|
|
139
|
+
# TODO: standardize all of these to the same signature (credentials, opts)
|
|
140
|
+
#
|
|
141
|
+
# def realms(credentials, opts=nil)
|
|
142
|
+
#
|
|
143
|
+
# def images(credentials, ops)
|
|
144
|
+
#
|
|
145
|
+
# def instances(credentials, ops)
|
|
146
|
+
# def create_instance(credentials, image_id, opts)
|
|
147
|
+
# def start_instance(credentials, id)
|
|
148
|
+
# def stop_instance(credentials, id)
|
|
149
|
+
# def reboot_instance(credentials, id)
|
|
150
|
+
#
|
|
151
|
+
# def storage_volumes(credentials, ops)
|
|
152
|
+
#
|
|
153
|
+
# def storage_snapshots(credentials, ops)
|
|
154
|
+
#
|
|
155
|
+
# def buckets(credentials, opts = nil)
|
|
156
|
+
# def create_bucket(credentials, name, opts=nil)
|
|
157
|
+
# def delete_bucket(credentials, name, opts=nil)
|
|
158
|
+
#
|
|
159
|
+
# def blobs(credentials, opts = nil)
|
|
160
|
+
# def blob_data(credentials, bucket_id, blob_id, opts)
|
|
161
|
+
# def create_blob(credentials, bucket_id, blob_id, blob_data, opts=nil)
|
|
162
|
+
# def delete_blob(credentials, bucket_id, blob_id, opts=nil)
|
|
163
|
+
#
|
|
164
|
+
# def keys(credentials, opts)
|
|
165
|
+
# def create_key(credentials, opts)
|
|
166
|
+
# def destroy_key(credentials, opts)
|
|
167
|
+
|
|
129
168
|
def realm(credentials, opts)
|
|
130
|
-
realms = realms(credentials, opts)
|
|
131
|
-
return realms.first unless realms.empty?
|
|
132
|
-
nil
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
def realms(credentials, opts=nil)
|
|
136
|
-
[]
|
|
169
|
+
realms = realms(credentials, opts).first if has_capability?(:realms)
|
|
137
170
|
end
|
|
138
171
|
|
|
139
172
|
def image(credentials, opts)
|
|
140
|
-
images
|
|
141
|
-
return images.first unless images.empty?
|
|
142
|
-
nil
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
def images(credentials, ops)
|
|
146
|
-
[]
|
|
173
|
+
images(credentials, opts).first if has_capability?(:images)
|
|
147
174
|
end
|
|
148
175
|
|
|
149
176
|
def instance(credentials, opts)
|
|
150
|
-
instances
|
|
151
|
-
return instances.first unless instances.empty?
|
|
152
|
-
nil
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
def instances(credentials, ops)
|
|
156
|
-
[]
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
def create_instance(credentials, image_id, opts)
|
|
160
|
-
end
|
|
161
|
-
def start_instance(credentials, id)
|
|
162
|
-
end
|
|
163
|
-
def stop_instance(credentials, id)
|
|
164
|
-
end
|
|
165
|
-
def reboot_instance(credentials, id)
|
|
177
|
+
instances(credentials, opts).first if has_capability?(:instances)
|
|
166
178
|
end
|
|
167
179
|
|
|
168
180
|
def storage_volume(credentials, opts)
|
|
169
|
-
|
|
170
|
-
return volumes.first unless volumes.empty?
|
|
171
|
-
nil
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
def storage_volumes(credentials, ops)
|
|
175
|
-
[]
|
|
181
|
+
storage_volumes(credentials, opts).first if has_capability?(:storage_volumes)
|
|
176
182
|
end
|
|
177
183
|
|
|
178
184
|
def storage_snapshot(credentials, opts)
|
|
179
|
-
|
|
180
|
-
return snapshots.first unless snapshots.empty?
|
|
181
|
-
nil
|
|
185
|
+
storage_snapshots(credentials, opts).first if has_capability?(:storage_snapshots)
|
|
182
186
|
end
|
|
183
187
|
|
|
184
|
-
def
|
|
185
|
-
|
|
188
|
+
def bucket(credentials, opts = {})
|
|
189
|
+
#list of objects within bucket
|
|
190
|
+
buckets(credentials, opts).first if has_capability?(:buckets)
|
|
186
191
|
end
|
|
187
|
-
|
|
188
|
-
def
|
|
189
|
-
|
|
190
|
-
[]
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
def bucket(credentials, opts = nil)
|
|
194
|
-
#list of objects within bucket
|
|
195
|
-
list = buckets(credentials, opts)
|
|
196
|
-
return list.first unless list.empty?
|
|
197
|
-
nil
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
def create_bucket(credentials, name, opts=nil)
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
def delete_bucket(credentials, name, opts=nil)
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
def blobs(credentials, opts = nil)
|
|
207
|
-
[]
|
|
208
|
-
end
|
|
209
|
-
|
|
210
|
-
def blob(credentials, opts = nil)
|
|
211
|
-
list = blobs(credentials, opts)
|
|
212
|
-
return list.first unless list.empty?
|
|
192
|
+
|
|
193
|
+
def blob(credentials, opts = {})
|
|
194
|
+
blobs(credentials, opts).first if has_capability?(:blobs)
|
|
213
195
|
end
|
|
214
196
|
|
|
215
|
-
def
|
|
197
|
+
def key(credentials, opts=nil)
|
|
198
|
+
keys(credentials, opts).first if has_capability?(:keys)
|
|
216
199
|
end
|
|
217
200
|
|
|
218
|
-
|
|
219
|
-
|
|
201
|
+
MEMBER_SHOW_METHODS =
|
|
202
|
+
[ :realm, :image, :instance, :storage_volume, :bucket, :blob, :key ]
|
|
220
203
|
|
|
221
|
-
def
|
|
204
|
+
def has_capability?(capability)
|
|
205
|
+
if MEMBER_SHOW_METHODS.include?(capability.to_sym)
|
|
206
|
+
has_capability?(capability.to_s.pluralize)
|
|
207
|
+
else
|
|
208
|
+
respond_to?(capability)
|
|
209
|
+
end
|
|
222
210
|
end
|
|
211
|
+
|
|
223
212
|
|
|
224
213
|
def filter_on(collection, attribute, opts)
|
|
225
214
|
return collection if opts.nil?
|
|
@@ -237,8 +226,7 @@ module Deltacloud
|
|
|
237
226
|
end
|
|
238
227
|
|
|
239
228
|
def has_collection?(collection)
|
|
240
|
-
|
|
241
|
-
return false
|
|
229
|
+
supported_collections.include?(collection)
|
|
242
230
|
end
|
|
243
231
|
|
|
244
232
|
def catched_exceptions_list
|
|
@@ -248,18 +236,26 @@ module Deltacloud
|
|
|
248
236
|
def safely(&block)
|
|
249
237
|
begin
|
|
250
238
|
block.call
|
|
251
|
-
rescue *catched_exceptions_list[:error] => e
|
|
252
|
-
raise Deltacloud::BackendError.new(502, e.class.to_s, e.message, e.backtrace)
|
|
253
|
-
rescue *catched_exceptions_list[:auth] => e
|
|
254
|
-
raise Deltacloud::AuthException.new
|
|
255
239
|
rescue => e
|
|
240
|
+
catched_exceptions_list[:auth].each do |ex|
|
|
241
|
+
if e.class == ex or e.class.name =~ ex or e.message =~ ex
|
|
242
|
+
raise Deltacloud::AuthException.new
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
catched_exceptions_list[:error].each do |ex|
|
|
246
|
+
if e.class == ex or e.class.name =~ ex or e.message =~ ex
|
|
247
|
+
raise Deltacloud::BackendError.new(502, e.class.to_s, e.message, e.backtrace) if e.class.name =~ ex
|
|
248
|
+
end
|
|
249
|
+
end
|
|
256
250
|
catched_exceptions_list[:glob].each do |ex|
|
|
257
|
-
|
|
251
|
+
if e.class == ex or e.class.name =~ ex or e.message =~ ex
|
|
252
|
+
raise Deltacloud::BackendError.new(500, e.class.to_s, e.message, e.backtrace)
|
|
253
|
+
end
|
|
258
254
|
end
|
|
259
|
-
puts "
|
|
260
|
-
puts e.
|
|
261
|
-
puts "
|
|
262
|
-
raise e
|
|
255
|
+
$stderr.puts "# UNCAUGHT EXCEPTION # -> '#{e.class}' - '#{e.message}'"
|
|
256
|
+
$stderr.puts "# #{e.backtrace.join("\n")}"
|
|
257
|
+
$stderr.puts "##############"
|
|
258
|
+
raise Deltacloud::BackendError.new(500, e.class.to_s, e.message, e.backtrace)
|
|
263
259
|
end
|
|
264
260
|
end
|
|
265
261
|
|