Files
my-rook-config/cmd/rook/util/cmdreporter.go
T
Sébastien Han 121c2987e3 ceph: stop using tini
We don't need to use tini.
We don't have anything in the rook operator that would
either create zombie processes (no threads) or use
exec (to fork). The Go binary has a really good
signal handling mechanism.

Closes: https://github.com/rook/rook/issues/8794
Signed-off-by: Sébastien Han <seb@redhat.com>
2021-09-27 10:54:16 +02:00

103 lines
3.5 KiB
Go

/*
Copyright 2019 The Rook Authors. All rights reserved.
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.
*/
package util
import (
"context"
"fmt"
"os/signal"
"github.com/rook/rook/pkg/daemon/util"
operator "github.com/rook/rook/pkg/operator/ceph"
"github.com/rook/rook/cmd/rook/rook"
"github.com/spf13/cobra"
)
// CmdReporterCmd defines a top-level utility command which runs a given command and stores the
// results in a ConfigMap. Operators are advised to use operator/k8sutil.CmdReporter, which wraps
// this functionality neatly rather than calling this with a custom setup.
var CmdReporterCmd = &cobra.Command{
Use: "cmd-reporter",
Short: "Run a given command to completion, and store the result in a ConfigMap.",
Long: `Run a given command to completion, and store the Stdout, Stderr, and return code
results of the command in a ConfigMap. If the ConfigMap already exists, the
Stdout, Stderr, and return code data which may be present in the ConfigMap
will be overwritten.
If cmd-reporter succeeds in running the command to completion, no error is
reported, even if the command's return code is nonzero (failure). Run will
terminate if the command could not be run for any reason or if there was an
error storing the command results into the ConfigMap. An application label
is applied to the ConfigMap. Run will also terminate if the label already
exists and has a different application's name name; this may indicate that
it is not safe for cmd-reporter to edit the ConfigMap.`,
Args: cobra.NoArgs,
Run: runCmdReporter,
}
var (
// run sub-command
commandString string
configMapName string
namespace string
// copy-binaries sub-command
copyToDir string
)
func init() {
// cmd-reporter
CmdReporterCmd.Flags().StringVar(&commandString, "command", "",
"The command to run in JSON list syntax. e.g., '[\"command\", \"--flag\", \"value\", \"arg\"]'")
if err := CmdReporterCmd.MarkFlagRequired("command"); err != nil {
panic(err)
}
CmdReporterCmd.Flags().StringVar(&configMapName, "config-map-name", "",
"The name of the ConfigMap into which the result of the command will be stored.")
if err := CmdReporterCmd.MarkFlagRequired("config-map-name"); err != nil {
panic(err)
}
CmdReporterCmd.Flags().StringVar(&namespace, "namespace", "", "The namespace in which to create the ConfigMap.")
if err := CmdReporterCmd.MarkFlagRequired("namespace"); err != nil {
panic(err)
}
}
func runCmdReporter(cCmd *cobra.Command, cArgs []string) {
// Initialize the context
ctx, cancel := signal.NotifyContext(context.Background(), operator.ShutdownSignals...)
defer cancel()
cmd, args, err := util.CmdReporterFlagArgumentToCommand(commandString)
if err != nil {
rook.TerminateFatal(fmt.Errorf("failed to parse '--command' argument [%s]. %+v", commandString, err))
}
context := rook.NewContext()
reporter, err := util.NewCmdReporter(ctx, context.Clientset, cmd, args, configMapName, namespace)
if err != nil {
rook.TerminateFatal(fmt.Errorf("cannot start command-reporter. %+v", err))
}
err = reporter.Run()
if err != nil {
rook.TerminateFatal(err)
}
}