module GoogleApi module CloudPlatformHelpers def stub_google_api_validate_token request.session[GoogleApi::CloudPlatform::Client.session_key_for_token] = 'token' request.session[GoogleApi::CloudPlatform::Client.session_key_for_expires_at] = 1.hour.since.to_i.to_s end def stub_google_api_expired_token request.session[GoogleApi::CloudPlatform::Client.session_key_for_token] = 'token' request.session[GoogleApi::CloudPlatform::Client.session_key_for_expires_at] = 1.hour.ago.to_i.to_s end def stub_google_project_billing_status redis_double = double allow(Gitlab::Redis::SharedState).to receive(:with).and_yield(redis_double) allow(redis_double).to receive(:get).with(CheckGcpProjectBillingWorker.redis_shared_state_key_for('token')).and_return('true') end def stub_cloud_platform_get_zone_cluster(project_id, zone, cluster_id, **options) WebMock.stub_request(:get, cloud_platform_get_zone_cluster_url(project_id, zone, cluster_id)) .to_return(cloud_platform_response(cloud_platform_cluster_body(options))) end def stub_cloud_platform_get_zone_cluster_error(project_id, zone, cluster_id) WebMock.stub_request(:get, cloud_platform_get_zone_cluster_url(project_id, zone, cluster_id)) .to_return(status: [500, "Internal Server Error"]) end def stub_cloud_platform_create_cluster(project_id, zone, **options) WebMock.stub_request(:post, cloud_platform_create_cluster_url(project_id, zone)) .to_return(cloud_platform_response(cloud_platform_operation_body(options))) end def stub_cloud_platform_create_cluster_error(project_id, zone) WebMock.stub_request(:post, cloud_platform_create_cluster_url(project_id, zone)) .to_return(status: [500, "Internal Server Error"]) end def stub_cloud_platform_get_zone_operation(project_id, zone, operation_id, **options) WebMock.stub_request(:get, cloud_platform_get_zone_operation_url(project_id, zone, operation_id)) .to_return(cloud_platform_response(cloud_platform_operation_body(options))) end def stub_cloud_platform_get_zone_operation_error(project_id, zone, operation_id) WebMock.stub_request(:get, cloud_platform_get_zone_operation_url(project_id, zone, operation_id)) .to_return(status: [500, "Internal Server Error"]) end def cloud_platform_get_zone_cluster_url(project_id, zone, cluster_id) "https://container.googleapis.com/v1/projects/#{project_id}/zones/#{zone}/clusters/#{cluster_id}" end def cloud_platform_create_cluster_url(project_id, zone) "https://container.googleapis.com/v1/projects/#{project_id}/zones/#{zone}/clusters" end def cloud_platform_get_zone_operation_url(project_id, zone, operation_id) "https://container.googleapis.com/v1/projects/#{project_id}/zones/#{zone}/operations/#{operation_id}" end def cloud_platform_response(body) { status: 200, headers: { 'Content-Type' => 'application/json' }, body: body.to_json } end def load_sample_cert pem_file = File.expand_path(Rails.root.join('spec/fixtures/clusters/sample_cert.pem')) Base64.encode64(File.read(pem_file)) end ## # gcloud container clusters create # https://cloud.google.com/kubernetes-engine/docs/reference/rest/v1/projects.zones.clusters/create # rubocop:disable Metrics/CyclomaticComplexity # rubocop:disable Metrics/PerceivedComplexity def cloud_platform_cluster_body(**options) { "name": options[:name] || 'string', "description": options[:description] || 'string', "initialNodeCount": options[:initialNodeCount] || 'number', "masterAuth": { "username": options[:username] || 'string', "password": options[:password] || 'string', "clusterCaCertificate": options[:clusterCaCertificate] || load_sample_cert, "clientCertificate": options[:clientCertificate] || 'string', "clientKey": options[:clientKey] || 'string' }, "loggingService": options[:loggingService] || 'string', "monitoringService": options[:monitoringService] || 'string', "network": options[:network] || 'string', "clusterIpv4Cidr": options[:clusterIpv4Cidr] || 'string', "subnetwork": options[:subnetwork] || 'string', "enableKubernetesAlpha": options[:enableKubernetesAlpha] || 'boolean', "labelFingerprint": options[:labelFingerprint] || 'string', "selfLink": options[:selfLink] || 'string', "zone": options[:zone] || 'string', "endpoint": options[:endpoint] || 'string', "initialClusterVersion": options[:initialClusterVersion] || 'string', "currentMasterVersion": options[:currentMasterVersion] || 'string', "currentNodeVersion": options[:currentNodeVersion] || 'string', "createTime": options[:createTime] || 'string', "status": options[:status] || 'RUNNING', "statusMessage": options[:statusMessage] || 'string', "nodeIpv4CidrSize": options[:nodeIpv4CidrSize] || 'number', "servicesIpv4Cidr": options[:servicesIpv4Cidr] || 'string', "currentNodeCount": options[:currentNodeCount] || 'number', "expireTime": options[:expireTime] || 'string' } end def cloud_platform_operation_body(**options) { "name": options[:name] || 'operation-1234567891234-1234567', "zone": options[:zone] || 'us-central1-a', "operationType": options[:operationType] || 'CREATE_CLUSTER', "status": options[:status] || 'PENDING', "detail": options[:detail] || 'detail', "statusMessage": options[:statusMessage] || '', "selfLink": options[:selfLink] || 'https://container.googleapis.com/v1/projects/123456789101/zones/us-central1-a/operations/operation-1234567891234-1234567', "targetLink": options[:targetLink] || 'https://container.googleapis.com/v1/projects/123456789101/zones/us-central1-a/clusters/test-cluster', "startTime": options[:startTime] || '2017-09-13T16:49:13.055601589Z', "endTime": options[:endTime] || '' } end end end