Skip to content

Commit 52bbbb7

Browse files
author
Jim Minter
committed
WIP
1 parent ff7a7aa commit 52bbbb7

File tree

3 files changed

+281
-45
lines changed

3 files changed

+281
-45
lines changed

pkg/template/apis/template/helpers.go

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"errors"
55
"fmt"
66

7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
78
"k8s.io/apimachinery/pkg/runtime"
89
"k8s.io/apimachinery/pkg/runtime/schema"
910
kapi "k8s.io/kubernetes/pkg/api"
@@ -47,16 +48,42 @@ func AddObjectsToTemplate(template *Template, objects []runtime.Object, targetVe
4748
return nil
4849
}
4950

50-
// FilterTemplateInstanceCondition returns a new []TemplateInstanceCondition,
51-
// ensuring that it does not contain conditions of condType.
52-
func FilterTemplateInstanceCondition(conditions []TemplateInstanceCondition, condType TemplateInstanceConditionType) []TemplateInstanceCondition {
53-
newConditions := make([]TemplateInstanceCondition, 0, len(conditions)+1)
51+
func (templateInstance *TemplateInstance) DeleteCondition(typ TemplateInstanceConditionType) {
52+
newConditions := make([]TemplateInstanceCondition, 0, len(templateInstance.Status.Conditions))
5453

55-
for _, c := range conditions {
56-
if c.Type != condType {
54+
for _, c := range templateInstance.Status.Conditions {
55+
if c.Type != typ {
5756
newConditions = append(newConditions, c)
5857
}
5958
}
6059

61-
return newConditions
60+
templateInstance.Status.Conditions = newConditions
61+
}
62+
63+
func (templateInstance *TemplateInstance) HasCondition(typ TemplateInstanceConditionType, status kapi.ConditionStatus) bool {
64+
for _, c := range templateInstance.Status.Conditions {
65+
if c.Type == typ && c.Status == status {
66+
return true
67+
}
68+
}
69+
return false
70+
}
71+
72+
func (templateInstance *TemplateInstance) SetCondition(condition TemplateInstanceCondition) {
73+
condition.LastTransitionTime = metav1.Now()
74+
75+
for i, c := range templateInstance.Status.Conditions {
76+
if c.Type == condition.Type {
77+
if c.Message == condition.Message &&
78+
c.Reason == condition.Reason &&
79+
c.Status == condition.Status {
80+
return
81+
}
82+
83+
templateInstance.Status.Conditions[i] = condition
84+
return
85+
}
86+
}
87+
88+
templateInstance.Status.Conditions = append(templateInstance.Status.Conditions, condition)
6289
}

pkg/template/controller/readiness.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package controller
2+
3+
import (
4+
"k8s.io/apimachinery/pkg/runtime"
5+
"k8s.io/apimachinery/pkg/runtime/schema"
6+
kapi "k8s.io/kubernetes/pkg/api"
7+
"k8s.io/kubernetes/pkg/apis/apps"
8+
"k8s.io/kubernetes/pkg/apis/batch"
9+
"k8s.io/kubernetes/pkg/apis/extensions"
10+
deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
11+
12+
deployapi "github.com/openshift/origin/pkg/deploy/apis/apps"
13+
)
14+
15+
func checkDeploymentReadiness(obj runtime.Object) (bool, bool) {
16+
d := obj.(*extensions.Deployment)
17+
18+
var progressing, available *extensions.DeploymentCondition
19+
for i, condition := range d.Status.Conditions {
20+
switch condition.Type {
21+
case extensions.DeploymentProgressing:
22+
progressing = &d.Status.Conditions[i]
23+
24+
case extensions.DeploymentAvailable:
25+
available = &d.Status.Conditions[i]
26+
}
27+
}
28+
29+
ready := progressing != nil &&
30+
progressing.Status == kapi.ConditionTrue &&
31+
progressing.Reason == deploymentutil.NewRSAvailableReason &&
32+
available != nil &&
33+
available.Status == kapi.ConditionTrue
34+
35+
failed := progressing != nil && progressing.Status == kapi.ConditionFalse
36+
37+
return ready, failed
38+
}
39+
40+
func checkDeploymentConfigReadiness(obj runtime.Object) (bool, bool) {
41+
dc := obj.(*deployapi.DeploymentConfig)
42+
43+
var progressing, available *deployapi.DeploymentCondition
44+
for i, condition := range dc.Status.Conditions {
45+
switch condition.Type {
46+
case deployapi.DeploymentProgressing:
47+
progressing = &dc.Status.Conditions[i]
48+
49+
case deployapi.DeploymentAvailable:
50+
available = &dc.Status.Conditions[i]
51+
}
52+
}
53+
54+
ready := progressing != nil &&
55+
progressing.Status == kapi.ConditionTrue &&
56+
progressing.Reason == deployapi.NewRcAvailableReason &&
57+
available != nil &&
58+
available.Status == kapi.ConditionTrue
59+
60+
failed := progressing != nil && progressing.Status == kapi.ConditionFalse
61+
62+
return ready, failed
63+
}
64+
65+
func checkStatefulSetReadiness(obj runtime.Object) (bool, bool) {
66+
ss := obj.(*apps.StatefulSet)
67+
68+
ready := ss.Status.ReadyReplicas == ss.Spec.Replicas
69+
failed := false
70+
71+
return ready, failed
72+
}
73+
74+
func checkJobReadiness(obj runtime.Object) (bool, bool) {
75+
job := obj.(*batch.Job)
76+
77+
ready := job.Status.CompletionTime != nil
78+
failed := job.Status.Failed > 0
79+
80+
return ready, failed
81+
}
82+
83+
var readinessCheckers = map[schema.GroupKind]func(runtime.Object) (bool, bool){
84+
apps.Kind("Deployment"): checkDeploymentReadiness,
85+
extensions.Kind("Deployment"): checkDeploymentReadiness,
86+
deployapi.LegacyKind("DeploymentConfig"): checkDeploymentConfigReadiness,
87+
deployapi.Kind("DeploymentConfig"): checkDeploymentConfigReadiness,
88+
batch.Kind("Job"): checkJobReadiness,
89+
apps.Kind("StatefulSet"): checkStatefulSetReadiness,
90+
}
91+
92+
func canCheckReadiness(ref kapi.ObjectReference) bool {
93+
_, found := readinessCheckers[ref.GroupVersionKind().GroupKind()]
94+
return found
95+
}
96+
97+
func checkReadiness(ref kapi.ObjectReference, obj runtime.Object) (bool, bool) {
98+
return readinessCheckers[ref.GroupVersionKind().GroupKind()](obj)
99+
}

0 commit comments

Comments
 (0)