|
1 | 1 | package server
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "fmt" |
| 5 | + "time" |
| 6 | + |
| 7 | + kapierrors "k8s.io/apimachinery/pkg/api/errors" |
| 8 | + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |
| 9 | + utilruntime "k8s.io/apimachinery/pkg/util/runtime" |
| 10 | + "k8s.io/apimachinery/pkg/util/wait" |
| 11 | + genericapiserver "k8s.io/apiserver/pkg/server" |
| 12 | + "k8s.io/kubernetes/pkg/api" |
4 | 13 | kclientsetinternal "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
|
5 | 14 |
|
6 | 15 | "github.com/openshift/origin/pkg/cmd/server/bootstrappolicy"
|
7 | 16 | templateapi "github.com/openshift/origin/pkg/template/apis/template"
|
8 | 17 | templateinformer "github.com/openshift/origin/pkg/template/generated/informers/internalversion"
|
9 | 18 | templateservicebroker "github.com/openshift/origin/pkg/template/servicebroker"
|
10 |
| - genericapiserver "k8s.io/apiserver/pkg/server" |
11 | 19 | )
|
12 | 20 |
|
| 21 | +// TODO: this file breaks the layering of pkg/openservicebroker and |
| 22 | +// pkg/template/servicebroker; assuming that the latter will move out of origin |
| 23 | +// in 3.7, will leave as is for now. |
| 24 | + |
13 | 25 | type TemplateServiceBrokerConfig struct {
|
14 | 26 | GenericConfig *genericapiserver.Config
|
15 | 27 |
|
@@ -62,9 +74,30 @@ func (c completedTemplateServiceBrokerConfig) New(delegationTarget genericapiser
|
62 | 74 |
|
63 | 75 | // TODO, when/if the TSB becomes a separate entity, this should stop creating the SA and instead die if it cannot find it
|
64 | 76 | s.GenericAPIServer.AddPostStartHook("template-service-broker-ensure-service-account", func(context genericapiserver.PostStartHookContext) error {
|
65 |
| - // TODO jim-minter - this is the spot to create the namespace if needed and create the SA if needed. |
66 |
| - // be tolerant of failures and retry a few times. |
67 |
| - return nil |
| 77 | + kc, err := kclientsetinternal.NewForConfig(context.LoopbackClientConfig) |
| 78 | + if err != nil { |
| 79 | + utilruntime.HandleError(fmt.Errorf("template service broker: failed to get client: %v", err)) |
| 80 | + return err |
| 81 | + } |
| 82 | + |
| 83 | + err = wait.PollImmediate(time.Second, 30*time.Second, func() (done bool, err error) { |
| 84 | + kc.Namespaces().Create(&api.Namespace{ObjectMeta: metav1.ObjectMeta{Name: bootstrappolicy.DefaultOpenShiftInfraNamespace}}) |
| 85 | + |
| 86 | + _, err = kc.ServiceAccounts(bootstrappolicy.DefaultOpenShiftInfraNamespace).Create(&api.ServiceAccount{ObjectMeta: metav1.ObjectMeta{Name: bootstrappolicy.InfraTemplateServiceBrokerServiceAccountName}}) |
| 87 | + switch { |
| 88 | + case err == nil || kapierrors.IsAlreadyExists(err): |
| 89 | + done, err = true, nil |
| 90 | + case kapierrors.IsNotFound(err): |
| 91 | + err = nil |
| 92 | + } |
| 93 | + |
| 94 | + return |
| 95 | + }) |
| 96 | + |
| 97 | + if err != nil { |
| 98 | + utilruntime.HandleError(fmt.Errorf("creation of template-service-broker SA failed: %v", err)) |
| 99 | + } |
| 100 | + return err |
68 | 101 | })
|
69 | 102 |
|
70 | 103 | return s, nil
|
|
0 commit comments