forked from metal3-io/baremetal-operator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
dependencies.go
92 lines (73 loc) · 2.21 KB
/
dependencies.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
package ironic
import (
"strings"
"time"
"github.com/go-logr/logr"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack/baremetal/v1/drivers"
"github.com/gophercloud/gophercloud/pagination"
)
const (
checkRequeueDelay = time.Second * 10
)
type ironicDependenciesChecker struct {
client *gophercloud.ServiceClient
inspector *gophercloud.ServiceClient
log logr.Logger
}
func newIronicDependenciesChecker(client *gophercloud.ServiceClient, inspector *gophercloud.ServiceClient, log logr.Logger) *ironicDependenciesChecker {
return &ironicDependenciesChecker{
client: client,
inspector: inspector,
log: log,
}
}
func (i *ironicDependenciesChecker) IsReady() (result bool, err error) {
ready, err := i.checkIronic()
if ready && err == nil {
ready = i.checkIronicInspector()
}
return ready, err
}
func (i *ironicDependenciesChecker) checkEndpoint(client *gophercloud.ServiceClient) (ready bool) {
// NOTE: Some versions of Ironic inspector returns 404 for /v1/ but 200 for /v1,
// which seems to be the default behavior for Flask. Remove the trailing slash
// from the client endpoint.
endpoint := strings.TrimSuffix(client.Endpoint, "/")
_, err := client.Get(endpoint, nil, nil)
if err != nil {
i.log.Info("error caught while checking endpoint", "endpoint", client.Endpoint, "error", err)
}
return err == nil
}
func (i *ironicDependenciesChecker) checkIronic() (ready bool, err error) {
ready = i.checkEndpoint(i.client)
if ready {
ready, err = i.checkIronicConductor()
}
return ready, err
}
func (i *ironicDependenciesChecker) checkIronicConductor() (ready bool, err error) {
pager := drivers.ListDrivers(i.client, drivers.ListDriversOpts{
Detail: false,
})
err = pager.Err
if err != nil {
return ready, err
}
driverCount := 0
pager.EachPage(func(page pagination.Page) (bool, error) {
actual, driverErr := drivers.ExtractDrivers(page)
if driverErr != nil {
return false, driverErr
}
driverCount += len(actual)
return true, nil
})
// If we have any drivers, conductor is up.
ready = driverCount > 0
return ready, err
}
func (i *ironicDependenciesChecker) checkIronicInspector() (ready bool) {
return i.checkEndpoint(i.inspector)
}