Merge pull request #43713 from marun/fed-secret-upgrade-test-redux

Automatic merge from submit-queue

[Federation] Add federated type registry

This PR adds a registry for federated types. The goal is to simplify the consumption of federated type configuration by controllers/integration tests/e2e tests/upgrade tests.  Consumers can iterate over ``fedtypes.FederatedTypes()``, as per the usage in the crud integration test and controller manager in this PR.

The previous name for the the adapter package - ``typeadapters`` - has been changed to ``fedtypes`` to reflect the fact that more than just type adapters are defined there.  I'm happy to take suggestions on the name, ``fedtypes`` was just the first thing that came to mind. 

cc: @kubernetes/sig-federation-pr-reviews
This commit is contained in:
Kubernetes Submit Queue 2017-04-17 09:08:18 -07:00 committed by GitHub
commit f96b187fcb
18 changed files with 146 additions and 131 deletions

View File

@ -27,9 +27,9 @@ filegroup(
"//federation/cmd/kubefed:all-srcs",
"//federation/develop:all-srcs",
"//federation/pkg/dnsprovider:all-srcs",
"//federation/pkg/federatedtypes:all-srcs",
"//federation/pkg/federation-controller:all-srcs",
"//federation/pkg/kubefed:all-srcs",
"//federation/pkg/typeadapters:all-srcs",
"//federation/registry/cluster:all-srcs",
],
tags = ["automanaged"],

View File

