Skip to content

Commit 30243cb

Browse files
committed
[Feature] [Platform] Storage Debug
1 parent dd01c7b commit 30243cb

File tree

18 files changed

+303
-18
lines changed

18 files changed

+303
-18
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ Flags:
204204
--kubernetes.qps float32 Number of queries per second for k8s API (default 32)
205205
--leader.label.skip Skips Leader Label for the Pod
206206
--log.format string Set log format. Allowed values: 'pretty', 'JSON'. If empty, default format is used (default "pretty")
207-
--log.level stringArray Set log levels in format <level> or <logger>=<level>. Possible loggers: action, agency, api-server, assertion, backup-operator, chaos-monkey, crd, deployment, deployment-ci, deployment-reconcile, deployment-replication, deployment-resilience, deployment-resources, deployment-storage, deployment-storage-pc, deployment-storage-service, generic-parent-operator, helm, http, inspector, integration-authn-v1, integration-config-v1, integration-envoy-auth-v3, integration-envoy-auth-v3-impl-auth-bearer, integration-envoy-auth-v3-impl-auth-cookie, integration-envoy-auth-v3-impl-custom-openid, integration-envoy-auth-v3-impl-pass-mode, integration-meta-v1, integration-scheduler-v2, integration-storage-v1-s3, integration-storage-v2, integrations, k8s-client, kubernetes, kubernetes-access, kubernetes-client, kubernetes-informer, monitor, networking-route-operator, operator, operator-arangojob-handler, operator-v2, operator-v2-event, operator-v2-worker, panics, platform-chart-operator, platform-pod-shutdown, platform-service-operator, platform-storage-operator, pod_compare, root, root-event-recorder, scheduler-batchjob-operator, scheduler-cronjob-operator, scheduler-deployment-operator, scheduler-pod-operator, scheduler-profile-operator, server, server-authentication, webhook (default [info])
207+
--log.level stringArray Set log levels in format <level> or <logger>=<level>. Possible loggers: action, agency, api-server, assertion, backup-operator, chaos-monkey, crd, deployment, deployment-ci, deployment-reconcile, deployment-replication, deployment-resilience, deployment-resources, deployment-storage, deployment-storage-pc, deployment-storage-service, generic-parent-operator, helm, http, inspector, integration-authn-v1, integration-config-v1, integration-envoy-auth-v3, integration-envoy-auth-v3-impl-auth-bearer, integration-envoy-auth-v3-impl-auth-cookie, integration-envoy-auth-v3-impl-custom-openid, integration-envoy-auth-v3-impl-pass-mode, integration-meta-v1, integration-scheduler-v2, integration-shutdown-v1, integration-storage-v1-s3, integration-storage-v2, integrations, k8s-client, kubernetes, kubernetes-access, kubernetes-client, kubernetes-informer, monitor, networking-route-operator, operator, operator-arangojob-handler, operator-v2, operator-v2-event, operator-v2-worker, panics, platform-chart-operator, platform-pod-shutdown, platform-service-operator, platform-storage-operator, pod_compare, root, root-event-recorder, scheduler-batchjob-operator, scheduler-cronjob-operator, scheduler-deployment-operator, scheduler-pod-operator, scheduler-profile-operator, server, server-authentication, webhook (default [info])
208208
--log.sampling If true, operator will try to minimize duplication of logging events (default true)
209209
--log.stdout If true, operator will log to the stdout (default true)
210210
--memory-limit uint Define memory limit for hard shutdown and the dump of goroutines. Used for testing

