2017-09-25 07:10:25 +00:00
|
|
|
class Projects::ClustersController < Projects::ApplicationController
|
|
|
|
before_action :cluster
|
2017-09-27 12:01:08 +00:00
|
|
|
before_action :authorize_google_api, except: [:login]
|
2017-09-25 07:10:25 +00:00
|
|
|
# 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
|
|
|
|
|
2017-09-25 07:10:25 +00:00
|
|
|
def index
|
|
|
|
if cluster
|
2017-09-27 13:17:41 +00:00
|
|
|
redirect_to edit_namespace_project_cluster_path(project.namespace, project, cluster.id)
|
2017-09-25 07:10:25 +00:00
|
|
|
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']
|
|
|
|
)
|
|
|
|
|
2017-09-27 12:53:50 +00:00
|
|
|
# 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,
|
2017-09-27 12:53:50 +00:00
|
|
|
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'],
|
2017-09-27 12:53:50 +00:00
|
|
|
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
|
|
|
|
2017-09-25 07:10:25 +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?
|
2017-09-25 07:10:25 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def update
|
2017-09-27 13:17:41 +00:00
|
|
|
cluster.update(enabled: params['enabled'])
|
|
|
|
cluster.service.update(active: params['enabled'])
|
2017-09-25 07:10:25 +00:00
|
|
|
render :edit
|
|
|
|
end
|
|
|
|
|
2017-09-27 13:17:41 +00:00
|
|
|
def destroy
|
|
|
|
cluster.destroy
|
|
|
|
redirect_to action: 'index'
|
|
|
|
end
|
|
|
|
|
2017-09-25 07:10:25 +00:00
|
|
|
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
|
2017-09-25 07:10:25 +00:00
|
|
|
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],
|
2017-09-25 07:10:25 +00:00
|
|
|
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
|
2017-09-25 07:10:25 +00:00
|
|
|
end
|