1
1
package cmd
2
2
3
3
import (
4
- "context"
5
4
"crypto/tls"
6
- "errors"
7
- "net/url"
8
5
"os"
9
6
10
7
kcpapis "github.com/kcp-dev/kcp/sdk/apis/apis/v1alpha1"
11
8
kcpcore "github.com/kcp-dev/kcp/sdk/apis/core/v1alpha1"
12
9
kcptenancy "github.com/kcp-dev/kcp/sdk/apis/tenancy/v1alpha1"
13
- "github.com/openmfp/crd-gql-gateway/listener/clusterpath"
14
- "github.com/openmfp/crd-gql-gateway/listener/flags"
15
- "github.com/rs/zerolog/log"
10
+ apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
11
+
16
12
"github.com/spf13/cobra"
17
- "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
13
+
18
14
"k8s.io/apimachinery/pkg/runtime"
19
15
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
20
- kcpctrl "sigs.k8s.io/controller-runtime/pkg/kcp"
21
16
22
17
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
23
- "k8s.io/client-go/rest"
24
18
ctrl "sigs.k8s.io/controller-runtime"
25
- "sigs.k8s.io/controller-runtime/pkg/client"
26
19
"sigs.k8s.io/controller-runtime/pkg/healthz"
27
20
"sigs.k8s.io/controller-runtime/pkg/log/zap"
28
21
"sigs.k8s.io/controller-runtime/pkg/metrics/filters"
29
22
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
30
23
"sigs.k8s.io/controller-runtime/pkg/webhook"
31
24
32
- "github.com/openmfp/crd-gql-gateway/listener/apischema"
33
- "github.com/openmfp/crd-gql-gateway/listener/controller"
34
- "github.com/openmfp/crd-gql-gateway/listener/discoveryclient"
35
- "github.com/openmfp/crd-gql-gateway/listener/workspacefile"
25
+ "github.com/openmfp/crd-gql-gateway/listener/flags"
26
+ "github.com/openmfp/crd-gql-gateway/listener/kcp"
36
27
// +kubebuilder:scaffold:imports
37
28
)
38
29
@@ -50,27 +41,28 @@ var (
50
41
51
42
var listenCmd = & cobra.Command {
52
43
Use : "listen" ,
53
- Example : "KUBECONFIG=.kcp/admin. kubeconfig go run . listen" ,
44
+ Example : "KUBECONFIG=<path to kubeconfig file> go run . listen" ,
54
45
PreRun : func (cmd * cobra.Command , args []string ) {
55
46
utilruntime .Must (clientgoscheme .AddToScheme (scheme ))
56
47
57
48
utilruntime .Must (kcpapis .AddToScheme (scheme ))
58
49
utilruntime .Must (kcpcore .AddToScheme (scheme ))
59
50
utilruntime .Must (kcptenancy .AddToScheme (scheme ))
60
- utilruntime .Must (apiextensions .AddToScheme (scheme ))
51
+ utilruntime .Must (apiextensionsv1 .AddToScheme (scheme ))
61
52
// +kubebuilder:scaffold:scheme
62
53
63
- var err error
64
- opFlags , err = flags .NewFromEnv ()
65
- if err != nil {
66
- log .Fatal ().Err (err ).Msg ("Error getting app restCfg, exiting" )
67
- }
68
54
opts := zap.Options {
69
55
Development : true ,
70
56
}
71
-
72
57
ctrl .SetLogger (zap .New (zap .UseFlagOptions (& opts )))
73
58
59
+ var err error
60
+ opFlags , err = flags .NewFromEnv ()
61
+ if err != nil {
62
+ setupLog .Error (err , "failed to get operator flags from env, exiting..." )
63
+ os .Exit (1 )
64
+ }
65
+
74
66
disableHTTP2 := func (c * tls.Config ) {
75
67
setupLog .Info ("disabling http/2" )
76
68
c .NextProtos = []string {"http/1.1" }
@@ -97,75 +89,40 @@ var listenCmd = &cobra.Command{
97
89
},
98
90
Run : func (cmd * cobra.Command , args []string ) {
99
91
cfg := ctrl .GetConfigOrDie ()
100
- cfgURL , err := url .Parse (cfg .Host )
101
- if err != nil {
102
- setupLog .Error (err , "failed to parse config Host" )
103
- os .Exit (1 )
104
- }
105
- clt , err := client .New (cfg , client.Options {
106
- Scheme : scheme ,
107
- })
108
- if err != nil {
109
- setupLog .Error (err , "failed to create client from config" )
110
- os .Exit (1 )
111
- }
112
- tenancyAPIExport := & kcpapis.APIExport {}
113
- err = clt .Get (context .TODO (), client.ObjectKey {Name : kcptenancy .SchemeGroupVersion .Group }, tenancyAPIExport )
114
- if err != nil {
115
- setupLog .Error (err , "failed to get tenancy APIExport" )
116
- os .Exit (1 )
117
- }
118
- virtualWorkspaces := tenancyAPIExport .Status .VirtualWorkspaces // nolint: staticcheck
119
- if len (virtualWorkspaces ) == 0 {
120
- err := errors .New ("empty virtual workspace list" )
121
- setupLog .Error (err , "failed to get at least one virtual workspace" )
122
- os .Exit (1 )
123
- }
124
- vwCFGURL , err := url .Parse (virtualWorkspaces [0 ].URL )
125
- if err != nil {
126
- setupLog .Error (err , "failed to parse virtual workspace config URL" )
127
- os .Exit (1 )
128
- }
129
- cfgURL .Path = vwCFGURL .Path
130
- virtualWorkspaceCfg := rest .CopyConfig (cfg )
131
- virtualWorkspaceCfg .Host = cfgURL .String ()
132
92
133
- mgr , err := kcpctrl . NewClusterAwareManager ( virtualWorkspaceCfg , ctrl.Options {
93
+ mgrOpts := ctrl.Options {
134
94
Scheme : scheme ,
135
95
Metrics : metricsServerOptions ,
136
96
WebhookServer : webhookServer ,
137
97
HealthProbeBindAddress : opFlags .ProbeAddr ,
138
98
LeaderElection : opFlags .EnableLeaderElection ,
139
99
LeaderElectionID : "72231e1f.openmfp.io" ,
140
- })
100
+ }
101
+
102
+ newMgrFunc := kcp .ManagerFactory (opFlags )
103
+
104
+ mgr , err := newMgrFunc (cfg , mgrOpts )
141
105
if err != nil {
142
106
setupLog .Error (err , "unable to start manager" )
143
107
os .Exit (1 )
144
108
}
145
109
146
- ioHandler , err := workspacefile . NewIOHandler ( opFlags . OpenAPIdefinitionsPath )
147
- if err != nil {
148
- setupLog . Error ( err , "failed to create IO Handler" )
149
- os . Exit ( 1 )
110
+ reconcilerOpts := kcp. ReconcilerOpts {
111
+ Scheme : scheme ,
112
+ Config : cfg ,
113
+ OpenAPIDefinitionsPath : opFlags . OpenAPIdefinitionsPath ,
150
114
}
151
115
152
- df , err := discoveryclient .NewFactory (virtualWorkspaceCfg )
116
+ newReconcilerFunc := kcp .ReconcilerFactory (opFlags )
117
+
118
+ reconciler , err := newReconcilerFunc (reconcilerOpts )
153
119
if err != nil {
154
- setupLog .Error (err , "failed to create Discovery client factory " )
120
+ setupLog .Error (err , "unable to instantiate reconciler " )
155
121
os .Exit (1 )
156
122
}
157
123
158
- reconciler := controller .NewAPIBindingReconciler (
159
- ioHandler , df , apischema .NewResolver (), & clusterpath.Resolver {
160
- Scheme : mgr .GetScheme (),
161
- Config : cfg ,
162
- ResolverFunc : clusterpath .Resolve ,
163
- },
164
- )
165
-
166
- err = reconciler .SetupWithManager (mgr )
167
- if err != nil {
168
- setupLog .Error (err , "unable to create controller" , "controller" , "Workspace" )
124
+ if err := reconciler .SetupWithManager (mgr ); err != nil {
125
+ setupLog .Error (err , "unable to create controller" )
169
126
os .Exit (1 )
170
127
}
171
128
// +kubebuilder:scaffold:builder
@@ -181,8 +138,7 @@ var listenCmd = &cobra.Command{
181
138
182
139
setupLog .Info ("starting manager" )
183
140
signalHandler := ctrl .SetupSignalHandler ()
184
- err = mgr .Start (signalHandler )
185
- if err != nil {
141
+ if err := mgr .Start (signalHandler ); err != nil {
186
142
setupLog .Error (err , "problem running manager" )
187
143
os .Exit (1 )
188
144
}
0 commit comments