2017-09-25 03:10:25 -04:00
|
|
|
module Ci
|
|
|
|
class Cluster < ActiveRecord::Base
|
|
|
|
extend Gitlab::Ci::Model
|
2017-09-28 05:11:17 -04:00
|
|
|
include ReactiveCaching
|
|
|
|
|
|
|
|
self.reactive_cache_key = ->(cluster) { [cluster.class.model_name.singular, cluster.project_id, cluster.id] }
|
2017-09-25 03:10:25 -04:00
|
|
|
|
|
|
|
belongs_to :project
|
|
|
|
belongs_to :owner, class_name: 'User'
|
2017-09-26 04:46:09 -04:00
|
|
|
belongs_to :service
|
2017-09-25 03:10:25 -04:00
|
|
|
|
2017-09-28 05:11:17 -04:00
|
|
|
# after_save :clear_reactive_cache!
|
|
|
|
|
|
|
|
def creation_status(access_token)
|
|
|
|
with_reactive_cache(access_token) do |operation|
|
|
|
|
{
|
|
|
|
status: operation[:status],
|
|
|
|
status_message: operation[:status_message]
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def calculate_reactive_cache(access_token)
|
|
|
|
return { status: 'INTEGRATED' } if service # If it's already done, we don't need to continue the following process
|
|
|
|
|
|
|
|
api_client = GoogleApi::CloudPlatform::Client.new(access_token, nil)
|
|
|
|
operation = api_client.projects_zones_operations(gcp_project_id, cluster_zone, gcp_operation_id)
|
|
|
|
|
|
|
|
if operation&.status == 'DONE'
|
|
|
|
# Get cluster details (end point, etc)
|
|
|
|
gke_cluster = api_client.projects_zones_clusters_get(
|
|
|
|
gcp_project_id, cluster_zone, cluster_name
|
|
|
|
)
|
|
|
|
|
|
|
|
# Get k8s token
|
|
|
|
token = ''
|
|
|
|
KubernetesService.new.tap do |ks|
|
|
|
|
ks.api_url = 'https://' + gke_cluster.endpoint
|
|
|
|
ks.ca_pem = Base64.decode64(gke_cluster.master_auth.cluster_ca_certificate)
|
|
|
|
ks.username = gke_cluster.master_auth.username
|
|
|
|
ks.password = gke_cluster.master_auth.password
|
|
|
|
secrets = ks.read_secrets
|
|
|
|
secrets.each do |secret|
|
|
|
|
name = secret.dig('metadata', 'name')
|
|
|
|
if /default-token/ =~ name
|
|
|
|
token_base64 = secret.dig('data', 'token')
|
|
|
|
token = Base64.decode64(token_base64)
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# k8s endpoint, ca_cert
|
|
|
|
endpoint = 'https://' + gke_cluster.endpoint
|
|
|
|
cluster_ca_certificate = Base64.decode64(gke_cluster.master_auth.cluster_ca_certificate)
|
|
|
|
|
|
|
|
# Update service
|
|
|
|
kubernetes_service.attributes = {
|
|
|
|
active: true,
|
|
|
|
api_url: endpoint,
|
|
|
|
ca_pem: cluster_ca_certificate,
|
|
|
|
namespace: project_namespace,
|
|
|
|
token: token
|
|
|
|
}
|
|
|
|
|
|
|
|
kubernetes_service.save!
|
|
|
|
|
|
|
|
# Save info in cluster record
|
|
|
|
update(
|
|
|
|
enabled: true,
|
|
|
|
service: kubernetes_service,
|
|
|
|
username: gke_cluster.master_auth.username,
|
|
|
|
password: gke_cluster.master_auth.password,
|
|
|
|
token: token,
|
|
|
|
ca_cert: cluster_ca_certificate,
|
|
|
|
end_point: endpoint,
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
puts "#{self.class.name} - #{__callee__}: operation.to_json: #{operation.to_json}"
|
|
|
|
operation.to_h
|
|
|
|
end
|
|
|
|
|
|
|
|
def kubernetes_service
|
|
|
|
@kubernetes_service ||= project.find_or_initialize_service('kubernetes')
|
|
|
|
end
|
2017-09-25 03:10:25 -04:00
|
|
|
end
|
|
|
|
end
|