2021-01-07 22:58:09 +00:00
// Copyright 2020-2021 the Pinniped contributors. All Rights Reserved.
2020-09-16 14:19:51 +00:00
// SPDX-License-Identifier: Apache-2.0
2020-07-23 15:05:21 +00:00
package apiserver
import (
2020-07-31 16:08:07 +00:00
"context"
2020-07-23 15:05:21 +00:00
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apiserver/pkg/registry/rest"
genericapiserver "k8s.io/apiserver/pkg/server"
"k8s.io/client-go/pkg/version"
2020-11-10 15:22:16 +00:00
"go.pinniped.dev/internal/plog"
2020-09-18 19:56:24 +00:00
"go.pinniped.dev/internal/registry/credentialrequest"
2020-07-23 15:05:21 +00:00
)
type Config struct {
GenericConfig * genericapiserver . RecommendedConfig
ExtraConfig ExtraConfig
}
type ExtraConfig struct {
2020-09-21 16:37:54 +00:00
Authenticator credentialrequest . TokenCredentialRequestAuthenticator
2020-08-14 14:11:14 +00:00
Issuer credentialrequest . CertIssuer
2020-07-31 16:08:07 +00:00
StartControllersPostStartHook func ( ctx context . Context )
2021-01-13 01:27:41 +00:00
Scheme * runtime . Scheme
NegotiatedSerializer runtime . NegotiatedSerializer
GroupVersion schema . GroupVersion
2020-07-23 15:05:21 +00:00
}
2020-08-20 17:54:15 +00:00
type PinnipedServer struct {
2020-07-23 15:05:21 +00:00
GenericAPIServer * genericapiserver . GenericAPIServer
}
type completedConfig struct {
GenericConfig genericapiserver . CompletedConfig
ExtraConfig * ExtraConfig
}
type CompletedConfig struct {
// Embed a private pointer that cannot be instantiated outside of this package.
* completedConfig
}
// Complete fills in any fields not set that are required to have valid data. It's mutating the receiver.
func ( c * Config ) Complete ( ) CompletedConfig {
completedCfg := completedConfig {
c . GenericConfig . Complete ( ) ,
& c . ExtraConfig ,
}
versionInfo := version . Get ( )
completedCfg . GenericConfig . Version = & versionInfo
return CompletedConfig { completedConfig : & completedCfg }
}
// New returns a new instance of AdmissionServer from the given config.
2020-08-20 17:54:15 +00:00
func ( c completedConfig ) New ( ) ( * PinnipedServer , error ) {
2020-10-06 18:59:03 +00:00
genericServer , err := c . GenericConfig . New ( "pinniped-concierge" , genericapiserver . NewEmptyDelegate ( ) ) // completion is done in Complete, no need for a second time
2020-07-23 15:05:21 +00:00
if err != nil {
return nil , fmt . Errorf ( "completion error: %w" , err )
}
2020-08-20 17:54:15 +00:00
s := & PinnipedServer {
2020-07-23 15:05:21 +00:00
GenericAPIServer : genericServer ,
}
2021-01-13 01:27:41 +00:00
gvr := c . ExtraConfig . GroupVersion . WithResource ( "tokencredentialrequests" )
2020-09-21 16:37:54 +00:00
storage := credentialrequest . NewREST ( c . ExtraConfig . Authenticator , c . ExtraConfig . Issuer )
2020-09-18 22:15:04 +00:00
if err := s . GenericAPIServer . InstallAPIGroup ( & genericapiserver . APIGroupInfo {
PrioritizedVersions : [ ] schema . GroupVersion { gvr . GroupVersion ( ) } ,
VersionedResourcesStorageMap : map [ string ] map [ string ] rest . Storage { gvr . Version : { gvr . Resource : storage } } ,
OptionsExternalVersion : & schema . GroupVersion { Version : "v1" } ,
2021-01-13 01:27:41 +00:00
Scheme : c . ExtraConfig . Scheme ,
2020-09-18 22:15:04 +00:00
ParameterCodec : metav1 . ParameterCodec ,
2021-01-13 01:27:41 +00:00
NegotiatedSerializer : c . ExtraConfig . NegotiatedSerializer ,
2020-09-18 22:15:04 +00:00
} ) ; err != nil {
return nil , fmt . Errorf ( "could not install API group %s: %w" , gvr . String ( ) , err )
2020-07-23 15:05:21 +00:00
}
2020-07-31 16:08:07 +00:00
s . GenericAPIServer . AddPostStartHookOrDie ( "start-controllers" ,
func ( postStartContext genericapiserver . PostStartHookContext ) error {
2020-11-10 15:22:16 +00:00
plog . Debug ( "start-controllers post start hook starting" )
2020-07-31 16:08:07 +00:00
ctx , cancel := context . WithCancel ( context . Background ( ) )
go func ( ) {
<- postStartContext . StopCh
cancel ( )
} ( )
c . ExtraConfig . StartControllersPostStartHook ( ctx )
2020-07-23 15:05:21 +00:00
return nil
} ,
)
return s , nil
}