From f06fbd0c5adcde1f742af9ad124ac6907ce8624b Mon Sep 17 00:00:00 2001 From: Justin Santa Barbara Date: Wed, 18 Apr 2018 14:44:12 -0400 Subject: [PATCH] Update apiserver for 1.10 --- Gopkg.lock | 82 ++++++++++++++++++- Gopkg.toml | 10 +++ pkg/apiserver/apiserver.go | 37 ++++++--- pkg/apiserver/cmd/server/start.go | 127 ++++++++++++------------------ 4 files changed, 167 insertions(+), 89 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 6998c5ef63..4b2f33721a 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -74,6 +74,12 @@ revision = "3391d3790d23d03408670993e957e8f408993c34" version = "v1.0.1" +[[projects]] + name = "github.com/asaskevich/govalidator" + packages = ["."] + revision = "ccb8e960c48f04d6935e72476ae4a51028f9e22f" + version = "v9" + [[projects]] name = "github.com/aws/aws-sdk-go" packages = [ @@ -328,6 +334,18 @@ revision = "300e940a926eb277d3901b20bdfcc54928ad3642" version = "v1.25.4" +[[projects]] + branch = "master" + name = "github.com/go-openapi/analysis" + packages = ["."] + revision = "863ac7f90e00e88e507095639a8457bbbf3c2ec9" + +[[projects]] + branch = "master" + name = "github.com/go-openapi/errors" + packages = ["."] + revision = "7bcb96a367bac6b76e6e42fa84155bb5581dcff8" + [[projects]] name = "github.com/go-openapi/jsonpointer" packages = ["."] @@ -338,16 +356,34 @@ packages = ["."] revision = "13c6e3589ad90f49bd3e3bbe2c2cb3d7a4142272" +[[projects]] + branch = "master" + name = "github.com/go-openapi/loads" + packages = ["."] + revision = "2a2b323bab96e6b1fdee110e57d959322446e9c9" + [[projects]] name = "github.com/go-openapi/spec" packages = ["."] revision = "1de3e0542de65ad8d75452a595886fdd0befb363" +[[projects]] + branch = "master" + name = "github.com/go-openapi/strfmt" + packages = ["."] + revision = "481808443b00a14745fada967cb5eeff0f9b1df2" + [[projects]] name = "github.com/go-openapi/swag" packages = ["."] revision = "f3f9494671f93fcff853e3c6e9e948b3eb71e590" +[[projects]] + name = "github.com/gobuffalo/envy" + packages = ["."] + revision = "ef60bfc50c8f92d1ee64674d8ce7a48f1f67625e" + version = "v1.6.2" + [[projects]] name = "github.com/gogo/protobuf" packages = [ @@ -490,6 +526,12 @@ packages = ["."] revision = "0b12d6b521d83fc7f755e7cfc1b1fbdd35a01a74" +[[projects]] + name = "github.com/joho/godotenv" + packages = ["."] + revision = "a79fa1e548e2c689c241d10173efd51e5d689d5b" + version = "v1.2.0" + [[projects]] name = "github.com/jonboulle/clockwork" packages = ["."] @@ -514,6 +556,29 @@ packages = ["."] revision = "2788f0dbd16903de03cb8186e5c7d97b69ad387b" +[[projects]] + name = "github.com/kubernetes-incubator/apiserver-builder" + packages = [ + "cmd/apiserver-boot", + "cmd/apiserver-boot/boot/build", + "cmd/apiserver-boot/boot/create", + "cmd/apiserver-boot/boot/init_repo", + "cmd/apiserver-boot/boot/run", + "cmd/apiserver-boot/boot/update", + "cmd/apiserver-boot/boot/util", + "cmd/apiserver-boot/boot/version" + ] + revision = "e809ac2f9f0c238f08d08a876f8b3f499604f941" + +[[projects]] + name = "github.com/kubernetes-incubator/reference-docs" + packages = [ + "gen-apidocs", + "gen-apidocs/generators", + "gen-apidocs/generators/api" + ] + revision = "8fadf91876ccbcfec367b434706a3c449073b0b4" + [[projects]] name = "github.com/magiconair/properties" packages = ["."] @@ -528,6 +593,12 @@ ] revision = "2f5df55504ebc322e4d52d34df6a1f5b503bf26d" +[[projects]] + branch = "master" + name = "github.com/markbates/inflect" + packages = ["."] + revision = "fbc6b23ce49e2578f572d2e72bb72fa03c7145de" + [[projects]] name = "github.com/matttproud/golang_protobuf_extensions" packages = ["pbutil"] @@ -920,6 +991,15 @@ packages = ["."] revision = "3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4" +[[projects]] + branch = "v2" + name = "gopkg.in/mgo.v2" + packages = [ + "bson", + "internal/json" + ] + revision = "3f83fa5005286a7fe593b055f0d7771a7dce4655" + [[projects]] name = "gopkg.in/natefinch/lumberjack.v2" packages = ["."] @@ -1599,6 +1679,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "a07cf721a3e7e0b73b9fcd398919c3d29dce5b2bc67bb11ddef7193d39df2e12" + inputs-digest = "2e3d6ddfd1017a940526237cadd8a968d6e8170af9dac833b2a94bd8ffc4646f" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 913fa9f03a..f50d7ed6fb 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -11,6 +11,8 @@ required = [ # Needed for docs generation "k8s.io/code-generator/cmd/openapi-gen", + "github.com/kubernetes-incubator/apiserver-builder/cmd/apiserver-boot", + "github.com/kubernetes-incubator/reference-docs/gen-apidocs", ] [prune] @@ -66,6 +68,14 @@ required = [ name = "k8s.io/kubernetes" version = "v1.10.1" +# Needed for docs generation +[[override]] + name = "github.com/kubernetes-incubator/apiserver-builder" + revision = "e809ac2f9f0c238f08d08a876f8b3f499604f941" +[[override]] + name = "github.com/kubernetes-incubator/reference-docs" + revision = "8fadf91876ccbcfec367b434706a3c449073b0b4" + # These come from godeps.json in kubernetes [[override]] diff --git a/pkg/apiserver/apiserver.go b/pkg/apiserver/apiserver.go index b6ed433f6a..2cd9276b6d 100644 --- a/pkg/apiserver/apiserver.go +++ b/pkg/apiserver/apiserver.go @@ -114,17 +114,34 @@ func (c completedConfig) New() (*KopsServer, error) { apiGroupInfo := server.NewDefaultAPIGroupInfo(kops.GroupName, registry, Scheme, metav1.ParameterCodec, Codecs) apiGroupInfo.GroupMeta.GroupVersion = v1alpha2.SchemeGroupVersion - v1alpha2storage := map[string]rest.Storage{} - v1alpha2storage["clusters"], err = registrycluster.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter) - if err != nil { - return nil, fmt.Errorf("error initializing clusters: %v", err) + + // { + // v1alpha1storage := map[string]rest.Storage{} + // v1alpha1storage["clusters"], err = registrycluster.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter) + // if err != nil { + // return nil, fmt.Errorf("error initializing clusters: %v", err) + // } + // //v1alpha2stv1alpha1storageorage["clusters/full"] = registrycluster.NewREST(c.RESTOptionsGetter) + // v1alpha1storage["instancegroups"], err = registryinstancegroup.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter) + // if err != nil { + // return nil, fmt.Errorf("error initializing instancegroups: %v", err) + // } + // apiGroupInfo.VersionedResourcesStorageMap["v1alpha1"] = v1alpha1storage + // } + + { + v1alpha2storage := map[string]rest.Storage{} + v1alpha2storage["clusters"], err = registrycluster.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter) + if err != nil { + return nil, fmt.Errorf("error initializing clusters: %v", err) + } + //v1alpha2storage["clusters/full"] = registrycluster.NewREST(c.RESTOptionsGetter) + v1alpha2storage["instancegroups"], err = registryinstancegroup.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter) + if err != nil { + return nil, fmt.Errorf("error initializing instancegroups: %v", err) + } + apiGroupInfo.VersionedResourcesStorageMap["v1alpha2"] = v1alpha2storage } - //v1alpha2storage["clusters/full"] = registrycluster.NewREST(c.RESTOptionsGetter) - v1alpha2storage["instancegroups"], err = registryinstancegroup.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter) - if err != nil { - return nil, fmt.Errorf("error initializing instancegroups: %v", err) - } - apiGroupInfo.VersionedResourcesStorageMap["v1alpha2"] = v1alpha2storage if err := s.GenericAPIServer.InstallAPIGroup(&apiGroupInfo); err != nil { return nil, err diff --git a/pkg/apiserver/cmd/server/start.go b/pkg/apiserver/cmd/server/start.go index 22d1c4372f..13d7c7875a 100644 --- a/pkg/apiserver/cmd/server/start.go +++ b/pkg/apiserver/cmd/server/start.go @@ -41,11 +41,7 @@ import ( const defaultEtcdPathPrefix = "/registry/kops.kubernetes.io" type KopsServerOptions struct { - Etcd *genericoptions.EtcdOptions - SecureServing *genericoptions.SecureServingOptions - //InsecureServing *genericoptions.ServingOptions - Authentication *genericoptions.DelegatingAuthenticationOptions - Authorization *genericoptions.DelegatingAuthorizationOptions + RecommendedOptions *genericoptions.RecommendedOptions StdOut io.Writer StdErr io.Writer @@ -56,20 +52,14 @@ type KopsServerOptions struct { // NewCommandStartKopsServer provides a CLI handler for 'start master' command func NewCommandStartKopsServer(out, err io.Writer) *cobra.Command { o := &KopsServerOptions{ - Etcd: genericoptions.NewEtcdOptions(&storagebackend.Config{ - Prefix: defaultEtcdPathPrefix, - Codec: nil, - }), - SecureServing: genericoptions.NewSecureServingOptions(), - //InsecureServing: genericoptions.NewInsecureServingOptions(), - Authentication: genericoptions.NewDelegatingAuthenticationOptions(), - Authorization: genericoptions.NewDelegatingAuthorizationOptions(), + RecommendedOptions: genericoptions.NewRecommendedOptions(defaultEtcdPathPrefix, + apiserver.Codecs.LegacyCodec(v1alpha2.SchemeGroupVersion)), StdOut: out, StdErr: err, } - o.Etcd.StorageConfig.Type = storagebackend.StorageTypeETCD2 - o.Etcd.StorageConfig.Codec = apiserver.Codecs.LegacyCodec(v1alpha2.SchemeGroupVersion) + o.RecommendedOptions.Etcd.StorageConfig.Type = storagebackend.StorageTypeETCD2 + o.RecommendedOptions.Etcd.StorageConfig.Codec = apiserver.Codecs.LegacyCodec(v1alpha2.SchemeGroupVersion) //o.SecureServing.ServingOptions.BindPort = 443 cmd := &cobra.Command{ @@ -90,11 +80,7 @@ func NewCommandStartKopsServer(out, err io.Writer) *cobra.Command { } flags := cmd.Flags() - o.Etcd.AddFlags(flags) - o.SecureServing.AddFlags(flags) - //o.InsecureServing.AddFlags(flags) - o.Authentication.AddFlags(flags) - o.Authorization.AddFlags(flags) + o.RecommendedOptions.AddFlags(flags) flags.BoolVar(&o.PrintOpenapi, "print-openapi", false, "Print the openapi json and exit") @@ -104,8 +90,7 @@ func NewCommandStartKopsServer(out, err io.Writer) *cobra.Command { func (o KopsServerOptions) Validate(args []string) error { errors := []error{} - //errors = append(errors, o.RecommendedOptions.Validate()...) - //errors = append(errors, o.Admission.Validate()...) + errors = append(errors, o.RecommendedOptions.Validate()...) return utilerrors.NewAggregate(errors) } @@ -114,70 +99,62 @@ func (o *KopsServerOptions) Complete() error { } func (o KopsServerOptions) Config() (*apiserver.Config, error) { - // // register admission plugins - //banflunder.Register(o.Admission.Plugins) - // - //// TODO have a "real" external address - //if err := o.RecommendedOptions.SecureServing.MaybeDefaultWithSelfSignedCerts("localhost", nil, []net.IP{net.ParseIP("127.0.0.1")}); err != nil { - // return nil, fmt.Errorf("error creating self-signed certificates: %v", err) - //} - // - //serverConfig := genericapiserver.NewRecommendedConfig(apiserver.Codecs) - //if err := o.RecommendedOptions.ApplyTo(serverConfig); err != nil { - // return nil, err - //} - // - //client, err := clientset.NewForConfig(serverConfig.LoopbackClientConfig) - //if err != nil { - // return nil, err - //} - //informerFactory := informers.NewSharedInformerFactory(client, serverConfig.LoopbackClientConfig.Timeout) - //admissionInitializer, err := wardleinitializer.New(informerFactory) - //if err != nil { - // return nil, err - //} - // - //if err := o.Admission.ApplyTo(&serverConfig.Config, serverConfig.SharedInformerFactory, admissionInitializer); err != nil { - // return nil, err - //} - // TODO have a "real" external address - if err := o.SecureServing.MaybeDefaultWithSelfSignedCerts("localhost", nil, []net.IP{net.ParseIP("127.0.0.1")}); err != nil { + if err := o.RecommendedOptions.SecureServing.MaybeDefaultWithSelfSignedCerts("localhost", nil, []net.IP{net.ParseIP("127.0.0.1")}); err != nil { return nil, fmt.Errorf("error creating self-signed certificates: %v", err) } - serverConfig := genericapiserver.NewRecommendedConfig(apiserver.Codecs) - // 1.6: serverConfig := genericapiserver.NewConfig().WithSerializer(kops.Codecs) - //if err := o.RecommendedOptions.ApplyTo(serverConfig); err != nil { - // return nil, err - //} + scheme := apiserver.Scheme + config := genericapiserver.NewRecommendedConfig(apiserver.Codecs) - serverConfig.CorsAllowedOriginList = []string{".*"} + // We have to skip some of these to get docs to work... + // if err := o.RecommendedOptions.ApplyTo(config, scheme); err != nil { + // return nil, err + // } - if err := o.Etcd.ApplyTo(&serverConfig.Config); err != nil { + if err := o.RecommendedOptions.Etcd.ApplyTo(&config.Config); err != nil { + return nil, err + } + if err := o.RecommendedOptions.SecureServing.ApplyTo(&config.Config); err != nil { return nil, err } - if err := o.SecureServing.ApplyTo(&serverConfig.Config); err != nil { + if !o.PrintOpenapi { + if err := o.RecommendedOptions.Authentication.ApplyTo(&config.Config.Authentication, config.SecureServing, config.OpenAPIConfig); err != nil { + return nil, err + } + if err := o.RecommendedOptions.Authorization.ApplyTo(&config.Config.Authorization); err != nil { + return nil, err + } + + glog.Warningf("Authentication/Authorization disabled") + } + + if err := o.RecommendedOptions.Audit.ApplyTo(&config.Config); err != nil { + return nil, err + } + if err := o.RecommendedOptions.Features.ApplyTo(&config.Config); err != nil { return nil, err } - //if err := o.InsecureServing.ApplyTo(serverConfig); err != nil { - // return err - //} - glog.Warningf("Authentication/Authorization disabled") + if !o.PrintOpenapi { + if err := o.RecommendedOptions.CoreAPI.ApplyTo(config); err != nil { + return nil, err + } - //var err error - //privilegedLoopbackToken := uuid.NewRandom().String() - //if genericAPIServerConfig.LoopbackClientConfig, err = genericAPIServerConfig.SecureServingInfo.NewSelfClientConfig(privilegedLoopbackToken); err != nil { - // return err - // } + if initializers, err := o.RecommendedOptions.ExtraAdmissionInitializers(config); err != nil { + return nil, err + } else if err := o.RecommendedOptions.Admission.ApplyTo(&config.Config, config.SharedInformerFactory, config.ClientConfig, scheme, initializers...); err != nil { + return nil, err + } + } - config := &apiserver.Config{ - GenericConfig: serverConfig, + // serverConfig.CorsAllowedOriginList = []string{".*"} + + return &apiserver.Config{ + GenericConfig: config, ExtraConfig: apiserver.ExtraConfig{}, - } - return config, nil + }, nil } func (o KopsServerOptions) RunKopsServer() error { @@ -186,11 +163,6 @@ func (o KopsServerOptions) RunKopsServer() error { return err } - //config := apiserver.Config{ - // GenericConfig: serverConfig, - // RESTOptionsGetter: &restOptionsFactory{storageConfig: &o.Etcd.StorageConfig}, - //} - // Configure the openapi spec provided on /swagger.json // TODO: Come up with a better title and a meaningful version config.GenericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig( @@ -203,8 +175,6 @@ func (o KopsServerOptions) RunKopsServer() error { return err } - srv := server.GenericAPIServer.PrepareRun() - //server.GenericAPIServer.AddPostStartHook("start-sample-server-informers", func(context genericapiserver.PostStartHookContext) error { // config.GenericConfig.SharedInformerFactory.Start(context.StopCh) // return nil @@ -217,6 +187,7 @@ func (o KopsServerOptions) RunKopsServer() error { os.Exit(0) } + srv := server.GenericAPIServer.PrepareRun() return srv.Run(wait.NeverStop) }