-
Notifications
You must be signed in to change notification settings - Fork 0
/
delay_cluster.go
79 lines (62 loc) · 2.51 KB
/
delay_cluster.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package vshnpostgres
import (
"context"
"fmt"
xkube "github.com/crossplane-contrib/provider-kubernetes/apis/object/v1alpha1"
xpv1 "github.com/crossplane/crossplane-runtime/apis/common/v1"
xfnproto "github.com/crossplane/function-sdk-go/proto/v1beta1"
stackgresv1 "github.com/vshn/appcat/v4/apis/stackgres/v1"
vshnv1 "github.com/vshn/appcat/v4/apis/vshn/v1"
"github.com/vshn/appcat/v4/pkg/comp-functions/runtime"
corev1 "k8s.io/api/core/v1"
)
// DelayClusterDeployment adds the dependencies on the sgcluster object, so that the provider-kubernetes doesn't loop anymore.
// The actual cluster object will only be deployed once the dependencies are deployed, synced and ready.
func DelayClusterDeployment(_ context.Context, svc *runtime.ServiceRuntime) *xfnproto.Result {
comp := &vshnv1.VSHNPostgreSQL{}
err := svc.GetObservedComposite(comp)
if err != nil {
return runtime.NewFatalResult(fmt.Errorf("Cannot get composite: %w", err))
}
clusterObject := &xkube.Object{}
err = svc.GetObservedComposedResource(clusterObject, "cluster")
if err == nil {
// We're done here, the sgcluster has been applied.
return nil
} else if err != runtime.ErrNotFound {
return runtime.NewFatalResult(fmt.Errorf("Cannot get cluster: %w", err))
}
desiredCluster := &stackgresv1.SGCluster{}
err = svc.GetDesiredKubeObject(desiredCluster, "cluster")
if err != nil {
return runtime.NewFatalResult(fmt.Errorf("cannot get desired cluster: %w", err))
}
svc.DeleteDesiredCompososedResource("cluster")
if !kubeObjectSyncedAndReady("profile", svc) {
return runtime.NewWarningResult("sgProfile is not yet ready, skipping creation of cluster")
}
if !kubeObjectSyncedAndReady("sg-backup", svc) {
return runtime.NewWarningResult("SGObjectStorage is not yet ready, skipping creation of cluster")
}
if !kubeObjectSyncedAndReady("pg-conf", svc) {
return runtime.NewWarningResult("SGPostgresConfig is not yet ready, skipping creation of cluster")
}
err = svc.SetDesiredKubeObjectWithName(desiredCluster, comp.GetName()+"-cluster", "cluster")
if err != nil {
return runtime.NewFatalResult(fmt.Errorf("Cannot set SgCluster object: %w", err))
}
return nil
}
func kubeObjectSyncedAndReady(name string, svc *runtime.ServiceRuntime) bool {
obj := &xkube.Object{}
err := svc.GetObservedComposedResource(obj, name)
if err != nil {
return false
}
ready := obj.GetCondition(xpv1.TypeReady)
if ready.Status == corev1.ConditionFalse {
return false
}
synced := obj.GetCondition(xpv1.TypeSynced)
return synced.Status == corev1.ConditionTrue
}