Skip to content

Commit a8f2d65

Browse files
committed
fix(robot): refresh stale cache on bare-metal name lookup miss
1 parent 3742073 commit a8f2d65

3 files changed

Lines changed: 32 additions & 43 deletions

File tree

hcloud/instances.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,7 @@ type instances struct {
4949
var errServerNotFound = fmt.Errorf("server not found")
5050

5151
func newInstances(client *hcloud.Client, robotClient robotclient.Client, addressFamily addressFamily, networkID int64) *instances {
52-
return &instances{
53-
client: client,
54-
robotClient: robotClient,
55-
addressFamily: addressFamily,
56-
networkID: networkID,
57-
}
52+
return &instances{client, robotClient, addressFamily, networkID}
5853
}
5954

6055
// lookupServer attempts to locate the corresponding hcloud.Server or models.Server (robot server) for a given v1.Node.

hcloud/util.go

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,10 @@ func getRobotServerByName(c robotclient.Client, node *corev1.Node) (server *mode
7171
return nil, fmt.Errorf("%s: %w", op, err)
7272
}
7373

74-
server = findRobotServerByName(serverList, string(node.Name))
75-
if server != nil {
76-
return server, nil
74+
for i, s := range serverList {
75+
if s.Name == node.Name {
76+
return &serverList[i], nil
77+
}
7778
}
7879

7980
serverList, err = c.ServerGetListForceRefresh()
@@ -82,7 +83,13 @@ func getRobotServerByName(c robotclient.Client, node *corev1.Node) (server *mode
8283
return nil, fmt.Errorf("%s: force refresh after cache miss: %w", op, err)
8384
}
8485

85-
return findRobotServerByName(serverList, string(node.Name)), nil
86+
for i, s := range serverList {
87+
if s.Name == node.Name {
88+
return &serverList[i], nil
89+
}
90+
}
91+
92+
return nil, nil
8693
}
8794

8895
func getRobotServerByID(c robotclient.Client, id int, node *corev1.Node) (s *models.Server, e error) {
@@ -121,15 +128,6 @@ func getRobotServerByID(c robotclient.Client, id int, node *corev1.Node) (s *mod
121128
return server, nil
122129
}
123130

124-
func findRobotServerByName(serverList []models.Server, name string) *models.Server {
125-
for i, s := range serverList {
126-
if s.Name == name {
127-
return &serverList[i]
128-
}
129-
}
130-
return nil
131-
}
132-
133131
func isHCloudServerByName(name string) bool {
134132
return !strings.HasPrefix(name, hostNamePrefixRobot)
135133
}

internal/robot/client/cache/client.go

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func NewCachedRobotClient(rootDir string, httpClient *http.Client, baseURL strin
9090

9191
func (c *cacheRobotClient) ServerGet(id int) (*models.Server, error) {
9292
if c.shouldSync() {
93-
if _, err := c.sync(); err != nil {
93+
if _, err := c.ServerGetListForceRefresh(); err != nil {
9494
return nil, err
9595
}
9696
}
@@ -106,15 +106,32 @@ func (c *cacheRobotClient) ServerGet(id int) (*models.Server, error) {
106106

107107
func (c *cacheRobotClient) ServerGetList() ([]models.Server, error) {
108108
if c.shouldSync() {
109-
return c.sync()
109+
return c.ServerGetListForceRefresh()
110110
}
111111

112112
return c.l, nil
113113
}
114114

115115
// ServerGetListForceRefresh bypasses the timeout check and reloads the cache from Robot.
116116
func (c *cacheRobotClient) ServerGetListForceRefresh() ([]models.Server, error) {
117-
return c.sync()
117+
list, err := c.robotClient.ServerGetList()
118+
if err != nil {
119+
return list, err
120+
}
121+
122+
// populate list
123+
c.l = list
124+
125+
// remove all entries from map and repopulate it from the current list
126+
c.m = make(map[int]*models.Server)
127+
for i, server := range list {
128+
c.m[server.ServerNumber] = &list[i]
129+
}
130+
131+
// set time of last update
132+
c.lastUpdate = time.Now()
133+
134+
return c.l, nil
118135
}
119136

120137
func (c *cacheRobotClient) shouldSync() bool {
@@ -138,24 +155,3 @@ func (c *cacheRobotClient) SetCredentials(username, password string) error {
138155
c.m = nil
139156
return nil
140157
}
141-
142-
func (c *cacheRobotClient) sync() ([]models.Server, error) {
143-
list, err := c.robotClient.ServerGetList()
144-
if err != nil {
145-
return list, err
146-
}
147-
148-
// populate list
149-
c.l = list
150-
151-
// remove all entries from map and repopulate it from the current list
152-
c.m = make(map[int]*models.Server)
153-
for i, server := range list {
154-
c.m[server.ServerNumber] = &list[i]
155-
}
156-
157-
// set time of last update
158-
c.lastUpdate = time.Now()
159-
160-
return c.l, nil
161-
}

0 commit comments

Comments
 (0)