git subrepo clone (merge) https://github.com/kubernetes-incubator/metrics-server.git metrics-server
subrepo:
subdir: "metrics-server"
merged: "92d8412"
upstream:
origin: "https://github.com/kubernetes-incubator/metrics-server.git"
branch: "master"
commit: "92d8412"
git-subrepo:
version: "0.4.0"
origin: "???"
commit: "???"
diff --git a/metrics-server/pkg/apiserver/config.go b/metrics-server/pkg/apiserver/config.go
new file mode 100644
index 0000000..fa22c10
--- /dev/null
+++ b/metrics-server/pkg/apiserver/config.go
@@ -0,0 +1,74 @@
+// Copyright 2018 The Kubernetes Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package apiserver
+
+import (
+ "strings"
+
+ openapinamer "k8s.io/apiserver/pkg/endpoints/openapi"
+ genericapiserver "k8s.io/apiserver/pkg/server"
+ "k8s.io/client-go/informers"
+
+ "github.com/kubernetes-incubator/metrics-server/pkg/apiserver/generic"
+ generatedopenapi "github.com/kubernetes-incubator/metrics-server/pkg/generated/openapi"
+ "github.com/kubernetes-incubator/metrics-server/pkg/version"
+)
+
+// Config contains configuration for launching an instance of metrics-server.
+type Config struct {
+ GenericConfig *genericapiserver.Config
+ ProviderConfig generic.ProviderConfig
+}
+
+type completedConfig struct {
+ genericapiserver.CompletedConfig
+ ProviderConfig *generic.ProviderConfig
+}
+
+// Complete fills in any fields not set that are required to have valid data. It's mutating the receiver.
+func (c *Config) Complete(informers informers.SharedInformerFactory) completedConfig {
+ c.GenericConfig.Version = version.VersionInfo()
+
+ // enable OpenAPI schemas
+ c.GenericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(generatedopenapi.GetOpenAPIDefinitions, openapinamer.NewDefinitionNamer(generic.Scheme))
+ c.GenericConfig.OpenAPIConfig.Info.Title = "Kubernetes metrics-server"
+ c.GenericConfig.OpenAPIConfig.Info.Version = strings.Split(c.GenericConfig.Version.String(), "-")[0] // TODO(directxman12): remove this once autosetting this doesn't require security definitions
+ c.GenericConfig.SwaggerConfig = genericapiserver.DefaultSwaggerConfig()
+
+ return completedConfig{
+ CompletedConfig: c.GenericConfig.Complete(informers),
+ ProviderConfig: &c.ProviderConfig,
+ }
+}
+
+type MetricsServer struct {
+ *genericapiserver.GenericAPIServer
+}
+
+// New returns a new instance of MetricsServer from the given config.
+func (c completedConfig) New() (*MetricsServer, error) {
+ genericServer, err := c.CompletedConfig.New("metrics-server", genericapiserver.NewEmptyDelegate()) // completion is done in Complete, no need for a second time
+ if err != nil {
+ return nil, err
+ }
+
+ if err := generic.InstallStorage(c.ProviderConfig, c.SharedInformerFactory.Core().V1(), genericServer); err != nil {
+ return nil, err
+ }
+
+ return &MetricsServer{
+ GenericAPIServer: genericServer,
+ }, nil
+}
diff --git a/metrics-server/pkg/apiserver/generic/storage.go b/metrics-server/pkg/apiserver/generic/storage.go
new file mode 100644
index 0000000..1cd5304
--- /dev/null
+++ b/metrics-server/pkg/apiserver/generic/storage.go
@@ -0,0 +1,72 @@
+// Copyright 2018 The Kubernetes Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package generic
+
+import (
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
+ "k8s.io/apimachinery/pkg/runtime/schema"
+ "k8s.io/apimachinery/pkg/runtime/serializer"
+ "k8s.io/apiserver/pkg/registry/rest"
+ genericapiserver "k8s.io/apiserver/pkg/server"
+ coreinf "k8s.io/client-go/informers/core/v1"
+ "k8s.io/metrics/pkg/apis/metrics"
+ "k8s.io/metrics/pkg/apis/metrics/install"
+ "k8s.io/metrics/pkg/apis/metrics/v1beta1"
+
+ "github.com/kubernetes-incubator/metrics-server/pkg/provider"
+ nodemetricsstorage "github.com/kubernetes-incubator/metrics-server/pkg/storage/nodemetrics"
+ podmetricsstorage "github.com/kubernetes-incubator/metrics-server/pkg/storage/podmetrics"
+)
+
+var (
+ // Scheme contains the types needed by the resource metrics API.
+ Scheme = runtime.NewScheme()
+ // Codecs is a codec factory for serving the resource metrics API.
+ Codecs = serializer.NewCodecFactory(Scheme)
+)
+
+func init() {
+ install.Install(Scheme)
+ metav1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"})
+}
+
+// ProviderConfig holds the providers for node and pod metrics
+// for serving the resource metrics API.
+type ProviderConfig struct {
+ Node provider.NodeMetricsProvider
+ Pod provider.PodMetricsProvider
+}
+
+// BuildStorage constructs APIGroupInfo the metrics.k8s.io API group using the given providers.
+func BuildStorage(providers *ProviderConfig, informers coreinf.Interface) genericapiserver.APIGroupInfo {
+ apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(metrics.GroupName, Scheme, metav1.ParameterCodec, Codecs)
+
+ nodemetricsStorage := nodemetricsstorage.NewStorage(metrics.Resource("nodemetrics"), providers.Node, informers.Nodes().Lister())
+ podmetricsStorage := podmetricsstorage.NewStorage(metrics.Resource("podmetrics"), providers.Pod, informers.Pods().Lister())
+ metricsServerResources := map[string]rest.Storage{
+ "nodes": nodemetricsStorage,
+ "pods": podmetricsStorage,
+ }
+ apiGroupInfo.VersionedResourcesStorageMap[v1beta1.SchemeGroupVersion.Version] = metricsServerResources
+
+ return apiGroupInfo
+}
+
+// InstallStorage builds the storage for the metrics.k8s.io API, and then installs it into the given API server.
+func InstallStorage(providers *ProviderConfig, informers coreinf.Interface, server *genericapiserver.GenericAPIServer) error {
+ info := BuildStorage(providers, informers)
+ return server.InstallAPIGroup(&info)
+}