From 4b7a1d4263bfd17fb4208fe592637a30e66d8589 Mon Sep 17 00:00:00 2001 From: Travis Harmon Date: Fri, 8 Apr 2022 12:12:21 -0500 Subject: [PATCH] Add STS and SSM services --- serviceprovider.go | 52 ++++++++++++++++ serviceprovider_test.go | 128 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 180 insertions(+) diff --git a/serviceprovider.go b/serviceprovider.go index 4891efe..ad997df 100644 --- a/serviceprovider.go +++ b/serviceprovider.go @@ -9,6 +9,10 @@ import ( "github.com/aws/aws-sdk-go/service/s3/s3iface" "github.com/aws/aws-sdk-go/service/ses" "github.com/aws/aws-sdk-go/service/ses/sesiface" + "github.com/aws/aws-sdk-go/service/ssm" + "github.com/aws/aws-sdk-go/service/ssm/ssmiface" + "github.com/aws/aws-sdk-go/service/sts" + "github.com/aws/aws-sdk-go/service/sts/stsiface" ) type awsServiceProvider struct { @@ -17,6 +21,8 @@ type awsServiceProvider struct { dynamodb *dynamodb.DynamoDB ses *ses.SES s3 *s3.S3 + sts *sts.STS + ssm *ssm.SSM } type AWSServiceProviderConfig struct { @@ -24,12 +30,16 @@ type AWSServiceProviderConfig struct { DynamoDB *aws.Config SES *aws.Config S3 *aws.Config + STS *aws.Config + SSM *aws.Config } type AWSServiceProvider interface { DynamoDB() dynamodbiface.DynamoDBAPI SES() sesiface.SESAPI S3() s3iface.S3API + STS() stsiface.STSAPI + SSM() ssmiface.SSMAPI } func (sp *awsServiceProvider) loadSession() { @@ -91,6 +101,38 @@ func (sp *awsServiceProvider) loadS3() { sp.s3 = s3.New(sp.session) } +func (sp *awsServiceProvider) loadSSM() { + if sp.ssm != nil { + return + } + sp.loadSession() + if sp.config.SSM != nil { + sp.ssm = ssm.New(sp.session, sp.config.SSM) + return + } + if sp.config.Default != nil { + sp.ssm = ssm.New(sp.session, sp.config.Default) + return + } + sp.ssm = ssm.New(sp.session) +} + +func (sp *awsServiceProvider) loadSTS() { + if sp.sts != nil { + return + } + sp.loadSession() + if sp.config.STS != nil { + sp.sts = sts.New(sp.session, sp.config.STS) + return + } + if sp.config.Default != nil { + sp.sts = sts.New(sp.session, sp.config.Default) + return + } + sp.sts = sts.New(sp.session) +} + func (sp *awsServiceProvider) DynamoDB() dynamodbiface.DynamoDBAPI { sp.loadDynamoDB() return sp.dynamodb @@ -105,3 +147,13 @@ func (sp *awsServiceProvider) S3() s3iface.S3API { sp.loadS3() return sp.s3 } + +func (sp *awsServiceProvider) STS() stsiface.STSAPI { + sp.loadSTS() + return sp.sts +} + +func (sp *awsServiceProvider) SSM() ssmiface.SSMAPI { + sp.loadSSM() + return sp.ssm +} diff --git a/serviceprovider_test.go b/serviceprovider_test.go index ad8aa92..979de9a 100644 --- a/serviceprovider_test.go +++ b/serviceprovider_test.go @@ -7,6 +7,8 @@ import ( "github.com/aws/aws-sdk-go/service/dynamodb" "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/ses" + "github.com/aws/aws-sdk-go/service/ssm" + "github.com/aws/aws-sdk-go/service/sts" ) func TestServiceProviderDBWithConfig(t *testing.T) { @@ -208,3 +210,129 @@ func TestServiceProviderSessionCached(t *testing.T) { t.Fatalf("expected not nil") } } + +func TestServiceProviderSSMWithConfig(t *testing.T) { + sp := &awsServiceProvider{ + config: &AWSServiceProviderConfig{ + SSM: &aws.Config{ + Region: aws.String("bar"), + }, + }, + } + svc := sp.SSM() + ssm, ok := svc.(*ssm.SSM) + if !ok { + t.Fatalf("expected ok") + } + if ssm == nil { + t.Fatalf("expected not nil") + } +} + +func TestServiceProviderSSMDefaultSPConfig(t *testing.T) { + sp := &awsServiceProvider{config: &AWSServiceProviderConfig{ + Default: &aws.Config{ + Region: aws.String("bar"), + }, + }} + svc := sp.SSM() + ssm, ok := svc.(*ssm.SSM) + if !ok { + t.Fatalf("expected ok") + } + if ssm == nil { + t.Fatalf("expected not nil") + } +} + +func TestServiceProviderSSMNoSPConfig(t *testing.T) { + c := &handlerContext{ + sp: &awsServiceProvider{config: &AWSServiceProviderConfig{}}, + } + svc := c.AWS().SSM() + ssm, ok := svc.(*ssm.SSM) + if !ok { + t.Fatalf("expected ok") + } + if ssm == nil { + t.Fatalf("expected not nil") + } +} + +func TestServiceProviderSSMCached(t *testing.T) { + c := &handlerContext{ + sp: &awsServiceProvider{config: &AWSServiceProviderConfig{}}, + } + svc := c.AWS().SSM() + svc = c.AWS().SSM() + ssm, ok := svc.(*ssm.SSM) + if !ok { + t.Fatalf("expected ok") + } + if ssm == nil { + t.Fatalf("expected not nil") + } +} + +func TestServiceProviderSTSWithConfig(t *testing.T) { + sp := &awsServiceProvider{ + config: &AWSServiceProviderConfig{ + STS: &aws.Config{ + Region: aws.String("bar"), + }, + }, + } + svc := sp.STS() + sts, ok := svc.(*sts.STS) + if !ok { + t.Fatalf("expected ok") + } + if sts == nil { + t.Fatalf("expected not nil") + } +} + +func TestServiceProviderSTSDefaultSPConfig(t *testing.T) { + sp := &awsServiceProvider{config: &AWSServiceProviderConfig{ + Default: &aws.Config{ + Region: aws.String("bar"), + }, + }} + svc := sp.STS() + sts, ok := svc.(*sts.STS) + if !ok { + t.Fatalf("expected ok") + } + if sts == nil { + t.Fatalf("expected not nil") + } +} + +func TestServiceProviderSTSNoSPConfig(t *testing.T) { + c := &handlerContext{ + sp: &awsServiceProvider{config: &AWSServiceProviderConfig{}}, + } + svc := c.AWS().STS() + sts, ok := svc.(*sts.STS) + if !ok { + t.Fatalf("expected ok") + } + if sts == nil { + t.Fatalf("expected not nil") + } +} + +func TestServiceProviderSTSCached(t *testing.T) { + c := &handlerContext{ + sp: &awsServiceProvider{config: &AWSServiceProviderConfig{}}, + } + svc := c.AWS().STS() + svc = c.AWS().STS() + sts, ok := svc.(*sts.STS) + if !ok { + t.Fatalf("expected ok") + } + if sts == nil { + t.Fatalf("expected not nil") + } +}