Skip to content

Commit 6b57076

Browse files
Merge pull request #18 from deads2k/tsb-01-detection
console autodetection
2 parents c1fca03 + 6555bed commit 6b57076

File tree

2 files changed

+73
-10
lines changed

2 files changed

+73
-10
lines changed

pkg/assets/apiserver/asset_apiserver.go

Lines changed: 65 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package apiserver
22

33
import (
4+
"encoding/json"
45
"net/http"
56
"net/url"
67
"path"
@@ -14,6 +15,7 @@ import (
1415
"k8s.io/apimachinery/pkg/runtime"
1516
"k8s.io/apimachinery/pkg/runtime/schema"
1617
"k8s.io/apimachinery/pkg/runtime/serializer"
18+
"k8s.io/apimachinery/pkg/version"
1719
genericapifilters "k8s.io/apiserver/pkg/endpoints/filters"
1820
apirequest "k8s.io/apiserver/pkg/endpoints/request"
1921
"k8s.io/apiserver/pkg/features"
@@ -22,11 +24,14 @@ import (
2224
genericfilters "k8s.io/apiserver/pkg/server/filters"
2325
genericmux "k8s.io/apiserver/pkg/server/mux"
2426
utilfeature "k8s.io/apiserver/pkg/util/feature"
27+
restclient "k8s.io/client-go/rest"
2528

2629
"github.com/openshift/api/webconsole/v1"
2730
"github.com/openshift/origin-web-console-server/pkg/assets"
2831
"github.com/openshift/origin-web-console-server/pkg/assets/java"
29-
"github.com/openshift/origin-web-console-server/pkg/version"
32+
builtversion "github.com/openshift/origin-web-console-server/pkg/version"
33+
"k8s.io/apimachinery/pkg/api/errors"
34+
"k8s.io/client-go/kubernetes"
3035
)
3136

3237
var (
@@ -60,6 +65,10 @@ const (
6065
type ExtraConfig struct {
6166
Options v1.WebConsoleConfiguration
6267
PublicURL url.URL
68+
69+
KubeVersion string
70+
OpenShiftVersion string
71+
TemplateServiceBrokerEnabled *bool
6372
}
6473

6574
type AssetServerConfig struct {
@@ -76,7 +85,12 @@ type AssetServer struct {
7685

7786
type completedConfig struct {
7887
GenericConfig genericapiserver.CompletedConfig
79-
ExtraConfig *ExtraConfig
88+
89+
// ClientConfig holds the kubernetes client configuration.
90+
// This value is set by RecommendedOptions.CoreAPI.ApplyTo called by RecommendedOptions.ApplyTo.
91+
// By default in-cluster client config is used.
92+
ClientConfig *restclient.Config
93+
ExtraConfig *ExtraConfig
8094
}
8195

8296
type CompletedConfig struct {
@@ -104,13 +118,57 @@ func NewAssetServerConfig(assetConfig v1.WebConsoleConfiguration) (*AssetServerC
104118
}
105119

106120
// Complete fills in any fields not set that are required to have valid data. It's mutating the receiver.
107-
func (c *AssetServerConfig) Complete() completedConfig {
121+
func (c *AssetServerConfig) Complete() (completedConfig, error) {
108122
cfg := completedConfig{
109123
c.GenericConfig.Complete(),
124+
c.GenericConfig.ClientConfig,
110125
&c.ExtraConfig,
111126
}
112127

113-
return cfg
128+
// In order to build the asset server, we need information that we can only retrieve from the master.
129+
// We do this once during construction at the moment, but a clever person could set up a watch or poll technique
130+
// to dynamically reload these bits of config without having the pod restart.
131+
restClient, err := kubernetes.NewForConfig(c.GenericConfig.ClientConfig)
132+
if err != nil {
133+
return completedConfig{}, err
134+
}
135+
if len(cfg.ExtraConfig.KubeVersion) == 0 {
136+
resultBytes, err := restClient.RESTClient().Get().AbsPath("/version").Do().Raw()
137+
if err != nil {
138+
return completedConfig{}, err
139+
}
140+
kubeVersion := &version.Info{}
141+
if err := json.Unmarshal(resultBytes, kubeVersion); err != nil {
142+
return completedConfig{}, err
143+
}
144+
cfg.ExtraConfig.KubeVersion = kubeVersion.GitVersion
145+
}
146+
if len(cfg.ExtraConfig.OpenShiftVersion) == 0 {
147+
resultBytes, err := restClient.RESTClient().Get().AbsPath("/version/openshift").Do().Raw()
148+
if err != nil {
149+
return completedConfig{}, err
150+
}
151+
openshiftVersion := &version.Info{}
152+
if err := json.Unmarshal(resultBytes, openshiftVersion); err != nil {
153+
return completedConfig{}, err
154+
}
155+
cfg.ExtraConfig.OpenShiftVersion = openshiftVersion.GitVersion
156+
}
157+
if cfg.ExtraConfig.TemplateServiceBrokerEnabled == nil {
158+
enabled := false
159+
_, err := restClient.RESTClient().Get().AbsPath("/apis/servicecatalog.k8s.io/v1beta1/clusterservicebrokers/template-service-broker").Do().Raw()
160+
if err == nil {
161+
enabled = true
162+
} else if errors.IsNotFound(err) {
163+
enabled = false
164+
} else {
165+
return completedConfig{}, err
166+
}
167+
168+
cfg.ExtraConfig.TemplateServiceBrokerEnabled = &enabled
169+
}
170+
171+
return cfg, nil
114172
}
115173

116174
func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) (*AssetServer, error) {
@@ -187,11 +245,9 @@ func (c *completedConfig) addWebConsoleConfig(serverMux *genericmux.PathRecorder
187245
MetricsURL: c.ExtraConfig.Options.MetricsPublicURL,
188246
}
189247

190-
// TODO this looks incorrect. I'm guessing that we need to contact the master and locate the actual versions
191-
oVersionInfo := version.Get()
192248
versionInfo := assets.WebConsoleVersion{
193-
KubernetesVersion: oVersionInfo.GitVersion,
194-
OpenShiftVersion: oVersionInfo.GitVersion,
249+
KubernetesVersion: c.ExtraConfig.KubeVersion,
250+
OpenShiftVersion: c.ExtraConfig.OpenShiftVersion,
195251
}
196252

197253
extensionProps := assets.WebConsoleExtensionProperties{
@@ -230,7 +286,7 @@ func (c completedConfig) buildAssetHandler() (http.Handler, error) {
230286

231287
// Cache control should happen after all Vary headers are added, but before
232288
// any asset related routing (HTML5ModeHandler and FileServer)
233-
handler = assets.CacheControlHandler(version.Get().GitCommit, handler)
289+
handler = assets.CacheControlHandler(builtversion.Get().GitCommit, handler)
234290

235291
handler = assets.SecurityHeadersHandler(handler)
236292

pkg/assets/apiserver/cmd/start.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,9 @@ func (o WebConsoleServerOptions) Config() (*webconsoleserver.AssetServerConfig,
171171
if err := secureServingOptions.ApplyTo(&serverConfig.GenericConfig.Config); err != nil {
172172
return nil, err
173173
}
174+
if err := genericapiserveroptions.NewCoreAPIOptions().ApplyTo(serverConfig.GenericConfig); err != nil {
175+
return nil, err
176+
}
174177
if err := o.Audit.ApplyTo(&serverConfig.GenericConfig.Config); err != nil {
175178
return nil, err
176179
}
@@ -193,7 +196,11 @@ func (o WebConsoleServerOptions) RunWebConsoleServer(stopCh <-chan struct{}) err
193196
return err
194197
}
195198

196-
server, err := config.Complete().New(genericapiserver.EmptyDelegate)
199+
completedConfig, err := config.Complete()
200+
if err != nil {
201+
return err
202+
}
203+
server, err := completedConfig.New(genericapiserver.EmptyDelegate)
197204
if err != nil {
198205
return err
199206
}

0 commit comments

Comments
 (0)