]> gitweb.fluxo.info Git - leap/leap_cli.git/commitdiff
now we require a leap_platform/platform.rb config file.
authorelijah <elijah@riseup.net>
Mon, 3 Jun 2013 06:32:21 +0000 (23:32 -0700)
committerelijah <elijah@riseup.net>
Mon, 3 Jun 2013 06:32:21 +0000 (23:32 -0700)
leap_cli.gemspec
lib/leap/platform.rb [new file with mode: 0644]
lib/leap_cli.rb
lib/leap_cli/commands/node.rb
lib/leap_cli/leapfile.rb
lib/leap_cli/path.rb

index b13c90d124ccd1bc535d55bb9b2a61aaab9cf997..1a37ef335c7d379e127324369279794f3458c3b9 100644 (file)
@@ -68,8 +68,9 @@ spec = Gem::Specification.new do |s|
   s.add_runtime_dependency('gpgme')     # not essential, but used for some minor stuff in adding sysadmins
 
   # misc gems
-  s.add_runtime_dependency('ya2yaml')   # pure ruby yaml, so we can better control output. see https://github.com/afunai/ya2yaml
-  s.add_runtime_dependency('json_pure') # pure ruby json, so we can better control output.
+  s.add_runtime_dependency('ya2yaml')    # pure ruby yaml, so we can better control output. see https://github.com/afunai/ya2yaml
+  s.add_runtime_dependency('json_pure')  # pure ruby json, so we can better control output.
+  s.add_runtime_dependency('versionomy') # compare version strings
 
   ##
   ## DEPENDENCIES for VENDORED GEMS
diff --git a/lib/leap/platform.rb b/lib/leap/platform.rb
new file mode 100644 (file)
index 0000000..298e480
--- /dev/null
@@ -0,0 +1,51 @@
+require 'versionomy'
+
+module Leap
+
+  class Platform
+    class << self
+      #
+      # configuration
+      #
+
+      attr_reader :version
+      attr_reader :compatible_cli
+      attr_accessor :facts
+      attr_accessor :paths
+      attr_accessor :node_files
+
+      def define(&block)
+        self.instance_eval(&block)
+      end
+
+      def version=(version)
+        @version = Versionomy.parse(version)
+      end
+
+      def compatible_cli=(range)
+        @compatible_cli = range
+        @minimum_cli_version = Versionomy.parse(range.first)
+        @maximum_cli_version = Versionomy.parse(range.last)
+      end
+
+      #
+      # return true if the cli_version is compatible with this platform.
+      #
+      def compatible_with_cli?(cli_version)
+        cli_version = Versionomy.parse(cli_version)
+        cli_version >= @minimum_cli_version && cli_version <= @maximum_cli_version
+      end
+
+      #
+      # return true if the platform version is within the specified range.
+      #
+      def version_in_range?(range)
+        minimum_platform_version = Versionomy.parse(range.first)
+        maximum_platform_version = Versionomy.parse(range.last)
+        @version >= minimum_platform_version && @version <= maximum_platform_version
+      end
+    end
+
+  end
+
+end
\ No newline at end of file
index 7b52ce4b86b7c318a35e86dd3f5cf5fe4488d6e4..5d748139a484c50533017b9a67058f9a564572a8 100644 (file)
@@ -1,5 +1,7 @@
 module LeapCli; end
 
+require 'leap/platform.rb'
+
 require 'leap_cli/version.rb'
 require 'leap_cli/constants.rb'
 require 'leap_cli/requirements.rb'
index 21822d15d9c9bebf19ff4e676b1c7f3afc576055..bf552d3202b55161b81dc4136131f47f8a46fa35 100644 (file)
@@ -75,7 +75,7 @@ module LeapCli; module Commands
         node = get_node_from_args(args)
         new_name = args.last
         ensure_dir [:node_files_dir, new_name]
-        Path::NODE_PATHS.each do |path|
+        Leap::Platform.node_files.each do |path|
           rename_file! [path, node.name], [path, new_name]
         end
         remove_directory! [:node_files_dir, node.name]
@@ -87,7 +87,7 @@ module LeapCli; module Commands
     node.command :rm do |rm|
       rm.action do |global_options,options,args|
         node = get_node_from_args(args)
-        (Path::NODE_PATHS + [:node_files_dir]).each do |path|
+        (Leap::Platform.node_files + [:node_files_dir]).each do |path|
           remove_file! [path, node.name]
         end
         if node.vagrant?
index 06db3b48348dcdca48864aa47ed622c79b00c873..e37cd4e19641c823960326d0f08c11d4c4a2a846 100644 (file)
@@ -28,10 +28,25 @@ module LeapCli
       if directory == '/'
         return nil
       else
