leap_cli - make fog gem optional
authorelijah <elijah@riseup.net>
Wed, 28 Jun 2017 20:24:39 +0000 (13:24 -0700)
committerelijah <elijah@riseup.net>
Tue, 4 Jul 2017 18:32:51 +0000 (11:32 -0700)
lib/leap_cli/cloud.rb
lib/leap_cli/cloud/dependencies.rb
lib/leap_cli/commands/vm.rb
tests/platform-ci/Gemfile

index 268cea3..b8e45b3 100644 (file)
@@ -1,4 +1,3 @@
-
-require 'fog/aws'
+require_relative 'cloud/dependencies.rb'
 require_relative 'cloud/cloud.rb'
 require_relative 'cloud/image.rb'
index fd690e5..670d613 100644 (file)
@@ -1,40 +1,37 @@
 #
-# I am not sure this is a good idea, but it might be. Tricky, so disabled for now
+# Ensure that the needed fog gems are installed
 #
-
-=begin
 module LeapCli
   class Cloud
 
-    def self.check_required_gems
-      begin
-        require "fog"
-      rescue LoadError
-        bail! do
-          log :error, "The 'vm' command requires the gem 'fog-core'. Please run `gem install fog-core` and try again."
-        end
-      end
+    SUPPORTED = {
+      'aws' => {require: 'fog/aws', gem: 'fog-aws'}
+    }.freeze
 
-      fog_gems = @cloud.required_gems
-      if !options[:mock] && fog_gems.empty?
-        bail! do
-          log :warning, "no vm providers are configured in cloud.json."
-          log "You must have credentials for one of: #{@cloud.possible_apis.join(', ')}."
+    def self.check_dependencies!(config)
+      required_gem = map_api_to_gem(config['api'])
+      if required_gem.nil?
+        Util.bail! do
+          Util.log :error, "The API '#{config['api']}' specified in cloud.json is not one that I know how to speak. Try one of #{supported_list}."
         end
       end
 
-      fog_gems.each do |name, gem_name|
-        begin
-          require gem_name.sub('-','/')
-        rescue LoadError
-          bail! do
-            log :error, "The 'vm' command requires the gem '#{gem_name}' (because of what is configured in cloud.json)."
-            log "Please run `sudo gem install #{gem_name}` and try again."
-          end
+      begin
+        require required_gem[:require]
+      rescue LoadError
+        Util.bail! do
+          Util.log :error, "The 'vm' command requires the gem '#{required_gem[:gem]}'. Please run `gem install #{required_gem[:gem]}` and try again."
+          Util.log "(make sure you install the gem in the ruby #{RUBY_VERSION} environment)"
         end
       end
     end
 
+    def self.supported_list
+      SUPPORTED.keys.join(', ')
+    end
+
+    def self.map_api_to_gem(api)
+      SUPPORTED[api]
+    end
   end
 end
-=end
\ No newline at end of file
index 790774f..6f97dbc 100644 (file)
@@ -415,7 +415,6 @@ module LeapCli; module Commands
     config = manager.env.cloud
     name = nil
     if options[:mock]
-      Fog.mock!
       name = 'mock_aws'
       config['mock_aws'] = {
         "api" => "aws",
@@ -451,6 +450,10 @@ module LeapCli; module Commands
     assert! entry['api'] == 'aws', "cloud.json: currently, only 'aws' is supported for `api`."
     assert! entry['vendor'] == 'aws', "cloud.json: currently, only 'aws' is supported for `vendor`."
 
+    LeapCli::Cloud::check_dependencies!(entry)
+    if options[:mock]
+      Fog.mock!
+    end
     return LeapCli::Cloud.new(name, entry, node)
   end
 
index 44a8637..4cf14e4 100644 (file)
@@ -16,4 +16,5 @@ group :test do
   # Install fog-aws because the gem dependency of leap_cli is now optional
   gem "fog-aws"
   gem "leap_cli", :git => 'https://leap.se/git/leap_cli.git'
+  gem "fog-aws"
 end