Class: Train::Transports::Gcp::Connection

Inherits:
BaseConnection
  • Object
show all
Defined in:
lib/train/transports/gcp.rb

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ Connection

Returns a new instance of Connection.



37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/train/transports/gcp.rb', line 37

def initialize(options)
  super(options)

  # additional GCP platform metadata
  release = Gem.loaded_specs["google-api-client"].version
  @platform_details = { release: "google-api-client-v#{release}" }

  # Initialize the client object cache
  @cache_enabled[:api_call] = true
  @cache[:api_call] = {}

  connect
end

Instance Method Details

#connectObject



89
90
91
92
93
94
95
96
97
98
99
# File 'lib/train/transports/gcp.rb', line 89

def connect
  ENV["GOOGLE_APPLICATION_CREDENTIALS"] = @options[:google_application_credentials] if @options[:google_application_credentials]
  ENV["GOOGLE_CLOUD_PROJECT"] = @options[:google_cloud_project] if @options[:google_cloud_project]
  # GCP initialization
  scopes = ["https://www.googleapis.com/auth/cloud-platform",
            "https://www.googleapis.com/auth/compute"]
  authorization = Google::Auth.get_application_default(scopes)
  Google::Apis::ClientOptions.default.application_name = "chef-inspec-train"
  Google::Apis::ClientOptions.default.application_version = Train::VERSION
  Google::Apis::RequestOptions.default.authorization = authorization
end

#gcp_admin_clientObject



72
73
74
75
76
77
78
79
80
# File 'lib/train/transports/gcp.rb', line 72

def gcp_admin_client
  scopes = ["https://www.googleapis.com/auth/admin.directory.user.readonly"]
  authorization = Google::Auth.get_application_default(scopes).dup
  # Use of the Admin API requires delegation (impersonation). An email address of a Super Admin in
  # the G Suite account may be required.
  authorization.sub = @options[:google_super_admin_email] if @options[:google_super_admin_email]
  Google::Apis::RequestOptions.default.authorization = authorization
  gcp_client(Google::Apis::AdminDirectoryV1::DirectoryService)
end

#gcp_client(klass) ⇒ Object

Let's allow for other clients too



83
84
85
86
87
# File 'lib/train/transports/gcp.rb', line 83

def gcp_client(klass)
  return klass.new unless cache_enabled?(:api_call)

  @cache[:api_call][klass.to_s.to_sym] ||= klass.new
end

#gcp_compute_clientObject

Instantiate some named classes for ease of use



56
57
58
# File 'lib/train/transports/gcp.rb', line 56

def gcp_compute_client
  gcp_client(Google::Apis::ComputeV1::ComputeService)
end

#gcp_iam_clientObject



60
61
62
# File 'lib/train/transports/gcp.rb', line 60

def gcp_iam_client
  gcp_client(Google::Apis::IamV1::IamService)
end

#gcp_project_clientObject



64
65
66
# File 'lib/train/transports/gcp.rb', line 64

def gcp_project_client
  gcp_client(Google::Apis::CloudresourcemanagerV1::CloudResourceManagerService)
end

#gcp_storage_clientObject



68
69
70
# File 'lib/train/transports/gcp.rb', line 68

def gcp_storage_client
  gcp_client(Google::Apis::StorageV1::StorageService)
end

#platformObject



51
52
53
# File 'lib/train/transports/gcp.rb', line 51

def platform
  force_platform!("gcp", @platform_details)
end

#unique_identifierObject



105
106
107
108
109
110
111
112
113
# File 'lib/train/transports/gcp.rb', line 105

def unique_identifier
  unique_id = "default"
  # use auth client_id for users (issuer is nil)
  authorization = gcp_iam_client.request_options.authorization
  unique_id = authorization.client_id if authorization.respond_to?(:client_id) && !authorization.client_id.nil?
  # for service account credentials (client_id is nil)
  unique_id = authorization.issuer if authorization.respond_to?(:issuer) && !authorization.issuer.nil?
  unique_id
end

#uriObject



101
102
103
# File 'lib/train/transports/gcp.rb', line 101

def uri
  "gcp://#{unique_identifier}"
end