Created
October 11, 2019 15:16
-
-
Save sttts/7120198617ffda4787a1cc81476736b2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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