Skip to content

Commit e913a75

Browse files
committed
feat: api update include fileds, naming and methods & cmd updates
1 parent b7562e0 commit e913a75

File tree

11 files changed

+349
-155
lines changed

11 files changed

+349
-155
lines changed

cmd/krb-cli/cmd/get-recycle-items.go

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,20 @@ import (
2525
"github.com/ketches/kube-recycle-bin/internal/api"
2626
krbclient "github.com/ketches/kube-recycle-bin/internal/client"
2727
"github.com/ketches/kube-recycle-bin/internal/completion"
28+
"github.com/ketches/kube-recycle-bin/pkg/kube"
2829
"github.com/ketches/kube-recycle-bin/pkg/tlog"
2930
"github.com/spf13/cobra"
31+
"k8s.io/apimachinery/pkg/labels"
3032
"k8s.io/apimachinery/pkg/util/duration"
3133
"sigs.k8s.io/controller-runtime/pkg/client"
3234
)
3335

3436
type GetRecycleItemFlags struct {
35-
Group string
36-
Version string
37-
Kind string
38-
Namespace string
39-
AllNamespaces bool
37+
ObjectResource string
38+
ObjectNamespace string
4039
}
4140

42-
var getRecycylItemFlags GetRecycleItemFlags
41+
var getRecycleItemFlags GetRecycleItemFlags
4342

