driftctl/pkg/remote/aws/repository/sqs_repository.go

73 lines
1.6 KiB
Go

package repository
import (
"fmt"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/sqs"
"github.com/aws/aws-sdk-go/service/sqs/sqsiface"
"github.com/cloudskiff/driftctl/pkg/remote/cache"
)
type SQSRepository interface {
ListAllQueues() ([]*string, error)
GetQueueAttributes(url string) (*sqs.GetQueueAttributesOutput, error)
}
type sqsRepository struct {
client sqsiface.SQSAPI
cache cache.Cache
}
func NewSQSRepository(session *session.Session, c cache.Cache) *sqsRepository {
return &sqsRepository{
sqs.New(session),
c,
}
}
func (r *sqsRepository) GetQueueAttributes(url string) (*sqs.GetQueueAttributesOutput, error) {
cacheKey := fmt.Sprintf("sqsGetQueueAttributes_%s", url)
if v := r.cache.Get(cacheKey); v != nil {
return v.(*sqs.GetQueueAttributesOutput), nil
}
attributes, err := r.client.GetQueueAttributes(&sqs.GetQueueAttributesInput{
AttributeNames: aws.StringSlice([]string{sqs.QueueAttributeNamePolicy}),
QueueUrl: &url,
})
if err != nil {
return nil, err
}
r.cache.Put(cacheKey, attributes)
return attributes, nil
}
func (r *sqsRepository) ListAllQueues() ([]*string, error) {
cacheKey := "sqsListAllQueues"
v := r.cache.GetAndLock(cacheKey)
defer r.cache.Unlock(cacheKey)
if v != nil {
return v.([]*string), nil
}
var queues []*string
input := sqs.ListQueuesInput{}
err := r.client.ListQueuesPages(&input,
func(resp *sqs.ListQueuesOutput, lastPage bool) bool {
queues = append(queues, resp.QueueUrls...)
return !lastPage
},
)
if err != nil {
return nil, err
}
r.cache.Put(cacheKey, queues)
return queues, nil
}