Skip to content

Instantly share code, notes, and snippets.

@sttts
Created October 11, 2019 15:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sttts/7120198617ffda4787a1cc81476736b2 to your computer and use it in GitHub Desktop.
Save sttts/7120198617ffda4787a1cc81476736b2 to your computer and use it in GitHub Desktop.
diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/unfold.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/unfold.go
index d135757ee7b..bfc361abadd 100644
--- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/unfold.go
+++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/unfold.go
@@ -35,6 +35,9 @@ func (s *Structural) Unfold() *Structural {
return false
}
+ if s.ValueValidation == nil {
+ s.ValueValidation = &ValueValidation{}
+ }
if s.AnyOf == nil {
s.AnyOf = []NestedValueValidation{
{ForbiddenGenerics: Generic{Type: "integer"}},
diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/basic_test.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/basic_test.go
index b8ef583730d..581ce5dc0ff 100644
--- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/basic_test.go
+++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/basic_test.go
@@ -17,6 +17,7 @@ limitations under the License.
package integration
import (
+ "encoding/json"
"fmt"
"reflect"
"sort"
@@ -24,6 +25,8 @@ import (
"testing"
"time"
+ "k8s.io/apimachinery/pkg/util/yaml"
+
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
"k8s.io/apimachinery/pkg/api/errors"
@@ -31,6 +34,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
+ "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/apimachinery/pkg/watch"
@@ -82,6 +86,56 @@ func TestClusterScopedCRUD(t *testing.T) {
testFieldSelector(t, ns, noxuDefinition, dynamicClient)
}
+func TestBug(t *testing.T) {
+ tearDown, apiExtensionClient, dynamicClient, err := fixtures.StartDefaultServerWithClients(t)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer tearDown()
+
+ manifest := `
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+ name: foos.stable.example.com
+spec:
+ group: stable.example.com
+ versions:
+ - name: v1
+ served: true
+ storage: true
+ scope: Namespaced
+ names:
+ plural: foos
+ singular: foo
+ kind: Foo
+ preserveUnknownFields: false
+ validation:
+ openAPIV3Schema:
+ type: object
+ properties:
+ intorstr:
+ x-kubernetes-int-or-string: true
+`
+ crd := apiextensionsv1beta1.CustomResourceDefinition{}
+ bs, err := yaml.ToJSON([]byte(manifest))
+ if err != nil {
+ t.Fatal(err)
+ }
+ if err := json.Unmarshal(bs, &crd); err != nil {
+ t.Fatal(err)
+ }
+ if _, err := apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Create(&crd); err != nil {
+ t.Fatal(err)
+ }
+
+ time.Sleep(time.Second)
+
+ if _, err := dynamicClient.Resource(schema.GroupVersionResource{"stable.example.com", "v1", "foos"}).List(metav1.ListOptions{}); err != nil {
+ t.Fatal(err)
+ }
+}
+
func testSimpleCRUD(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta1.CustomResourceDefinition, dynamicClient dynamic.Interface) {
noxuResourceClients := map[string]dynamic.ResourceInterface{}
noxuWatchs := map[string]watch.Interface{}
diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/fixtures/resources.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/fixtures/resources.go
index 0775971df58..8fa2b61e41f 100644
--- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/fixtures/resources.go
+++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/fixtures/resources.go
@@ -111,6 +111,16 @@ func NewNoxuCustomResourceDefinition(scope apiextensionsv1beta1.ResourceScope) *
Categories: []string{"all"},
},
Scope: scope,
+ Validation: &apiextensionsv1beta1.CustomResourceValidation{
+ OpenAPIV3Schema: &apiextensionsv1beta1.JSONSchemaProps{
+ Type: "object",
+ Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{
+ "intorstr": {
+ XIntOrString: true,
+ },
+ },
+ },
+ },
},
}
}
diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/validation_test.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/validation_test.go
index caea620b144..65928a1c2ac 100644
--- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/validation_test.go
+++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/validation_test.go
@@ -715,12 +715,14 @@ spec:
unexpectedViolations []string
}
tests := []Test{
- {"empty", "", "", "", nil, nil, nil, nil},
+ //{"empty", "", "", "", nil, nil, nil, nil},
{
desc: "int-or-string and preserve-unknown-fields true",
globalSchema: `
-x-kubernetes-preserve-unknown-fields: true
-x-kubernetes-int-or-string: true
+type: object
+properties:
+ intorstr:
+ x-kubernetes-int-or-string: true
`,
expectedCreateErrors: []string{
"spec.validation.openAPIV3Schema.x-kubernetes-preserve-unknown-fields: Invalid value: true: must be false if x-kubernetes-int-or-string is true",
diff --git a/test/integration/master/kube_apiserver_test.go b/test/integration/master/kube_apiserver_test.go
index daa511599e9..9b43fb72c05 100644
--- a/test/integration/master/kube_apiserver_test.go
+++ b/test/integration/master/kube_apiserver_test.go
@@ -27,13 +27,17 @@ import (
"time"
"github.com/go-openapi/spec"
+ "k8s.io/client-go/dynamic"
+
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/util/wait"
+ "k8s.io/apimachinery/pkg/util/yaml"
"k8s.io/apiserver/pkg/registry/generic/registry"
"k8s.io/client-go/kubernetes"
"k8s.io/kube-aggregator/pkg/apis/apiregistration"
@@ -96,6 +100,56 @@ func TestRun(t *testing.T) {
}
}
+func TestBug(t *testing.T) {
+ server := kubeapiservertesting.StartTestServerOrDie(t, nil, nil, framework.SharedEtcd())
+ defer server.TearDownFn()
+
+ apiExtensionClient, _ := apiextensionsclientset.NewForConfig(server.ClientConfig)
+ dynamicClient, _ := dynamic.NewForConfig(server.ClientConfig)
+
+ manifest := `
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+ name: foos.stable.example.com
+spec:
+ group: stable.example.com
+ versions:
+ - name: v1
+ served: true
+ storage: true
+ scope: Namespaced
+ names:
+ plural: foos
+ singular: foo
+ kind: Foo
+ preserveUnknownFields: false
+ validation:
+ openAPIV3Schema:
+ type: object
+ properties:
+ intorstr:
+ x-kubernetes-int-or-string: true
+`
+ crd := apiextensionsv1beta1.CustomResourceDefinition{}
+ bs, err := yaml.ToJSON([]byte(manifest))
+ if err != nil {
+ t.Fatal(err)
+ }
+ if err := json.Unmarshal(bs, &crd); err != nil {
+ t.Fatal(err)
+ }
+ if _, err := apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Create(&crd); err != nil {
+ t.Fatal(err)
+ }
+
+ time.Sleep(time.Second)
+
+ if _, err := dynamicClient.Resource(schema.GroupVersionResource{"stable.example.com", "v1", "foos"}).List(metav1.ListOptions{}); err != nil {
+ t.Fatal(err)
+ }
+}
+
func endpointReturnsStatusOK(client *kubernetes.Clientset, path string) bool {
res := client.CoreV1().RESTClient().Get().AbsPath(path).Do()
var status int
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment