framework

package
v0.0.0-...-6686a80 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 20, 2023 License: Apache-2.0 Imports: 42 Imported by: 0

Documentation

Overview

Package framework contains the shared test framework for Submariner projects.

Index

Constants

View Source
const (
	SubmarinerGateway  = "submariner-gateway"
	RouteAgent         = "submariner-routeagent"
	GatewayLabel       = "submariner.io/gateway"
	ActiveGatewayLabel = "gateway.submariner.io/status=active"
)
View Source
const (
	// Polling interval while trying to create objects.
	PollInterval = 100 * time.Millisecond
)
View Source
const (
	TestAppLabel = "test-app"
)
View Source
const (
	TestPort = 1234
)

Variables

View Source
var (
	RestConfigs []*rest.Config
	KubeClients []*kubeclientset.Clientset
	DynClients  []dynamic.Interface
)
View Source
var (
	By   func(string)
	Fail func(string)
)
View Source
var TestContext = &TestContextType{
	ClientQPS:       20,
	ClientBurst:     50,
	NettestImageURL: "quay.io/submariner/nettest:devel",
}

Functions

func AddBeforeSuite

func AddBeforeSuite(beforeSuite func())

func AwaitAllocatedEgressIPs

func AwaitAllocatedEgressIPs(client dynamic.ResourceInterface, name string) []string

func AwaitGlobalEgressIPs

func AwaitGlobalEgressIPs(cluster ClusterIndex, name, namespace string) []string

func AwaitResultOrError

func AwaitResultOrError(opMsg string, doOperation DoOperationFunc, checkResult CheckResultFunc) (interface{}, string, error)

func AwaitUntil

func AwaitUntil(opMsg string, doOperation DoOperationFunc, checkResult CheckResultFunc) interface{}

AwaitUntil periodically performs the given operation until the given CheckResultFunc returns true, an error, or a timeout is reached.

func BeforeSuite

func BeforeSuite()

func CreateGlobalEgressIP

func CreateGlobalEgressIP(cluster ClusterIndex, obj *unstructured.Unstructured) error

func DetectFIPSConfig

func DetectFIPSConfig(cluster ClusterIndex) (bool, error)

func DetectGlobalnet

func DetectGlobalnet()

func DetectProvider

func DetectProvider(ctx context.Context, cluster ClusterIndex, nodeName string) string

func Errorf

func Errorf(format string, args ...interface{})

func ExpectNoError

func ExpectNoError(err error, explain ...interface{})

func ExpectNoErrorWithOffset

func ExpectNoErrorWithOffset(offset int, err error, explain ...interface{})

ExpectNoErrorWithOffset checks if "err" is set, and if so, fails assertion while logging the error at "offset" levels above its caller (for example, for call chain f -> g -> ExpectNoErrorWithOffset(1, ...) error would be logged for "f").

func Failf

func Failf(format string, args ...interface{})

func FailfWithOffset

func FailfWithOffset(offset int, format string, args ...interface{})

FailfWithOffset calls "Fail" and logs the error at "offset" levels above its caller (for example, for call chain f -> g -> FailfWithOffset(1, ...) error would be logged for "f").

func FindGatewayNodes

func FindGatewayNodes(cluster ClusterIndex) []v1.Node

FindGatewayNodes finds nodes in a given cluster by matching 'submariner.io/gateway' value.

func FindNonGatewayNodes

func FindNonGatewayNodes(cluster ClusterIndex) []v1.Node

FindNonGatewayNodes finds nodes in a given cluster that doesn't match 'submariner.io/gateway' value.

func FindOtherClusterIndex

func FindOtherClusterIndex(mainCluster int) int

FindOtherClusterIndex looks within the environment for another cluster besides the one provided and returns its index or -1 if none other is found.

func InitNumClusterNodes

func InitNumClusterNodes() error

func IsTransientError

func IsTransientError(err error, opMsg string) bool

identify API errors which could be considered transient/recoverable due to server state.

func Logf

func Logf(format string, args ...interface{})

func NestedString

func NestedString(obj map[string]interface{}, fields ...string) string

func NewRequirement

func NewRequirement(key string, op selection.Operator, vals []string) labels.Requirement

func NoopCheckResult

func NoopCheckResult(interface{}) (bool, string, error)

func PatchInt

func PatchInt(path string, value uint32, patchFunc PatchFunc)

PatchInt performs a REST patch operation for the given path and int value.

func PatchString

func PatchString(path, value string, patchFunc PatchFunc)

PatchString performs a REST patch operation for the given path and string value.

func RemoveCleanupAction

func RemoveCleanupAction(p CleanupActionHandle)

RemoveCleanupAction removes a function that was installed by AddCleanupAction.

func RunCleanupActions

func RunCleanupActions()

