blob: dc5b3ba7de8ec242305eca1a2c24505bce742db7 [file] [log] [blame]
giof8acc612025-04-26 08:20:55 +04001package status
2
3import (
4 "context"
5 "encoding/json"
gioda708652025-04-30 14:57:38 +04006 "fmt"
giof8acc612025-04-26 08:20:55 +04007
8 "github.com/giolekva/pcloud/core/installer/kube"
9
10 "k8s.io/apimachinery/pkg/api/errors"
11 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12 "k8s.io/apimachinery/pkg/runtime/schema"
13 "k8s.io/client-go/dynamic"
14)
15
gioda708652025-04-30 14:57:38 +040016type HelmRelease struct {
gioea6d9122025-05-22 17:57:18 +040017 Metadata Metadata `json:"metadata"`
18 Status struct {
giof8acc612025-04-26 08:20:55 +040019 Conditions []struct {
20 Type string `json:"type"`
21 Status string `json:"status"`
22 } `json:"conditions"`
23 } `json:"status,omitempty"`
24}
25
26type helmReleaseMonitor struct {
27 d dynamic.Interface
28}
29
30func (m *helmReleaseMonitor) Get(ref ResourceRef) (Status, error) {
31 ctx := context.Background()
32 res, err := m.d.Resource(
33 schema.GroupVersionResource{
34 Group: "helm.toolkit.fluxcd.io",
35 Version: "v2beta1",
36 Resource: "helmreleases",
37 },
38 ).Namespace(ref.Namespace).Get(ctx, ref.Name, metav1.GetOptions{})
39 if err != nil {
40 if errors.IsNotFound(err) {
41 return StatusNotFound, nil
42 }
43 return StatusNoStatus, err
44 }
45 b, err := res.MarshalJSON()
46 if err != nil {
47 return StatusNoStatus, err
48 }
gioda708652025-04-30 14:57:38 +040049 var hr HelmRelease
giof8acc612025-04-26 08:20:55 +040050 if err := json.Unmarshal(b, &hr); err != nil {
51 return StatusNoStatus, err
52 }
gioda708652025-04-30 14:57:38 +040053 id, ok := hr.Metadata.Annotations["dodo.cloud/id"]
54 if !ok {
gioea6d9122025-05-22 17:57:18 +040055 fmt.Printf("## missing dodo.cloud/id: %+v\n", ref)
56 return StatusNoStatus, nil
gioda708652025-04-30 14:57:38 +040057 }
58 if id != ref.Id {
59 return StatusNotFound, nil
60 }
giof8acc612025-04-26 08:20:55 +040061 // TODO(gio): check more thoroughly
62 for _, c := range hr.Status.Conditions {
63 if c.Type == "Ready" && c.Status == "True" {
64 return StatusSuccess, nil
65 }
66 }
67 return StatusProcessing, nil
68}
69
70func NewHelmReleaseMonitor(kubeconfig string) (ResourceMonitor, error) {
71 c, err := kube.NewKubeClient(kube.KubeConfigOpts{KubeConfigPath: kubeconfig})
72 if err != nil {
73 return nil, err
74 }
75 d := dynamic.New(c.RESTClient())
76 return &helmReleaseMonitor{d}, nil
77}