vagrant-openstack-provider 0.5.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +34 -0
- data/lib/vagrant-openstack-provider.rb +2 -31
- data/lib/vagrant-openstack-provider/action.rb +21 -7
- data/lib/vagrant-openstack-provider/action/abstract_action.rb +22 -0
- data/lib/vagrant-openstack-provider/action/connect_openstack.rb +19 -40
- data/lib/vagrant-openstack-provider/action/create_server.rb +10 -6
- data/lib/vagrant-openstack-provider/action/create_stack.rb +67 -0
- data/lib/vagrant-openstack-provider/action/delete_server.rb +28 -3
- data/lib/vagrant-openstack-provider/action/delete_stack.rb +72 -0
- data/lib/vagrant-openstack-provider/action/message.rb +4 -2
- data/lib/vagrant-openstack-provider/action/read_ssh_info.rb +4 -2
- data/lib/vagrant-openstack-provider/action/read_state.rb +9 -4
- data/lib/vagrant-openstack-provider/action/resume.rb +4 -2
- data/lib/vagrant-openstack-provider/action/start_server.rb +4 -2
- data/lib/vagrant-openstack-provider/action/stop_server.rb +4 -2
- data/lib/vagrant-openstack-provider/action/suspend.rb +4 -2
- data/lib/vagrant-openstack-provider/action/sync_folders.rb +17 -13
- data/lib/vagrant-openstack-provider/action/wait_accessible.rb +5 -2
- data/lib/vagrant-openstack-provider/action/wait_active.rb +5 -3
- data/lib/vagrant-openstack-provider/action/wait_stop.rb +5 -3
- data/lib/vagrant-openstack-provider/catalog/openstack_catalog.rb +66 -0
- data/lib/vagrant-openstack-provider/client/domain.rb +41 -1
- data/lib/vagrant-openstack-provider/client/glance.rb +63 -0
- data/lib/vagrant-openstack-provider/client/heat.rb +50 -0
- data/lib/vagrant-openstack-provider/client/http_utils.rb +18 -0
- data/lib/vagrant-openstack-provider/client/neutron.rb +9 -15
- data/lib/vagrant-openstack-provider/client/nova.rb +3 -3
- data/lib/vagrant-openstack-provider/client/openstack.rb +10 -0
- data/lib/vagrant-openstack-provider/command/abstract_command.rb +7 -0
- data/lib/vagrant-openstack-provider/command/image_list.rb +12 -2
- data/lib/vagrant-openstack-provider/command/main.rb +1 -0
- data/lib/vagrant-openstack-provider/command/network_list.rb +3 -3
- data/lib/vagrant-openstack-provider/command/subnet_list.rb +25 -0
- data/lib/vagrant-openstack-provider/config.rb +78 -7
- data/lib/vagrant-openstack-provider/config_resolver.rb +36 -5
- data/lib/vagrant-openstack-provider/errors.rb +30 -2
- data/lib/vagrant-openstack-provider/logging.rb +39 -0
- data/lib/vagrant-openstack-provider/version.rb +1 -1
- data/locales/en.yml +107 -4
- data/spec/vagrant-openstack-provider/action/connect_openstack_spec.rb +255 -8
- data/spec/vagrant-openstack-provider/action/create_server_spec.rb +6 -1
- data/spec/vagrant-openstack-provider/action/create_stack_spec.rb +97 -0
- data/spec/vagrant-openstack-provider/action/delete_server_spec.rb +34 -6
- data/spec/vagrant-openstack-provider/action/delete_stack_spec.rb +64 -0
- data/spec/vagrant-openstack-provider/action/read_state_spec.rb +13 -1
- data/spec/vagrant-openstack-provider/action/sync_folders_spec.rb +1 -0
- data/spec/vagrant-openstack-provider/action/wait_active_spec.rb +1 -1
- data/spec/vagrant-openstack-provider/action/wait_stop_spec.rb +1 -1
- data/spec/vagrant-openstack-provider/client/glance_spec.rb +128 -0
- data/spec/vagrant-openstack-provider/client/heat_spec.rb +124 -0
- data/spec/vagrant-openstack-provider/client/neutron_spec.rb +33 -1
- data/spec/vagrant-openstack-provider/client/nova_spec.rb +2 -2
- data/spec/vagrant-openstack-provider/command/image_list_spec.rb +75 -23
- data/spec/vagrant-openstack-provider/command/subnet_list_spec.rb +46 -0
- data/spec/vagrant-openstack-provider/config_resolver_spec.rb +85 -19
- data/spec/vagrant-openstack-provider/config_spec.rb +177 -1
- data/spec/vagrant-openstack-provider/spec_helper.rb +3 -0
- metadata +20 -2
| @@ -0,0 +1,72 @@ | |
| 1 | 
            +
            require 'log4r'
         | 
