Module: Sitefull::Provider::Google

Defined in:
lib/sitefull-cloud/provider/google.rb

Constant Summary collapse

REQUIRED_OPTIONS =
%w(project_name).freeze
WAIT =
2.freeze
INSTANCE_RUNNING_STATE =
'RUNNING'.freeze

Instance Method Summary collapse

Instance Method Details

#connectionObject



12
13
14
15
16
17
18
# File 'lib/sitefull-cloud/provider/google.rb', line 12

def connection
  return @connection unless @connection.nil?

  connection = ::Google::Apis::ComputeV1::ComputeService.new
  connection.authorization = credentials
  @connection = connection
end

#create_firewall_rulesObject



45
46
47
48
49
# File 'lib/sitefull-cloud/provider/google.rb', line 45

def create_firewall_rules
  create_firewall_rule(network_id, 'sitefull-ssh', '22')
  create_firewall_rule(network_id, 'sitefull-http', '80')
  create_firewall_rule(network_id, 'sitefull-https', '443')
end

#create_instance(name, machine_type, image, network_id, key) ⇒ Object



55
56
57
58
59
60
61
62
63
# File 'lib/sitefull-cloud/provider/google.rb', line 55

def create_instance(name, machine_type, image, network_id, key)
  instance = ::Google::Apis::ComputeV1::Instance.new(name: name, machine_type: machine_type,
                                                     disks: [{ boot: true, autoDelete: true, initialize_params: { source_image: image } }],
                                                     network_interfaces: [{ network: network_id, access_configs: [{ name: 'default' }] }],
                                                     metadata: { items: [{ key: 'ssh-keys', value: "#{key.ssh_user}:ssh-rsa #{key.public_key} #{key.ssh_user}"}] })
  connection.insert_instance(project_name, options[:region], instance).target_link
  sleep WAIT unless instance(name).status == INSTANCE_RUNNING_STATE
  name
end

#create_key(_) ⇒ Object



51
52
53
# File 'lib/sitefull-cloud/provider/google.rb', line 51

def create_key(_)
  OpenStruct.new(key_data)
end

#create_networkObject



38
39
40
41
42
43
# File 'lib/sitefull-cloud/provider/google.rb', line 38

def create_network
  return network_id unless network_id.nil?

  network = ::Google::Apis::ComputeV1::Network.new(name: 'sitefull-cloud', i_pv4_range: '172.16.0.0/16')
  connection.insert_network(project_name, network).target_link
end

#images(os) ⇒ Object



34
35
36
# File 'lib/sitefull-cloud/provider/google.rb', line 34

def images(os)
  @images ||= (project_images(project_name) + project_images("#{os}-cloud")).map { |i| OpenStruct.new(id: i.self_link, name: i.name) }
end

#instance_data(instance_id) ⇒ Object



65
66
67
# File 'lib/sitefull-cloud/provider/google.rb', line 65

def instance_data(instance_id)
  OpenStruct.new(id: instance_id, public_ip: instance(instance_id).network_interfaces.first.access_configs.first.nat_ip)
end

#machine_types(zone) ⇒ Object



28
29
30
31
32
# File 'lib/sitefull-cloud/provider/google.rb', line 28

def machine_types(zone)
  @machine_types ||= connection.list_machine_types(project_name, zone).items.map { |m| OpenStruct.new(id: m.self_link, name: m.name) }
rescue ::Google::Apis::ClientError
  []
end

#project_nameObject



20
21
22
# File 'lib/sitefull-cloud/provider/google.rb', line 20

def project_name
  @project_name ||= options[:project_name]
end

#regionsObject



24
25
26
# File 'lib/sitefull-cloud/provider/google.rb', line 24

def regions
  @regions ||= connection.list_zones(project_name).items.map { |r| OpenStruct.new(id: r.name, name: r.name) }
end

#valid?Boolean

Returns:

  • (Boolean)


69
70
71
# File 'lib/sitefull-cloud/provider/google.rb', line 69

def valid?
  regions.any?
end