Skip to content

Commit 44c7083

Browse files
authored
Merge pull request #255 from s-diez/feat/wait-for-statefulset
Feat/wait for statefulset
2 parents 2333640 + 2b9c32b commit 44c7083

File tree

17 files changed

+359
-136
lines changed

17 files changed

+359
-136
lines changed

docs/resources/resource.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ resource "kustomization_resource" "p0" {
6868
6969
# then loop through resources in ids_prio[1]
7070
# and set an explicit depends_on on kustomization_resource.p0
71-
# wait 2 minutes for any deployment or daemonset to become ready
71+
# wait 2 minutes for any deployment, statefulset or daemonset to become ready
7272
resource "kustomization_resource" "p1" {
7373
for_each = data.kustomization_build.test.ids_prio[1]
7474
@@ -105,5 +105,5 @@ resource "kustomization_resource" "p2" {
105105
## Argument Reference
106106

107107
- `manifest` - (Required) JSON encoded Kubernetes resource manifest.
108-
- `wait` - Whether to wait for pods to become ready (default false). Currently only has an effect for Deployments and DaemonSets.
108+
- `wait` - Whether to wait for pods to become ready (default false). Currently only has an effect for Deployments, StatefulSets and DaemonSets.
109109
- 'timeouts' - (Optional) Overwrite `create`, `update` or `delete` timeout defaults. Defaults are 5 minutes for `create` and `update` and 10 minutes for `delete`.

kustomize/manifest.go

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ import (
2323
)
2424

2525
var waitRefreshFunctions = map[string]waitRefreshFunction{
26-
"apps/Deployment": waitDeploymentRefresh,
27-
"apps/Daemonset": waitDaemonsetRefresh,
26+
"apps/Deployment": waitDeploymentRefresh,
27+
"apps/DaemonSet": waitDaemonsetRefresh,
28+
"apps/StatefulSet": waitStatefulSetRefresh,
2829
}
2930

3031
type kManifestId struct {
@@ -429,6 +430,38 @@ func waitDeploymentRefresh(km *kManifest) (interface{}, string, error) {
429430
return nil, "in progress", nil
430431
}
431432

433+
func statefulSetReady(u *k8sunstructured.Unstructured) (bool, error) {
434+
var statefulSet k8sappsv1.StatefulSet
435+
if err := k8sruntime.DefaultUnstructuredConverter.FromUnstructured(u.UnstructuredContent(), &statefulSet); err != nil {
436+
return false, err
437+
}
438+
if statefulSet.Generation == statefulSet.Status.ObservedGeneration &&
439+
statefulSet.Status.AvailableReplicas == *statefulSet.Spec.Replicas &&
440+
statefulSet.Status.AvailableReplicas == statefulSet.Status.Replicas {
441+
return true, nil
442+
} else {
443+
return false, nil
444+
}
445+
}
446+
447+
func waitStatefulSetRefresh(km *kManifest) (interface{}, string, error) {
448+
resp, err := km.apiGet(k8smetav1.GetOptions{})
449+
if err != nil {
450+
if k8serrors.IsNotFound(err) {
451+
return nil, "missing", nil
452+
}
453+
return nil, "error", err
454+
}
455+
ready, err := statefulSetReady(resp)
456+
if err != nil {
457+
return nil, "error", err
458+
}
459+
if ready {
460+
return resp, "done", nil
461+
}
462+
return nil, "in progress", nil
463+
}
464+
432465
func (km *kManifest) waitCreatedOrUpdated(t time.Duration) error {
433466
gvk := km.gvk()
434467
if refresh, ok := waitRefreshFunctions[fmt.Sprintf("%s/%s", gvk.Group, gvk.Kind)]; ok {

0 commit comments

Comments
 (0)