From 4b639932ef6603e52f0180e3f56565dde8ccb82f Mon Sep 17 00:00:00 2001 From: Walid Ghallab Date: Thu, 28 Dec 2023 18:57:04 +0000 Subject: [PATCH] Truncate error messages in CA config map to 500 characters per node group. Max size of configmap is 1MB. Change-Id: I615d25781e4f8dafb6a08f752c085544bcd49e5a --- .../clusterstate/clusterstate.go | 17 +++++++- .../clusterstate/clusterstate_test.go | 41 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/cluster-autoscaler/clusterstate/clusterstate.go b/cluster-autoscaler/clusterstate/clusterstate.go index 0fc4e1ef2d6e..67deb6595c4c 100644 --- a/cluster-autoscaler/clusterstate/clusterstate.go +++ b/cluster-autoscaler/clusterstate/clusterstate.go @@ -45,6 +45,10 @@ import ( const ( // MaxNodeStartupTime is the maximum time from the moment the node is registered to the time the node is ready. MaxNodeStartupTime = 15 * time.Minute + // maxErrorMessageSize is the maximum size of error messages displayed in config map as the max size of configmap is 1MB. + maxErrorMessageSize = 500 + // messageTrancated is displayed at the end of a trancated message. + messageTrancated = "" ) var ( @@ -852,7 +856,7 @@ func (csr *ClusterStateRegistry) buildScaleUpStatusNodeGroup(nodeGroup cloudprov condition.Status = api.ClusterAutoscalerBackoff condition.BackoffInfo = api.BackoffInfo{ ErrorCode: scaleUpSafety.BackoffStatus.ErrorInfo.ErrorCode, - ErrorMessage: scaleUpSafety.BackoffStatus.ErrorInfo.ErrorMessage, + ErrorMessage: truncateIfExceedMaxLength(scaleUpSafety.BackoffStatus.ErrorInfo.ErrorMessage, maxErrorMessageSize), } } else { condition.Status = api.ClusterAutoscalerNoActivity @@ -1251,3 +1255,14 @@ func (csr *ClusterStateRegistry) GetScaleUpFailures() map[string][]ScaleUpFailur } return result } + +func truncateIfExceedMaxLength(s string, maxLength int) string { + if len(s) <= maxLength { + return s + } + untrancatedLen := maxLength - len(messageTrancated) + if untrancatedLen < 0 { + return s[:maxLength] + } + return s[:untrancatedLen] + messageTrancated +} diff --git a/cluster-autoscaler/clusterstate/clusterstate_test.go b/cluster-autoscaler/clusterstate/clusterstate_test.go index 58f3df66a218..a57a6a7aceaa 100644 --- a/cluster-autoscaler/clusterstate/clusterstate_test.go +++ b/cluster-autoscaler/clusterstate/clusterstate_test.go @@ -1325,3 +1325,44 @@ func TestUpdateIncorrectNodeGroupSizes(t *testing.T) { }) } } + +func TestTruncateIfExceedMaxSize(t *testing.T) { + testCases := []struct { + name string + message string + maxSize int + wantMessage string + }{ + { + name: "Message doesn't exceed maxSize", + message: "Some message", + maxSize: len("Some message"), + wantMessage: "Some message", + }, + { + name: "Message exceeds maxSize", + message: "Some long message", + maxSize: len("Some long message") - 1, + wantMessage: "Some ", + }, + { + name: "Message doesn't exceed maxSize and maxSize is smaller than truncatedMessageSuffix length", + message: "msg", + maxSize: len("msg"), + wantMessage: "msg", + }, + { + name: "Message exceeds maxSize and maxSize is smaller than truncatedMessageSuffix length", + message: "msg", + maxSize: 2, + wantMessage: "ms", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + got := truncateIfExceedMaxLength(tc.message, tc.maxSize) + assert.Equal(t, tc.wantMessage, got) + }) + } +}