Skip to content

Commit b56ee2e

Browse files
committed
Move shared code
1 parent f15b040 commit b56ee2e

16 files changed

Lines changed: 555 additions & 121 deletions

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ kubectl oadp
2020
├── backup # Velero cluster-wide backups (admin)
2121
├── restore # Velero cluster-wide restores (admin)
2222
├── version # Version information
23+
├── nabsl-request # Manage NonAdminBackupStorageLocation approval requests
2324
└── nonadmin (na) # Namespace-scoped operations (non-admin)
2425
└── backup
2526
├── create

TESTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ make test-integration
6969
### Specific Package
7070
```bash
7171
# Test specific command
72-
go test ./cmd/nabsl -v
72+
go test ./cmd/nabsl-request -v
7373

7474
# Test with coverage
7575
go test ./cmd/... -cover
Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ func NewApproveCommand(f client.Factory) *cobra.Command {
4040
Long: "Approve a pending backup storage location request to allow the controller to create the corresponding BackupStorageLocation",
4141
Args: cobra.ExactArgs(1),
4242
Example: ` # Approve a request by NABSL name (admin access required)
43-
kubectl oadp nabsl approve user-test-bsl
43+
kubectl oadp nabsl-request approve user-test-bsl
4444
4545
# Approve a request by UUID with reason
46-
kubectl oadp nabsl approve nacuser01-user-test-bsl-96dfa8b7-3f6f-4c8d-a168-8527b00fbed8 --reason "Approved for production use"`,
46+
kubectl oadp nabsl-request approve nacuser01-user-test-bsl-96dfa8b7-3f6f-4c8d-a168-8527b00fbed8 --reason "Approved for production use"`,
4747
Run: func(c *cobra.Command, args []string) {
4848
cmd.CheckError(o.Complete(args, f))
4949
cmd.CheckError(o.Validate(c, args, f))
@@ -94,7 +94,7 @@ func (o *ApproveOptions) Run(c *cobra.Command, f client.Factory) error {
9494
adminNS := f.Namespace()
9595

9696
// Find the request either by UUID or by looking up NABSL name
97-
requestName, err := o.findRequestName(adminNS)
97+
requestName, err := shared.FindNABSLRequestByNameOrUUID(context.Background(), o.client, o.RequestName, adminNS)
9898
if err != nil {
9999
return err
100100
}
@@ -141,32 +141,3 @@ func (o *ApproveOptions) Run(c *cobra.Command, f client.Factory) error {
141141
return nil
142142
}
143143

144-
func (o *ApproveOptions) findRequestName(adminNS string) (string, error) {
145-
// First check if o.RequestName is already a UUID by trying to get it directly
146-
var testRequest nacv1alpha1.NonAdminBackupStorageLocationRequest
147-
err := o.client.Get(context.Background(), kbclient.ObjectKey{
148-
Name: o.RequestName,
149-
Namespace: adminNS,
150-
}, &testRequest)
151-
if err == nil {
152-
// Found it directly, it's a UUID
153-
return o.RequestName, nil
154-
}
155-
156-
// Not found directly, so o.RequestName might be a NABSL name
157-
// We need to search through all requests to find one with matching source NABSL name
158-
var requestList nacv1alpha1.NonAdminBackupStorageLocationRequestList
159-
err = o.client.List(context.Background(), &requestList, kbclient.InNamespace(adminNS))
160-
if err != nil {
161-
return "", fmt.Errorf("failed to list requests: %w", err)
162-
}
163-
164-
for _, request := range requestList.Items {
165-
if request.Status.SourceNonAdminBSL != nil &&
166-
request.Status.SourceNonAdminBSL.Name == o.RequestName {
167-
return request.Name, nil
168-
}
169-
}
170-
171-
return "", fmt.Errorf("request for NABSL %q not found", o.RequestName)
172-
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ func NewDescribeCommand(f client.Factory) *cobra.Command {
4444
cmd.CheckError(o.Run(c, f))
4545
},
4646
Example: ` # Describe a request by NABSL name
47-
kubectl oadp nabsl describe my-bsl-request
47+
kubectl oadp nabsl-request describe my-bsl-request
4848
4949
# Describe a request by UUID
50-
kubectl oadp nabsl describe nacuser01-my-bsl-96dfa8b7-3f6f-4c8d-a168-8527b00fbed8`,
50+
kubectl oadp nabsl-request describe nacuser01-my-bsl-96dfa8b7-3f6f-4c8d-a168-8527b00fbed8`,
5151
}
5252

5353
return c
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,16 @@ func NewGetCommand(f client.Factory) *cobra.Command {
4747
cmd.CheckError(o.Run(c, f))
4848
},
4949
Example: ` # Get all backup storage location requests (admin access required)
50-
kubectl oadp nabsl get
50+
kubectl oadp nabsl-request get
5151
5252
# Get a specific request by NABSL name
53-
kubectl oadp nabsl get my-bsl-request
53+
kubectl oadp nabsl-request get my-bsl-request
5454
5555
# Get a specific request by UUID
56-
kubectl oadp nabsl get nacuser01-my-bsl-96dfa8b7-3f6f-4c8d-a168-8527b00fbed8
56+
kubectl oadp nabsl-request get nacuser01-my-bsl-96dfa8b7-3f6f-4c8d-a168-8527b00fbed8
5757
5858
# Get output in YAML format
59-
kubectl oadp nabsl get my-bsl-request -o yaml`,
59+
kubectl oadp nabsl-request get my-bsl-request -o yaml`,
6060
}
6161

6262
o.BindFlags(c.Flags())
Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,28 @@ import (
2121
"github.com/vmware-tanzu/velero/pkg/client"
2222
)
2323

24-
// NewNABSLCommand creates the "nabsl" command for managing non-admin backup storage location requests
25-
func NewNABSLCommand(f client.Factory) *cobra.Command {
24+
// NewNABSLRequestCommand creates the "nabsl-request" command for managing non-admin backup storage location requests
25+
func NewNABSLRequestCommand(f client.Factory) *cobra.Command {
2626
c := &cobra.Command{
27-
Use: "nabsl",
28-
Short: "Manage non-admin backup storage location requests",
27+
Use: "nabsl-request",
28+
Short: "Manage non-admin backup storage location approval requests",
2929
Long: `Manage approval requests for non-admin backup storage locations.
3030
3131
Non-admin backup storage locations (NABSL) require admin approval before they can be used.
3232
When users create NABSLs, approval requests are automatically generated for admin review.
3333
3434
Use these commands to view, approve, or reject pending NABSL requests.`,
35-
Example: ` # List all pending NABSL requests
36-
kubectl oadp nabsl get
35+
Example: ` # List all pending NABSL approval requests
36+
kubectl oadp nabsl-request get
3737
38-
# Describe a specific NABSL request
39-
kubectl oadp nabsl describe my-storage-request
38+
# Describe a specific NABSL approval request
39+
kubectl oadp nabsl-request describe my-storage-request
4040
41-
# Approve a NABSL request
42-
kubectl oadp nabsl approve my-storage-request
41+
# Approve a NABSL approval request
42+
kubectl oadp nabsl-request approve my-storage-request
4343
44-
# Reject a NABSL request
45-
kubectl oadp nabsl reject my-storage-request`,
44+
# Reject a NABSL approval request
45+
kubectl oadp nabsl-request reject my-storage-request`,
4646
}
4747

4848
c.AddCommand(
Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ func TestNABSLCommands(t *testing.T) {
3232
expectContains []string
3333
}{
3434
{
35-
name: "nabsl help",
36-
args: []string{"nabsl", "--help"},
35+
name: "nabsl-request help",
36+
args: []string{"nabsl-request", "--help"},
3737
expectContains: []string{
3838
"Manage approval requests for non-admin backup storage locations",
3939
"approve",
@@ -43,31 +43,31 @@ func TestNABSLCommands(t *testing.T) {
4343
},
4444
},
4545
{
46-
name: "nabsl approve help",
47-
args: []string{"nabsl", "approve", "--help"},
46+
name: "nabsl-request approve help",
47+
args: []string{"nabsl-request", "approve", "--help"},
4848
expectContains: []string{
4949
"Approve a pending backup storage location request",
5050
"--reason",
5151
},
5252
},
5353
{
54-
name: "nabsl reject help",
55-
args: []string{"nabsl", "reject", "--help"},
54+
name: "nabsl-request reject help",
55+
args: []string{"nabsl-request", "reject", "--help"},
5656
expectContains: []string{
5757
"Reject a pending backup storage location request",
5858
"--reason",
5959
},
6060
},
6161
{
62-
name: "nabsl get help",
63-
args: []string{"nabsl", "get", "--help"},
62+
name: "nabsl-request get help",
63+
args: []string{"nabsl-request", "get", "--help"},
6464
expectContains: []string{
6565
"Get non-admin backup storage location requests",
6666
},
6767
},
6868
{
69-
name: "nabsl describe help",
70-
args: []string{"nabsl", "describe", "--help"},
69+
name: "nabsl-request describe help",
70+
args: []string{"nabsl-request", "describe", "--help"},
7171
expectContains: []string{
7272
"Describe a non-admin backup storage location request",
7373
},
@@ -81,21 +81,21 @@ func TestNABSLCommands(t *testing.T) {
8181
}
8282
}
8383

84-
// TestNABSLHelpFlags tests that both --help and -h work for nabsl commands
84+
// TestNABSLHelpFlags tests that both --help and -h work for nabsl-request commands
8585
func TestNABSLHelpFlags(t *testing.T) {
8686
binaryPath := testutil.BuildCLIBinary(t)
8787

8888
commands := [][]string{
89-
{"nabsl", "--help"},
90-
{"nabsl", "-h"},
91-
{"nabsl", "approve", "--help"},
92-
{"nabsl", "approve", "-h"},
93-
{"nabsl", "reject", "--help"},
94-
{"nabsl", "reject", "-h"},
95-
{"nabsl", "get", "--help"},
96-
{"nabsl", "get", "-h"},
97-
{"nabsl", "describe", "--help"},
98-
{"nabsl", "describe", "-h"},
89+
{"nabsl-request", "--help"},
90+
{"nabsl-request", "-h"},
91+
{"nabsl-request", "approve", "--help"},
92+
{"nabsl-request", "approve", "-h"},
93+
{"nabsl-request", "reject", "--help"},
94+
{"nabsl-request", "reject", "-h"},
95+
{"nabsl-request", "get", "--help"},
96+
{"nabsl-request", "get", "-h"},
97+
{"nabsl-request", "describe", "--help"},
98+
{"nabsl-request", "describe", "-h"},
9999
}
100100

101101
for _, cmd := range commands {
@@ -105,33 +105,33 @@ func TestNABSLHelpFlags(t *testing.T) {
105105
}
106106
}
107107

108-
// TestNABSLClientConfigIntegration tests that NABSL commands respect client config
108+
// TestNABSLClientConfigIntegration tests that NABSL request commands respect client config
109109
func TestNABSLClientConfigIntegration(t *testing.T) {
110110
binaryPath := testutil.BuildCLIBinary(t)
111111
_, cleanup := testutil.SetupTempHome(t)
112112
defer cleanup()
113113

114-
t.Run("nabsl commands work with client config", func(t *testing.T) {
114+
t.Run("nabsl-request commands work with client config", func(t *testing.T) {
115115
// Set a known namespace
116116
_, err := testutil.RunCommand(t, binaryPath, "client", "config", "set", "namespace=admin-namespace")
117117
if err != nil {
118118
t.Fatalf("Failed to set client config: %v", err)
119119
}
120120

121-
// Test that nabsl commands can be invoked (they should respect the namespace)
121+
// Test that nabsl-request commands can be invoked (they should respect the namespace)
122122
// We test help commands since they don't require actual K8s resources
123123
commands := [][]string{
124-
{"nabsl", "get", "--help"},
125-
{"nabsl", "approve", "--help"},
126-
{"nabsl", "reject", "--help"},
127-
{"nabsl", "describe", "--help"},
124+
{"nabsl-request", "get", "--help"},
125+
{"nabsl-request", "approve", "--help"},
126+
{"nabsl-request", "reject", "--help"},
127+
{"nabsl-request", "describe", "--help"},
128128
}
129129

130130
for _, cmd := range commands {
131131
t.Run("config_test_"+cmd[1], func(t *testing.T) {
132132
output, err := testutil.RunCommand(t, binaryPath, cmd...)
133133
if err != nil {
134-
t.Fatalf("NABSL command should work with client config: %v", err)
134+
t.Fatalf("NABSL request command should work with client config: %v", err)
135135
}
136136
if output == "" {
137137
t.Errorf("Expected help output for %v", cmd)
Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ func NewRejectCommand(f client.Factory) *cobra.Command {
4040
Long: "Reject a pending backup storage location request to deny the user's request for a backup storage location",
4141
Args: cobra.ExactArgs(1),
4242
Example: ` # Deny a request by NABSL name (admin access required)
43-
kubectl oadp nabsl reject user-test-bsl --reason "Invalid configuration"
43+
kubectl oadp nabsl-request reject user-test-bsl --reason "Invalid configuration"
4444
4545
# Deny a request by UUID with detailed reason
46-
kubectl oadp nabsl reject nacuser01-user-test-bsl-96dfa8b7-3f6f-4c8d-a168-8527b00fbed8 --reason "Bucket does not exist in specified region"`,
46+
kubectl oadp nabsl-request reject nacuser01-user-test-bsl-96dfa8b7-3f6f-4c8d-a168-8527b00fbed8 --reason "Bucket does not exist in specified region"`,
4747
Run: func(c *cobra.Command, args []string) {
4848
cmd.CheckError(o.Complete(args, f))
4949
cmd.CheckError(o.Validate(c, args, f))
@@ -94,7 +94,7 @@ func (o *RejectOptions) Run(c *cobra.Command, f client.Factory) error {
9494
adminNS := f.Namespace()
9595

9696
// Find the request either by UUID or by looking up NABSL name
97-
requestName, err := o.findRequestName(adminNS)
97+
requestName, err := shared.FindNABSLRequestByNameOrUUID(context.Background(), o.client, o.RequestName, adminNS)
9898
if err != nil {
9999
return err
100100
}
@@ -143,32 +143,3 @@ func (o *RejectOptions) Run(c *cobra.Command, f client.Factory) error {
143143
return nil
144144
}
145145

146-
func (o *RejectOptions) findRequestName(adminNS string) (string, error) {
147-
// First check if o.RequestName is already a UUID by trying to get it directly
148-
var testRequest nacv1alpha1.NonAdminBackupStorageLocationRequest
149-
err := o.client.Get(context.Background(), kbclient.ObjectKey{
150-
Name: o.RequestName,
151-
Namespace: adminNS,
152-
}, &testRequest)
153-
if err == nil {
154-
// Found it directly, it's a UUID
155-
return o.RequestName, nil
156-
}
157-
158-
// Not found directly, so o.RequestName might be a NABSL name
159-
// We need to search through all requests to find one with matching source NABSL name
160-
var requestList nacv1alpha1.NonAdminBackupStorageLocationRequestList
161-
err = o.client.List(context.Background(), &requestList, kbclient.InNamespace(adminNS))
162-
if err != nil {
163-
return "", fmt.Errorf("failed to list requests: %w", err)
164-
}
165-
166-
for _, request := range requestList.Items {
167-
if request.Status.SourceNonAdminBSL != nil &&
168-
request.Status.SourceNonAdminBSL.Name == o.RequestName {
169-
return request.Name, nil
170-
}
171-
}
172-
173-
return "", fmt.Errorf("request for NABSL %q not found", o.RequestName)
174-
}

0 commit comments

Comments
 (0)