Skip to content

Commit c0edef5

Browse files
authored
Merge pull request kubernetes-sigs#15 from kawych/master
Add External Metrics API endpoint to custom-metrics-apiserver
2 parents 1222dbe + 863ae26 commit c0edef5

File tree

15 files changed

+908
-296
lines changed

15 files changed

+908
-296
lines changed

Diff for: glide.lock

+7-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: glide.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ import:
5050
subpackages:
5151
- pkg/apis/custom_metrics
5252
- pkg/apis/custom_metrics/install
53+
- pkg/apis/external_metrics
54+
- pkg/apis/external_metrics/install
5355
testImport:
5456
- package: github.com/stretchr/testify
5557
version: ^1.1.4

Diff for: pkg/apiserver/apiserver.go

+22-9
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ import (
2727
genericapiserver "k8s.io/apiserver/pkg/server"
2828

2929
"github.com/kubernetes-incubator/custom-metrics-apiserver/pkg/provider"
30-
"k8s.io/metrics/pkg/apis/custom_metrics/install"
30+
cminstall "k8s.io/metrics/pkg/apis/custom_metrics/install"
31+
eminstall "k8s.io/metrics/pkg/apis/external_metrics/install"
3132
)
3233

3334
var (
@@ -38,7 +39,8 @@ var (
3839
)
3940

4041
func init() {
41-
install.Install(groupFactoryRegistry, registry, Scheme)
42+
cminstall.Install(groupFactoryRegistry, registry, Scheme)
43+
eminstall.Install(groupFactoryRegistry, registry, Scheme)
4244

4345
// we need to add the options to empty v1
4446
// TODO fix the server code to avoid this
@@ -61,8 +63,9 @@ type Config struct {
6163

6264
// CustomMetricsAdapterServer contains state for a Kubernetes cluster master/api server.
6365
type CustomMetricsAdapterServer struct {
64-
GenericAPIServer *genericapiserver.GenericAPIServer
65-
Provider provider.CustomMetricsProvider
66+
GenericAPIServer *genericapiserver.GenericAPIServer
67+
customMetricsProvider provider.CustomMetricsProvider
68+
externalMetricsProvider provider.ExternalMetricsProvider
6669
}
6770

6871
type completedConfig struct {
@@ -80,19 +83,29 @@ func (c *Config) Complete() completedConfig {
8083

8184
// New returns a new instance of CustomMetricsAdapterServer from the given config.
8285
// name is used to differentiate for logging.
83-
func (c completedConfig) New(name string, cmProvider provider.CustomMetricsProvider) (*CustomMetricsAdapterServer, error) {
86+
// Each of the arguments: customMetricsProvider, externalMetricsProvider can be set either to
87+
// a provider implementation, or to nil to disable one of the APIs.
88+
func (c completedConfig) New(name string, customMetricsProvider provider.CustomMetricsProvider, externalMetricsProvider provider.ExternalMetricsProvider) (*CustomMetricsAdapterServer, error) {
8489
genericServer, err := c.CompletedConfig.New(name, genericapiserver.EmptyDelegate) // completion is done in Complete, no need for a second time
8590
if err != nil {
8691
return nil, err
8792
}
8893

8994
s := &CustomMetricsAdapterServer{
90-
GenericAPIServer: genericServer,
91-
Provider: cmProvider,
95+
GenericAPIServer: genericServer,
96+
customMetricsProvider: customMetricsProvider,
97+
externalMetricsProvider: externalMetricsProvider,
9298
}
9399

94-
if err := s.InstallCustomMetricsAPI(); err != nil {
95-
return nil, err
100+
if customMetricsProvider != nil {
101+
if err := s.InstallCustomMetricsAPI(); err != nil {
102+
return nil, err
103+
}
104+
}
105+
if externalMetricsProvider != nil {
106+
if err := s.InstallExternalMetricsAPI(); err != nil {
107+
return nil, err
108+
}
96109
}
97110

98111
return s, nil

Diff for: pkg/apiserver/cmapis.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,9 @@ func (s *CustomMetricsAdapterServer) InstallCustomMetricsAPI() error {
6060

6161
return nil
6262
}
63+
6364
func (s *CustomMetricsAdapterServer) cmAPI(groupMeta *apimachinery.GroupMeta, groupVersion *schema.GroupVersion) *specificapi.MetricsAPIGroupVersion {
64-
resourceStorage := metricstorage.NewREST(s.Provider)
65+
resourceStorage := metricstorage.NewREST(s.customMetricsProvider)
6566

6667
return &specificapi.MetricsAPIGroupVersion{
6768
DynamicStorage: resourceStorage,
@@ -84,6 +85,7 @@ func (s *CustomMetricsAdapterServer) cmAPI(groupMeta *apimachinery.GroupMeta, gr
8485
OptionsExternalVersion: &schema.GroupVersion{Version: "v1"},
8586
},
8687

87-
ResourceLister: provider.NewResourceLister(s.Provider),
88+
ResourceLister: provider.NewCustomMetricResourceLister(s.customMetricsProvider),
89+
Handlers: &specificapi.CMHandlers{},
8890
}
8991
}

Diff for: pkg/apiserver/emapis.go

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*
2+
Copyright 2018 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package apiserver
18+
19+
import (
20+
"k8s.io/apimachinery/pkg/apimachinery"
21+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
22+
"k8s.io/apimachinery/pkg/runtime"
23+
"k8s.io/apimachinery/pkg/runtime/schema"
24+
genericapi "k8s.io/apiserver/pkg/endpoints"
25+
"k8s.io/apiserver/pkg/endpoints/discovery"
26+
genericapiserver "k8s.io/apiserver/pkg/server"
27+
28+
specificapi "github.com/kubernetes-incubator/custom-metrics-apiserver/pkg/apiserver/installer"
29+
"github.com/kubernetes-incubator/custom-metrics-apiserver/pkg/provider"
30+
metricstorage "github.com/kubernetes-incubator/custom-metrics-apiserver/pkg/registry/external_metrics"
31+
"k8s.io/metrics/pkg/apis/external_metrics"
32+
)
33+
34+
// InstallExternalMetricsAPI registers the api server in Kube Aggregator
35+
func (s *CustomMetricsAdapterServer) InstallExternalMetricsAPI() error {
36+
37+
groupMeta := registry.GroupOrDie(external_metrics.GroupName)
38+
39+
preferredVersionForDiscovery := metav1.GroupVersionForDiscovery{
40+
GroupVersion: groupMeta.GroupVersion.String(),
41+
Version: groupMeta.GroupVersion.Version,
42+
}
43+
groupVersion := metav1.GroupVersionForDiscovery{
44+
GroupVersion: groupMeta.GroupVersion.String(),
45+
Version: groupMeta.GroupVersion.Version,
46+
}
47+
apiGroup := metav1.APIGroup{
48+
Name: groupMeta.GroupVersion.Group,
49+
Versions: []metav1.GroupVersionForDiscovery{groupVersion},
50+
PreferredVersion: preferredVersionForDiscovery,
51+
}
52+
53+
emAPI := s.emAPI(groupMeta, &groupMeta.GroupVersion)
54+
55+
if err := emAPI.InstallREST(s.GenericAPIServer.Handler.GoRestfulContainer); err != nil {
56+
return err
57+
}
58+
59+
s.GenericAPIServer.DiscoveryGroupManager.AddGroup(apiGroup)
60+
s.GenericAPIServer.Handler.GoRestfulContainer.Add(discovery.NewAPIGroupHandler(s.GenericAPIServer.Serializer, apiGroup, s.GenericAPIServer.RequestContextMapper()).WebService())
61+
62+
return nil
63+
}
64+
65+
func (s *CustomMetricsAdapterServer) emAPI(groupMeta *apimachinery.GroupMeta, groupVersion *schema.GroupVersion) *specificapi.MetricsAPIGroupVersion {
66+
resourceStorage := metricstorage.NewREST(s.externalMetricsProvider)
67+
68+
return &specificapi.MetricsAPIGroupVersion{
69+
DynamicStorage: resourceStorage,
70+
APIGroupVersion: &genericapi.APIGroupVersion{
71+
Root: genericapiserver.APIGroupPrefix,
72+
GroupVersion: *groupVersion,
73+
74+
ParameterCodec: metav1.ParameterCodec,
75+
Serializer: Codecs,
76+
Creater: Scheme,
77+
Convertor: Scheme,
78+
UnsafeConvertor: runtime.UnsafeObjectConvertor(Scheme),
79+
Copier: Scheme,
80+
Typer: Scheme,
81+
Linker: groupMeta.SelfLinker,
82+
Mapper: groupMeta.RESTMapper,
83+
84+
Context: s.GenericAPIServer.RequestContextMapper(),
85+
MinRequestTimeout: s.GenericAPIServer.MinRequestTimeout(),
86+
OptionsExternalVersion: &schema.GroupVersion{Version: "v1"},
87+
},
88+
ResourceLister: provider.NewExternalMetricResourceLister(s.externalMetricsProvider),
89+
Handlers: &specificapi.EMHandlers{},
90+
}
91+
}

0 commit comments

Comments
 (0)