Skip to content

Commit 07ec3d2

Browse files
Merge pull request #15672 from deads2k/tsb-06-separate
Automatic merge from submit-queue Run the TSB in a separate pod This completes the work necessary to run the TSB in a pod. We should continue to remove the cruft from the old path, but I've included a template which creates a running TSB server in the `openshift-template-service-broker` namespace. @bparees @jim-minter
2 parents 423e664 + edda314 commit 07ec3d2

File tree

6 files changed

+149
-92
lines changed

6 files changed

+149
-92
lines changed

contrib/completions/bash/openshift

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -38516,30 +38516,8 @@ _openshift_start_template-service-broker()
3851638516
local_nonpersistent_flags+=("--client-ca-file=")
3851738517
flags+=("--contention-profiling")
3851838518
local_nonpersistent_flags+=("--contention-profiling")
38519-
flags+=("--delete-collection-workers=")
38520-
local_nonpersistent_flags+=("--delete-collection-workers=")
38521-
flags+=("--deserialization-cache-size=")
38522-
local_nonpersistent_flags+=("--deserialization-cache-size=")
38523-
flags+=("--enable-garbage-collector")
38524-
local_nonpersistent_flags+=("--enable-garbage-collector")
3852538519
flags+=("--enable-swagger-ui")
3852638520
local_nonpersistent_flags+=("--enable-swagger-ui")
38527-
flags+=("--etcd-cafile=")
38528-
local_nonpersistent_flags+=("--etcd-cafile=")
38529-
flags+=("--etcd-certfile=")
38530-
local_nonpersistent_flags+=("--etcd-certfile=")
38531-
flags+=("--etcd-keyfile=")
38532-
local_nonpersistent_flags+=("--etcd-keyfile=")
38533-
flags+=("--etcd-prefix=")
38534-
local_nonpersistent_flags+=("--etcd-prefix=")
38535-
flags+=("--etcd-quorum-read")
38536-
local_nonpersistent_flags+=("--etcd-quorum-read")
38537-
flags+=("--etcd-servers=")
38538-
local_nonpersistent_flags+=("--etcd-servers=")
38539-
flags+=("--etcd-servers-overrides=")
38540-
local_nonpersistent_flags+=("--etcd-servers-overrides=")
38541-
flags+=("--experimental-encryption-provider-config=")
38542-
local_nonpersistent_flags+=("--experimental-encryption-provider-config=")
3854338521
flags+=("--profiling")
3854438522
local_nonpersistent_flags+=("--profiling")
3854538523
flags+=("--requestheader-allowed-names=")
@@ -38554,10 +38532,6 @@ _openshift_start_template-service-broker()
3855438532
local_nonpersistent_flags+=("--requestheader-username-headers=")
3855538533
flags+=("--secure-port=")
3855638534
local_nonpersistent_flags+=("--secure-port=")
38557-
flags+=("--storage-backend=")
38558-
local_nonpersistent_flags+=("--storage-backend=")
38559-
flags+=("--storage-media-type=")
38560-
local_nonpersistent_flags+=("--storage-media-type=")
3856138535
flags+=("--template-namespace=")
3856238536
local_nonpersistent_flags+=("--template-namespace=")
3856338537
flags+=("--tls-ca-file=")
@@ -38568,8 +38542,6 @@ _openshift_start_template-service-broker()
3856838542
local_nonpersistent_flags+=("--tls-private-key-file=")
3856938543
flags+=("--tls-sni-cert-key=")
3857038544
local_nonpersistent_flags+=("--tls-sni-cert-key=")
38571-
flags+=("--watch-cache")
38572-
local_nonpersistent_flags+=("--watch-cache")
3857338545
flags+=("--azure-container-registry-config=")
3857438546
flags+=("--google-json-key=")
3857538547
flags+=("--log-flush-frequency=")

