forked from openshift/hive
/
apiserver.go
131 lines (111 loc) · 5.04 KB
/
apiserver.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package apiserver
import (
"sync"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/serializer"
"k8s.io/apiserver/pkg/registry/rest"
genericapiserver "k8s.io/apiserver/pkg/server"
kubeinformers "k8s.io/client-go/informers"
corev1client "k8s.io/client-go/kubernetes/typed/core/v1"
restclient "k8s.io/client-go/rest"
hivev1client "github.com/openshift/hive/pkg/client/clientset-generated/clientset/typed/hive/v1"
hivev1alpha1 "github.com/openshift/hive/pkg/apis/hive/v1alpha1"
"github.com/openshift/hive/pkg/hive/apiserver/registry/checkpoint"
"github.com/openshift/hive/pkg/hive/apiserver/registry/clusterdeployment"
"github.com/openshift/hive/pkg/hive/apiserver/registry/clusterdeprovisionrequest"
"github.com/openshift/hive/pkg/hive/apiserver/registry/clusterimageset"
"github.com/openshift/hive/pkg/hive/apiserver/registry/clusterprovision"
"github.com/openshift/hive/pkg/hive/apiserver/registry/clusterstate"
"github.com/openshift/hive/pkg/hive/apiserver/registry/dnszone"
"github.com/openshift/hive/pkg/hive/apiserver/registry/hiveconfig"
"github.com/openshift/hive/pkg/hive/apiserver/registry/selectorsyncidentityprovider"
"github.com/openshift/hive/pkg/hive/apiserver/registry/selectorsyncset"
"github.com/openshift/hive/pkg/hive/apiserver/registry/syncidentityprovider"
"github.com/openshift/hive/pkg/hive/apiserver/registry/syncset"
"github.com/openshift/hive/pkg/hive/apiserver/registry/syncsetinstance"
)
// ExtraConfig is extra config for the Hive API server.
type ExtraConfig struct {
KubeAPIServerClientConfig *restclient.Config
KubeInformers kubeinformers.SharedInformerFactory
// TODO these should all become local eventually
Scheme *runtime.Scheme
Codecs serializer.CodecFactory
makeV1Storage sync.Once
v1Storage map[string]rest.Storage
v1StorageErr error
}
// HiveAPIServerConfig is the config for the Hive API server.
type HiveAPIServerConfig struct {
GenericConfig *genericapiserver.RecommendedConfig
ExtraConfig ExtraConfig
}
// HiveAPIServer is an aggregated API server serving v1alpha1 as a proxy to v1.
type HiveAPIServer struct {
GenericAPIServer *genericapiserver.GenericAPIServer
}
// CompletedConfig is the completed config for the Hive API server.
type CompletedConfig struct {
GenericConfig genericapiserver.CompletedConfig
ExtraConfig *ExtraConfig
}
// Complete fills in any fields not set that are required to have valid data. It's mutating the receiver.
func (c *HiveAPIServerConfig) Complete() CompletedConfig {
return CompletedConfig{
c.GenericConfig.Complete(),
&c.ExtraConfig,
}
}
// New returns a new instance of HiveAPIServer from the given config.
func (c CompletedConfig) New(delegationTarget genericapiserver.DelegationTarget) (*HiveAPIServer, error) {
genericServer, err := c.GenericConfig.New("authorization.openshift.io-apiserver", delegationTarget)
if err != nil {
return nil, err
}
s := &HiveAPIServer{
GenericAPIServer: genericServer,
}
v1Alpha1Storage, err := c.V1Alpha1RESTStorage()
if err != nil {
return nil, err
}
apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(hivev1alpha1.GroupName, c.ExtraConfig.Scheme, metav1.ParameterCodec, c.ExtraConfig.Codecs)
apiGroupInfo.VersionedResourcesStorageMap[hivev1alpha1.SchemeGroupVersion.Version] = v1Alpha1Storage
if err := s.GenericAPIServer.InstallAPIGroup(&apiGroupInfo); err != nil {
return nil, err
}
return s, nil
}
// V1Alpha1RESTStorage creates the storage to use for each of the Hive v1alpha1 kinds.
func (c *CompletedConfig) V1Alpha1RESTStorage() (map[string]rest.Storage, error) {
c.ExtraConfig.makeV1Storage.Do(func() {
c.ExtraConfig.v1Storage, c.ExtraConfig.v1StorageErr = c.newV1Alpha1RESTStorage()
})
return c.ExtraConfig.v1Storage, c.ExtraConfig.v1StorageErr
}
func (c *CompletedConfig) newV1Alpha1RESTStorage() (map[string]rest.Storage, error) {
hiveClient, err := hivev1client.NewForConfig(c.ExtraConfig.KubeAPIServerClientConfig)
if err != nil {
return nil, err
}
coreClient, err := corev1client.NewForConfig(c.ExtraConfig.KubeAPIServerClientConfig)
if err != nil {
return nil, err
}
v1Storage := map[string]rest.Storage{}
v1Storage["checkpoints"] = checkpoint.NewREST(hiveClient)
v1Storage["clusterDeployments"] = clusterdeployment.NewREST(hiveClient, coreClient)
v1Storage["clusterDeprovisionRequests"] = clusterdeprovisionrequest.NewREST(hiveClient)
v1Storage["clusterImageSets"] = clusterimageset.NewREST(hiveClient)
v1Storage["clusterProvisions"] = clusterprovision.NewREST(hiveClient)
v1Storage["clusterStates"] = clusterstate.NewREST(hiveClient)
v1Storage["dnsZones"] = dnszone.NewREST(hiveClient)
v1Storage["hiveConfigs"] = hiveconfig.NewREST(hiveClient)
v1Storage["syncIdentityProviders"] = syncidentityprovider.NewREST(hiveClient)
v1Storage["selectorSyncIdentityProviders"] = selectorsyncidentityprovider.NewREST(hiveClient)
v1Storage["syncSets"] = syncset.NewREST(hiveClient)
v1Storage["selectorSyncSets"] = selectorsyncset.NewREST(hiveClient)
v1Storage["syncSetInstances"] = syncsetinstance.NewREST(hiveClient)
return v1Storage, nil
}