RunCleanupActions runs all functions installed by AddCleanupAction. It does not remove them (see RemoveCleanupAction) but it does run unlocked, so they may remove themselves.

func SetFailFunction

func SetFailFunction(fail func(string))

func SetStatusFunction

func SetStatusFunction(by func(string))

func SetUserAgentFunction

func SetUserAgentFunction(uaf func() string)

func Skipf

func Skipf(format string, args ...interface{})

func ValidateFlags

func ValidateFlags(t *TestContextType)

Types

type CheckResultFunc

type CheckResultFunc func(result interface{}) (bool, string, error)

type CleanupActionHandle

type CleanupActionHandle *int

CleanupActionHandle is an integer pointer type for handling cleanup action.

func AddCleanupAction

func AddCleanupAction(fn func()) CleanupActionHandle

AddCleanupAction installs a function that will be called in the event of the whole test being terminated. This allows arbitrary pieces of the overall test to hook into SynchronizedAfterSuite().

type ClusterIndex

type ClusterIndex int
const (
	ClusterA ClusterIndex = iota
	ClusterB
	ClusterC
)

type DoOperationFunc

type DoOperationFunc func() (interface{}, error)

type Docker

type Docker struct {
	Name string
}

func New

func New(name string) *Docker

func (*Docker) GetIP

func (d *Docker) GetIP(networkName string) string

func (*Docker) GetLog

func (d *Docker) GetLog() (string, string)

func (*Docker) RunCommand

func (d *Docker) RunCommand(command ...string) (string, string)

func (*Docker) RunCommandUntil

func (d *Docker) RunCommandUntil(command ...string) (string, string)

type ExecOptions

type ExecOptions struct {
	Command []string

	Namespace     string
	PodName       string
	ContainerName string

	Stdin         io.Reader
	CaptureStdout bool
	CaptureStderr bool
	// If false, whitespace in std{err,out} will be removed.
	PreserveWhitespace bool
}

ExecOptions passed to ExecWithOptions.

type Framework

type Framework struct {
	BaseName string

	// Set together with creating the ClientSet and the namespace.
	// Guaranteed to be unique in the cluster even when running the same
	// test multiple times in parallel.
	UniqueName            string
	SkipNamespaceCreation bool   // Whether to skip creating a namespace
	Namespace             string // Every test has a namespace at least unless creation is skipped

	NamespaceDeletionTimeout time.Duration
	// contains filtered or unexported fields
}

Framework supports common operations used by e2e tests; it will keep a client & a namespace for you. Eventual goal is to merge this with integration test framework.

func NewBareFramework

func NewBareFramework(baseName string) *Framework

NewBareFramework creates a test framework, without ginkgo dependencies.

func NewFramework

func NewFramework(baseName string) *Framework

NewFramework creates a test framework, under ginkgo.

func (*Framework) AddNamespacesToDelete

func (f *Framework) AddNamespacesToDelete(namespaces ...*corev1.Namespace)

func (*Framework) AfterEach

func (f *Framework) AfterEach()

AfterEach deletes the namespace, after reading its events.

func (*Framework) AwaitActiveGatewayPod

func (f *Framework) AwaitActiveGatewayPod(cluster ClusterIndex, checkPod func(*v1.Pod) bool) *v1.Pod

AwaitActiveGatewayPod looks for active gateway pod. Returns pod object or nil.

func (*Framework) AwaitClusterGlobalEgressIPs

func (f *Framework) AwaitClusterGlobalEgressIPs(cluster ClusterIndex, name string) []string

func (*Framework) AwaitGatewayFullyConnected

func (f *Framework) AwaitGatewayFullyConnected(cluster ClusterIndex, name string) *unstructured.Unstructured

func (*Framework) AwaitGatewayRemoved

func (f *Framework) AwaitGatewayRemoved(cluster ClusterIndex, name string)

func (*Framework) AwaitGatewayWithStatus

func (f *Framework) AwaitGatewayWithStatus(cluster ClusterIndex, name, status string) *unstructured.Unstructured

func (*Framework) AwaitGatewaysWithStatus

func (f *Framework) AwaitGatewaysWithStatus(cluster ClusterIndex, status string) []unstructured.Unstructured

func (*Framework) AwaitGlobalIngressIP

func (f *Framework) AwaitGlobalIngressIP(cluster ClusterIndex, name, namespace string) string

func (*Framework) AwaitGlobalIngressIPRemoved

func (f *Framework) AwaitGlobalIngressIPRemoved(cluster ClusterIndex, name, namespace string)

func (*Framework) AwaitPodsByAppLabel

func (f *Framework) AwaitPodsByAppLabel(cluster ClusterIndex, appName, namespace string, expectedCount int) *v1.PodList