| 2 | 
            +
            require 'socket'
         | 
| 3 | 
            +
            require 'timeout'
         | 
| 4 | 
            +
            require 'sshkey'
         | 
| 5 | 
            +
            require 'yaml'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            require 'vagrant-openstack-provider/config_resolver'
         | 
| 8 | 
            +
            require 'vagrant-openstack-provider/utils'
         | 
| 9 | 
            +
            require 'vagrant-openstack-provider/action/abstract_action'
         | 
| 10 | 
            +
            require 'vagrant/util/retryable'
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            module VagrantPlugins
         | 
| 13 | 
            +
              module Openstack
         | 
| 14 | 
            +
                module Action
         | 
| 15 | 
            +
                  class DeleteStack < AbstractAction
         | 
| 16 | 
            +
                    def initialize(app, _env)
         | 
| 17 | 
            +
                      @app = app
         | 
| 18 | 
            +
                      @logger = Log4r::Logger.new('vagrant_openstack::action::delete_stack')
         | 
| 19 | 
            +
                    end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                    def execute(env)
         | 
| 22 | 
            +
                      @logger.info 'Start delete stacks action'
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                      heat = env[:openstack_client].heat
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                      list_stack_files(env).each do |stack|
         | 
| 27 | 
            +
                        env[:ui].info(I18n.t('vagrant_openstack.delete_stack'))
         | 
| 28 | 
            +
                        env[:ui].info(" -- Stack Name : #{stack[:name]}")
         | 
| 29 | 
            +
                        env[:ui].info(" -- Stack Id   : #{stack[:id]}")
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                        heat.delete_stack(env, stack[:name], stack[:id])
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                        waiting_for_stack_to_be_deleted(env, stack[:name], stack[:id])
         | 
| 34 | 
            +
                      end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                      # This will remove all files in the .vagrant instance directory
         | 
| 37 | 
            +
                      env[:machine].id = nil
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                      @app.call(env)
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                    private
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                    def list_stack_files(env)
         | 
| 45 | 
            +
                      stack_files = []
         | 
| 46 | 
            +
                      Dir.glob("#{env[:machine].data_dir}/stack_*_id") do |stack_file|
         | 
| 47 | 
            +
                        file_name = stack_file.split('/')[-1]
         | 
| 48 | 
            +
                        stack_files << {
         | 
| 49 | 
            +
                          name: file_name[6, (file_name.length) - 9],
         | 
| 50 | 
            +
                          id: File.read("#{stack_file}")
         | 
| 51 | 
            +
                        }
         | 
| 52 | 
            +
                      end
         | 
| 53 | 
            +
                      stack_files
         | 
| 54 | 
            +
                    end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                    def waiting_for_stack_to_be_deleted(env, stack_name, stack_id, retry_interval = 3, timeout = 200)
         | 
| 57 | 
            +
                      @logger.info "Waiting for the stack with id #{stack_id} to be deleted..."
         | 
| 58 | 
            +
                      env[:ui].info(I18n.t('vagrant_openstack.waiting_for_stack_deleted'))
         | 
| 59 | 
            +
                      timeout(timeout, Errors::Timeout) do
         | 
| 60 | 
            +
                        stack_status = 'DELETE_IN_PROGRESS'
         | 
| 61 | 
            +
                        until stack_status == 'DELETE_COMPLETE'
         | 
| 62 | 
            +
                          @logger.debug('Waiting for stack to be DELETED')
         | 
| 63 | 
            +
                          stack_status = env[:openstack_client].heat.get_stack_details(env, stack_name, stack_id)['stack_status']
         | 
| 64 | 
            +
                          fail Errors::StackStatusError, stack: stack_id if stack_status == 'DELETE_FAILED'
         | 