contrib/completions/zsh/openshift

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -38665,30 +38665,8 @@ _openshift_start_template-service-broker()
3866538665
local_nonpersistent_flags+=("--client-ca-file=")
3866638666
flags+=("--contention-profiling")
3866738667
local_nonpersistent_flags+=("--contention-profiling")
38668-
flags+=("--delete-collection-workers=")
38669-
local_nonpersistent_flags+=("--delete-collection-workers=")
38670-
flags+=("--deserialization-cache-size=")
38671-
local_nonpersistent_flags+=("--deserialization-cache-size=")
38672-
flags+=("--enable-garbage-collector")
38673-
local_nonpersistent_flags+=("--enable-garbage-collector")
3867438668
flags+=("--enable-swagger-ui")
3867538669
local_nonpersistent_flags+=("--enable-swagger-ui")
38676-
flags+=("--etcd-cafile=")
38677-
local_nonpersistent_flags+=("--etcd-cafile=")
38678-
flags+=("--etcd-certfile=")
38679-
local_nonpersistent_flags+=("--etcd-certfile=")
38680-
flags+=("--etcd-keyfile=")
38681-
local_nonpersistent_flags+=("--etcd-keyfile=")
38682-
flags+=("--etcd-prefix=")
38683-
local_nonpersistent_flags+=("--etcd-prefix=")
38684-
flags+=("--etcd-quorum-read")
38685-
local_nonpersistent_flags+=("--etcd-quorum-read")
38686-
flags+=("--etcd-servers=")
38687-
local_nonpersistent_flags+=("--etcd-servers=")
38688-
flags+=("--etcd-servers-overrides=")
38689-
local_nonpersistent_flags+=("--etcd-servers-overrides=")
38690-
flags+=("--experimental-encryption-provider-config=")
38691-
local_nonpersistent_flags+=("--experimental-encryption-provider-config=")
3869238670
flags+=("--profiling")
3869338671
local_nonpersistent_flags+=("--profiling")
3869438672
flags+=("--requestheader-allowed-names=")
@@ -38703,10 +38681,6 @@ _openshift_start_template-service-broker()
3870338681
local_nonpersistent_flags+=("--requestheader-username-headers=")
3870438682
flags+=("--secure-port=")
3870538683
local_nonpersistent_flags+=("--secure-port=")
38706-
flags+=("--storage-backend=")
38707-
local_nonpersistent_flags+=("--storage-backend=")
38708-
flags+=("--storage-media-type=")
38709-
local_nonpersistent_flags+=("--storage-media-type=")
3871038684
flags+=("--template-namespace=")
3871138685
local_nonpersistent_flags+=("--template-namespace=")
3871238686
flags+=("--tls-ca-file=")
@@ -38717,8 +38691,6 @@ _openshift_start_template-service-broker()
3871738691
local_nonpersistent_flags+=("--tls-private-key-file=")
3871838692
flags+=("--tls-sni-cert-key=")
3871938693
local_nonpersistent_flags+=("--tls-sni-cert-key=")
38720-
flags+=("--watch-cache")
38721-
local_nonpersistent_flags+=("--watch-cache")
3872238694
flags+=("--azure-container-registry-config=")
3872338695
flags+=("--google-json-key=")
3872438696
flags+=("--log-flush-frequency=")