AwaitPodsByAppLabel finds pods in a given cluster whose 'app' label value matches a specified value. If the specified expectedCount >= 0, the function waits until the number of pods equals the expectedCount.

func (*Framework) AwaitPodsByLabelSelector

func (f *Framework) AwaitPodsByLabelSelector(cluster ClusterIndex, labelSelector, namespace string, expectedCount int) *v1.PodList

AwaitPodsByLabelSelector finds pods in a given cluster whose labels match a specified label selector. If the specified expectedCount >= 0, the function waits until the number of pods equals the expectedCount.

func (*Framework) AwaitRouteAgentPodOnNode

func (f *Framework) AwaitRouteAgentPodOnNode(cluster ClusterIndex, nodeName string, prevPodUID types.UID) *v1.Pod

AwaitRouteAgentPodOnNode finds the route agent pod on a given node in a cluster, waiting if necessary for a period of time for the pod to materialize. If prevPodUID is non-empty, the found pod's UID must not match it.

func (*Framework) AwaitSubmarinerGatewayPod

func (f *Framework) AwaitSubmarinerGatewayPod(cluster ClusterIndex) *v1.Pod

AwaitSubmarinerGatewayPod finds the submariner gateway pod in a given cluster, waiting if necessary for a period of time for the pod to materialize.

func (*Framework) AwaitUntilAnnotationOnPod

func (f *Framework) AwaitUntilAnnotationOnPod(cluster ClusterIndex, annotation, podName, namespace string) *v1.Pod

AwaitUntilAnnotationOnPod queries the Pod and looks for the presence of annotation.

func (*Framework) BeforeEach

func (f *Framework) BeforeEach()

func (*Framework) CreateHeadlessTCPService

func (f *Framework) CreateHeadlessTCPService(cluster ClusterIndex, selectorName string, port int) *corev1.Service

func (*Framework) CreateNamespace

func (f *Framework) CreateNamespace(clientSet *kubeclientset.Clientset,
	baseName string, labels map[string]string,
) *corev1.Namespace

CreateNamespace creates a namespace for e2e testing.

func (*Framework) CreateService

func (f *Framework) CreateService(sc typedv1.ServiceInterface, serviceSpec *corev1.Service) *corev1.Service

func (*Framework) CreateServiceExport

func (f *Framework) CreateServiceExport(cluster ClusterIndex, name string)

func (*Framework) CreateTCPEndpoints

func (f *Framework) CreateTCPEndpoints(cluster ClusterIndex, epName, portName, address string, port int) *corev1.Endpoints

func (*Framework) CreateTCPService

func (f *Framework) CreateTCPService(cluster ClusterIndex, selectorName string, port int) *corev1.Service

func (*Framework) CreateTCPServiceWithoutSelector

func (f *Framework) CreateTCPServiceWithoutSelector(cluster ClusterIndex, svcName, portName string, port int) *corev1.Service

func (*Framework) DeleteEndpoints

func (f *Framework) DeleteEndpoints(cluster ClusterIndex, endpointsName string)

func (*Framework) DeleteGateway

func (f *Framework) DeleteGateway(cluster ClusterIndex, name string)

func (*Framework) DeletePod

func (f *Framework) DeletePod(cluster ClusterIndex, podName, namespace string)

DeletePod deletes the pod for the given name and namespace.

func (*Framework) DeleteService

func (f *Framework) DeleteService(cluster ClusterIndex, serviceName string)

func (*Framework) DeleteServiceExport

func (f *Framework) DeleteServiceExport(cluster ClusterIndex, name string)

func (*Framework) DoFailover

func (f *Framework) DoFailover(ctx context.Context, cluster ClusterIndex, gwNode, gwPod string)

Perform a gateway failover. The failover for the real environment will crash the gateway node. The failover for the kind environment will set the submariner.io/gateway label to "false" on the gw node.

func (*Framework) ExecWithOptions

func (f *Framework) ExecWithOptions(ctx context.Context, options *ExecOptions, index ClusterIndex) (string, string, error)

ExecWithOptions executes a command in the specified container, returning stdout, stderr and error. `options` allowed for additional parameters to be passed.

func (*Framework) FindClusterWithMultipleGateways

func (f *Framework) FindClusterWithMultipleGateways() int

FindClusterWithMultipleGateways finds the cluster with multiple GW nodes. Returns cluster index.

func (*Framework) FindFIPSEnabledCluster

func (f *Framework) FindFIPSEnabledCluster() ClusterIndex

func (*Framework) GatewayCleanup

func (f *Framework) GatewayCleanup()

GatewayCleanup will be executed only on kind environment. It will restore the gateway nodes to its initial state. Other environments do not need any gw cleanup as MachineSet is responsible to keeping the gw nodes in active states.

