module Sitefull::Provider::Google
Constants
- INSTANCE_RUNNING_STATE
- REQUIRED_OPTIONS
- WAIT
Public Instance Methods
connection()
click to toggle source
# 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_rules()
click to toggle source
# 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)
click to toggle source
# 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(_)
click to toggle source
# File lib/sitefull-cloud/provider/google.rb, line 51 def create_key(_) OpenStruct.new(key_data) end
create_network()
click to toggle source
# 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)
click to toggle source
# 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)
click to toggle source
# 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)
click to toggle source
# 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_name()
click to toggle source
# File lib/sitefull-cloud/provider/google.rb, line 20 def project_name @project_name ||= options[:project_name] end
regions()
click to toggle source
# 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?()
click to toggle source
# File lib/sitefull-cloud/provider/google.rb, line 69 def valid? regions.any? end
Private Instance Methods
create_firewall_rule(network_id, rule_name, port)
click to toggle source
# File lib/sitefull-cloud/provider/google.rb, line 80 def create_firewall_rule(network_id, rule_name, port) return if firewall_rule_exists?(rule_name) rule = ::Google::Apis::ComputeV1::Firewall.new(name: rule_name, source_ranges: ['0.0.0.0/0'], network: network_id, allowed: [{ ip_protocol: 'tcp', ports: [port] }]) connection.insert_firewall(project_name, rule) end
firewall_rule_exists?(rule_name)
click to toggle source
# File lib/sitefull-cloud/provider/google.rb, line 86 def firewall_rule_exists?(rule_name) connection.get_firewall(project_name, rule_name) rescue ::Google::Apis::ClientError false end
instance(instance_id)
click to toggle source
# File lib/sitefull-cloud/provider/google.rb, line 98 def instance(instance_id) connection.get_instance(project_name, options[:region], instance_id) end
network_id()
click to toggle source
# File lib/sitefull-cloud/provider/google.rb, line 92 def network_id @network ||= connection.get_network(project_name, 'sitefull-cloud').self_link rescue ::Google::Apis::ClientError nil end
project_images(project)
click to toggle source
# File lib/sitefull-cloud/provider/google.rb, line 75 def project_images(project) images = connection.list_images(project).items images.nil? || images.empty? ? [] : images.reject { |r| !r.deprecated.nil? && r.deprecated.state == 'DEPRECATED' } end