Class: Captive::ClusterApps

Inherits:
Object
  • Object
show all
Defined in:
lib/captive/cluster_apps.rb

Overview

Ce que le cluster sait des apps déployées. Le CLI développeur décrit l'état réellement servi, pas l'état désiré dans le repo GitOps — auquel il n'a pas accès.

Instance Method Summary collapse

Constructor Details

#initialize(kubectl:) ⇒ ClusterApps

Returns a new instance of ClusterApps.



9
10
11
# File 'lib/captive/cluster_apps.rb', line 9

def initialize(kubectl:)
  @kubectl = kubectl
end

Instance Method Details

#all ⇒ Object



13
14
15
16
17
18
# File 'lib/captive/cluster_apps.rb', line 13

def all
  web_deployments.map do |deployment|
    namespace = deployment.dig("metadata", "namespace")
    { name: namespace, stage: stage_of(namespace), domains: domains_by_namespace[namespace] || [] }
  end
end

#domains(app) ⇒ Object



20
# File 'lib/captive/cluster_apps.rb', line 20

def domains(app) = domains_by_namespace[app] || []

#egress_ip(app) ⇒ Object

L'add-on peut ne pas être posé, ou la CRD absente du cluster : les deux se lisent comme « pas d'IP fixe », pas comme une panne.



30
31
32
# File 'lib/captive/cluster_apps.rb', line 30

def egress_ip(app)
  first_item("egresspolicy", app)&.dig("spec", "egressIP", "ipv4")
end

#postgres(app) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/captive/cluster_apps.rb', line 34

def postgres(app)
  spec = first_item("cluster", app)&.fetch("spec", nil) or return nil

  { instances: spec["instances"],
    memory:    spec.dig("resources", "limits", "memory"),
    storage:   spec.dig("storage", "size"), }.compact
end

#stage(app) ⇒ Object



22
# File 'lib/captive/cluster_apps.rb', line 22

def stage(app) = stage_of(app)

#tier(app) ⇒ Object



24
# File 'lib/captive/cluster_apps.rb', line 24

def tier(app) = web_of(app)&.dig("metadata", "annotations", "captive.dev/tier")

#workers(app) ⇒ Object



26
# File 'lib/captive/cluster_apps.rb', line 26

def workers(app) = of_type(app, "worker").map { |d| d.dig("metadata", "name") }