Files
kustomize/cmd/depprobcheck
Sebastiaan van Stijn 2867f353c2 downgrade go-difflib and go-spew to tagged releases (#5830)
* workspace sync

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

* downgrade go-difflib and go-spew to tagged releases

commit d35edbf80d updated these dependencies
to untagged versions. The diff in both dependencies show that there's no
code changes, and it's unlikely for those modules to do new releases.

Unfortunate, because of that change all projects depending on kubernetes
or any of it's modules now had to upgrade to unreleased versions of
these.

This patch reverts those updates (but it may take some time before
all other projects can be reverted).

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

---------

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2025-01-07 03:48:28 +01:00
..
2022-04-04 14:24:04 -04:00
2022-04-04 19:23:08 -04:00
2021-06-04 16:22:59 -07:00

Troubles with dependencies on openapi

If you see the error

cannot use api.Schema.SchemaProps.Properties

then you have a set of incompatible dependencies. This doc describes the problem and a fix.

tl;dr A mix of old and new is bad.

Anyone depending on k8s.io v0.20.x or older packages must avoid depending on anything that depends on k8s.io/kube-openapi newer than v0.0.0-20210323165736-1a6458611d18.

More context in https://github.com/kubernetes/cli-runtime/issues/19

This dir exists to test the problem.

Edit the main.go and go.mod in this dir to see what builds with various combinations of cli-runtime and kube-openapi.

A recent in change in kube-openapi

https://github.com/kubernetes/kube-openapi/pull/234

means that anyone depending on

k8s.io/cli-runtime@v0.20.4

and any other package that imports kube-openapi (e.g. kyaml) may see a build error like

~/go/pkg/mod/sigs.k8s.io/kustomize@v2.0.3+incompatible/pkg/transformers/config/factorycrd.go:71:47: cannot use api.Schema.SchemaProps.Properties (type map[string]"k8s.io/kube-openapi/pkg/validation/spec".Schema) as type myProperties in argument to looksLikeAk8sType

Why?

As it happens,

k8s.io/cli-runtime@v0.20.4

depends on

sigs.k8s.io/kustomize@v2.0.3+incompatible

Line 71 of factorycrd.go in kustomize v2.0.3 is:

if !looksLikeAk8sType(api.Schema.SchemaProps.Properties) {

The looksLikeAk8sType function accepts the argument

func looksLikeAk8sType(properties map[string]spec.Schema) bool {...}

At the call point in line 71 the argument is

common.OpenAPIDefinition.Schema.SchemaProps.Properties

The file factorycrd.go depends on

"github.com/go-openapi/spec"
"k8s.io/kube-openapi/pkg/common"

The module sigs.k8s.io/kustomize@v2.0.3 predates Go modules.

To pin its dependencies, it has a Gopkg.lock file and a vendor directory. Per the lock file:

sigs.k8s.io/kustomize@v2.0.3
depends on "k8s.io/kube-openapi"
revision = "b3f03f55328800731ce03a164b80973014ecd455"

Checking out this commit in the k8s.io/kube-openapi repo we see this

k8s.io/kube-openapi/pkg/common/common.go:
import  "github.com/go-openapi/spec"
...
type OpenAPIDefinition struct {
  Schema       spec.Schema 
  Dependencies []string
}

But per the imports in this file, spec.Schema lives in

github.com/go-openapi/spec

The aforementioned Gopkg.lock file pins that at

sigs.k8s.io/kustomize@v2.0.3
depends on "github.com/go-openapi/spec"
revision = "bcff419492eeeb01f76e77d2ebc714dc97b607f5"

The struct is

github.com/go-openapi/spec:
type Schema struct {
  VendorExtensible
  SchemaProps
  SwaggerSchemaProps
  ExtraProps map[string]interface{} `json:"-"`
}

type SchemaProps struct {
  Properties map[string]Schema
}

This is a recursive type; Schema holds a map[string]Schema.

All that is fine.

The problem arises when we build a binary that depends on both kustomize v2.0.3 and, say,

k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e

This particular version of kube-openapi has a 'go.mod' file.

kube-openapi/pkg/common/common.go at tag "95288..." contains:

import "k8s.io/kube-openapi/pkg/validation/spec"
...
type OpenAPIDefinition struct {
  Schema       spec.Schema 
  Dependencies []string
}

kube-openapi/pkg/validation/spec/schema.go at this tag contains:

type Schema struct {
  VendorExtensible
  SchemaProps
  SwaggerSchemaProps
  ExtraProps map[string]interface{} `json:"-"`

}

etc. etc. as above. The same layout as above, but in different files.

So adding this new dependency means that

factorycrd.go 

is going to include a version of "k8s.io/kube-openapi/pkg/common". that deals in the type

"k8s.io/kube-openapi/pkg/validation/spec".Schema

but will then attempt to pass this type to older code (the func looksLikeAk8sType) which is looking to accept a

"github.com/go-openapi/spec".Schema

It's the same type structure, but a different name so the 'linker' barfs.

To avoid this problem, one has to either

  • roll forward on cli-runtime -- depend on v0.21.0 or higher.

  • or stick with v0.20.4, which means retaining consistency with kustomize 2.0.3, which means depending on an older version of k8s.io/kube-openapi that still depends on go-openapi/spec.

    Fortunately you only have to go back to before PR https://github.com/kubernetes/kube-openapi/pull/234

    E.g. depend on k8s.io/kube-openapi v0.0.0-20210323165736-1a6458611d18