Skip to content

Commit 44e3f16

Browse files
committed
fix: capture commands should respect --namespace
Signed-off-by: Evan Baker <[email protected]>
1 parent 3ac7f11 commit 44e3f16

File tree

5 files changed

+34
-35
lines changed

5 files changed

+34
-35
lines changed

cli/cmd/capture/capture.go

+7-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import (
99
"k8s.io/cli-runtime/pkg/genericclioptions"
1010
)
1111

12-
var name string
12+
var opts = struct {
13+
genericclioptions.ConfigFlags
14+
Name *string
15+
}{}
1316

1417
const defaultName = "retina-capture"
1518

@@ -20,7 +23,7 @@ var capture = &cobra.Command{
2023

2124
func init() {
2225
cmd.Retina.AddCommand(capture)
23-
configFlags = genericclioptions.NewConfigFlags(true)
24-
configFlags.AddFlags(capture.PersistentFlags())
25-
capture.PersistentFlags().StringVar(&name, "name", defaultName, "The name of the Retina Capture")
26+
opts.ConfigFlags = *genericclioptions.NewConfigFlags(true)
27+
opts.AddFlags(capture.PersistentFlags())
28+
capture.PersistentFlags().StringVar(opts.Name, "name", defaultName, "The name of the Retina Capture")
2629
}

cli/cmd/capture/create.go

+17-20
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import (
1717
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1818
"k8s.io/apimachinery/pkg/labels"
1919
"k8s.io/apimachinery/pkg/util/wait"
20-
"k8s.io/cli-runtime/pkg/genericclioptions"
2120
"k8s.io/client-go/kubernetes"
2221
"k8s.io/kubectl/pkg/util/i18n"
2322
"k8s.io/kubectl/pkg/util/templates"
@@ -32,8 +31,6 @@ import (
3231
)
3332

3433
var (
35-
configFlags *genericclioptions.ConfigFlags
36-
3734
blobUpload string
3835
debug bool
3936
duration time.Duration
@@ -111,7 +108,7 @@ var createCapture = &cobra.Command{
111108
Short: "Create a Retina Capture",
112109
Example: createExample,
113110
RunE: func(*cobra.Command, []string) error {
114-
kubeConfig, err := configFlags.ToRESTConfig()
111+
kubeConfig, err := opts.ToRESTConfig()
115112
if err != nil {
116113
return errors.Wrap(err, "failed to compose k8s rest config")
117114
}
@@ -134,10 +131,10 @@ var createCapture = &cobra.Command{
134131
if nowait {
135132
retinacmd.Logger.Info("Please manually delete all capture jobs")
136133
if capture.Spec.OutputConfiguration.BlobUpload != nil {
137-
retinacmd.Logger.Info("Please manually delete capture secret", zap.String("namespace", namespace), zap.String("secret name", *capture.Spec.OutputConfiguration.BlobUpload))
134+
retinacmd.Logger.Info("Please manually delete capture secret", zap.String("namespace", *opts.Namespace), zap.String("secret name", *capture.Spec.OutputConfiguration.BlobUpload))
138135
}
139136
if capture.Spec.OutputConfiguration.S3Upload != nil && capture.Spec.OutputConfiguration.S3Upload.SecretName != "" {
140-
retinacmd.Logger.Info("Please manually delete capture secret", zap.String("namespace", namespace), zap.String("secret name", capture.Spec.OutputConfiguration.S3Upload.SecretName))
137+
retinacmd.Logger.Info("Please manually delete capture secret", zap.String("namespace", *opts.Namespace), zap.String("secret name", capture.Spec.OutputConfiguration.S3Upload.SecretName))
141138
}
142139
printCaptureResult(jobsCreated)
143140
return nil
@@ -154,19 +151,19 @@ var createCapture = &cobra.Command{
154151
retinacmd.Logger.Info("Deleting jobs as all jobs are completed")
155152
jobsFailedToDelete := deleteJobs(kubeClient, jobsCreated)
156153
if len(jobsFailedToDelete) != 0 {
157-
retinacmd.Logger.Info("Please manually delete capture jobs failed to delete", zap.String("namespace", namespace), zap.String("job list", strings.Join(jobsFailedToDelete, ",")))
154+
retinacmd.Logger.Info("Please manually delete capture jobs failed to delete", zap.String("namespace", *opts.Namespace), zap.String("job list", strings.Join(jobsFailedToDelete, ",")))
158155
}
159156

160157
err = deleteSecret(kubeClient, capture.Spec.OutputConfiguration.BlobUpload)
161158
if err != nil {
162159
retinacmd.Logger.Error("Failed to delete capture secret, please manually delete it",
163-
zap.String("namespace", namespace), zap.String("secret name", *capture.Spec.OutputConfiguration.BlobUpload), zap.Error(err))
160+
zap.String("namespace", *opts.Namespace), zap.String("secret name", *capture.Spec.OutputConfiguration.BlobUpload), zap.Error(err))
164161
}
165162

166163
err = deleteSecret(kubeClient, &capture.Spec.OutputConfiguration.S3Upload.SecretName)
167164
if err != nil {
168165
retinacmd.Logger.Error("Failed to delete capture secret, please manually delete it",
169-
zap.String("namespace", namespace),
166+
zap.String("namespace", *opts.Namespace),
170167
zap.String("secret name", capture.Spec.OutputConfiguration.S3Upload.SecretName),
171168
zap.Error(err),
172169
)
@@ -180,7 +177,7 @@ var createCapture = &cobra.Command{
180177

181178
retinacmd.Logger.Info("Not all job are completed in the given time")
182179
retinacmd.Logger.Info("Please manually delete the Capture")
183-
return getCaptureAndPrintCaptureResult(kubeClient, capture.Name, namespace)
180+
return getCaptureAndPrintCaptureResult(kubeClient, capture.Name, *opts.Namespace)
184181
},
185182
}
186183

@@ -199,7 +196,7 @@ func createSecretFromBlobUpload(kubeClient kubernetes.Interface, blobUpload, cap
199196
captureConstants.CaptureOutputLocationBlobUploadSecretKey: []byte(blobUpload),
200197
},
201198
}
202-
secret, err := kubeClient.CoreV1().Secrets(namespace).Create(context.TODO(), secret, metav1.CreateOptions{})
199+
secret, err := kubeClient.CoreV1().Secrets(*opts.Namespace).Create(context.TODO(), secret, metav1.CreateOptions{})
203200
if err != nil {
204201
return "", err
205202
}
@@ -218,7 +215,7 @@ func createSecretFromS3Upload(kubeClient kubernetes.Interface, s3AccessKeyID, s3
218215
captureConstants.CaptureOutputLocationS3UploadSecretAccessKey: []byte(s3SecretAccessKey),
219216
},
220217
}
221-
secret, err := kubeClient.CoreV1().Secrets(namespace).Create(context.TODO(), secret, metav1.CreateOptions{})
218+
secret, err := kubeClient.CoreV1().Secrets(*opts.Namespace).Create(context.TODO(), secret, metav1.CreateOptions{})
222219
if err != nil {
223220
return "", fmt.Errorf("failed to create s3 upload secret: %w", err)
224221
}
@@ -230,14 +227,14 @@ func deleteSecret(kubeClient kubernetes.Interface, secretName *string) error {
230227
return nil
231228
}
232229

233-
return kubeClient.CoreV1().Secrets(namespace).Delete(context.TODO(), *secretName, metav1.DeleteOptions{})
230+
return kubeClient.CoreV1().Secrets(*opts.Namespace).Delete(context.TODO(), *secretName, metav1.DeleteOptions{}) //nolint:wrapcheck //internal return
234231
}
235232

236233
func createCaptureF(kubeClient kubernetes.Interface) (*retinav1alpha1.Capture, error) {
237234
capture := &retinav1alpha1.Capture{
238235
ObjectMeta: metav1.ObjectMeta{
239-
Name: name,
240-
Namespace: namespace,
236+
Name: *opts.Name,
237+
Namespace: *opts.Namespace,
241238
},
242239
Spec: retinav1alpha1.CaptureSpec{
243240
CaptureConfiguration: retinav1alpha1.CaptureConfiguration{
@@ -322,15 +319,15 @@ func createCaptureF(kubeClient kubernetes.Interface) (*retinav1alpha1.Capture, e
322319

323320
if len(blobUpload) != 0 {
324321
// Mount blob url as secret onto the capture pod for security concern if blob url is not empty.
325-
secretName, err := createSecretFromBlobUpload(kubeClient, blobUpload, name)
322+
secretName, err := createSecretFromBlobUpload(kubeClient, blobUpload, *opts.Name)
326323
if err != nil {
327324
return nil, err
328325
}
329326
capture.Spec.OutputConfiguration.BlobUpload = &secretName
330327
}
331328

332329
if s3Bucket != "" {
333-
secretName, err := createSecretFromS3Upload(kubeClient, s3AccessKeyID, s3SecretAccessKey, name)
330+
secretName, err := createSecretFromS3Upload(kubeClient, s3AccessKeyID, s3SecretAccessKey, *opts.Name)
334331
if err != nil {
335332
return nil, fmt.Errorf("failed to create s3 upload secret: %w", err)
336333
}
@@ -379,12 +376,12 @@ func createJobs(kubeClient kubernetes.Interface, capture *retinav1alpha1.Capture
379376

380377
jobsCreated := []batchv1.Job{}
381378
for _, job := range jobs {
382-
jobCreated, err := kubeClient.BatchV1().Jobs(namespace).Create(context.TODO(), job, metav1.CreateOptions{})
379+
jobCreated, err := kubeClient.BatchV1().Jobs(*opts.Namespace).Create(context.TODO(), job, metav1.CreateOptions{})
383380
if err != nil {
384381
return nil, err
385382
}
386383
jobsCreated = append(jobsCreated, *jobCreated)
387-
retinacmd.Logger.Info("Packet capture job is created", zap.String("namespace", namespace), zap.String("capture job", jobCreated.Name))
384+
retinacmd.Logger.Info("Packet capture job is created", zap.String("namespace", *opts.Namespace), zap.String("capture job", jobCreated.Name))
388385
}
389386
return jobsCreated, nil
390387
}
@@ -428,7 +425,7 @@ func waitUntilJobsComplete(kubeClient kubernetes.Interface, jobs []batchv1.Job)
428425

429426
if len(jobsIncompleted) != 0 {
430427
retinacmd.Logger.Info("Not all jobs are completed",
431-
zap.String("namespace", namespace),
428+
zap.String("namespace", *opts.Namespace),
432429
zap.String("Completed jobs", strings.Join(jobsCompleted, ",")),
433430
zap.String("Uncompleted packet capture jobs", strings.Join(jobsIncompleted, ",")),
434431
)

cli/cmd/capture/delete.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ var deleteCapture = &cobra.Command{
3030
Short: "Delete a Retina capture",
3131
Example: deleteExample,
3232
RunE: func(*cobra.Command, []string) error {
33-
kubeConfig, err := configFlags.ToRESTConfig()
33+
kubeConfig, err := opts.ToRESTConfig()
3434
if err != nil {
3535
return errors.Wrap(err, "")
3636
}
@@ -42,7 +42,7 @@ var deleteCapture = &cobra.Command{
4242

4343
captureJobSelector := &metav1.LabelSelector{
4444
MatchLabels: map[string]string{
45-
label.CaptureNameLabel: name,
45+
label.CaptureNameLabel: *opts.Name,
4646
label.AppLabel: captureConstants.CaptureAppname,
4747
},
4848
}
@@ -51,12 +51,12 @@ var deleteCapture = &cobra.Command{
5151
LabelSelector: labelSelector.String(),
5252
}
5353

54-
jobList, err := kubeClient.BatchV1().Jobs(namespace).List(context.TODO(), jobListOpt)
54+
jobList, err := kubeClient.BatchV1().Jobs(*opts.Namespace).List(context.TODO(), jobListOpt)
5555
if err != nil {
5656
return errors.Wrap(err, "failed to list capture jobs")
5757
}
5858
if len(jobList.Items) == 0 {
59-
return errors.Errorf("capture %s in namespace %s was not found", name, namespace)
59+
return errors.Errorf("capture %s in namespace %s was not found", *opts.Name, *opts.Namespace)
6060
}
6161

6262
for _, job := range jobList.Items {
@@ -70,13 +70,13 @@ var deleteCapture = &cobra.Command{
7070

7171
for _, volume := range jobList.Items[0].Spec.Template.Spec.Volumes {
7272
if volume.Secret != nil {
73-
if err := kubeClient.CoreV1().Secrets(namespace).Delete(context.TODO(), volume.Secret.SecretName, metav1.DeleteOptions{}); err != nil {
73+
if err := kubeClient.CoreV1().Secrets(*opts.Namespace).Delete(context.TODO(), volume.Secret.SecretName, metav1.DeleteOptions{}); err != nil {
7474
return errors.Wrap(err, "failed to delete capture secret")
7575
}
7676
break
7777
}
7878
}
79-
retinacmd.Logger.Info(fmt.Sprintf("Retina Capture %q delete", name))
79+
retinacmd.Logger.Info(fmt.Sprintf("Retina Capture %q delete", *opts.Name))
8080

8181
return nil
8282
},

cli/cmd/capture/download.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,14 @@ var downloadCapture = &cobra.Command{
4545
splitPath := strings.SplitN(containerPath, "/", 2) //nolint:gomnd // TODO string splitting probably isn't the right way to parse this URL?
4646
containerName := splitPath[0]
4747

48-
params := storage.ListBlobsParameters{Prefix: name}
48+
params := storage.ListBlobsParameters{Prefix: *opts.Name}
4949
blobList, err := blobService.GetContainerReference(containerName).ListBlobs(params)
5050
if err != nil {
5151
return errors.Wrap(err, "failed to list blobstore ")
5252
}
5353

5454
if len(blobList.Blobs) == 0 {
55-
return errors.Errorf("no blobs found with prefix: %s", name)
55+
return errors.Errorf("no blobs found with prefix: %s", *opts.Name)
5656
}
5757

5858
for _, v := range blobList.Blobs {

cli/cmd/capture/list.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ var listCaptures = &cobra.Command{
2626
Short: "List Retina Captures",
2727
Example: listExample,
2828
RunE: func(*cobra.Command, []string) error {
29-
kubeConfig, err := configFlags.ToRESTConfig()
29+
kubeConfig, err := opts.ToRESTConfig()
3030
if err != nil {
3131
return errors.Wrap(err, "failed to compose k8s rest config")
3232
}
@@ -36,7 +36,7 @@ var listCaptures = &cobra.Command{
3636
return errors.Wrap(err, "failed to initialize kubernetes client")
3737
}
3838

39-
captureNamespace := namespace
39+
captureNamespace := *opts.Namespace
4040
if allNamespaces {
4141
captureNamespace = ""
4242
}
@@ -46,7 +46,6 @@ var listCaptures = &cobra.Command{
4646

4747
func init() {
4848
capture.AddCommand(listCaptures)
49-
listCaptures.Flags().StringVarP(&namespace, "namespace", "n", "default", "Namespace to host capture job")
5049
listCaptures.Flags().BoolVarP(&allNamespaces, "all-namespaces", "A", allNamespaces,
5150
"If present, list the requested object(s) across all namespaces. Namespace in current context is ignored even if specified with --namespace.")
5251
}

0 commit comments

Comments
 (0)