Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

⚠️ update deps to use k8s 1.22 #2340

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,18 @@ go 1.16

require (
github.com/cloudflare/cfssl v1.5.0 // for `kubebuilder alpha config-gen`
github.com/gobuffalo/flect v0.2.2
github.com/gobuffalo/flect v0.2.3
github.com/joelanford/go-apidiff v0.1.0
github.com/onsi/ginkgo v1.16.4
github.com/onsi/gomega v1.13.0
github.com/spf13/afero v1.2.2
github.com/spf13/cobra v1.1.3
github.com/onsi/gomega v1.15.0
github.com/sirupsen/logrus v1.8.1
github.com/spf13/afero v1.6.0
github.com/spf13/cobra v1.2.1
github.com/spf13/pflag v1.0.5
golang.org/x/tools v0.1.2
k8s.io/apimachinery v0.21.2 // for `kubebuilder alpha config-gen`
sigs.k8s.io/controller-runtime v0.9.2
sigs.k8s.io/controller-tools v0.6.0 // for `kubebuilder alpha config-gen`
golang.org/x/tools v0.1.5
k8s.io/apimachinery v0.22.2 // for `kubebuilder alpha config-gen`
sigs.k8s.io/controller-runtime v0.10.0
Copy link
Member

@varshaprasad96 varshaprasad96 Sep 21, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not a blocker at all, but since the PR is still open we could do 0.10.1 of controller-runtime too as it has k8s bumped to 1.22.2

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes. I think we can -)

sigs.k8s.io/controller-tools v0.7.0 // for `kubebuilder alpha config-gen`
sigs.k8s.io/kustomize/kyaml v0.10.21 // for `kubebuilder alpha config-gen`
sigs.k8s.io/yaml v1.2.0
)
376 changes: 278 additions & 98 deletions go.sum

Large diffs are not rendered by default.

