-
Notifications
You must be signed in to change notification settings - Fork 113
/
deprecated.go
172 lines (154 loc) · 6.08 KB
/
deprecated.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
// Copyright 2016-2019, Pulumi Corporation.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package kinds
import (
"fmt"
"github.com/pulumi/pulumi-kubernetes/provider/v2/pkg/cluster"
"k8s.io/apimachinery/pkg/runtime/schema"
)
//
// Reference links:
//
// GVK / Deprecated Version / Removed Version
// Upstream Docs Link
// -----------------------------------------------------------
// extensions/v1beta1/DaemonSet / 1.14 / 1.16
// apps/v1beta1/DaemonSet / 1.14 / 1.16
// apps/v1beta2/DaemonSet / 1.14 / 1.16
// extensions/v1beta1/Deployment / 1.14 / 1.16
// apps/v1beta1/Deployment / 1.14 / 1.16
// apps/v1beta2/Deployment / 1.14 / 1.16
// extensions/v1beta1/NetworkPolicy / 1.14 / 1.16
// extensions/v1beta1/PodSecurityPolicy / 1.14 / 1.16
// extensions/v1beta1/ReplicaSet / 1.14 / 1.16
// apps/v1beta1/ReplicaSet / 1.14 / 1.16
// apps/v1beta2/ReplicaSet / 1.14 / 1.16
// https://git.k8s.io/kubernetes/CHANGELOG-1.14.md#deprecations
//
// scheduling/v1alpha1/PriorityClass / 1.14 / 1.17
// scheduling/v1beta1/PriorityClass / 1.14 / 1.17
// https://git.k8s.io/kubernetes/CHANGELOG-1.14.md#deprecations
//
// extensions/v1beta1/Ingress / 1.14 / 1.18
// https://git.k8s.io/kubernetes/CHANGELOG-1.14.md#deprecations
//
// rbac/v1alpha1/* / 1.17 / 1.20
// rbac/v1beta1/* / 1.17 / 1.20
// https://git.k8s.io/kubernetes/CHANGELOG-1.17.md#deprecations-and-removals
func gvkStr(gvk schema.GroupVersionKind) string {
return gvk.GroupVersion().String() + "/" + gvk.Kind
}
// DeprecatedAPIVersion returns true if the given GVK is deprecated in the most recent k8s release.
func DeprecatedAPIVersion(gvk schema.GroupVersionKind) bool {
return SuggestedAPIVersion(gvk) != gvkStr(gvk)
}
// RemovedInVersion returns the ServerVersion of k8s that a GVK is removed in. The return value is
// nil if the GVK is not scheduled for removal.
func RemovedInVersion(gvk schema.GroupVersionKind) *cluster.ServerVersion {
var removedIn cluster.ServerVersion
switch gvk.GroupVersion() {
case schema.GroupVersion{Group: "extensions", Version: "v1beta1"},
schema.GroupVersion{Group: "apps", Version: "v1beta1"},
schema.GroupVersion{Group: "apps", Version: "v1beta2"}:
if gvk.Kind == "Ingress" {
removedIn = cluster.ServerVersion{Major: 1, Minor: 20}
} else {
removedIn = cluster.ServerVersion{Major: 1, Minor: 16}
}
case schema.GroupVersion{Group: "rbac", Version: "v1beta1"},
schema.GroupVersion{Group: "rbac", Version: "v1alpha1"}:
removedIn = cluster.ServerVersion{Major: 1, Minor: 20}
case schema.GroupVersion{Group: "scheduling", Version: "v1beta1"},
schema.GroupVersion{Group: "scheduling", Version: "v1alpha1"}:
removedIn = cluster.ServerVersion{Major: 1, Minor: 17}
default:
return nil
}
return &removedIn
}
// RemovedAPIVersion returns true if the given GVK has been removed in the given k8s version, and the corresponding
// ServerVersion where the GVK was removed.
func RemovedAPIVersion(gvk schema.GroupVersionKind, version cluster.ServerVersion) (bool, *cluster.ServerVersion) {
removedIn := RemovedInVersion(gvk)
if removedIn == nil {
return false, nil
}
return version.Compare(*removedIn) >= 0, removedIn
}
// SuggestedAPIVersion returns a string with the suggested apiVersion for a given GVK.
// This is used to provide useful warning messages when a user creates a resource using a deprecated GVK.
func SuggestedAPIVersion(gvk schema.GroupVersionKind) string {
switch gvk.GroupVersion() {
case schema.GroupVersion{Group: "apps", Version: "v1beta1"},
schema.GroupVersion{Group: "apps", Version: "v1beta2"}:
return "apps/v1/" + gvk.Kind
case schema.GroupVersion{Group: "extensions", Version: "v1beta1"}:
switch Kind(gvk.Kind) {
case DaemonSet, Deployment, ReplicaSet:
return "apps/v1/" + gvk.Kind
case Ingress:
return "networking/v1beta1/" + gvk.Kind
case NetworkPolicy:
return "networking/v1/" + gvk.Kind
case PodSecurityPolicy:
return "policy/v1beta1/" + gvk.Kind
default:
return gvkStr(gvk)
}
case schema.GroupVersion{Group: "rbac", Version: "v1beta1"},
schema.GroupVersion{Group: "rbac", Version: "v1alpha1"}:
return "rbac/v1/" + gvk.Kind
case schema.GroupVersion{Group: "scheduling", Version: "v1beta1"},
schema.GroupVersion{Group: "scheduling", Version: "v1alpha1"}:
return "scheduling/v1/" + gvk.Kind
case schema.GroupVersion{Group: "storage", Version: "v1beta1"}:
switch Kind(gvk.Kind) {
case CSINode:
return "storage/v1/" + gvk.Kind
default:
return gvkStr(gvk)
}
default:
return gvkStr(gvk)
}
}
// upstreamDocsLink returns a link to information about apiVersion deprecations for the given k8s version.
func upstreamDocsLink(version cluster.ServerVersion) string {
switch version {
case cluster.ServerVersion{Major: 1, Minor: 16}:
return "https://git.k8s.io/kubernetes/CHANGELOG/CHANGELOG-1.16.md#deprecations-and-removals"
case cluster.ServerVersion{Major: 1, Minor: 17}:
return "https://git.k8s.io/kubernetes/CHANGELOG/CHANGELOG-1.17.md#deprecations-and-removals"
default:
return ""
}
}
// RemovedAPIError is returned if the provided GVK does not exist in the targeted k8s cluster because the apiVersion
// has been deprecated and removed.
type RemovedAPIError struct {
GVK schema.GroupVersionKind
Version *cluster.ServerVersion
}
func (e *RemovedAPIError) Error() string {
if e.Version == nil {
return fmt.Sprintf("apiVersion %q was removed in a previous version of Kubernetes", gvkStr(e.GVK))
}
link := upstreamDocsLink(*e.Version)
str := fmt.Sprintf("apiVersion %q was removed in Kubernetes %s. Use %q instead.",
gvkStr(e.GVK), e.Version, SuggestedAPIVersion(e.GVK))
if len(link) > 0 {
str += fmt.Sprintf("\nSee %s for more information.", link)
}
return str
}