@@ -28,11 +28,15 @@ import (
2828 goflag "flag"
2929 "fmt"
3030 "net"
31+ "net/http"
3132 "os"
3233 "strconv"
3334 "strings"
3435 "time"
3536
37+ operatorHTTP "github.com/arangodb/kube-arangodb/pkg/util/http"
38+ "github.com/gin-gonic/gin"
39+
3640 "github.com/arangodb/kube-arangodb/pkg/version"
3741
3842 "github.com/arangodb/kube-arangodb/pkg/util/arangod"
@@ -110,6 +114,7 @@ var (
110114 enableDeploymentReplication bool // Run deployment-replication operator
111115 enableStorage bool // Run local-storage operator
112116 enableBackup bool // Run backup operator
117+ versionOnly bool // Run only version endpoint, explicitly disabled with other
113118
114119 alpineImage , metricsExporterImage , arangoImage string
115120
@@ -143,6 +148,7 @@ func init() {
143148 f .BoolVar (& operatorOptions .enableDeploymentReplication , "operator.deployment-replication" , false , "Enable to run the ArangoDeploymentReplication operator" )
144149 f .BoolVar (& operatorOptions .enableStorage , "operator.storage" , false , "Enable to run the ArangoLocalStorage operator" )
145150 f .BoolVar (& operatorOptions .enableBackup , "operator.backup" , false , "Enable to run the ArangoBackup operator" )
151+ f .BoolVar (& operatorOptions .versionOnly , "operator.version" , false , "Enable only version endpoint in Operator" )
146152 f .StringVar (& operatorOptions .alpineImage , "operator.alpine-image" , UBIImageEnv .GetOrDefault (defaultAlpineImage ), "Docker image used for alpine containers" )
147153 f .MarkDeprecated ("operator.alpine-image" , "Value is not used anymore" )
148154 f .StringVar (& operatorOptions .metricsExporterImage , "operator.metrics-exporter-image" , MetricsExporterImageEnv .GetOrDefault (defaultMetricsExporterImage ), "Docker image used for metrics containers by default" )
@@ -198,7 +204,11 @@ func cmdMainRun(cmd *cobra.Command, args []string) {
198204
199205 // Check operating mode
200206 if ! operatorOptions .enableDeployment && ! operatorOptions .enableDeploymentReplication && ! operatorOptions .enableStorage && ! operatorOptions .enableBackup {
201- cliLog .Fatal ().Err (err ).Msg ("Turn on --operator.deployment, --operator.deployment-replication, --operator.storage, --operator.backup or any combination of these" )
207+ if ! operatorOptions .versionOnly {
208+ cliLog .Fatal ().Err (err ).Msg ("Turn on --operator.deployment, --operator.deployment-replication, --operator.storage, --operator.backup or any combination of these" )
209+ }
210+ } else if operatorOptions .versionOnly {
211+ cliLog .Fatal ().Err (err ).Msg ("Options --operator.deployment, --operator.deployment-replication, --operator.storage, --operator.backup cannot be enabled together with --operator.version" )
202212 }
203213
204214 // Log version
@@ -208,81 +218,111 @@ func cmdMainRun(cmd *cobra.Command, args []string) {
208218 Msgf ("Starting arangodb-operator (%s), version %s build %s" , version .GetVersionV1 ().Edition .Title (), version .GetVersionV1 ().Version , version .GetVersionV1 ().Build )
209219
210220 // Check environment
211- if len (namespace ) == 0 {
212- cliLog .Fatal ().Msgf ("%s environment variable missing" , constants .EnvOperatorPodNamespace )
213- }
214- if len (name ) == 0 {
215- cliLog .Fatal ().Msgf ("%s environment variable missing" , constants .EnvOperatorPodName )
216- }
217- if len (ip ) == 0 {
218- cliLog .Fatal ().Msgf ("%s environment variable missing" , constants .EnvOperatorPodIP )
219- }
221+ if ! operatorOptions .versionOnly {
222+ if len (namespace ) == 0 {
223+ cliLog .Fatal ().Msgf ("%s environment variable missing" , constants .EnvOperatorPodNamespace )
224+ }
225+ if len (name ) == 0 {
226+ cliLog .Fatal ().Msgf ("%s environment variable missing" , constants .EnvOperatorPodName )
227+ }
228+ if len (ip ) == 0 {
229+ cliLog .Fatal ().Msgf ("%s environment variable missing" , constants .EnvOperatorPodIP )
230+ }
220231
221- // Get host name
222- id , err := os .Hostname ()
223- if err != nil {
224- cliLog .Fatal ().Err (err ).Msg ("Failed to get hostname" )
225- }
232+ // Get host name
233+ id , err := os .Hostname ()
234+ if err != nil {
235+ cliLog .Fatal ().Err (err ).Msg ("Failed to get hostname" )
236+ }
226237
227- // Create kubernetes client
228- kubecli , err := k8sutil .NewKubeClient ()
229- if err != nil {
230- cliLog .Fatal ().Err (err ).Msg ("Failed to create Kubernetes client" )
231- }
232- secrets := kubecli .CoreV1 ().Secrets (namespace )
238+ // Create kubernetes client
239+ kubecli , err := k8sutil .NewKubeClient ()
240+ if err != nil {
241+ cliLog .Fatal ().Err (err ).Msg ("Failed to create Kubernetes client" )
242+ }
243+ secrets := kubecli .CoreV1 ().Secrets (namespace )
233244
234- // Create operator
235- cfg , deps , err := newOperatorConfigAndDeps (id + "-" + name , namespace , name )
236- if err != nil {
237- cliLog .Fatal ().Err (err ).Msg ("Failed to create operator config & deps" )
238- }
239- o , err := operator .NewOperator (cfg , deps )
240- if err != nil {
241- cliLog .Fatal ().Err (err ).Msg ("Failed to create operator" )
245+ // Create operator
246+ cfg , deps , err := newOperatorConfigAndDeps (id + "-" + name , namespace , name )
247+ if err != nil {
248+ cliLog .Fatal ().Err (err ).Msg ("Failed to create operator config & deps" )
249+ }
250+ o , err := operator .NewOperator (cfg , deps )
251+ if err != nil {
252+ cliLog .Fatal ().Err (err ).Msg ("Failed to create operator" )
253+ }
254+
255+ listenAddr := net .JoinHostPort (serverOptions .host , strconv .Itoa (serverOptions .port ))
256+ if svr , err := server .NewServer (kubecli .CoreV1 (), server.Config {
257+ Namespace : namespace ,
258+ Address : listenAddr ,
259+ TLSSecretName : serverOptions .tlsSecretName ,
260+ TLSSecretNamespace : namespace ,
261+ PodName : name ,
262+ PodIP : ip ,
263+ AdminSecretName : serverOptions .adminSecretName ,
264+ AllowAnonymous : serverOptions .allowAnonymous ,
265+ }, server.Dependencies {
266+ Log : logService .MustGetLogger (logging .LoggerNameServer ),
267+ LivenessProbe : & livenessProbe ,
268+ Deployment : server.OperatorDependency {
269+ Enabled : cfg .EnableDeployment ,
270+ Probe : & deploymentProbe ,
271+ },
272+ DeploymentReplication : server.OperatorDependency {
273+ Enabled : cfg .EnableDeploymentReplication ,
274+ Probe : & deploymentReplicationProbe ,
275+ },
276+ Storage : server.OperatorDependency {
277+ Enabled : cfg .EnableStorage ,
278+ Probe : & storageProbe ,
279+ },
280+ Backup : server.OperatorDependency {
281+ Enabled : cfg .EnableBackup ,
282+ Probe : & backupProbe ,
283+ },
284+ Operators : o ,
285+
286+ Secrets : secrets ,
287+ }); err != nil {
288+ cliLog .Fatal ().Err (err ).Msg ("Failed to create HTTP server" )
289+ } else {
290+ go utilsError .LogError (cliLog , "error while starting service" , svr .Run )
291+ }
292+
293+ // startChaos(context.Background(), cfg.KubeCli, cfg.Namespace, chaosLevel)
294+
295+ // Start operator
296+ o .Run ()
297+ } else {
298+ if err := startVersionProcess (); err != nil {
299+ cliLog .Fatal ().Err (err ).Msg ("Failed to create HTTP server" )
300+ }
242301 }
302+ }
243303
304+ func startVersionProcess () error {
305+ // Just expose version
244306 listenAddr := net .JoinHostPort (serverOptions .host , strconv .Itoa (serverOptions .port ))
245- if svr , err := server .NewServer (kubecli .CoreV1 (), server.Config {
246- Namespace : namespace ,
247- Address : listenAddr ,
248- TLSSecretName : serverOptions .tlsSecretName ,
249- TLSSecretNamespace : namespace ,
250- PodName : name ,
251- PodIP : ip ,
252- AdminSecretName : serverOptions .adminSecretName ,
253- AllowAnonymous : serverOptions .allowAnonymous ,
254- }, server.Dependencies {
255- Log : logService .MustGetLogger (logging .LoggerNameServer ),
256- LivenessProbe : & livenessProbe ,
257- Deployment : server.OperatorDependency {
258- Enabled : cfg .EnableDeployment ,
259- Probe : & deploymentProbe ,
260- },
261- DeploymentReplication : server.OperatorDependency {
262- Enabled : cfg .EnableDeploymentReplication ,
263- Probe : & deploymentReplicationProbe ,
264- },
265- Storage : server.OperatorDependency {
266- Enabled : cfg .EnableStorage ,
267- Probe : & storageProbe ,
268- },
269- Backup : server.OperatorDependency {
270- Enabled : cfg .EnableBackup ,
271- Probe : & backupProbe ,
272- },
273- Operators : o ,
274-
275- Secrets : secrets ,
276- }); err != nil {
277- cliLog .Fatal ().Err (err ).Msg ("Failed to create HTTP server" )
278- } else {
279- go utilsError .LogError (cliLog , "error while starting service" , svr .Run )
307+ cliLog .Info ().Str ("addr" , listenAddr ).Msgf ("Starting version endpoint" )
308+
309+ gin .SetMode (gin .ReleaseMode )
310+ r := gin .New ()
311+ r .Use (gin .Recovery ())
312+
313+ versionV1Responser , err := operatorHTTP .NewSimpleJSONResponse (version .GetVersionV1 ())
314+ if err != nil {
315+ return errors .WithStack (err )
280316 }
317+ r .GET ("/_api/version" , gin .WrapF (versionV1Responser .ServeHTTP ))
318+ r .GET ("/api/v1/version" , gin .WrapF (versionV1Responser .ServeHTTP ))
281319
282- // startChaos(context.Background(), cfg.KubeCli, cfg.Namespace, chaosLevel)
320+ s := http.Server {
321+ Addr : listenAddr ,
322+ Handler : r ,
323+ }
283324
284- // Start operator
285- o .Run ()
325+ return s .ListenAndServe ()
286326}
287327
288328// newOperatorConfigAndDeps creates operator config & dependencies.
0 commit comments