Class: CORL::Machine::Vagrant

Inherits:
Object
  • Object
show all
Includes:
CORL::Mixin::Machine::SSH
Defined in:
lib/CORL/machine/vagrant.rb

Constant Summary collapse

@@lock =

Mutex.new

Instance Method Summary collapse

Methods included from CORL::Mixin::Machine::SSH

#close_ssh_session, #init_ssh_session, #ssh_download, #ssh_exec, #ssh_terminal, #ssh_upload, #ssh_wait_for_ready

Instance Method Details

#commandObject




69
70
71
72
# File 'lib/CORL/machine/vagrant.rb', line 69

def command
  set_command unless @command
  @command
end

#create(options = {}) ⇒ Object




138
139
140
141
142
# File 'lib/CORL/machine/vagrant.rb', line 138

def create(options = {})
  super do |config|
    start_machine(config)
  end
end

#create_image(options = {}) ⇒ Object




187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
# File 'lib/CORL/machine/vagrant.rb', line 187

def create_image(options = {})
  super do |config|
    success = true
    if server && server.provider.action(:package) && machine_type.to_sym != :docker
      stop = config.delete(:stop, false)

      # TODO: Decide how to handle versions??
      # Timestamps stink since these things are huge (>600MB)
      box_name = sprintf("%s", node.id).gsub(/\s+/, '-')
      box_path = File.join(node.network.directory, 'boxes', "#{box_name}.box")
      box_url  = "file://#{box_path}"
      FileUtils.mkdir_p(File.dirname(box_path))
      FileUtils.rm_f(box_path)

      begin
        close_ssh_session
        success = run(:package, config.defaults({ 'package.output' => box_path }), false)

        node.set_cache_setting(:box, box_name)
        node.set_cache_setting(:box_url, box_url)

        if success
          env.action_runner.run(::Vagrant::Action.action_box_add, {
            :box_name  => box_name,
            :box_url   => box_url,
            :box_clean => false,
            :box_force => true,
            :ui        => ::Vagrant::UI::Prefixed.new(env.ui, "box")
          })
          load
        end

      rescue => error
        error(error.message, { :i18n => false })
        success = false
      end

      success = run(:up, config) if success && ! stop
    else
      warn("Packaging images not supported on Vagrant provider #{machine_type}", { :i18n => false })
    end
    success
  end
end

#created?Boolean


Checks

Returns:

  • (Boolean)


23
24
25
# File 'lib/CORL/machine/vagrant.rb', line 23

def created?
  server && state != :not_created
end

#destroy(options = {}) ⇒ Object




250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
# File 'lib/CORL/machine/vagrant.rb', line 250

def destroy(options = {})
  super do |config|
    # We should handle prompting internally to keep it consistent
    success = run(:destroy, config.defaults({ :force_confirm_destroy => true }))

    if success
      box_name = sprintf("%s", node.id).gsub(/\s+/, '-')
      found    = false

      # TODO: Figure out box versions.

      env.boxes.all.each do |info|
        registered_box_name     = info[0]
        registered_box_version  = info[1]
        registered_box_provider = info[2]

        if box_name == registered_box_name
          found = true
          break
        end
      end

      if found
        env.action_runner.run(::Vagrant::Action.action_box_remove, {
          :box_name     => box_name,
          :box_provider => node.machine_type
        })

        box_name = sprintf("%s", node.id).gsub(/\s+/, '-')
        box_path = File.join(node.network.directory, 'boxes', "#{box_name}.box")
        Util::Disk.delete(box_path)
      end
    end
    close_ssh_session if success
    success
  end
end

#download(remote_path, local_path, options = {}, &code) ⇒ Object




146
147
148
149
150
# File 'lib/CORL/machine/vagrant.rb', line 146

def download(remote_path, local_path, options = {}, &code)
  super do |config, success|
    ssh_download(remote_path, local_path, config, &code)
  end
end

#envObject




76
77
78
79
# File 'lib/CORL/machine/vagrant.rb', line 76

