Skip to content

Commit

Permalink
Add validation for metadata name
Browse files Browse the repository at this point in the history
  • Loading branch information
vapopov committed Sep 5, 2024
1 parent 72c78a0 commit 8fcd141
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 13 deletions.
3 changes: 3 additions & 0 deletions api/types/autoupdate/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ func ValidateAutoUpdateConfig(c *autoupdate.AutoUpdateConfig) error {
if c.Metadata == nil {
return trace.BadParameter("Metadata is nil")
}
if c.Metadata.Name != types.MetaNameAutoUpdateConfig {
return trace.BadParameter("Name is not valid")
}
if c.Spec == nil {
return trace.BadParameter("Spec is nil")
}
Expand Down
3 changes: 3 additions & 0 deletions api/types/autoupdate/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ func ValidateAutoUpdateVersion(v *autoupdate.AutoUpdateVersion) error {
if v.Metadata == nil {
return trace.BadParameter("Metadata is nil")
}
if v.Metadata.Name != types.MetaNameAutoUpdateVersion {
return trace.BadParameter("Name is not valid")
}
if v.Spec == nil {
return trace.BadParameter("Spec is nil")
}
Expand Down
103 changes: 90 additions & 13 deletions lib/services/local/autoupdate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,22 +20,24 @@ package local

import (
"context"
"github.com/gravitational/teleport/api/types/autoupdate"
"testing"

"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
"github.com/gravitational/trace"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/testing/protocmp"

"github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1"
autoupdatepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1"
headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1"
"github.com/gravitational/teleport/api/types"
"github.com/gravitational/teleport/lib/backend/memory"
)

// TestAutoupdateServiceConfigCRUD verifies get/create/update/upsert/delete methods of the backend service
// TestAutoUpdateServiceConfigCRUD verifies get/create/update/upsert/delete methods of the backend service
// for autoupdate config resource.
func TestAutoupdateServiceConfigCRUD(t *testing.T) {
func TestAutoUpdateServiceConfigCRUD(t *testing.T) {
t.Parallel()

bk, err := memory.New(memory.Config{})
Expand All @@ -45,18 +47,18 @@ func TestAutoupdateServiceConfigCRUD(t *testing.T) {
require.NoError(t, err)

ctx := context.Background()
config := &autoupdate.AutoUpdateConfig{
config := &autoupdatepb.AutoUpdateConfig{
Kind: types.KindAutoUpdateConfig,
Version: types.V1,
Metadata: &headerv1.Metadata{Name: types.MetaNameAutoUpdateConfig},
Spec: &autoupdate.AutoUpdateConfigSpec{ToolsAutoupdate: true},
Spec: &autoupdatepb.AutoUpdateConfigSpec{ToolsAutoupdate: true},
}

created, err := service.CreateAutoUpdateConfig(ctx, config)
require.NoError(t, err)
diff := cmp.Diff(config, created,
cmpopts.IgnoreFields(headerv1.Metadata{}, "Revision"),
cmpopts.IgnoreUnexported(autoupdate.AutoUpdateConfig{}, autoupdate.AutoUpdateConfigSpec{}, headerv1.Metadata{}),
protocmp.Transform(),
)
require.Empty(t, diff)
require.NotEmpty(t, created.GetMetadata().GetRevision())
Expand All @@ -65,7 +67,7 @@ func TestAutoupdateServiceConfigCRUD(t *testing.T) {
require.NoError(t, err)
diff = cmp.Diff(config, got,
cmpopts.IgnoreFields(headerv1.Metadata{}, "Revision"),
cmpopts.IgnoreUnexported(autoupdate.AutoUpdateConfig{}, autoupdate.AutoUpdateConfigSpec{}, headerv1.Metadata{}),
protocmp.Transform(),
)
require.Empty(t, diff)
require.Equal(t, created.GetMetadata().GetRevision(), got.GetMetadata().GetRevision())
Expand All @@ -89,9 +91,9 @@ func TestAutoupdateServiceConfigCRUD(t *testing.T) {
require.ErrorAs(t, err, &notFoundError)
}

// TestAutoupdateServiceVersionCRUD verifies get/create/update/upsert/delete methods of the backend service
// TestAutoUpdateServiceVersionCRUD verifies get/create/update/upsert/delete methods of the backend service
// for autoupdate version resource.
func TestAutoupdateServiceVersionCRUD(t *testing.T) {
func TestAutoUpdateServiceVersionCRUD(t *testing.T) {
t.Parallel()

bk, err := memory.New(memory.Config{})
Expand All @@ -101,18 +103,18 @@ func TestAutoupdateServiceVersionCRUD(t *testing.T) {
require.NoError(t, err)

ctx := context.Background()
version := &autoupdate.AutoUpdateVersion{
version := &autoupdatepb.AutoUpdateVersion{
Kind: types.KindAutoUpdateVersion,
Version: types.V1,
Metadata: &headerv1.Metadata{Name: types.MetaNameAutoUpdateVersion},
Spec: &autoupdate.AutoUpdateVersionSpec{ToolsVersion: "1.2.3"},
Spec: &autoupdatepb.AutoUpdateVersionSpec{ToolsVersion: "1.2.3"},
}

created, err := service.CreateAutoUpdateVersion(ctx, version)
require.NoError(t, err)
diff := cmp.Diff(version, created,
cmpopts.IgnoreFields(headerv1.Metadata{}, "Revision"),
cmpopts.IgnoreUnexported(autoupdate.AutoUpdateVersion{}, autoupdate.AutoUpdateVersionSpec{}, headerv1.Metadata{}),
protocmp.Transform(),
)
require.Empty(t, diff)
require.NotEmpty(t, created.GetMetadata().GetRevision())
Expand All @@ -121,7 +123,7 @@ func TestAutoupdateServiceVersionCRUD(t *testing.T) {
require.NoError(t, err)
diff = cmp.Diff(version, got,
cmpopts.IgnoreFields(headerv1.Metadata{}, "Revision"),
cmpopts.IgnoreUnexported(autoupdate.AutoUpdateVersion{}, autoupdate.AutoUpdateVersionSpec{}, headerv1.Metadata{}),
protocmp.Transform(),
)
require.Empty(t, diff)
require.Equal(t, created.GetMetadata().GetRevision(), got.GetMetadata().GetRevision())
Expand All @@ -144,3 +146,78 @@ func TestAutoupdateServiceVersionCRUD(t *testing.T) {
_, err = service.UpdateAutoUpdateVersion(ctx, version)
require.ErrorAs(t, err, &notFoundError)
}

// TestAutoUpdateServiceInvalidNameCreation verifies that configuration and version
// with not constant name is rejected to be created.
func TestAutoUpdateServiceInvalidNameCreation(t *testing.T) {
t.Parallel()

bk, err := memory.New(memory.Config{})
require.NoError(t, err)

service, err := NewAutoupdateService(bk)
require.NoError(t, err)

ctx := context.Background()
config := &autoupdatepb.AutoUpdateConfig{
Kind: types.KindAutoUpdateConfig,
Version: types.V1,
Metadata: &headerv1.Metadata{Name: "invalid-auto-update-config-name"},
Spec: &autoupdatepb.AutoUpdateConfigSpec{ToolsAutoupdate: true},
}

createdConfig, err := service.CreateAutoUpdateConfig(ctx, config)
require.Error(t, err)
require.Nil(t, createdConfig)

version := &autoupdatepb.AutoUpdateVersion{
Kind: types.KindAutoUpdateVersion,
Version: types.V1,
Metadata: &headerv1.Metadata{Name: "invalid-auto-update-version-name"},
Spec: &autoupdatepb.AutoUpdateVersionSpec{ToolsVersion: "1.2.3"},
}

createdVersion, err := service.CreateAutoUpdateVersion(ctx, version)
require.Error(t, err)
require.Nil(t, createdVersion)
}

// TestAutoUpdateServiceInvalidNameUpdate verifies that configuration and version
// with not constant name is rejected to be updated.
func TestAutoUpdateServiceInvalidNameUpdate(t *testing.T) {
t.Parallel()

bk, err := memory.New(memory.Config{})
require.NoError(t, err)

service, err := NewAutoupdateService(bk)
require.NoError(t, err)

ctx := context.Background()

// Validate the config update restriction.
config, err := autoupdate.NewAutoUpdateConfig(&autoupdatepb.AutoUpdateConfigSpec{ToolsAutoupdate: true})
require.NoError(t, err)

createdConfig, err := service.UpsertAutoUpdateConfig(ctx, config)
require.NoError(t, err)

createdConfig.GetMetadata().Name = "invalid-auto-update-config-name"

createdConfig, err = service.UpdateAutoUpdateConfig(ctx, createdConfig)
require.Error(t, err)
require.Nil(t, createdConfig)

// Validate the version update restriction.
version, err := autoupdate.NewAutoUpdateVersion(&autoupdatepb.AutoUpdateVersionSpec{ToolsVersion: "1.2.3"})
require.NoError(t, err)

createdVersion, err := service.UpsertAutoUpdateVersion(ctx, version)
require.NoError(t, err)

createdVersion.GetMetadata().Name = "invalid-auto-update-version-name"

createdVersion, err = service.UpdateAutoUpdateVersion(ctx, createdVersion)
require.Error(t, err)
require.Nil(t, createdVersion)
}

0 comments on commit 8fcd141

Please sign in to comment.