Skip to content

Commit

Permalink
UPSTREAM: <carry>: generate deprecated api to removed release map
Browse files Browse the repository at this point in the history
  • Loading branch information
sanchezl committed Apr 16, 2021
1 parent 8576252 commit 1b922a5
Show file tree
Hide file tree
Showing 4 changed files with 311 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -1,20 +1,10 @@
package deprecatedapirequest

import "k8s.io/apimachinery/pkg/runtime/schema"
//go:generate go run ./deprecated_generator.go

var deprecatedApiRemovedRelease = map[schema.GroupVersionResource]string{
{Group: "flowcontrol.apiserver.k8s.io", Version: "v1alpha1", Resource: "flowschemas"}: "1.21",
{Group: "flowcontrol.apiserver.k8s.io", Version: "v1alpha1", Resource: "prioritylevelconfigurations"}: "1.21",
{Group: "extensions", Version: "v1beta1", Resource: "ingresses"}: "1.22",
{Group: "admissionregistration.k8s.io", Version: "v1beta1", Resource: "validatingwebhookconfigurations"}: "1.22",
{Group: "apiextensions.k8s.io", Version: "v1beta1", Resource: "customresourcedefinitions"}: "1.22",
{Group: "admissionregistration.k8s.io", Version: "v1beta1", Resource: "mutatingwebhookconfigurations"}: "1.22",
{Group: "certificates.k8s.io", Version: "v1beta1", Resource: "certificatesigningrequests"}: "1.22",
{Group: "networking.k8s.io", Version: "v1beta1", Resource: "ingresses"}: "1.22",
{Group: "rbac.authorization.k8s.io", Version: "v1beta1", Resource: "clusterrolebindings"}: "1.22",
{Group: "rbac.authorization.k8s.io", Version: "v1beta1", Resource: "rolebindings"}: "1.22",
{Group: "rbac.authorization.k8s.io", Version: "v1beta1", Resource: "roles"}: "1.22",
}
import (
"k8s.io/apimachinery/pkg/runtime/schema"
)

