diff options
| -rw-r--r-- | leap_cli.gemspec | 2 | ||||
| -rw-r--r-- | lib/leap_cli/commands/ca.rb | 28 | ||||
| -rw-r--r-- | lib/leap_cli/commands/node.rb | 32 | ||||
| -rw-r--r-- | lib/leap_cli/commands/vagrant.rb | 42 | ||||
| -rw-r--r-- | lib/leap_cli/version.rb | 2 | ||||
| -rw-r--r-- | lib/lib_ext/gli.rb | 8 | ||||
| -rw-r--r-- | test/test_helper.rb | 32 | ||||
| -rw-r--r-- | test/unit/command_line_test.rb | 12 | ||||
| -rw-r--r-- | test/unit/config_object_list_test.rb | 2 | ||||
| -rw-r--r-- | test/unit/config_object_test.rb | 2 | 
10 files changed, 102 insertions, 60 deletions
| diff --git a/leap_cli.gemspec b/leap_cli.gemspec index 2bd2929..77d6dd1 100644 --- a/leap_cli.gemspec +++ b/leap_cli.gemspec @@ -46,7 +46,7 @@ spec = Gem::Specification.new do |s|    #s.add_development_dependency('aruba')    # console gems -  s.add_runtime_dependency('gli','~> 2.3') +  s.add_runtime_dependency('gli','~> 2.5.0')    s.add_runtime_dependency('command_line_reporter')    s.add_runtime_dependency('highline')    s.add_runtime_dependency('paint') diff --git a/lib/leap_cli/commands/ca.rb b/lib/leap_cli/commands/ca.rb index f471b5a..d6fd975 100644 --- a/lib/leap_cli/commands/ca.rb +++ b/lib/leap_cli/commands/ca.rb @@ -7,11 +7,11 @@ module LeapCli; module Commands    desc "Manage X.509 certificates"    #long_desc "" -  command :cert do |c| +  command :cert do |cert| -    c.desc 'Creates a Certificate Authority (private key and CA certificate)' -    c.command :ca do |c| -      c.action do |global_options,options,args| +    cert.desc 'Creates a Certificate Authority (private key and CA certificate)' +    cert.command :ca do |ca| +      ca.action do |global_options,options,args|          assert_files_missing! :ca_cert, :ca_key          assert_config! 'provider.ca.name'          assert_config! 'provider.ca.bit_size' @@ -48,10 +48,10 @@ module LeapCli; module Commands        end      end -    c.desc 'Creates or renews a X.509 certificate/key pair for a single node or all nodes' -    c.arg_name 'node-name', :optional => false -    c.command :update do |c| -      c.action do |global_options,options,args| +    cert.desc 'Creates or renews a X.509 certificate/key pair for a single node or all nodes' +    cert.arg_name 'node-name', :optional => false +    cert.command :update do |update| +      update.action do |global_options,options,args|          assert_files_exist! :ca_cert, :ca_key, :msg => 'Run `leap cert ca` to create them'          assert_config! 'provider.ca.server_certificates.bit_size'          assert_config! 'provider.ca.server_certificates.digest' @@ -70,9 +70,9 @@ module LeapCli; module Commands        end      end -    c.desc 'Creates a Diffie-Hellman parameter file' # (needed for server-side of some TLS connections) -    c.command :dh do |c| -      c.action do |global_options,options,args| +    cert.desc 'Creates a Diffie-Hellman parameter file' # (needed for server-side of some TLS connections) +    cert.command :dh do |dh| +      dh.action do |global_options,options,args|          long_running do            if cmd_exists?('certtool')              log 0, 'Generating DH parameters (takes a long time)...' @@ -104,10 +104,10 @@ module LeapCli; module Commands      # nice details about CSRs:      #   http://www.redkestrel.co.uk/Articles/CSR.html      # -    c.desc 'Creates a CSR for use in buying a commercial X.509 certificate' -    c.command :csr do |c| +    cert.desc 'Creates a CSR for use in buying a commercial X.509 certificate' +    cert.command :csr do |csr|        #c.switch 'sign', :desc => 'additionally creates a cert that is signed by your own CA (recommended only for testing)', :negatable => false -      c.action do |global_options,options,args| +      csr.action do |global_options,options,args|          assert_config! 'provider.domain'          assert_config! 'provider.name'          assert_config! 'provider.default_language' diff --git a/lib/leap_cli/commands/node.rb b/lib/leap_cli/commands/node.rb index aa9610f..9bf27e2 100644 --- a/lib/leap_cli/commands/node.rb +++ b/lib/leap_cli/commands/node.rb @@ -8,19 +8,19 @@ module LeapCli; module Commands    ##    desc 'Node management' -  command :node do |c| -    c.desc 'Create a new configuration file for a node' -    c.command :add do |c| -      c.action do |global_options,options,args| +  command :node do |node| +    node.desc 'Create a new configuration file for a node' +    node.command :add do |add| +      add.action do |global_options,options,args|          log 'not yet implemented'        end      end -    c.desc 'Bootstraps a node, setting up ssh keys and installing prerequisites' -    c.arg_name 'node-name', :optional => false, :multiple => false -    c.command :init do |c| -      c.switch 'echo', :desc => 'if set, passwords are visible as you type them (default is hidden)', :negatable => false -      c.action do |global_options,options,args| +    node.desc 'Bootstraps a node, setting up ssh keys and installing prerequisites' +    node.arg_name 'node-name', :optional => false, :multiple => false +    node.command :init do |init| +      init.switch 'echo', :desc => 'if set, passwords are visible as you type them (default is hidden)', :negatable => false +      init.action do |global_options,options,args|          node = get_node_from_args(args)          ping_node(node)          save_public_host_key(node) @@ -33,17 +33,17 @@ module LeapCli; module Commands        end      end -    c.desc 'Renames a node file, and all its related files' -    c.command :mv do |c| -      c.action do |global_options,options,args| +    node.desc 'Renames a node file, and all its related files' +    node.command :mv do |mv| +      mv.action do |global_options,options,args|          log 'not yet implemented'        end      end -    c.desc 'Removes a node file, and all its related files' -    c.arg_name '<node-name>', :optional => false, :multiple => false -    c.command :rm do |c| -      c.action do |global_options,options,args| +    node.desc 'Removes a node file, and all its related files' +    node.arg_name '<node-name>', :optional => false, :multiple => false +    node.command :rm do |rm| +      rm.action do |global_options,options,args|          log 'not yet implemented'        end      end diff --git a/lib/leap_cli/commands/vagrant.rb b/lib/leap_cli/commands/vagrant.rb index eaf070f..f3c3c33 100644 --- a/lib/leap_cli/commands/vagrant.rb +++ b/lib/leap_cli/commands/vagrant.rb @@ -5,47 +5,47 @@ module LeapCli; module Commands    desc "Manage local virtual machines"    long_desc "This command provides a convient way to manage Vagrant-based virtual machines. If node-filter argument is missing, the command runs on all local virtual machines. The Vagrantfile is automatically generated in 'test/Vagrantfile'. If you want to run vagrant commands manually, cd to 'test'." -  command :local do |c| -    c.desc 'Starts up the virtual machine(s)' -    c.arg_name 'node-filter', :optional => true #, :multiple => false -    c.command :start do |c| -      c.action do |global_options,options,args| +  command :local do |local| +    local.desc 'Starts up the virtual machine(s)' +    local.arg_name 'node-filter', :optional => true #, :multiple => false +    local.command :start do |start| +      start.action do |global_options,options,args|          vagrant_setup          vagrant_command(["up", "sandbox on"], args)        end      end -    c.desc 'Shuts down the virtual machine(s)' -    c.arg_name 'node-filter', :optional => true #, :multiple => false -    c.command :stop do |c| -      c.action do |global_options,options,args| +    local.desc 'Shuts down the virtual machine(s)' +    local.arg_name 'node-filter', :optional => true #, :multiple => false +    local.command :stop do |stop| +      stop.action do |global_options,options,args|          vagrant_setup          vagrant_command("halt", args)        end      end -    c.desc 'Resets virtual machine(s) to a pristine state' -    c.arg_name 'node-filter', :optional => true #, :multiple => false -    c.command :reset do |c| -      c.action do |global_options,options,args| +    local.desc 'Resets virtual machine(s) to a pristine state' +    local.arg_name 'node-filter', :optional => true #, :multiple => false +    local.command :reset do |reset| +      reset.action do |global_options,options,args|          vagrant_setup          vagrant_command("sandbox rollback", args)        end      end -    c.desc 'Destroys the virtual machine(s), reclaiming the disk space' -    c.arg_name 'node-filter', :optional => true #, :multiple => false -    c.command :destroy do |c| -      c.action do |global_options,options,args| +    local.desc 'Destroys the virtual machine(s), reclaiming the disk space' +    local.arg_name 'node-filter', :optional => true #, :multiple => false +    local.command :destroy do |destroy| +      destroy.action do |global_options,options,args|          vagrant_setup          vagrant_command("destroy", args)        end      end -    c.desc 'Print the status of local virtual machine(s)' -    c.arg_name 'node-filter', :optional => true #, :multiple => false -    c.command :status do |c| -      c.action do |global_options,options,args| +    local.desc 'Print the status of local virtual machine(s)' +    local.arg_name 'node-filter', :optional => true #, :multiple => false +    local.command :status do |status| +      status.action do |global_options,options,args|          vagrant_setup          vagrant_command("status", args)        end diff --git a/lib/leap_cli/version.rb b/lib/leap_cli/version.rb index 0dbd215..7851676 100644 --- a/lib/leap_cli/version.rb +++ b/lib/leap_cli/version.rb @@ -1,6 +1,6 @@  module LeapCli    unless defined?(LeapCli::VERSION) -    VERSION = '0.1.3' +    VERSION = '0.1.4'      SUMMARY = 'Command line interface to the LEAP platform'      DESCRIPTION = 'The command "leap" can be used to manage a bevy of servers running the LEAP platform from the comfort of your own home.'      REQUIRE_PATHS = ['lib', 'vendor/supply_drop/lib', 'vendor/certificate_authority/lib'] diff --git a/lib/lib_ext/gli.rb b/lib/lib_ext/gli.rb index 32ae0bc..f9b03be 100644 --- a/lib/lib_ext/gli.rb +++ b/lib/lib_ext/gli.rb @@ -19,10 +19,10 @@ module GLI            # build a list of commands, sort them so the commands with subcommands are at the bottom            commands = @sorter.call(@app.commands_declaration_order.reject(&:nodoc)).sort do |a,b| -            if a.commands.any? && b.commands.any?;  a.name <=> b.name +            if a.commands.any? && b.commands.any?;  a.name.to_s <=> b.name.to_s              elsif a.commands.any?;                  1              elsif b.commands.any?;                 -1 -            else;                                   a.name <=> b.name +            else;                                   a.name.to_s <=> b.name.to_s              end            end @@ -33,7 +33,7 @@ module GLI              command_info_list << [name, command.description]              if command.commands.any?                @sorter.call(command.commands_declaration_order).each do |cmd| -                command_info_list << [SUB_CMD_INDENT + command.name.to_s + " " + cmd.names,cmd.description + (command.get_default_command == cmd.name ? " (default)" : "")] +                command_info_list << [SUB_CMD_INDENT + command.name.to_s + " " + cmd.names, cmd.description + (command.get_default_command == cmd.name ? " (default)" : "")]                end              end            end @@ -43,7 +43,7 @@ module GLI            stringio = StringIO.new            command_formatter.output(stringio)            commands = stringio.string -          global_option_descriptions = OptionsFormatter.new(global_flags_and_switches,@wrapper_class).format +          global_option_descriptions = OptionsFormatter.new(global_flags_and_switches, @sorter, @wrapper_class).format            GLOBAL_HELP.result(binding)          end        end diff --git a/test/test_helper.rb b/test/test_helper.rb index e761086..94bb2b4 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -4,16 +4,46 @@ require 'minitest/autorun'  require 'leap_cli'  class MiniTest::Unit::TestCase +  attr_accessor :ruby_path    # Add global extensions to the test case class here +  def setup +    LeapCli::Path.set_platform_path(test_platform_path) +    LeapCli::Path.set_provider_path(test_provider_path) +  end +    def manager      @manager ||= begin -      LeapCli::Path.set_root(File.dirname(__FILE__))        manager = LeapCli::Config::Manager.new        manager.load        manager      end    end +  def base_path +    File.expand_path '../..', __FILE__ +  end + +  def leap_bin(*args) +    `#{ruby_path} #{base_path}/bin/leap #{args.join ' '}` +  end + +  def test_platform_path +    "#{base_path}/test/leap_platform" +  end + +  def test_provider_path +    "#{base_path}/test/provider" +  end + +  def with_multiple_rubies(&block) +    ['ruby1.8', 'ruby1.9.1'].each do |ruby| +      self.ruby_path = `which #{ruby}`.strip +      next unless ruby_path.chars.any? +      yield +    end +    self.ruby_path = "" +  end +  end diff --git a/test/unit/command_line_test.rb b/test/unit/command_line_test.rb new file mode 100644 index 0000000..ec4c2d6 --- /dev/null +++ b/test/unit/command_line_test.rb @@ -0,0 +1,12 @@ +require File.expand_path('test_helper', File.dirname(__FILE__)) + +class CommandLineTest < MiniTest::Unit::TestCase + +  def test_help +    with_multiple_rubies do +      output = leap_bin('help') +      assert_equal 0, $?, "help should exit 0 -- #{output}" +    end +  end + +end diff --git a/test/unit/config_object_list_test.rb b/test/unit/config_object_list_test.rb index a3b76f2..a507094 100644 --- a/test/unit/config_object_list_test.rb +++ b/test/unit/config_object_list_test.rb @@ -1,6 +1,6 @@  require File.dirname(__FILE__) + '/test_helper' -class TestMeme < MiniTest::Unit::TestCase +class ConfigObjectListTest < MiniTest::Unit::TestCase    def test_node_search      nodes = manager.nodes['name' => 'vpn1'] diff --git a/test/unit/config_object_test.rb b/test/unit/config_object_test.rb index 0c293c2..b981f3b 100644 --- a/test/unit/config_object_test.rb +++ b/test/unit/config_object_test.rb @@ -1,6 +1,6 @@  require File.expand_path('test_helper', File.dirname(__FILE__)) -class TestMeme < MiniTest::Unit::TestCase +class ConfigObjectTest < MiniTest::Unit::TestCase    def test_bracket_lookup      domain = manager.provider.domain | 
