diff --git a/test/e2e/framework/ingress/BUILD b/test/e2e/framework/ingress/BUILD index 78709438297..dd8a473a0a6 100644 --- a/test/e2e/framework/ingress/BUILD +++ b/test/e2e/framework/ingress/BUILD @@ -1,4 +1,4 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", @@ -13,15 +13,18 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", "//test/e2e/framework:go_default_library", "//test/e2e/framework/service:go_default_library", "//test/e2e/framework/testfiles:go_default_library", - "//test/e2e/manifest:go_default_library", "//test/utils:go_default_library", "//test/utils/image:go_default_library", "//vendor/github.com/onsi/ginkgo:go_default_library", @@ -43,3 +46,10 @@ filegroup( tags = ["automanaged"], visibility = ["//visibility:public"], ) + +go_test( + name = "go_default_test", + srcs = ["ingress_utils_test.go"], + embed = [":go_default_library"], + deps = ["//staging/src/k8s.io/api/networking/v1beta1:go_default_library"], +) diff --git a/test/e2e/framework/ingress/ingress_utils.go b/test/e2e/framework/ingress/ingress_utils.go index 43cadf3b838..ec777548616 100644 --- a/test/e2e/framework/ingress/ingress_utils.go +++ b/test/e2e/framework/ingress/ingress_utils.go @@ -45,15 +45,18 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/intstr" utilnet "k8s.io/apimachinery/pkg/util/net" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" + utilyaml "k8s.io/apimachinery/pkg/util/yaml" clientset "k8s.io/client-go/kubernetes" + scheme "k8s.io/client-go/kubernetes/scheme" "k8s.io/kubernetes/test/e2e/framework" e2eservice "k8s.io/kubernetes/test/e2e/framework/service" "k8s.io/kubernetes/test/e2e/framework/testfiles" - "k8s.io/kubernetes/test/e2e/manifest" testutils "k8s.io/kubernetes/test/utils" imageutils "k8s.io/kubernetes/test/utils/image" @@ -474,7 +477,7 @@ func (j *TestJig) CreateIngress(manifestPath, ns string, ingAnnotations map[stri } j.Logger.Infof("Parsing ingress from %v", filepath.Join(manifestPath, "ing.yaml")) - j.Ingress, err = manifest.IngressFromManifest(filepath.Join(manifestPath, "ing.yaml")) + j.Ingress, err = ingressFromManifest(filepath.Join(manifestPath, "ing.yaml")) framework.ExpectNoError(err) j.Ingress.Namespace = ns j.Ingress.Annotations = map[string]string{IngressClassKey: j.Class} @@ -486,6 +489,50 @@ func (j *TestJig) CreateIngress(manifestPath, ns string, ingAnnotations map[stri framework.ExpectNoError(err) } +// marshalToYaml marshals an object into YAML for a given GroupVersion. +// The object must be known in SupportedMediaTypes() for the Codecs under "client-go/kubernetes/scheme". +func marshalToYaml(obj runtime.Object, gv schema.GroupVersion) ([]byte, error) { + mediaType := "application/yaml" + info, ok := runtime.SerializerInfoForMediaType(scheme.Codecs.SupportedMediaTypes(), mediaType) + if !ok { + return []byte{}, fmt.Errorf("unsupported media type %q", mediaType) + } + encoder := scheme.Codecs.EncoderForVersion(info.Serializer, gv) + return runtime.Encode(encoder, obj) +} + +// ingressFromManifest reads a .json/yaml file and returns the ingress in it. +func ingressFromManifest(fileName string) (*networkingv1beta1.Ingress, error) { + var ing networkingv1beta1.Ingress + data, err := testfiles.Read(fileName) + if err != nil { + return nil, err + } + + json, err := utilyaml.ToJSON(data) + if err != nil { + return nil, err + } + if err := runtime.DecodeInto(scheme.Codecs.UniversalDecoder(), json, &ing); err != nil { + return nil, err + } + return &ing, nil +} + +// ingressToManifest generates a yaml file in the given path with the given ingress. +// Assumes that a directory exists at the given path. +func ingressToManifest(ing *networkingv1beta1.Ingress, path string) error { + serialized, err := marshalToYaml(ing, networkingv1beta1.SchemeGroupVersion) + if err != nil { + return fmt.Errorf("failed to marshal ingress %v to YAML: %v", ing, err) + } + + if err := ioutil.WriteFile(path, serialized, 0600); err != nil { + return fmt.Errorf("error in writing ingress to file: %s", err) + } + return nil +} + // runCreate runs the required command to create the given ingress. func (j *TestJig) runCreate(ing *networkingv1beta1.Ingress) (*networkingv1beta1.Ingress, error) { if j.Class != MulticlusterIngressClassValue { @@ -493,7 +540,7 @@ func (j *TestJig) runCreate(ing *networkingv1beta1.Ingress) (*networkingv1beta1. } // Use kubemci to create a multicluster ingress. filePath := framework.TestContext.OutputDir + "/mci.yaml" - if err := manifest.IngressToManifest(ing, filePath); err != nil { + if err := ingressToManifest(ing, filePath); err != nil { return nil, err } _, err := framework.RunKubemciWithKubeconfig("create", ing.Name, fmt.Sprintf("--ingress=%s", filePath)) @@ -508,7 +555,7 @@ func (j *TestJig) runUpdate(ing *networkingv1beta1.Ingress) (*networkingv1beta1. // Use kubemci to update a multicluster ingress. // kubemci does not have an update command. We use "create --force" to update an existing ingress. filePath := framework.TestContext.OutputDir + "/mci.yaml" - if err := manifest.IngressToManifest(ing, filePath); err != nil { + if err := ingressToManifest(ing, filePath); err != nil { return nil, err } _, err := framework.RunKubemciWithKubeconfig("create", ing.Name, fmt.Sprintf("--ingress=%s", filePath), "--force") @@ -615,7 +662,7 @@ func (j *TestJig) runDelete(ing *networkingv1beta1.Ingress) error { } // Use kubemci to delete a multicluster ingress. filePath := framework.TestContext.OutputDir + "/mci.yaml" - if err := manifest.IngressToManifest(ing, filePath); err != nil { + if err := ingressToManifest(ing, filePath); err != nil { return err } _, err := framework.RunKubemciWithKubeconfig("delete", ing.Name, fmt.Sprintf("--ingress=%s", filePath)) diff --git a/test/e2e/manifest/manifest_test.go b/test/e2e/framework/ingress/ingress_utils_test.go similarity index 90% rename from test/e2e/manifest/manifest_test.go rename to test/e2e/framework/ingress/ingress_utils_test.go index 6eeac5382e6..538c7ee740c 100644 --- a/test/e2e/manifest/manifest_test.go +++ b/test/e2e/framework/ingress/ingress_utils_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package manifest +package ingress import ( "io/ioutil" @@ -36,11 +36,11 @@ func TestIngressToManifest(t *testing.T) { ingPath := filepath.Join(tmpDir, "ing.yaml") // Write the ingress to a file and ensure that there is no error. - if err := IngressToManifest(ing, ingPath); err != nil { + if err := ingressToManifest(ing, ingPath); err != nil { t.Fatalf("Error in creating file: %s", err) } // Writing it again should not return an error. - if err := IngressToManifest(ing, ingPath); err != nil { + if err := ingressToManifest(ing, ingPath); err != nil { t.Fatalf("Error in creating file: %s", err) } } diff --git a/test/e2e/manifest/BUILD b/test/e2e/manifest/BUILD index 4ee823ecd62..e532bc9ee53 100644 --- a/test/e2e/manifest/BUILD +++ b/test/e2e/manifest/BUILD @@ -3,7 +3,6 @@ package(default_visibility = ["//visibility:public"]) load( "@io_bazel_rules_go//go:def.bzl", "go_library", - "go_test", ) go_library( @@ -13,11 +12,9 @@ go_library( deps = [ "//staging/src/k8s.io/api/apps/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", "//staging/src/k8s.io/api/rbac/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", "//test/e2e/framework/testfiles:go_default_library", @@ -36,10 +33,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -go_test( - name = "go_default_test", - srcs = ["manifest_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/api/networking/v1beta1:go_default_library"], -) diff --git a/test/e2e/manifest/manifest.go b/test/e2e/manifest/manifest.go index b3d62923c99..5edeaed5364 100644 --- a/test/e2e/manifest/manifest.go +++ b/test/e2e/manifest/manifest.go @@ -17,16 +17,11 @@ limitations under the License. package manifest import ( - "fmt" - "io/ioutil" - appsv1 "k8s.io/api/apps/v1" "k8s.io/api/core/v1" - networkingv1beta1 "k8s.io/api/networking/v1beta1" rbacv1 "k8s.io/api/rbac/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" utilyaml "k8s.io/apimachinery/pkg/util/yaml" scheme "k8s.io/client-go/kubernetes/scheme" "k8s.io/kubernetes/test/e2e/framework/testfiles" @@ -86,38 +81,6 @@ func SvcFromManifest(fileName string) (*v1.Service, error) { return &svc, nil } -// IngressFromManifest reads a .json/yaml file and returns the ingress in it. -func IngressFromManifest(fileName string) (*networkingv1beta1.Ingress, error) { - var ing networkingv1beta1.Ingress - data, err := testfiles.Read(fileName) - if err != nil { - return nil, err - } - - json, err := utilyaml.ToJSON(data) - if err != nil { - return nil, err - } - if err := runtime.DecodeInto(scheme.Codecs.UniversalDecoder(), json, &ing); err != nil { - return nil, err - } - return &ing, nil -} - -// IngressToManifest generates a yaml file in the given path with the given ingress. -// Assumes that a directory exists at the given path. -func IngressToManifest(ing *networkingv1beta1.Ingress, path string) error { - serialized, err := marshalToYaml(ing, networkingv1beta1.SchemeGroupVersion) - if err != nil { - return fmt.Errorf("failed to marshal ingress %v to YAML: %v", ing, err) - } - - if err := ioutil.WriteFile(path, serialized, 0600); err != nil { - return fmt.Errorf("error in writing ingress to file: %s", err) - } - return nil -} - // StatefulSetFromManifest returns a StatefulSet from a manifest stored in fileName in the Namespace indicated by ns. func StatefulSetFromManifest(fileName, ns string) (*appsv1.StatefulSet, error) { var ss appsv1.StatefulSet @@ -181,15 +144,3 @@ func RoleFromManifest(fileName, ns string) (*rbacv1.Role, error) { role.Namespace = ns return &role, nil } - -// marshalToYaml marshals an object into YAML for a given GroupVersion. -// The object must be known in SupportedMediaTypes() for the Codecs under "client-go/kubernetes/scheme". -func marshalToYaml(obj runtime.Object, gv schema.GroupVersion) ([]byte, error) { - mediaType := "application/yaml" - info, ok := runtime.SerializerInfoForMediaType(scheme.Codecs.SupportedMediaTypes(), mediaType) - if !ok { - return []byte{}, fmt.Errorf("unsupported media type %q", mediaType) - } - encoder := scheme.Codecs.EncoderForVersion(info.Serializer, gv) - return runtime.Encode(encoder, obj) -}