docs/cli/arangodb_operator.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ Flags:
8686
--kubernetes.qps float32 Number of queries per second for k8s API (default 32)
8787
--leader.label.skip Skips Leader Label for the Pod
8888
--log.format string Set log format. Allowed values: 'pretty', 'JSON'. If empty, default format is used (default "pretty")
89-
--log.level stringArray Set log levels in format <level> or <logger>=<level>. Possible loggers: action, agency, api-server, assertion, backup-operator, chaos-monkey, crd, deployment, deployment-ci, deployment-reconcile, deployment-replication, deployment-resilience, deployment-resources, deployment-storage, deployment-storage-pc, deployment-storage-service, generic-parent-operator, helm, http, inspector, integration-authn-v1, integration-config-v1, integration-envoy-auth-v3, integration-envoy-auth-v3-impl-auth-bearer, integration-envoy-auth-v3-impl-auth-cookie, integration-envoy-auth-v3-impl-custom-openid, integration-envoy-auth-v3-impl-pass-mode, integration-meta-v1, integration-scheduler-v2, integration-storage-v1-s3, integration-storage-v2, integrations, k8s-client, kubernetes, kubernetes-access, kubernetes-client, kubernetes-informer, monitor, networking-route-operator, operator, operator-arangojob-handler, operator-v2, operator-v2-event, operator-v2-worker, panics, platform-chart-operator, platform-pod-shutdown, platform-service-operator, platform-storage-operator, pod_compare, root, root-event-recorder, scheduler-batchjob-operator, scheduler-cronjob-operator, scheduler-deployment-operator, scheduler-pod-operator, scheduler-profile-operator, server, server-authentication, webhook (default [info])
89+
--log.level stringArray Set log levels in format <level> or <logger>=<level>. Possible loggers: action, agency, api-server, assertion, backup-operator, chaos-monkey, crd, deployment, deployment-ci, deployment-reconcile, deployment-replication, deployment-resilience, deployment-resources, deployment-storage, deployment-storage-pc, deployment-storage-service, generic-parent-operator, helm, http, inspector, integration-authn-v1, integration-config-v1, integration-envoy-auth-v3, integration-envoy-auth-v3-impl-auth-bearer, integration-envoy-auth-v3-impl-auth-cookie, integration-envoy-auth-v3-impl-custom-openid, integration-envoy-auth-v3-impl-pass-mode, integration-meta-v1, integration-scheduler-v2, integration-shutdown-v1, integration-storage-v1-s3, integration-storage-v2, integrations, k8s-client, kubernetes, kubernetes-access, kubernetes-client, kubernetes-informer, monitor, networking-route-operator, operator, operator-arangojob-handler, operator-v2, operator-v2-event, operator-v2-worker, panics, platform-chart-operator, platform-pod-shutdown, platform-service-operator, platform-storage-operator, pod_compare, root, root-event-recorder, scheduler-batchjob-operator, scheduler-cronjob-operator, scheduler-deployment-operator, scheduler-pod-operator, scheduler-profile-operator, server, server-authentication, webhook (default [info])
9090
--log.sampling If true, operator will try to minimize duplication of logging events (default true)
9191
--log.stdout If true, operator will log to the stdout (default true)
9292
--memory-limit uint Define memory limit for hard shutdown and the dump of goroutines. Used for testing

docs/cli/arangodb_operator_integration.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ Flags:
7474
--integration.scheduler.v2.internal Defines if Internal access to service scheduler.v2 is enabled (Env: INTEGRATION_SCHEDULER_V2_INTERNAL) (default true)
7575
--integration.scheduler.v2.namespace string Kubernetes Namespace (Env: INTEGRATION_SCHEDULER_V2_NAMESPACE) (default "default")
7676
--integration.shutdown.v1 ShutdownV1 Handler (Env: INTEGRATION_SHUTDOWN_V1)
77+
--integration.shutdown.v1.debug.enabled Defines if debug extension is enabled (Env: INTEGRATION_SHUTDOWN_V1_DEBUG_ENABLED)
78+
--integration.shutdown.v1.debug.path string Path of the Debug Directory (Env: INTEGRATION_SHUTDOWN_V1_DEBUG_PATH) (default "/debug")
79+
--integration.shutdown.v1.debug.timeout duration Timeout of the Debug action (Env: INTEGRATION_SHUTDOWN_V1_DEBUG_TIMEOUT) (default 1m0s)
7780
--integration.shutdown.v1.external Defines if External access to service shutdown.v1 is enabled (Env: INTEGRATION_SHUTDOWN_V1_EXTERNAL)
7881
--integration.shutdown.v1.internal Defines if Internal access to service shutdown.v1 is enabled (Env: INTEGRATION_SHUTDOWN_V1_INTERNAL) (default true)
7982
--integration.storage.v2 StorageBucket V2 Integration (Env: INTEGRATION_STORAGE_V2)