func (*Framework) GetGatewaysWithHAStatus

func (f *Framework) GetGatewaysWithHAStatus(
	cluster ClusterIndex, status string,
) []unstructured.Unstructured

func (*Framework) NewNetworkPod

func (f *Framework) NewNetworkPod(config *NetworkPodConfig) *NetworkPod

func (*Framework) NewNginxService

func (f *Framework) NewNginxService(cluster ClusterIndex) *corev1.Service

func (*Framework) NewService

func (f *Framework) NewService(name, portName string, port int, protocol corev1.Protocol, selector map[string]string,
	isHeadless bool,
) *corev1.Service

func (*Framework) SaveGatewayNode

func (f *Framework) SaveGatewayNode(cluster ClusterIndex, gwNode string)

func (*Framework) SetGatewayLabelOnNode

func (f *Framework) SetGatewayLabelOnNode(ctx context.Context, cluster ClusterIndex, nodeName string, isGateway bool)

SetGatewayLabelOnNode sets the 'submariner.io/gateway' value for a node to the specified value.

func (*Framework) TestGatewayNodeFIPSMode

func (f *Framework) TestGatewayNodeFIPSMode(cluster ClusterIndex, gwPod string)

type NetworkPod

type NetworkPod struct {
	Pod                 *v1.Pod
	Config              *NetworkPodConfig
	TerminationError    error
	TerminationErrorMsg string
	TerminationCode     int32
	TerminationMessage  string
	// contains filtered or unexported fields
}

func (*NetworkPod) AwaitFinish

func (np *NetworkPod) AwaitFinish()

func (*NetworkPod) AwaitFinishVerbose

func (np *NetworkPod) AwaitFinishVerbose(verbose bool)

func (*NetworkPod) AwaitReady

func (np *NetworkPod) AwaitReady()

func (*NetworkPod) CheckSuccessfulFinish

func (np *NetworkPod) CheckSuccessfulFinish()

func (*NetworkPod) CreateService

func (np *NetworkPod) CreateService() *v1.Service

func (*NetworkPod) GetLog

func (np *NetworkPod) GetLog() string

GetLog returns container log from this NetworkPod.

func (*NetworkPod) RunCommand

func (np *NetworkPod) RunCommand(ctx context.Context, cmd []string) (string, string)

RunCommand run the specified command in this NetworkPod.

type NetworkPodConfig

type NetworkPodConfig struct {
	Type               NetworkPodType
	Cluster            ClusterIndex
	Scheduling         NetworkPodScheduling
	Port               int
	Data               string
	NumOfDataBufs      uint
	RemoteIP           string
	ConnectionTimeout  uint
	ConnectionAttempts uint
	Networking         NetworkingType
	ContainerName      string
	ImageName          string
	Command            []string
}

type NetworkPodScheduling

type NetworkPodScheduling int
const (
	InvalidScheduling NetworkPodScheduling = iota
	GatewayNode
	NonGatewayNode
)

type NetworkPodType

type NetworkPodType int
const (
	InvalidPodType NetworkPodType = iota
	ListenerPod
	ConnectorPod
	ThroughputClientPod
	ThroughputServerPod
	LatencyClientPod
	LatencyServerPod
	CustomPod
)

type NetworkingType

type NetworkingType bool
const (
	HostNetworking NetworkingType = true
	PodNetworking  NetworkingType = false
)

type PatchFunc

type PatchFunc func(pt types.PatchType, payload []byte) error

type PatchStringValue

type PatchStringValue struct {
	Op    string `json:"op"`
	Path  string `json:"path"`
	Value string `json:"value"`
}

type PatchUInt32Value

type PatchUInt32Value struct {
	Op    string `json:"op"`
	Path  string `json:"path"`
	Value uint32 `json:"value"`
}

type TestContextType

type TestContextType struct {
	ReporterConfig      *types.ReporterConfig
	SuiteConfig         *types.SuiteConfig
	KubeConfigs         []string // KubeConfigs provides an alternative to KubeConfig + KubeContexts
	KubeConfig          string
	KubeContexts        contextArray
	ClusterIDs          []string
	NumNodesInCluster   map[ClusterIndex]int
	SubmarinerNamespace string
	ConnectionTimeout   uint
	ConnectionAttempts  uint
	OperationTimeout    uint
	PacketSize          uint
	GlobalnetEnabled    bool
	ClientQPS           float32
	ClientBurst         int
	GroupVersion        *schema.GroupVersion
	NettestImageURL     string
}

Directories

Path Synopsis
Package ginkgowrapper wraps Ginkgo Fail and Skip functions to panic with structured data instead of a constant string.
Package ginkgowrapper wraps Ginkgo Fail and Skip functions to panic with structured data instead of a constant string.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL