Sha256: e68aa80ec00a6fa7b6302c623add740c6219303710d9e2ba325c0ba7ecf40d0d

Contents?: true

Size: 1.79 KB

Versions: 1

Compression:

Stored size: 1.79 KB

Contents

# frozen_string_literal: true
module KubernetesDeploy
  class Service < KubernetesResource
    TIMEOUT = 7.minutes

    def sync
      _, _err, st = kubectl.run("get", type, @name)
      @found = st.success?
      @related_deployment_replicas = fetch_related_replica_count
      @status = if @num_pods_selected = fetch_related_pod_count
        "Selects #{@num_pods_selected} #{'pod'.pluralize(@num_pods_selected)}"
      else
        "Failed to count related pods"
      end
    end

    def deploy_succeeded?
      # We can't use endpoints if we want the service to be able to fail fast when the pods are down
      exposes_zero_replica_deployment? || selects_some_pods?
    end

    def deploy_failed?
      false
    end

    def timeout_message
      "This service does not seem to select any pods. This means its spec.selector is probably incorrect."
    end

    def exists?
      @found
    end

    private

    def exposes_zero_replica_deployment?
      return false unless @related_deployment_replicas
      @related_deployment_replicas == 0
    end

    def selects_some_pods?
      return false unless @num_pods_selected
      @num_pods_selected > 0
    end

    def selector
      @selector ||= @definition["spec"]["selector"].map { |k, v| "#{k}=#{v}" }.join(",")
    end

    def fetch_related_pod_count
      raw_json, _err, st = kubectl.run("get", "pods", "--selector=#{selector}", "--output=json")
      return unless st.success?
      JSON.parse(raw_json)["items"].length
    end

    def fetch_related_replica_count
      raw_json, _err, st = kubectl.run("get", "deployments", "--selector=#{selector}", "--output=json")
      return unless st.success?

      deployments = JSON.parse(raw_json)["items"]
      return unless deployments.length == 1
      deployments.first["spec"]["replicas"].to_i
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
kubernetes-deploy-0.9.0 lib/kubernetes-deploy/kubernetes_resource/service.rb