Module: CemAcpt::Platform::Mixin::Gcp

Defined in:
lib/cem_acpt/platform/gcp.rb

Instance Method Summary collapse

Instance Method Details

#gcp_credentials_fileObject



55
56
57
# File 'lib/cem_acpt/platform/gcp.rb', line 55

def gcp_credentials_file
  @gcp_credentials_file ||= (@config.get('platform.credentials_file') || File.join(Dir.home, '.config', 'gcloud', 'application_default_credentials.json'))
end

#gcp_disk_sizeObject



111
112
113
# File 'lib/cem_acpt/platform/gcp.rb', line 111

def gcp_disk_size
  @gcp_disk_size ||= (@config.get('node_data.disk_size') || 40)
end

#gcp_machine_typeObject



107
108
109
# File 'lib/cem_acpt/platform/gcp.rb', line 107

def gcp_machine_type
  @gcp_machine_type ||= (@config.get('node_data.machine_type') || 'e2-medium')
end

#gcp_max_run_durationObject



115
116
117
# File 'lib/cem_acpt/platform/gcp.rb', line 115

def gcp_max_run_duration
  @gcp_max_run_duration ||= (@config.get('node_data.max_run_duration') || 3600)
end

#gcp_private_keyObject



99
100
101
# File 'lib/cem_acpt/platform/gcp.rb', line 99

def gcp_private_key
  @gcp_private_key ||= (@run_data[:private_key] || File.join(Dir.home, '.ssh', 'google_compute_engine'))
end

#gcp_projectObject



59
60
61
62
63
64
65
66
67
68
69
# File 'lib/cem_acpt/platform/gcp.rb', line 59

def gcp_project
  return @gcp_project if @gcp_project

  configured = @config.get('platform.project')
  return @gcp_project = configured if configured

  stdout, stderr, status = Open3.capture3('gcloud config get-value project')
  raise "gcloud config get-value project failed (exit #{status.exitstatus}): #{stderr.chomp}" unless status.success?

  @gcp_project = stdout.chomp
end

#gcp_public_keyObject



103
104
105
# File 'lib/cem_acpt/platform/gcp.rb', line 103

def gcp_public_key
  @gcp_public_key ||= (@run_data[:public_key] || File.join(Dir.home, '.ssh', 'google_compute_engine.pub'))
end

#gcp_regionObject



71
72
73
74
75
76
77
78
79
80
81
# File 'lib/cem_acpt/platform/gcp.rb', line 71

def gcp_region
  return @gcp_region if @gcp_region

  configured = @config.get('platform.region')
  return @gcp_region = configured if configured

  stdout, stderr, status = Open3.capture3('gcloud config get-value compute/region')
  raise "gcloud config get-value compute/region failed (exit #{status.exitstatus}): #{stderr.chomp}" unless status.success?

  @gcp_region = stdout.chomp
end

#gcp_subnetworkObject



95
96
97
# File 'lib/cem_acpt/platform/gcp.rb', line 95

def gcp_subnetwork
  @gcp_subnetwork ||= (@config.get('platform.subnetwork') || 'default')
end

#gcp_usernameObject



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/cem_acpt/platform/gcp.rb', line 34

def gcp_username
  return @gcp_username if @gcp_username

  @gcp_username = @config.get('platform.username')
  return @gcp_username if @gcp_username

  stdout, stderr, status = Open3.capture3('gcloud compute os-login describe-profile --format json')
  raise "gcloud os-login describe-profile failed (exit #{status.exitstatus}): #{stderr.chomp}" unless status.success?

  parsed = JSON.parse(stdout)
  accounts = parsed['posixAccounts']
  raise "gcloud os-login profile returned no posixAccounts. stderr: #{stderr.chomp}" if accounts.nil? || accounts.empty?

  username = accounts.first['username']
  raise "gcloud os-login posixAccounts entry has no username. stdout: #{stdout.chomp}" unless username

  @gcp_username = username
rescue JSON::ParserError => e
  raise "Failed to parse gcloud os-login output: #{e.message}. stdout: #{stdout.chomp}"
end

#gcp_zoneObject



83
84
85
86
87
88
89
90
91
92
93
# File 'lib/cem_acpt/platform/gcp.rb', line 83

def gcp_zone
  return @gcp_zone if @gcp_zone

  configured = @config.get('platform.zone')
  return @gcp_zone = configured if configured

  stdout, stderr, status = Open3.capture3('gcloud config get-value compute/zone')
  raise "gcloud config get-value compute/zone failed (exit #{status.exitstatus}): #{stderr.chomp}" unless status.success?

  @gcp_zone = stdout.chomp
end

#node_dataObject



24
25
26
27
28
29
30
31
32
# File 'lib/cem_acpt/platform/gcp.rb', line 24

def node_data
  nd = {}
  nd[:machine_type] = gcp_machine_type
  nd[:disk_size] = gcp_disk_size
  nd[:max_run_duration] = gcp_max_run_duration
  nd[:image] = image_name if image_name
  nd[:test_name] = @test_data[:test_name] if @test_data&.key?(:test_name)
  nd
end

#platform_dataObject



11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/cem_acpt/platform/gcp.rb', line 11

def platform_data
  {
    username: gcp_username,
    credentials_file: gcp_credentials_file,
    project: gcp_project,
    region: gcp_region,
    zone: gcp_zone,
    subnetwork: gcp_subnetwork,
    private_key: gcp_private_key,
    public_key: gcp_public_key,
  }
end