kubernetes_helpers.rb 4.7 KB
Newer Older
1 2 3
module KubernetesHelpers
  include Gitlab::Kubernetes

4 5 6 7 8 9 10 11
  def kube_response(body)
    { body: body.to_json }
  end

  def kube_pods_response
    kube_response(kube_pods_body)
  end

12 13 14 15
  def kube_deployments_response
    kube_response(kube_deployments_body)
  end

16 17
  def stub_kubeclient_discover(api_url)
    WebMock.stub_request(:get, api_url + '/api/v1').to_return(kube_response(kube_v1_discovery_body))
18
    WebMock.stub_request(:get, api_url + '/apis/extensions/v1beta1').to_return(kube_response(kube_v1beta1_discovery_body))
19 20 21
  end

  def stub_kubeclient_pods(response = nil)
22
    stub_kubeclient_discover(service.api_url)
23 24 25 26 27
    pods_url = service.api_url + "/api/v1/namespaces/#{service.actual_namespace}/pods"

    WebMock.stub_request(:get, pods_url).to_return(response || kube_pods_response)
  end

28 29 30 31 32 33 34
  def stub_kubeclient_deployments(response = nil)
    stub_kubeclient_discover(service.api_url)
    deployments_url = service.api_url + "/apis/extensions/v1beta1/namespaces/#{service.actual_namespace}/deployments"

    WebMock.stub_request(:get, deployments_url).to_return(response || kube_deployments_response)
  end

35 36 37 38 39 40 41
  def stub_kubeclient_get_secrets(api_url, **options)
    WebMock.stub_request(:get, api_url + '/api/v1/secrets')
      .to_return(kube_response(kube_v1_secrets_body(options)))
  end

  def stub_kubeclient_get_secrets_error(api_url)
    WebMock.stub_request(:get, api_url + '/api/v1/secrets')
S
Shinya Maeda 已提交
42
      .to_return(status: [404, "Internal Server Error"])
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
  end

  def kube_v1_secrets_body(**options)
    {
      "kind" => "SecretList",
      "apiVersion": "v1",
      "items" => [
        {
          "metadata": {
            "name": options[:metadata_name] || "default-token-1",
            "namespace": "kube-system"
          },
          "data": {
            "token": options[:token] || Base64.encode64('token-sample-123')
          }
        }
      ]
    }
  end

63
  def kube_v1_discovery_body
64 65
    {
      "kind" => "APIResourceList",
66
      "resources" => [
67
        { "name" => "pods", "namespaced" => true, "kind" => "Pod" },
68 69 70 71 72 73 74 75 76 77 78 79
        { "name" => "deployments", "namespaced" => true, "kind" => "Deployment" },
        { "name" => "secrets", "namespaced" => true, "kind" => "Secret" }
      ]
    }
  end

  def kube_v1beta1_discovery_body
    {
      "kind" => "APIResourceList",
      "resources" => [
        { "name" => "pods", "namespaced" => true, "kind" => "Pod" },
        { "name" => "deployments", "namespaced" => true, "kind" => "Deployment" },
80
        { "name" => "secrets", "namespaced" => true, "kind" => "Secret" }
81
      ]
82 83 84
    }
  end

85 86 87 88 89
  def kube_pods_body
    {
      "kind" => "PodList",
      "items" => [kube_pod]
    }
90 91
  end

92 93 94 95 96 97 98
  def kube_deployments_body
    {
      "kind" => "DeploymentList",
      "items" => [kube_deployment]
    }
  end

99 100
  # This is a partial response, it will have many more elements in reality but
  # these are the ones we care about at the moment
101
  def kube_pod(name: "kube-pod", app: "valid-pod-label", status: "Running", track: nil)
102 103
    {
      "metadata" => {
104
        "name" => name,
105
        "generate_name" => "generated-name-with-suffix",
106
        "creationTimestamp" => "2016-11-25T19:55:19Z",
107 108 109 110
        "labels" => {
          "app" => app,
          "track" => track
        }
111 112 113 114
      },
      "spec" => {
        "containers" => [
          { "name" => "container-0" },
115 116
          { "name" => "container-1" }
        ]
117
      },
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
      "status" => { "phase" => status }
    }
  end

  def kube_deployment(name: "kube-deployment", app: "valid-deployment-label", track: nil)
    {
      "metadata" => {
        "name" => name,
        "generation" => 4,
        "labels" => {
          "app" => app,
          "track" => track
        }.compact
      },
      "spec" => { "replicas" => 3 },
      "status" => {
        "observedGeneration" => 4,
        "replicas" => 3,
        "updatedReplicas" => 3,
        "availableReplicas" => 3
      }
139 140 141 142 143 144 145 146 147 148
    }
  end

  def kube_terminals(service, pod)
    pod_name = pod['metadata']['name']
    containers = pod['spec']['containers']

    containers.map do |container|
      terminal = {
        selectors: { pod: pod_name, container: container['name'] },
149
        url:  container_exec_url(service.api_url, service.actual_namespace, pod_name, container['name']),
150 151
        subprotocols: ['channel.k8s.io'],
        headers: { 'Authorization' => ["Bearer #{service.token}"] },
152 153
        created_at: DateTime.parse(pod['metadata']['creationTimestamp']),
        max_session_time: 0
154 155 156 157 158
      }
      terminal[:ca_pem] = service.ca_pem if service.ca_pem.present?
      terminal
    end
  end
159 160 161 162 163 164 165 166

  def kube_deployment_rollout_status
    ::Gitlab::Kubernetes::RolloutStatus.from_deployments(kube_deployment)
  end

  def empty_deployment_rollout_status
    ::Gitlab::Kubernetes::RolloutStatus.from_deployments()
  end
167
end