Merge "kartongips: paper over^W^Wfix CRD updates"
diff --git a/cluster/kube/lib/rook.libsonnet b/cluster/kube/lib/rook.libsonnet
index 5810384..e9ed75b 100644
--- a/cluster/kube/lib/rook.libsonnet
+++ b/cluster/kube/lib/rook.libsonnet
@@ -27,10 +27,7 @@
policyInsecure: policies.AllowNamespaceInsecure(cfg.namespace),
crds: {
- # BUG: cannot control this because of:
- # ERROR Error updating customresourcedefinitions cephclusters.ceph.rook.io: expected kind, but got map
- # TODO(q3k): debug and fix kubecfg (it's _not_ just https://github.com/bitnami/kubecfg/issues/259 )
- cephclusters:: kube.CustomResourceDefinition("ceph.rook.io", "v1", "CephCluster") {
+ cephclusters: kube.CustomResourceDefinition("ceph.rook.io", "v1", "CephCluster") {
spec+: {
additionalPrinterColumns: [
{ name: "DataDirHostPath", type: "string", description: "Directory used on the K8s nodes", JSONPath: ".spec.dataDirHostPath" },
diff --git a/cluster/tools/kartongips/pkg/kubecfg/update.go b/cluster/tools/kartongips/pkg/kubecfg/update.go
index 928104b..d035c2e 100644
--- a/cluster/tools/kartongips/pkg/kubecfg/update.go
+++ b/cluster/tools/kartongips/pkg/kubecfg/update.go
@@ -102,11 +102,11 @@
tmp := unstructured.Unstructured{}
err := utils.CompactDecodeObject(data, &tmp)
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("CompactDecodeObject original object: %w", err)
}
origData, err = tmp.MarshalJSON()
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("MarshalJSON original object: %w", err)
}
}
@@ -116,7 +116,7 @@
utils.DeleteMetaDataAnnotation(new, AnnotationOrigObject)
data, err := utils.CompactEncodeObject(new)
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("CompactEncodeObject: %w", err)
}
utils.SetMetaDataAnnotation(new, AnnotationOrigObject, data)
@@ -124,41 +124,59 @@
newData, err := new.MarshalJSON()
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("MarshalJSON new: %w", err)
}
existingData, err := existing.MarshalJSON()
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("MarshalJSON new: %w", err)
}
- var resData []byte
- if schema == nil {
- // No schema information - fallback to JSON merge patch
+ schemaless := func() ([]byte, error) {
patch, err := jsonmergepatch.CreateThreeWayJSONMergePatch(origData, newData, existingData)
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("CreateThreeWayJSONMergePatch (schemaless): %w", err)
}
- resData, err = jsonpatch.MergePatch(existingData, patch)
+ resData, err := jsonpatch.MergePatch(existingData, patch)
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("MergePatch (schemaless): %w", err)
}
- } else {
+ return resData, nil
+ }
+ schemaful := func() ([]byte, error) {
patchMeta := strategicpatch.NewPatchMetaFromOpenAPI(schema)
patch, err := strategicpatch.CreateThreeWayMergePatch(origData, newData, existingData, patchMeta, true)
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("CreateThreeWayMergePatch (schemaful): %w", err)
}
- resData, err = strategicpatch.StrategicMergePatchUsingLookupPatchMeta(existingData, patch, patchMeta)
+ resData, err := strategicpatch.StrategicMergePatchUsingLookupPatchMeta(existingData, patch, patchMeta)
+ if err != nil {
+ return nil, fmt.Errorf("StrategicMergePatch (schemaful): %w", err)
+ }
+ return resData, nil
+ }
+
+ var resData []byte
+ if schema == nil {
+ resData, err = schemaless()
if err != nil {
return nil, err
}
+ } else {
+ resData, err = schemaful()
+ if err != nil {
+ log.Warningf("Schemaful/Three-way merge failed (%v), attempting schemaless/JSON merge...", err)
+ resData, err = schemaless()
+ if err != nil {
+ return nil, err
+ }
+ }
}
result, _, err := unstructured.UnstructuredJSONScheme.Decode(resData, nil, nil)
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("Decode: %w", err)
}
return result.(*unstructured.Unstructured), nil
@@ -171,7 +189,7 @@
data, err := utils.CompactEncodeObject(obj)
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("CompactEncodeObject: %w", err)
}
utils.SetMetaDataAnnotation(obj, AnnotationOrigObject, data)
@@ -183,12 +201,12 @@
return newobj, err
}
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("Get: %w", err)
}
mergedObj, err := patch(existing, obj, schema)
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("patch: %w", err)
}
// Kubernetes is a bit odd when/how it reports
@@ -207,7 +225,7 @@
log.Debug("About to make change: ", diff.ObjectDiff(existing, mergedObj))
log.Info("Updating ", desc, dryRunText)
if dryRun {
- return mergedObj, nil
+ return mergedObj, fmt.Errorf("ObjectDiff: %v", nil)
}
newobj, err := rc.Update(ctx, mergedObj, metav1.UpdateOptions{})
log.Debugf("Update(%s) returned (%v, %v)", mergedObj.GetName(), newobj, err)