| 65 | 
            +
                          sleep retry_interval
         | 
| 66 | 
            +
                        end
         | 
| 67 | 
            +
                      end
         | 
| 68 | 
            +
                    end
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
              end
         | 
| 72 | 
            +
            end
         | 
| @@ -1,13 +1,15 @@ | |
| 1 | 
            +
            require 'vagrant-openstack-provider/action/abstract_action'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module VagrantPlugins
         | 
| 2 4 | 
             
              module Openstack
         | 
| 3 5 | 
             
                module Action
         | 
| 4 | 
            -
                  class Message
         | 
| 6 | 
            +
                  class Message < AbstractAction
         | 
| 5 7 | 
             
                    def initialize(app, _env, message)
         | 
| 6 8 | 
             
                      @app = app
         | 
| 7 9 | 
             
                      @message = message
         | 
| 8 10 | 
             
                    end
         | 
| 9 11 |  | 
| 10 | 
            -
                    def  | 
| 12 | 
            +
                    def execute(env)
         | 
| 11 13 | 
             
                      env[:ui].info(@message)
         | 
| 12 14 | 
             
                      @app.call(env)
         | 
| 13 15 | 
             
                    end
         | 
| @@ -2,13 +2,15 @@ require 'log4r' | |
| 2 2 |  | 
| 3 3 | 
             
            require 'vagrant-openstack-provider/config_resolver'
         | 
| 4 4 | 
             
            require 'vagrant-openstack-provider/utils'
         | 
| 5 | 
            +
            require 'vagrant-openstack-provider/action/abstract_action'
         | 
| 5 6 |  | 
| 6 7 | 
             
            module VagrantPlugins
         | 
| 7 8 | 
             
              module Openstack
         | 
| 8 9 | 
             
                module Action
         | 
| 9 10 | 
             
                  # This action reads the SSH info for the machine and puts it into the
         | 
| 10 11 | 
             
                  # `:machine_ssh_info` key in the environment.
         | 
| 11 | 
            -
             | 
| 12 | 
            +
             | 
| 13 | 
            +
                  class ReadSSHInfo < AbstractAction
         | 
| 12 14 | 
             
                    def initialize(app, _env, resolver = ConfigResolver.new, utils = Utils.new)
         | 
| 13 15 | 
             
                      @app    = app
         | 
| 14 16 | 
             
                      @logger = Log4r::Logger.new('vagrant_openstack::action::read_ssh_info')
         | 
| @@ -16,7 +18,7 @@ module VagrantPlugins | |
| 16 18 | 
             
                      @utils = utils
         | 
| 17 19 | 
             
                    end
         | 
| 18 20 |  | 
| 19 | 
            -
                    def  | 
| 21 | 
            +
                    def execute(env)
         | 
| 20 22 | 
             
                      @logger.info 'Reading SSH info'
         | 
| 21 23 | 
             
                      server_id = env[:machine].id.to_sym
         | 
| 22 24 | 
             
                      SSHInfoHolder.instance.tap do |holder|
         | 
| @@ -1,17 +1,19 @@ | |
| 1 1 | 
             
            require 'log4r'
         | 
| 2 2 |  | 
| 3 | 
            +
            require 'vagrant-openstack-provider/action/abstract_action'
         | 
| 4 | 
            +
             | 
| 3 5 | 
             
            module VagrantPlugins
         | 
| 4 6 | 
             
              module Openstack
         | 
| 5 7 | 
             
                module Action
         | 
| 6 8 | 
             
                  # This action reads the state of the machine and puts it in the
         | 
| 7 9 | 
             
                  # `:machine_state_id` key in the environment.
         | 
| 8 | 
            -
                  class ReadState
         | 
| 10 | 
            +
                  class ReadState < AbstractAction
         | 
| 9 11 | 
             
                    def initialize(app, _env)
         | 
| 10 12 | 
             
                      @app    = app
         | 
| 11 13 | 
             
                      @logger = Log4r::Logger.new('vagrant_openstack::action::read_state')
         | 
| 12 14 | 
             
                    end
         | 
| 13 15 |  | 
| 14 | 
            -
                    def  | 
| 16 | 
            +
                    def execute(env)
         | 
