From efb5d3fb34273a8208fea271a2459b266b24f762 Mon Sep 17 00:00:00 2001 From: jwierzbo Date: Wed, 10 Nov 2021 14:48:41 +0100 Subject: [PATCH] TG-158 [Feature] Operator Wait command (#825) * TG-158 [Feature] Operator Wait command * TG-158 [Feature] Add missing licence * MacOS adjustments --- CHANGELOG.md | 1 + docs/design/maintenance.md | 11 ++++ lifecycle.go | 1 + lifecycle_wait.go | 100 +++++++++++++++++++++++++++++++++++++ 4 files changed, 113 insertions(+) create mode 100644 lifecycle_wait.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 74fd461f1..a59465af4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Drop support for ArangoDB <= 3.5 (versions already EOL) - Add new admin commands to fetch agency dump and agency state - Add Graceful shutdown as finalizer (supports kubectl delete) +- Add Watch to Lifecycle command ## [1.2.4](https://github.com/arangodb/kube-arangodb/tree/1.2.4) (2021-10-22) - Replace `beta.kubernetes.io/arch` Pod label with `kubernetes.io/arch` using Silent Rotation diff --git a/docs/design/maintenance.md b/docs/design/maintenance.md index afbf9f6af..b9255b7a8 100644 --- a/docs/design/maintenance.md +++ b/docs/design/maintenance.md @@ -1,5 +1,16 @@ # Maintenance +## Development on MacOS + +This repo requires GNU command line tools instead BSD one (which are by default available on Mac). + +Please add following to your `~/bashrc` or `~/.zshrc` file (it requires Hombebrew to be installed): + +```shell +HOMEBREW_PREFIX=$(brew --prefix) +for d in ${HOMEBREW_PREFIX}/opt/*/libexec/gnubin; do export PATH=$d:$PATH; done +``` + ## ArangoDeployment Maintenance on ArangoDeployment can be enabled using annotation. diff --git a/lifecycle.go b/lifecycle.go index 6626b9a6e..37cbb4308 100644 --- a/lifecycle.go +++ b/lifecycle.go @@ -91,6 +91,7 @@ func init() { cmdLifecycle.AddCommand(cmdLifecyclePreStop) cmdLifecycle.AddCommand(cmdLifecycleCopy) cmdLifecycle.AddCommand(cmdLifecycleProbe) + cmdLifecycle.AddCommand(cmdLifecycleWait) cmdLifecycleCopy.Flags().StringVar(&lifecycleCopyOptions.TargetDir, "target", "", "Target directory to copy the executable to") } diff --git a/lifecycle_wait.go b/lifecycle_wait.go new file mode 100644 index 000000000..979f02158 --- /dev/null +++ b/lifecycle_wait.go @@ -0,0 +1,100 @@ +// +// DISCLAIMER +// +// Copyright 2016-2021 ArangoDB GmbH, Cologne, Germany +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Copyright holder is ArangoDB GmbH, Cologne, Germany +// + +package main + +import ( + "context" + "fmt" + "os" + "time" + + v1 "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1" + "github.com/arangodb/kube-arangodb/pkg/util" + "github.com/arangodb/kube-arangodb/pkg/util/constants" + + "github.com/spf13/cobra" +) + +const ( + ArgDeploymentWatchTimeout = "watch-timeout" + WatchDefaultTimeout = time.Minute * 5 + WatchCheckInterval = time.Second * 5 +) + +var ( + cmdLifecycleWait = &cobra.Command{ + Use: "wait", + Short: "Wait for specific ArangoDeployment", + Long: "Wait for ArangoDeployment till it will reach UpToDate condition", + Run: cmdLifecycleWaitCheck, + } +) + +func init() { + var deploymentName string + var watchTimeout time.Duration + + cmdLifecycleWait.Flags().StringVarP(&deploymentName, ArgDeploymentName, "d", "", + "Name of ArangoDeployment to watch - necessary when more than one deployment exist within one namespace") + cmdLifecycleWait.Flags().DurationVarP(&watchTimeout, ArgDeploymentWatchTimeout, "t", WatchDefaultTimeout, + "Watch timeout") +} + +func cmdLifecycleWaitCheck(cmd *cobra.Command, _ []string) { + ctx := util.CreateSignalContext(context.Background()) + + deploymentName, err := cmd.Flags().GetString(ArgDeploymentName) + if err != nil { + cliLog.Fatal().Err(err).Msg(fmt.Sprintf("error parsing argument: %s", ArgDeploymentName)) + } + watchTimeout, err := cmd.Flags().GetDuration(ArgDeploymentWatchTimeout) + if err != nil { + cliLog.Fatal().Err(err).Msg(fmt.Sprintf("error parsing argument: %s", ArgDeploymentWatchTimeout)) + } + + for { + d, err := getDeployment(ctx, os.Getenv(constants.EnvOperatorPodNamespace), deploymentName) + if err != nil { + cliLog.Fatal().Err(err).Msg(fmt.Sprintf("error getting ArangoDeployment: %s", d.Name)) + } + + isUpToDate, err := d.IsUpToDate() + if err != nil { + cliLog.Err(err).Msg(fmt.Sprintf("error checking Status for ArangoDeployment: %s", d.Name)) + } + + if isUpToDate { + cliLog.Info().Msg(fmt.Sprintf("ArangoDeployment: %s is %s", d.Name, v1.ConditionTypeUpToDate)) + return + } + + select { + case <-ctx.Done(): + return + case <-time.After(WatchCheckInterval): + cliLog.Info().Msg(fmt.Sprintf("ArangoDeployment: %s is not ready yet. Waiting...", d.Name)) + continue + case <-time.After(watchTimeout): + cliLog.Error().Msg(fmt.Sprintf("ArangoDeployment: %s is not %s yet - operation timed out!", d.Name, v1.ConditionTypeUpToDate)) + return + } + } +}