Skip to content

Commit 9ae8fce

Browse files
author
OpenShift Bot
authored
Merge pull request #15226 from liggitt/aggregator-registration
Merged by openshift-bot
2 parents 6c3acd2 + fea9842 commit 9ae8fce

File tree

3 files changed

+136
-3
lines changed

3 files changed

+136
-3
lines changed

pkg/cmd/server/origin/aggregator.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,9 @@ import (
3434
"k8s.io/apiserver/pkg/server/healthz"
3535
kubeclientset "k8s.io/client-go/kubernetes"
3636
"k8s.io/kube-aggregator/pkg/apis/apiregistration"
37-
"k8s.io/kube-aggregator/pkg/apis/apiregistration/install"
3837
aggregatorapiserver "k8s.io/kube-aggregator/pkg/apiserver"
3938
apiregistrationclient "k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset/typed/apiregistration/internalversion"
4039
"k8s.io/kube-aggregator/pkg/controllers/autoregister"
41-
kapi "k8s.io/kubernetes/pkg/api"
4240
informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion"
4341
)
4442

@@ -52,8 +50,10 @@ func (c *MasterConfig) createAggregatorConfig(kubeAPIServerConfig genericapiserv
5250
genericConfig.OpenAPIConfig = nil
5351
genericConfig.SwaggerConfig = nil
5452

53+
// This depends on aggregator types being registered into the kapi.Scheme, which is currently done in Start() to avoid concurrent scheme modification
54+
//
5555
// install our types into the scheme so that "normal" RESTOptionsGetters can work for us
56-
install.Install(kapi.GroupFactoryRegistry, kapi.Registry, kapi.Scheme)
56+
// install.Install(kapi.GroupFactoryRegistry, kapi.Registry, kapi.Scheme)
5757

5858
client, err := kubeclientset.NewForConfig(genericConfig.LoopbackClientConfig)
5959
if err != nil {

pkg/cmd/server/start/start_master.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import (
2323
"k8s.io/apimachinery/pkg/util/sets"
2424
"k8s.io/apimachinery/pkg/util/wait"
2525
utilwait "k8s.io/apimachinery/pkg/util/wait"
26+
aggregatorinstall "k8s.io/kube-aggregator/pkg/apis/apiregistration/install"
27+
kapi "k8s.io/kubernetes/pkg/api"
2628
"k8s.io/kubernetes/pkg/capabilities"
2729
kinformers "k8s.io/kubernetes/pkg/client/informers/informers_generated/externalversions"
2830
"k8s.io/kubernetes/pkg/cloudprovider"
@@ -402,6 +404,13 @@ func (m *Master) Start() error {
402404
return fmt.Errorf("KubernetesMasterConfig is required to start this server - use of external Kubernetes is no longer supported.")
403405
}
404406

407+
if len(m.config.AggregatorConfig.ProxyClientInfo.KeyFile) > 0 {
408+
// install aggregator types into the scheme so that "normal" RESTOptionsGetters can work for us.
409+
// done in Start() prior to doing any other initialization so we don't mutate the scheme after it is being used by clients in other goroutines.
410+
// TODO: make scheme threadsafe and do this as part of aggregator config building
411+
aggregatorinstall.Install(kapi.GroupFactoryRegistry, kapi.Registry, kapi.Scheme)
412+
}
413+
405414
// we have a strange, optional linkage from controllers to the API server regarding the plug. In the end, this should be structured
406415
// as a separate API server which can be chained as a delegate
407416
var controllerPlug plug.Plug

test/integration/aggregator_test.go

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package integration
2+
3+
import (
4+
"io/ioutil"
5+
"os"
6+
"path/filepath"
7+
"testing"
8+
9+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
apiregistrationclientset "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset"
11+
12+
"github.com/openshift/origin/pkg/cmd/server/admin"
13+
configapi "github.com/openshift/origin/pkg/cmd/server/api"
14+
projectclientset "github.com/openshift/origin/pkg/project/generated/clientset"
15+
testutil "github.com/openshift/origin/test/util"
16+
testserver "github.com/openshift/origin/test/util/server"
17+
)
18+
19+
func TestAggregator(t *testing.T) {
20+
testutil.RequireEtcd(t)
21+
defer testutil.DumpEtcdOnFailure(t)
22+
23+
masterConfig, err := testserver.DefaultMasterOptions()
24+
if err != nil {
25+
t.Fatal(err)
26+
}
27+
28+
// Set up the aggregator ca and proxy cert
29+
caDir, err := ioutil.TempDir("", "aggregator-ca")
30+
if err != nil {
31+
t.Fatal(err)
32+
}
33+
defer func() {
34+
os.Remove(caDir)
35+
}()
36+
signerOptions := &admin.CreateSignerCertOptions{
37+
Name: "aggregator-proxy-ca",
38+
CertFile: filepath.Join(caDir, "aggregator-proxy-ca.crt"),
39+
KeyFile: filepath.Join(caDir, "aggregator-proxy-ca.key"),
40+
SerialFile: filepath.Join(caDir, "aggregator-proxy-ca.serial"),
41+
Output: ioutil.Discard,
42+
}
43+
if _, err := signerOptions.CreateSignerCert(); err != nil {
44+
t.Fatal(err)
45+
}
46+
proxyClientOptions := &admin.CreateClientCertOptions{
47+
SignerCertOptions: &admin.SignerCertOptions{
48+
CertFile: signerOptions.CertFile,
49+
KeyFile: signerOptions.KeyFile,
50+
SerialFile: signerOptions.SerialFile,
51+
},
52+
CertFile: filepath.Join(caDir, "aggregator-proxy.crt"),
53+
KeyFile: filepath.Join(caDir, "aggregator-proxy.key"),
54+
User: "aggregator-proxy",
55+
}
56+
if _, err := proxyClientOptions.CreateClientCert(); err != nil {
57+
t.Fatal(err)
58+
}
59+
60+
// Configure the aggregator and auth config
61+
masterConfig.AggregatorConfig.ProxyClientInfo.CertFile = proxyClientOptions.CertFile
62+
masterConfig.AggregatorConfig.ProxyClientInfo.KeyFile = proxyClientOptions.KeyFile
63+
masterConfig.AuthConfig.RequestHeader = &configapi.RequestHeaderAuthenticationOptions{
64+
ClientCA: signerOptions.CertFile,
65+
ClientCommonNames: []string{proxyClientOptions.User},
66+
UsernameHeaders: []string{"X-Remote-User"},
67+
GroupHeaders: []string{"X-Remote-Group"},
68+
ExtraHeaderPrefixes: []string{"X-Remote-Extra-"},
69+
}
70+
71+
// Get clients
72+
clusterAdminKubeConfig, err := testserver.StartConfiguredMaster(masterConfig)
73+
if err != nil {
74+
t.Fatal(err)
75+
}
76+
clusterAdminClientConfig, err := testutil.GetClusterAdminClientConfig(clusterAdminKubeConfig)
77+
if err != nil {
78+
t.Fatal(err)
79+
}
80+
openshiftClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig)
81+
if err != nil {
82+
t.Fatal(err)
83+
}
84+
openshiftProjectClient, err := projectclientset.NewForConfig(clusterAdminClientConfig)
85+
if err != nil {
86+
t.Fatal(err)
87+
}
88+
kubeClient, err := testutil.GetClusterAdminKubeClient(clusterAdminKubeConfig)
89+
if err != nil {
90+
t.Fatal(err)
91+
}
92+
apiregistrationClient, err := apiregistrationclientset.NewForConfig(clusterAdminClientConfig)
93+
if err != nil {
94+
t.Fatal(err)
95+
}
96+
97+
// Get resources
98+
// Kube resource
99+
if _, err := kubeClient.Core().Namespaces().Get("default", metav1.GetOptions{}); err != nil {
100+
t.Fatal(err)
101+
}
102+
// Legacy openshift resource
103+
if _, err := openshiftClient.Projects().Get("default", metav1.GetOptions{}); err != nil {
104+
t.Fatal(err)
105+
}
106+
// Groupified openshift resource
107+
if _, err := openshiftProjectClient.Projects().Get("default", metav1.GetOptions{}); err != nil {
108+
t.Fatal(err)
109+
}
110+
111+
// Get aggregator resources
112+
// Legacy group
113+
if _, err := apiregistrationClient.ApiregistrationV1beta1().APIServices().Get("v1.", metav1.GetOptions{}); err != nil {
114+
t.Fatal(err)
115+
}
116+
// Openshift group
117+
if _, err := apiregistrationClient.ApiregistrationV1beta1().APIServices().Get("v1.project.openshift.io", metav1.GetOptions{}); err != nil {
118+
t.Fatal(err)
119+
}
120+
// Kube group
121+
if _, err := apiregistrationClient.ApiregistrationV1beta1().APIServices().Get("v1beta1.rbac.authorization.k8s.io", metav1.GetOptions{}); err != nil {
122+
t.Fatal(err)
123+
}
124+
}

0 commit comments

Comments
 (0)