| 15 17 | 
             
                      env[:machine_state_id] = read_state(env)
         | 
| 16 18 | 
             
                      @app.call(env)
         | 
| 17 19 | 
             
                    end
         | 
| @@ -29,8 +31,11 @@ module VagrantPlugins | |
| 29 31 | 
             
                        return :not_created
         | 
| 30 32 | 
             
                      end
         | 
| 31 33 |  | 
| 32 | 
            -
                       | 
| 33 | 
            -
             | 
| 34 | 
            +
                      if !server['OS-EXT-STS:task_state'].nil?
         | 
| 35 | 
            +
                        server['OS-EXT-STS:task_state'].downcase.to_sym
         | 
| 36 | 
            +
                      else
         | 
| 37 | 
            +
                        server['status'].downcase.to_sym
         | 
| 38 | 
            +
                      end
         | 
| 34 39 | 
             
                    end
         | 
| 35 40 | 
             
                  end
         | 
| 36 41 | 
             
                end
         | 
| @@ -1,13 +1,15 @@ | |
| 1 | 
            +
            require 'vagrant-openstack-provider/action/abstract_action'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module VagrantPlugins
         | 
| 2 4 | 
             
              module Openstack
         | 
| 3 5 | 
             
                module Action
         | 
| 4 | 
            -
                  class Resume
         | 
| 6 | 
            +
                  class Resume < AbstractAction
         | 
| 5 7 | 
             
                    def initialize(app, _env)
         | 
| 6 8 | 
             
                      @app = app
         | 
| 7 9 | 
             
                      @logger = Log4r::Logger.new('vagrant_openstack::action::resume_server')
         | 
| 8 10 | 
             
                    end
         | 
| 9 11 |  | 
| 10 | 
            -
                    def  | 
| 12 | 
            +
                    def execute(env)
         | 
| 11 13 | 
             
                      if env[:machine].id
         | 
| 12 14 | 
             
                        @logger.info "Resuming suspended VM #{env[:machine].id}..."
         | 
| 13 15 | 
             
                        env[:ui].info I18n.t('vagrant.actions.vm.resume.resuming')
         | 
| @@ -1,15 +1,17 @@ | |
| 1 1 | 
             
            require 'log4r'
         | 
| 2 2 |  | 
| 3 | 
            +
            require 'vagrant-openstack-provider/action/abstract_action'
         | 
| 4 | 
            +
             | 
| 3 5 | 
             
            module VagrantPlugins
         | 
| 4 6 | 
             
              module Openstack
         | 
| 5 7 | 
             
                module Action
         | 
| 6 | 
            -
                  class StartServer
         | 
| 8 | 
            +
                  class StartServer < AbstractAction
         | 
| 7 9 | 
             
                    def initialize(app, _env)
         | 
| 8 10 | 
             
                      @app    = app
         | 
| 9 11 | 
             
                      @logger = Log4r::Logger.new('vagrant_openstack::action::start_server')
         | 
| 10 12 | 
             
                    end
         | 
| 11 13 |  | 
| 12 | 
            -
                    def  | 
| 14 | 
            +
                    def execute(env)
         | 
| 13 15 | 
             
                      if env[:machine].id
         | 
| 14 16 | 
             
                        env[:ui].info(I18n.t('vagrant_openstack.starting_server'))
         | 
| 15 17 | 
             
                        env[:openstack_client].nova.start_server(env, env[:machine].id)
         | 
| @@ -1,15 +1,17 @@ | |
| 1 1 | 
             
            require 'log4r'
         | 
| 2 2 |  | 
| 3 | 
            +
            require 'vagrant-openstack-provider/action/abstract_action'
         | 
| 4 | 
            +
             | 
| 3 5 | 
             
            module VagrantPlugins
         | 
| 4 6 | 
             
              module Openstack
         | 
| 5 7 | 
             
                module Action
         | 
| 6 | 
            -
                  class StopServer
         | 
| 8 | 
            +
                  class StopServer < AbstractAction
         | 
| 7 9 | 
             
                    def initialize(app, _env)
         | 
| 8 10 | 
             
                      @app    = app
         | 
| 9 11 | 
             
                      @logger = Log4r::Logger.new('vagrant_openstack::action::stop_server')
         | 