pkg/cmd/server/origin/master.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ func (c *MasterConfig) newOpenshiftNonAPIConfig(kubeAPIServerConfig apiserver.Co
9797
func (c *MasterConfig) newTemplateServiceBrokerConfig(kubeAPIServerConfig apiserver.Config) *openservicebrokerserver.TemplateServiceBrokerConfig {
9898
ret := &openservicebrokerserver.TemplateServiceBrokerConfig{
9999
GenericConfig: &kubeAPIServerConfig,
100-
PrivilegedKubeClientConfig: *kubeAPIServerConfig.LoopbackClientConfig,
100+
PrivilegedKubeClientConfig: kubeAPIServerConfig.LoopbackClientConfig,
101101
TemplateInformers: c.TemplateInformers,
102102
TemplateNamespaces: c.Options.TemplateServiceBrokerConfig.TemplateNamespaces,
103103
}

pkg/openservicebroker/cmd/server/start.go

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,13 @@ import (
1313
"github.com/openshift/origin/pkg/openservicebroker/server"
1414
)
1515

16-
const defaultEtcdPathPrefix = "/registry/templateservicebroker.openshift.io"
17-
1816
type TemplateServiceBrokerServerOptions struct {
19-
RecommendedOptions *genericoptions.RecommendedOptions
17+
// we don't have any storage, so we shouldn't use the recommended options
18+
SecureServing *genericoptions.SecureServingOptions
19+
Authentication *genericoptions.DelegatingAuthenticationOptions
20+
Authorization *genericoptions.DelegatingAuthorizationOptions
21+
Audit *genericoptions.AuditOptions
22+
Features *genericoptions.FeatureOptions
2023

2124
StdOut io.Writer
2225
StdErr io.Writer
@@ -26,7 +29,11 @@ type TemplateServiceBrokerServerOptions struct {
2629

2730
func NewTemplateServiceBrokerServerOptions(out, errOut io.Writer) *TemplateServiceBrokerServerOptions {
2831
o := &TemplateServiceBrokerServerOptions{
29-
RecommendedOptions: genericoptions.NewRecommendedOptions(defaultEtcdPathPrefix, server.Scheme, server.Codecs.LegacyCodec()),
32+
SecureServing: genericoptions.NewSecureServingOptions(),
33+
Authentication: genericoptions.NewDelegatingAuthenticationOptions(),
34+
Authorization: genericoptions.NewDelegatingAuthorizationOptions(),
35+
Audit: genericoptions.NewAuditOptions(),
36+
Features: genericoptions.NewFeatureOptions(),
3037

3138
StdOut: out,
3239
StdErr: errOut,
@@ -57,7 +64,11 @@ func NewCommandStartTemplateServiceBrokerServer(out, errOut io.Writer, stopCh <-
5764
}
5865

5966
flags := cmd.Flags()
60-
o.RecommendedOptions.AddFlags(flags)
67+
o.SecureServing.AddFlags(flags)
68+
o.Authentication.AddFlags(flags)
69+
o.Authorization.AddFlags(flags)
70+
o.Audit.AddFlags(flags)
71+
o.Features.AddFlags(flags)
6172
flags.StringSliceVar(&o.TemplateNamespaces, "template-namespace", o.TemplateNamespaces, "TemplateNamespaces indicates the namespace(s) in which the template service broker looks for templates to serve to the catalog.")
6273

6374
return cmd
@@ -73,12 +84,24 @@ func (o *TemplateServiceBrokerServerOptions) Complete() error {
7384

7485
func (o TemplateServiceBrokerServerOptions) Config() (*server.TemplateServiceBrokerConfig, error) {
7586
// TODO have a "real" external address
76-
if err := o.RecommendedOptions.SecureServing.MaybeDefaultWithSelfSignedCerts("localhost", nil, []net.IP{net.ParseIP("127.0.0.1")}); err != nil {
87+
if err := o.SecureServing.MaybeDefaultWithSelfSignedCerts("localhost", nil, []net.IP{net.ParseIP("127.0.0.1")}); err != nil {
7788
return nil, fmt.Errorf("error creating self-signed certificates: %v", err)
7889
}
7990

8091
serverConfig := genericapiserver.NewConfig(server.Codecs)
81-
if err := o.RecommendedOptions.ApplyTo(serverConfig); err != nil {
92+
if err := o.SecureServing.ApplyTo(serverConfig); err != nil {
93+
return nil, err
94+
}
95+
if err := o.Authentication.ApplyTo(serverConfig); err != nil {
96+
return nil, err
97+
}
98+
if err := o.Authorization.ApplyTo(serverConfig); err != nil {
99+
return nil, err
100+
}
101+
if err := o.Audit.ApplyTo(serverConfig); err != nil {
102+
return nil, err
103+
}
104+
if err := o.Features.ApplyTo(serverConfig); err != nil {
82105
return nil, err
83106
}
84107

pkg/openservicebroker/server/apiserver.go

Lines changed: 77 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@ import (
1515
"k8s.io/apimachinery/pkg/util/wait"
1616
genericapiserver "k8s.io/apiserver/pkg/server"
1717
restclient "k8s.io/client-go/rest"
18+
"k8s.io/client-go/tools/cache"
1819
"k8s.io/kubernetes/pkg/api"
1920
kclientsetinternal "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
21+
"k8s.io/kubernetes/pkg/controller"
2022

2123
"github.com/openshift/origin/pkg/cmd/server/bootstrappolicy"
2224
templateapi "github.com/openshift/origin/pkg/template/apis/template"
2325
templateinformer "github.com/openshift/origin/pkg/template/generated/informers/internalversion"
26+
templateinternalclientset "github.com/openshift/origin/pkg/template/generated/internalclientset"
2427
templateservicebroker "github.com/openshift/origin/pkg/template/servicebroker"
2528
)
2629

@@ -51,7 +54,7 @@ type TemplateServiceBrokerConfig struct {
5154

5255
// PrivilegedKubeClientConfig is *not* a loopback config, since it needs to point to the kube apiserver
5356
// TODO remove this and use the SA that start us instead of trying to cyclically find an SA token
54-
PrivilegedKubeClientConfig restclient.Config
57+
PrivilegedKubeClientConfig *restclient.Config
5558

5659
TemplateInformers templateinformer.SharedInformerFactory
5760
TemplateNamespaces []string
@@ -87,11 +90,55 @@ func (c completedTemplateServiceBrokerConfig) New(delegationTarget genericapiser
8790
GenericAPIServer: genericServer,
8891
}
8992

90-
broker := templateservicebroker.DeprecatedNewBrokerInsideAPIServer(
91-
c.PrivilegedKubeClientConfig,
92-
c.TemplateInformers.Template().InternalVersion().Templates(),
93-
c.TemplateNamespaces,
94-
)
93+
inCluster := false
94+
var broker *templateservicebroker.Broker
95+
// TODO, this block drops out after the server is moved.
96+
if c.PrivilegedKubeClientConfig != nil {
97+
broker = templateservicebroker.DeprecatedNewBrokerInsideAPIServer(
98+
*c.PrivilegedKubeClientConfig,
99+
c.TemplateInformers.Template().InternalVersion().Templates(),
100+
c.TemplateNamespaces,
101+
)
102+
// make sure no one else uses it
103+
c.TemplateInformers = nil
104+
105+
} else {
106+
// we're running in cluster
107+
// in this case we actually want to construct our own template informer
108+
// eventually the config value drops out as it isn't supported server side
109+
inCluster = true
110+
clientConfig, err := restclient.InClusterConfig()
111+
if err != nil {
112+
return nil, err
113+
}
114+
templateClient, err := templateinternalclientset.NewForConfig(clientConfig)
115+
if err != nil {
116+
return nil, err
117+
}
118+
templateInformers := templateinformer.NewSharedInformerFactory(templateClient, 5*time.Minute)
119+
templateInformers.Template().InternalVersion().Templates().Informer().AddIndexers(cache.Indexers{
120+
templateapi.TemplateUIDIndex: func(obj interface{}) ([]string, error) {
121+
return []string{string(obj.(*templateapi.Template).UID)}, nil
122+
},
123+
})
124+
125+
broker, err = templateservicebroker.NewBroker(
126+
clientConfig,
127+
templateInformers.Template().InternalVersion().Templates(),
128+
c.TemplateNamespaces,
129+
)
130+
if err != nil {
131+
return nil, err
132+
}
133+
134+
s.GenericAPIServer.AddPostStartHook("template-service-broker-synctemplates", func(context genericapiserver.PostStartHookContext) error {
135+
templateInformers.Start(context.StopCh)
136+
if !controller.WaitForCacheSync("tsb", context.StopCh, templateInformers.Template().InternalVersion().Templates().Informer().HasSynced) {
137+
return fmt.Errorf("unable to sync caches")
138+
}
139+
return nil
140+
})
141+
}
95142

96143
Route(
97144
s.GenericAPIServer.Handler.GoRestfulContainer,
@@ -100,32 +147,34 @@ func (c completedTemplateServiceBrokerConfig) New(delegationTarget genericapiser
100147
)
101148

102149
// TODO, when the TSB becomes a separate entity, this should stop creating the SA and use its container pod SA identity instead
103-
s.GenericAPIServer.AddPostStartHook("template-service-broker-ensure-service-account", func(context genericapiserver.PostStartHookContext) error {
104-
kc, err := kclientsetinternal.NewForConfig(context.LoopbackClientConfig)
105-
if err != nil {
106-
utilruntime.HandleError(fmt.Errorf("template service broker: failed to get client: %v", err))
107-
return err
108-
}
150+
if !inCluster {
151+
s.GenericAPIServer.AddPostStartHook("template-service-broker-ensure-service-account", func(context genericapiserver.PostStartHookContext) error {
152+
kc, err := kclientsetinternal.NewForConfig(context.LoopbackClientConfig)
153+
if err != nil {
154+
utilruntime.HandleError(fmt.Errorf("template service broker: failed to get client: %v", err))
155+
return err
156+
}
109157

110-
err = wait.PollImmediate(time.Second, 30*time.Second, func() (done bool, err error) {
111-
kc.Namespaces().Create(&api.Namespace{ObjectMeta: metav1.ObjectMeta{Name: bootstrappolicy.DefaultOpenShiftInfraNamespace}})
158+
err = wait.PollImmediate(time.Second, 30*time.Second, func() (done bool, err error) {
159+
kc.Namespaces().Create(&api.Namespace{ObjectMeta: metav1.ObjectMeta{Name: bootstrappolicy.DefaultOpenShiftInfraNamespace}})
112160

113-
_, err = kc.ServiceAccounts(bootstrappolicy.DefaultOpenShiftInfraNamespace).Create(&api.ServiceAccount{ObjectMeta: metav1.ObjectMeta{Name: bootstrappolicy.InfraTemplateServiceBrokerServiceAccountName}})
114-
switch {
115-
case err == nil || kapierrors.IsAlreadyExists(err):
116-
done, err = true, nil
117-
case kapierrors.IsNotFound(err):
118-
err = nil
119-
}
161+
_, err = kc.ServiceAccounts(bootstrappolicy.DefaultOpenShiftInfraNamespace).Create(&api.ServiceAccount{ObjectMeta: metav1.ObjectMeta{Name: bootstrappolicy.InfraTemplateServiceBrokerServiceAccountName}})
162+
switch {
163+
case err == nil || kapierrors.IsAlreadyExists(err):
164+
done, err = true, nil
165+
case kapierrors.IsNotFound(err):
166+
err = nil
167+
}
120168

121-
return
122-
})
169+
return
170+
})
123171

124-
if err != nil {
125-
utilruntime.HandleError(fmt.Errorf("creation of template-service-broker SA failed: %v", err))
126-
}
127-
return err
128-
})
172+
if err != nil {
173+
utilruntime.HandleError(fmt.Errorf("creation of template-service-broker SA failed: %v", err))
174+
}
175+
return err
176+
})
177+
}
129178

130179
return s, nil
131180
}

pkg/template/servicebroker/servicebroker.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,47 @@ func DeprecatedNewBrokerInsideAPIServer(privilegedKubeClientConfig restclient.Co
6464
return b
6565
}
6666

67+
func NewBroker(saKubeClientConfig *restclient.Config, informer templateinformer.TemplateInformer, namespaces []string) (*Broker, error) {
68+
templateNamespaces := map[string]struct{}{}
69+
for _, namespace := range namespaces {
70+
templateNamespaces[namespace] = struct{}{}
71+
}
72+
73+
internalKubeClient, err := kclientset.NewForConfig(saKubeClientConfig)
74+
if err != nil {
75+
return nil, err
76+
}
77+
externalKubeClient, err := kclientsetexternal.NewForConfig(saKubeClientConfig)
78+
if err != nil {
79+
return nil, err
80+
}
81+
extrouteclientset, err := extrouteclientset.NewForConfig(saKubeClientConfig)
82+
if err != nil {
83+
return nil, err
84+
}
85+
templateClient, err := templateclientset.NewForConfig(saKubeClientConfig)
86+
if err != nil {
87+
return nil, err
88+
}
89+
90+
b := &Broker{
91+
kc: internalKubeClient,
92+
extkc: externalKubeClient,
93+
extrouteclient: extrouteclientset,
94+
templateclient: templateClient.Template(),
95+
lister: informer.Lister(),
96+
hasSynced: informer.Informer().HasSynced,
97+
templateNamespaces: templateNamespaces,
98+
ready: make(chan struct{}),
99+
}
100+
101+
// TODO this is an intermediate state. Once we're out of tree, there won't be a ready
102+
// for now, this skips the hassynced on the lister since we'll be managing that as a poststarthook
103+
close(b.ready)
104+
105+
return b, nil
106+
}
107+
67108
// MakeReady actually makes the broker functional
68109
func (b *Broker) MakeReady() error {
69110
select {

0 commit comments

Comments
 (0)