5
5
package disk
6
6
7
7
import (
8
+ "bytes"
8
9
"context"
9
10
"flag"
10
11
"fmt"
@@ -18,6 +19,7 @@ import (
18
19
"github.com/vmware/govmomi/fault"
19
20
"github.com/vmware/govmomi/units"
20
21
"github.com/vmware/govmomi/vim25/types"
22
+ vslm "github.com/vmware/govmomi/vslm/types"
21
23
)
22
24
23
25
type ls struct {
@@ -29,6 +31,7 @@ type ls struct {
29
31
category string
30
32
tag string
31
33
tags bool
34
+ query flags.StringList
32
35
}
33
36
34
37
func init () {
@@ -46,20 +49,37 @@ func (cmd *ls) Register(ctx context.Context, f *flag.FlagSet) {
46
49
f .StringVar (& cmd .category , "c" , "" , "Query tag category" )
47
50
f .StringVar (& cmd .tag , "t" , "" , "Query tag name" )
48
51
f .BoolVar (& cmd .tags , "T" , false , "List attached tags" )
52
+ f .Var (& cmd .query , "q" , "Query spec" )
49
53
}
50
54
51
55
func (cmd * ls ) Usage () string {
52
56
return "[ID]..."
53
57
}
54
58
55
59
func (cmd * ls ) Description () string {
56
- return `List disk IDs on DS.
60
+ var fields vslm. VslmVsoVStorageObjectQuerySpecQueryFieldEnum
57
61
62
+ return fmt .Sprintf (`List disk IDs on DS.
63
+
64
+ The '-q' flag can be used to match disk fields.
65
+ Each query must be in the form of:
66
+ FIELD.OP=VAL
67
+
68
+ Where FIELD can be one of:
69
+ %s
70
+
71
+ And OP can be one of:
72
+ %s
58
73
Examples:
59
74
govc disk.ls
60
75
govc disk.ls -l -T
61
76
govc disk.ls -l e9b06a8b-d047-4d3c-b15b-43ea9608b1a6
62
- govc disk.ls -c k8s-region -t us-west-2`
77
+ govc disk.ls -c k8s-region -t us-west-2
78
+ govc disk.ls -q capacity.ge=100 # capacity in MB
79
+ govc disk.ls -q name.sw=my-disk
80
+ govc disk.ls -q metadataKey.eq=cns.k8s.pvc.namespace -q metadataValue.eq=dev` ,
81
+ strings .Join (fields .Strings (), "\n " ),
82
+ aliasHelp ())
63
83
}
64
84
65
85
type VStorageObject struct {
@@ -80,6 +100,70 @@ type lsResult struct {
80
100
Objects []VStorageObject `json:"objects"`
81
101
}
82
102
103
+ var alias = []struct {
104
+ name string
105
+ kind vslm.VslmVsoVStorageObjectQuerySpecQueryOperatorEnum
106
+ }{
107
+ {"eq" , vslm .VslmVsoVStorageObjectQuerySpecQueryOperatorEnumEquals },
108
+ {"ne" , vslm .VslmVsoVStorageObjectQuerySpecQueryOperatorEnumNotEquals },
109
+ {"lt" , vslm .VslmVsoVStorageObjectQuerySpecQueryOperatorEnumLessThan },
110
+ {"le" , vslm .VslmVsoVStorageObjectQuerySpecQueryOperatorEnumLessThanOrEqual },
111
+ {"gt" , vslm .VslmVsoVStorageObjectQuerySpecQueryOperatorEnumGreaterThan },
112
+ {"ge" , vslm .VslmVsoVStorageObjectQuerySpecQueryOperatorEnumGreaterThanOrEqual },
113
+ {"ct" , vslm .VslmVsoVStorageObjectQuerySpecQueryOperatorEnumContains },
114
+ {"sw" , vslm .VslmVsoVStorageObjectQuerySpecQueryOperatorEnumStartsWith },
115
+ {"ew" , vslm .VslmVsoVStorageObjectQuerySpecQueryOperatorEnumEndsWith },
116
+ }
117
+
118
+ func opAlias (value string ) string {
119
+ if len (value ) != 2 {
120
+ return value
121
+ }
122
+
123
+ for _ , a := range alias {
124
+ if a .name == value {
125
+ return string (a .kind )
126
+ }
127
+ }
128
+
129
+ return value
130
+ }
131
+
132
+ func aliasHelp () string {
133
+ var help bytes.Buffer
134
+
135
+ for _ , a := range alias {
136
+ fmt .Fprintf (& help , " %s %s\n " , a .name , a .kind )
137
+ }
138
+
139
+ return help .String ()
140
+ }
141
+
142
+ func (cmd * ls ) querySpec () ([]vslm.VslmVsoVStorageObjectQuerySpec , error ) {
143
+ q := make ([]vslm.VslmVsoVStorageObjectQuerySpec , len (cmd .query ))
144
+
145
+ for i , s := range cmd .query {
146
+ val := strings .SplitN (s , "=" , 2 )
147
+ if len (val ) != 2 {
148
+ return nil , fmt .Errorf ("invalid query: %s" , s )
149
+ }
150
+
151
+ op := string (vslm .VslmVsoVStorageObjectQuerySpecQueryOperatorEnumEquals )
152
+ field := strings .SplitN (val [0 ], "." , 2 )
153
+ if len (field ) == 2 {
154
+ op = field [1 ]
155
+ }
156
+
157
+ q [i ] = vslm.VslmVsoVStorageObjectQuerySpec {
158
+ QueryField : field [0 ],
159
+ QueryOperator : opAlias (op ),
160
+ QueryValue : []string {val [1 ]},
161
+ }
162
+ }
163
+
164
+ return q , nil
165
+ }
166
+
83
167
func (r * lsResult ) Write (w io.Writer ) error {
84
168
tw := tabwriter .NewWriter (r .cmd .Out , 2 , 0 , 2 , ' ' , 0 )
85
169
@@ -124,11 +208,16 @@ func (cmd *ls) Run(ctx context.Context, f *flag.FlagSet) error {
124
208
125
209
filterNotFound := false
126
210
ids := f .Args ()
211
+ q , err := cmd .querySpec ()
212
+ if err != nil {
213
+ return err
214
+ }
215
+
127
216
if len (ids ) == 0 {
128
217
filterNotFound = true
129
218
var oids []types.ID
130
219
if cmd .category == "" {
131
- oids , err = m .List (ctx )
220
+ oids , err = m .List (ctx , q ... )
132
221
} else {
133
222
oids , err = m .ListAttachedObjects (ctx , cmd .category , cmd .tag )
134
223
}
0 commit comments