gitlab-org--gitlab-foss/app/controllers/projects/clusters_controller.rb

135 lines
3.5 KiB
Ruby
Raw Normal View History

class Projects::ClustersController < Projects::ApplicationController
before_action :cluster
2017-09-27 12:01:08 +00:00
before_action :authorize_google_api, except: [:login]
# before_action :authorize_admin_clusters! # TODO: Authentication
2017-09-27 12:01:08 +00:00
def login
begin
@authorize_url = api_client.authorize_url
rescue GoogleApi::Authentication::ConfigMissingError
end
end
def index
if cluster
2017-09-27 13:17:41 +00:00
redirect_to edit_namespace_project_cluster_path(project.namespace, project, cluster.id)
else
redirect_to action: 'new'
end
end
def new
end
def create
2017-09-27 12:01:08 +00:00
# Create a cluster on GKE
operation = api_client.projects_zones_clusters_create(
params['gcp_project_id'], params['cluster_zone'], params['cluster_name'],
cluster_size: params['cluster_size'], machine_type: params['machine_type']
)
# wait_operation_done
if operation&.operation_type == 'CREATE_CLUSTER'
api_client.wait_operation_done(operation.self_link)
else
raise "TODO: ERROR"
end
2017-09-26 14:05:12 +00:00
2017-09-27 12:01:08 +00:00
# Get cluster details (end point, etc)
gke_cluster = api_client.projects_zones_clusters_get(
params['gcp_project_id'], params['cluster_zone'], params['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
2017-09-27 12:01:08 +00:00
# Update service
kubernetes_service.attributes = service_params(
active: true,
api_url: 'https://' + gke_cluster.endpoint,
2017-09-27 12:01:08 +00:00
ca_pem: Base64.decode64(gke_cluster.master_auth.cluster_ca_certificate),
namespace: params['project_namespace'],
token: token
2017-09-25 17:11:26 +00:00
)
2017-09-27 12:01:08 +00:00
kubernetes_service.save!
2017-09-25 17:11:26 +00:00
2017-09-27 12:01:08 +00:00
# Save info
project.clusters.create(
gcp_project_id: params['gcp_project_id'],
cluster_zone: params['cluster_zone'],
cluster_name: params['cluster_name'],
service: kubernetes_service
)
2017-09-25 17:11:26 +00:00
redirect_to action: 'index'
end
def edit
2017-09-27 12:01:08 +00:00
# TODO: If on, do we override parameter?
# TODO: If off, do we override parameter?
end
def update
2017-09-27 13:17:41 +00:00
cluster.update(enabled: params['enabled'])
cluster.service.update(active: params['enabled'])
render :edit
end
2017-09-27 13:17:41 +00:00
def destroy
cluster.destroy
redirect_to action: 'index'
end
private
def cluster
# Each project has only one cluster, for now. In the future iteraiton, we'll support multiple clusters
2017-09-26 08:46:09 +00:00
@cluster ||= project.clusters.last
end
def api_client
@api_client ||=
GoogleApi::CloudPlatform::Client.new(
2017-09-25 17:11:26 +00:00
session[GoogleApi::CloudPlatform::Client.token_in_session],
callback_google_api_authorizations_url,
state: namespace_project_clusters_url.to_s
)
end
2017-09-26 08:46:09 +00:00
def kubernetes_service
@kubernetes_service ||= project.find_or_initialize_service('kubernetes')
end
def service_params(active:, api_url:, ca_pem:, namespace:, token:)
{
active: active,
api_url: api_url,
ca_pem: ca_pem,
namespace: namespace,
token: token
}
end
2017-09-27 12:01:08 +00:00
def authorize_google_api
unless session[GoogleApi::CloudPlatform::Client.token_in_session]
redirect_to action: 'login'
end
end
end