summaryrefslogtreecommitdiff
path: root/app/services/clusters/gcp/provision_service.rb
diff options
context:
space:
mode:
authorShinya Maeda <shinya@gitlab.com>2017-11-07 22:12:19 +0900
committerShinya Maeda <shinya@gitlab.com>2017-11-07 22:12:19 +0900
commitd89c18901bde510da2668e676b3bf2f1e21deef2 (patch)
tree57ddcc05bb1ca0d70bfb827d0e1ef4930c7ebf7b /app/services/clusters/gcp/provision_service.rb
parentafef38533727cf32a7be324243a25b4db5eb5498 (diff)
parent666ab4882f2c6d385c04afe269ddf5b11f795b19 (diff)
downloadgitlab-ce-d89c18901bde510da2668e676b3bf2f1e21deef2.tar.gz
Merge branch 'master' into fix/sm/31771-do-not-allow-jobs-to-be-erased-new
Diffstat (limited to 'app/services/clusters/gcp/provision_service.rb')
-rw-r--r--app/services/clusters/gcp/provision_service.rb47
1 files changed, 47 insertions, 0 deletions
diff --git a/app/services/clusters/gcp/provision_service.rb b/app/services/clusters/gcp/provision_service.rb
new file mode 100644
index 00000000000..8beea5a8cfb
--- /dev/null
+++ b/app/services/clusters/gcp/provision_service.rb
@@ -0,0 +1,47 @@
+module Clusters
+ module Gcp
+ class ProvisionService
+ attr_reader :provider
+
+ def execute(provider)
+ @provider = provider
+
+ get_operation_id do |operation_id|
+ if provider.make_creating(operation_id)
+ WaitForClusterCreationWorker.perform_in(
+ Clusters::Gcp::VerifyProvisionStatusService::INITIAL_INTERVAL,
+ provider.cluster_id)
+ else
+ provider.make_errored!("Failed to update provider record; #{provider.errors}")
+ end
+ end
+ end
+
+ private
+
+ def get_operation_id
+ operation = provider.api_client.projects_zones_clusters_create(
+ provider.gcp_project_id,
+ provider.zone,
+ provider.cluster.name,
+ provider.num_nodes,
+ machine_type: provider.machine_type)
+
+ unless operation.status == 'PENDING' || operation.status == 'RUNNING'
+ return provider.make_errored!("Operation status is unexpected; #{operation.status_message}")
+ end
+
+ operation_id = provider.api_client.parse_operation_id(operation.self_link)
+
+ unless operation_id
+ return provider.make_errored!('Can not find operation_id from self_link')
+ end
+
+ yield(operation_id)
+
+ rescue Google::Apis::ServerError, Google::Apis::ClientError, Google::Apis::AuthorizationError => e
+ provider.make_errored!("Failed to request to CloudPlatform; #{e.message}")
+ end
+ end
+ end
+end