diff --git a/go.mod b/go.mod index 3194195..b50ff62 100644 --- a/go.mod +++ b/go.mod @@ -7,9 +7,9 @@ require ( github.com/prometheus/client_golang v1.23.2 github.com/zclconf/go-cty v1.18.1 gitlab.com/gitlab-org/api/client-go v1.46.0 - k8s.io/api v0.35.4 - k8s.io/apimachinery v0.35.4 - k8s.io/client-go v0.35.4 + k8s.io/api v0.36.1 + k8s.io/apimachinery v0.36.1 + k8s.io/client-go v0.36.1 ) require ( @@ -17,8 +17,8 @@ require ( github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.12.2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/emicklei/go-restful/v3 v3.13.0 // indirect github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect @@ -53,15 +53,15 @@ require ( golang.org/x/text v0.33.0 // indirect golang.org/x/time v0.14.0 // indirect golang.org/x/tools v0.40.0 // indirect - google.golang.org/protobuf v1.36.11 // indirect + google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect - k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 // indirect + k8s.io/klog/v2 v2.140.0 // indirect + k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect + k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 // indirect sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.2 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) diff --git a/go.sum b/go.sum index 6912936..7201ecb 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= -github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8= github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= @@ -10,10 +8,11 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= -github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes= +github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= @@ -28,8 +27,6 @@ github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= -github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= -github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= @@ -40,8 +37,6 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX github.com/google/go-querystring v1.2.0 h1:yhqkPbu2/OH+V9BfpCVPZkNmUXhb2gBxJArfhIxNtP0= github.com/google/go-querystring v1.2.0/go.mod h1:8IFJqpSRITyJ8QhQ13bmbeMBDfmeEJZD5A0egEOmkqU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= -github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/graph-gophers/graphql-go v1.9.0 h1:yu0ucKHLc5qGpRwLYKIWtr9bOoxovkWasuBrPQwlHls= @@ -85,12 +80,9 @@ github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFd github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/onsi/ginkgo/v2 v2.27.2 h1:LzwLj0b89qtIy6SSASkzlNvX6WktqurSHwkk2ipF/Ns= -github.com/onsi/ginkgo/v2 v2.27.2/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo= -github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= -github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= @@ -146,8 +138,8 @@ golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= @@ -158,23 +150,23 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.35.4 h1:P7nFYKl5vo9AGUp1Z+Pmd3p2tA7bX2wbFWCvDeRv988= -k8s.io/api v0.35.4/go.mod h1:yl4lqySWOgYJJf9RERXKUwE9g2y+CkuwG+xmcOK8wXU= -k8s.io/apimachinery v0.35.4 h1:xtdom9RG7e+yDp71uoXoJDWEE2eOiHgeO4GdBzwWpds= -k8s.io/apimachinery v0.35.4/go.mod h1:NNi1taPOpep0jOj+oRha3mBJPqvi0hGdaV8TCqGQ+cc= -k8s.io/client-go v0.35.4 h1:DN6fyaGuzK64UvnKO5fOA6ymSjvfGAnCAHAR0C66kD8= -k8s.io/client-go v0.35.4/go.mod h1:2Pg9WpsS4NeOpoYTfHHfMxBG8zFMSAUi4O/qoiJC3nY= -k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= -k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE= -k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= -k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= -k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/api v0.36.1 h1:XbL/EMj8K2aJpJtePmqUyQMsM0D4QI2pvl7YKJ20FTY= +k8s.io/api v0.36.1/go.mod h1:KOWo4ey3TINlXjeHVuwB3i+tXXnu+UcwFBHlI/9dvEo= +k8s.io/apimachinery v0.36.1 h1:G63Gjx2W+q0YD+72Vo8oY0nDnePVwnuzTmmy5ENrVSA= +k8s.io/apimachinery v0.36.1/go.mod h1:ibYOR00vW/I1kzvi5SF0dRuJ52BvKtfvRdOn35GPQ+8= +k8s.io/client-go v0.36.1 h1:FN/K8QIT2CEDt+2WB2HnWrUANZ50AP5GII43/SP2JR0= +k8s.io/client-go v0.36.1/go.mod h1:s6rAnCtTGYDQnpNjEhSaISV+2O8jwruZ6m3QOYBFbtU= +k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= +k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= +k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg= +k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0= +k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU= +k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= -sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/structured-merge-diff/v6 v6.3.2 h1:kwVWMx5yS1CrnFWA/2QHyRVJ8jM6dBA80uLmm0wJkk8= +sigs.k8s.io/structured-merge-diff/v6 v6.3.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/internal/autoscaler/planner_test.go b/internal/autoscaler/planner_test.go index 54a4f87..08fb427 100644 --- a/internal/autoscaler/planner_test.go +++ b/internal/autoscaler/planner_test.go @@ -9,11 +9,16 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +const ( + testNodeRoleLabel = "role" + testNodeRoleValue = "worker" +) + func TestBuildPlanUsesExistingNodeCapacityBeforeScaling(t *testing.T) { now := time.Now() template := Resources{MilliCPU: 2000, Memory: 8 * 1024 * 1024 * 1024, Pods: 10} nodes := []corev1.Node{ - node("node-1", map[string]string{"role": "worker"}, Resources{MilliCPU: 2000, Memory: 8 * 1024 * 1024 * 1024, Pods: 10}), + node("node-1", map[string]string{testNodeRoleLabel: testNodeRoleValue}, Resources{MilliCPU: 2000, Memory: 8 * 1024 * 1024 * 1024, Pods: 10}), } pods := []corev1.Pod{ runningPod("used", "node-1", Resources{MilliCPU: 500, Memory: 1024 * 1024 * 1024, Pods: 1}), @@ -21,7 +26,7 @@ func TestBuildPlanUsesExistingNodeCapacityBeforeScaling(t *testing.T) { unschedulablePod("pending-b", now, Resources{MilliCPU: 500, Memory: 1024 * 1024 * 1024, Pods: 1}), } - plan := BuildPlan(now, nodes, pods, 1, 0, 10, map[string]string{"role": "worker"}, template, time.Minute) + plan := BuildPlan(now, nodes, pods, 1, 0, 10, map[string]string{testNodeRoleLabel: testNodeRoleValue}, template, time.Minute) if plan.NewNodes != 0 { t.Fatalf("NewNodes = %d, want 0", plan.NewNodes) @@ -74,16 +79,16 @@ func TestBuildPlanReportsScaleDownPotential(t *testing.T) { now := time.Now() template := Resources{MilliCPU: 2000, Memory: 8 * 1024 * 1024 * 1024, Pods: 10} nodes := []corev1.Node{ - node("node-1", map[string]string{"role": "worker"}, template), - node("node-2", map[string]string{"role": "worker"}, template), - node("node-3", map[string]string{"role": "worker"}, template), + node("node-1", map[string]string{testNodeRoleLabel: testNodeRoleValue}, template), + node("node-2", map[string]string{testNodeRoleLabel: testNodeRoleValue}, template), + node("node-3", map[string]string{testNodeRoleLabel: testNodeRoleValue}, template), } pods := []corev1.Pod{ runningPod("used-a", "node-1", Resources{MilliCPU: 500, Memory: 1024 * 1024 * 1024, Pods: 1}), runningPod("used-b", "node-2", Resources{MilliCPU: 500, Memory: 1024 * 1024 * 1024, Pods: 1}), } - plan := BuildPlan(now, nodes, pods, 3, 1, 10, map[string]string{"role": "worker"}, template, time.Minute) + plan := BuildPlan(now, nodes, pods, 3, 1, 10, map[string]string{testNodeRoleLabel: testNodeRoleValue}, template, time.Minute) if plan.ScaleDownPotentialNodes != 2 { t.Fatalf("ScaleDownPotentialNodes = %d, want 2", plan.ScaleDownPotentialNodes) @@ -103,15 +108,15 @@ func TestBuildPlanDoesNotReportScaleDownPotentialWithPendingPods(t *testing.T) { now := time.Now() template := Resources{MilliCPU: 2000, Memory: 8 * 1024 * 1024 * 1024, Pods: 10} nodes := []corev1.Node{ - node("node-1", map[string]string{"role": "worker"}, template), - node("node-2", map[string]string{"role": "worker"}, template), + node("node-1", map[string]string{testNodeRoleLabel: testNodeRoleValue}, template), + node("node-2", map[string]string{testNodeRoleLabel: testNodeRoleValue}, template), } pods := []corev1.Pod{ runningPod("used-a", "node-1", Resources{MilliCPU: 500, Memory: 1024 * 1024 * 1024, Pods: 1}), unschedulablePod("pending", now, Resources{MilliCPU: 500, Memory: 1024 * 1024 * 1024, Pods: 1}), } - plan := BuildPlan(now, nodes, pods, 2, 0, 10, map[string]string{"role": "worker"}, template, time.Minute) + plan := BuildPlan(now, nodes, pods, 2, 0, 10, map[string]string{testNodeRoleLabel: testNodeRoleValue}, template, time.Minute) if plan.ScaleDownPotentialNodes != 0 { t.Fatalf("ScaleDownPotentialNodes = %d, want 0", plan.ScaleDownPotentialNodes) @@ -125,14 +130,14 @@ func TestBuildPlanDoesNotReportScaleDownPotentialWhenRunningPodDoesNotFitTemplat now := time.Now() template := Resources{MilliCPU: 1000, Memory: 1024 * 1024 * 1024, Pods: 10} nodes := []corev1.Node{ - node("node-1", map[string]string{"role": "worker"}, Resources{MilliCPU: 4000, Memory: 8 * 1024 * 1024 * 1024, Pods: 10}), - node("node-2", map[string]string{"role": "worker"}, Resources{MilliCPU: 4000, Memory: 8 * 1024 * 1024 * 1024, Pods: 10}), + node("node-1", map[string]string{testNodeRoleLabel: testNodeRoleValue}, Resources{MilliCPU: 4000, Memory: 8 * 1024 * 1024 * 1024, Pods: 10}), + node("node-2", map[string]string{testNodeRoleLabel: testNodeRoleValue}, Resources{MilliCPU: 4000, Memory: 8 * 1024 * 1024 * 1024, Pods: 10}), } pods := []corev1.Pod{ runningPod("large", "node-1", Resources{MilliCPU: 2000, Memory: 1024 * 1024 * 1024, Pods: 1}), } - plan := BuildPlan(now, nodes, pods, 2, 0, 10, map[string]string{"role": "worker"}, template, time.Minute) + plan := BuildPlan(now, nodes, pods, 2, 0, 10, map[string]string{testNodeRoleLabel: testNodeRoleValue}, template, time.Minute) if plan.ScaleDownPotentialNodes != 0 { t.Fatalf("ScaleDownPotentialNodes = %d, want 0", plan.ScaleDownPotentialNodes) @@ -146,15 +151,15 @@ func TestBuildPlanScaleDownRespectsMinSize(t *testing.T) { now := time.Now() template := Resources{MilliCPU: 2000, Memory: 8 * 1024 * 1024 * 1024, Pods: 10} nodes := []corev1.Node{ - node("node-1", map[string]string{"role": "worker"}, template), - node("node-2", map[string]string{"role": "worker"}, template), - node("node-3", map[string]string{"role": "worker"}, template), + node("node-1", map[string]string{testNodeRoleLabel: testNodeRoleValue}, template), + node("node-2", map[string]string{testNodeRoleLabel: testNodeRoleValue}, template), + node("node-3", map[string]string{testNodeRoleLabel: testNodeRoleValue}, template), } pods := []corev1.Pod{ runningPod("used-a", "node-1", Resources{MilliCPU: 500, Memory: 1024 * 1024 * 1024, Pods: 1}), } - plan := BuildPlan(now, nodes, pods, 3, 2, 10, map[string]string{"role": "worker"}, template, time.Minute) + plan := BuildPlan(now, nodes, pods, 3, 2, 10, map[string]string{testNodeRoleLabel: testNodeRoleValue}, template, time.Minute) if plan.DesiredTarget != 2 { t.Fatalf("DesiredTarget = %d, want 2", plan.DesiredTarget) diff --git a/internal/autoscaler/runner_test.go b/internal/autoscaler/runner_test.go index 2ab1096..4edefdd 100644 --- a/internal/autoscaler/runner_test.go +++ b/internal/autoscaler/runner_test.go @@ -17,7 +17,7 @@ func TestRunnerScalesTargetWhenPodsDoNotFit(t *testing.T) { target := &fakeTarget{size: 1} kube := fake.NewSimpleClientset( &corev1.NodeList{Items: []corev1.Node{ - node("worker-1", map[string]string{"role": "worker"}, Resources{MilliCPU: 1000, Memory: 1024 * 1024 * 1024, Pods: 10}), + node("worker-1", map[string]string{testNodeRoleLabel: testNodeRoleValue}, Resources{MilliCPU: 1000, Memory: 1024 * 1024 * 1024, Pods: 10}), }}, &corev1.PodList{Items: []corev1.Pod{ runningPod("used", "worker-1", Resources{MilliCPU: 1000, Memory: 128 * 1024 * 1024, Pods: 1}), @@ -72,9 +72,9 @@ func TestRunnerScalesDownWhenCapacityRemainsUnneeded(t *testing.T) { template := Resources{MilliCPU: 1000, Memory: 1024 * 1024 * 1024, Pods: 10} kube := fake.NewSimpleClientset( &corev1.NodeList{Items: []corev1.Node{ - node("worker-1", map[string]string{"role": "worker"}, template), - node("worker-2", map[string]string{"role": "worker"}, template), - node("worker-3", map[string]string{"role": "worker"}, template), + node("worker-1", map[string]string{testNodeRoleLabel: testNodeRoleValue}, template), + node("worker-2", map[string]string{testNodeRoleLabel: testNodeRoleValue}, template), + node("worker-3", map[string]string{testNodeRoleLabel: testNodeRoleValue}, template), }}, &corev1.PodList{Items: []corev1.Pod{ runningPod("used", "worker-1", Resources{MilliCPU: 500, Memory: 128 * 1024 * 1024, Pods: 1}), @@ -104,8 +104,8 @@ func TestRunnerWaitsForScaleDownUnneededTime(t *testing.T) { template := Resources{MilliCPU: 1000, Memory: 1024 * 1024 * 1024, Pods: 10} kube := fake.NewSimpleClientset( &corev1.NodeList{Items: []corev1.Node{ - node("worker-1", map[string]string{"role": "worker"}, template), - node("worker-2", map[string]string{"role": "worker"}, template), + node("worker-1", map[string]string{testNodeRoleLabel: testNodeRoleValue}, template), + node("worker-2", map[string]string{testNodeRoleLabel: testNodeRoleValue}, template), }}, &corev1.PodList{Items: []corev1.Pod{ runningPod("used", "worker-1", Resources{MilliCPU: 500, Memory: 128 * 1024 * 1024, Pods: 1}), @@ -144,7 +144,7 @@ func testConfig() config.Config { Attribute: "worker_count", MinSize: 0, MaxSize: 10, - NodeSelector: map[string]string{"role": "worker"}, + NodeSelector: map[string]string{testNodeRoleLabel: testNodeRoleValue}, TemplateCPU: "1", TemplateMemory: "1Gi", TemplatePods: 10, diff --git a/internal/gitlab/client_test.go b/internal/gitlab/client_test.go index bc320fa..513cf93 100644 --- a/internal/gitlab/client_test.go +++ b/internal/gitlab/client_test.go @@ -7,6 +7,8 @@ import ( "github.com/containeroo/terrascaler/internal/terraform" ) +const testUsername = "alice" + func TestMergeRequestBranch(t *testing.T) { client := &Client{ cfg: Config{ @@ -61,9 +63,9 @@ func TestNormalizeUsername(t *testing.T) { in string want string }{ - "plain": {in: "alice", want: "alice"}, - "at": {in: "@alice", want: "alice"}, - "spaces": {in: " @alice ", want: "alice"}, + "plain": {in: testUsername, want: testUsername}, + "at": {in: "@" + testUsername, want: testUsername}, + "spaces": {in: " @" + testUsername + " ", want: testUsername}, } { t.Run(name, func(t *testing.T) { if got := normalizeUsername(tc.in); got != tc.want {