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 2011/08/03 14:20:38 UTC

[PATCH core 1/5] Client: Added support for addresses types

From: Michal Fojtik <mf...@redhat.com>


Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 client/lib/base_object.rb |   13 +++++++++++++
 client/lib/deltacloud.rb  |    8 ++++++--
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/client/lib/base_object.rb b/client/lib/base_object.rb
index f6ef149..dd2b64a 100644
--- a/client/lib/base_object.rb
+++ b/client/lib/base_object.rb
@@ -84,6 +84,19 @@ module DeltaCloud
       #               <address>127.0.0.1</address>
       #               <address>127.0.0.2</address>
       #             </addresses>
+      def add_addresses!(collection_name, values=[])
+        @objects << {
+          :type => :collection,
+          :method_name => collection_name.sanitize,
+          :values => values.collect { |v| { :address => v.text.strip, :type => v[:type] }}
+        }
+      end
+
+      # This method define collection of text elements inside REST model
+      # XML syntax: <addresses>
+      #               <address>127.0.0.1</address>
+      #               <address>127.0.0.2</address>
+      #             </addresses>
       def add_collection!(collection_name, values=[])
         @objects << {
           :type => :collection,
diff --git a/client/lib/deltacloud.rb b/client/lib/deltacloud.rb
index e2db0ba..bfe25a2 100644
--- a/client/lib/deltacloud.rb
+++ b/client/lib/deltacloud.rb
@@ -23,7 +23,7 @@ require 'logger'
 require 'hwp_properties'
 require 'instance_state'
 require 'documentation'
-require 'base_object'
+require 'lib/base_object'
 require 'client_bucket_methods'
 
 module DeltaCloud
@@ -225,7 +225,7 @@ module DeltaCloud
         end
 
         #deal with blob metadata
-        if(attribute.name == 'user_metadata')
+        if (attribute.name == 'user_metadata')
           meta = {}
           attribute.children.select {|x| x.name=="entry" }.each  do |element|
             value = element.content.gsub!(/(\n) +/,'')
@@ -234,6 +234,10 @@ module DeltaCloud
           obj.add_collection!(attribute.name, meta.inspect) && next
         end
 
+        if (['public_addresses', 'private_addresses'].include? attribute.name)
+          obj.add_addresses!(attribute.name, (attribute/'*')) && next
+        end
+
         # Deal with collections like public-addresses, private-addresses
         if (attribute/'./*').length > 0
           obj.add_collection!(attribute.name, (attribute/'*').collect { |value| value.text }) && next
-- 
1.7.4.1


[PATCH core 5/5] Mock: Fill keyname property correctly for an instance

Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>


Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 server/lib/deltacloud/drivers/mock/mock_driver.rb |   13 +++++++------
 1 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/server/lib/deltacloud/drivers/mock/mock_driver.rb b/server/lib/deltacloud/drivers/mock/mock_driver.rb
index fa575c1..77d7738 100644
--- a/server/lib/deltacloud/drivers/mock/mock_driver.rb
+++ b/server/lib/deltacloud/drivers/mock/mock_driver.rb
@@ -141,14 +141,14 @@ class MockDriver < Deltacloud::BaseDriver
     safely do
       image = {
         :id => opts[:name],
-	:name => opts[:name],
-	:owner_id => 'root',
-	:description => opts[:description],
-	:architecture => 'i386',
-	:state => 'UP'
+	      :name => opts[:name],
+	      :owner_id => 'root',
+      	:description => opts[:description],
+      	:architecture => 'i386',
+      	:state => 'UP'
       }
       File.open( "#{@storage_root}/images/#{opts[:name]}.yml", 'w' ) do |f|
-	YAML.dump( image, f )
+	    YAML.dump( image, f )
       end
       Image.new(image)
     end
@@ -215,6 +215,7 @@ class MockDriver < Deltacloud::BaseDriver
     instance = {
       :name=>name,
       :state=>'RUNNING',
+      :keyname => opts[:keyname],
       :image_id=>image_id,
       :owner_id=>credentials.user,
       :public_addresses=>["#{image_id}.#{next_id}.public.com"],
-- 
1.7.4.1


[PATCH core 4/5] Mock: Support for user-data testing

Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>


Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 server/lib/deltacloud/drivers/mock/mock_driver.rb |    4 +-
 server/public/javascripts/application.js          |   49 +++++++++++++++++++++
 server/views/instances/new.html.haml              |    7 +++
 3 files changed, 59 insertions(+), 1 deletions(-)

diff --git a/server/lib/deltacloud/drivers/mock/mock_driver.rb b/server/lib/deltacloud/drivers/mock/mock_driver.rb
index 44e6a22..fa575c1 100644
--- a/server/lib/deltacloud/drivers/mock/mock_driver.rb
+++ b/server/lib/deltacloud/drivers/mock/mock_driver.rb
@@ -85,6 +85,7 @@ class MockDriver < Deltacloud::BaseDriver
   end
 
   feature :instances, :user_name
+  feature :instances, :user_data
   feature :instances, :authentication_key
 
   def initialize
@@ -221,7 +222,8 @@ class MockDriver < Deltacloud::BaseDriver
       :instance_profile => InstanceProfile.new(hwp.name, opts),
       :realm_id=>realm_id,
       :create_image=>true,
-      :actions=>instance_actions_for( 'RUNNING' )
+      :actions=>instance_actions_for( 'RUNNING' ),
+      :user_data => opts[:user_data]
     }
     File.open( "#{@storage_root}/instances/#{next_id}.yml", 'w' ) {|f|
       YAML.dump( instance, f )
diff --git a/server/public/javascripts/application.js b/server/public/javascripts/application.js
index 703879c..e3aec10 100644
--- a/server/public/javascripts/application.js
+++ b/server/public/javascripts/application.js
@@ -17,6 +17,55 @@ $(document).ready(function() {
 
 })
 
+function encodeb64 () {
+  // Encodes string using MIME base64 algorithm
+  //
+  // version: 1107.2516
+  // discuss at: http://phpjs.org/functions/base64_encode    // +   original by: Tyler Akins (http://rumkin.com)
+  // +   improved by: Bayron Guevara
+  // +   improved by: Thunder.m
+  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+  // +   bugfixed by: Pellentesque Malesuada    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+  // -    depends on: utf8_encode
+  // *     example 1: base64_encode('Kevin van Zonneveld');
+  // *     returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
+  // mozilla has this native    // - but breaks in 2.0.0.12!
+  //if (typeof this.window['atob'] == 'function') {
+  //    return atob(data);
+  //}
+  var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
+      ac = 0,
+      enc = "",
+      tmp_arr = [];
+
+  var data = $("textarea#user_data").attr('value');
+
+  do { // pack three octets into four hexets
+    o1 = data.charCodeAt(i++);
+    o2 = data.charCodeAt(i++);
+    o3 = data.charCodeAt(i++);
+    bits = o1 << 16 | o2 << 8 | o3;
+
+    h1 = bits >> 18 & 0x3f;
+    h2 = bits >> 12 & 0x3f;        h3 = bits >> 6 & 0x3f;
+    h4 = bits & 0x3f;
+
+    // use hexets to index into b64, and append result to encoded string
+    tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);    } while (i < data.length);
+
+    enc = tmp_arr.join('');
+
+    switch (data.length % 3) {    case 1:
+      enc = enc.slice(0, -2) + '==';
+      break;
+      case 2:
+      enc = enc.slice(0, -1) + '=';        break;
+    }
+
+    $("textarea#user_data").attr('value', enc);
+    return false;
+}
+
 function more_fields()
 {
   //increment the hidden input that captures how many meta_data are passed
diff --git a/server/views/instances/new.html.haml b/server/views/instances/new.html.haml
index 263d43c..3b1b667 100644
--- a/server/views/instances/new.html.haml
+++ b/server/views/instances/new.html.haml
@@ -12,6 +12,13 @@
     %div{ 'data-role' => :collapsible, 'data-collapsed' => "true"}
       %h3 Additional parameters
 
+      - if driver_has_feature?(:user_data)
+        %div{ 'data-role' => :fieldcontain }
+          %label{ :for => :user_data} Base64 encoded user-data:
+          %textarea{ :id => :user_data, :name => :user_data, :value => '' }
+          %br/
+          %a{ :href => "", :onclick => 'encodeb64();', :'data-ajax' => 'false'} Encode data
+
       - if driver_has_feature?(:instance_count)
         %div{ 'data-role' => :fieldcontain }
           %label{ :for => :instance_count} # of instances to be launched:
-- 
1.7.4.1


[PATCH core 2/5] Client: Removed trailing whitespaces

Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>


Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 client/lib/base_object.rb |    4 ++--
 client/lib/deltacloud.rb  |    4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/client/lib/base_object.rb b/client/lib/base_object.rb
index dd2b64a..8aec05b 100644
--- a/client/lib/base_object.rb
+++ b/client/lib/base_object.rb
@@ -162,7 +162,7 @@ module DeltaCloud
         @actions = []
       end
 
-      # This trigger is called right after action. 
+      # This trigger is called right after action.
       # This method does nothing inside ActionObject
       # but it can be redifined and used in meta-programming
       def action_trigger(action)
@@ -327,7 +327,7 @@ module DeltaCloud
         DeltaCloud::API.class_eval("class #{class_name} < DeltaCloud::#{parent_class}; end")
         @defined_classes << class_name
       end
-      
+
       DeltaCloud::API.const_get(parent.classify).const_get(name.classify)
     end
 
diff --git a/client/lib/deltacloud.rb b/client/lib/deltacloud.rb
index bfe25a2..70189aa 100644
--- a/client/lib/deltacloud.rb
+++ b/client/lib/deltacloud.rb
@@ -213,7 +213,7 @@ module DeltaCloud
         # If there are actions, add they to ActionObject/StateFullObject
         if attribute.name == 'actions'
           (attribute/'link').each do |link|
-            (obj.add_run_action!(item['id'], link) && next) if link[:rel] == 'run' 
+            (obj.add_run_action!(item['id'], link) && next) if link[:rel] == 'run'
             obj.add_action_link!(item['id'], link)
           end && next
         end
@@ -316,7 +316,7 @@ module DeltaCloud
 
     def use_driver(driver, opts={})
       if driver
-        @api_driver = driver 
+        @api_driver = driver
         @driver_name = driver
         discover_entry_points
       end
-- 
1.7.4.1


[PATCH core 3/5] Client: Added authentication method for an instance

Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>


Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 client/lib/base_object.rb |   15 +++++++++++++++
 client/lib/deltacloud.rb  |    4 ++++
 2 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/client/lib/base_object.rb b/client/lib/base_object.rb
index 8aec05b..22a0865 100644
--- a/client/lib/base_object.rb
+++ b/client/lib/base_object.rb
@@ -79,6 +79,21 @@ module DeltaCloud
         }
       end
 
+      def add_authentication!(auth_type, values=[])
+        value = { :key => (values/'login/keyname').text.strip } if auth_type == 'key'
+        if auth_type == 'password'
+          value = {
+            :username => (values/'login/username').text.strip,
+            :username => (values/'login/password').text.strip
+          }
+        end
+        @objects << {
+          :type => :collection,
+          :method_name => 'authentication',
+          :values => value
+        }
+      end
+
       # This method define collection of text elements inside REST model
       # XML syntax: <addresses>
       #               <address>127.0.0.1</address>
diff --git a/client/lib/deltacloud.rb b/client/lib/deltacloud.rb
index 70189aa..6c9c92a 100644
--- a/client/lib/deltacloud.rb
+++ b/client/lib/deltacloud.rb
@@ -238,6 +238,10 @@ module DeltaCloud
           obj.add_addresses!(attribute.name, (attribute/'*')) && next
         end
 
+        if ('authentication'.include? attribute.name)
+          obj.add_authentication!(attribute[:type], (attribute/'*')) && next
+        end
+
         # Deal with collections like public-addresses, private-addresses
         if (attribute/'./*').length > 0
           obj.add_collection!(attribute.name, (attribute/'*').collect { |value| value.text }) && next
-- 
1.7.4.1