| 10 12 | 
             
                    end
         | 
| 11 13 |  | 
| 12 | 
            -
                    def  | 
| 14 | 
            +
                    def execute(env)
         | 
| 13 15 | 
             
                      if env[:machine].id
         | 
| 14 16 | 
             
                        @logger.info "Stopping server #{env[:machine].id}..."
         | 
| 15 17 | 
             
                        env[:ui].info(I18n.t('vagrant_openstack.stopping_server'))
         | 
| @@ -1,13 +1,15 @@ | |
| 1 | 
            +
            require 'vagrant-openstack-provider/action/abstract_action'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module VagrantPlugins
         | 
| 2 4 | 
             
              module Openstack
         | 
| 3 5 | 
             
                module Action
         | 
| 4 | 
            -
                  class Suspend
         | 
| 6 | 
            +
                  class Suspend < AbstractAction
         | 
| 5 7 | 
             
                    def initialize(app, _env)
         | 
| 6 8 | 
             
                      @app = app
         | 
| 7 9 | 
             
                      @logger = Log4r::Logger.new('vagrant_openstack::action::suspend_server')
         | 
| 8 10 | 
             
                    end
         | 
| 9 11 |  | 
| 10 | 
            -
                    def  | 
| 12 | 
            +
                    def execute(env)
         | 
| 11 13 | 
             
                      if env[:machine].id
         | 
| 12 14 | 
             
                        @logger.info "Saving VM #{env[:machine].id} state and suspending execution..."
         | 
| 13 15 | 
             
                        env[:ui].info I18n.t('vagrant.actions.vm.suspend.suspending')
         | 
| @@ -2,19 +2,20 @@ require 'log4r' | |
| 2 2 | 
             
            require 'rbconfig'
         | 
| 3 3 | 
             
            require 'vagrant/util/subprocess'
         | 
| 4 4 |  | 
| 5 | 
            +
            require 'vagrant-openstack-provider/action/abstract_action'
         | 
| 6 | 
            +
             | 
| 5 7 | 
             
            module VagrantPlugins
         | 
| 6 8 | 
             
              module Openstack
         | 
| 7 9 | 
             
                module Action
         | 
| 8 | 
            -
                  class SyncFolders
         | 
| 10 | 
            +
                  class SyncFolders < AbstractAction
         | 
| 9 11 | 
             
                    def initialize(app, _env)
         | 
| 10 12 | 
             
                      @app = app
         | 
| 11 13 | 
             
                    end
         | 
| 12 14 |  | 
| 13 | 
            -
                    def  | 
| 15 | 
            +
                    def execute(env)
         | 
| 14 16 | 
             
                      sync_method = env[:machine].provider_config.sync_method
         | 
| 15 | 
            -
                       | 
| 16 | 
            -
             | 
| 17 | 
            -
                        NoSyncFolders.new(@app, env, ssh_disabled).call(env)
         | 
| 17 | 
            +
                      if sync_method == 'none'
         | 
| 18 | 
            +
                        NoSyncFolders.new(@app, env).call(env)
         | 
| 18 19 | 
             
                      elsif sync_method == 'rsync'
         | 
| 19 20 | 
             
                        RsyncFolders.new(@app, env).call(env)
         | 
| 20 21 | 
             
                      else
         | 
| @@ -24,15 +25,13 @@ module VagrantPlugins | |
| 24 25 | 
             
                  end
         | 
| 25 26 |  | 
| 26 27 | 
             
                  class NoSyncFolders
         | 
