Skip to content
This repository has been archived by the owner on Nov 9, 2022. It is now read-only.

Fix CRD health checks due to conversion errors #85

Merged
merged 1 commit into from
Nov 3, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions pkg/controller/managedresources/health/health_checker.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import (
appsv1 "k8s.io/api/apps/v1"
batchv1 "k8s.io/api/batch/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
"k8s.io/apimachinery/pkg/runtime"
)
Expand All @@ -28,9 +30,18 @@ import (
// `nil` is returned when the `runtime.Unstructured` has kind which is not supported by this function.
func CheckHealth(scheme *runtime.Scheme, obj runtime.Object) error {
switch obj.GetObjectKind().GroupVersionKind().GroupKind() {
case apiextensionsv1beta1.SchemeGroupVersion.WithKind("CustomResourceDefinition").GroupKind():
crd := &apiextensionsv1beta1.CustomResourceDefinition{}
if err := scheme.Convert(obj, crd, nil); err != nil {
case apiextensionsv1.SchemeGroupVersion.WithKind("CustomResourceDefinition").GroupKind():
crdObj := obj
if obj.GetObjectKind().GroupVersionKind().Version == apiextensionsv1beta1.SchemeGroupVersion.Version {
// Convert to internal version first if v1beta1 because converter cannot convert from external -> external version.
crd := &apiextensions.CustomResourceDefinition{}
if err := scheme.Convert(crdObj, crd, nil); err != nil {
return err
}
crdObj = crd
}
crd := &apiextensionsv1.CustomResourceDefinition{}
if err := scheme.Convert(crdObj, crd, nil); err != nil {
return err
}
return health.CheckCustomResourceDefinition(crd)
Expand Down
14 changes: 7 additions & 7 deletions pkg/health/health.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import (
appsv1 "k8s.io/api/apps/v1"
batchv1 "k8s.io/api/batch/v1"
corev1 "k8s.io/api/core/v1"
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
"k8s.io/apimachinery/pkg/util/intstr"
)

Expand Down Expand Up @@ -73,18 +73,18 @@ func CheckManagedResourceHealthy(mr *v1alpha1.ManagedResource) error {
}

var (
trueCrdConditionTypes = []apiextensionsv1beta1.CustomResourceDefinitionConditionType{
apiextensionsv1beta1.NamesAccepted, apiextensionsv1beta1.Established,
trueCrdConditionTypes = []apiextensionsv1.CustomResourceDefinitionConditionType{
apiextensionsv1.NamesAccepted, apiextensionsv1.Established,
}
falseOptionalCrdConditionTypes = []apiextensionsv1beta1.CustomResourceDefinitionConditionType{
apiextensionsv1beta1.Terminating,
falseOptionalCrdConditionTypes = []apiextensionsv1.CustomResourceDefinitionConditionType{
apiextensionsv1.Terminating,
}
)

// CheckCustomResourceDefinition checks whether the given CustomResourceDefinition is healthy.
// A CRD is considered healthy if its `NamesAccepted` and `Established` conditions are with status `True`
// and its `Terminating` condition is missing or has status `False`.
func CheckCustomResourceDefinition(crd *apiextensionsv1beta1.CustomResourceDefinition) error {
func CheckCustomResourceDefinition(crd *apiextensionsv1.CustomResourceDefinition) error {
for _, trueConditionType := range trueCrdConditionTypes {
conditionType := string(trueConditionType)
condition := getCustomResourceDefinitionCondition(crd.Status.Conditions, trueConditionType)
Expand Down Expand Up @@ -288,7 +288,7 @@ func daemonSetMaxUnavailable(daemonSet *appsv1.DaemonSet) int32 {
return int32(maxUnavailable)
}

func getCustomResourceDefinitionCondition(conditions []apiextensionsv1beta1.CustomResourceDefinitionCondition, conditionType apiextensionsv1beta1.CustomResourceDefinitionConditionType) *apiextensionsv1beta1.CustomResourceDefinitionCondition {
func getCustomResourceDefinitionCondition(conditions []apiextensionsv1.CustomResourceDefinitionCondition, conditionType apiextensionsv1.CustomResourceDefinitionConditionType) *apiextensionsv1.CustomResourceDefinitionCondition {
for _, condition := range conditions {
if condition.Type == conditionType {
return &condition
Expand Down
50 changes: 25 additions & 25 deletions pkg/health/health_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import (
"github.com/onsi/gomega/types"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"
)
Expand All @@ -39,52 +39,52 @@ func TestHealth(t *testing.T) {
var _ = Describe("health", func() {
Context("CheckCustomResourceDefinition", func() {
DescribeTable("crds",
func(crd *apiextensionsv1beta1.CustomResourceDefinition, matcher types.GomegaMatcher) {
func(crd *apiextensionsv1.CustomResourceDefinition, matcher types.GomegaMatcher) {
timebertt marked this conversation as resolved.
Show resolved Hide resolved
err := health.CheckCustomResourceDefinition(crd)
Expect(err).To(matcher)
},
Entry("terminating", &apiextensionsv1beta1.CustomResourceDefinition{
Status: apiextensionsv1beta1.CustomResourceDefinitionStatus{
Conditions: []apiextensionsv1beta1.CustomResourceDefinitionCondition{
Entry("terminating", &apiextensionsv1.CustomResourceDefinition{
Status: apiextensionsv1.CustomResourceDefinitionStatus{
Conditions: []apiextensionsv1.CustomResourceDefinitionCondition{
{
Type: apiextensionsv1beta1.NamesAccepted,
Status: apiextensionsv1beta1.ConditionTrue,
Type: apiextensionsv1.NamesAccepted,
Status: apiextensionsv1.ConditionTrue,
},
{
Type: apiextensionsv1beta1.Established,
Status: apiextensionsv1beta1.ConditionTrue,
Type: apiextensionsv1.Established,
Status: apiextensionsv1.ConditionTrue,
},
{
Type: apiextensionsv1beta1.Terminating,
Status: apiextensionsv1beta1.ConditionTrue,
Type: apiextensionsv1.Terminating,
Status: apiextensionsv1.ConditionTrue,
},
},
},
}, HaveOccurred()),
Entry("with conflicting name", &apiextensionsv1beta1.CustomResourceDefinition{
Status: apiextensionsv1beta1.CustomResourceDefinitionStatus{
Conditions: []apiextensionsv1beta1.CustomResourceDefinitionCondition{
Entry("with conflicting name", &apiextensionsv1.CustomResourceDefinition{
Status: apiextensionsv1.CustomResourceDefinitionStatus{
Conditions: []apiextensionsv1.CustomResourceDefinitionCondition{
{
Type: apiextensionsv1beta1.NamesAccepted,
Status: apiextensionsv1beta1.ConditionFalse,
Type: apiextensionsv1.NamesAccepted,
Status: apiextensionsv1.ConditionFalse,
},
{
Type: apiextensionsv1beta1.Established,
Status: apiextensionsv1beta1.ConditionFalse,
Type: apiextensionsv1.Established,
Status: apiextensionsv1.ConditionFalse,
},
},
},
}, HaveOccurred()),
Entry("healthy", &apiextensionsv1beta1.CustomResourceDefinition{
Status: apiextensionsv1beta1.CustomResourceDefinitionStatus{
Conditions: []apiextensionsv1beta1.CustomResourceDefinitionCondition{
Entry("healthy", &apiextensionsv1.CustomResourceDefinition{
Status: apiextensionsv1.CustomResourceDefinitionStatus{
Conditions: []apiextensionsv1.CustomResourceDefinitionCondition{
{
Type: apiextensionsv1beta1.NamesAccepted,
Status: apiextensionsv1beta1.ConditionTrue,
Type: apiextensionsv1.NamesAccepted,
Status: apiextensionsv1.ConditionTrue,
},
{
Type: apiextensionsv1beta1.Established,
Status: apiextensionsv1beta1.ConditionTrue,
Type: apiextensionsv1.Established,
Status: apiextensionsv1.ConditionTrue,
},
},
},
Expand Down