Skip to content

Commit

Permalink
Update resource deprecation/removal warnings (#1162)
Browse files Browse the repository at this point in the history
  • Loading branch information
lblackstone committed Jun 12, 2020
1 parent 71a610a commit 5b13dd3
Show file tree
Hide file tree
Showing 5 changed files with 155 additions and 90 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
## HEAD (Unreleased)

### Improvements

- Update resource deprecation/removal warnings. (https://github.com/pulumi/pulumi-kubernetes/pull/1162)

### Bug Fixes

- Fix regression in TypeScript YAML SDK (https://github.com/pulumi/pulumi-kubernetes/pull/1157)
Expand Down
18 changes: 18 additions & 0 deletions provider/pkg/gen/kinds/kinds.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@

package kinds

import (
"strings"

"k8s.io/apimachinery/pkg/runtime/schema"
)

// Kind maps to the name of a Kubernetes resource Kind.
type Kind string

Expand Down Expand Up @@ -100,3 +106,15 @@ const (
{{.GVConstName}} groupVersion = "{{.}}"
{{- end}}
)

// toGVK is a helper function that converts the internal groupVersion and Kind types to a schema.GroupVersionKind
func toGVK(gv groupVersion, kind Kind) schema.GroupVersionKind {
parts := strings.Split(string(gv), "/")
g, v := parts[0], parts[1]

return schema.GroupVersionKind{
Group: g,
Version: v,
Kind: string(kind),
}
}
42 changes: 32 additions & 10 deletions provider/pkg/kinds/deprecated.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,19 @@ import (
// apiextensions/v1beta1/CustomResourceDefinition / 1.16 / 1.19
// https://git.k8s.io/kubernetes/CHANGELOG/CHANGELOG-1.16.md#deprecations-and-removals
//
// rbac/v1alpha1/* / 1.17 / 1.20
// rbac/v1beta1/* / 1.17 / 1.20
// rbac/v1alpha1/* / 1.17 / 1.22
// rbac/v1beta1/* / 1.17 / 1.22
// https://git.k8s.io/kubernetes/CHANGELOG/CHANGELOG-1.17.md#deprecations-and-removals
//
// apiextensions/v1beta1/* / 1.19 / _
// apiregistration/v1beta1/* / 1.19 / _
// authentication/v1beta1/* / 1.19 / 1.22
// authorization/v1beta1/* / 1.19 / 1.22
// autoscaling/v2beta1/* / 1.19 / _
// coordination/v1beta1/* / 1.19 / 1.22
// storage/v1beta1/* / 1.19 / _
// https://git.k8s.io/kubernetes/CHANGELOG/CHANGELOG-1.19.md#deprecation-1
//
// TODO: Keep updating this list on every release.

func gvkStr(gvk schema.GroupVersionKind) string {
Expand All @@ -78,14 +87,20 @@ func RemovedInVersion(gvk schema.GroupVersionKind) *cluster.ServerVersion {
removedIn = cluster.ServerVersion{Major: 1, Minor: 19}
case ApiextensionsV1B1:
removedIn = cluster.ServerVersion{Major: 1, Minor: 19}
case AuthenticationV1B1:
removedIn = cluster.ServerVersion{Major: 1, Minor: 22}
case AuthorizationV1B1:
removedIn = cluster.ServerVersion{Major: 1, Minor: 22}
case CoordinationV1B1:
removedIn = cluster.ServerVersion{Major: 1, Minor: 22}
case ExtensionsV1B1, AppsV1B1, AppsV1B2:
if k == Ingress {
removedIn = cluster.ServerVersion{Major: 1, Minor: 20}
} else {
removedIn = cluster.ServerVersion{Major: 1, Minor: 16}
}
case RbacV1A1, RbacV1B1:
removedIn = cluster.ServerVersion{Major: 1, Minor: 20}
removedIn = cluster.ServerVersion{Major: 1, Minor: 22}
case SchedulingV1A1, SchedulingV1B1:
removedIn = cluster.ServerVersion{Major: 1, Minor: 17}
default:
Expand Down Expand Up @@ -114,10 +129,22 @@ func SuggestedAPIVersion(gvk schema.GroupVersionKind) string {
gvkFmt := `%s/%s`

switch gv {
case AdmissionregistrationV1B1:
return fmt.Sprintf(gvkFmt, AdmissionregistrationV1, k)
case ApiextensionsV1B1:
return fmt.Sprintf(gvkFmt, ApiextensionsV1, k)
case ApiregistrationV1B1:
return fmt.Sprintf(gvkFmt, ApiregistrationV1, k)
case AppsV1B1, AppsV1B2:
return fmt.Sprintf(gvkFmt, AppsV1, k)
case AuthenticationV1B1:
return fmt.Sprintf(gvkFmt, AuthenticationV1, k)
case AuthorizationV1B1:
return fmt.Sprintf(gvkFmt, AuthorizationV1, k)
case AutoscalingV2B1:
return fmt.Sprintf(gvkFmt, AutoscalingV1, k)
case CoordinationV1B1:
return fmt.Sprintf(gvkFmt, CoordinationV1, k)
case ExtensionsV1B1:
switch k {
case DaemonSet, Deployment, ReplicaSet:
Expand All @@ -135,13 +162,8 @@ func SuggestedAPIVersion(gvk schema.GroupVersionKind) string {
return fmt.Sprintf(gvkFmt, RbacV1, k)
case SchedulingV1A1, SchedulingV1B1:
return fmt.Sprintf(gvkFmt, SchedulingV1, k)
case StorageV1B1, "storage/v1beta1": // The storage group was renamed to storage.k8s.io, so check for both.
switch k {
case CSINode:
return fmt.Sprintf(gvkFmt, StorageV1, k)
default:
return gvkStr(gvk)
}
case StorageV1A1, StorageV1B1, "storage/v1alpha1", "storage/v1beta1": // The storage group was renamed to storage.k8s.io, so check for both.
return fmt.Sprintf(gvkFmt, StorageV1, k)
default:
return gvkStr(gvk)
}
Expand Down
163 changes: 83 additions & 80 deletions provider/pkg/kinds/deprecated_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,41 @@ func TestDeprecatedApiVersion(t *testing.T) {
gvk GroupVersionKind
want bool
}{
{GroupVersionKind{Group: "apps", Version: "v1", Kind: "Deployment"}, false},
{GroupVersionKind{Group: "apps", Version: "v1beta1", Kind: "Deployment"}, true},
{GroupVersionKind{Group: "apps", Version: "v1beta2", Kind: "Deployment"}, true},
{GroupVersionKind{Group: "extensions", Version: "v1beta1", Kind: "DaemonSet"}, true},
{GroupVersionKind{Group: "extensions", Version: "v1beta1", Kind: "Deployment"}, true},
{GroupVersionKind{Group: "extensions", Version: "v1beta1", Kind: "Ingress"}, true},
{GroupVersionKind{Group: "extensions", Version: "v1beta1", Kind: "NetworkPolicy"}, true},
{GroupVersionKind{Group: "extensions", Version: "v1beta1", Kind: "PodSecurityPolicy"}, true},
{GroupVersionKind{Group: "extensions", Version: "v1beta1", Kind: "ReplicaSet"}, true},
{GroupVersionKind{Group: "rbac.authorization.k8s.io", Version: "v1alpha1", Kind: "ClusterRole"}, true},
{GroupVersionKind{Group: "rbac.authorization.k8s.io", Version: "v1beta1", Kind: "ClusterRole"}, true},
{toGVK(AdmissionregistrationV1B1, MutatingWebhookConfiguration), true},
{toGVK(AdmissionregistrationV1B1, ValidatingWebhookConfiguration), true},
{toGVK(ApiextensionsV1B1, CustomResourceDefinition), true},
{toGVK(ApiregistrationV1B1, APIService), true},
{toGVK(AppsV1, Deployment), false},
{toGVK(AppsV1B1, Deployment), true},
{toGVK(AppsV1B2, Deployment), true},
{toGVK(AuthenticationV1B1, TokenReview), true},
{toGVK(AuthorizationV1B1, LocalSubjectAccessReview), true},
{toGVK(AuthorizationV1B1, SelfSubjectAccessReview), true},
{toGVK(AuthorizationV1B1, SelfSubjectRulesReview), true},
{toGVK(AuthorizationV1B1, SubjectAccessReview), true},
{toGVK(AutoscalingV2B1, HorizontalPodAutoscaler), true},
{toGVK(CoordinationV1B1, Lease), true},
{toGVK(ExtensionsV1B1, DaemonSet), true},
{toGVK(ExtensionsV1B1, Deployment), true},
{toGVK(ExtensionsV1B1, Ingress), true},
{toGVK(ExtensionsV1B1, NetworkPolicy), true},
{toGVK(ExtensionsV1B1, PodSecurityPolicy), true},
{toGVK(ExtensionsV1B1, ReplicaSet), true},
{toGVK(RbacV1A1, ClusterRole), true},
{toGVK(RbacV1A1, ClusterRoleBinding), true},
{toGVK(RbacV1A1, Role), true},
{toGVK(RbacV1A1, RoleBinding), true},
{toGVK(RbacV1B1, ClusterRole), true},
{toGVK(RbacV1B1, ClusterRoleBinding), true},
{toGVK(RbacV1B1, Role), true},
{toGVK(RbacV1B1, RoleBinding), true},
{toGVK(SchedulingV1A1, PriorityClass), true},
{toGVK(SchedulingV1B1, PriorityClass), true},
{toGVK(StorageV1A1, VolumeAttachment), true},
{toGVK(StorageV1B1, CSIDriver), true},
{toGVK(StorageV1B1, CSINode), true},
{toGVK(StorageV1B1, StorageClass), true},
{toGVK(StorageV1B1, VolumeAttachment), true},
}
for _, tt := range tests {
t.Run(tt.gvk.String(), func(t *testing.T) {
Expand All @@ -49,56 +73,44 @@ func TestDeprecatedApiVersion(t *testing.T) {
}

func TestSuggestedApiVersion(t *testing.T) {
wantStr := func(gv groupVersion, kind Kind) string {
return gvkStr(toGVK(gv, kind))
}

tests := []struct {
gvk GroupVersionKind
want string
}{
// Deprecated ApiVersions return the suggested version string.
{
GroupVersionKind{Group: "apps", Version: "v1beta1", Kind: "Deployment"},
"apps/v1/Deployment",
},
{
GroupVersionKind{Group: "apps", Version: "v1beta2", Kind: "Deployment"},
"apps/v1/Deployment",
},
{
GroupVersionKind{Group: "extensions", Version: "v1beta1", Kind: "Deployment"},
"apps/v1/Deployment",
},
{
GroupVersionKind{Group: "extensions", Version: "v1beta1", Kind: "Ingress"},
"networking.k8s.io/v1beta1/Ingress",
},
{
GroupVersionKind{Group: "extensions", Version: "v1beta1", Kind: "NetworkPolicy"},
"networking.k8s.io/v1/NetworkPolicy",
},
{
GroupVersionKind{Group: "extensions", Version: "v1beta1", Kind: "PodSecurityPolicy"},
"policy/v1beta1/PodSecurityPolicy",
},
{
GroupVersionKind{Group: "rbac.authorization.k8s.io", Version: "v1alpha1", Kind: "ClusterRole"},
"rbac.authorization.k8s.io/v1/ClusterRole",
},
{
GroupVersionKind{Group: "rbac.authorization.k8s.io", Version: "v1beta1", Kind: "ClusterRole"},
"rbac.authorization.k8s.io/v1/ClusterRole",
},
{
GroupVersionKind{Group: "scheduling.k8s.io", Version: "v1beta1", Kind: "PriorityClass"},
"scheduling.k8s.io/v1/PriorityClass",
},
{
GroupVersionKind{Group: "scheduling.k8s.io", Version: "v1alpha1", Kind: "PriorityClass"},
"scheduling.k8s.io/v1/PriorityClass",
},
{toGVK(AdmissionregistrationV1B1, MutatingWebhookConfiguration), wantStr(AdmissionregistrationV1, MutatingWebhookConfiguration)},
{toGVK(AdmissionregistrationV1B1, ValidatingWebhookConfiguration), wantStr(AdmissionregistrationV1, ValidatingWebhookConfiguration)},
{toGVK(ApiextensionsV1B1, CustomResourceDefinition), wantStr(ApiextensionsV1, CustomResourceDefinition)},
{toGVK(ApiregistrationV1B1, APIService), wantStr(ApiregistrationV1, APIService)},
{toGVK(AppsV1B1, Deployment), wantStr(AppsV1, Deployment)},
{toGVK(AppsV1B2, Deployment), wantStr(AppsV1, Deployment)},
{toGVK(AuthenticationV1B1, TokenReview), wantStr(AuthenticationV1, TokenReview)},
{toGVK(AuthorizationV1B1, LocalSubjectAccessReview), wantStr(AuthorizationV1, LocalSubjectAccessReview)},
{toGVK(AutoscalingV2B1, HorizontalPodAutoscaler), wantStr(AutoscalingV1, HorizontalPodAutoscaler)},
{toGVK(CoordinationV1B1, Lease), wantStr(CoordinationV1, Lease)},
{toGVK(ExtensionsV1B1, DaemonSet), wantStr(AppsV1, DaemonSet)},
{toGVK(ExtensionsV1B1, Deployment), wantStr(AppsV1, Deployment)},
{toGVK(ExtensionsV1B1, Ingress), wantStr(NetworkingV1B1, Ingress)},
{toGVK(ExtensionsV1B1, NetworkPolicy), wantStr(NetworkingV1, NetworkPolicy)},
{toGVK(ExtensionsV1B1, PodSecurityPolicy), wantStr(PolicyV1B1, PodSecurityPolicy)},
{toGVK(ExtensionsV1B1, ReplicaSet), wantStr(AppsV1, ReplicaSet)},
{toGVK(RbacV1A1, ClusterRole), wantStr(RbacV1, ClusterRole)},
{toGVK(RbacV1A1, ClusterRoleBinding), wantStr(RbacV1, ClusterRoleBinding)},
{toGVK(RbacV1B1, ClusterRole), wantStr(RbacV1, ClusterRole)},
{toGVK(RbacV1B1, ClusterRoleBinding), wantStr(RbacV1, ClusterRoleBinding)},
{toGVK(SchedulingV1A1, PriorityClass), wantStr(SchedulingV1, PriorityClass)},
{toGVK(SchedulingV1B1, PriorityClass), wantStr(SchedulingV1, PriorityClass)},
{toGVK(StorageV1A1, VolumeAttachment), wantStr(StorageV1, VolumeAttachment)},
{toGVK(StorageV1B1, CSIDriver), wantStr(StorageV1, CSIDriver)},
{toGVK(StorageV1B1, CSINode), wantStr(StorageV1, CSINode)},
{toGVK(StorageV1B1, StorageClass), wantStr(StorageV1, StorageClass)},
{toGVK(StorageV1B1, VolumeAttachment), wantStr(StorageV1, VolumeAttachment)},
// Current ApiVersions return the same version string.
{
GroupVersionKind{Group: "apps", Version: "v1", Kind: "Deployment"},
"apps/v1/Deployment",
},
{toGVK(AppsV1, Deployment), wantStr(AppsV1, Deployment)},
}
for _, tt := range tests {
t.Run(tt.gvk.String(), func(t *testing.T) {
Expand All @@ -110,36 +122,27 @@ func TestSuggestedApiVersion(t *testing.T) {
}

func TestRemovedInVersion(t *testing.T) {
type args struct {
gvk GroupVersionKind
}
tests := []struct {
name string
args args
gvk GroupVersionKind
wantVersion *cluster.ServerVersion
}{
{"extensions/v1beta1:Deployment", args{
GroupVersionKind{Group: "extensions", Version: "v1beta1", Kind: "Deployment"},
}, &cluster.ServerVersion{Major: 1, Minor: 16}},
{"extensions/v1beta1:Ingress", args{
GroupVersionKind{Group: "extensions", Version: "v1beta1", Kind: "Ingress"},
}, &cluster.ServerVersion{Major: 1, Minor: 20}},
{"rbac.authorization.k8s.io/v1beta1:ClusterRole", args{
GroupVersionKind{Group: "rbac.authorization.k8s.io", Version: "v1beta1", Kind: "ClusterRole"},
}, &cluster.ServerVersion{Major: 1, Minor: 20}},
{"rbac.authorization.k8s.io/v1alpha1:ClusterRole", args{
GroupVersionKind{Group: "rbac.authorization.k8s.io", Version: "v1alpha1", Kind: "ClusterRole"},
}, &cluster.ServerVersion{Major: 1, Minor: 20}},
{"scheduling.k8s.io/v1beta1:PriorityClass", args{
GroupVersionKind{Group: "scheduling.k8s.io", Version: "v1beta1", Kind: "PriorityClass"},
}, &cluster.ServerVersion{Major: 1, Minor: 17}},
{"scheduling.k8s.io/v1alpha1:PriorityClass", args{
GroupVersionKind{Group: "scheduling.k8s.io", Version: "v1alpha1", Kind: "PriorityClass"},
}, &cluster.ServerVersion{Major: 1, Minor: 17}},
{toGVK(AdmissionregistrationV1B1, MutatingWebhookConfiguration), &cluster.ServerVersion{Major: 1, Minor: 19}},
{toGVK(ApiextensionsV1B1, CustomResourceDefinition), &cluster.ServerVersion{Major: 1, Minor: 19}},
{toGVK(AppsV1B1, Deployment), &cluster.ServerVersion{Major: 1, Minor: 16}},
{toGVK(AppsV1B2, Deployment), &cluster.ServerVersion{Major: 1, Minor: 16}},
{toGVK(AuthenticationV1B1, TokenReview), &cluster.ServerVersion{Major: 1, Minor: 22}},
{toGVK(AuthorizationV1B1, LocalSubjectAccessReview), &cluster.ServerVersion{Major: 1, Minor: 22}},
{toGVK(CoordinationV1B1, Lease), &cluster.ServerVersion{Major: 1, Minor: 22}},
{toGVK(ExtensionsV1B1, Deployment), &cluster.ServerVersion{Major: 1, Minor: 16}},
{toGVK(ExtensionsV1B1, Ingress), &cluster.ServerVersion{Major: 1, Minor: 20}},
{toGVK(RbacV1A1, ClusterRole), &cluster.ServerVersion{Major: 1, Minor: 22}},
{toGVK(RbacV1B1, ClusterRole), &cluster.ServerVersion{Major: 1, Minor: 22}},
{toGVK(SchedulingV1A1, PriorityClass), &cluster.ServerVersion{Major: 1, Minor: 17}},
{toGVK(SchedulingV1B1, PriorityClass), &cluster.ServerVersion{Major: 1, Minor: 17}},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := RemovedInVersion(tt.args.gvk)
t.Run(tt.gvk.String(), func(t *testing.T) {
got := RemovedInVersion(tt.gvk)
if !reflect.DeepEqual(got, tt.wantVersion) {
t.Errorf("RemovedInVersion() got = %v, want %v", got, tt.wantVersion)
}
Expand Down
18 changes: 18 additions & 0 deletions provider/pkg/kinds/kinds.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@

package kinds

import (
"strings"

"k8s.io/apimachinery/pkg/runtime/schema"
)

// Kind maps to the name of a Kubernetes resource Kind.
type Kind string

Expand Down Expand Up @@ -196,3 +202,15 @@ const (
StorageV1A1 groupVersion = "storage.k8s.io/v1alpha1"
StorageV1B1 groupVersion = "storage.k8s.io/v1beta1"
)

// toGVK is a helper function that converts the internal groupVersion and Kind types to a schema.GroupVersionKind
func toGVK(gv groupVersion, kind Kind) schema.GroupVersionKind {
parts := strings.Split(string(gv), "/")
g, v := parts[0], parts[1]

return schema.GroupVersionKind{
Group: g,
Version: v,
Kind: string(kind),
}
}

0 comments on commit 5b13dd3

Please sign in to comment.