~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
72 lines · 1.8 KB Raw History
package manifests

import (
	"sort"

	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
	"k8s.io/apimachinery/pkg/runtime/schema"

	"github.com/johnandersen777/socialweb-computer-kcp/api/kcpgvr"
	v1alpha1 "github.com/johnandersen777/socialweb-computer-kcp/api/v1alpha1"
)

type WaitKind struct {
	Resource   schema.GroupVersionResource
	Namespaced bool
	For        map[string]string
}

var WaitKinds = map[string]WaitKind{
	"Workspace": {
		Resource: kcpgvr.Workspaces,
		For:      map[string]string{"Ready": CaptureLogicalCluster},
	},
	"APIExport": {
		Resource: kcpgvr.APIExports,
		For:      map[string]string{"IdentityValid": ""},
	},
	"APIBinding": {
		Resource: kcpgvr.APIBindings,
		For:      map[string]string{"Ready": ""},
	},
	"OpenBaoServer": {
		Resource: v1alpha1.OpenBaoServerGVR,
		For:      map[string]string{"Ready": ""},
	},
}

func waitKindNames() []string {
	out := make([]string, 0, len(WaitKinds))
	for k := range WaitKinds {
		out = append(out, k)
	}
	sort.Strings(out)
	return out
}

func conditionTrue(u *unstructured.Unstructured, name string) bool {
	conds, _, _ := unstructured.NestedSlice(u.Object, "status", "conditions")
	for _, c := range conds {
		m, ok := c.(map[string]any)
		if ok && m["type"] == name && m["status"] == "True" {
			return true
		}
	}
	return false
}

func (w Wait) Met(u *unstructured.Unstructured) (bool, string) {
	switch w.Kind + "/" + w.For {
	case "Workspace/Ready":
		phase, _, _ := unstructured.NestedString(u.Object, "status", "phase")
		cluster, _, _ := unstructured.NestedString(u.Object, "spec", "cluster")
		return phase == "Ready", cluster
	case "APIExport/IdentityValid":
		return conditionTrue(u, "IdentityValid"), ""
	case "APIBinding/Ready":
		return conditionTrue(u, "Ready"), ""
	case "OpenBaoServer/Ready":
		return conditionTrue(u, "Ready"), ""
	}
	return false, ""
}