docs/integration-sidecar.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ Integration Sidecar is supported in a few resources managed by Operator:
1919
- ArangoSchedulerCronJob (scheduler.arangodb.com/v1beta1)
2020
- ArangoSchedulerPod (scheduler.arangodb.com/v1beta1)
2121

22+
S tandard Kubernetes Resources (like Pod) are also supported with Webhook extension is enabled.
23+
2224
To enable integration sidecar for specific deployment label needs to be defined:
2325

2426
```yaml
@@ -97,6 +99,9 @@ To enable:
9799
metadata:
98100
labels:
99101
integration.profiles.arangodb.com/storage: v1
102+
103+
# Optionally, enable DebugPackage integration
104+
storage.integration.profiles.arangodb.com/debug: "enabled"
100105
```
101106
102107
#### [Storage V2](./integration/storage.v2.md)

docs/integration/shutdown.v1.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,15 @@ spec:
3131
```
3232
3333
Pod will receive shutdown request on port `port1` if containers `app` and `app2` will be in non running state.
34+
35+
## Extensions
36+
37+
### DebugPackage PreShutdown Hook
38+
39+
Example:
40+
41+
```yaml
42+
metadata:
43+
labels:
44+
core.shutdown.arangodb.com/app: "wait"
45+
```
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//
2+
// DISCLAIMER
3+
//
4+
// Copyright 2025 ArangoDB GmbH, Cologne, Germany
5+
//
6+
// Licensed under the Apache License, Version 2.0 (the "License");
7+
// you may not use this file except in compliance with the License.
8+
// You may obtain a copy of the License at
9+
//
10+
// http://www.apache.org/licenses/LICENSE-2.0
11+
//
12+
// Unless required by applicable law or agreed to in writing, software
13+
// distributed under the License is distributed on an "AS IS" BASIS,
14+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
// See the License for the specific language governing permissions and
16+
// limitations under the License.
17+
//
18+
// Copyright holder is ArangoDB GmbH, Cologne, Germany
19+
//
20+
21+
package v1
22+
23+
import "time"
24+
25+
type Configuration struct {
26+
Debug ConfigurationDebug `json:"debug,omitempty"`
27+
}
28+
29+
type ConfigurationDebug struct {
30+
Enabled bool `json:"enabled,omitempty"`
31+
32+
Path string `json:"path,omitempty"`
33+
34+
Timeout time.Duration `json:"timeout,omitempty"`
35+
}

integrations/shutdown/v1/impl.go

Lines changed: 63 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,33 @@ package v1
2222

2323
import (
2424
"context"
25+
"io/fs"
26+
"path/filepath"
27+
goStrings "strings"
2528
"time"
2629

2730
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
2831
"google.golang.org/grpc"
2932

3033
pbSharedV1 "github.com/arangodb/kube-arangodb/integrations/shared/v1/definition"
3134
pbShutdownV1 "github.com/arangodb/kube-arangodb/integrations/shutdown/v1/definition"
35+
pbStorageV2 "github.com/arangodb/kube-arangodb/integrations/storage/v2/definition"
36+
"github.com/arangodb/kube-arangodb/pkg/util/closer"
37+
"github.com/arangodb/kube-arangodb/pkg/util/constants"
38+
"github.com/arangodb/kube-arangodb/pkg/util/errors"
39+
ugrpc "github.com/arangodb/kube-arangodb/pkg/util/grpc"
3240
"github.com/arangodb/kube-arangodb/pkg/util/svc"
3341
)
3442

35-
func New(closer context.CancelFunc) svc.Handler {
36-
return &impl{closer: closer}
43+
func New(cfg Configuration, c context.CancelFunc) svc.Handler {
44+
var z = &impl{
45+
closer: c,
46+
cfg: cfg,
47+
}
48+
49+
z.close = closer.CloseOnce(z)
50+
51+
return z
3752
}
3853

3954
var _ pbShutdownV1.ShutdownV1Server = &impl{}
@@ -42,9 +57,50 @@ var _ svc.Handler = &impl{}
4257
type impl struct {
4358
pbShutdownV1.UnimplementedShutdownV1Server
4459

60+
cfg Configuration
61+
62+
close closer.Close
63+
4564
closer context.CancelFunc
4665
}
4766

67+
func (i *impl) Close() error {
68+
defer i.closer()
69+
70+
ctx, c := context.WithTimeout(context.Background(), i.cfg.Debug.Timeout)
71+
defer c()
72+
73+
time.Sleep(50 * time.Millisecond)
74+
75+
if i.cfg.Debug.Enabled {
76+
// Need to fetch Debug Details
77+
if addr, ok := constants.INTEGRATION_SERVICE_ADDRESS.Lookup(); ok {
78+
client, close, err := ugrpc.NewGRPCClient(ctx, pbStorageV2.NewStorageV2Client, addr)
79+
if err != nil {
80+
return err
81+
}
82+
83+
defer close.Close()
84+
85+
if err := filepath.Walk(i.cfg.Debug.Path, func(path string, info fs.FileInfo, err error) error {
86+
k := goStrings.TrimPrefix(path, i.cfg.Debug.Path)
87+
88+
if _, err := pbStorageV2.SendFile(ctx, client, k, path); err != nil {
89+
logger.Err(err).Warn("Failed to send file to server for DebugPackage")
90+
}
91+
92+
return nil
93+
}); err != nil {
94+
return err
95+
}
96+
} else {
97+
return errors.Errorf("Address of the Service not defined")
98+
}
99+
}
100+
101+
return nil
102+
}
103+
48104
func (i *impl) Name() string {
49105
return pbShutdownV1.Name
50106
}
@@ -63,10 +119,12 @@ func (i *impl) Gateway(ctx context.Context, mux *runtime.ServeMux) error {
63119

64120
func (i *impl) Shutdown(ctx context.Context, empty *pbSharedV1.Empty) (*pbSharedV1.Empty, error) {
65121
go func() {
66-
defer i.closer()
67-
68-
time.Sleep(50 * time.Millisecond)
122+
if err := i.close.Close(); err != nil {
123+
logger.Err(err).Warn("Shutting down failed")
124+
}
69125
}()
70126

127+
logger.Info("Shutting down")
128+
71129
return &pbSharedV1.Empty{}, nil
72130
}

integrations/shutdown/v1/impl_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func Test_ShutdownGRPC(t *testing.T) {
4040

4141
local, err := svc.NewService(svc.Configuration{
4242
Address: "127.0.0.1:0",
43-
}, New(c))
43+
}, New(Configuration{}, c))
4444
require.NoError(t, err)
4545

4646
start := local.Start(ctx)

integrations/shutdown/v1/logger.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//
2+
// DISCLAIMER
3+
//
4+
// Copyright 2025 ArangoDB GmbH, Cologne, Germany
5+
//
6+
// Licensed under the Apache License, Version 2.0 (the "License");
7+
// you may not use this file except in compliance with the License.
8+
// You may obtain a copy of the License at
9+
//
10+
// http://www.apache.org/licenses/LICENSE-2.0
11+
//
12+
// Unless required by applicable law or agreed to in writing, software
13+
// distributed under the License is distributed on an "AS IS" BASIS,
14+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
// See the License for the specific language governing permissions and
16+
// limitations under the License.
17+
//
18+
// Copyright holder is ArangoDB GmbH, Cologne, Germany
19+
//
20+
21+
package v1
22+
23+
import "github.com/arangodb/kube-arangodb/pkg/logging"
24+
25+
var logger = logging.Global().RegisterAndGetLogger("integration-shutdown-v1", logging.Info)

integrations/shutdown/v1/service_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import (
3737
func Client(t *testing.T, ctx context.Context, c context.CancelFunc) pbShutdownV1.ShutdownV1Client {
3838
local, err := svc.NewService(svc.Configuration{
3939
Address: "127.0.0.1:0",
40-
}, New(c))
40+
}, New(Configuration{}, c))
4141
require.NoError(t, err)
4242

4343
start := local.Start(ctx)

integrations/storage/v2/definition/helpers.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ package definition
2323
import (
2424
"context"
2525
"io"
26+
"os"
2627

2728
"github.com/arangodb/kube-arangodb/pkg/util"
2829
"github.com/arangodb/kube-arangodb/pkg/util/errors"
@@ -31,6 +32,24 @@ import (
3132

3233
const BufferSize = 4094
3334

35+
func SendFile(ctx context.Context, client StorageV2Client, key string, path string) (*StorageV2WriteObjectResponse, error) {
36+
f, err := os.Open(path)
37+
if err != nil {
38+
return nil, err
39+
}
40+
41+
p, err := Send(ctx, client, key, f)
42+
if err != nil {
43+
if cerr := f.Close(); cerr != nil {
44+
return nil, cerr
45+
}
46+
47+
return nil, err
48+
}
49+
50+
return p, nil
51+
}
52+
3453
func Send(ctx context.Context, client StorageV2Client, key string, in io.Reader) (*StorageV2WriteObjectResponse, error) {
3554
cache := make([]byte, BufferSize)
3655

pkg/deployment/resources/arango_profiles.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,24 @@ var (
6060
inspectArangoProfilesDurationGauges = metrics.MustRegisterGaugeVec(metricsComponent, "inspect_arango_profiles_duration", "Amount of time taken by a single inspection of all ArangoProfiles for a deployment (in sec)", metrics.DeploymentName)
6161
)
6262

63-
func matchArangoProfilesLabels(labels map[string]string) *schedulerApi.ProfileSelectors {
63+
func matchArangoProfilesLabels(labels map[string]string, additional ...util.KV[string, string]) *schedulerApi.ProfileSelectors {
6464
if labels == nil {
6565
return nil
6666
}
6767

68+
out := make(map[string]string)
69+
70+
for k, v := range labels {
71+
out[k] = v
72+
}
73+
74+
for _, k := range additional {
75+
out[k.K] = k.V
76+
}
77+
6878
return &schedulerApi.ProfileSelectors{
6979
Label: &meta.LabelSelector{
70-
MatchLabels: labels,
80+
MatchLabels: out,
7181
},
7282
}
7383
}
@@ -84,7 +94,7 @@ func (r *Resources) EnsureArangoProfiles(ctx context.Context, cachedStatus inspe
8494

8595
reconcileRequired := k8sutil.NewReconcile(cachedStatus)
8696

87-
gen := func(name, version string, generator func() (integrationsSidecar.Integration, bool)) func() (string, *schedulerApi.ArangoProfile, error) {
97+
gen := func(name, version string, generator func() (integrationsSidecar.Integration, bool), selectors ...util.KV[string, string]) func() (string, *schedulerApi.ArangoProfile, error) {
8898
return func() (string, *schedulerApi.ArangoProfile, error) {
8999
counterMetric.Inc()
90100
fullName := fmt.Sprintf("%s-int-%s-%s", deploymentName, name, version)
@@ -113,7 +123,7 @@ func (r *Resources) EnsureArangoProfiles(ctx context.Context, cachedStatus inspe
113123
Selectors: matchArangoProfilesLabels(map[string]string{
114124
constants.ProfilesDeployment: deploymentName,
115125
key: v,
116-
}),
126+
}, selectors...),
117127
Template: integration,
118128
},
119129
}, nil
@@ -170,6 +180,10 @@ func (r *Resources) EnsureArangoProfiles(ctx context.Context, cachedStatus inspe
170180
DeploymentName: apiObject.GetName(),
171181
})),
172182
gen(constants.ProfilesIntegrationShutdown, constants.ProfilesIntegrationV1, always(integrationsSidecar.IntegrationShutdownV1{})),
183+
gen(constants.ProfilesIntegrationShutdown, constants.ProfilesIntegrationV1, always(integrationsSidecar.ExtensionShutdownV1Debug{}), util.KV[string, string]{
184+
K: constants.ProfilesExtensionStorageDebug,
185+
V: constants.ProfilesExtensionEnabled,
186+
}),
173187
gen(constants.ProfilesIntegrationEnvoy, constants.ProfilesIntegrationV3, always(integrationsSidecar.IntegrationEnvoyV3{Spec: spec})),
174188
gen(constants.ProfilesIntegrationStorage, constants.ProfilesIntegrationV1, func() (integrationsSidecar.Integration, bool) {
175189
if v, err := cachedStatus.ArangoPlatformStorage().V1Alpha1(); err == nil {

pkg/integrations/register.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ func (c *configuration) runWithContext(ctx context.Context, cancel context.Cance
281281
healthHandlers = append(healthHandlers, pong)
282282

283283
if c.health.shutdownEnabled {
284-
healthHandlers = append(healthHandlers, pbImplShutdownV1.New(cancel))
284+
healthHandlers = append(healthHandlers, pbImplShutdownV1.New(pbImplShutdownV1.Configuration{}, cancel))
285285
}
286286

287287
health, err := svc.NewHealthService(healthConfig, svc.Readiness, healthHandlers...)

pkg/integrations/shutdown_v1.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2024 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2024-2025 ArangoDB GmbH, Cologne, Germany
55
//
66
// Licensed under the Apache License, Version 2.0 (the "License");
77
// you may not use this file except in compliance with the License.
@@ -22,11 +22,13 @@ package integrations
2222

2323
import (
2424
"context"
25+
"time"
2526

2627
"github.com/spf13/cobra"
2728

2829
pbImplShutdownV1 "github.com/arangodb/kube-arangodb/integrations/shutdown/v1"
2930
pbShutdownV1 "github.com/arangodb/kube-arangodb/integrations/shutdown/v1/definition"
31+
"github.com/arangodb/kube-arangodb/pkg/util/errors"
3032
"github.com/arangodb/kube-arangodb/pkg/util/shutdown"
3133
"github.com/arangodb/kube-arangodb/pkg/util/svc"
3234
)
@@ -38,10 +40,11 @@ func init() {
3840
}
3941

4042
type shutdownV1 struct {
43+
Configuration pbImplShutdownV1.Configuration
4144
}
4245

4346
func (s *shutdownV1) Handler(ctx context.Context, cmd *cobra.Command) (svc.Handler, error) {
44-
return pbImplShutdownV1.New(shutdown.Stop), nil
47+
return pbImplShutdownV1.New(s.Configuration, shutdown.Stop), nil
4548
}
4649

4750
func (s *shutdownV1) Name() string {
@@ -53,7 +56,11 @@ func (s *shutdownV1) Description() string {
5356
}
5457

5558
func (s *shutdownV1) Register(cmd *cobra.Command, fs FlagEnvHandler) error {
56-
return nil
59+
return errors.Errors(
60+
fs.BoolVar(&s.Configuration.Debug.Enabled, "debug.enabled", false, "Defines if debug extension is enabled"),
61+
fs.StringVar(&s.Configuration.Debug.Path, "debug.path", "/debug", "Path of the Debug Directory"),
62+
fs.DurationVar(&s.Configuration.Debug.Timeout, "debug.timeout", time.Minute, "Timeout of the Debug action"),
63+
)
5764
}
5865

5966
func (*shutdownV1) Init(ctx context.Context, cmd *cobra.Command) error {

0 commit comments

Comments
 (0)