Skip to content

Commit 77be93f

Browse files
committed
feat: add utility functions to determine resource and storage versions
1 parent a947685 commit 77be93f

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

pkg/lib/crd/version.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@ package crd
22

33
import (
44
"fmt"
5+
"k8s.io/apimachinery/pkg/runtime"
56
"strings"
67

78
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
89
"k8s.io/apimachinery/pkg/util/yaml"
10+
11+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
12+
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
913
)
1014

1115
// V1Beta1 refers to the deprecated v1beta1 APIVersion of CRD objects
@@ -39,3 +43,56 @@ func Version(manifest *string) (string, error) {
3943
return v, nil
4044
}
4145

46+
// Versions returns all resource versions present in the CRD. Compatible with both v1beta1 and v1 CRDs.
47+
func ResourceVersions(obj runtime.Object) (map[string]struct{}, error) {
48+
versions := make(map[string]struct{})
49+
50+
switch crd := obj.(type) {
51+
case *apiextensionsv1.CustomResourceDefinition:
52+
for _, version := range crd.Spec.Versions {
53+
versions[version.Name] = struct{}{}
54+
}
55+
return versions, nil
56+
case *apiextensionsv1beta1.CustomResourceDefinition:
57+
for _, version := range crd.Spec.Versions {
58+
versions[version.Name] = struct{}{}
59+
}
60+
if crd.Spec.Version != "" {
61+
versions[crd.Spec.Version] = struct{}{}
62+
}
63+
return versions, nil
64+
default:
65+
return nil, fmt.Errorf("could not find all versions present in CRD")
66+
}
67+
}
68+
69+
func StoredVersions(obj runtime.Object) []string {
70+
switch crd := obj.(type) {
71+
case *apiextensionsv1.CustomResourceDefinition:
72+
return crd.Status.StoredVersions
73+
case *apiextensionsv1beta1.CustomResourceDefinition:
74+
return crd.Status.StoredVersions
75+
}
76+
return nil
77+
}
78+
79+
// NewStoredVersions returns all the versions that are stored in both the new and old CRD.
80+
// If some versions are no longer stored in the new CRD then OLM must migrate existing CRs at the old storage version.
81+
func NewStoredVersions(oldCRD runtime.Object, newCRD runtime.Object) ([]string, error) {
82+
var newStoredVersions []string
83+
84+
newCRDVersions, err := ResourceVersions(newCRD)
85+
if err != nil {
86+
return nil, err
87+
}
88+
89+
for _, v := range StoredVersions(oldCRD) {
90+
_, ok := newCRDVersions[v]
91+
if ok {
92+
newStoredVersions = append(newStoredVersions, v)
93+
}
94+
}
95+
96+
return newStoredVersions, nil
97+
}
98+

0 commit comments

Comments
 (0)