forked from oVirt/go-ovirt-client
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclient_vm_search.go
114 lines (105 loc) · 3.27 KB
/
client_vm_search.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package ovirtclient
import (
"fmt"
"strings"
)
func (o *oVirtClient) vmSearchCriteria(params VMSearchParameters) (string, error) {
var criteria []string
var err error
if criteria, err = o.vmTagCriteria(params, criteria); err != nil {
return "", err
}
if criteria, err = o.vmNameCriteria(params, criteria); err != nil {
return "", err
}
if criteria, err = o.vmStatusCriteria(params, criteria); err != nil {
return "", err
}
if criteria, err = o.vmNotStatusCriteria(params, criteria); err != nil {
return "", err
}
if len(criteria) == 0 {
return "", newError(EBadArgument, "at least one search parameter must be specified")
}
return strings.Join(criteria, " AND "), nil
}
func (o *oVirtClient) vmNotStatusCriteria(params VMSearchParameters, criteria []string) (
[]string,
error,
) {
if statuses := params.NotStatuses(); statuses != nil {
if err := statuses.Validate(); err != nil {
return nil, wrap(err, EBadArgument, "invalid value for search field not statuses")
}
items := make([]string, len(*statuses))
for i, status := range *statuses {
items[i] = fmt.Sprintf("status != %s", status)
}
criteria = append(criteria, fmt.Sprintf("(%s)", strings.Join(items, " AND ")))
}
return criteria, nil
}
func (o *oVirtClient) vmStatusCriteria(params VMSearchParameters, criteria []string) ([]string, error) {
if statuses := params.Statuses(); statuses != nil {
if err := statuses.Validate(); err != nil {
return nil, wrap(err, EBadArgument, "invalid value for search field statuses")
}
items := make([]string, len(*statuses))
for i, status := range *statuses {
items[i] = fmt.Sprintf("status = %s", status)
}
criteria = append(criteria, fmt.Sprintf("(%s)", strings.Join(items, " OR ")))
}
return criteria, nil
}
func (o *oVirtClient) vmNameCriteria(params VMSearchParameters, criteria []string) ([]string, error) {
if name := params.Name(); name != nil {
quotedName, err := quoteSearchString(*name)
if err != nil {
return nil, newError(EBadArgument, "invalid name search string: %s", *name)
}
criteria = append(criteria, fmt.Sprintf("name = %s", quotedName))
}
return criteria, nil
}
func (o *oVirtClient) vmTagCriteria(params VMSearchParameters, criteria []string) ([]string, error) {
if tag := params.Tag(); tag != nil {
quotedTag, err := quoteSearchString(*tag)
if err != nil {
return nil, newError(EBadArgument, "invalid tag search string: %s", *tag)
}
criteria = append(criteria, fmt.Sprintf("tag = %s", quotedTag))
}
return criteria, nil
}
func (o *oVirtClient) SearchVMs(params VMSearchParameters, retries ...RetryStrategy) (result []VM, err error) {
retries = defaultRetries(retries, defaultReadTimeouts())
result = []VM{}
qs, err := o.vmSearchCriteria(params)
if err != nil {
return nil, err
}
err = retry(
"searching for VMs",
o.logger,
retries,
func() error {
response, e := o.conn.SystemService().VmsService().List().Search(qs).Send()
if e != nil {
return e
}
sdkObjects, ok := response.Vms()
if !ok {
return nil
}
result = make([]VM, len(sdkObjects.Slice()))
for i, sdkObject := range sdkObjects.Slice() {
result[i], e = convertSDKVM(sdkObject, o)
if e != nil {
return wrap(e, EBug, "failed to convert VM during searching item #%d", i)
}
}
return nil
})
return
}