mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-04 18:00:08 +00:00
Merge pull request #87513 from gavinfish/e2e_ingress_manifest
Move IngressFromManifest/IngressToManifest to ingress e2e fw
This commit is contained in:
commit
04498c5955
@ -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(
|
go_library(
|
||||||
name = "go_default_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/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/fields: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/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/intstr:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/net: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/sets:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/wait: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:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
|
||||||
"//test/e2e/framework:go_default_library",
|
"//test/e2e/framework:go_default_library",
|
||||||
"//test/e2e/framework/service:go_default_library",
|
"//test/e2e/framework/service:go_default_library",
|
||||||
"//test/e2e/framework/testfiles:go_default_library",
|
"//test/e2e/framework/testfiles:go_default_library",
|
||||||
"//test/e2e/manifest:go_default_library",
|
|
||||||
"//test/utils:go_default_library",
|
"//test/utils:go_default_library",
|
||||||
"//test/utils/image:go_default_library",
|
"//test/utils/image:go_default_library",
|
||||||
"//vendor/github.com/onsi/ginkgo:go_default_library",
|
"//vendor/github.com/onsi/ginkgo:go_default_library",
|
||||||
@ -43,3 +46,10 @@ filegroup(
|
|||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
visibility = ["//visibility:public"],
|
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"],
|
||||||
|
)
|
||||||
|
@ -45,15 +45,18 @@ import (
|
|||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/fields"
|
"k8s.io/apimachinery/pkg/fields"
|
||||||
"k8s.io/apimachinery/pkg/labels"
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apimachinery/pkg/util/intstr"
|
"k8s.io/apimachinery/pkg/util/intstr"
|
||||||
utilnet "k8s.io/apimachinery/pkg/util/net"
|
utilnet "k8s.io/apimachinery/pkg/util/net"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
|
utilyaml "k8s.io/apimachinery/pkg/util/yaml"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
|
scheme "k8s.io/client-go/kubernetes/scheme"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"k8s.io/kubernetes/test/e2e/framework"
|
||||||
e2eservice "k8s.io/kubernetes/test/e2e/framework/service"
|
e2eservice "k8s.io/kubernetes/test/e2e/framework/service"
|
||||||
"k8s.io/kubernetes/test/e2e/framework/testfiles"
|
"k8s.io/kubernetes/test/e2e/framework/testfiles"
|
||||||
"k8s.io/kubernetes/test/e2e/manifest"
|
|
||||||
testutils "k8s.io/kubernetes/test/utils"
|
testutils "k8s.io/kubernetes/test/utils"
|
||||||
imageutils "k8s.io/kubernetes/test/utils/image"
|
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.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)
|
framework.ExpectNoError(err)
|
||||||
j.Ingress.Namespace = ns
|
j.Ingress.Namespace = ns
|
||||||
j.Ingress.Annotations = map[string]string{IngressClassKey: j.Class}
|
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)
|
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.
|
// runCreate runs the required command to create the given ingress.
|
||||||
func (j *TestJig) runCreate(ing *networkingv1beta1.Ingress) (*networkingv1beta1.Ingress, error) {
|
func (j *TestJig) runCreate(ing *networkingv1beta1.Ingress) (*networkingv1beta1.Ingress, error) {
|
||||||
if j.Class != MulticlusterIngressClassValue {
|
if j.Class != MulticlusterIngressClassValue {
|
||||||
@ -493,7 +540,7 @@ func (j *TestJig) runCreate(ing *networkingv1beta1.Ingress) (*networkingv1beta1.
|
|||||||
}
|
}
|
||||||
// Use kubemci to create a multicluster ingress.
|
// Use kubemci to create a multicluster ingress.
|
||||||
filePath := framework.TestContext.OutputDir + "/mci.yaml"
|
filePath := framework.TestContext.OutputDir + "/mci.yaml"
|
||||||
if err := manifest.IngressToManifest(ing, filePath); err != nil {
|
if err := ingressToManifest(ing, filePath); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
_, err := framework.RunKubemciWithKubeconfig("create", ing.Name, fmt.Sprintf("--ingress=%s", filePath))
|
_, 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.
|
// Use kubemci to update a multicluster ingress.
|
||||||
// kubemci does not have an update command. We use "create --force" to update an existing ingress.
|
// kubemci does not have an update command. We use "create --force" to update an existing ingress.
|
||||||
filePath := framework.TestContext.OutputDir + "/mci.yaml"
|
filePath := framework.TestContext.OutputDir + "/mci.yaml"
|
||||||
if err := manifest.IngressToManifest(ing, filePath); err != nil {
|
if err := ingressToManifest(ing, filePath); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
_, err := framework.RunKubemciWithKubeconfig("create", ing.Name, fmt.Sprintf("--ingress=%s", filePath), "--force")
|
_, 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.
|
// Use kubemci to delete a multicluster ingress.
|
||||||
filePath := framework.TestContext.OutputDir + "/mci.yaml"
|
filePath := framework.TestContext.OutputDir + "/mci.yaml"
|
||||||
if err := manifest.IngressToManifest(ing, filePath); err != nil {
|
if err := ingressToManifest(ing, filePath); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err := framework.RunKubemciWithKubeconfig("delete", ing.Name, fmt.Sprintf("--ingress=%s", filePath))
|
_, err := framework.RunKubemciWithKubeconfig("delete", ing.Name, fmt.Sprintf("--ingress=%s", filePath))
|
||||||
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package manifest
|
package ingress
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
@ -36,11 +36,11 @@ func TestIngressToManifest(t *testing.T) {
|
|||||||
ingPath := filepath.Join(tmpDir, "ing.yaml")
|
ingPath := filepath.Join(tmpDir, "ing.yaml")
|
||||||
|
|
||||||
// Write the ingress to a file and ensure that there is no error.
|
// 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)
|
t.Fatalf("Error in creating file: %s", err)
|
||||||
}
|
}
|
||||||
// Writing it again should not return an error.
|
// 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)
|
t.Fatalf("Error in creating file: %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -3,7 +3,6 @@ package(default_visibility = ["//visibility:public"])
|
|||||||
load(
|
load(
|
||||||
"@io_bazel_rules_go//go:def.bzl",
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
"go_library",
|
"go_library",
|
||||||
"go_test",
|
|
||||||
)
|
)
|
||||||
|
|
||||||
go_library(
|
go_library(
|
||||||
@ -13,11 +12,9 @@ go_library(
|
|||||||
deps = [
|
deps = [
|
||||||
"//staging/src/k8s.io/api/apps/v1:go_default_library",
|
"//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/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/api/rbac/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/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: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/apimachinery/pkg/util/yaml:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
|
||||||
"//test/e2e/framework/testfiles:go_default_library",
|
"//test/e2e/framework/testfiles:go_default_library",
|
||||||
@ -36,10 +33,3 @@ filegroup(
|
|||||||
srcs = [":package-srcs"],
|
srcs = [":package-srcs"],
|
||||||
tags = ["automanaged"],
|
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"],
|
|
||||||
)
|
|
||||||
|
@ -17,16 +17,11 @@ limitations under the License.
|
|||||||
package manifest
|
package manifest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
|
|
||||||
appsv1 "k8s.io/api/apps/v1"
|
appsv1 "k8s.io/api/apps/v1"
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
networkingv1beta1 "k8s.io/api/networking/v1beta1"
|
|
||||||
rbacv1 "k8s.io/api/rbac/v1"
|
rbacv1 "k8s.io/api/rbac/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
||||||
utilyaml "k8s.io/apimachinery/pkg/util/yaml"
|
utilyaml "k8s.io/apimachinery/pkg/util/yaml"
|
||||||
scheme "k8s.io/client-go/kubernetes/scheme"
|
scheme "k8s.io/client-go/kubernetes/scheme"
|
||||||
"k8s.io/kubernetes/test/e2e/framework/testfiles"
|
"k8s.io/kubernetes/test/e2e/framework/testfiles"
|
||||||
@ -86,38 +81,6 @@ func SvcFromManifest(fileName string) (*v1.Service, error) {
|
|||||||
return &svc, nil
|
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.
|
// StatefulSetFromManifest returns a StatefulSet from a manifest stored in fileName in the Namespace indicated by ns.
|
||||||
func StatefulSetFromManifest(fileName, ns string) (*appsv1.StatefulSet, error) {
|
func StatefulSetFromManifest(fileName, ns string) (*appsv1.StatefulSet, error) {
|
||||||
var ss appsv1.StatefulSet
|
var ss appsv1.StatefulSet
|
||||||
@ -181,15 +144,3 @@ func RoleFromManifest(fileName, ns string) (*rbacv1.Role, error) {
|
|||||||
role.Namespace = ns
|
role.Namespace = ns
|
||||||
return &role, nil
|
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)
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user