4443
// getRecycleItemCmd represents the get recycle item command
4544
var getRecycleItemCmd = &cobra.Command{
@@ -48,11 +47,17 @@ var getRecycleItemCmd = &cobra.Command{
4847
Short: "Get recycle items",
4948
Long: `Get recycle items. This command retrieves the specified RecycleItem resources.`,
5049
Example: `
50+
# Get all RecycleItems
51+
krb-cli get ri
52+
5153
# Get RecycleItems with names foo and bar
52-
krb-cli get recycleitems foo bar
54+
krb-cli get ri foo bar
55+
56+
# Get RecycleItems recycled from deployments resource
57+
krb-cli get ri --object-resource deployments
5358
54-
# Get all RecyclePolicies
55-
krb-cli get recyclepolicies
59+
# Get RecycleItems recycled from dev namespace
60+
krb-cli get ri --object-namespace dev
5661
`,
5762
Run: func(cmd *cobra.Command, args []string) {
5863
runGetRecycleItems(args)
@@ -63,28 +68,42 @@ krb-cli get recyclepolicies
6368
func init() {
6469
getCmd.AddCommand(getRecycleItemCmd)
6570

66-
getRecycleItemCmd.Flags().StringVarP(&getRecycylItemFlags.Group, "group", "g", "", "List resources of the specified group")
67-
getRecycleItemCmd.Flags().StringVarP(&getRecycylItemFlags.Kind, "kind", "k", "", "List resources of the specified kind")
68-
getRecycleItemCmd.Flags().StringVarP(&getRecycylItemFlags.Version, "version", "v", "", "List resources with the specified version")
69-
getRecycleItemCmd.Flags().StringVarP(&getRecycylItemFlags.Namespace, "namespace", "n", "default", "List resources in the specified namespace")
70-
getRecycleItemCmd.Flags().BoolVarP(&getRecycylItemFlags.AllNamespaces, "all-namespaces", "A", false, "List resources from all namespaces")
71+
getRecycleItemCmd.Flags().StringVarP(&getRecycleItemFlags.ObjectResource, "object-resource", "", "", "List recycled resource objects filtered by the specified object resource")
72+
getRecycleItemCmd.Flags().StringVarP(&getRecycleItemFlags.ObjectNamespace, "object-namespace", "", "", "List recycled resource objects filtered by the specified object namespace")
7173

72-
getRecycleItemCmd.MarkFlagsMutuallyExclusive("namespace", "all-namespaces")
74+
getRecycleItemCmd.RegisterFlagCompletionFunc("object-resource", completion.RecycleItemGroupResource)
75+
getRecycleItemCmd.RegisterFlagCompletionFunc("object-namespace", completion.RecycleItemNamespace)
7376
}
7477

7578
func runGetRecycleItems(args []string) {
7679
var result api.RecycleItemList
80+
7781
if len(args) > 0 {
78-
for _, objName := range args {
79-
obj, err := krbclient.RecycleItem().Get(context.Background(), objName, client.GetOptions{})
82+
for _, name := range args {
83+
obj, err := krbclient.RecycleItem().Get(context.Background(), name, client.GetOptions{})
8084
if err != nil {
81-
tlog.Errorf("✗ failed to get RecycleItem [%s]: %v, skipping.", objName, err)
85+
tlog.Errorf("✗ failed to get RecycleItem [%s]: %v, skipping.", name, err)
8286
continue
8387
}
8488
result.Items = append(result.Items, *obj)
8589
}
8690
} else {
87-
list, err := krbclient.RecycleItem().List(context.Background(), client.ListOptions{})
91+
labelSet := labels.Set{}
92+
if getRecycleItemFlags.ObjectNamespace != "" {
93+
labelSet["krb.ketches.cn/object-namespace"] = getRecycleItemFlags.ObjectNamespace
94+
}
95+
if getRecycleItemFlags.ObjectResource != "" {
96+
tlog.Println(getRecycleItemFlags.ObjectResource)
97+
if gvr, err := kube.GetPreferredGroupVersionResourceFor(getRecycleItemFlags.ObjectResource); err != nil {
98+
tlog.Panicf("✗ failed to get preferred group version resource: %v", err)
99+
} else {
100+
labelSet["krb.ketches.cn/object-gr"] = gvr.GroupResource().String()
101+
}
102+
}
103+
104+
list, err := krbclient.RecycleItem().List(context.Background(), client.ListOptions{
105+
LabelSelector: labels.SelectorFromSet(labelSet),
106+
})
88107
if err != nil {
89108
tlog.Panicf("✗ failed to list RecycleItem: %v", err)
90109
return
@@ -97,7 +116,7 @@ func runGetRecycleItems(args []string) {
97116
t.AppendHeader(table.Row{"name", "group", "version", "kind", "namespace", "name", "age"})
98117

99118
for _, obj := range result.Items {
100-
t.AppendRow(table.Row{obj.Name, obj.Object.Group, obj.Object.Version, obj.Object.Kind, obj.Object.Namespace, obj.Object.Name, duration.HumanDuration(time.Since(obj.CreationTimestamp.Time))}, table.RowConfig{
119+
t.AppendRow(table.Row{obj.Name, obj.Object.Group, obj.Object.Version, obj.Object.Resource, obj.Object.Namespace, obj.Object.Name, duration.HumanDuration(time.Since(obj.CreationTimestamp.Time))}, table.RowConfig{
101120
AutoMerge: true,
102121
})
103122
}

cmd/krb-cli/cmd/get-recycle-policies.go

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,20 @@ import (
2525
"github.com/ketches/kube-recycle-bin/internal/api"
2626
krbclient "github.com/ketches/kube-recycle-bin/internal/client"
2727
"github.com/ketches/kube-recycle-bin/internal/completion"
28+
"github.com/ketches/kube-recycle-bin/pkg/kube"
2829
"github.com/ketches/kube-recycle-bin/pkg/tlog"
2930
"github.com/spf13/cobra"
31+
"k8s.io/apimachinery/pkg/labels"
3032
"k8s.io/apimachinery/pkg/util/duration"
3133
"sigs.k8s.io/controller-runtime/pkg/client"
3234
)
3335

3436
type GetRecyclePoliciesFlags struct {
35-
Group string
36-
Version string
37-
Kind string
38-
Namespace string
39-
AllNamespaces bool
37+
TargetResource string
38+
TargetNamespace string
4039
}
4140

42-
var getRecycylPoliciesFlags GetRecyclePoliciesFlags
41+
var getRecyclePoliciesFlags GetRecyclePoliciesFlags
4342

4443
// getRecyclePoliciesCmd represents the get recycle policies command
4544
var getRecyclePoliciesCmd = &cobra.Command{
@@ -48,11 +47,17 @@ var getRecyclePoliciesCmd = &cobra.Command{
4847
Short: "Get recycle policies",
4948
Long: `Get recycle policies. This command retrieves the specified RecyclePolicy resources.`,
5049
Example: `
50+
# Get all RecyclePolicy
51+
krb-cli get recyclepolicies
52+
5153
# Get RecyclePolicy with names foo and bar
5254
krb-cli get recyclepolicies foo bar
5355
54-
# Get all RecyclePolicy
55-
krb-cli get recyclepolicies
56+
# Get RecyclePolicy for deployments resource
57+
krb-cli get recyclepolicies --target-resource deployments
58+
59+
# Get RecyclePolicy for default namespace
60+
krb-cli get recyclepolicies --target-namespace default
5661
`,
5762
Run: func(cmd *cobra.Command, args []string) {
5863
runGetRecyclePolicies(args)
@@ -63,28 +68,37 @@ krb-cli get recyclepolicies
6368
func init() {
6469
getCmd.AddCommand(getRecyclePoliciesCmd)
6570

66-
getRecyclePoliciesCmd.Flags().StringVarP(&getRecycylPoliciesFlags.Group, "group", "g", "", "List resources of the specified group")
67-
getRecyclePoliciesCmd.Flags().StringVarP(&getRecycylPoliciesFlags.Kind, "kind", "k", "", "List resources of the specified kind")
68-
getRecyclePoliciesCmd.Flags().StringVarP(&getRecycylPoliciesFlags.Version, "version", "v", "", "List resources with the specified version")
69-
getRecyclePoliciesCmd.Flags().StringVarP(&getRecycylPoliciesFlags.Namespace, "namespace", "n", "default", "List resources in the specified namespace")
70-
getRecyclePoliciesCmd.Flags().BoolVarP(&getRecycylPoliciesFlags.AllNamespaces, "all-namespaces", "A", false, "List resources from all namespaces")
71+
getRecyclePoliciesCmd.Flags().StringVarP(&getRecyclePoliciesFlags.TargetResource, "target-resource", "", "", "List recycle policies filtered by the specified target resource")
72+
getRecyclePoliciesCmd.Flags().StringVarP(&getRecyclePoliciesFlags.TargetNamespace, "target-namespace", "", "", "List recycle policies filtered by the specified target namespace")
7173

72-
getRecyclePoliciesCmd.MarkFlagsMutuallyExclusive("namespace", "all-namespaces")
74+
getRecyclePoliciesCmd.RegisterFlagCompletionFunc("target-resource", completion.RecyclePolicyGroupResource)
75+
getRecyclePoliciesCmd.RegisterFlagCompletionFunc("target-namespace", completion.RecyclePolicyNamespace)
7376
}
7477

7578
func runGetRecyclePolicies(args []string) {
7679
var result api.RecyclePolicyList
7780
if len(args) > 0 {
78-
for _, objName := range args {
79-
obj, err := krbclient.RecyclePolicy().Get(context.Background(), objName, client.GetOptions{})
81+
for _, name := range args {
82+
obj, err := krbclient.RecyclePolicy().Get(context.Background(), name, client.GetOptions{})
8083
if err != nil {
81-
tlog.Errorf("✗ failed to get RecyclePolicy [%s]: %v, skipping.", objName, err)
84+
tlog.Errorf("✗ failed to get RecyclePolicy [%s]: %v, ignored.", name, err)
8285
continue
8386
}
8487
result.Items = append(result.Items, *obj)
8588
}
8689
} else {
87-
list, err := krbclient.RecyclePolicy().List(context.Background(), client.ListOptions{})
90+
labelSet := labels.Set{}
91+
if getRecyclePoliciesFlags.TargetResource != "" {
92+
if gvr, err := kube.GetPreferredGroupVersionResourceFor(getRecyclePoliciesFlags.TargetResource); err != nil {
93+
tlog.Panicf("✗ failed to get preferred group version resource: %v", err)
94+
} else {
95+
labelSet["krb.ketches.cn/target-gr"] = gvr.GroupResource().String()
96+
}
97+
}
98+
list, err := krbclient.RecyclePolicy().List(context.Background(), client.ListOptions{
99+
LabelSelector: labels.SelectorFromSet(labelSet),
100+
Namespace: getRecyclePoliciesFlags.TargetNamespace,
101+
})
88102
if err != nil {
89103
tlog.Panicf("✗ failed to list RecyclePolicy: %v", err)
90104
return

cmd/krb-cli/cmd/recycle.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,14 @@ func runRecycle(args []string) {
6363
tlog.Panicf("✗ please specify a resource to recycle.")
6464
}
6565

66-
for _, fuzzResource := range args {
67-
gvr, err := kube.GetPreferredGroupVersionResource(fuzzResource)
66+
for _, resource := range args {
67+
gvr, err := kube.GetPreferredGroupVersionResourceFor(resource)
6868
if err != nil {
6969
tlog.Errorf("✗ failed to get gvr from resource name: %v, ignored.", err)
7070
continue
7171
}
7272
if gvr == nil {
73-
tlog.Errorf("✗ no resources found for %s, ignored.", fuzzResource)
73+
tlog.Errorf("✗ no resources found for %s, ignored.", resource)
7474
continue
7575
}
7676

cmd/krb-cli/cmd/restore.go

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,29 @@ import (
2828
"sigs.k8s.io/controller-runtime/pkg/client"
2929
)
3030

31+
type RestoreFlags struct {
32+
ObjectResource string
33+
ObjectNamespace string
34+
}
35+
36+
var restoreFlags RestoreFlags
37+
3138
// restoreCmd represents the restore command
3239
var restoreCmd = &cobra.Command{
3340
Use: "restore",
34-
Short: "Restore resources from a RecycleItem",
41+
Short: "Restore recycled resource objects from RecycleItem",
3542
Args: cobra.MinimumNArgs(1),
43+
Example: `
44+
# Restore RecycleItem with names foo and bar
45+
krb-cli restore foo bar
46+
47+
# Restore RecycleItem deployments foo and filter by object resource deployments
48+
krb-cli restore --object-resource deployments foo
49+
50+
# Restore RecycleItem deployments foo-deploy, service foo-svc and filter by object namespace dev
51+
krb-cli restore --object-namespace dev foo-deploy foo-svc
52+
`,
53+
3654
Run: func(cmd *cobra.Command, args []string) {
3755
runRestore(args)
3856
},
@@ -41,6 +59,12 @@ var restoreCmd = &cobra.Command{
4159

4260
func init() {
4361
rootCmd.AddCommand(restoreCmd)
62+
63+
restoreCmd.Flags().StringVarP(&restoreFlags.ObjectResource, "object-resource", "", "", "Restore recycled resource objects filtered by the specified object resource")
64+
restoreCmd.Flags().StringVarP(&restoreFlags.ObjectNamespace, "object-namespace", "", "", "Restore recycled resource objects filtered by the specified object namespace")
65+
66+
restoreCmd.RegisterFlagCompletionFunc("object-resource", completion.RecycleItemGroupResource)
67+
restoreCmd.RegisterFlagCompletionFunc("object-namespace", completion.RecycleItemNamespace)
4468
}
4569

4670
func runRestore(args []string) {
@@ -55,19 +79,19 @@ func runRestore(args []string) {
5579
continue
5680
}
5781

58-
unstructuredObj, err := recycleItem.ObjectUnstructured()
82+
unstructuredObj, err := recycleItem.Object.Unstructured()
5983
if err != nil {
6084
tlog.Printf("✗ failed to get unstructured object from RecycleItem [%s]: %v, ignored.", recycleItemName, err)
6185
continue
6286
}
6387

64-
if _, err := kube.DynamicClient().Resource(recycleItem.ObjectGroupVersionResource()).Namespace(recycleItem.ObjectNamespace()).Create(context.Background(), unstructuredObj, metav1.CreateOptions{}); err != nil {
65-
tlog.Printf("✗ failed to restore resource [%s]: %v", recycleItem.ObjectNamespacedName().String(), err)
88+
if _, err := kube.DynamicClient().Resource(recycleItem.Object.GroupVersionResource()).Namespace(recycleItem.Object.Namespace).Create(context.Background(), unstructuredObj, metav1.CreateOptions{}); err != nil {
89+
tlog.Printf("✗ failed to restore recycled resource object [%s]: %v", recycleItem.Object.Key().String(), err)
6690
} else {
67-
tlog.Printf("✓ restored %s [%s] done.", recycleItem.Kind, recycleItem.ObjectNamespacedName().String())
91+
tlog.Printf("✓ restored recycled resource object [%s: %s] done.", recycleItem.Object.Resource, recycleItem.Object.Key().String())
6892
// delete the recycle item after successful restore
6993
if err := krbclient.RecycleItem().Delete(context.Background(), recycleItemName, client.DeleteOptions{}); err != nil {
70-
tlog.Printf("✗ failed to automatically delete RecycleItem [%s]: %v", recycleItemName, err)
94+
tlog.Printf("✗ failed to automatically delete RecycleItem [%s] after restore: %v", recycleItemName, err)
7195
} else {
7296
tlog.Printf("✓ automatically deleted RecycleItem [%s] after restore.", recycleItemName)
7397
}

0 commit comments

Comments
 (0)