@@ -76,9 +76,70 @@ func StoredVersions(obj runtime.Object) []string {
76
76
return nil
77
77
}
78
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 ) {
79
+ // RunStorageMigration determines whether the new CRD changes the storage version of the existing CRD.
80
+ // If true, OLM must run a migration process to ensure all CRs can be stored at the new version.
81
+ // See https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definition-versioning/#upgrade-existing-objects-to-a-new-stored-version
82
+ func RunStorageMigration (oldCRD runtime.Object , newCRD runtime.Object ) bool {
83
+ newStoredVersion := make (map [string ]struct {})
84
+ switch crd := newCRD .(type ) {
85
+ case * apiextensionsv1.CustomResourceDefinition :
86
+ for _ , version := range crd .Spec .Versions {
87
+ if version .Storage {
88
+ newStoredVersion [version .Name ] = struct {}{}
89
+ }
90
+ }
91
+ case * apiextensionsv1beta1.CustomResourceDefinition :
92
+ for _ , version := range crd .Spec .Versions {
93
+ if version .Storage {
94
+ newStoredVersion [version .Name ] = struct {}{}
95
+ }
96
+ }
97
+ }
98
+
99
+ // find old storage versions by inspect the status field of the existing on-cluster CRD
100
+ oldStoredVersions := make (map [string ]struct {})
101
+ switch crd := oldCRD .(type ) {
102
+ case * apiextensionsv1.CustomResourceDefinition :
103
+ for _ , version := range crd .Status .StoredVersions {
104
+ oldStoredVersions [version ] = struct {}{}
105
+ }
106
+ case * apiextensionsv1beta1.CustomResourceDefinition :
107
+ for _ , version := range crd .Status .StoredVersions {
108
+ oldStoredVersions [version ] = struct {}{}
109
+ }
110
+ }
111
+
112
+ for name := range oldStoredVersions {
113
+ if _ , ok := newStoredVersion [name ]; ok {
114
+ // new storage version exists in old CRD present on the cluster
115
+ // no need to run migration
116
+ return false
117
+ }
118
+ }
119
+ return true
120
+ }
121
+
122
+ func GetNewStorageVersion (crd runtime.Object ) string {
123
+ switch crd := crd .(type ) {
124
+ case * apiextensionsv1.CustomResourceDefinition :
125
+ for _ , version := range crd .Spec .Versions {
126
+ if version .Storage {
127
+ return version .Name
128
+ }
129
+ }
130
+ case * apiextensionsv1beta1.CustomResourceDefinition :
131
+ for _ , version := range crd .Spec .Versions {
132
+ if version .Storage {
133
+ return version .Name
134
+ }
135
+ }
136
+ }
137
+ return ""
138
+ }
139
+
140
+ // DeprecatedStorageVersions returns all the versions that are in the old CRD but no longer in the new CRD.
141
+ // These versions should be removed after the storage upgrade procedure.
142
+ func DeprecatedStorageVersions (oldCRD runtime.Object , newCRD runtime.Object ) ([]string , error ) {
82
143
var newStoredVersions []string
83
144
84
145
newCRDVersions , err := ResourceVersions (newCRD )
@@ -93,6 +154,9 @@ func NewStoredVersions(oldCRD runtime.Object, newCRD runtime.Object) ([]string,
93
154
}
94
155
}
95
156
96
- return newStoredVersions , nil
157
+ var deprecatedVersions []string
158
+
159
+
160
+ return deprecatedVersions , nil
97
161
}
98
162
0 commit comments