Skip to content

Commit a632d33

Browse files
committed
added a new NodeGroupDoesNotExistError in errors.go
This is to support no nodepool exists conditions, which crashes Autoscaler
1 parent e3434e5 commit a632d33

File tree

4 files changed

+43
-10
lines changed

4 files changed

+43
-10
lines changed

cluster-autoscaler/cloudprovider/gce/autoscaling_gce_client.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ import (
2626
"strings"
2727
"time"
2828

29+
"google.golang.org/api/googleapi"
2930
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
31+
"k8s.io/autoscaler/cluster-autoscaler/utils/errors"
3032
"k8s.io/autoscaler/cluster-autoscaler/utils/klogx"
3133

3234
gce "google.golang.org/api/compute/v1"
@@ -149,6 +151,11 @@ func (client *autoscalingGceClientV1) FetchMigTargetSize(migRef GceRef) (int64,
149151
registerRequest("instance_group_managers", "get")
150152
igm, err := client.gceService.InstanceGroupManagers.Get(migRef.Project, migRef.Zone, migRef.Name).Do()
151153
if err != nil {
154+
if err, ok := err.(*googleapi.Error); ok {
155+
if err.Code == http.StatusNotFound {
156+
return 0, errors.NewAutoscalerError(errors.NodeGroupDoesNotExistError, "", err)
157+
}
158+
}
152159
return 0, err
153160
}
154161
return igm.TargetSize, nil
@@ -338,6 +345,11 @@ func (client *autoscalingGceClientV1) FetchMigTemplate(migRef GceRef) (*gce.Inst
338345
registerRequest("instance_group_managers", "get")
339346
igm, err := client.gceService.InstanceGroupManagers.Get(migRef.Project, migRef.Zone, migRef.Name).Do()
340347
if err != nil {
348+
if err, ok := err.(*googleapi.Error); ok {
349+
if err.Code == http.StatusNotFound {
350+
return nil, errors.NewAutoscalerError(errors.NodeGroupDoesNotExistError, "", err)
351+
}
352+
}
341353
return nil, err
342354
}
343355
templateUrl, err := url.Parse(igm.InstanceTemplate)

cluster-autoscaler/cloudprovider/gce/mig_target_sizes_provider.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ limitations under the License.
1717
package gce
1818

1919
import (
20-
"fmt"
21-
klog "k8s.io/klog/v2"
2220
"sync"
21+
22+
klog "k8s.io/klog/v2"
2323
)
2424

2525
// MigTargetSizesProvider allows obtaining target sizes of MIGs
@@ -55,8 +55,10 @@ func (c *cachingMigTargetSizesProvider) GetMigTargetSize(migRef GceRef) (int64,
5555
}
5656

5757
newTargetSizes, err := c.fillInMigTargetSizeCache()
58-
if err != nil {
59-
// fallback to querying for single mig
58+
59+
// if we still do not have value here return an error
60+
size, found := newTargetSizes[migRef]
61+
if err != nil || !found {
6062
targetSize, err = c.gceClient.FetchMigTargetSize(migRef)
6163
if err != nil {
6264
return 0, err
@@ -65,12 +67,6 @@ func (c *cachingMigTargetSizesProvider) GetMigTargetSize(migRef GceRef) (int64,
6567
return targetSize, nil
6668
}
6769

68-
// if we still do not have value here return an error
69-
size, found := newTargetSizes[migRef]
70-
if !found {
71-
return 0, fmt.Errorf("Could not get target size for mig %v", migRef.String())
72-
}
73-
7470
// we are good
7571
return size, nil
7672
}

cluster-autoscaler/utils/errors/errors.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ const (
5858
// ConfigurationError is an error related to bad configuration provided
5959
// by a user.
6060
ConfigurationError AutoscalerErrorType = "configurationError"
61+
// NodeGroupDoesNotExistError signifies that a NodeGroup
62+
// does not exist.
63+
NodeGroupDoesNotExistError AutoscalerErrorType = "nodeGroupDoesNotExistError"
6164
)
6265

6366
// NewAutoscalerError returns new autoscaler error with a message constructed from format string

cluster-autoscaler/utils/test/test_utils.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,3 +237,25 @@ func (l *HttpServerMock) handle(url string) string {
237237
args := l.Called(url)
238238
return args.String(0)
239239
}
240+
241+
// NewHttpServerMock creates new HttpServerMock.
242+
func NewHttpServerMockWithStatusCode() *HttpServerMock {
243+
httpServerMock := &HttpServerMock{}
244+
mux := http.NewServeMux()
245+
mux.HandleFunc("/",
246+
func(w http.ResponseWriter, req *http.Request) {
247+
code, result := httpServerMock.handleWithStatusCode(req.URL.Path)
248+
w.WriteHeader(code)
249+
w.Write([]byte(result))
250+
//w.Write([]byte("status: " + string(code) + "\n" + result))
251+
})
252+
253+
server := httptest.NewServer(mux)
254+
httpServerMock.Server = server
255+
return httpServerMock
256+
}
257+
258+
func (l *HttpServerMock) handleWithStatusCode(url string) (int, string) {
259+
args := l.Called(url)
260+
return args.Int(0), args.String(1)
261+
}

0 commit comments

Comments
 (0)