diff --git a/pkg/storage/driver/cfgmaps.go b/pkg/storage/driver/cfgmaps.go index ce88c662b..7d7822da7 100644 --- a/pkg/storage/driver/cfgmaps.go +++ b/pkg/storage/driver/cfgmaps.go @@ -173,6 +173,8 @@ func (cfgmaps *ConfigMaps) Create(key string, rls *rspb.Release) error { if _, err := cfgmaps.impl.Create(context.Background(), obj, metav1.CreateOptions{}); err != nil { if apierrors.IsAlreadyExists(err) { return ErrReleaseExists + } else if apierrors.IsRequestEntityTooLargeError(err) { + return errors.Wrapf(err, "release: storage limit") } cfgmaps.Log("create: failed to create: %s", err) diff --git a/pkg/storage/driver/cfgmaps_test.go b/pkg/storage/driver/cfgmaps_test.go index 9a539d6ec..16b97b2a0 100644 --- a/pkg/storage/driver/cfgmaps_test.go +++ b/pkg/storage/driver/cfgmaps_test.go @@ -17,11 +17,11 @@ import ( "encoding/base64" "encoding/json" "reflect" + "strings" "testing" - v1 "k8s.io/api/core/v1" - rspb "helm.sh/helm/v3/pkg/release" + v1 "k8s.io/api/core/v1" ) func TestConfigMapName(t *testing.T) { @@ -188,6 +188,12 @@ func TestConfigMapCreate(t *testing.T) { if !reflect.DeepEqual(rel, got) { t.Errorf("Expected {%v}, got {%v}", rel, got) } + + // configmap overhead entity limit + if err := cfgmaps.Create(testKey("large-chart", 1), releaseStub("large-chart", 1, "", rspb.StatusDeployed)); !strings.Contains(err.Error(), "storage limit: Request entity too large") { + t.Errorf("Expected {%v}, got {%v}", "release: storage limit: Request entity too large: Request entity too large: limit is 3145728", err) + } + } func TestConfigMapUpdate(t *testing.T) { diff --git a/pkg/storage/driver/mock_test.go b/pkg/storage/driver/mock_test.go index 81bda9324..051a7b849 100644 --- a/pkg/storage/driver/mock_test.go +++ b/pkg/storage/driver/mock_test.go @@ -143,6 +143,9 @@ func (mock *MockConfigMapsInterface) Create(_ context.Context, cfgmap *v1.Config if object, ok := mock.objects[name]; ok { return object, apierrors.NewAlreadyExists(v1.Resource("tests"), name) } + if name == "large-chart.v1" { + return nil, apierrors.NewRequestEntityTooLargeError("Request entity too large: limit is 3145728") + } mock.objects[name] = cfgmap return cfgmap, nil } diff --git a/pkg/storage/driver/secrets.go b/pkg/storage/driver/secrets.go index 95a7e9032..df826079a 100644 --- a/pkg/storage/driver/secrets.go +++ b/pkg/storage/driver/secrets.go @@ -163,6 +163,8 @@ func (secrets *Secrets) Create(key string, rls *rspb.Release) error { if _, err := secrets.impl.Create(context.Background(), obj, metav1.CreateOptions{}); err != nil { if apierrors.IsAlreadyExists(err) { return ErrReleaseExists + } else if apierrors.IsRequestEntityTooLargeError(err) { + return errors.Wrapf(err, "release: storage limit") } return errors.Wrap(err, "create: failed to create") @@ -187,6 +189,11 @@ func (secrets *Secrets) Update(key string, rls *rspb.Release) error { } // push the secret object out into the kubiverse _, err = secrets.impl.Update(context.Background(), obj, metav1.UpdateOptions{}) + + if apierrors.IsRequestEntityTooLargeError(err) { + return errors.Wrapf(err, "release: storage limit") + } + return errors.Wrap(err, "update: failed to update") }