@@ -2,10 +2,14 @@ package crd
2
2
3
3
import (
4
4
"fmt"
5
+ "k8s.io/apimachinery/pkg/runtime"
5
6
"strings"
6
7
7
8
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
8
9
"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"
9
13
)
10
14
11
15
// V1Beta1 refers to the deprecated v1beta1 APIVersion of CRD objects
@@ -39,3 +43,56 @@ func Version(manifest *string) (string, error) {
39
43
return v , nil
40
44
}
41
45
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