bbrowning-deltacloud-core 0.0.4-java → 0.0.6-java
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/lib/deltacloud/drivers/ec2/ec2_driver.rb +9 -0
- data/lib/deltacloud/drivers/gogrid/gogrid_driver.rb +9 -0
- data/lib/deltacloud/drivers/mock/mock_driver.rb +9 -0
- data/lib/deltacloud/drivers/rackspace/rackspace_driver.rb +9 -0
- data/lib/deltacloud/drivers/terremark/terremark_driver.rb +9 -0
- data/lib/deltacloud/drivers/virtualbox/virtualbox_driver.rb +253 -0
- data/lib/drivers.rb +1 -0
- data/server.rb +3 -0
- metadata +4 -3
@@ -310,6 +310,15 @@ class EC2Driver < Deltacloud::BaseDriver
|
|
310
310
|
end
|
311
311
|
end
|
312
312
|
|
313
|
+
def valid_credentials?(credentials)
|
314
|
+
client = new_client(credentials)
|
315
|
+
# FIXME: We need to do this call to determine if
|
316
|
+
# EC2 is working with given credentials. There is no
|
317
|
+
# other way to check, if given credentials are valid or not.
|
318
|
+
realms = client.describe_availability_zones rescue false
|
319
|
+
return realms ? true : false
|
320
|
+
end
|
321
|
+
|
313
322
|
private
|
314
323
|
|
315
324
|
def new_client(credentials)
|
@@ -192,6 +192,15 @@ class GogridDriver < Deltacloud::BaseDriver
|
|
192
192
|
return creds
|
193
193
|
end
|
194
194
|
|
195
|
+
def valid_credentials?(credentials)
|
196
|
+
client = new_client(credentials)
|
197
|
+
# FIXME: We need to do this call to determine if
|
198
|
+
# GoGrid is working with given credentials. There is no
|
199
|
+
# other way to check, if given credentials are valid or not.
|
200
|
+
return false unless new_client(credentials).request('common/lookup/list', { 'lookup' => 'ip.datacenter' })
|
201
|
+
true
|
202
|
+
end
|
203
|
+
|
195
204
|
define_instance_states do
|
196
205
|
start.to( :pending ) .automatically
|
197
206
|
pending.to( :running ) .automatically
|
@@ -257,6 +257,15 @@ class MockDriver < Deltacloud::BaseDriver
|
|
257
257
|
snapshots
|
258
258
|
end
|
259
259
|
|
260
|
+
def valid_credentials?(credentials)
|
261
|
+
begin
|
262
|
+
check_credentials(credentials)
|
263
|
+
return true
|
264
|
+
rescue Deltacloud::AuthException
|
265
|
+
end
|
266
|
+
return false
|
267
|
+
end
|
268
|
+
|
260
269
|
private
|
261
270
|
|
262
271
|
def check_credentials(credentials)
|
@@ -131,6 +131,15 @@ class RackspaceDriver < Deltacloud::BaseDriver
|
|
131
131
|
instances
|
132
132
|
end
|
133
133
|
|
134
|
+
def valid_credentials?(credentials)
|
135
|
+
begin
|
136
|
+
new_client(credentials)
|
137
|
+
rescue
|
138
|
+
return false
|
139
|
+
end
|
140
|
+
true
|
141
|
+
end
|
142
|
+
|
134
143
|
|
135
144
|
def convert_srv_to_instance(srv)
|
136
145
|
inst = Instance.new(:id => srv["id"].to_s,
|
@@ -191,6 +191,15 @@ def destroy_instance(credentials, id)
|
|
191
191
|
end
|
192
192
|
end
|
193
193
|
|
194
|
+
def valid_credentials?(credentials)
|
195
|
+
begin
|
196
|
+
new_client(credentials)
|
197
|
+
rescue Deltacloud::AuthException
|
198
|
+
return false
|
199
|
+
end
|
200
|
+
true
|
201
|
+
end
|
202
|
+
|
194
203
|
#--
|
195
204
|
# PRIVATE METHODS:
|
196
205
|
#--
|
@@ -0,0 +1,253 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2009 Red Hat, Inc.
|
3
|
+
#
|
4
|
+
# Licensed to the Apache Software Foundation (ASF) under one or more
|
5
|
+
# contributor license agreements. See the NOTICE file distributed with
|
6
|
+
# this work for additional information regarding copyright ownership. The
|
7
|
+
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
8
|
+
# "License"); you may not use this file except in compliance with the
|
9
|
+
# License. You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
15
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
16
|
+
# License for the specific language governing permissions and limitations
|
17
|
+
# under the License.
|
18
|
+
|
19
|
+
# INSTALLATION:
|
20
|
+
# 1. You need VirtualBox and VBoxManage tool installed
|
21
|
+
# 2. You need to setup some images manually inside VirtualBox
|
22
|
+
# 3. You need to install 'Guest Additions' to this images for metrics
|
23
|
+
# 4. You need a lot of hard drive space ;-)
|
24
|
+
|
25
|
+
# NETWORKING:
|
26
|
+
# For now, the VM is always started with bridged networking. The NIC
|
27
|
+
# it uses defaults to eth0, but may be overriden with the VIRTUALBOX_NIC
|
28
|
+
# environment variable. This should be the NIC name as expected by Virtualbox.
|
29
|
+
# For example, on my Macbook Pro this is 'en1: AirPort'
|
30
|
+
|
31
|
+
require 'deltacloud/base_driver'
|
32
|
+
require 'virtualbox'
|
33
|
+
|
34
|
+
module Deltacloud
|
35
|
+
module Drivers
|
36
|
+
module Virtualbox
|
37
|
+
class VirtualboxDriver < Deltacloud::BaseDriver
|
38
|
+
|
39
|
+
( REALMS = [
|
40
|
+
Realm.new({
|
41
|
+
:id => 'local',
|
42
|
+
:name => 'localhost',
|
43
|
+
:limit => 100,
|
44
|
+
:state => 'AVAILABLE'
|
45
|
+
})
|
46
|
+
] ) unless defined?( REALMS )
|
47
|
+
|
48
|
+
define_hardware_profile 'small' do
|
49
|
+
cpu 1
|
50
|
+
memory 0.5
|
51
|
+
storage 1
|
52
|
+
architecture `uname -m`.strip
|
53
|
+
end
|
54
|
+
|
55
|
+
define_hardware_profile 'medium' do
|
56
|
+
cpu 1
|
57
|
+
memory 1
|
58
|
+
storage 1
|
59
|
+
architecture `uname -m`.strip
|
60
|
+
end
|
61
|
+
|
62
|
+
define_hardware_profile 'large' do
|
63
|
+
cpu 2
|
64
|
+
memory 2
|
65
|
+
storage 1
|
66
|
+
architecture `uname -m`.strip
|
67
|
+
end
|
68
|
+
|
69
|
+
define_instance_states do
|
70
|
+
start.to( :pending ) .on( :create )
|
71
|
+
pending.to( :running ) .automatically
|
72
|
+
running.to( :stopped ) .on( :stop )
|
73
|
+
stopped.to( :running ) .on( :start )
|
74
|
+
stopped.to( :finish ) .on( :destroy )
|
75
|
+
end
|
76
|
+
|
77
|
+
def realms(credentials, opts = nil)
|
78
|
+
return REALMS if ( opts.nil? )
|
79
|
+
results = REALMS
|
80
|
+
results = filter_on( results, :id, opts )
|
81
|
+
results
|
82
|
+
end
|
83
|
+
|
84
|
+
def images(credentials, opts = nil)
|
85
|
+
images = convert_images(VirtualBox::VM.all)
|
86
|
+
images = filter_on( images, :id, opts )
|
87
|
+
images = filter_on( images, :architecture, opts )
|
88
|
+
images.sort_by{|e| [e.owner_id, e.description]}
|
89
|
+
end
|
90
|
+
|
91
|
+
def instances(credentials, opts = nil)
|
92
|
+
instances = convert_instances(VirtualBox::VM.all)
|
93
|
+
instances = filter_on( instances, :id, opts )
|
94
|
+
instances = filter_on( instances, :state, opts )
|
95
|
+
instances = filter_on( instances, :image_id, opts )
|
96
|
+
instances
|
97
|
+
end
|
98
|
+
|
99
|
+
def create_instance(credentials, image_id, opts)
|
100
|
+
image = images(credentials, { :id => image_id }).first
|
101
|
+
|
102
|
+
# Choose a name for the new vm unless one was given
|
103
|
+
name = opts[:name]
|
104
|
+
if name.nil? or name.empty?
|
105
|
+
# random uniqueish name w/o having to pull in UUID gem
|
106
|
+
name = "#{image.name} - #{(Time.now.to_f * 1000).to_i}#{rand(1000)}"
|
107
|
+
end
|
108
|
+
|
109
|
+
hwp = find_hardware_profile(credentials, opts[:hwp_id], image_id)
|
110
|
+
parent_vm = VirtualBox::VM.find(image.id)
|
111
|
+
|
112
|
+
# Create new virtual machine
|
113
|
+
vm = VirtualBox::VM.create(name, parent_vm.os_type_id)
|
114
|
+
new_uid = vm.uuid
|
115
|
+
|
116
|
+
# Add Hardware profile to this machine
|
117
|
+
vm.memory_size = ((hwp.memory.value*1.024)*1000).to_i
|
118
|
+
vm.cpu_count = hwp.cpu.value.to_i
|
119
|
+
vm.vram_size = 16
|
120
|
+
|
121
|
+
# Copy the network adapter settings from the parent vm
|
122
|
+
vm.network_adapters[0].enabled = true
|
123
|
+
vm.network_adapters[0].attachment_type = parent_vm.network_adapters[0].attachment_type
|
124
|
+
vm.network_adapters[0].host_interface = parent_vm.network_adapters[0].host_interface
|
125
|
+
|
126
|
+
# Store some metadata using extra data fields
|
127
|
+
vm.extra_data['deltacloud_hwp_id'] = hwp.name
|
128
|
+
vm.extra_data['deltacloud_image_id'] = image_id
|
129
|
+
|
130
|
+
vm.save
|
131
|
+
|
132
|
+
# Clone the disk image in a separate thread because it can take a long time
|
133
|
+
Thread.new do
|
134
|
+
# Reload the vm objects because they probably aren't safe to
|
135
|
+
# reuse across threads
|
136
|
+
parent_vm = VirtualBox::VM.find(image.id)
|
137
|
+
vm = VirtualBox::VM.find(new_uid)
|
138
|
+
|
139
|
+
# Add storage
|
140
|
+
# This will 'reuse' existing image
|
141
|
+
parent_hdd = hard_disk(parent_vm)
|
142
|
+
new_location = File.join(File.dirname(parent_hdd.location), "#{name}.vdi")
|
143
|
+
|
144
|
+
new_hd = parent_hdd.clone(new_location, "VDI")
|
145
|
+
vm.add_storage_controller('IDE Controller', :ide, :piix4)
|
146
|
+
vm.attach_storage('IDE Controller', 0, 0, :hard_disk, new_hd.uuid)
|
147
|
+
vm.start
|
148
|
+
if opts[:user_data]
|
149
|
+
user_data = opts[:user_data].gsub("\n", '') # remove newlines from base64 encoded text
|
150
|
+
vm.guest_property["/Deltacloud/UserData"] = user_data
|
151
|
+
end
|
152
|
+
end
|
153
|
+
instances(credentials, :id => new_uid).first
|
154
|
+
end
|
155
|
+
|
156
|
+
def reboot_instance(credentials, id)
|
157
|
+
vm = VirtualBox::VM.find(id)
|
158
|
+
vm.control(:reset)
|
159
|
+
end
|
160
|
+
|
161
|
+
def stop_instance(credentials, id)
|
162
|
+
vm = VirtualBox::VM.find(id)
|
163
|
+
unless vm.shutdown
|
164
|
+
vm.stop
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def start_instance(credentials, id)
|
169
|
+
vm = VirtualBox::VM.find(id)
|
170
|
+
vm.start
|
171
|
+
end
|
172
|
+
|
173
|
+
def destroy_instance(credentials, id)
|
174
|
+
vm = VirtualBox::VM.find(id)
|
175
|
+
vm.destroy(:destroy_medium => :delete)
|
176
|
+
end
|
177
|
+
|
178
|
+
private
|
179
|
+
|
180
|
+
def convert_instances(instances)
|
181
|
+
vms = []
|
182
|
+
instances.each do |instance|
|
183
|
+
volume = convert_volume(instance)
|
184
|
+
state = convert_state(instance.state, volume)
|
185
|
+
ip = vbox_get_ip(instance)
|
186
|
+
hwp_name = instance.extra_data['deltacloud_hwp_id'] || 'small'
|
187
|
+
image_id = instance.extra_data['deltacloud_image_id'] || ''
|
188
|
+
vms << Instance.new(:id => instance.uuid,
|
189
|
+
:image_id => image_id,
|
190
|
+
:name => instance.name,
|
191
|
+
:state => state,
|
192
|
+
:owner_id => ENV['USER'] || ENV['USERNAME'] || 'nobody',
|
193
|
+
:realm_id => 'local',
|
194
|
+
:public_addresses => ip,
|
195
|
+
:private_addresses => ip,
|
196
|
+
:actions => instance_actions_for(state),
|
197
|
+
:instance_profile => InstanceProfile.new(hwp_name))
|
198
|
+
end
|
199
|
+
vms
|
200
|
+
end
|
201
|
+
|
202
|
+
# Warning: You need VirtualHost guest additions for this
|
203
|
+
def vbox_get_ip(instance)
|
204
|
+
ip = instance.guest_property["/VirtualBox/GuestInfo/Net/0/V4/IP"]
|
205
|
+
ip.nil? ? [] : [ip]
|
206
|
+
end
|
207
|
+
|
208
|
+
def convert_state(state, volume)
|
209
|
+
return 'PENDING' if volume.nil?
|
210
|
+
state = state.to_s.strip.upcase
|
211
|
+
case state
|
212
|
+
when 'POWEROFF' then 'STOPPED'
|
213
|
+
when 'POWERED_OFF' then 'STOPPED'
|
214
|
+
else
|
215
|
+
state
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def convert_volume(vm)
|
220
|
+
hdd = hard_disk(vm)
|
221
|
+
return nil if hdd.nil?
|
222
|
+
StorageVolume.new(:id => hdd.uuid,
|
223
|
+
:created => Time.now,
|
224
|
+
:state => 'AVAILABLE',
|
225
|
+
:capacity => hdd.logical_size,
|
226
|
+
:instance_id => vm.uuid,
|
227
|
+
:device => hdd.type)
|
228
|
+
end
|
229
|
+
|
230
|
+
def hard_disk(vm)
|
231
|
+
attachment = vm.medium_attachments.select { |ma| ma.type == :hard_disk }.first
|
232
|
+
attachment.nil? ? nil : attachment.medium
|
233
|
+
end
|
234
|
+
|
235
|
+
def convert_images(images)
|
236
|
+
vms = []
|
237
|
+
images.each do |image|
|
238
|
+
hdd = hard_disk(image)
|
239
|
+
next unless hdd
|
240
|
+
capacity = ", #{hdd.logical_size} MBytes HDD"
|
241
|
+
vms << Image.new(:id => image.uuid,
|
242
|
+
:name => image.name,
|
243
|
+
:description => "#{image.memory_size} MB RAM, #{image.cpu_count} CPU#{capacity}",
|
244
|
+
:owner_id => ENV['USER'] || ENV['USERNAME'] || 'nobody',
|
245
|
+
:architecture => `uname -m`.strip)
|
246
|
+
end
|
247
|
+
vms
|
248
|
+
end
|
249
|
+
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
data/lib/drivers.rb
CHANGED
data/server.rb
CHANGED
@@ -42,6 +42,9 @@ get '/' do redirect url_for('/api'); end
|
|
42
42
|
|
43
43
|
get '/api\/?' do
|
44
44
|
@version = 0.1
|
45
|
+
if params[:force_auth]
|
46
|
+
return [401, 'Authentication failed'] unless driver.valid_credentials?(credentials)
|
47
|
+
end
|
45
48
|
respond_to do |format|
|
46
49
|
format.xml { haml :"api/show" }
|
47
50
|
format.json do
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 6
|
9
|
+
version: 0.0.6
|
10
10
|
platform: java
|
11
11
|
authors:
|
12
12
|
- Red Hat, Inc.
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-09-
|
17
|
+
date: 2010-09-19 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -197,6 +197,7 @@ files:
|
|
197
197
|
- lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
|
198
198
|
- lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
|
199
199
|
- lib/deltacloud/drivers/terremark/terremark_driver.rb
|
200
|
+
- lib/deltacloud/drivers/virtualbox/virtualbox_driver.rb
|
200
201
|
- lib/deltacloud/helpers/application_helper.rb
|
201
202
|
- lib/deltacloud/helpers/conversion_helper.rb
|
202
203
|
- lib/deltacloud/helpers/hardware_profiles_helper.rb
|