Class: VagrantPlugins::Google::Action::AssignInstanceGroups

Inherits:
Object
  • Object
show all
Defined in:
lib/vagrant-google/action/assign_instance_groups.rb

Overview

Action to assign instance groups. Looks for the ‘instance_group’ parameter in the zone config and adds the instance to it. If the instance group does not exist in the specified zone, it tries to create one first.

This action manipulates unmanaged instance groups cloud.google.com/compute/docs/instance-groups/unmanaged-groups

Instance Method Summary collapse

Constructor Details

#initialize(app, env) ⇒ AssignInstanceGroups

Returns a new instance of AssignInstanceGroups.



25
26
27
28
29
30
# File 'lib/vagrant-google/action/assign_instance_groups.rb', line 25

def initialize(app, env)
  @app = app
  @logger = Log4r::Logger.new(
    "vagrant_google::action::assign_instance_groups"
  )
end

Instance Method Details

#call(env) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/vagrant-google/action/assign_instance_groups.rb', line 32

def call(env)
  zone = env[:machine].provider_config.zone
  zone_config = env[:machine].provider_config.get_zone_config(zone)
  instance_name = zone_config.name
  instance_group_name = zone_config.instance_group
  network = zone_config.network
  subnetwork = zone_config.subnetwork

  if instance_group_name
    group = env[:google_compute].instance_groups.get(instance_group_name,
                                                     zone)
    if group.nil?
      # If instance group doesn't exist, attempt to create it
      env[:ui].info(I18n.t("vagrant_google.instance_group_create"))
      instance_group_config = {
        name: instance_group_name,
        zone: zone,
        description: "Created by Vagrant",
        network: network,
        subnetwork: subnetwork,
      }
      env[:google_compute].instance_groups.create(instance_group_config)
    end

    # Add the machine to instance group
    env[:ui].info(I18n.t("vagrant_google.instance_group_add"))

    # Fixup with add_instance_group_instance after adding to fog
    # See https://github.com/fog/fog-google/issues/308
    response = env[:google_compute].add_instance_group_instances(
      instance_group_name,
      zone,
      [instance_name]
    )
    unless response.status == "DONE"
      operation = env[:google_compute].operations.get(response.name, zone)
      env[:ui].info(I18n.t("vagrant_google.waiting_for_operation",
                           name: operation.name))
      operation.wait_for { ready? }
    end
  end

  @app.call(env)
end