| 27 | 
            -
                    def initialize(app, _env | 
| 28 | 
            +
                    def initialize(app, _env)
         | 
| 28 29 | 
             
                      @app = app
         | 
| 29 | 
            -
                      @ssh_disabled = ssh_disabled
         | 
| 30 30 | 
             
                    end
         | 
| 31 31 |  | 
| 32 32 | 
             
                    def call(env)
         | 
| 33 33 | 
             
                      @app.call(env)
         | 
| 34 | 
            -
                      env[:ui].info(' | 
| 35 | 
            -
                      env[:ui].info('Sync folders are disabled in the provider configuration') unless @ssh_disabled
         | 
| 34 | 
            +
                      env[:ui].info(I18n.t('vagrant_openstack.disabled_sync_folders'))
         | 
| 36 35 | 
             
                    end
         | 
| 37 36 | 
             
                  end
         | 
| 38 37 |  | 
| @@ -48,6 +47,11 @@ module VagrantPlugins | |
| 48 47 | 
             
                    def call(env)
         | 
| 49 48 | 
             
                      @app.call(env)
         | 
| 50 49 |  | 
| 50 | 
            +
                      if env[:machine].provider_config.ssh_disabled
         | 
| 51 | 
            +
                        env[:ui].info(I18n.t('vagrant_openstack.ssh_disabled_sync_folders'))
         | 
| 52 | 
            +
                        return
         | 
| 53 | 
            +
                      end
         | 
| 54 | 
            +
             | 
| 51 55 | 
             
                      ssh_info = env[:machine].ssh_info
         | 
| 52 56 |  | 
| 53 57 | 
             
                      config          = env[:machine].provider_config
         | 
| @@ -93,14 +97,14 @@ module VagrantPlugins | |
| 93 97 | 
             
                          "#{ssh_info[:username]}@#{ssh_info[:host]}:#{guestpath}"]
         | 
| 94 98 | 
             
                        command.compact!
         | 
| 95 99 |  | 
| 96 | 
            -
                        # during rsync, ignore files specified in  | 
| 97 | 
            -
                        #  | 
| 98 | 
            -
                        ignore_files = [ | 
| 100 | 
            +
                        # during rsync, ignore files specified in list of files containing exclude patterns
         | 
| 101 | 
            +
                        # ex: rsync_ignore_files = ['.hgignore', '.gitignore']
         | 
| 102 | 
            +
                        ignore_files = []
         | 
| 103 | 
            +
                        ignore_files = env[:machine].provider_config.rsync_ignore_files unless env[:machine].provider_config.rsync_ignore_files.nil?
         | 
| 99 104 | 
             
                        ignore_files.each do |ignore_file|
         | 
| 100 105 | 
             
                          abs_ignore_file = env[:root_path].to_s + '/' + ignore_file
         | 
| 101 106 | 
             
                          command += ['--exclude-from', abs_ignore_file] if File.exist?(abs_ignore_file)
         | 
| 102 107 | 
             
                        end
         | 
| 103 | 
            -
             | 
| 104 108 | 
             
                        r = Vagrant::Util::Subprocess.execute(*command)
         | 
| 105 109 | 
             
                        next if r.exit_code == 0
         | 
| 106 110 | 
             
                        fail Errors::RsyncError, guestpath: guestpath, hostpath: hostpath, stderr: r.stderr
         | 
| @@ -3,7 +3,7 @@ require 'log4r' | |
| 3 3 | 
             
            module VagrantPlugins
         | 
| 4 4 | 
             
              module Openstack
         | 
| 5 5 | 
             
                module Action
         | 
| 6 | 
            -
                  class WaitForServerToBeAccessible
         | 
| 6 | 
            +
                  class WaitForServerToBeAccessible < AbstractAction
         | 
| 7 7 | 
             
                    def initialize(app, env, resolver = nil, ssh = nil)
         | 
| 8 8 | 
             
                      @logger   = Log4r::Logger.new('vagrant_openstack::action::wait_accessible')
         | 
| 9 9 | 
             
                      @app      = app
         | 
| @@ -11,7 +11,7 @@ module VagrantPlugins | |
| 11 11 | 
             
                      @resolver = resolver || VagrantPlugins::Openstack::ConfigResolver.new
         | 
| 12 12 | 
             
                    end
         | 
| 13 13 |  | 
| 14 | 
            -
                    def  | 
| 14 | 
            +
                    def execute(env)
         | 
| 15 15 | 
             
                      waiting_for_server_to_be_reachable(env)
         | 
| 16 16 | 
             
                      @logger.info 'The server is ready'
         | 
| 17 17 | 
             
                      env[:ui].info(I18n.t('vagrant_openstack.ready'))
         | 
| @@ -41,6 +41,9 @@ module VagrantPlugins | |
| 41 41 | 
             
                        end
         | 
| 42 42 |  | 
| 43 43 | 
             
                        env[:ssh_run_command] = 'exit 0'
         | 
| 44 | 
            +
                        env[:ssh_opts] = {
         | 
| 45 | 
            +
                          extra_args: ['-o', 'BatchMode=yes']
         | 
| 46 | 
            +
                        }
         | 
| 44 47 | 
             
                        @ssh.call(env)
         | 
| 45 48 | 
             
                        return true if env[:ssh_run_exit_status] == 0
         | 
| 46 49 |  | 
| @@ -1,10 +1,12 @@ | |
| 1 1 | 
             
            require 'log4r'
         | 
| 2 2 | 
             
            require 'timeout'
         | 
| 3 3 |  | 
| 4 | 
            +
            require 'vagrant-openstack-provider/action/abstract_action'
         | 
| 5 | 
            +
             | 
| 4 6 | 
             
            module VagrantPlugins
         | 
| 5 7 | 
             
              module Openstack
         | 
| 6 8 | 
             
                module Action
         | 
| 7 | 
            -
                  class WaitForServerToBeActive
         | 
| 9 | 
            +
                  class WaitForServerToBeActive < AbstractAction
         | 
| 8 10 | 
             
                    def initialize(app, _env, retry_interval = 3, timeout = 200)
         | 
| 9 11 | 
             
                      @app    = app
         | 
| 10 12 | 
             
                      @logger = Log4r::Logger.new('vagrant_openstack::action::start_server')
         | 
| @@ -12,11 +14,11 @@ module VagrantPlugins | |
| 12 14 | 
             
                      @timeout = timeout
         | 
| 13 15 | 
             
                    end
         | 
| 14 16 |  | 
| 15 | 
            -
                    def  | 
| 17 | 
            +
                    def execute(env)
         | 
| 16 18 | 
             
                      if env[:machine].id
         | 
| 17 19 | 
             
                        env[:ui].info(I18n.t('vagrant_openstack.waiting_start'))
         | 
| 18 20 | 
             
                        client = env[:openstack_client].nova
         | 
| 19 | 
            -
                        timeout(@timeout) do
         | 
| 21 | 
            +
                        timeout(@timeout, Errors::Timeout) do
         | 
| 20 22 | 
             
                          while client.get_server_details(env, env[:machine].id)['status'] != 'ACTIVE'
         | 
| 21 23 | 
             
                            sleep @retry_interval
         | 
| 22 24 | 
             
                            @logger.info('Waiting for server to be active')
         | 
| @@ -1,10 +1,12 @@ | |
| 1 1 | 
             
            require 'log4r'
         | 
| 2 2 | 
             
            require 'timeout'
         | 
| 3 3 |  | 
| 4 | 
            +
            require 'vagrant-openstack-provider/action/abstract_action'
         | 
| 5 | 
            +
             | 
| 4 6 | 
             
            module VagrantPlugins
         | 
| 5 7 | 
             
              module Openstack
         | 
| 6 8 | 
             
                module Action
         | 
| 7 | 
            -
                  class WaitForServerToStop
         | 
| 9 | 
            +
                  class WaitForServerToStop < AbstractAction
         | 
| 8 10 | 
             
                    def initialize(app, _env, retry_interval = 3, timeout = 200)
         | 
| 9 11 | 
             
                      @app    = app
         | 
| 10 12 | 
             
                      @logger = Log4r::Logger.new('vagrant_openstack::action::stop_server')
         | 
| @@ -12,11 +14,11 @@ module VagrantPlugins | |
| 12 14 | 
             
                      @timeout = timeout
         | 
| 13 15 | 
             
                    end
         | 
| 14 16 |  | 
| 15 | 
            -
                    def  | 
| 17 | 
            +
                    def execute(env)
         | 
| 16 18 | 
             
                      if env[:machine].id
         | 
| 17 19 | 
             
                        env[:ui].info(I18n.t('vagrant_openstack.waiting_stop'))
         | 
| 18 20 | 
             
                        client = env[:openstack_client].nova
         | 
| 19 | 
            -
                        timeout(@timeout) do
         | 
| 21 | 
            +
                        timeout(@timeout, Errors::Timeout) do
         | 
| 20 22 | 
             
                          while client.get_server_details(env, env[:machine].id)['status'] != 'SHUTOFF'
         | 
| 21 23 | 
             
                            sleep @retry_interval
         | 
| 22 24 | 
             
                            @logger.info('Waiting for server to stop')
         | 
| @@ -0,0 +1,66 @@ | |
| 1 | 
            +
            module VagrantPlugins
         | 
| 2 | 
            +
              module Openstack
         | 
| 3 | 
            +
                module Catalog
         | 
| 4 | 
            +
                  class OpenstackCatalog
         | 
| 5 | 
            +
                    def initialize
         | 
| 6 | 
            +
                      @logger = Log4r::Logger.new('vagrant_openstack::action::openstack_reader')
         | 
| 7 | 
            +
                    end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                    def read(env, catalog)
         | 
| 10 | 
            +
                      config = env[:machine].provider_config
         | 
| 11 | 
            +
                      client = env[:openstack_client]
         | 
| 12 | 
            +
                      endpoints = client.session.endpoints
         | 
| 13 | 
            +
                      @logger.info(I18n.t('vagrant_openstack.client.looking_for_available_endpoints'))
         | 
| 14 | 
            +
                      @logger.info("Selecting endpoints matching region '#{config.region}'") unless config.region.nil?
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                      catalog.each do |service|
         | 
| 17 | 
            +
                        se = service['endpoints']
         | 
| 18 | 
            +
                        if config.region.nil?
         | 
| 19 | 
            +
                          if se.size > 1
         | 
| 20 | 
            +
                            env[:ui].warn I18n.t('vagrant_openstack.client.multiple_endpoint', size: se.size, type: service['type'])
         | 
| 21 | 
            +
                            env[:ui].warn "  => #{service['endpoints'][0]['publicURL']}"
         | 
| 22 | 
            +
                          end
         | 
| 23 | 
            +
                          url = se[0]['publicURL'].strip
         | 
| 24 | 
            +
                        else
         | 
| 25 | 
            +
                          se.each do |endpoint|
         | 
| 26 | 
            +
                            url = endpoint['publicURL'].strip if endpoint['region'].eql? config.region
         | 
| 27 | 
            +
                          end
         | 
| 28 | 
            +
                        end
         | 
| 29 | 
            +
                        endpoints[service['type'].to_sym] = url unless url.nil? || url.empty?
         | 
| 30 | 
            +
                      end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                      endpoints[:network] = choose_api_version('Neutron', 'openstack_network_url', 'v2') do
         | 
| 33 | 
            +
                        client.neutron.get_api_version_list(:network)
         | 
| 34 | 
            +
                      end if config.openstack_network_url.nil? && !endpoints[:network].nil?
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                      endpoints[:image] = choose_api_version('Glance', 'openstack_image_url', nil, false) do
         | 
| 37 | 
            +
                        client.glance.get_api_version_list(:image)
         | 
| 38 | 
            +
                      end if config.openstack_image_url.nil? && !endpoints[:image].nil?
         | 
| 39 | 
            +
                    end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    private
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    def choose_api_version(service_name, url_property, version_prefix = nil, fail_if_not_found = true)
         | 
| 44 | 
            +
                      versions = yield
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                      return versions.first['links'].first['href'] if version_prefix.nil?
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                      if versions.size == 1
         | 
| 49 | 
            +
                        return versions.first['links'].first['href'] if versions.first['id'].start_with?(version_prefix)
         | 
| 50 | 
            +
                        fail Errors::NoMatchingApiVersion, api_name: service_name, url_property: url_property, version_list: version_list if fail_if_not_found
         | 
| 51 | 
            +
                      end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                      version_list = ''
         | 
| 54 | 
            +
                      versions.each do |version|
         | 
| 55 | 
            +
                        return version['links'].first['href'] if version['id'].start_with?(version_prefix)
         | 
| 56 | 
            +
                        links = version['links'].map { |l| l['href'] }
         | 
| 57 | 
            +
                        version_list << "#{version['id'].ljust(6)} #{version['status'].ljust(10)} #{links}\n"
         | 
| 58 | 
            +
                      end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                      fail Errors::NoMatchingApiVersion, api_name: service_name, url_property: url_property, version_list: version_list if fail_if_not_found
         | 
| 61 | 
            +
                      nil
         | 
| 62 | 
            +
                    end
         | 
| 63 | 
            +
                  end
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
              end
         | 
| 66 | 
            +
            end
         |