@ -22,6 +22,7 @@ go_library(
"//federation/pkg/dnsprovider/providers/aws/route53:go_default_library",
"//federation/pkg/dnsprovider/providers/coredns:go_default_library",
"//federation/pkg/dnsprovider/providers/google/clouddns:go_default_library",
"//federation/pkg/federatedtypes:go_default_library",
"//federation/pkg/federation-controller/cluster:go_default_library",
"//federation/pkg/federation-controller/configmap:go_default_library",
"//federation/pkg/federation-controller/daemonset:go_default_library",

View File

@ -36,6 +36,7 @@ import (
federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset"
"k8s.io/kubernetes/federation/cmd/federation-controller-manager/app/options"
"k8s.io/kubernetes/federation/pkg/dnsprovider"
"k8s.io/kubernetes/federation/pkg/federatedtypes"
clustercontroller "k8s.io/kubernetes/federation/pkg/federation-controller/cluster"
configmapcontroller "k8s.io/kubernetes/federation/pkg/federation-controller/configmap"
daemonsetcontroller "k8s.io/kubernetes/federation/pkg/federation-controller/daemonset"
@ -159,8 +160,11 @@ func StartControllers(s *options.CMServer, restClientCfg *restclient.Config) err
namespaceController.Run(wait.NeverStop)
}
if controllerEnabled(s.Controllers, serverResources, secretcontroller.ControllerName, secretcontroller.RequiredResources, true) {
secretcontroller.StartSecretController(restClientCfg, stopChan, minimizeLatency)
for kind, federatedType := range federatedtypes.FederatedTypes() {
if controllerEnabled(s.Controllers, serverResources, federatedType.ControllerName, federatedType.RequiredResources, true) {
// TODO the generic controller doesn't belong in the secretcontroller package
secretcontroller.StartFederationSyncController(kind, federatedType.AdapterFactory, restClientCfg, stopChan, minimizeLatency)
}
}
if controllerEnabled(s.Controllers, serverResources, configmapcontroller.ControllerName, configmapcontroller.RequiredResources, true) {

View File

@ -11,6 +11,7 @@ go_library(
name = "go_default_library",
srcs = [
"adapter.go",
"registry.go",
"secret.go",
],
tags = ["automanaged"],
@ -21,6 +22,7 @@ go_library(
"//pkg/client/clientset_generated/clientset:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
],
@ -37,7 +39,7 @@ filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//federation/pkg/typeadapters/crudtester:all-srcs",
"//federation/pkg/federatedtypes/crudtester:all-srcs",
],
tags = ["automanaged"],
)

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
package typeadapters
package federatedtypes
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -29,8 +29,6 @@ import (
// federated type. Code written to this interface can then target any
// type for which an implementation of this interface exists.
type FederatedTypeAdapter interface {
SetClient(client federationclientset.Interface)
Kind() string
ObjectType() pkgruntime.Object
IsExpectedType(obj interface{}) bool
@ -57,3 +55,9 @@ type FederatedTypeAdapter interface {
NewTestObject(namespace string) pkgruntime.Object
}
// AdapterFactory defines the function signature for factory methods
// that create instances of FederatedTypeAdapter. Such methods should
// be registered with RegisterAdapterFactory to ensure the type
// adapter is discoverable.
type AdapterFactory func(client federationclientset.Interface) FederatedTypeAdapter

View File

@ -12,7 +12,7 @@ go_library(
srcs = ["crudtester.go"],
tags = ["automanaged"],
deps = [
"//federation/pkg/typeadapters:go_default_library",
"//federation/pkg/federatedtypes:go_default_library",
"//pkg/client/clientset_generated/clientset:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",

View File

@ -23,7 +23,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
pkgruntime "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/kubernetes/federation/pkg/typeadapters"
"k8s.io/kubernetes/federation/pkg/federatedtypes"
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
)
@ -44,7 +44,7 @@ type TestLogger interface {
// members of a federation.
type FederatedTypeCRUDTester struct {
tl TestLogger
adapter typeadapters.FederatedTypeAdapter
adapter federatedtypes.FederatedTypeAdapter
kind string
clusterClients []clientset.Interface
waitInterval time.Duration
@ -54,7 +54,7 @@ type FederatedTypeCRUDTester struct {
clusterWaitTimeout time.Duration
}
func NewFederatedTypeCRUDTester(testLogger TestLogger, adapter typeadapters.FederatedTypeAdapter, clusterClients []clientset.Interface, waitInterval, clusterWaitTimeout time.Duration) *FederatedTypeCRUDTester {
func NewFederatedTypeCRUDTester(testLogger TestLogger, adapter federatedtypes.FederatedTypeAdapter, clusterClients []clientset.Interface, waitInterval, clusterWaitTimeout time.Duration) *FederatedTypeCRUDTester {
return &FederatedTypeCRUDTester{
tl: testLogger,
adapter: adapter,

View File

@ -0,0 +1,59 @@
/*
Copyright 2017 The Kubernetes 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 federatedtypes
import (
"fmt"
"k8s.io/apimachinery/pkg/runtime/schema"
)
// FederatedType configures federation for a kubernetes type
type FederatedType struct {
Kind string
ControllerName string
RequiredResources []schema.GroupVersionResource
AdapterFactory AdapterFactory
}
var typeRegistry = make(map[string]FederatedType)
// RegisterFederatedType ensures that configuration for the given kind will be returned by the FederatedTypes method.
func RegisterFederatedType(kind, controllerName string, requiredResources []schema.GroupVersionResource, factory AdapterFactory) {
_, ok := typeRegistry[kind]
if ok {
// TODO Is panicking ok given that this is part of a type-registration mechanism
panic(fmt.Sprintf("Federated type %q has already been registered", kind))
}
typeRegistry[kind] = FederatedType{
Kind: kind,
ControllerName: controllerName,
RequiredResources: requiredResources,
AdapterFactory: factory,
}
}
// FederatedTypes returns a mapping of kind (e.g. "secret") to the
// type information required to configure its federation.
func FederatedTypes() map[string]FederatedType {
// TODO copy RequiredResources to avoid accidental mutation
result := make(map[string]FederatedType)
for key, value := range typeRegistry {
result[key] = value
}
return result
}

View File

@ -14,11 +14,12 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
package typeadapters
package federatedtypes
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
pkgruntime "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/watch"
federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset"
@ -27,20 +28,25 @@ import (
kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
)
const (
SecretKind = "secret"
SecretControllerName = "secrets"
)
func init() {
RegisterFederatedType(SecretKind, SecretControllerName, []schema.GroupVersionResource{apiv1.SchemeGroupVersion.WithResource(SecretControllerName)}, NewSecretAdapter)
}
type SecretAdapter struct {
client federationclientset.Interface
}
func NewSecretAdapter(client federationclientset.Interface) *SecretAdapter {
func NewSecretAdapter(client federationclientset.Interface) FederatedTypeAdapter {
return &SecretAdapter{client: client}
}
func (a *SecretAdapter) SetClient(client federationclientset.Interface) {
a.client = client
}
func (a *SecretAdapter) Kind() string {
return "secret"
return SecretKind
}
func (a *SecretAdapter) ObjectType() pkgruntime.Object {

View File

@ -15,19 +15,17 @@ go_library(
deps = [
"//federation/apis/federation/v1beta1:go_default_library",
"//federation/client/clientset_generated/federation_clientset:go_default_library",
"//federation/pkg/federatedtypes:go_default_library",
"//federation/pkg/federation-controller/util:go_default_library",
"//federation/pkg/federation-controller/util/deletionhelper:go_default_library",
"//federation/pkg/federation-controller/util/eventsink:go_default_library",
"//federation/pkg/typeadapters:go_default_library",
"//pkg/api:go_default_library",
"//pkg/api/v1:go_default_library",
"//pkg/client/clientset_generated/clientset:go_default_library",
"//pkg/controller:go_default_library",
"//vendor/github.com/golang/glog:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
"//vendor/k8s.io/client-go/pkg/api/v1:go_default_library",
@ -46,6 +44,7 @@ go_test(
deps = [
"//federation/apis/federation/v1beta1:go_default_library",
"//federation/client/clientset_generated/federation_clientset/fake:go_default_library",
"//federation/pkg/federatedtypes:go_default_library",
"//federation/pkg/federation-controller/util:go_default_library",
"//federation/pkg/federation-controller/util/deletionhelper:go_default_library",
"//federation/pkg/federation-controller/util/test:go_default_library",

View File

@ -24,7 +24,6 @@ import (
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
pkgruntime "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/watch"
clientv1 "k8s.io/client-go/pkg/api/v1"
@ -34,12 +33,11 @@ import (
"k8s.io/client-go/util/flowcontrol"
federationapi "k8s.io/kubernetes/federation/apis/federation/v1beta1"
federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset"
"k8s.io/kubernetes/federation/pkg/federatedtypes"
"k8s.io/kubernetes/federation/pkg/federation-controller/util"
"k8s.io/kubernetes/federation/pkg/federation-controller/util/deletionhelper"
"k8s.io/kubernetes/federation/pkg/federation-controller/util/eventsink"
"k8s.io/kubernetes/federation/pkg/typeadapters"
"k8s.io/kubernetes/pkg/api"
apiv1 "k8s.io/kubernetes/pkg/api/v1"
kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
"k8s.io/kubernetes/pkg/controller"
@ -48,11 +46,6 @@ import (
const (
allClustersKey = "ALL_CLUSTERS"
ControllerName = "secrets"
)
var (
RequiredResources = []schema.GroupVersionResource{apiv1.SchemeGroupVersion.WithResource("secrets")}
)
// FederationSyncController synchronizes the state of a federated type
@ -90,34 +83,24 @@ type FederationSyncController struct {
smallDelay time.Duration
updateTimeout time.Duration
adapter typeadapters.FederatedTypeAdapter
adapter federatedtypes.FederatedTypeAdapter
}
// StartSecretController starts a new secret controller
func StartSecretController(config *restclient.Config, stopChan <-chan struct{}, minimizeLatency bool) {
startFederationSyncController(&typeadapters.SecretAdapter{}, config, stopChan, minimizeLatency)
}
// newSecretController returns a new secret controller
func newSecretController(client federationclientset.Interface) *FederationSyncController {
return newFederationSyncController(client, typeadapters.NewSecretAdapter(client))
}
// startFederationSyncController starts a new sync controller for the given type adapter
func startFederationSyncController(adapter typeadapters.FederatedTypeAdapter, config *restclient.Config, stopChan <-chan struct{}, minimizeLatency bool) {
restclient.AddUserAgent(config, fmt.Sprintf("%s-controller", adapter.Kind()))
// StartFederationSyncController starts a new sync controller for a type adapter
func StartFederationSyncController(kind string, adapterFactory federatedtypes.AdapterFactory, config *restclient.Config, stopChan <-chan struct{}, minimizeLatency bool) {
restclient.AddUserAgent(config, fmt.Sprintf("%s-controller", kind))
client := federationclientset.NewForConfigOrDie(config)
adapter.SetClient(client)
adapter := adapterFactory(client)
controller := newFederationSyncController(client, adapter)
if minimizeLatency {
controller.minimizeLatency()
}
glog.Infof(fmt.Sprintf("Starting federated sync controller for %s resources", adapter.Kind()))
glog.Infof(fmt.Sprintf("Starting federated sync controller for %s resources", kind))
controller.Run(stopChan)
}
// newFederationSyncController returns a new sync controller for the given client and type adapter
func newFederationSyncController(client federationclientset.Interface, adapter typeadapters.FederatedTypeAdapter) *FederationSyncController {
func newFederationSyncController(client federationclientset.Interface, adapter federatedtypes.FederatedTypeAdapter) *FederationSyncController {
broadcaster := record.NewBroadcaster()
broadcaster.StartRecordingToSink(eventsink.NewFederatedEventSink(client))
recorder := broadcaster.NewRecorder(api.Scheme, clientv1.EventSource{Component: fmt.Sprintf("federated-%v-controller", adapter.Kind())})

View File

@ -28,6 +28,7 @@ import (
"k8s.io/apimachinery/pkg/util/wait"
federationapi "k8s.io/kubernetes/federation/apis/federation/v1beta1"
fakefedclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset/fake"
"k8s.io/kubernetes/federation/pkg/federatedtypes"
"k8s.io/kubernetes/federation/pkg/federation-controller/util"
"k8s.io/kubernetes/federation/pkg/federation-controller/util/deletionhelper"
. "k8s.io/kubernetes/federation/pkg/federation-controller/util/test"
@ -66,7 +67,7 @@ func TestSecretController(t *testing.T) {
RegisterFakeList(secrets, &cluster2Client.Fake, &apiv1.SecretList{Items: []apiv1.Secret{}})
cluster2CreateChan := RegisterFakeCopyOnCreate(secrets, &cluster2Client.Fake, cluster2Watch)
secretController := newSecretController(fakeClient)
secretController := newFederationSyncController(fakeClient, federatedtypes.NewSecretAdapter(fakeClient))
informerClientFactory := func(cluster *federationapi.Cluster) (kubeclientset.Interface, error) {
switch cluster.Name {
case cluster1.Name:

View File

@ -16,6 +16,7 @@ go_test(
tags = ["automanaged"],
deps = [
"//federation/apis/federation/v1beta1:go_default_library",
"//federation/pkg/federatedtypes:go_default_library",
"//pkg/api/v1:go_default_library",
"//pkg/apis/autoscaling/v1:go_default_library",
"//pkg/apis/batch/v1:go_default_library",

View File

@ -17,10 +17,12 @@ limitations under the License.
package federation
import (
"fmt"
"testing"
"github.com/pborman/uuid"
"k8s.io/kubernetes/federation/pkg/federatedtypes"
"k8s.io/kubernetes/test/integration/federation/framework"
)
@ -30,15 +32,16 @@ func TestFederationCRUD(t *testing.T) {
fedFixture.SetUp(t)
defer fedFixture.TearDown(t)
controllerFixtures := []framework.ControllerFixture{
&framework.SecretFixture{},
}
for _, fixture := range controllerFixtures {
t.Run(fixture.Kind(), func(t *testing.T) {
framework.SetUpControllerFixture(t, fedFixture.APIFixture, fixture)
federatedTypes := federatedtypes.FederatedTypes()
for kind, fedType := range federatedTypes {
t.Run(kind, func(t *testing.T) {
config := fedFixture.APIFixture.NewConfig()
fixture := framework.NewControllerFixture(t, kind, fedType.AdapterFactory, config)
defer fixture.TearDown(t)
adapter := fixture.Adapter()
client := fedFixture.APIFixture.NewClient(fmt.Sprintf("crud-test-%s", kind))
adapter := fedType.AdapterFactory(client)
crudtester := framework.NewFederatedTypeCRUDTester(t, adapter, fedFixture.ClusterClients)
obj := adapter.NewTestObject(uuid.New())
crudtester.CheckLifecycle(obj)
@ -52,13 +55,17 @@ func TestFederationCRUD(t *testing.T) {
"Resources should not be deleted from underlying clusters when OrphanDependents is true": &orphanedDependents,
"Resources should not be deleted from underlying clusters when OrphanDependents is nil": nil,
}
kind := federatedtypes.SecretKind
adapterFactory := federatedtypes.NewSecretAdapter
for testName, orphanDependents := range testCases {
t.Run(testName, func(t *testing.T) {
fixture := &framework.SecretFixture{}
framework.SetUpControllerFixture(t, fedFixture.APIFixture, fixture)
config := fedFixture.APIFixture.NewConfig()
fixture := framework.NewControllerFixture(t, kind, adapterFactory, config)
defer fixture.TearDown(t)
adapter := fixture.Adapter()
client := fedFixture.APIFixture.NewClient(fmt.Sprintf("deletion-test-%s", kind))
adapter := adapterFactory(client)
crudtester := framework.NewFederatedTypeCRUDTester(t, adapter, fedFixture.ClusterClients)
obj := adapter.NewTestObject(uuid.New())
updatedObj := crudtester.CheckCreate(obj)

View File

@ -14,7 +14,6 @@ go_library(
"controller.go",
"crudtester.go",
"federation.go",
"secret.go",
"util.go",
],
tags = ["automanaged"],
@ -23,10 +22,10 @@ go_library(
"//federation/client/clientset_generated/federation_clientset:go_default_library",
"//federation/cmd/federation-apiserver/app:go_default_library",
"//federation/cmd/federation-apiserver/app/options:go_default_library",
"//federation/pkg/federatedtypes:go_default_library",
"//federation/pkg/federatedtypes/crudtester:go_default_library",
"//federation/pkg/federation-controller/cluster:go_default_library",
"//federation/pkg/federation-controller/secret:go_default_library",
"//federation/pkg/typeadapters:go_default_library",
"//federation/pkg/typeadapters/crudtester:go_default_library",
"//pkg/client/clientset_generated/clientset:go_default_library",
"//pkg/master:go_default_library",
"//test/integration/framework:go_default_library",

View File

@ -17,30 +17,28 @@ limitations under the License.
package framework
import (
"fmt"
"testing"
restclient "k8s.io/client-go/rest"
federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset"
"k8s.io/kubernetes/federation/pkg/typeadapters"
"k8s.io/kubernetes/federation/pkg/federatedtypes"
secretcontroller "k8s.io/kubernetes/federation/pkg/federation-controller/secret"
)
// ControllerFixture defines operations for managing a federation
// controller. Tests written to this interface can then target any
// controller for which an implementation of this interface exists.
type ControllerFixture interface {
TestFixture
SetUp(t *testing.T, testClient federationclientset.Interface, config *restclient.Config)
Kind() string
Adapter() typeadapters.FederatedTypeAdapter
// ControllerFixture manages a federation controller for testing.
type ControllerFixture struct {
stopChan chan struct{}
}
// SetUpControllerFixture configures the given resource fixture to target the provided api fixture
func SetUpControllerFixture(t *testing.T, apiFixture *FederationAPIFixture, controllerFixture ControllerFixture) {
client := apiFixture.NewClient(fmt.Sprintf("test-%s", controllerFixture.Kind()))
config := apiFixture.NewConfig()
controllerFixture.SetUp(t, client, config)
// NewControllerFixture initializes a new controller fixture
func NewControllerFixture(t *testing.T, kind string, adapterFactory federatedtypes.AdapterFactory, config *restclient.Config) *ControllerFixture {
f := &ControllerFixture{
stopChan: make(chan struct{}),
}
// TODO the generic controller doesn't belong in the secretcontroller package
secretcontroller.StartFederationSyncController(kind, adapterFactory, config, f.stopChan, true)
return f
}
func (f *ControllerFixture) TearDown(t *testing.T) {
close(f.stopChan)
}

View File

@ -20,8 +20,8 @@ import (
"testing"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/kubernetes/federation/pkg/typeadapters"
"k8s.io/kubernetes/federation/pkg/typeadapters/crudtester"
"k8s.io/kubernetes/federation/pkg/federatedtypes"
"k8s.io/kubernetes/federation/pkg/federatedtypes/crudtester"
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
)
@ -41,7 +41,7 @@ func (l *IntegrationLogger) Fatal(msg string) {
l.t.Fatal(msg)
}
func NewFederatedTypeCRUDTester(t *testing.T, adapter typeadapters.FederatedTypeAdapter, clusterClients []clientset.Interface) *crudtester.FederatedTypeCRUDTester {
func NewFederatedTypeCRUDTester(t *testing.T, adapter federatedtypes.FederatedTypeAdapter, clusterClients []clientset.Interface) *crudtester.FederatedTypeCRUDTester {
logger := &IntegrationLogger{t}
return crudtester.NewFederatedTypeCRUDTester(logger, adapter, clusterClients, DefaultWaitInterval, wait.ForeverTestTimeout)
}

View File

@ -1,49 +0,0 @@
/*
Copyright 2017 The Kubernetes 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 framework
import (
"testing"
restclient "k8s.io/client-go/rest"
federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset"
secretcontroller "k8s.io/kubernetes/federation/pkg/federation-controller/secret"
"k8s.io/kubernetes/federation/pkg/typeadapters"
)
type SecretFixture struct {
adapter *typeadapters.SecretAdapter
stopChan chan struct{}
}
func (f *SecretFixture) SetUp(t *testing.T, client federationclientset.Interface, config *restclient.Config) {
f.adapter = typeadapters.NewSecretAdapter(client)
f.stopChan = make(chan struct{})
secretcontroller.StartSecretController(config, f.stopChan, true)
}
func (f *SecretFixture) TearDown(t *testing.T) {
close(f.stopChan)
}
func (f *SecretFixture) Kind() string {
adapter := &typeadapters.SecretAdapter{}
return adapter.Kind()
}
func (f *SecretFixture) Adapter() typeadapters.FederatedTypeAdapter {
return f.adapter
}