blob: 30e79da6ea3b3e5fc437d945f7aec600d20eafa4 [file] [log] [blame]
// Copyright Istio Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package namespace
import (
"github.com/apache/dubbo-go-pixiu/pkg/test"
"github.com/apache/dubbo-go-pixiu/pkg/test/framework/resource"
)
// Config contains configuration information about the namespace instance
type Config struct {
// Prefix to use for autogenerated namespace name
Prefix string
// Inject indicates whether to add sidecar injection label to this namespace
Inject bool
// Revision is the namespace of custom injector instance
Revision string
// Labels to be applied to namespace
Labels map[string]string
}
// Instance represents an allocated namespace that can be used to create config, or deploy components in.
type Instance interface {
Name() string
SetLabel(key, value string) error
RemoveLabel(key string) error
Prefix() string
Labels() (map[string]string, error)
}
// Claim an existing namespace in all clusters, or create a new one if doesn't exist.
func Claim(ctx resource.Context, nsConfig Config) (i Instance, err error) {
overwriteRevisionIfEmpty(&nsConfig, ctx.Settings().Revisions.Default())
return claimKube(ctx, &nsConfig)
}
// ClaimOrFail calls Claim and fails test if it returns error
func ClaimOrFail(t test.Failer, ctx resource.Context, name string) Instance {
t.Helper()
nsCfg := Config{
Prefix: name,
Inject: true,
}
i, err := Claim(ctx, nsCfg)
if err != nil {
t.Fatalf("namespace.ClaimOrFail:: %v", err)
}
return i
}
// New creates a new Namespace in all clusters.
func New(ctx resource.Context, nsConfig Config) (i Instance, err error) {
if ctx.Settings().StableNamespaces {
return Claim(ctx, nsConfig)
}
overwriteRevisionIfEmpty(&nsConfig, ctx.Settings().Revisions.Default())
return newKube(ctx, &nsConfig)
}
// NewOrFail calls New and fails test if it returns error
func NewOrFail(t test.Failer, ctx resource.Context, nsConfig Config) Instance {
t.Helper()
i, err := New(ctx, nsConfig)
if err != nil {
t.Fatalf("namespace.NewOrFail: %v", err)
}
return i
}
func overwriteRevisionIfEmpty(nsConfig *Config, revision string) {
// Overwrite the default namespace label (istio-injection=enabled)
// with istio.io/rev=XXX. If a revision label is already provided,
// the label will remain as is.
if nsConfig.Revision == "" {
nsConfig.Revision = revision
}
// Allow setting revision explicitly to `default` to avoid configuration overwrite
if nsConfig.Revision == "default" {
nsConfig.Revision = ""
}
}