+        #
+        # set up paths
+        #
         @provider_directory_path = directory
         read_settings(directory + '/Leapfile')
         read_settings(ENV['HOME'] + '/.leaprc')
         @platform_directory_path = File.expand_path(@platform_directory_path || '../leap_platform', @provider_directory_path)
+
+        #
+        # load the platform
+        #
+        require "#{@platform_directory_path}/platform.rb"
+        if !Leap::Platform.compatible_with_cli?(LeapCli::VERSION)
+          Util.bail! "This leap command (version #{LeapCli::VERSION}) is not compatible with the platform #{@platform_directory_path} (which requires #{Platform.compatible_cli.first} to #{Platform.compatible_cli.last})."
+        end
+
+        #
+        # set defaults
+        #
         if @allow_production_deploy.nil?
           # by default, only allow production deploys from 'master' or if not a git repo
           @allow_production_deploy = !LeapCli::Util.is_git_directory?(@provider_directory_path) ||
index 4b17d455684d2b67b719482077ca6eae29b8c78a..b7057880c2d3e5756eb5b1299973a072bd451d1a 100644 (file)
@@ -2,68 +2,6 @@ require 'fileutils'
 
 module LeapCli; module Path
 
-  #
-  # all the named paths, relative to provider directory.
-  #
-  NAMED_PATHS = {
-    # directories
-    :hiera_dir        => 'hiera',
-    :files_dir        => 'files',
-    :nodes_dir        => 'nodes',
-    :services_dir     => 'services',
-    :tags_dir         => 'tags',
-    :node_files_dir   => 'files/nodes/#{arg}',
-
-    # input config files
-    :common_config    => 'common.json',
-    :provider_config  => 'provider.json',
-    :secrets_config   => 'secrets.json',
-    :node_config      => 'nodes/#{arg}.json',
-    :service_config   => 'services/#{arg}.json',
-    :tag_config       => 'tags/#{arg}.json',
-
-    # input templates
-    :provider_json_template => 'files/service-definitions/provider.json.erb',
-    :eip_service_json_template => 'files/service-definitions/#{arg}/eip-service.json.erb',
-    :soledad_service_json_template => 'files/service-definitions/#{arg}/soledad-service.json.erb',
-    :smtp_service_json_template => 'files/service-definitions/#{arg}/smtp-service.json.erb',
-
-    # output files
-    :user_ssh         => 'users/#{arg}/#{arg}_ssh.pub',
-    :user_pgp         => 'users/#{arg}/#{arg}_pgp.pub',
-    :known_hosts      => 'files/ssh/known_hosts',
-    :authorized_keys  => 'files/ssh/authorized_keys',
-    :ca_key           => 'files/ca/ca.key',
-    :ca_cert          => 'files/ca/ca.crt',
-    :client_ca_key    => 'files/ca/client_ca.key',
-    :client_ca_cert   => 'files/ca/client_ca.crt',
-    :dh_params        => 'files/ca/dh.pem',
-    :commercial_key   => 'files/cert/#{arg}.key',
-    :commercial_csr   => 'files/cert/#{arg}.csr',
-    :commercial_cert  => 'files/cert/#{arg}.crt',
-    :commercial_ca_cert  => 'files/cert/commercial_ca.crt',
-    :vagrantfile         => 'test/Vagrantfile',
-
-    # node output files
-    :hiera            => 'hiera/#{arg}.yaml',
-    :node_ssh_pub_key => 'files/nodes/#{arg}/#{arg}_ssh.pub',
-    :node_x509_key    => 'files/nodes/#{arg}/#{arg}.key',
-    :node_x509_cert   => 'files/nodes/#{arg}/#{arg}.crt',
-
-    # testing files
-    :test_client_key     => 'test/cert/client.key',
-    :test_client_cert    => 'test/cert/client.crt',
-    :test_openvpn_config => 'test/openvpn/#{arg}.ovpn',
-    :test_client_openvpn_template => 'test/openvpn/client.ovpn.erb'
-  }
-
-  #
-  # paths that take node name as the argument
-  #
-  NODE_PATHS = [
-    :node_config, :hiera, :node_x509_cert, :node_x509_key, :node_ssh_pub_key
-  ]
-
   def self.platform
     @platform
   end
@@ -122,8 +60,8 @@ module LeapCli; module Path
     end
 
     if name.is_a? Symbol
-      Util::assert!(NAMED_PATHS[name], "Error, I don't know the path for :#{name} (with argument '#{arg}')")
-      filename = eval('"' + NAMED_PATHS[name] + '"')
+      Util::assert!(Leap::Platform.paths[name], "Error, I don't know the path for :#{name} (with argument '#{arg}')")
+      filename = eval('"' + Leap::Platform.paths[name] + '"')
       return provider_dir + '/' + filename
     else
       return name