3 changes: 1 addition & 2 deletions pkg/cli/alpha/config-gen/controller-gen-filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,7 @@ func (cgr ControllerGenFilter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error
// generate CRD definitions
desclen := 40
crdGen := genall.Generator(crd.Generator{
TrivialVersions: true,
MaxDescLen: &desclen,
MaxDescLen: &desclen,
})
gens = append(gens, &crdGen)

Expand Down
5 changes: 4 additions & 1 deletion pkg/model/resource/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,13 @@ import (
"github.com/gobuffalo/flect"
)

const V1beta1 = "v1beta1"
const V1 = "v1"

// validateAPIVersion validates CRD or Webhook versions
func validateAPIVersion(version string) error {
switch version {
case "v1beta1", "v1":
case V1beta1, V1:
return nil
default:
return fmt.Errorf("API version must be one of: v1beta1, v1")
Expand Down
81 changes: 76 additions & 5 deletions test/e2e/utils/util.go → pkg/plugin/util/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,18 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

package utils
package util

import (
"bufio"
"bytes"
"crypto/rand"
"errors"
"fmt"
"io/ioutil"
"math/big"
"os"
"regexp"
"strings"
)

Expand Down Expand Up @@ -61,6 +65,8 @@ func GetNonEmptyLines(output string) []string {

// InsertCode searches target content in the file and insert `toInsert` after the target.
func InsertCode(filename, target, code string) error {
// false positive
// nolint:gosec
contents, err := ioutil.ReadFile(filename)
if err != nil {
return err
Expand All @@ -75,6 +81,8 @@ func InsertCode(filename, target, code string) error {
// UncommentCode searches for target in the file and remove the comment prefix
// of the target content. The target content may span multiple lines.
func UncommentCode(filename, target, prefix string) error {
// false positive
// nolint:gosec
content, err := ioutil.ReadFile(filename)
if err != nil {
return err
Expand All @@ -83,7 +91,7 @@ func UncommentCode(filename, target, prefix string) error {

idx := strings.Index(strContent, target)
if idx < 0 {
return nil
return fmt.Errorf("unable to find the code %s to be uncomment", target)
}

out := new(bytes.Buffer)
Expand All @@ -92,12 +100,22 @@ func UncommentCode(filename, target, prefix string) error {
return err
}

strs := strings.Split(target, "\n")
for _, str := range strs {
_, err := out.WriteString(strings.TrimPrefix(str, prefix) + "\n")
scanner := bufio.NewScanner(bytes.NewBufferString(target))
if !scanner.Scan() {
return nil
}
for {
_, err := out.WriteString(strings.TrimPrefix(scanner.Text(), prefix))
if err != nil {
return err
}
// Avoid writing a newline in case the previous line was the last in target.
if !scanner.Scan() {
break
}
if _, err := out.WriteString("\n"); err != nil {
return err
}
}

_, err = out.Write(content[idx+len(target):])
Expand All @@ -111,6 +129,8 @@ func UncommentCode(filename, target, prefix string) error {

// ImplementWebhooks will mock an webhook data
func ImplementWebhooks(filename string) error {
// false positive
// nolint:gosec
bs, err := ioutil.ReadFile(filename)
if err != nil {
return err
Expand Down Expand Up @@ -168,3 +188,54 @@ func EnsureExistAndReplace(input, match, replace string) (string, error) {
}
return strings.Replace(input, match, replace, -1), nil
}

// ReplaceInFile replaces all instances of old with new in the file at path.
func ReplaceInFile(path, old, new string) error {
info, err := os.Stat(path)
if err != nil {
return err
}
// false positive
// nolint:gosec
b, err := ioutil.ReadFile(path)
if err != nil {
return err
}
if !strings.Contains(string(b), old) {
return errors.New("unable to find the content to be replaced")
}
s := strings.Replace(string(b), old, new, -1)
err = ioutil.WriteFile(path, []byte(s), info.Mode())
if err != nil {
return err
}
return nil
}

// ReplaceRegexInFile finds all strings that match `match` and replaces them
// with `replace` in the file at path.
func ReplaceRegexInFile(path, match, replace string) error {
matcher, err := regexp.Compile(match)
if err != nil {
return err
}
info, err := os.Stat(path)
if err != nil {
return err
}
// false positive
// nolint:gosec
b, err := ioutil.ReadFile(path)
if err != nil {
return err
}
s := matcher.ReplaceAllString(string(b), replace)
if s == string(b) {
return errors.New("unable to find the content to be replaced")
}
err = ioutil.WriteFile(path, []byte(s), info.Mode())
if err != nil {
return err
}
return nil
}
14 changes: 14 additions & 0 deletions pkg/plugins/golang/v3/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,10 @@ func (p *createAPISubcommand) BindFlags(fs *pflag.FlagSet) {
fs.BoolVar(&p.options.DoController, "controller", true,
"if set, generate the controller without prompting the user")
p.controllerFlag = fs.Lookup("controller")

// (not required raise an error in this case)
// nolint:errcheck,gosec
fs.MarkDeprecated("crd-version", deprecateMsg)
}

func (p *createAPISubcommand) InjectConfig(c config.Config) error {
Expand Down Expand Up @@ -182,6 +186,16 @@ func (p *createAPISubcommand) Scaffold(fs machinery.Filesystem) error {
}

func (p *createAPISubcommand) PostScaffold() error {

// Update the makefile to allow generate Webhooks to ensure backwards compatibility
// todo: it should be removed for go/v4
// nolint:lll,gosec
if p.resource.API.CRDVersion == "v1beta1" {
if err := applyScaffoldCustomizationsForVbeta1(); err != nil {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

would we still be supporting this in go/v3 ? Since we are scaffolding the project with k8s 1.22, should we be removing support for v1beta1 APIs completely ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To ensure backwards compatibility:

  • If the flags crd-version or webhook-version be informed with v1beta1 the makefile and go.mod are updated, and the user informed
  • Marke as deprecates the flags crd-version or webhook-version since we probably will remove it in future versions.

We cannot remove the option for go/v3. That would be a breaking change and we will allow to do that only when we create go/v4.

return err
}
}

err := util.RunCmd("Update dependencies", "go", "mod", "tidy")
if err != nil {
return err
Expand Down
121 changes: 121 additions & 0 deletions pkg/plugins/golang/v3/commons.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
/*
Copyright 2021 The Kubernetes Authors.

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 v3

import (
"fmt"
"io/ioutil"
"path/filepath"
"strings"

log "github.com/sirupsen/logrus"

"sigs.k8s.io/kubebuilder/v3/pkg/plugin/util"
"sigs.k8s.io/kubebuilder/v3/pkg/plugins/golang/v3/scaffolds"
)

const deprecateMsg = "The v1beta1 API version for CRDs and Webhooks are deprecated and are no longer supported since " +
"the Kubernetes release 1.22. This flag no longer required to exist in future releases. Also, we would like to " +
"recommend you no longer use these API versions." +
"More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22"

// Update the makefile to allow generate CRDs/Webhooks with v1beta1 to ensure backwards compatibility
// nolint:lll,gosec
func applyScaffoldCustomizationsForVbeta1() error {
makefilePath := filepath.Join("Makefile")
bs, err := ioutil.ReadFile(makefilePath)
if err != nil {
return err
}
if !strings.Contains(string(bs), "CRD_OPTIONS") {

log.Warn("The v1beta1 API version for CRDs and Webhooks are deprecated and are no longer supported " +
"since the Kubernetes release 1.22. In order to help you out use these versions" +
"we will need to try to update the Makefile and go.mod files of this project. Please," +
"ensure that these changes were done accordingly with your customizations.\n" +
"Also, we would like to recommend you no longer use these API versions." +
"More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22")

const makefileTarget = `$(CONTROLLER_GEN) rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases`
const makefileTargetForV1beta1 = `$(CONTROLLER_GEN) $(CRD_OPTIONS) rbac:roleName=manager-role webhook paths="./..." output:crd:artifacts:config=config/crd/bases`

if err := util.ReplaceInFile("Makefile", makefileTarget, makefileTargetForV1beta1); err != nil {
fmt.Printf("unable to update the makefile to allow the usage of v1beta1: %s", err)
}

const makegentarget = `
manifests: controller-gen`
const makegenV1beta1Options = `# Produce CRDs that work back to Kubernetes 1.11 (no version conversion)
CRD_OPTIONS ?= "crd:crdVersions={v1beta1},trivialVersions=true,preserveUnknownFields=false"
manifests: controller-gen`

if err := util.ReplaceInFile("Makefile", makegentarget, makegenV1beta1Options); err != nil {
log.Warnf("unable to update the Makefile with %s: %s", makegenV1beta1Options, err)
}

// latest version of controller-tools where v1beta1 is supported
const controllerToolsVersionForVBeta1 = "v0.6.2"
if err := util.ReplaceInFile("Makefile",
fmt.Sprintf("controller-gen@%s",
scaffolds.ControllerToolsVersion),
fmt.Sprintf("controller-gen@%s",
controllerToolsVersionForVBeta1)); err != nil {
log.Warnf("unable to update the Makefile with %s: %s", fmt.Sprintf("controller-gen@%s",
controllerToolsVersionForVBeta1), err)
}

if err := util.ReplaceInFile("Makefile",
"ENVTEST_K8S_VERSION = 1.22",
"ENVTEST_K8S_VERSION = 1.21"); err != nil {
log.Warnf("unable to update the Makefile with %s: %s", "ENVTEST_K8S_VERSION = 1.21", err)
}

// latest version of controller-runtime where v1beta1 is supported
const controllerRuntimeVersionForVBeta1 = "v0.9.2"

if err := util.ReplaceInFile("go.mod",
fmt.Sprintf("sigs.k8s.io/controller-runtime %s", scaffolds.ControllerRuntimeVersion),
fmt.Sprintf("sigs.k8s.io/controller-runtime %s", controllerRuntimeVersionForVBeta1)); err != nil {
log.Warnf("unable to update the go.mod with sigs.k8s.io/controller-runtime %s: %s",
controllerRuntimeVersionForVBeta1, err)
}

if err := util.ReplaceInFile("go.mod",
"k8s.io/api v0.22.1",
"k8s.io/api v0.21.2"); err != nil {
log.Warnf("unable to update the go.mod with k8s.io/api v0.21.2: %s", err)
}

if err := util.ReplaceInFile("go.mod",
"k8s.io/apimachinery v0.22.1",
"k8s.io/apimachinery v0.21.2"); err != nil {
log.Warnf("unable to update the go.mod with k8s.io/apimachinery v0.21.2: %s", err)
}

if err := util.ReplaceInFile("go.mod",
"k8s.io/apimachinery v0.22.1",
"k8s.io/apimachinery v0.21.2"); err != nil {
log.Warnf("unable to update the go.mod with k8s.io/apimachinery v0.21.2: %s", err)
}

err = util.RunCmd("Update dependencies", "go", "mod", "tidy")
if err != nil {
return err
}
}
return nil
}
8 changes: 5 additions & 3 deletions pkg/plugins/golang/v3/scaffolds/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ import (

const (
// ControllerRuntimeVersion is the kubernetes-sigs/controller-runtime version to be used in the project
ControllerRuntimeVersion = "v0.9.2"
ControllerRuntimeVersion = "v0.10.0"
// ControllerToolsVersion is the kubernetes-sigs/controller-tools version to be used in the project
ControllerToolsVersion = "v0.6.1"
ControllerToolsVersion = "v0.7.0"
// KustomizeVersion is the kubernetes-sigs/kustomize version to be used in the project
KustomizeVersion = "v3.8.7"

Expand Down Expand Up @@ -99,7 +99,9 @@ func (s *initScaffolder) Scaffold() error {

return scaffold.Execute(
&templates.Main{},
&templates.GoMod{ControllerRuntimeVersion: ControllerRuntimeVersion},
&templates.GoMod{
ControllerRuntimeVersion: ControllerRuntimeVersion,
},
&templates.GitIgnore{},
&templates.Makefile{
Image: imageName,
Expand Down
Loading