| gio | f8acc61 | 2025-04-26 08:20:55 +0400 | [diff] [blame] | 1 | package status |
| 2 | |
| gio | da70865 | 2025-04-30 14:57:38 +0400 | [diff] [blame] | 3 | import ( |
| 4 | "bytes" |
| 5 | "encoding/json" |
| 6 | "fmt" |
| 7 | ) |
| 8 | |
| gio | f8acc61 | 2025-04-26 08:20:55 +0400 | [diff] [blame] | 9 | type InstanceMonitor struct { |
| 10 | m Monitor |
| gio | da70865 | 2025-04-30 14:57:38 +0400 | [diff] [blame] | 11 | instances map[string]ResourceOuts |
| gio | f8acc61 | 2025-04-26 08:20:55 +0400 | [diff] [blame] | 12 | } |
| 13 | |
| 14 | func NewInstanceMonitor(m Monitor) *InstanceMonitor { |
| 15 | return &InstanceMonitor{ |
| 16 | m: m, |
| gio | da70865 | 2025-04-30 14:57:38 +0400 | [diff] [blame] | 17 | instances: map[string]ResourceOuts{}, |
| gio | f8acc61 | 2025-04-26 08:20:55 +0400 | [diff] [blame] | 18 | } |
| 19 | } |
| 20 | |
| gio | da70865 | 2025-04-30 14:57:38 +0400 | [diff] [blame] | 21 | func (m *InstanceMonitor) Monitor(id string, resources ResourceOuts) { |
| gio | f8acc61 | 2025-04-26 08:20:55 +0400 | [diff] [blame] | 22 | m.instances[id] = resources |
| 23 | } |
| 24 | |
| gio | da70865 | 2025-04-30 14:57:38 +0400 | [diff] [blame] | 25 | func (m *InstanceMonitor) Get(id string) (map[DodoResource]Status, error) { |
| 26 | ret := map[DodoResource]Status{} |
| 27 | namespace := m.instances[id].Release.Namespace |
| 28 | for _, out := range m.instances[id].Outs { |
| 29 | if _, err := m.monitor(namespace, DodoResource{"internal", out.Name}, out, ret); err != nil { |
| 30 | return nil, err |
| gio | f8acc61 | 2025-04-26 08:20:55 +0400 | [diff] [blame] | 31 | } |
| 32 | } |
| gio | da70865 | 2025-04-30 14:57:38 +0400 | [diff] [blame] | 33 | for i := range ret { |
| 34 | if i.Type == "internal" { |
| 35 | delete(ret, i) |
| 36 | } |
| 37 | } |
| 38 | return ret, nil |
| 39 | } |
| 40 | |
| 41 | func mergeStatus(a Status, b Status) Status { |
| 42 | if a > b { |
| 43 | return a |
| 44 | } else { |
| 45 | return b |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | // TODO(gio): handle volume |
| 50 | func (m *InstanceMonitor) monitor(namespace string, resource DodoResource, out ResourceOut, ret map[DodoResource]Status) (Status, error) { |
| 51 | status := StatusNoStatus |
| 52 | for _, h := range out.Helm { |
| 53 | hs, err := m.m.Get(Resource{ |
| 54 | Type: ResourceHelmRelease, |
| 55 | ResourceRef: ResourceRef{ |
| 56 | Id: h.Id, |
| 57 | Name: h.Name, |
| 58 | Namespace: namespace, |
| 59 | }, |
| 60 | }) |
| 61 | fmt.Println(hs, err) |
| 62 | if err != nil { |
| 63 | return StatusNoStatus, err |
| 64 | } |
| 65 | status = mergeStatus(status, hs) |
| 66 | } |
| gio | 0af17d6 | 2025-05-01 15:36:00 +0400 | [diff] [blame] | 67 | for _, i := range out.Volume { |
| 68 | if s, err := m.monitor(namespace, DodoResource{"volume", i.Name}, i, ret); err != nil { |
| 69 | return StatusNoStatus, err |
| 70 | } else { |
| 71 | s = mergeStatus(status, s) |
| 72 | } |
| 73 | } |
| gio | da70865 | 2025-04-30 14:57:38 +0400 | [diff] [blame] | 74 | for _, i := range out.PostgreSQL { |
| 75 | if s, err := m.monitor(namespace, DodoResource{"postgresql", i.Name}, i, ret); err != nil { |
| 76 | return StatusNoStatus, err |
| 77 | } else { |
| 78 | s = mergeStatus(status, s) |
| 79 | } |
| 80 | } |
| 81 | for _, i := range out.MongoDB { |
| 82 | if s, err := m.monitor(namespace, DodoResource{"mongodb", i.Name}, i, ret); err != nil { |
| 83 | return StatusNoStatus, err |
| 84 | } else { |
| 85 | s = mergeStatus(status, s) |
| 86 | } |
| 87 | } |
| 88 | for _, i := range out.Ingress { |
| 89 | name := fmt.Sprintf("https://%s.%s", i.Subdomain, i.Network.Domain) |
| 90 | if s, err := m.monitor(namespace, DodoResource{"ingress", name}, i.ResourceOut, ret); err != nil { |
| 91 | return StatusNoStatus, err |
| 92 | } else { |
| 93 | s = mergeStatus(status, s) |
| 94 | } |
| 95 | } |
| gio | a602462 | 2025-05-01 18:37:16 +0400 | [diff] [blame] | 96 | for _, i := range out.Services { |
| 97 | if s, err := m.monitor(namespace, DodoResource{"service", i.Name}, i, ret); err != nil { |
| 98 | return StatusNoStatus, err |
| 99 | } else { |
| 100 | s = mergeStatus(status, s) |
| 101 | } |
| 102 | } |
| gio | da70865 | 2025-04-30 14:57:38 +0400 | [diff] [blame] | 103 | ret[resource] = status |
| 104 | return status, nil |
| 105 | } |
| 106 | |
| 107 | type resourceIngress struct { |
| 108 | ResourceOut |
| 109 | Network struct { |
| 110 | Domain string `json:"domain"` |
| 111 | } `json:"network"` |
| 112 | Subdomain string `json:"subdomain"` |
| 113 | } |
| 114 | |
| 115 | type resourceHelm struct { |
| 116 | Id string `json:"id"` |
| 117 | Name string `json:"name"` |
| 118 | } |
| 119 | |
| 120 | type ResourceOut struct { |
| 121 | Name string `json:"name"` |
| gio | 0af17d6 | 2025-05-01 15:36:00 +0400 | [diff] [blame] | 122 | Volume map[string]ResourceOut `json:"volume"` |
| gio | da70865 | 2025-04-30 14:57:38 +0400 | [diff] [blame] | 123 | PostgreSQL map[string]ResourceOut `json:"postgresql"` |
| 124 | MongoDB map[string]ResourceOut `json:"mongodb"` |
| 125 | Ingress map[string]resourceIngress `json:"ingress"` |
| gio | a602462 | 2025-05-01 18:37:16 +0400 | [diff] [blame] | 126 | Services map[string]ResourceOut `json:"services"` |
| gio | da70865 | 2025-04-30 14:57:38 +0400 | [diff] [blame] | 127 | Helm map[string]resourceHelm `json:"helmR"` |
| 128 | } |
| 129 | |
| 130 | type ResourceOuts struct { |
| 131 | Release struct { |
| 132 | Namespace string `json:"namespace"` |
| 133 | } |
| 134 | Outs map[string]ResourceOut `json:"outs"` |
| 135 | } |
| 136 | |
| 137 | type DodoResource struct { |
| 138 | Type string |
| 139 | Name string |
| 140 | } |
| 141 | |
| 142 | type DodoResourceStatus struct { |
| 143 | Type string `json:"type"` |
| 144 | Name string `json:"name"` |
| 145 | Status string `json:"status"` |
| 146 | } |
| 147 | |
| 148 | func DecodeResourceOuts(raw []byte) (ResourceOuts, error) { |
| 149 | var outs ResourceOuts |
| 150 | if err := json.NewDecoder(bytes.NewReader(raw)).Decode(&outs); err != nil { |
| 151 | return ResourceOuts{}, err |
| 152 | } |
| 153 | return outs, nil |
| gio | f8acc61 | 2025-04-26 08:20:55 +0400 | [diff] [blame] | 154 | } |