def env
  return command.env if command
  nil
end

#exec(commands, options = {}, &code) ⇒ Object




162
163
164
165
166
# File 'lib/CORL/machine/vagrant.rb', line 162

def exec(commands, options = {}, &code)
  super do |config|
    ssh_exec(commands, config, &code)
  end
end

#imageObject




121
122
123
124
# File 'lib/CORL/machine/vagrant.rb', line 121

def image
  return server.config.vm.box if server
  nil
end

#loadObject


Management



129
130
131
132
133
134
# File 'lib/CORL/machine/vagrant.rb', line 129

def load
  super do
    myself.server = plugin_name if command && plugin_name
    ! plugin_name && @server.nil? ? false : true
  end
end

#machine_typeObject




114
115
116
117
# File 'lib/CORL/machine/vagrant.rb', line 114

def machine_type
  return server.provider_name if server
  nil
end

#machine_typesObject




108
109
110
# File 'lib/CORL/machine/vagrant.rb', line 108

def machine_types
  [ :virtualbox, :vmware_fusion, :hyperv, :docker ]
end

#normalize(reload) ⇒ Object


Machine plugin interface



15
16
17
18
# File 'lib/CORL/machine/vagrant.rb', line 15

def normalize(reload)
  super
  myself.plugin_name = node.plugin_name if node
end

#public_ipObject


Property accessors / modifiers



36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/CORL/machine/vagrant.rb', line 36

def public_ip
  ip_address = nil
  if server
    ip_address = server.ssh_info[:host]

    if ip_address == '127.0.0.1'
      ip_address = node.vm[:providers][machine_type][:private_network]
      ip_address = ip_address[:ip] if ip_address.is_a?(Hash) && ip_address.has_key?(:ip)
      ip_address = node[:public_ip] unless ip_address
    end
  end
  ip_address
end

#reload(options = {}) ⇒ Object




178
179
180
181
182
183
# File 'lib/CORL/machine/vagrant.rb', line 178

def reload(options = {})
  super do |config|
    success = run(:reload, config)
    success = init_ssh_session(true, config.get(:tries, 12), config.get(:sleep_time, 5)) if success
  end
end

#running?Boolean


Returns:

  • (Boolean)


29
30
31
# File 'lib/CORL/machine/vagrant.rb', line 29

def running?
  server && state == :running
end

#serverObject



93
94
95
96
97
# File 'lib/CORL/machine/vagrant.rb', line 93

def server
  command
  load unless @server
  @server
end

#server=(id) ⇒ Object




83
84
85
86
87
88
89
90
91
# File 'lib/CORL/machine/vagrant.rb', line 83

def server=id
  @server = nil

  if id.is_a?(String)
    @server = new_machine(id)
  elsif ! id.nil?
    @server = id
  end
end

#start(options = {}) ⇒ Object




242
243
244
245
246
# File 'lib/CORL/machine/vagrant.rb', line 242

def start(options = {})
  super do |config|
    start_machine(config)
  end
end

#stateObject




101
102
103
104
# File 'lib/CORL/machine/vagrant.rb', line 101

def state
  return server.state.id if server
  :not_loaded
end

#stop(options = {}) ⇒ Object




234
235
236
237
238
# File 'lib/CORL/machine/vagrant.rb', line 234

def stop(options = {})
  super do |config|
    create_image(config.import({ :stop => true }))
  end
end

#terminal(user, options = {}) ⇒ Object




170
171
172
173
174
# File 'lib/CORL/machine/vagrant.rb', line 170

def terminal(user, options = {})
  super do |config|
    ssh_terminal(user, config)
  end
end

#upload(local_path, remote_path, options = {}, &code) ⇒ Object




154
155
156
157
158
# File 'lib/CORL/machine/vagrant.rb', line 154

def upload(local_path, remote_path, options = {}, &code)
  super do |config, success|
    ssh_upload(local_path, remote_path, config, &code)
  end
end