You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@deltacloud.apache.org by mf...@redhat.com on 2010/08/09 19:01:29 UTC
GoGrid driver fixes
Hi,
Just few GoGrid driver fixes.
1) Because we are using 'name' as instance.id, for instance actions
we need to use 'name' parameter instead of 'id'
2) Right now we are using 'Web server' and 'Database server' as a Realm,
which isn't very appropriate in this case. GoGrid in version 1.5 of their
API introduced a 'Datacenter' functionality, which is the same as
'Availability zone' in EC2.
So this patch fixing that and Realm become a 'zone'/'datacenter' where
will be instance/IP actually launched.
-- Michal
Re: [PATCH core] Fixed GoGrid driver
Posted by Michal Fojtik <mf...@redhat.com>.
On 09/08/10 19:01 +0200, mfojtik@redhat.com wrote:
>---
> .../lib/deltacloud/drivers/gogrid/gogrid_client.rb | 15 +++-
> .../lib/deltacloud/drivers/gogrid/gogrid_driver.rb | 87 ++++++++-----------
> server/lib/deltacloud/drivers/gogrid/test.rb | 13 +++
> 3 files changed, 62 insertions(+), 53 deletions(-)
> create mode 100644 server/lib/deltacloud/drivers/gogrid/test.rb
>
>diff --git a/server/lib/deltacloud/drivers/gogrid/gogrid_client.rb b/server/lib/deltacloud/drivers/gogrid/gogrid_client.rb
>index f4f5796..c37f061 100644
>--- a/server/lib/deltacloud/drivers/gogrid/gogrid_client.rb
>+++ b/server/lib/deltacloud/drivers/gogrid/gogrid_client.rb
>@@ -9,7 +9,7 @@ class GoGridClient
> apikey='YOUR API KEY',
> secret='YOUR SHARED SECRET',
> format='json',
>- version='1.4')
>+ version='1.5')
> @server = server
> @secret = secret
> @default_params = {'format'=>format, 'v'=>version,'api_key' => apikey}
>@@ -30,8 +30,17 @@ class GoGridClient
> open(getRequestURL(method,params)).read
> end
>
>- def request(method, params={})
>- JSON::parse(sendAPIRequest(method, params))
>+ def request(method, params={}, version=nil)
>+ if version
>+ @default_params['v'] = version
>+ else
>+ @default_params['v'] = '1.5'
>+ end
>+ begin
>+ JSON::parse(sendAPIRequest(method, params))
>+ rescue Exception => e
>+ STDERR.puts("ERROR: #{e.message}")
>+ end
> end
>
> def encode_params(params)
>diff --git a/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb b/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
>index 72d91b6..e6c99c5 100644
>--- a/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
>+++ b/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
>@@ -37,34 +37,10 @@ class GogridDriver < Deltacloud::BaseDriver
>
> feature :instances, :authentication_password
>
>- define_hardware_profile '512MB' do
>- cpu 0.5
>- memory 512
>- storage 30
>- end
>-
>- define_hardware_profile '1GB' do
>- cpu 1
>- memory 1
>- storage 60
>- end
>-
>- define_hardware_profile '2GB' do
>+ define_hardware_profile 'server' do
> cpu 2
>- memory 2
>- storage 120
>- end
>-
>- define_hardware_profile '4GB' do
>- cpu 4
>- memory 4
>- storage 240
>- end
>-
>- define_hardware_profile '8GB' do
>- cpu 8
>- memory 8
>- storage 480
>+ memory [512, 1024, 2048, 4096, 8192]
>+ storage 10
> end
Sorry for this, seems like I did something terrible to my GIT repository
;-)
>+user='fbb1de3897597ccf'
>+password='ngieth10'
>+
>+client=GoGridClient.new('https://api.gogrid.com/api', user, password)
Also I accedentialy post this test file with obsolete credentials ;-)
--
--------------------------------------------------------
Michal Fojtik, mfojtik@redhat.com, +420 532 294 4307
Ruby / Ruby On Rails Developer
Deltacloud API: http://deltacloud.org
--------------------------------------------------------
[PATCH core] Fixed GoGrid driver
Posted by mf...@redhat.com.
---
.../lib/deltacloud/drivers/gogrid/gogrid_client.rb | 15 +++-
.../lib/deltacloud/drivers/gogrid/gogrid_driver.rb | 87 ++++++++-----------
server/lib/deltacloud/drivers/gogrid/test.rb | 13 +++
3 files changed, 62 insertions(+), 53 deletions(-)
create mode 100644 server/lib/deltacloud/drivers/gogrid/test.rb
diff --git a/server/lib/deltacloud/drivers/gogrid/gogrid_client.rb b/server/lib/deltacloud/drivers/gogrid/gogrid_client.rb
index f4f5796..c37f061 100644
--- a/server/lib/deltacloud/drivers/gogrid/gogrid_client.rb
+++ b/server/lib/deltacloud/drivers/gogrid/gogrid_client.rb
@@ -9,7 +9,7 @@ class GoGridClient
apikey='YOUR API KEY',
secret='YOUR SHARED SECRET',
format='json',
- version='1.4')
+ version='1.5')
@server = server
@secret = secret
@default_params = {'format'=>format, 'v'=>version,'api_key' => apikey}
@@ -30,8 +30,17 @@ class GoGridClient
open(getRequestURL(method,params)).read
end
- def request(method, params={})
- JSON::parse(sendAPIRequest(method, params))
+ def request(method, params={}, version=nil)
+ if version
+ @default_params['v'] = version
+ else
+ @default_params['v'] = '1.5'
+ end
+ begin
+ JSON::parse(sendAPIRequest(method, params))
+ rescue Exception => e
+ STDERR.puts("ERROR: #{e.message}")
+ end
end
def encode_params(params)
diff --git a/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb b/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
index 72d91b6..e6c99c5 100644
--- a/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
+++ b/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
@@ -37,34 +37,10 @@ class GogridDriver < Deltacloud::BaseDriver
feature :instances, :authentication_password
- define_hardware_profile '512MB' do
- cpu 0.5
- memory 512
- storage 30
- end
-
- define_hardware_profile '1GB' do
- cpu 1
- memory 1
- storage 60
- end
-
- define_hardware_profile '2GB' do
+ define_hardware_profile 'server' do
cpu 2
- memory 2
- storage 120
- end
-
- define_hardware_profile '4GB' do
- cpu 4
- memory 4
- storage 240
- end
-
- define_hardware_profile '8GB' do
- cpu 8
- memory 8
- storage 480
+ memory [512, 1024, 2048, 4096, 8192]
+ storage 10
end
def supported_collections
@@ -91,31 +67,28 @@ class GogridDriver < Deltacloud::BaseDriver
def realms(credentials, opts=nil)
safely do
- new_client(credentials).request('common/lookup/list', { 'lookup' => 'image.type' })['list'].collect do |realm|
+ new_client(credentials).request('common/lookup/list', { 'lookup' => 'ip.datacenter' })['list'].collect do |realm|
convert_realm(realm)
end
end
end
def create_instance(credentials, image_id, opts=nil)
- image = image(credentials, :id => image_id )
- if opts && opts[:hwp_id]
- hwp = find_hardware_profile(credentials, opts[:hwp_id], image.id)
+ server_ram = nil
+ if opts[:hwp_memory]
+ mem = opts[:hwp_memory].to_i
+ server_ram = (mem == 512) ? "512MB" : "#{mem / 1024}GB"
else
- hwp = find_hardware_profile(credentials, "512MB", image.id)
+ server_ram = "512MB"
end
-
client = new_client(credentials)
name = (opts[:name] && opts[:name]!='') ? opts[:name] : get_random_instance_name
- if name.length > 20
- raise Deltacloud::BackendError.new(400, "name-too-long", "Name '#{name}' is too long; the maximum for GoGrid is 20 characters", nil)
- end
safely do
instance = client.request('grid/server/add', {
'name' => name,
'image' => image_id,
- 'server.ram' => hwp.name,
- 'ip' => get_next_free_ip(credentials)
+ 'server.ram' => server_ram,
+ 'ip' => get_free_ip_from_realm(credentials, opts[:realm_id] || '1')
})['list'].first
if instance
login_data = get_login_data(client, instance[:id])
@@ -147,6 +120,7 @@ class GogridDriver < Deltacloud::BaseDriver
end
def instances(credentials, opts=nil)
+ require 'ap'
instances = []
if opts and opts[:id]
begin
@@ -166,7 +140,7 @@ class GogridDriver < Deltacloud::BaseDriver
if e.message == "400 Bad Request"
# in the case of a VM that we just made, the grid/server/get method
# throws a "400 Bad Request error". In this case we try again by
- # getting a full listing and filtering on the id. This could
+ # getting a full listing a filtering on the id. This could
# potentially take a long time, but I don't see another way to get
# information about a newly created instance
instances = list_instances(credentials, opts[:id])
@@ -181,25 +155,25 @@ class GogridDriver < Deltacloud::BaseDriver
def reboot_instance(credentials, id)
safely do
- new_client(credentials).request('grid/server/power', { 'id' => id, 'power' => 'reboot'})
+ new_client(credentials).request('grid/server/power', { 'name' => id, 'power' => 'reboot'})
end
end
def destroy_instance(credentials, id)
safely do
- new_client(credentials).request('grid/server/delete', { 'id' => id})
+ new_client(credentials).request('grid/server/delete', { 'name' => id})
end
end
def stop_instance(credentials, id)
safely do
- new_client(credentials).request('grid/server/power', { 'id' => id, 'power' => 'off'})
+ new_client(credentials).request('grid/server/power', { 'name' => id, 'power' => 'off'})
end
end
def start_instance(credentials, id)
safely do
- new_client(credentials).request('grid/server/power', { 'id' => id, 'power' => 'on'})
+ new_client(credentials).request('grid/server/power', { 'name' => id, 'power' => 'on'})
end
end
@@ -210,8 +184,10 @@ class GogridDriver < Deltacloud::BaseDriver
def keys(credentials, opts=nil)
gogrid = new_client( credentials )
creds = []
- gogrid.request('support/password/list')['list'].each do |password|
- creds << convert_key(password)
+ safely do
+ gogrid.request('support/password/list')['list'].each do |password|
+ creds << convert_key(password)
+ end
end
return creds
end
@@ -229,6 +205,7 @@ class GogridDriver < Deltacloud::BaseDriver
def new_client(credentials)
GoGridClient.new('https://api.gogrid.com/api', credentials.user, credentials.password)
+
end
def get_login_data(client, instance_id)
@@ -288,7 +265,16 @@ class GogridDriver < Deltacloud::BaseDriver
end
def convert_instance(instance, owner_id)
- hwp_name = instance['image']['name']
+ opts = {}
+ unless instance['ram']['id'] == "1"
+ mem = instance['ram']['name']
+ if mem == "512MB"
+ opts[:hwp_memory] = "512"
+ else
+ opts[:hwp_memory] = (mem.to_i * 1024).to_s
+ end
+ end
+ prof = InstanceProfile.new("server", opts)
Instance.new(
# note that we use 'name' as the id here, because newly created instances
@@ -298,9 +284,9 @@ class GogridDriver < Deltacloud::BaseDriver
:id => instance['name'],
:owner_id => owner_id,
:image_id => instance['image']['id'],
- :instance_profile => InstanceProfile.new(hwp_name),
+ :instance_profile => prof,
:name => instance['name'],
- :realm_id => instance['type']['id'],
+ :realm_id => instance['ip']['datacenter']['id'],
:state => convert_server_state(instance['state']['name'], instance['id']),
:actions => instance_actions_for(convert_server_state(instance['state']['name'], instance['id'])),
:public_addresses => [ instance['ip']['ip'] ],
@@ -319,12 +305,13 @@ class GogridDriver < Deltacloud::BaseDriver
state.eql?('Off') ? 'STOPPED' : 'RUNNING'
end
- def get_next_free_ip(credentials)
+ def get_free_ip_from_realm(credentials, realm_id)
ip = ""
safely do
ip = new_client(credentials).request('grid/ip/list', {
'ip.type' => '1',
- 'ip.state' => '1'
+ 'ip.state' => '1',
+ 'datacenter' => realm_id
})['list'].first['ip']
end
return ip
diff --git a/server/lib/deltacloud/drivers/gogrid/test.rb b/server/lib/deltacloud/drivers/gogrid/test.rb
new file mode 100644
index 0000000..809081d
--- /dev/null
+++ b/server/lib/deltacloud/drivers/gogrid/test.rb
@@ -0,0 +1,13 @@
+require 'gogrid_client'
+require 'ap'
+
+user='fbb1de3897597ccf'
+password='ngieth10'
+
+client=GoGridClient.new('https://api.gogrid.com/api', user, password)
+
+ap client.request('grid/ip/list', {
+ 'ip.type' => '1',
+ 'ip.state' => '1',
+ 'datacenter' => '1'
+})
--
1.7.2