// removedRelease of a specified resource.version.group.
func removedRelease(resource schema.GroupVersionResource) string {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
// +build ignore

package main

import (
"bytes"
"fmt"
"go/format"
"html/template"
"os"
"sort"
"strings"

openshiftapi "github.com/openshift/api"
apiextentions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/klog/v2"
flowcontrol "k8s.io/kubernetes/pkg/apis/flowcontrol/install"
netowrking "k8s.io/kubernetes/pkg/apis/networking/install"
)

func main() {
t, err := template.New("").Parse(`// Code generated by go generate; DO NOT EDIT.
package deprecatedapirequest
import "k8s.io/apimachinery/pkg/runtime/schema"
var deprecatedApiRemovedRelease = map[schema.GroupVersionResource]string{
{{- range . }}
{Group: "{{ printf "%s" .Group }}", Version: "{{ printf "%s" .Version }}", Resource: "{{ printf "%s" .Resource }}"}: "{{ .RemovedRelease }}",
{{- end }}
}
`)
if err != nil {
klog.Error(err)
os.Exit(1)
}

// install types
scheme := runtime.NewScheme()
openshiftapi.Install(scheme)
openshiftapi.InstallKube(scheme)
apiextentions.Install(scheme)
flowcontrol.Install(scheme)
netowrking.Install(scheme)

var data DeprecatedAPIInfos

// find types with APILifecycleRemoved() methods
for gvk, _ := range scheme.AllKnownTypes() {
obj, err := scheme.New(gvk)
if err != nil {
klog.Error(err)
os.Exit(1)
}
deprecatedObj, ok := obj.(interface{ APILifecycleRemoved() (int, int) })
if !ok {
continue
}
major, minor := deprecatedObj.APILifecycleRemoved()
gvr := gvkToGVR(gvk)
data = append(data, DeprecatedAPIInfo{
Group: gvr.Group,
Version: gvr.Version,
Resource: gvr.Resource,
RemovedRelease: fmt.Sprintf("%d.%d", major, minor),
})
}

// generate into buffer
sort.Sort(data)
buf := new(bytes.Buffer)
err = t.Execute(buf, data)
if err != nil {
klog.Error(err)
os.Exit(1)
}

// apply gofmt
fmt, err := format.Source(buf.Bytes())
if err != nil {
klog.Error(err)
os.Exit(1)
}

// write output file
f, err := os.Create("deprecated_map.go")
if err != nil {
klog.Errorf("Error creating output file: %s", err)
}
defer f.Close()
f.Write(fmt)
}

func gvkToGVR(kind schema.GroupVersionKind) schema.GroupVersionResource {
// TODO do this properly
gvr := schema.GroupVersionResource{
Group: kind.Group,
Version: kind.Version,
Resource: strings.ToLower(kind.Kind),
}
switch {
case gvr.Resource == "ingress":
gvr.Resource = "ingresses"
case !strings.HasSuffix(gvr.Resource, "list"):
gvr.Resource = gvr.Resource + "s"
}
return gvr
}

type DeprecatedAPIInfo struct {
Group string
Version string
Resource string
RemovedRelease string
}

type DeprecatedAPIInfos []DeprecatedAPIInfo

func (a DeprecatedAPIInfos) Len() int { return len(a) }
func (a DeprecatedAPIInfos) Less(i, j int) bool {
switch {
case a[i].Group != a[j].Group:
return a[i].Group < a[j].Group
case a[i].Version != a[j].Version:
return a[i].Version < a[j].Version
}
return a[i].Resource < a[j].Resource
}
func (a DeprecatedAPIInfos) Swap(i, j int) { a[i], a[j] = a[j], a[i] }

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package deprecatedapirequest

import (
"fmt"
"strings"
"testing"

openshiftapi "github.com/openshift/api"
"github.com/stretchr/testify/assert"
apiextentions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
flowcontrol "k8s.io/kubernetes/pkg/apis/flowcontrol/install"
netowrking "k8s.io/kubernetes/pkg/apis/networking/install"
)

func TestDeprecatedAPIRemovedRelease(t *testing.T) {

// utiltiy function
gvkToGVR := func(kind schema.GroupVersionKind) schema.GroupVersionResource {
// TODO do this properly
gvr := schema.GroupVersionResource{
Group: kind.Group,
Version: kind.Version,
Resource: strings.ToLower(kind.Kind),
}
switch {
case gvr.Resource == "ingress":
gvr.Resource = "ingresses"
case !strings.HasSuffix(gvr.Resource, "list"):
gvr.Resource = gvr.Resource + "s"
}
return gvr
}

// install types
scheme := runtime.NewScheme()
openshiftapi.Install(scheme)
openshiftapi.InstallKube(scheme)
apiextentions.Install(scheme)
flowcontrol.Install(scheme)
netowrking.Install(scheme)

// copy the deprecatedApiRemovedRelease map
copyOfMap := map[schema.GroupVersionResource]string{}
for k, v := range deprecatedApiRemovedRelease {
copyOfMap[k] = v
}

for gvk, _ := range scheme.AllKnownTypes() {
obj, err := scheme.New(gvk)
assert.NoError(t, err)
deprecatedObj, ok := obj.(interface{ APILifecycleRemoved() (int, int) })
if !ok {
continue
}
// asset map contains expected entry
gvr := gvkToGVR(gvk)
assert.Contains(t, copyOfMap, gvr)
major, minor := deprecatedObj.APILifecycleRemoved()
assert.Equal(t, fmt.Sprintf("%d.%d", major, minor), copyOfMap[gvr])
delete(copyOfMap, gvr)
}

// assert map didn't have any extra entries
assert.Empty(t, copyOfMap)

if t.Failed() {
t.Log("NOTE: run `go generate ./openshift-kube-apiserver/...` to re-generate deprecated_map.go")
}

}

0 comments on commit 1b922a5

Please sign in to comment.