diff --git a/hack/generate-lib-resources.py b/hack/generate-lib-resources.py index 951ca000cc..2a45a2acdf 100755 --- a/hack/generate-lib-resources.py +++ b/hack/generate-lib-resources.py @@ -96,6 +96,7 @@ def generate_resourcebuilder(directory, types, clients, modifiers, health_checks imports = {} for import_name in [ 'github.com/openshift/cluster-version-operator/lib/resourceapply', + 'github.com/openshift/cluster-version-operator/lib/resourcedelete', 'github.com/openshift/cluster-version-operator/lib/resourceread', 'github.com/openshift/library-go/pkg/manifest', 'k8s.io/client-go/rest', @@ -176,6 +177,8 @@ def generate_resourcebuilder(directory, types, clients, modifiers, health_checks '', 'func (b *builder) Do(ctx context.Context) error {', '\tobj := resourceread.ReadOrDie(b.raw)', + '\tupdatingMode := b.mode == UpdatingMode', + '\treconcilingMode := b.mode == ReconcilingMode', '', '\tswitch typedObject := obj.(type) {' ]) @@ -195,23 +198,42 @@ def generate_resourcebuilder(directory, types, clients, modifiers, health_checks '\t\tif b.modifier != nil {', '\t\t\tb.modifier(typedObject)', '\t\t}', + '\t\tif deleteReq, err := resourcedelete.Delete{}{}(ctx, b.{}, typedObject,'.format(type_name, version, client_prop_name), + '\t\t\tupdatingMode); err != nil {', + '\t\t\treturn err', + '\t\t} else if !deleteReq {', ]) + type_key = (package, type_name) modifier = modifiers.get(type_key) if modifier: lines.extend([ - '\t\tif err := {}(ctx, typedObject); err != nil {{'.format(modifier), - '\t\t\treturn err', - '\t\t}', + '\t\t\tif err := {}(ctx, typedObject); err != nil {{'.format(modifier), + '\t\t\t\treturn err', + '\t\t\t}', ]) + + health_check = health_checks.get(type_key) + actual = '_' + if health_check: + actual = 'actual' + lines.extend([ - '\t\tif _, _, err := resourceapply.Apply{}{}(ctx, b.{}, typedObject); err != nil {{'.format(type_name, version, client_prop_name), - '\t\t\treturn err', - '\t\t}', + '\t\t\tif {}, _, err := resourceapply.Apply{}{}(ctx, b.{}, typedObject, reconcilingMode); err != nil {{'.format(actual, type_name, version, client_prop_name), + '\t\t\t\treturn err', ]) - health_check = health_checks.get(type_key) + if health_check: - lines.append('\t\treturn {}(ctx, typedObject)'.format(health_check)) + lines.extend([ + '\t\t\t} else if actual != nil {', + '\t\t\t\treturn {}(ctx, actual)'.format(health_check), + ]) + + lines.extend([ + '\t\t\t}', + '\t\t}', + ]) + lines.extend([ '\tdefault:', @@ -284,9 +306,10 @@ def scheme_group_versions(types): } health_checks = { - ('k8s.io/api/apps/v1', 'Deployment'): 'b.checkDeploymentHealth', ('k8s.io/api/apps/v1', 'DaemonSet'): 'b.checkDaemonSetHealth', + ('k8s.io/api/apps/v1', 'Deployment'): 'b.checkDeploymentHealth', ('k8s.io/api/batch/v1', 'Job'): 'b.checkJobHealth', + ('k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1', 'CustomResourceDefinition'): 'b.checkCustomResourceDefinitionHealth', } generate_lib_resources(directory='lib', types=types, clients=clients, modifiers=modifiers, health_checks=health_checks) diff --git a/lib/resourcebuilder/apiext.go b/lib/resourcebuilder/apiext.go new file mode 100644 index 0000000000..cef543d159 --- /dev/null +++ b/lib/resourcebuilder/apiext.go @@ -0,0 +1,25 @@ +package resourcebuilder + +import ( + "context" + "fmt" + + apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" +) + +func (b *builder) checkCustomResourceDefinitionHealth(ctx context.Context, crd *apiextv1.CustomResourceDefinition) error { + if b.mode == InitializingMode { + return nil + } + + for _, condition := range crd.Status.Conditions { + if condition.Type == apiextv1.Established { + if condition.Status == apiextv1.ConditionTrue { + return nil + } + return fmt.Errorf("CustomResourceDefinition %s Established=%s, %s: %s", crd.Name, condition.Status, condition.Reason, condition.Message) + } + } + + return fmt.Errorf("CustomResourceDefinition %s does not declare an Established status condition: %v", crd.Name, crd.Status.Conditions) +} diff --git a/lib/resourcebuilder/resourcebuilder.go b/lib/resourcebuilder/resourcebuilder.go index f95e00e9a7..37b77753b0 100644 --- a/lib/resourcebuilder/resourcebuilder.go +++ b/lib/resourcebuilder/resourcebuilder.go @@ -114,10 +114,11 @@ func (b *builder) Do(ctx context.Context) error { if err := b.modifyDaemonSet(ctx, typedObject); err != nil { return err } - if _, _, err := resourceapply.ApplyDaemonSetv1(ctx, b.appsClientv1, typedObject, reconcilingMode); err != nil { + if actual, _, err := resourceapply.ApplyDaemonSetv1(ctx, b.appsClientv1, typedObject, reconcilingMode); err != nil { return err + } else if actual != nil { + return b.checkDaemonSetHealth(ctx, actual) } - return b.checkDaemonSetHealth(ctx, typedObject) } case *appsv1.Deployment: if b.modifier != nil { @@ -130,10 +131,11 @@ func (b *builder) Do(ctx context.Context) error { if err := b.modifyDeployment(ctx, typedObject); err != nil { return err } - if _, _, err := resourceapply.ApplyDeploymentv1(ctx, b.appsClientv1, typedObject, reconcilingMode); err != nil { + if actual, _, err := resourceapply.ApplyDeploymentv1(ctx, b.appsClientv1, typedObject, reconcilingMode); err != nil { return err + } else if actual != nil { + return b.checkDeploymentHealth(ctx, actual) } - return b.checkDeploymentHealth(ctx, typedObject) } case *batchv1.Job: if b.modifier != nil { @@ -143,10 +145,11 @@ func (b *builder) Do(ctx context.Context) error { updatingMode); err != nil { return err } else if !deleteReq { - if _, _, err := resourceapply.ApplyJobv1(ctx, b.batchClientv1, typedObject, reconcilingMode); err != nil { + if actual, _, err := resourceapply.ApplyJobv1(ctx, b.batchClientv1, typedObject, reconcilingMode); err != nil { return err + } else if actual != nil { + return b.checkJobHealth(ctx, actual) } - return b.checkJobHealth(ctx, typedObject) } case *corev1.ConfigMap: if b.modifier != nil { @@ -252,8 +255,10 @@ func (b *builder) Do(ctx context.Context) error { updatingMode); err != nil { return err } else if !deleteReq { - if _, _, err := resourceapply.ApplyCustomResourceDefinitionv1(ctx, b.apiextensionsClientv1, typedObject, reconcilingMode); err != nil { + if actual, _, err := resourceapply.ApplyCustomResourceDefinitionv1(ctx, b.apiextensionsClientv1, typedObject, reconcilingMode); err != nil { return err + } else if actual != nil { + return b.checkCustomResourceDefinitionHealth(ctx, actual) } } default: diff --git a/lib/resourcedelete/apireg.go b/lib/resourcedelete/apireg.go deleted file mode 100644 index b8675c0ca3..0000000000 --- a/lib/resourcedelete/apireg.go +++ /dev/null @@ -1,39 +0,0 @@ -package resourcedelete - -import ( - "context" - "fmt" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - apiregv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" - apiregclientv1 "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1" -) - -// DeleteAPIServicev1 checks the given resource for a valid delete annotation. If found -// it checks the status of a previousily issued delete request. If delete has not been -// requested and in UpdatingMode it will issue a delete request. -func DeleteAPIServicev1(ctx context.Context, client apiregclientv1.APIServicesGetter, required *apiregv1.APIService, - updateMode bool) (bool, error) { - - if delAnnoFound, err := ValidDeleteAnnotation(required.Annotations); !delAnnoFound || err != nil { - return delAnnoFound, err - } - existing, err := client.APIServices().Get(ctx, required.Name, metav1.GetOptions{}) - resource := Resource{ - Kind: "apiservice", - Namespace: "", - Name: required.Name, - } - if deleteRequested, err := GetDeleteProgress(resource, err); err == nil { - // Only request deletion when in update mode. - if !deleteRequested && updateMode { - if err := client.APIServices().Delete(ctx, required.Name, metav1.DeleteOptions{}); err != nil { - return true, fmt.Errorf("Delete request for %s failed, err=%v", resource, err) - } - SetDeleteRequested(existing, resource) - } - } else { - return true, fmt.Errorf("Error running delete for %s, err=%v", resource, err) - } - return true, nil -} diff --git a/lib/resourceread/resourceread.go b/lib/resourceread/resourceread.go index ab82503696..a31bf0d0d8 100644 --- a/lib/resourceread/resourceread.go +++ b/lib/resourceread/resourceread.go @@ -13,7 +13,6 @@ import ( apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/serializer" - apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" ) var ( @@ -26,9 +25,6 @@ func init() { if err := apiextensionsv1.AddToScheme(scheme); err != nil { panic(err) } - if err := apiregistrationv1.AddToScheme(scheme); err != nil { - panic(err) - } if err := appsv1.AddToScheme(scheme); err != nil { panic(err) } @@ -49,7 +45,6 @@ func init() { } decoder = codecs.UniversalDecoder( apiextensionsv1.SchemeGroupVersion, - apiregistrationv1.SchemeGroupVersion, appsv1.SchemeGroupVersion, batchv1.SchemeGroupVersion, corev1.SchemeGroupVersion,