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/10/25 16:35:17 UTC

[PATCH core] Added version check from client to core version

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

---
 client/lib/deltacloud.rb       |   16 +++++++++++++---
 server/deltacloud-core.gemspec |    4 ++--
 server/server.rb               |    1 +
 server/views/api/show.xml.haml |    2 +-
 4 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/client/lib/deltacloud.rb b/client/lib/deltacloud.rb
index 117a04b..71112cf 100644
--- a/client/lib/deltacloud.rb
+++ b/client/lib/deltacloud.rb
@@ -23,6 +23,8 @@ require 'logger'
 
 module DeltaCloud
 
+  REQUIRED_API_VERSION="0.1.0"
+
   # Get a new API client instance
   #
   # @param [String, user_name] API user name
@@ -70,9 +72,11 @@ module DeltaCloud
     @defined_classes || []
   end
 
+  class WrongAPIVersionException < Exception; end
+
   class API
     attr_accessor :logger
-    attr_reader   :api_uri, :driver_name, :api_version, :features, :entry_points
+    attr_reader   :api_uri, :driver_name, :api_version, :features, :entry_points, :server_version
 
     def initialize(user_name, password, api_url, opts={}, &block)
       opts[:version] = true
@@ -82,6 +86,13 @@ module DeltaCloud
       @features, @entry_points = {}, {}
       @verbose = opts[:verbose] || false
       discover_entry_points
+      if discovered?
+        valid_version = Gem::Version.new(REQUIRED_API_VERSION) <=> Gem::Version.new(@server_version)
+        if valid_version > 0
+          warn "[WARNING] API version should be >= #{REQUIRED_API_VERSION} (now using API version #{@server_version})"
+          raise WrongAPIVersionException.new
+        end
+      end
       yield self if block_given?
     end
 
@@ -149,8 +160,6 @@ module DeltaCloud
         c.instance_eval do
           attr_accessor :id
           attr_accessor :uri
-
-
         end
         obj = xml_to_class(c, item)
       end
@@ -252,6 +261,7 @@ module DeltaCloud
         api_xml = Nokogiri::XML(response)
         @driver_name = api_xml.xpath('/api').first['driver']
         @api_version = api_xml.xpath('/api').first['version']
+        @server_version = api_xml.xpath('/api').first['server_version']
         logger << "[API] Version #{@api_version}\n"
         logger << "[API] Driver #{@driver_name}\n"
         api_xml.css("api > link").each do |entry_point|
diff --git a/server/deltacloud-core.gemspec b/server/deltacloud-core.gemspec
index e6de1bf..4164d19 100644
--- a/server/deltacloud-core.gemspec
+++ b/server/deltacloud-core.gemspec
@@ -18,7 +18,7 @@
 
 require 'rake'
 
-Gem::Specification.new do |s|
+$gem=Gem::Specification.new do |s|
   s.author = 'Red Hat, Inc.'
   s.homepage = "http://www.deltacloud.org"
   s.email = 'deltacloud-users@lists.fedorahosted.org'
@@ -31,7 +31,7 @@ Gem::Specification.new do |s|
     which implements the REST interface.
   EOF
 
-  s.version = '0.0.9'
+  s.version = '0.1.0'
   s.date = Time.now
   s.summary = %q{Deltacloud REST API}
   s.files = FileList[
diff --git a/server/server.rb b/server/server.rb
index af8bc09..7d8048f 100644
--- a/server/server.rb
+++ b/server/server.rb
@@ -10,6 +10,7 @@ require 'erb'
 require 'haml'
 require 'open3'
 require 'lib/deltacloud/helpers/blob_stream'
+load 'deltacloud-core.gemspec'
 
 configure do
   set :raise_errors => false
diff --git a/server/views/api/show.xml.haml b/server/views/api/show.xml.haml
index 70c26c9..edb748a 100644
--- a/server/views/api/show.xml.haml
+++ b/server/views/api/show.xml.haml
@@ -1,4 +1,4 @@
-%api{ :version=>@version, :driver=>DRIVER }
+%api{ :version=>@version, :server_version => $gem::version, :driver=>DRIVER }
   - for entry_point in entry_points
     %link{ :rel=>entry_point[0], :href=>entry_point[1] }
       - for feature in driver.features(entry_point[0])
-- 
1.7.2.3