zotregistry.io/zot@v1.4.4-0.20231124084042-02a8ed785457/pkg/meta/dynamodb/dynamodb_internal_test.go (about)

     1  package dynamodb
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/aws/aws-sdk-go-v2/aws"
     9  	"github.com/aws/aws-sdk-go-v2/config"
    10  	"github.com/aws/aws-sdk-go-v2/service/dynamodb"
    11  	guuid "github.com/gofrs/uuid"
    12  	"github.com/rs/zerolog"
    13  	. "github.com/smartystreets/goconvey/convey"
    14  
    15  	"zotregistry.io/zot/pkg/log" //nolint:go-staticcheck
    16  	"zotregistry.io/zot/pkg/meta/version"
    17  	tskip "zotregistry.io/zot/pkg/test/skip"
    18  )
    19  
    20  func TestWrapperErrors(t *testing.T) {
    21  	tskip.SkipDynamo(t)
    22  
    23  	const region = "us-east-2"
    24  	endpoint := os.Getenv("DYNAMODBMOCK_ENDPOINT")
    25  
    26  	uuid, err := guuid.NewV4()
    27  	if err != nil {
    28  		panic(err)
    29  	}
    30  
    31  	repoMetaTablename := "RepoMetadataTable" + uuid.String()
    32  	userDataTablename := "UserDataTable" + uuid.String()
    33  	apiKeyTablename := "ApiKeyTable" + uuid.String()
    34  
    35  	versionTablename := "Version" + uuid.String()
    36  
    37  	Convey("Create table errors", t, func() {
    38  		badEndpoint := endpoint + "1"
    39  
    40  		customResolver := aws.EndpointResolverWithOptionsFunc(
    41  			func(service, region string, options ...interface{}) (aws.Endpoint, error) {
    42  				return aws.Endpoint{
    43  					PartitionID:   "aws",
    44  					URL:           badEndpoint,
    45  					SigningRegion: region,
    46  				}, nil
    47  			},
    48  		)
    49  
    50  		cfg, err := config.LoadDefaultConfig(context.Background(), config.WithRegion(region),
    51  			config.WithEndpointResolverWithOptions(customResolver))
    52  		So(err, ShouldBeNil)
    53  
    54  		dynamoWrapper := DynamoDB{
    55  			Client:            dynamodb.NewFromConfig(cfg),
    56  			RepoMetaTablename: repoMetaTablename,
    57  			VersionTablename:  versionTablename,
    58  			UserDataTablename: userDataTablename,
    59  			APIKeyTablename:   apiKeyTablename,
    60  			Patches:           version.GetDynamoDBPatches(),
    61  			Log:               log.Logger{Logger: zerolog.New(os.Stdout)},
    62  		}
    63  
    64  		// The table creation should fail as the endpoint is not configured correctly
    65  		err = dynamoWrapper.createTable(dynamoWrapper.RepoMetaTablename)
    66  		So(err, ShouldNotBeNil)
    67  
    68  		err = dynamoWrapper.createVersionTable()
    69  		So(err, ShouldNotBeNil)
    70  
    71  		err = dynamoWrapper.createTable(dynamoWrapper.APIKeyTablename)
    72  		So(err, ShouldNotBeNil)
    73  	})
    74  
    75  	Convey("Delete table errors", t, func() {
    76  		customResolver := aws.EndpointResolverWithOptionsFunc(
    77  			func(service, region string, options ...interface{}) (aws.Endpoint, error) {
    78  				return aws.Endpoint{
    79  					PartitionID:   "aws",
    80  					URL:           endpoint,
    81  					SigningRegion: region,
    82  				}, nil
    83  			},
    84  		)
    85  
    86  		cfg, err := config.LoadDefaultConfig(context.Background(), config.WithRegion(region),
    87  			config.WithEndpointResolverWithOptions(customResolver))
    88  		So(err, ShouldBeNil)
    89  
    90  		dynamoWrapper := DynamoDB{
    91  			Client:            dynamodb.NewFromConfig(cfg),
    92  			RepoMetaTablename: repoMetaTablename,
    93  			VersionTablename:  versionTablename,
    94  			UserDataTablename: userDataTablename,
    95  			Patches:           version.GetDynamoDBPatches(),
    96  			Log:               log.Logger{Logger: zerolog.New(os.Stdout)},
    97  		}
    98  
    99  		// The tables were not created so delete calls fail, but dynamoWrapper should not error
   100  		err = dynamoWrapper.deleteTable(dynamoWrapper.RepoMetaTablename)
   101  		So(err, ShouldBeNil)
   102  	})
   103  }