mirror of
https://github.com/nabbar/golib.git
synced 2025-10-06 00:06:50 +08:00
Bump to sdk aws go v2 at release v0.26.0...
Bump dependancies Refactor / Fix aws to work with sdk-aws-go-v2 at release v0.26.0...
This commit is contained in:
@@ -41,6 +41,7 @@ const (
|
|||||||
ErrorS3AWSNewVers
|
ErrorS3AWSNewVers
|
||||||
ErrorS3AWSNotFound
|
ErrorS3AWSNotFound
|
||||||
ErrorS3AWSDownloadError
|
ErrorS3AWSDownloadError
|
||||||
|
ErrorS3AWSIOReaderError
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -85,6 +86,8 @@ func getMessage(code errors.CodeError) (message string) {
|
|||||||
return "requested version is not found"
|
return "requested version is not found"
|
||||||
case ErrorS3AWSDownloadError:
|
case ErrorS3AWSDownloadError:
|
||||||
return "download object requested occurs error"
|
return "download object requested occurs error"
|
||||||
|
case ErrorS3AWSIOReaderError:
|
||||||
|
return "return io reader is empty"
|
||||||
}
|
}
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
|
@@ -32,6 +32,8 @@ import (
|
|||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go-v2/service/s3"
|
||||||
|
|
||||||
"github.com/hashicorp/go-version"
|
"github.com/hashicorp/go-version"
|
||||||
"github.com/nabbar/golib/artifact"
|
"github.com/nabbar/golib/artifact"
|
||||||
"github.com/nabbar/golib/artifact/client"
|
"github.com/nabbar/golib/artifact/client"
|
||||||
@@ -196,23 +198,15 @@ func (s *s3awsModel) Download(dst ioutils.FileProgress, containName string, rege
|
|||||||
|
|
||||||
func (s *s3awsModel) downloadObject(dst ioutils.FileProgress, object string) errors.Error {
|
func (s *s3awsModel) downloadObject(dst ioutils.FileProgress, object string) errors.Error {
|
||||||
var (
|
var (
|
||||||
r io.ReadCloser
|
r *s3.GetObjectOutput
|
||||||
c []io.Closer
|
|
||||||
e errors.Error
|
e errors.Error
|
||||||
i os.FileInfo
|
i os.FileInfo
|
||||||
j int64
|
j int64
|
||||||
)
|
)
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if len(c) > 0 {
|
if r != nil && r.Body != nil {
|
||||||
for _, b := range c {
|
_ = r.Body.Close()
|
||||||
if b != nil {
|
|
||||||
_ = b.Close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if r != nil {
|
|
||||||
_ = r.Close()
|
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@@ -226,11 +220,13 @@ func (s *s3awsModel) downloadObject(dst ioutils.FileProgress, object string) err
|
|||||||
|
|
||||||
dst.ResetMax(j)
|
dst.ResetMax(j)
|
||||||
|
|
||||||
if r, c, e = s.c.Object().Get(object); e != nil {
|
if r, e = s.c.Object().Get(object); e != nil {
|
||||||
err := ErrorS3AWSDownloadError.ErrorParent(getError(errObject, object))
|
err := ErrorS3AWSDownloadError.ErrorParent(getError(errObject, object))
|
||||||
err.AddParentError(e)
|
err.AddParentError(e)
|
||||||
return err
|
return err
|
||||||
} else if _, err := io.Copy(dst, r); err != nil {
|
} else if r.Body == nil {
|
||||||
|
return ErrorS3AWSIOReaderError.ErrorParent(getError(errObject, object))
|
||||||
|
} else if _, err := io.Copy(dst, r.Body); err != nil {
|
||||||
return ErrorS3AWSDownloadError.ErrorParent(getError(errObject, object), err)
|
return ErrorS3AWSDownloadError.ErrorParent(getError(errObject, object), err)
|
||||||
} else if i, e = dst.FileStat(); e != nil {
|
} else if i, e = dst.FileStat(); e != nil {
|
||||||
err := ErrorS3AWSDownloadError.ErrorParent(getError(errObject, object))
|
err := ErrorS3AWSDownloadError.ErrorParent(getError(errObject, object))
|
||||||
|
@@ -1,11 +1,14 @@
|
|||||||
package aws_test
|
package aws_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"crypto/rand"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net"
|
"net"
|
||||||
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
@@ -15,6 +18,8 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/nabbar/golib/httpcli"
|
||||||
|
|
||||||
"github.com/hashicorp/go-uuid"
|
"github.com/hashicorp/go-uuid"
|
||||||
"github.com/nabbar/golib/aws"
|
"github.com/nabbar/golib/aws"
|
||||||
"github.com/nabbar/golib/aws/configCustom"
|
"github.com/nabbar/golib/aws/configCustom"
|
||||||
@@ -46,6 +51,7 @@ var _ = BeforeSuite(func() {
|
|||||||
var (
|
var (
|
||||||
err error
|
err error
|
||||||
name string
|
name string
|
||||||
|
htp *http.Client
|
||||||
)
|
)
|
||||||
|
|
||||||
ctx, cnl = context.WithCancel(context.Background())
|
ctx, cnl = context.WithCancel(context.Background())
|
||||||
@@ -61,7 +67,11 @@ var _ = BeforeSuite(func() {
|
|||||||
secretKey = password.Generate(64)
|
secretKey = password.Generate(64)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
htp = httpcli.GetClient(uri.Hostname())
|
||||||
|
Expect(htp).NotTo(BeNil())
|
||||||
|
|
||||||
cfg = configCustom.NewConfig("", accessKey, secretKey, uri, "us-east-1")
|
cfg = configCustom.NewConfig("", accessKey, secretKey, uri, "us-east-1")
|
||||||
|
Expect(cfg).NotTo(BeNil())
|
||||||
|
|
||||||
cfg.SetRegion("us-east-1")
|
cfg.SetRegion("us-east-1")
|
||||||
err = cfg.RegisterRegionAws(nil)
|
err = cfg.RegisterRegionAws(nil)
|
||||||
@@ -75,10 +85,11 @@ var _ = BeforeSuite(func() {
|
|||||||
time.Sleep(10 * time.Second)
|
time.Sleep(10 * time.Second)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
time.Sleep(10 * time.Second)
|
||||||
println("Minio is waiting on : " + uri.Host)
|
println("Minio is waiting on : " + uri.Host)
|
||||||
}
|
}
|
||||||
|
|
||||||
cli, err = aws.New(ctx, cfg, nil)
|
cli, err = aws.New(ctx, cfg, htp)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(cli).NotTo(BeNil())
|
Expect(cli).NotTo(BeNil())
|
||||||
|
|
||||||
@@ -201,3 +212,15 @@ func WaitMinio(host string) bool {
|
|||||||
|
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func randContent(size int) *bytes.Buffer {
|
||||||
|
p := make([]byte, size)
|
||||||
|
|
||||||
|
_, err := rand.Read(p)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return bytes.NewBuffer(p)
|
||||||
|
}
|
||||||
|
@@ -3,146 +3,119 @@ package bucket
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
sdkaws "github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
sdksss "github.com/aws/aws-sdk-go-v2/service/s3"
|
||||||
"github.com/nabbar/golib/aws/helper"
|
sdkstp "github.com/aws/aws-sdk-go-v2/service/s3/types"
|
||||||
"github.com/nabbar/golib/errors"
|
libhlp "github.com/nabbar/golib/aws/helper"
|
||||||
|
liberr "github.com/nabbar/golib/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (cli *client) Check() errors.Error {
|
func (cli *client) Check() liberr.Error {
|
||||||
req := cli.s3.HeadBucketRequest(&s3.HeadBucketInput{
|
out, err := cli.s3.HeadBucket(cli.GetContext(), &sdksss.HeadBucketInput{
|
||||||
Bucket: cli.GetBucketAws(),
|
Bucket: cli.GetBucketAws(),
|
||||||
})
|
})
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
} else if out == nil {
|
||||||
|
|
||||||
if out == nil || out.HeadBucketOutput == nil {
|
|
||||||
//nolint #goerr113
|
//nolint #goerr113
|
||||||
return helper.ErrorBucketNotFound.ErrorParent(fmt.Errorf("bucket: %s", cli.GetBucketName()))
|
return libhlp.ErrorBucketNotFound.ErrorParent(fmt.Errorf("bucket: %s", cli.GetBucketName()))
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Create() errors.Error {
|
func (cli *client) Create() liberr.Error {
|
||||||
req := cli.s3.CreateBucketRequest(&s3.CreateBucketInput{
|
out, err := cli.s3.CreateBucket(cli.GetContext(), &sdksss.CreateBucketInput{
|
||||||
Bucket: cli.GetBucketAws(),
|
Bucket: cli.GetBucketAws(),
|
||||||
})
|
})
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cli *client) Delete() errors.Error {
|
|
||||||
req := cli.s3.DeleteBucketRequest(&s3.DeleteBucketInput{
|
|
||||||
Bucket: cli.GetBucketAws(),
|
|
||||||
})
|
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cli *client) List() ([]s3.Bucket, errors.Error) {
|
|
||||||
req := cli.s3.ListBucketsRequest(nil)
|
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return make([]s3.Bucket, 0), cli.GetError(err)
|
return cli.GetError(err)
|
||||||
|
} else if out == nil || len(*out.Location) == 0 {
|
||||||
|
return libhlp.ErrorResponse.Error(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
if out == nil || out.Buckets == nil {
|
return cli.GetError(err)
|
||||||
return make([]s3.Bucket, 0), helper.ErrorAwsEmpty.Error(nil)
|
}
|
||||||
|
|
||||||
|
func (cli *client) Delete() liberr.Error {
|
||||||
|
_, err := cli.s3.DeleteBucket(cli.GetContext(), &sdksss.DeleteBucketInput{
|
||||||
|
Bucket: cli.GetBucketAws(),
|
||||||
|
})
|
||||||
|
|
||||||
|
return cli.GetError(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cli *client) List() ([]*sdkstp.Bucket, liberr.Error) {
|
||||||
|
out, err := cli.s3.ListBuckets(cli.GetContext(), nil)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return make([]*sdkstp.Bucket, 0), cli.GetError(err)
|
||||||
|
} else if out == nil || out.Buckets == nil {
|
||||||
|
return make([]*sdkstp.Bucket, 0), libhlp.ErrorAwsEmpty.Error(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
return out.Buckets, nil
|
return out.Buckets, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) SetVersioning(state bool) errors.Error {
|
func (cli *client) SetVersioning(state bool) liberr.Error {
|
||||||
var status s3.BucketVersioningStatus = helper.STATE_ENABLED
|
var status sdkstp.BucketVersioningStatus = libhlp.STATE_ENABLED
|
||||||
if !state {
|
if !state {
|
||||||
status = helper.STATE_SUSPENDED
|
status = libhlp.STATE_SUSPENDED
|
||||||
}
|
}
|
||||||
|
|
||||||
vConf := s3.VersioningConfiguration{
|
_, err := cli.s3.PutBucketVersioning(cli.GetContext(), &sdksss.PutBucketVersioningInput{
|
||||||
Status: status,
|
|
||||||
}
|
|
||||||
input := s3.PutBucketVersioningInput{
|
|
||||||
Bucket: cli.GetBucketAws(),
|
Bucket: cli.GetBucketAws(),
|
||||||
VersioningConfiguration: &vConf,
|
VersioningConfiguration: &sdkstp.VersioningConfiguration{
|
||||||
}
|
Status: status,
|
||||||
|
},
|
||||||
req := cli.s3.PutBucketVersioningRequest(&input)
|
})
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) GetVersioning() (string, errors.Error) {
|
func (cli *client) GetVersioning() (string, liberr.Error) {
|
||||||
input := s3.GetBucketVersioningInput{
|
out, err := cli.s3.GetBucketVersioning(cli.GetContext(), &sdksss.GetBucketVersioningInput{
|
||||||
Bucket: cli.GetBucketAws(),
|
Bucket: cli.GetBucketAws(),
|
||||||
}
|
})
|
||||||
|
|
||||||
req := cli.s3.GetBucketVersioningRequest(&input)
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", cli.GetError(err)
|
return "", cli.GetError(err)
|
||||||
|
} else if out == nil {
|
||||||
|
return "", libhlp.ErrorResponse.Error(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalValue always return error as nil
|
// MarshalValue always return error as nil
|
||||||
v, _ := out.Status.MarshalValue()
|
return string(out.Status), nil
|
||||||
|
|
||||||
return v, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) EnableReplication(srcRoleARN, dstRoleARN, dstBucketName string) errors.Error {
|
func (cli *client) EnableReplication(srcRoleARN, dstRoleARN, dstBucketName string) liberr.Error {
|
||||||
var status s3.ReplicationRuleStatus = helper.STATE_ENABLED
|
var status sdkstp.ReplicationRuleStatus = libhlp.STATE_ENABLED
|
||||||
|
|
||||||
replicationConf := s3.ReplicationConfiguration{
|
_, err := cli.s3.PutBucketReplication(cli.GetContext(), &sdksss.PutBucketReplicationInput{
|
||||||
Role: aws.String(srcRoleARN + "," + dstRoleARN),
|
Bucket: cli.GetBucketAws(),
|
||||||
Rules: []s3.ReplicationRule{
|
ReplicationConfiguration: &sdkstp.ReplicationConfiguration{
|
||||||
|
Role: sdkaws.String(srcRoleARN + "," + dstRoleARN),
|
||||||
|
Rules: []*sdkstp.ReplicationRule{
|
||||||
{
|
{
|
||||||
Destination: &s3.Destination{
|
Destination: &sdkstp.Destination{
|
||||||
Bucket: aws.String("arn:aws:s3:::" + dstBucketName),
|
Bucket: sdkaws.String("arn:aws:s3:::" + dstBucketName),
|
||||||
},
|
},
|
||||||
Status: status,
|
Status: status,
|
||||||
Prefix: aws.String(""),
|
Prefix: sdkaws.String(""),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
|
||||||
|
|
||||||
req := cli.s3.PutBucketReplicationRequest(&s3.PutBucketReplicationInput{
|
|
||||||
Bucket: cli.GetBucketAws(),
|
|
||||||
ReplicationConfiguration: &replicationConf,
|
|
||||||
})
|
})
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) DeleteReplication() errors.Error {
|
func (cli *client) DeleteReplication() liberr.Error {
|
||||||
req := cli.s3.DeleteBucketReplicationRequest(&s3.DeleteBucketReplicationInput{
|
_, err := cli.s3.DeleteBucketReplication(cli.GetContext(), &sdksss.DeleteBucketReplicationInput{
|
||||||
Bucket: cli.GetBucketAws(),
|
Bucket: cli.GetBucketAws(),
|
||||||
})
|
})
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
@@ -3,37 +3,38 @@ package bucket
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/service/iam"
|
sdkiam "github.com/aws/aws-sdk-go-v2/service/iam"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
sdksss "github.com/aws/aws-sdk-go-v2/service/s3"
|
||||||
"github.com/nabbar/golib/aws/helper"
|
sdkstp "github.com/aws/aws-sdk-go-v2/service/s3/types"
|
||||||
"github.com/nabbar/golib/errors"
|
libhlp "github.com/nabbar/golib/aws/helper"
|
||||||
|
ligerr "github.com/nabbar/golib/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
type client struct {
|
type client struct {
|
||||||
helper.Helper
|
libhlp.Helper
|
||||||
iam *iam.Client
|
iam *sdkiam.Client
|
||||||
s3 *s3.Client
|
s3 *sdksss.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
type Bucket interface {
|
type Bucket interface {
|
||||||
Check() errors.Error
|
Check() ligerr.Error
|
||||||
|
|
||||||
List() ([]s3.Bucket, errors.Error)
|
List() ([]*sdkstp.Bucket, ligerr.Error)
|
||||||
Create() errors.Error
|
Create() ligerr.Error
|
||||||
Delete() errors.Error
|
Delete() ligerr.Error
|
||||||
|
|
||||||
//FindObject(pattern string) ([]string, errors.Error)
|
//FindObject(pattern string) ([]string, errors.Error)
|
||||||
|
|
||||||
SetVersioning(state bool) errors.Error
|
SetVersioning(state bool) ligerr.Error
|
||||||
GetVersioning() (string, errors.Error)
|
GetVersioning() (string, ligerr.Error)
|
||||||
|
|
||||||
EnableReplication(srcRoleARN, dstRoleARN, dstBucketName string) errors.Error
|
EnableReplication(srcRoleARN, dstRoleARN, dstBucketName string) ligerr.Error
|
||||||
DeleteReplication() errors.Error
|
DeleteReplication() ligerr.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(ctx context.Context, bucket string, iam *iam.Client, s3 *s3.Client) Bucket {
|
func New(ctx context.Context, bucket string, iam *sdkiam.Client, s3 *sdksss.Client) Bucket {
|
||||||
return &client{
|
return &client{
|
||||||
Helper: helper.New(ctx, bucket),
|
Helper: libhlp.New(ctx, bucket),
|
||||||
iam: iam,
|
iam: iam,
|
||||||
s3: s3,
|
s3: s3,
|
||||||
}
|
}
|
||||||
|
@@ -1,8 +1,6 @@
|
|||||||
package aws_test
|
package aws_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
|
|
||||||
. "github.com/onsi/ginkgo"
|
. "github.com/onsi/ginkgo"
|
||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
)
|
)
|
||||||
@@ -27,9 +25,12 @@ var _ = Describe("Bucket", func() {
|
|||||||
})
|
})
|
||||||
Context("With the object", func() {
|
Context("With the object", func() {
|
||||||
It("Must succeed", func() {
|
It("Must succeed", func() {
|
||||||
var err error
|
var (
|
||||||
|
err error
|
||||||
|
rnd = randContent(64 * 1024)
|
||||||
|
)
|
||||||
|
|
||||||
err = cli.Object().MultipartPut("object", bytes.NewReader([]byte("Hello")))
|
err = cli.Object().MultipartPut("object", rnd)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
objects, err := cli.Object().Find("object")
|
objects, err := cli.Object().Find("object")
|
||||||
@@ -50,7 +51,7 @@ var _ = Describe("Bucket", func() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Not Implemented whit minio
|
* Not Implemented with minio
|
||||||
*
|
*
|
||||||
Context("Versioning", func() {
|
Context("Versioning", func() {
|
||||||
It("Must be possible to enable versioning", func() {
|
It("Must be possible to enable versioning", func() {
|
||||||
|
@@ -5,7 +5,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
ErrorAwsError errors.CodeError = iota + errors.MIN_PKG_Aws + 30
|
ErrorAwsError errors.CodeError = iota + errors.MIN_PKG_Aws + 40
|
||||||
ErrorConfigLoader
|
ErrorConfigLoader
|
||||||
ErrorConfigValidator
|
ErrorConfigValidator
|
||||||
ErrorConfigJsonUnmarshall
|
ErrorConfigJsonUnmarshall
|
||||||
|
@@ -4,10 +4,10 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
sdkaws "github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/aws/aws-sdk-go-v2/aws/defaults"
|
sdkcfg "github.com/aws/aws-sdk-go-v2/config"
|
||||||
"github.com/aws/aws-sdk-go-v2/aws/external"
|
sdkcrd "github.com/aws/aws-sdk-go-v2/credentials"
|
||||||
aws2 "github.com/nabbar/golib/aws"
|
libaws "github.com/nabbar/golib/aws"
|
||||||
"github.com/nabbar/golib/errors"
|
"github.com/nabbar/golib/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@ func GetConfigModel() interface{} {
|
|||||||
return configModel{}
|
return configModel{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewConfigJsonUnmashal(p []byte) (aws2.Config, errors.Error) {
|
func NewConfigJsonUnmashal(p []byte) (libaws.Config, errors.Error) {
|
||||||
c := configModel{}
|
c := configModel{}
|
||||||
if err := json.Unmarshal(p, &c); err != nil {
|
if err := json.Unmarshal(p, &c); err != nil {
|
||||||
return nil, ErrorConfigJsonUnmarshall.ErrorParent(err)
|
return nil, ErrorConfigJsonUnmarshall.ErrorParent(err)
|
||||||
@@ -23,13 +23,11 @@ func NewConfigJsonUnmashal(p []byte) (aws2.Config, errors.Error) {
|
|||||||
|
|
||||||
return &awsModel{
|
return &awsModel{
|
||||||
configModel: c,
|
configModel: c,
|
||||||
logLevel: 0,
|
|
||||||
awsLevel: 0,
|
|
||||||
retryer: nil,
|
retryer: nil,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewConfig(bucket, accessKey, secretKey, region string) aws2.Config {
|
func NewConfig(bucket, accessKey, secretKey, region string) libaws.Config {
|
||||||
return &awsModel{
|
return &awsModel{
|
||||||
configModel: configModel{
|
configModel: configModel{
|
||||||
Region: region,
|
Region: region,
|
||||||
@@ -37,13 +35,11 @@ func NewConfig(bucket, accessKey, secretKey, region string) aws2.Config {
|
|||||||
SecretKey: secretKey,
|
SecretKey: secretKey,
|
||||||
Bucket: bucket,
|
Bucket: bucket,
|
||||||
},
|
},
|
||||||
logLevel: 0,
|
|
||||||
awsLevel: 0,
|
|
||||||
retryer: nil,
|
retryer: nil,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *awsModel) Clone() aws2.Config {
|
func (c *awsModel) Clone() libaws.Config {
|
||||||
return &awsModel{
|
return &awsModel{
|
||||||
configModel: configModel{
|
configModel: configModel{
|
||||||
Region: c.Region,
|
Region: c.Region,
|
||||||
@@ -51,36 +47,32 @@ func (c *awsModel) Clone() aws2.Config {
|
|||||||
SecretKey: c.SecretKey,
|
SecretKey: c.SecretKey,
|
||||||
Bucket: c.Bucket,
|
Bucket: c.Bucket,
|
||||||
},
|
},
|
||||||
logLevel: c.logLevel,
|
|
||||||
awsLevel: c.awsLevel,
|
|
||||||
retryer: c.retryer,
|
retryer: c.retryer,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *awsModel) GetConfig(cli *http.Client) (aws.Config, errors.Error) {
|
func (c *awsModel) GetConfig(cli *http.Client) (*sdkaws.Config, errors.Error) {
|
||||||
var (
|
var (
|
||||||
cfg aws.Config
|
cfg sdkaws.Config
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
|
|
||||||
if c.AccessKey != "" && c.SecretKey != "" {
|
if cfg, err = sdkcfg.LoadDefaultConfig(); err != nil {
|
||||||
cfg = defaults.Config()
|
return nil, ErrorConfigLoader.ErrorParent(err)
|
||||||
cfg.Credentials = aws.NewStaticCredentialsProvider(c.AccessKey, c.SecretKey, "")
|
}
|
||||||
} else if cfg, err = external.LoadDefaultAWSConfig(); err != nil {
|
|
||||||
return cfg, ErrorConfigLoader.ErrorParent(err)
|
if c.AccessKey != "" && c.SecretKey != "" {
|
||||||
|
cfg.Credentials = sdkcrd.NewStaticCredentialsProvider(c.AccessKey, c.SecretKey, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg.Logger = &awsLogger{c.logLevel}
|
|
||||||
cfg.LogLevel = c.awsLevel
|
|
||||||
cfg.Retryer = c.retryer
|
cfg.Retryer = c.retryer
|
||||||
cfg.EnableEndpointDiscovery = true
|
|
||||||
cfg.Region = c.Region
|
cfg.Region = c.Region
|
||||||
|
|
||||||
if cli != nil {
|
if cli != nil {
|
||||||
cfg.HTTPClient = cli
|
cfg.HTTPClient = cli
|
||||||
}
|
}
|
||||||
|
|
||||||
return cfg, nil
|
return &cfg, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *awsModel) GetBucketName() string {
|
func (c *awsModel) GetBucketName() string {
|
||||||
|
@@ -1,55 +0,0 @@
|
|||||||
package configAws
|
|
||||||
|
|
||||||
import (
|
|
||||||
"reflect"
|
|
||||||
|
|
||||||
"github.com/nabbar/golib/logger"
|
|
||||||
)
|
|
||||||
|
|
||||||
type awsLogger struct {
|
|
||||||
logLevel logger.Level
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l awsLogger) Log(args ...interface{}) {
|
|
||||||
pattern := ""
|
|
||||||
|
|
||||||
for i := 0; i < len(args); i++ {
|
|
||||||
//nolint #exhaustive
|
|
||||||
switch reflect.TypeOf(args[i]).Kind() {
|
|
||||||
case reflect.String:
|
|
||||||
pattern += "%s"
|
|
||||||
default:
|
|
||||||
pattern += "%v"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
l.logLevel.Logf("AWS Log : "+pattern, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func LevelPanic() logger.Level {
|
|
||||||
return logger.PanicLevel
|
|
||||||
}
|
|
||||||
|
|
||||||
func LevelFatal() logger.Level {
|
|
||||||
return logger.FatalLevel
|
|
||||||
}
|
|
||||||
|
|
||||||
func LevelError() logger.Level {
|
|
||||||
return logger.ErrorLevel
|
|
||||||
}
|
|
||||||
|
|
||||||
func LevelWarn() logger.Level {
|
|
||||||
return logger.WarnLevel
|
|
||||||
}
|
|
||||||
|
|
||||||
func LevelInfo() logger.Level {
|
|
||||||
return logger.InfoLevel
|
|
||||||
}
|
|
||||||
|
|
||||||
func LevelDebug() logger.Level {
|
|
||||||
return logger.DebugLevel
|
|
||||||
}
|
|
||||||
|
|
||||||
func LevelNoLog() logger.Level {
|
|
||||||
return logger.NilLevel
|
|
||||||
}
|
|
@@ -6,11 +6,10 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
sdkaws "github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/go-playground/validator/v10"
|
libval "github.com/go-playground/validator/v10"
|
||||||
"github.com/nabbar/golib/errors"
|
"github.com/nabbar/golib/errors"
|
||||||
"github.com/nabbar/golib/httpcli"
|
"github.com/nabbar/golib/httpcli"
|
||||||
"github.com/nabbar/golib/logger"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type configModel struct {
|
type configModel struct {
|
||||||
@@ -22,23 +21,20 @@ type configModel struct {
|
|||||||
|
|
||||||
type awsModel struct {
|
type awsModel struct {
|
||||||
configModel
|
configModel
|
||||||
|
retryer sdkaws.Retryer
|
||||||
logLevel logger.Level
|
|
||||||
awsLevel aws.LogLevel
|
|
||||||
retryer aws.Retryer
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *awsModel) Validate() errors.Error {
|
func (c *awsModel) Validate() errors.Error {
|
||||||
val := validator.New()
|
val := libval.New()
|
||||||
err := val.Struct(c)
|
err := val.Struct(c)
|
||||||
|
|
||||||
if e, ok := err.(*validator.InvalidValidationError); ok {
|
if e, ok := err.(*libval.InvalidValidationError); ok {
|
||||||
return ErrorConfigValidator.ErrorParent(e)
|
return ErrorConfigValidator.ErrorParent(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
out := ErrorConfigValidator.Error(nil)
|
out := ErrorConfigValidator.Error(nil)
|
||||||
|
|
||||||
for _, e := range err.(validator.ValidationErrors) {
|
for _, e := range err.(libval.ValidationErrors) {
|
||||||
//nolint goerr113
|
//nolint goerr113
|
||||||
out.AddParent(fmt.Errorf("config field '%s' is not validated by constraint '%s'", e.Field(), e.ActualTag()))
|
out.AddParent(fmt.Errorf("config field '%s' is not validated by constraint '%s'", e.Field(), e.ActualTag()))
|
||||||
}
|
}
|
||||||
@@ -76,27 +72,23 @@ func (c awsModel) GetEndpoint() *url.URL {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *awsModel) ResolveEndpoint(service, region string) (aws.Endpoint, error) {
|
func (c *awsModel) ResolveEndpoint(service, region string) (sdkaws.Endpoint, error) {
|
||||||
return aws.Endpoint{}, ErrorEndpointInvalid.Error(nil)
|
return sdkaws.Endpoint{}, ErrorEndpointInvalid.Error(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *awsModel) SetLogLevel(lvl logger.Level) {
|
func (c *awsModel) IsHTTPs() bool {
|
||||||
c.logLevel = lvl
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *awsModel) SetAWSLogLevel(lvl aws.LogLevel) {
|
func (c *awsModel) SetRetryer(retryer sdkaws.Retryer) {
|
||||||
c.awsLevel = lvl
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *awsModel) SetRetryer(retryer aws.Retryer) {
|
|
||||||
c.retryer = retryer
|
c.retryer = retryer
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c awsModel) Check(ctx context.Context) errors.Error {
|
func (c awsModel) Check(ctx context.Context) errors.Error {
|
||||||
var (
|
var (
|
||||||
cfg aws.Config
|
cfg *sdkaws.Config
|
||||||
con net.Conn
|
con net.Conn
|
||||||
end aws.Endpoint
|
end sdkaws.Endpoint
|
||||||
adr *url.URL
|
adr *url.URL
|
||||||
err error
|
err error
|
||||||
e errors.Error
|
e errors.Error
|
||||||
|
@@ -5,7 +5,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
ErrorAwsError errors.CodeError = iota + errors.MIN_PKG_Aws + 30
|
ErrorAwsError errors.CodeError = iota + errors.MIN_PKG_Aws + 20
|
||||||
ErrorConfigValidator
|
ErrorConfigValidator
|
||||||
ErrorConfigJsonUnmarshall
|
ErrorConfigJsonUnmarshall
|
||||||
ErrorEndpointInvalid
|
ErrorEndpointInvalid
|
||||||
|
@@ -6,9 +6,9 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
sdkaws "github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/aws/aws-sdk-go-v2/aws/defaults"
|
sdkcrd "github.com/aws/aws-sdk-go-v2/credentials"
|
||||||
aws2 "github.com/nabbar/golib/aws"
|
libaws "github.com/nabbar/golib/aws"
|
||||||
"github.com/nabbar/golib/errors"
|
"github.com/nabbar/golib/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ func GetConfigModel() interface{} {
|
|||||||
return Model{}
|
return Model{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewConfigJsonUnmashal(p []byte) (aws2.Config, errors.Error) {
|
func NewConfigJsonUnmashal(p []byte) (libaws.Config, errors.Error) {
|
||||||
c := Model{}
|
c := Model{}
|
||||||
if err := json.Unmarshal(p, &c); err != nil {
|
if err := json.Unmarshal(p, &c); err != nil {
|
||||||
return nil, ErrorConfigJsonUnmarshall.ErrorParent(err)
|
return nil, ErrorConfigJsonUnmarshall.ErrorParent(err)
|
||||||
@@ -24,14 +24,12 @@ func NewConfigJsonUnmashal(p []byte) (aws2.Config, errors.Error) {
|
|||||||
|
|
||||||
return &awsModel{
|
return &awsModel{
|
||||||
Model: c,
|
Model: c,
|
||||||
logLevel: 0,
|
|
||||||
awsLevel: 0,
|
|
||||||
retryer: nil,
|
retryer: nil,
|
||||||
mapRegion: nil,
|
mapRegion: nil,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewConfig(bucket, accessKey, secretKey string, endpoint *url.URL, region string) aws2.Config {
|
func NewConfig(bucket, accessKey, secretKey string, endpoint *url.URL, region string) libaws.Config {
|
||||||
return &awsModel{
|
return &awsModel{
|
||||||
Model: Model{
|
Model: Model{
|
||||||
Region: region,
|
Region: region,
|
||||||
@@ -41,14 +39,12 @@ func NewConfig(bucket, accessKey, secretKey string, endpoint *url.URL, region st
|
|||||||
Bucket: bucket,
|
Bucket: bucket,
|
||||||
},
|
},
|
||||||
endpoint: endpoint,
|
endpoint: endpoint,
|
||||||
logLevel: 0,
|
|
||||||
awsLevel: 0,
|
|
||||||
retryer: nil,
|
retryer: nil,
|
||||||
mapRegion: make(map[string]*url.URL),
|
mapRegion: make(map[string]*url.URL),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *awsModel) Clone() aws2.Config {
|
func (c *awsModel) Clone() libaws.Config {
|
||||||
m := make(map[string]*url.URL)
|
m := make(map[string]*url.URL)
|
||||||
|
|
||||||
for r, e := range c.mapRegion {
|
for r, e := range c.mapRegion {
|
||||||
@@ -63,23 +59,19 @@ func (c *awsModel) Clone() aws2.Config {
|
|||||||
SecretKey: c.SecretKey,
|
SecretKey: c.SecretKey,
|
||||||
Bucket: c.Bucket,
|
Bucket: c.Bucket,
|
||||||
},
|
},
|
||||||
logLevel: c.logLevel,
|
|
||||||
awsLevel: c.awsLevel,
|
|
||||||
retryer: c.retryer,
|
retryer: c.retryer,
|
||||||
endpoint: c.endpoint,
|
endpoint: c.endpoint,
|
||||||
mapRegion: m,
|
mapRegion: m,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *awsModel) GetConfig(cli *http.Client) (aws.Config, errors.Error) {
|
func (c *awsModel) GetConfig(cli *http.Client) (*sdkaws.Config, errors.Error) {
|
||||||
cfg := defaults.Config()
|
|
||||||
cfg.Credentials = aws.NewStaticCredentialsProvider(c.AccessKey, c.SecretKey, "")
|
cfg := sdkaws.NewConfig()
|
||||||
cfg.Logger = &awsLogger{c.logLevel}
|
|
||||||
cfg.LogLevel = c.awsLevel
|
cfg.Credentials = sdkcrd.NewStaticCredentialsProvider(c.AccessKey, c.SecretKey, "")
|
||||||
cfg.Retryer = c.retryer
|
cfg.Retryer = c.retryer
|
||||||
cfg.EnableEndpointDiscovery = false
|
cfg.EndpointResolver = sdkaws.EndpointResolverFunc(c.ResolveEndpoint)
|
||||||
cfg.DisableEndpointHostPrefix = true
|
|
||||||
cfg.EndpointResolver = aws.EndpointResolverFunc(c.ResolveEndpoint)
|
|
||||||
cfg.Region = c.Region
|
cfg.Region = c.Region
|
||||||
|
|
||||||
if cli != nil {
|
if cli != nil {
|
||||||
|
@@ -1,55 +0,0 @@
|
|||||||
package configCustom
|
|
||||||
|
|
||||||
import (
|
|
||||||
"reflect"
|
|
||||||
|
|
||||||
"github.com/nabbar/golib/logger"
|
|
||||||
)
|
|
||||||
|
|
||||||
type awsLogger struct {
|
|
||||||
logLevel logger.Level
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l awsLogger) Log(args ...interface{}) {
|
|
||||||
pattern := ""
|
|
||||||
|
|
||||||
for i := 0; i < len(args); i++ {
|
|
||||||
//nolint #exhaustive
|
|
||||||
switch reflect.TypeOf(args[i]).Kind() {
|
|
||||||
case reflect.String:
|
|
||||||
pattern += "%s"
|
|
||||||
default:
|
|
||||||
pattern += "%v"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
l.logLevel.Logf("AWS Log : "+pattern, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func LevelPanic() logger.Level {
|
|
||||||
return logger.PanicLevel
|
|
||||||
}
|
|
||||||
|
|
||||||
func LevelFatal() logger.Level {
|
|
||||||
return logger.FatalLevel
|
|
||||||
}
|
|
||||||
|
|
||||||
func LevelError() logger.Level {
|
|
||||||
return logger.ErrorLevel
|
|
||||||
}
|
|
||||||
|
|
||||||
func LevelWarn() logger.Level {
|
|
||||||
return logger.WarnLevel
|
|
||||||
}
|
|
||||||
|
|
||||||
func LevelInfo() logger.Level {
|
|
||||||
return logger.InfoLevel
|
|
||||||
}
|
|
||||||
|
|
||||||
func LevelDebug() logger.Level {
|
|
||||||
return logger.DebugLevel
|
|
||||||
}
|
|
||||||
|
|
||||||
func LevelNoLog() logger.Level {
|
|
||||||
return logger.NilLevel
|
|
||||||
}
|
|
@@ -7,8 +7,8 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
sdkaws "github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/go-playground/validator/v10"
|
libval "github.com/go-playground/validator/v10"
|
||||||
"github.com/nabbar/golib/errors"
|
"github.com/nabbar/golib/errors"
|
||||||
"github.com/nabbar/golib/httpcli"
|
"github.com/nabbar/golib/httpcli"
|
||||||
"github.com/nabbar/golib/logger"
|
"github.com/nabbar/golib/logger"
|
||||||
@@ -25,25 +25,23 @@ type Model struct {
|
|||||||
type awsModel struct {
|
type awsModel struct {
|
||||||
Model
|
Model
|
||||||
|
|
||||||
logLevel logger.Level
|
retryer sdkaws.Retryer
|
||||||
awsLevel aws.LogLevel
|
|
||||||
retryer aws.Retryer
|
|
||||||
endpoint *url.URL
|
endpoint *url.URL
|
||||||
mapRegion map[string]*url.URL
|
mapRegion map[string]*url.URL
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *awsModel) Validate() errors.Error {
|
func (c *awsModel) Validate() errors.Error {
|
||||||
val := validator.New()
|
val := libval.New()
|
||||||
err := val.Struct(c)
|
err := val.Struct(c)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if e, ok := err.(*validator.InvalidValidationError); ok {
|
if e, ok := err.(*libval.InvalidValidationError); ok {
|
||||||
return ErrorConfigValidator.ErrorParent(e)
|
return ErrorConfigValidator.ErrorParent(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
out := ErrorConfigValidator.Error(nil)
|
out := ErrorConfigValidator.Error(nil)
|
||||||
|
|
||||||
for _, e := range err.(validator.ValidationErrors) {
|
for _, e := range err.(libval.ValidationErrors) {
|
||||||
//nolint goerr113
|
//nolint goerr113
|
||||||
out.AddParent(fmt.Errorf("config field '%s' is not validated by constraint '%s'", e.Field(), e.ActualTag()))
|
out.AddParent(fmt.Errorf("config field '%s' is not validated by constraint '%s'", e.Field(), e.ActualTag()))
|
||||||
}
|
}
|
||||||
@@ -96,7 +94,7 @@ func (c *awsModel) RegisterRegionEndpoint(region string, endpoint *url.URL) erro
|
|||||||
region = c.Region
|
region = c.Region
|
||||||
}
|
}
|
||||||
|
|
||||||
val := validator.New()
|
val := libval.New()
|
||||||
|
|
||||||
if err := val.Var(endpoint, "url,required"); err != nil {
|
if err := val.Var(endpoint, "url,required"); err != nil {
|
||||||
return ErrorEndpointInvalid.ErrorParent(err)
|
return ErrorEndpointInvalid.ErrorParent(err)
|
||||||
@@ -127,7 +125,7 @@ func (c *awsModel) RegisterRegionAws(endpoint *url.URL) errors.Error {
|
|||||||
return ErrorEndpointInvalid.Error(nil)
|
return ErrorEndpointInvalid.Error(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
val := validator.New()
|
val := libval.New()
|
||||||
if err := val.Var(endpoint, "url,required"); err != nil {
|
if err := val.Var(endpoint, "url,required"); err != nil {
|
||||||
return ErrorEndpointInvalid.ErrorParent(err)
|
return ErrorEndpointInvalid.ErrorParent(err)
|
||||||
}
|
}
|
||||||
@@ -190,38 +188,34 @@ func (c awsModel) GetEndpoint() *url.URL {
|
|||||||
return c.endpoint
|
return c.endpoint
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *awsModel) ResolveEndpoint(service, region string) (aws.Endpoint, error) {
|
func (c *awsModel) ResolveEndpoint(service, region string) (sdkaws.Endpoint, error) {
|
||||||
if e, ok := c.mapRegion[region]; ok {
|
if e, ok := c.mapRegion[region]; ok {
|
||||||
return aws.Endpoint{
|
return sdkaws.Endpoint{
|
||||||
URL: strings.TrimSuffix(e.String(), "/"),
|
URL: strings.TrimSuffix(e.String(), "/"),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.Endpoint != "" {
|
if c.Endpoint != "" {
|
||||||
return aws.Endpoint{
|
return sdkaws.Endpoint{
|
||||||
URL: strings.TrimSuffix(c.Endpoint, "/"),
|
URL: strings.TrimSuffix(c.Endpoint, "/"),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.DebugLevel.Logf("Called ResolveEndpoint for service '%s' / region '%s' with nil endpoint", service, region)
|
logger.DebugLevel.Logf("Called ResolveEndpoint for service '%s' / region '%s' with nil endpoint", service, region)
|
||||||
return aws.Endpoint{}, ErrorEndpointInvalid.Error(nil)
|
return sdkaws.Endpoint{}, ErrorEndpointInvalid.Error(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *awsModel) SetLogLevel(lvl logger.Level) {
|
func (c *awsModel) IsHTTPs() bool {
|
||||||
c.logLevel = lvl
|
return c.endpoint.Scheme == "https"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *awsModel) SetAWSLogLevel(lvl aws.LogLevel) {
|
func (c *awsModel) SetRetryer(retryer sdkaws.Retryer) {
|
||||||
c.awsLevel = lvl
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *awsModel) SetRetryer(retryer aws.Retryer) {
|
|
||||||
c.retryer = retryer
|
c.retryer = retryer
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c awsModel) Check(ctx context.Context) errors.Error {
|
func (c awsModel) Check(ctx context.Context) errors.Error {
|
||||||
var (
|
var (
|
||||||
cfg aws.Config
|
cfg *sdkaws.Config
|
||||||
con net.Conn
|
con net.Conn
|
||||||
err error
|
err error
|
||||||
e errors.Error
|
e errors.Error
|
||||||
|
@@ -7,10 +7,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (cli *client) List() (map[string]string, errors.Error) {
|
func (cli *client) List() (map[string]string, errors.Error) {
|
||||||
req := cli.iam.ListGroupsRequest(&iam.ListGroupsInput{})
|
if out, err := cli.iam.ListGroups(cli.GetContext(), &iam.ListGroupsInput{}); err != nil {
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if out, err := req.Send(cli.GetContext()); err != nil {
|
|
||||||
return nil, cli.GetError(err)
|
return nil, cli.GetError(err)
|
||||||
} else {
|
} else {
|
||||||
var res = make(map[string]string)
|
var res = make(map[string]string)
|
||||||
@@ -24,23 +21,17 @@ func (cli *client) List() (map[string]string, errors.Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Add(groupName string) errors.Error {
|
func (cli *client) Add(groupName string) errors.Error {
|
||||||
req := cli.iam.CreateGroupRequest(&iam.CreateGroupInput{
|
_, err := cli.iam.CreateGroup(cli.GetContext(), &iam.CreateGroupInput{
|
||||||
GroupName: aws.String(groupName),
|
GroupName: aws.String(groupName),
|
||||||
})
|
})
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Remove(groupName string) errors.Error {
|
func (cli *client) Remove(groupName string) errors.Error {
|
||||||
req := cli.iam.DeleteGroupRequest(&iam.DeleteGroupInput{
|
_, err := cli.iam.DeleteGroup(cli.GetContext(), &iam.DeleteGroupInput{
|
||||||
GroupName: aws.String(groupName),
|
GroupName: aws.String(groupName),
|
||||||
})
|
})
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
@@ -7,12 +7,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (cli *client) PolicyList(groupName string) (map[string]string, errors.Error) {
|
func (cli *client) PolicyList(groupName string) (map[string]string, errors.Error) {
|
||||||
req := cli.iam.ListAttachedGroupPoliciesRequest(&iam.ListAttachedGroupPoliciesInput{
|
out, err := cli.iam.ListAttachedGroupPolicies(cli.GetContext(), &iam.ListAttachedGroupPoliciesInput{
|
||||||
GroupName: aws.String(groupName),
|
GroupName: aws.String(groupName),
|
||||||
})
|
})
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if out, err := req.Send(cli.GetContext()); err != nil {
|
if err != nil {
|
||||||
return nil, cli.GetError(err)
|
return nil, cli.GetError(err)
|
||||||
} else {
|
} else {
|
||||||
var res = make(map[string]string)
|
var res = make(map[string]string)
|
||||||
@@ -26,25 +25,19 @@ func (cli *client) PolicyList(groupName string) (map[string]string, errors.Error
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) PolicyAttach(groupName, polArn string) errors.Error {
|
func (cli *client) PolicyAttach(groupName, polArn string) errors.Error {
|
||||||
req := cli.iam.AttachGroupPolicyRequest(&iam.AttachGroupPolicyInput{
|
_, err := cli.iam.AttachGroupPolicy(cli.GetContext(), &iam.AttachGroupPolicyInput{
|
||||||
GroupName: aws.String(groupName),
|
GroupName: aws.String(groupName),
|
||||||
PolicyArn: aws.String(polArn),
|
PolicyArn: aws.String(polArn),
|
||||||
})
|
})
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) PolicyDetach(groupName, polArn string) errors.Error {
|
func (cli *client) PolicyDetach(groupName, polArn string) errors.Error {
|
||||||
req := cli.iam.DetachGroupPolicyRequest(&iam.DetachGroupPolicyInput{
|
_, err := cli.iam.DetachGroupPolicy(cli.GetContext(), &iam.DetachGroupPolicyInput{
|
||||||
GroupName: aws.String(groupName),
|
GroupName: aws.String(groupName),
|
||||||
PolicyArn: aws.String(polArn),
|
PolicyArn: aws.String(polArn),
|
||||||
})
|
})
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
@@ -7,12 +7,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (cli *client) UserCheck(username, groupName string) (errors.Error, bool) {
|
func (cli *client) UserCheck(username, groupName string) (errors.Error, bool) {
|
||||||
req := cli.iam.ListGroupsForUserRequest(&iam.ListGroupsForUserInput{
|
out, err := cli.iam.ListGroupsForUser(cli.GetContext(), &iam.ListGroupsForUserInput{
|
||||||
UserName: aws.String(username),
|
UserName: aws.String(username),
|
||||||
})
|
})
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if out, err := req.Send(cli.GetContext()); err != nil {
|
if err != nil {
|
||||||
return cli.GetError(err), false
|
return cli.GetError(err), false
|
||||||
} else {
|
} else {
|
||||||
for _, g := range out.Groups {
|
for _, g := range out.Groups {
|
||||||
@@ -26,12 +25,11 @@ func (cli *client) UserCheck(username, groupName string) (errors.Error, bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) UserList(username string) ([]string, errors.Error) {
|
func (cli *client) UserList(username string) ([]string, errors.Error) {
|
||||||
req := cli.iam.ListGroupsForUserRequest(&iam.ListGroupsForUserInput{
|
out, err := cli.iam.ListGroupsForUser(cli.GetContext(), &iam.ListGroupsForUserInput{
|
||||||
UserName: aws.String(username),
|
UserName: aws.String(username),
|
||||||
})
|
})
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if out, err := req.Send(cli.GetContext()); err != nil {
|
if err != nil {
|
||||||
return nil, cli.GetError(err)
|
return nil, cli.GetError(err)
|
||||||
} else {
|
} else {
|
||||||
var res = make([]string, 0)
|
var res = make([]string, 0)
|
||||||
@@ -45,25 +43,19 @@ func (cli *client) UserList(username string) ([]string, errors.Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) UserAdd(username, groupName string) errors.Error {
|
func (cli *client) UserAdd(username, groupName string) errors.Error {
|
||||||
req := cli.iam.AddUserToGroupRequest(&iam.AddUserToGroupInput{
|
_, err := cli.iam.AddUserToGroup(cli.GetContext(), &iam.AddUserToGroupInput{
|
||||||
UserName: aws.String(username),
|
UserName: aws.String(username),
|
||||||
GroupName: aws.String(groupName),
|
GroupName: aws.String(groupName),
|
||||||
})
|
})
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) UserRemove(username, groupName string) errors.Error {
|
func (cli *client) UserRemove(username, groupName string) errors.Error {
|
||||||
req := cli.iam.RemoveUserFromGroupRequest(&iam.RemoveUserFromGroupInput{
|
_, err := cli.iam.RemoveUserFromGroup(cli.GetContext(), &iam.RemoveUserFromGroupInput{
|
||||||
UserName: aws.String(username),
|
UserName: aws.String(username),
|
||||||
GroupName: aws.String(groupName),
|
GroupName: aws.String(groupName),
|
||||||
})
|
})
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
@@ -4,7 +4,7 @@ import "github.com/nabbar/golib/errors"
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
// minmal are errors.MIN_AVAILABLE + get a hope free range 1000 + 10 for aws-config errors.
|
// minmal are errors.MIN_AVAILABLE + get a hope free range 1000 + 10 for aws-config errors.
|
||||||
ErrorResponse errors.CodeError = iota + errors.MIN_AVAILABLE + 1000 + 10
|
ErrorResponse errors.CodeError = iota + errors.MIN_PKG_Aws + 60
|
||||||
ErrorConfigEmpty
|
ErrorConfigEmpty
|
||||||
ErrorAwsEmpty
|
ErrorAwsEmpty
|
||||||
ErrorAws
|
ErrorAws
|
||||||
|
@@ -2,13 +2,11 @@ package helper
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
"github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/aws/aws-sdk-go-v2/aws/awserr"
|
liberr "github.com/nabbar/golib/errors"
|
||||||
"github.com/nabbar/golib/errors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -28,32 +26,25 @@ func New(ctx context.Context, bucket string) Helper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli Helper) GetError(err error) errors.Error {
|
func (cli Helper) GetError(err ...error) liberr.Error {
|
||||||
if err == nil {
|
var er = ErrorAws.Error(nil)
|
||||||
|
|
||||||
|
for _, e := range err {
|
||||||
|
if e == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if n, ok := e.(liberr.Error); ok {
|
||||||
|
er.AddParentError(n)
|
||||||
|
} else {
|
||||||
|
er.AddParent(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if er.HasParent() {
|
||||||
|
return er
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
|
||||||
|
|
||||||
if aerr, ok := err.(awserr.Error); ok {
|
|
||||||
return ErrorAws.Error(errors.NewError(0, fmt.Sprintf("(%s) %s", aerr.Code(), aerr.Message()), nil))
|
|
||||||
}
|
|
||||||
|
|
||||||
if aerr, ok := err.(errors.Error); ok {
|
|
||||||
return ErrorAws.Error(aerr)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ErrorAws.ErrorParent(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cli Helper) ErrorCode(err error) string {
|
|
||||||
if aerr, ok := err.(awserr.Error); ok {
|
|
||||||
return aerr.Code()
|
|
||||||
}
|
|
||||||
|
|
||||||
if aerr, ok := err.(errors.Error); ok {
|
|
||||||
return aerr.CodeError("")
|
|
||||||
}
|
|
||||||
|
|
||||||
return ""
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *Helper) GetContext() context.Context {
|
func (cli *Helper) GetContext() context.Context {
|
||||||
|
@@ -1,5 +1,13 @@
|
|||||||
package helper
|
package helper
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"io"
|
||||||
|
|
||||||
|
sdkaws "github.com/aws/aws-sdk-go-v2/aws"
|
||||||
|
sdktps "github.com/aws/aws-sdk-go-v2/service/s3/types"
|
||||||
|
)
|
||||||
|
|
||||||
type PartSize int64
|
type PartSize int64
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -45,3 +53,87 @@ func (p PartSize) String() string {
|
|||||||
|
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ReaderPartSize interface {
|
||||||
|
io.Reader
|
||||||
|
NextPart(eTag *string)
|
||||||
|
CurrPart() int32
|
||||||
|
CompPart() *sdktps.CompletedMultipartUpload
|
||||||
|
IeOEF() bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewReaderPartSize(rd io.Reader, p PartSize) ReaderPartSize {
|
||||||
|
return &readerPartSize{
|
||||||
|
b: rd,
|
||||||
|
p: p.Int64(),
|
||||||
|
i: 0,
|
||||||
|
j: 0,
|
||||||
|
e: false,
|
||||||
|
c: nil,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type readerPartSize struct {
|
||||||
|
// buffer
|
||||||
|
b io.Reader
|
||||||
|
// partsize
|
||||||
|
p int64
|
||||||
|
// partNumber
|
||||||
|
i int64
|
||||||
|
// current part counter
|
||||||
|
j int64
|
||||||
|
// Is EOF
|
||||||
|
e bool
|
||||||
|
// complete part slice
|
||||||
|
c *sdktps.CompletedMultipartUpload
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *readerPartSize) NextPart(eTag *string) {
|
||||||
|
if r.c == nil {
|
||||||
|
r.c = &sdktps.CompletedMultipartUpload{
|
||||||
|
Parts: nil,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.c.Parts == nil {
|
||||||
|
r.c.Parts = make([]*sdktps.CompletedPart, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
r.c.Parts = append(r.c.Parts, &sdktps.CompletedPart{
|
||||||
|
ETag: eTag,
|
||||||
|
PartNumber: sdkaws.Int32(int32(r.i)),
|
||||||
|
})
|
||||||
|
|
||||||
|
r.i++
|
||||||
|
r.j = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r readerPartSize) CurrPart() int32 {
|
||||||
|
return int32(r.i)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r readerPartSize) CompPart() *sdktps.CompletedMultipartUpload {
|
||||||
|
return r.c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r readerPartSize) IeOEF() bool {
|
||||||
|
return r.e
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *readerPartSize) Read(p []byte) (n int, err error) {
|
||||||
|
if r.e || r.j >= r.p {
|
||||||
|
return 0, io.EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(p) > int(r.p-r.j) {
|
||||||
|
p = make([]byte, int(r.p-r.j))
|
||||||
|
}
|
||||||
|
|
||||||
|
n, e := r.b.Read(p)
|
||||||
|
|
||||||
|
if errors.Is(e, io.EOF) {
|
||||||
|
r.e = true
|
||||||
|
}
|
||||||
|
|
||||||
|
return n, e
|
||||||
|
}
|
||||||
|
178
aws/interface.go
178
aws/interface.go
@@ -5,9 +5,10 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
sdkaws "github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/iam"
|
sdksv4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
sdkiam "github.com/aws/aws-sdk-go-v2/service/iam"
|
||||||
|
sdksss "github.com/aws/aws-sdk-go-v2/service/s3"
|
||||||
"github.com/nabbar/golib/aws/bucket"
|
"github.com/nabbar/golib/aws/bucket"
|
||||||
"github.com/nabbar/golib/aws/group"
|
"github.com/nabbar/golib/aws/group"
|
||||||
"github.com/nabbar/golib/aws/helper"
|
"github.com/nabbar/golib/aws/helper"
|
||||||
@@ -16,7 +17,6 @@ import (
|
|||||||
"github.com/nabbar/golib/aws/role"
|
"github.com/nabbar/golib/aws/role"
|
||||||
"github.com/nabbar/golib/aws/user"
|
"github.com/nabbar/golib/aws/user"
|
||||||
"github.com/nabbar/golib/errors"
|
"github.com/nabbar/golib/errors"
|
||||||
"github.com/nabbar/golib/logger"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Config interface {
|
type Config interface {
|
||||||
@@ -31,13 +31,11 @@ type Config interface {
|
|||||||
SetEndpoint(endpoint *url.URL)
|
SetEndpoint(endpoint *url.URL)
|
||||||
GetEndpoint() *url.URL
|
GetEndpoint() *url.URL
|
||||||
|
|
||||||
ResolveEndpoint(service, region string) (aws.Endpoint, error)
|
IsHTTPs() bool
|
||||||
|
ResolveEndpoint(service, region string) (sdkaws.Endpoint, error)
|
||||||
|
SetRetryer(retryer sdkaws.Retryer)
|
||||||
|
|
||||||
SetLogLevel(lvl logger.Level)
|
GetConfig(cli *http.Client) (*sdkaws.Config, errors.Error)
|
||||||
SetAWSLogLevel(lvl aws.LogLevel)
|
|
||||||
SetRetryer(retryer aws.Retryer)
|
|
||||||
|
|
||||||
GetConfig(cli *http.Client) (aws.Config, errors.Error)
|
|
||||||
JSON() ([]byte, error)
|
JSON() ([]byte, error)
|
||||||
Clone() Config
|
Clone() Config
|
||||||
|
|
||||||
@@ -53,9 +51,9 @@ type AWS interface {
|
|||||||
Role() role.Role
|
Role() role.Role
|
||||||
User() user.User
|
User() user.User
|
||||||
|
|
||||||
Clone() AWS
|
Clone() (AWS, errors.Error)
|
||||||
Config() Config
|
Config() Config
|
||||||
ForcePathStyle(enabled bool)
|
ForcePathStyle(enabled bool) errors.Error
|
||||||
|
|
||||||
GetBucketName() string
|
GetBucketName() string
|
||||||
SetBucketName(bucket string)
|
SetBucketName(bucket string)
|
||||||
@@ -65,8 +63,9 @@ type client struct {
|
|||||||
p bool
|
p bool
|
||||||
x context.Context
|
x context.Context
|
||||||
c Config
|
c Config
|
||||||
i *iam.Client
|
i *sdkiam.Client
|
||||||
s *s3.Client
|
s *sdksss.Client
|
||||||
|
h *http.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(ctx context.Context, cfg Config, httpClient *http.Client) (AWS, errors.Error) {
|
func New(ctx context.Context, cfg Config, httpClient *http.Client) (AWS, errors.Error) {
|
||||||
@@ -74,57 +73,118 @@ func New(ctx context.Context, cfg Config, httpClient *http.Client) (AWS, errors.
|
|||||||
return nil, helper.ErrorConfigEmpty.Error(nil)
|
return nil, helper.ErrorConfigEmpty.Error(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
|
||||||
c aws.Config
|
|
||||||
i *iam.Client
|
|
||||||
s *s3.Client
|
|
||||||
e errors.Error
|
|
||||||
)
|
|
||||||
|
|
||||||
if c, e = cfg.GetConfig(httpClient); e != nil {
|
|
||||||
return nil, e
|
|
||||||
}
|
|
||||||
|
|
||||||
i = iam.New(c)
|
|
||||||
s = s3.New(c)
|
|
||||||
|
|
||||||
if httpClient != nil {
|
|
||||||
i.HTTPClient = httpClient
|
|
||||||
s.HTTPClient = httpClient
|
|
||||||
}
|
|
||||||
|
|
||||||
if ctx == nil {
|
if ctx == nil {
|
||||||
ctx = context.Background()
|
ctx = context.Background()
|
||||||
}
|
}
|
||||||
|
|
||||||
return &client{
|
cli := &client{
|
||||||
p: false,
|
p: false,
|
||||||
x: ctx,
|
x: ctx,
|
||||||
c: cfg,
|
c: cfg,
|
||||||
i: i,
|
i: nil,
|
||||||
s: s,
|
s: nil,
|
||||||
}, nil
|
h: httpClient,
|
||||||
}
|
|
||||||
|
|
||||||
func (c *client) getCliIAM() *iam.Client {
|
|
||||||
i := iam.New(c.i.Config)
|
|
||||||
i.HTTPClient = c.i.HTTPClient
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *client) getCliS3() *s3.Client {
|
|
||||||
s := s3.New(c.s.Config)
|
|
||||||
s.HTTPClient = c.s.HTTPClient
|
|
||||||
s.ForcePathStyle = c.p
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *client) Clone() AWS {
|
|
||||||
return &client{
|
|
||||||
p: c.p,
|
|
||||||
x: c.x,
|
|
||||||
c: c.c.Clone(),
|
|
||||||
i: c.getCliIAM(),
|
|
||||||
s: c.getCliS3(),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if i, e := cli.newClientIAM(httpClient); e != nil {
|
||||||
|
return nil, e
|
||||||
|
} else {
|
||||||
|
cli.i = i
|
||||||
|
}
|
||||||
|
|
||||||
|
if s, e := cli.newClientS3(httpClient); e != nil {
|
||||||
|
return nil, e
|
||||||
|
} else {
|
||||||
|
cli.s = s
|
||||||
|
}
|
||||||
|
|
||||||
|
return cli, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cli *client) newClientIAM(httpClient *http.Client) (*sdkiam.Client, errors.Error) {
|
||||||
|
var (
|
||||||
|
c *sdkaws.Config
|
||||||
|
i *sdkiam.Client
|
||||||
|
e errors.Error
|
||||||
|
)
|
||||||
|
|
||||||
|
if httpClient == nil {
|
||||||
|
httpClient = cli.h
|
||||||
|
}
|
||||||
|
|
||||||
|
if c, e = cli.c.GetConfig(httpClient); e != nil {
|
||||||
|
return nil, e
|
||||||
|
}
|
||||||
|
|
||||||
|
i = sdkiam.New(sdkiam.Options{
|
||||||
|
APIOptions: c.APIOptions,
|
||||||
|
Credentials: c.Credentials,
|
||||||
|
EndpointOptions: sdkiam.ResolverOptions{
|
||||||
|
DisableHTTPS: cli.c.IsHTTPs(),
|
||||||
|
},
|
||||||
|
EndpointResolver: sdkiam.WithEndpointResolver(c.EndpointResolver, nil),
|
||||||
|
HTTPSignerV4: sdksv4.NewSigner(),
|
||||||
|
Region: c.Region,
|
||||||
|
Retryer: c.Retryer,
|
||||||
|
HTTPClient: httpClient,
|
||||||
|
})
|
||||||
|
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cli *client) newClientS3(httpClient *http.Client) (*sdksss.Client, errors.Error) {
|
||||||
|
var (
|
||||||
|
c *sdkaws.Config
|
||||||
|
s *sdksss.Client
|
||||||
|
e errors.Error
|
||||||
|
)
|
||||||
|
|
||||||
|
if httpClient == nil {
|
||||||
|
httpClient = cli.h
|
||||||
|
}
|
||||||
|
|
||||||
|
if c, e = cli.c.GetConfig(httpClient); e != nil {
|
||||||
|
return nil, e
|
||||||
|
}
|
||||||
|
|
||||||
|
s = sdksss.New(sdksss.Options{
|
||||||
|
APIOptions: c.APIOptions,
|
||||||
|
Credentials: c.Credentials,
|
||||||
|
EndpointOptions: sdksss.ResolverOptions{
|
||||||
|
DisableHTTPS: cli.c.IsHTTPs(),
|
||||||
|
},
|
||||||
|
EndpointResolver: sdksss.WithEndpointResolver(c.EndpointResolver, nil),
|
||||||
|
HTTPSignerV4: sdksv4.NewSigner(),
|
||||||
|
Region: c.Region,
|
||||||
|
Retryer: c.Retryer,
|
||||||
|
HTTPClient: httpClient,
|
||||||
|
UsePathStyle: cli.p,
|
||||||
|
})
|
||||||
|
|
||||||
|
return s, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *client) Clone() (AWS, errors.Error) {
|
||||||
|
cli := &client{
|
||||||
|
p: false,
|
||||||
|
x: c.x,
|
||||||
|
c: c.c,
|
||||||
|
i: nil,
|
||||||
|
s: nil,
|
||||||
|
h: c.h,
|
||||||
|
}
|
||||||
|
|
||||||
|
if i, e := cli.newClientIAM(c.h); e != nil {
|
||||||
|
return nil, e
|
||||||
|
} else {
|
||||||
|
cli.i = i
|
||||||
|
}
|
||||||
|
|
||||||
|
if s, e := cli.newClientS3(c.h); e != nil {
|
||||||
|
return nil, e
|
||||||
|
} else {
|
||||||
|
cli.s = s
|
||||||
|
}
|
||||||
|
|
||||||
|
return cli, nil
|
||||||
}
|
}
|
||||||
|
24
aws/model.go
24
aws/model.go
@@ -7,11 +7,19 @@ import (
|
|||||||
"github.com/nabbar/golib/aws/policy"
|
"github.com/nabbar/golib/aws/policy"
|
||||||
"github.com/nabbar/golib/aws/role"
|
"github.com/nabbar/golib/aws/role"
|
||||||
"github.com/nabbar/golib/aws/user"
|
"github.com/nabbar/golib/aws/user"
|
||||||
|
"github.com/nabbar/golib/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c *client) ForcePathStyle(enabled bool) {
|
func (c *client) ForcePathStyle(enabled bool) errors.Error {
|
||||||
c.p = enabled
|
c.p = enabled
|
||||||
c.s.ForcePathStyle = enabled
|
|
||||||
|
if s, e := c.newClientS3(nil); e != nil {
|
||||||
|
return e
|
||||||
|
} else {
|
||||||
|
c.s = s
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *client) Config() Config {
|
func (c *client) Config() Config {
|
||||||
@@ -19,27 +27,27 @@ func (c *client) Config() Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *client) Bucket() bucket.Bucket {
|
func (c *client) Bucket() bucket.Bucket {
|
||||||
return bucket.New(c.x, c.c.GetBucketName(), c.getCliIAM(), c.getCliS3())
|
return bucket.New(c.x, c.c.GetBucketName(), c.i, c.s)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *client) Group() group.Group {
|
func (c *client) Group() group.Group {
|
||||||
return group.New(c.x, c.c.GetBucketName(), c.getCliIAM(), c.getCliS3())
|
return group.New(c.x, c.c.GetBucketName(), c.i, c.s)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *client) Object() object.Object {
|
func (c *client) Object() object.Object {
|
||||||
return object.New(c.x, c.c.GetBucketName(), c.getCliIAM(), c.getCliS3())
|
return object.New(c.x, c.c.GetBucketName(), c.i, c.s)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *client) Policy() policy.Policy {
|
func (c *client) Policy() policy.Policy {
|
||||||
return policy.New(c.x, c.c.GetBucketName(), c.getCliIAM(), c.getCliS3())
|
return policy.New(c.x, c.c.GetBucketName(), c.i, c.s)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *client) Role() role.Role {
|
func (c *client) Role() role.Role {
|
||||||
return role.New(c.x, c.c.GetBucketName(), c.getCliIAM(), c.getCliS3())
|
return role.New(c.x, c.c.GetBucketName(), c.i, c.s)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *client) User() user.User {
|
func (c *client) User() user.User {
|
||||||
return user.New(c.x, c.c.GetBucketName(), c.getCliIAM(), c.getCliS3())
|
return user.New(c.x, c.c.GetBucketName(), c.i, c.s)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *client) GetBucketName() string {
|
func (c *client) GetBucketName() string {
|
||||||
|
@@ -5,33 +5,34 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/service/iam"
|
sdkiam "github.com/aws/aws-sdk-go-v2/service/iam"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
sdksss "github.com/aws/aws-sdk-go-v2/service/s3"
|
||||||
|
sdktps "github.com/aws/aws-sdk-go-v2/service/s3/types"
|
||||||
"github.com/nabbar/golib/aws/helper"
|
"github.com/nabbar/golib/aws/helper"
|
||||||
"github.com/nabbar/golib/errors"
|
"github.com/nabbar/golib/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
type client struct {
|
type client struct {
|
||||||
helper.Helper
|
helper.Helper
|
||||||
iam *iam.Client
|
iam *sdkiam.Client
|
||||||
s3 *s3.Client
|
s3 *sdksss.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
type Object interface {
|
type Object interface {
|
||||||
Find(pattern string) ([]string, errors.Error)
|
Find(pattern string) ([]string, errors.Error)
|
||||||
Size(object string) (size int64, err errors.Error)
|
Size(object string) (size int64, err errors.Error)
|
||||||
|
|
||||||
List(continuationToken string) ([]s3.Object, string, int64, errors.Error)
|
List(continuationToken string) ([]*sdktps.Object, string, int64, errors.Error)
|
||||||
Head(object string) (head map[string]interface{}, meta map[string]string, err errors.Error)
|
Head(object string) (*sdksss.HeadObjectOutput, errors.Error)
|
||||||
Get(object string) (io.ReadCloser, []io.Closer, errors.Error)
|
Get(object string) (*sdksss.GetObjectOutput, errors.Error)
|
||||||
Put(object string, body *bytes.Reader) errors.Error
|
Put(object string, body *bytes.Reader) errors.Error
|
||||||
Delete(object string) errors.Error
|
Delete(object string) errors.Error
|
||||||
|
|
||||||
MultipartPut(object string, body io.Reader) errors.Error
|
MultipartPut(object string, body io.Reader) errors.Error
|
||||||
MultipartPutCustom(partSize helper.PartSize, object string, body io.Reader, concurrent int) errors.Error
|
MultipartPutCustom(partSize helper.PartSize, object string, body io.Reader) errors.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(ctx context.Context, bucket string, iam *iam.Client, s3 *s3.Client) Object {
|
func New(ctx context.Context, bucket string, iam *sdkiam.Client, s3 *sdksss.Client) Object {
|
||||||
return &client{
|
return &client{
|
||||||
Helper: helper.New(ctx, bucket),
|
Helper: helper.New(ctx, bucket),
|
||||||
iam: iam,
|
iam: iam,
|
||||||
|
@@ -2,40 +2,126 @@ package object
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
"github.com/nabbar/golib/ioutils"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/s3/s3manager"
|
|
||||||
"github.com/nabbar/golib/aws/helper"
|
sdkaws "github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/nabbar/golib/errors"
|
sdksss "github.com/aws/aws-sdk-go-v2/service/s3"
|
||||||
|
libhlp "github.com/nabbar/golib/aws/helper"
|
||||||
|
liberr "github.com/nabbar/golib/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
const buffSize = 64 * 1024 // double buff of io.copyBuffer
|
const DefaultPartSize = 5 * libhlp.SizeMegaBytes
|
||||||
|
|
||||||
func (cli *client) MultipartPut(object string, body io.Reader) errors.Error {
|
func (cli *client) MultipartPut(object string, body io.Reader) liberr.Error {
|
||||||
return cli.MultipartPutCustom(helper.SetSizeInt64(s3manager.MinUploadPartSize), object, body, 0)
|
return cli.MultipartPutCustom(DefaultPartSize, object, body)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) MultipartPutCustom(partSize helper.PartSize, object string, body io.Reader, concurrent int) errors.Error {
|
func (cli *client) MultipartPutCustom(partSize libhlp.PartSize, object string, body io.Reader) liberr.Error {
|
||||||
uploader := s3manager.NewUploaderWithClient(cli.s3)
|
var (
|
||||||
|
tmp ioutils.FileProgress
|
||||||
|
rio libhlp.ReaderPartSize
|
||||||
|
upl *sdksss.CreateMultipartUploadOutput
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
if partSize > 0 {
|
defer func() {
|
||||||
uploader.PartSize = partSize.Int64()
|
if tmp != nil {
|
||||||
} else {
|
_ = tmp.Close()
|
||||||
uploader.PartSize = helper.SetSizeInt64(s3manager.MinUploadPartSize).Int64()
|
|
||||||
}
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
if concurrent > 0 {
|
upl, err = cli.s3.CreateMultipartUpload(cli.GetContext(), &sdksss.CreateMultipartUploadInput{
|
||||||
uploader.Concurrency = concurrent
|
Key: sdkaws.String(object),
|
||||||
}
|
Bucket: sdkaws.String(cli.GetBucketName()),
|
||||||
|
|
||||||
// Set Buffer size to 64Kb (this is the min size available)
|
|
||||||
uploader.BufferProvider = s3manager.NewBufferedReadSeekerWriteToPool(buffSize)
|
|
||||||
|
|
||||||
_, err := uploader.UploadWithContext(cli.GetContext(), &s3manager.UploadInput{
|
|
||||||
Bucket: cli.GetBucketAws(),
|
|
||||||
Key: aws.String(object),
|
|
||||||
Body: body,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
|
} else if upl == nil {
|
||||||
|
return libhlp.ErrorResponse.Error(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
rio = libhlp.NewReaderPartSize(body, partSize)
|
||||||
|
|
||||||
|
for !rio.IeOEF() {
|
||||||
|
var (
|
||||||
|
inf os.FileInfo
|
||||||
|
prt *sdksss.UploadPartOutput
|
||||||
|
)
|
||||||
|
|
||||||
|
tmp, err = ioutils.NewFileProgressTemp()
|
||||||
|
if err != nil {
|
||||||
|
return cli.multipartCancel(err, upl.UploadId, object)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = io.Copy(tmp, rio)
|
||||||
|
if err != nil {
|
||||||
|
return cli.multipartCancel(err, upl.UploadId, object)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = tmp.Seek(0, io.SeekStart)
|
||||||
|
if err != nil {
|
||||||
|
return cli.multipartCancel(err, upl.UploadId, object)
|
||||||
|
}
|
||||||
|
|
||||||
|
inf, err = tmp.FileStat()
|
||||||
|
if err != nil {
|
||||||
|
return cli.multipartCancel(err, upl.UploadId, object)
|
||||||
|
}
|
||||||
|
|
||||||
|
prt, err = cli.s3.UploadPart(cli.GetContext(), &sdksss.UploadPartInput{
|
||||||
|
Bucket: sdkaws.String(cli.GetBucketName()),
|
||||||
|
Body: tmp,
|
||||||
|
PartNumber: sdkaws.Int32(rio.CurrPart()),
|
||||||
|
UploadId: upl.UploadId,
|
||||||
|
Key: sdkaws.String(object),
|
||||||
|
ContentLength: sdkaws.Int64(inf.Size()),
|
||||||
|
})
|
||||||
|
|
||||||
|
_ = tmp.Close()
|
||||||
|
tmp = nil
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return cli.multipartCancel(err, upl.UploadId, object)
|
||||||
|
} else if prt == nil || prt.ETag == nil || len(*prt.ETag) == 0 {
|
||||||
|
return cli.multipartCancel(libhlp.ErrorResponse.Error(nil), upl.UploadId, object)
|
||||||
|
}
|
||||||
|
|
||||||
|
rio.NextPart(prt.ETag)
|
||||||
|
}
|
||||||
|
|
||||||
|
var prt *sdksss.CompleteMultipartUploadOutput
|
||||||
|
prt, err = cli.s3.CompleteMultipartUpload(cli.GetContext(), &sdksss.CompleteMultipartUploadInput{
|
||||||
|
UploadId: upl.UploadId,
|
||||||
|
MultipartUpload: rio.CompPart(),
|
||||||
|
Bucket: sdkaws.String(cli.GetBucketName()),
|
||||||
|
Key: sdkaws.String(object),
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return cli.multipartCancel(err, upl.UploadId, object)
|
||||||
|
} else if prt == nil || prt.ETag == nil || len(*prt.ETag) == 0 {
|
||||||
|
return cli.multipartCancel(libhlp.ErrorResponse.Error(nil), upl.UploadId, object)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cli *client) multipartCancel(err error, updIp *string, object string) liberr.Error {
|
||||||
|
cnl, e := cli.s3.AbortMultipartUpload(cli.GetContext(), &sdksss.AbortMultipartUploadInput{
|
||||||
|
Bucket: sdkaws.String(cli.GetBucketName()),
|
||||||
|
UploadId: updIp,
|
||||||
|
Key: sdkaws.String(object),
|
||||||
|
})
|
||||||
|
|
||||||
|
if e != nil {
|
||||||
|
return cli.GetError(e, err)
|
||||||
|
} else if cnl == nil {
|
||||||
|
return libhlp.ErrorResponse.Error(cli.GetError(err))
|
||||||
|
} else {
|
||||||
|
return cli.GetError(err)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -2,121 +2,88 @@ package object
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"io"
|
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
sdkaws "github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
sdksss "github.com/aws/aws-sdk-go-v2/service/s3"
|
||||||
|
sdktps "github.com/aws/aws-sdk-go-v2/service/s3/types"
|
||||||
"github.com/nabbar/golib/aws/helper"
|
"github.com/nabbar/golib/aws/helper"
|
||||||
"github.com/nabbar/golib/errors"
|
"github.com/nabbar/golib/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (cli *client) List(continuationToken string) ([]s3.Object, string, int64, errors.Error) {
|
func (cli *client) List(continuationToken string) ([]*sdktps.Object, string, int64, errors.Error) {
|
||||||
in := s3.ListObjectsV2Input{
|
in := sdksss.ListObjectsV2Input{
|
||||||
Bucket: cli.GetBucketAws(),
|
Bucket: cli.GetBucketAws(),
|
||||||
}
|
}
|
||||||
|
|
||||||
if continuationToken != "" {
|
if continuationToken != "" {
|
||||||
in.ContinuationToken = aws.String(continuationToken)
|
in.ContinuationToken = sdkaws.String(continuationToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
req := cli.s3.ListObjectsV2Request(&in)
|
out, err := cli.s3.ListObjectsV2(cli.GetContext(), &in)
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", 0, cli.GetError(err)
|
return nil, "", 0, cli.GetError(err)
|
||||||
} else if *out.IsTruncated {
|
} else if *out.IsTruncated {
|
||||||
return out.Contents, *out.NextContinuationToken, *out.KeyCount, nil
|
return out.Contents, *out.NextContinuationToken, int64(*out.KeyCount), nil
|
||||||
} else {
|
} else {
|
||||||
return out.Contents, "", *out.KeyCount, nil
|
return out.Contents, "", int64(*out.KeyCount), nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Get(object string) (io.ReadCloser, []io.Closer, errors.Error) {
|
func (cli *client) Get(object string) (*sdksss.GetObjectOutput, errors.Error) {
|
||||||
req := cli.s3.GetObjectRequest(&s3.GetObjectInput{
|
out, err := cli.s3.GetObject(cli.GetContext(), &sdksss.GetObjectInput{
|
||||||
Bucket: cli.GetBucketAws(),
|
Bucket: cli.GetBucketAws(),
|
||||||
Key: aws.String(object),
|
Key: sdkaws.String(object),
|
||||||
})
|
})
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(nil, nil)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cli.Close(req.HTTPRequest, req.HTTPResponse)
|
defer func() {
|
||||||
return nil, nil, cli.GetError(err)
|
if out != nil && out.Body != nil {
|
||||||
|
_ = out.Body.Close()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
return nil, cli.GetError(err)
|
||||||
} else if out.Body == nil {
|
} else if out.Body == nil {
|
||||||
cli.Close(req.HTTPRequest, req.HTTPResponse)
|
return nil, helper.ErrorResponse.Error(nil)
|
||||||
return nil, nil, helper.ErrorResponse.Error(nil)
|
|
||||||
} else {
|
} else {
|
||||||
return out.Body, cli.GetCloser(req.HTTPRequest, req.HTTPResponse), nil
|
return out, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Head(object string) (head map[string]interface{}, meta map[string]string, err errors.Error) {
|
func (cli *client) Head(object string) (*sdksss.HeadObjectOutput, errors.Error) {
|
||||||
req := cli.s3.HeadObjectRequest(&s3.HeadObjectInput{
|
out, e := cli.s3.HeadObject(cli.GetContext(), &sdksss.HeadObjectInput{
|
||||||
Bucket: cli.GetBucketAws(),
|
Bucket: cli.GetBucketAws(),
|
||||||
Key: aws.String(object),
|
Key: sdkaws.String(object),
|
||||||
})
|
})
|
||||||
|
|
||||||
out, e := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return nil, nil, cli.GetError(e)
|
return nil, cli.GetError(e)
|
||||||
} else if out.Metadata == nil {
|
} else if out.ETag == nil {
|
||||||
return nil, nil, helper.ErrorResponse.Error(nil)
|
return nil, helper.ErrorResponse.Error(nil)
|
||||||
} else {
|
} else {
|
||||||
res := make(map[string]interface{})
|
return out, nil
|
||||||
if out.ContentType != nil {
|
|
||||||
res["ContentType"] = *out.ContentType
|
|
||||||
}
|
|
||||||
if out.ContentDisposition != nil {
|
|
||||||
res["ContentDisposition"] = *out.ContentDisposition
|
|
||||||
}
|
|
||||||
if out.ContentEncoding != nil {
|
|
||||||
res["ContentEncoding"] = *out.ContentEncoding
|
|
||||||
}
|
|
||||||
if out.ContentLanguage != nil {
|
|
||||||
res["ContentLanguage"] = *out.ContentLanguage
|
|
||||||
}
|
|
||||||
if out.ContentLength != nil {
|
|
||||||
res["ContentLength"] = *out.ContentLength
|
|
||||||
}
|
|
||||||
|
|
||||||
return res, out.Metadata, nil
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Size(object string) (size int64, err errors.Error) {
|
func (cli *client) Size(object string) (size int64, err errors.Error) {
|
||||||
var (
|
var (
|
||||||
h map[string]interface{}
|
h *sdksss.HeadObjectOutput
|
||||||
i interface{}
|
|
||||||
j int64
|
|
||||||
o bool
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if h, _, err = cli.Head(object); err != nil {
|
if h, err = cli.Head(object); err != nil {
|
||||||
return
|
return
|
||||||
} else if i, o = h["ContentLength"]; !o {
|
|
||||||
return 0, nil
|
|
||||||
} else if j, o = i.(int64); !o {
|
|
||||||
return 0, nil
|
|
||||||
} else {
|
} else {
|
||||||
return j, nil
|
return *h.ContentLength, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Put(object string, body *bytes.Reader) errors.Error {
|
func (cli *client) Put(object string, body *bytes.Reader) errors.Error {
|
||||||
req := cli.s3.PutObjectRequest(&s3.PutObjectInput{
|
out, err := cli.s3.PutObject(cli.GetContext(), &sdksss.PutObjectInput{
|
||||||
Bucket: cli.GetBucketAws(),
|
Bucket: cli.GetBucketAws(),
|
||||||
Key: aws.String(object),
|
Key: sdkaws.String(object),
|
||||||
Body: body,
|
Body: body,
|
||||||
})
|
})
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
} else if out.ETag == nil {
|
} else if out.ETag == nil {
|
||||||
@@ -127,17 +94,14 @@ func (cli *client) Put(object string, body *bytes.Reader) errors.Error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Delete(object string) errors.Error {
|
func (cli *client) Delete(object string) errors.Error {
|
||||||
if _, _, err := cli.Head(object); err != nil {
|
if _, err := cli.Head(object); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
req := cli.s3.DeleteObjectRequest(&s3.DeleteObjectInput{
|
_, err := cli.s3.DeleteObject(cli.GetContext(), &sdksss.DeleteObjectInput{
|
||||||
Bucket: cli.GetBucketAws(),
|
Bucket: cli.GetBucketAws(),
|
||||||
Key: aws.String(object),
|
Key: sdkaws.String(object),
|
||||||
})
|
})
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
@@ -9,28 +9,26 @@ import (
|
|||||||
|
|
||||||
var _ = Describe("Object", func() {
|
var _ = Describe("Object", func() {
|
||||||
Context("List objects", func() {
|
Context("List objects", func() {
|
||||||
It("Must fail with invalid token", func() {
|
It("Must fail with invalid token -1 ", func() {
|
||||||
_, _, _, err := cli.Object().List("token")
|
_, _, _, err := cli.Object().List("token")
|
||||||
Expect(err).To(HaveOccurred())
|
Expect(err).To(HaveOccurred())
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
Context("Put object", func() {
|
Context("Put object", func() {
|
||||||
It("Must fail as the bucket doesn't exists", func() {
|
It("Must fail as the bucket doesn't exists - 2", func() {
|
||||||
err := cli.Object().Put("object", bytes.NewReader([]byte("")))
|
err := cli.Object().Put("object", bytes.NewReader([]byte("")))
|
||||||
Expect(err).To(HaveOccurred())
|
Expect(err).To(HaveOccurred())
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
Context("Get object", func() {
|
Context("Get object", func() {
|
||||||
It("Must fail as the bucket doesn't exists", func() {
|
It("Must fail as the bucket doesn't exists - 3", func() {
|
||||||
_, c, err := cli.Object().Get("object")
|
o, err := cli.Object().Get("object")
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
for _, s := range c {
|
if o != nil && o.Body != nil {
|
||||||
if s != nil {
|
_ = o.Body.Close()
|
||||||
_ = s.Close()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@@ -39,21 +37,21 @@ var _ = Describe("Object", func() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
Context("Delete object", func() {
|
Context("Delete object", func() {
|
||||||
It("Must fail as the object doesn't exists", func() {
|
It("Must fail as the object doesn't exists - 4", func() {
|
||||||
err := cli.Object().Delete("object")
|
err := cli.Object().Delete("object")
|
||||||
Expect(err).To(HaveOccurred())
|
Expect(err).To(HaveOccurred())
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
Context("Multipart Put object", func() {
|
Context("Multipart Put object", func() {
|
||||||
It("Must fail as the bucket doesn't exists", func() {
|
It("Must fail as the bucket doesn't exists - 5", func() {
|
||||||
err := cli.Object().MultipartPut("object", bytes.NewReader([]byte("")))
|
err := cli.Object().MultipartPut("object", randContent(4*1024))
|
||||||
Expect(err).To(HaveOccurred())
|
Expect(err).To(HaveOccurred())
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
Context("Delete object", func() {
|
Context("Delete object", func() {
|
||||||
It("Must fail as the object doesn't exists", func() {
|
It("Must fail as the object doesn't exists - 6", func() {
|
||||||
err := cli.Object().Delete("object")
|
err := cli.Object().Delete("object")
|
||||||
Expect(err).To(HaveOccurred())
|
Expect(err).To(HaveOccurred())
|
||||||
})
|
})
|
||||||
|
@@ -7,10 +7,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (cli *client) List() (map[string]string, errors.Error) {
|
func (cli *client) List() (map[string]string, errors.Error) {
|
||||||
req := cli.iam.ListPoliciesRequest(&iam.ListPoliciesInput{})
|
out, err := cli.iam.ListPolicies(cli.GetContext(), &iam.ListPoliciesInput{})
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, cli.GetError(err)
|
return nil, cli.GetError(err)
|
||||||
@@ -26,15 +23,12 @@ func (cli *client) List() (map[string]string, errors.Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Add(name, desc, policy string) (string, errors.Error) {
|
func (cli *client) Add(name, desc, policy string) (string, errors.Error) {
|
||||||
req := cli.iam.CreatePolicyRequest(&iam.CreatePolicyInput{
|
out, err := cli.iam.CreatePolicy(cli.GetContext(), &iam.CreatePolicyInput{
|
||||||
PolicyName: aws.String(name),
|
PolicyName: aws.String(name),
|
||||||
Description: aws.String(desc),
|
Description: aws.String(desc),
|
||||||
PolicyDocument: aws.String(policy),
|
PolicyDocument: aws.String(policy),
|
||||||
})
|
})
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", cli.GetError(err)
|
return "", cli.GetError(err)
|
||||||
} else {
|
} else {
|
||||||
@@ -43,13 +37,10 @@ func (cli *client) Add(name, desc, policy string) (string, errors.Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Update(polArn, polContents string) errors.Error {
|
func (cli *client) Update(polArn, polContents string) errors.Error {
|
||||||
req := cli.iam.ListPolicyVersionsRequest(&iam.ListPolicyVersionsInput{
|
out, err := cli.iam.ListPolicyVersions(cli.GetContext(), &iam.ListPolicyVersionsInput{
|
||||||
PolicyArn: aws.String(polArn),
|
PolicyArn: aws.String(polArn),
|
||||||
})
|
})
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
} else {
|
} else {
|
||||||
@@ -59,44 +50,32 @@ func (cli *client) Update(polArn, polContents string) errors.Error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !*v.IsDefaultVersion {
|
if !*v.IsDefaultVersion {
|
||||||
reqD := cli.iam.DeletePolicyVersionRequest(&iam.DeletePolicyVersionInput{
|
_, _ = cli.iam.DeletePolicyVersion(cli.GetContext(), &iam.DeletePolicyVersionInput{
|
||||||
PolicyArn: aws.String(polArn),
|
PolicyArn: aws.String(polArn),
|
||||||
VersionId: v.VersionId,
|
VersionId: v.VersionId,
|
||||||
})
|
})
|
||||||
|
|
||||||
if o, e := reqD.Send(cli.GetContext()); e != nil {
|
|
||||||
continue
|
|
||||||
} else if o == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reqG := cli.iam.CreatePolicyVersionRequest(&iam.CreatePolicyVersionInput{
|
if cli.GetContext().Err() != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = cli.iam.CreatePolicyVersion(cli.GetContext(), &iam.CreatePolicyVersionInput{
|
||||||
PolicyArn: aws.String(polArn),
|
PolicyArn: aws.String(polArn),
|
||||||
PolicyDocument: aws.String(polContents),
|
PolicyDocument: aws.String(polContents),
|
||||||
SetAsDefault: aws.Bool(true),
|
SetAsDefault: aws.Bool(true),
|
||||||
})
|
})
|
||||||
|
|
||||||
if cli.GetContext().Err() != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = reqG.Send(cli.GetContext())
|
|
||||||
defer cli.Close(reqG.HTTPRequest, reqG.HTTPResponse)
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Delete(polArn string) errors.Error {
|
func (cli *client) Delete(polArn string) errors.Error {
|
||||||
req := cli.iam.ListPolicyVersionsRequest(&iam.ListPolicyVersionsInput{
|
out, err := cli.iam.ListPolicyVersions(cli.GetContext(), &iam.ListPolicyVersionsInput{
|
||||||
PolicyArn: aws.String(polArn),
|
PolicyArn: aws.String(polArn),
|
||||||
})
|
})
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
} else {
|
} else {
|
||||||
@@ -106,16 +85,10 @@ func (cli *client) Delete(polArn string) errors.Error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !*v.IsDefaultVersion {
|
if !*v.IsDefaultVersion {
|
||||||
reqD := cli.iam.DeletePolicyVersionRequest(&iam.DeletePolicyVersionInput{
|
_, _ = cli.iam.DeletePolicyVersion(cli.GetContext(), &iam.DeletePolicyVersionInput{
|
||||||
PolicyArn: aws.String(polArn),
|
PolicyArn: aws.String(polArn),
|
||||||
VersionId: v.VersionId,
|
VersionId: v.VersionId,
|
||||||
})
|
})
|
||||||
|
|
||||||
if o, e := reqD.Send(cli.GetContext()); e != nil {
|
|
||||||
continue
|
|
||||||
} else if o == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -124,12 +97,9 @@ func (cli *client) Delete(polArn string) errors.Error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
reqG := cli.iam.DeletePolicyRequest(&iam.DeletePolicyInput{
|
_, err = cli.iam.DeletePolicy(cli.GetContext(), &iam.DeletePolicyInput{
|
||||||
PolicyArn: aws.String(polArn),
|
PolicyArn: aws.String(polArn),
|
||||||
})
|
})
|
||||||
|
|
||||||
_, err = reqG.Send(cli.GetContext())
|
|
||||||
defer cli.Close(reqG.HTTPRequest, reqG.HTTPResponse)
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
@@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/service/iam"
|
"github.com/aws/aws-sdk-go-v2/service/iam"
|
||||||
|
"github.com/aws/aws-sdk-go-v2/service/iam/types"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
"github.com/aws/aws-sdk-go-v2/service/s3"
|
||||||
"github.com/nabbar/golib/aws/helper"
|
"github.com/nabbar/golib/aws/helper"
|
||||||
"github.com/nabbar/golib/errors"
|
"github.com/nabbar/golib/errors"
|
||||||
@@ -16,7 +17,7 @@ type client struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Role interface {
|
type Role interface {
|
||||||
List() ([]iam.Role, errors.Error)
|
List() ([]*types.Role, errors.Error)
|
||||||
Check(name string) (string, errors.Error)
|
Check(name string) (string, errors.Error)
|
||||||
Add(name, role string) (string, errors.Error)
|
Add(name, role string) (string, errors.Error)
|
||||||
Delete(roleName string) errors.Error
|
Delete(roleName string) errors.Error
|
||||||
@@ -24,7 +25,7 @@ type Role interface {
|
|||||||
PolicyAttach(policyARN, roleName string) errors.Error
|
PolicyAttach(policyARN, roleName string) errors.Error
|
||||||
PolicyDetach(policyARN, roleName string) errors.Error
|
PolicyDetach(policyARN, roleName string) errors.Error
|
||||||
|
|
||||||
PolicyListAttached(roleName string) ([]iam.AttachedPolicy, errors.Error)
|
PolicyListAttached(roleName string) ([]*types.AttachedPolicy, errors.Error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(ctx context.Context, bucket string, iam *iam.Client, s3 *s3.Client) Role {
|
func New(ctx context.Context, bucket string, iam *iam.Client, s3 *s3.Client) Role {
|
||||||
|
@@ -3,17 +3,15 @@ package role
|
|||||||
import (
|
import (
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
"github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/iam"
|
"github.com/aws/aws-sdk-go-v2/service/iam"
|
||||||
|
"github.com/aws/aws-sdk-go-v2/service/iam/types"
|
||||||
"github.com/nabbar/golib/errors"
|
"github.com/nabbar/golib/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (cli *client) PolicyListAttached(roleName string) ([]iam.AttachedPolicy, errors.Error) {
|
func (cli *client) PolicyListAttached(roleName string) ([]*types.AttachedPolicy, errors.Error) {
|
||||||
req := cli.iam.ListAttachedRolePoliciesRequest(&iam.ListAttachedRolePoliciesInput{
|
out, err := cli.iam.ListAttachedRolePolicies(cli.GetContext(), &iam.ListAttachedRolePoliciesInput{
|
||||||
RoleName: aws.String(roleName),
|
RoleName: aws.String(roleName),
|
||||||
})
|
})
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, cli.GetError(err)
|
return nil, cli.GetError(err)
|
||||||
} else {
|
} else {
|
||||||
@@ -22,25 +20,19 @@ func (cli *client) PolicyListAttached(roleName string) ([]iam.AttachedPolicy, er
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) PolicyAttach(policyARN, roleName string) errors.Error {
|
func (cli *client) PolicyAttach(policyARN, roleName string) errors.Error {
|
||||||
req := cli.iam.AttachRolePolicyRequest(&iam.AttachRolePolicyInput{
|
_, err := cli.iam.AttachRolePolicy(cli.GetContext(), &iam.AttachRolePolicyInput{
|
||||||
PolicyArn: aws.String(policyARN),
|
PolicyArn: aws.String(policyARN),
|
||||||
RoleName: aws.String(roleName),
|
RoleName: aws.String(roleName),
|
||||||
})
|
})
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) PolicyDetach(policyARN, roleName string) errors.Error {
|
func (cli *client) PolicyDetach(policyARN, roleName string) errors.Error {
|
||||||
req := cli.iam.DetachRolePolicyRequest(&iam.DetachRolePolicyInput{
|
_, err := cli.iam.DetachRolePolicy(cli.GetContext(), &iam.DetachRolePolicyInput{
|
||||||
PolicyArn: aws.String(policyARN),
|
PolicyArn: aws.String(policyARN),
|
||||||
RoleName: aws.String(roleName),
|
RoleName: aws.String(roleName),
|
||||||
})
|
})
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
@@ -3,14 +3,12 @@ package role
|
|||||||
import (
|
import (
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
"github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/iam"
|
"github.com/aws/aws-sdk-go-v2/service/iam"
|
||||||
|
"github.com/aws/aws-sdk-go-v2/service/iam/types"
|
||||||
"github.com/nabbar/golib/errors"
|
"github.com/nabbar/golib/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (cli *client) List() ([]iam.Role, errors.Error) {
|
func (cli *client) List() ([]*types.Role, errors.Error) {
|
||||||
req := cli.iam.ListRolesRequest(&iam.ListRolesInput{})
|
out, err := cli.iam.ListRoles(cli.GetContext(), &iam.ListRolesInput{})
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, cli.GetError(err)
|
return nil, cli.GetError(err)
|
||||||
@@ -20,13 +18,10 @@ func (cli *client) List() ([]iam.Role, errors.Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Check(name string) (string, errors.Error) {
|
func (cli *client) Check(name string) (string, errors.Error) {
|
||||||
req := cli.iam.GetRoleRequest(&iam.GetRoleInput{
|
out, err := cli.iam.GetRole(cli.GetContext(), &iam.GetRoleInput{
|
||||||
RoleName: aws.String(name),
|
RoleName: aws.String(name),
|
||||||
})
|
})
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", cli.GetError(err)
|
return "", cli.GetError(err)
|
||||||
}
|
}
|
||||||
@@ -35,14 +30,11 @@ func (cli *client) Check(name string) (string, errors.Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Add(name, role string) (string, errors.Error) {
|
func (cli *client) Add(name, role string) (string, errors.Error) {
|
||||||
req := cli.iam.CreateRoleRequest(&iam.CreateRoleInput{
|
out, err := cli.iam.CreateRole(cli.GetContext(), &iam.CreateRoleInput{
|
||||||
AssumeRolePolicyDocument: aws.String(role),
|
AssumeRolePolicyDocument: aws.String(role),
|
||||||
RoleName: aws.String(name),
|
RoleName: aws.String(name),
|
||||||
})
|
})
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", cli.GetError(err)
|
return "", cli.GetError(err)
|
||||||
} else {
|
} else {
|
||||||
@@ -51,12 +43,9 @@ func (cli *client) Add(name, role string) (string, errors.Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Delete(roleName string) errors.Error {
|
func (cli *client) Delete(roleName string) errors.Error {
|
||||||
req := cli.iam.DeleteRoleRequest(&iam.DeleteRoleInput{
|
_, err := cli.iam.DeleteRole(cli.GetContext(), &iam.DeleteRoleInput{
|
||||||
RoleName: aws.String(roleName),
|
RoleName: aws.String(roleName),
|
||||||
})
|
})
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
@@ -2,7 +2,7 @@ package aws_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
"github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/iam"
|
"github.com/aws/aws-sdk-go-v2/service/iam/types"
|
||||||
. "github.com/onsi/ginkgo"
|
. "github.com/onsi/ginkgo"
|
||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
)
|
)
|
||||||
@@ -68,11 +68,11 @@ var _ = Describe("Role", func() {
|
|||||||
Expect(err).To(HaveOccurred())
|
Expect(err).To(HaveOccurred())
|
||||||
})
|
})
|
||||||
It("Must return 1 policy", func() {
|
It("Must return 1 policy", func() {
|
||||||
var policies []iam.AttachedPolicy
|
var policies []*types.AttachedPolicy
|
||||||
|
|
||||||
if minioMode {
|
if minioMode {
|
||||||
err = nil
|
err = nil
|
||||||
policies = []iam.AttachedPolicy{
|
policies = []*types.AttachedPolicy{
|
||||||
{
|
{
|
||||||
PolicyArn: aws.String(policyArn),
|
PolicyArn: aws.String(policyArn),
|
||||||
PolicyName: aws.String(name),
|
PolicyName: aws.String(name),
|
||||||
@@ -137,11 +137,11 @@ var _ = Describe("Role", func() {
|
|||||||
})
|
})
|
||||||
Context("List", func() {
|
Context("List", func() {
|
||||||
It("Must return 1 role", func() {
|
It("Must return 1 role", func() {
|
||||||
var roles []iam.Role
|
var roles []*types.Role
|
||||||
|
|
||||||
if minioMode {
|
if minioMode {
|
||||||
err = nil
|
err = nil
|
||||||
roles = []iam.Role{
|
roles = []*types.Role{
|
||||||
{
|
{
|
||||||
Arn: aws.String(arn),
|
Arn: aws.String(arn),
|
||||||
RoleName: aws.String(name),
|
RoleName: aws.String(name),
|
||||||
|
@@ -3,23 +3,21 @@ package user
|
|||||||
import (
|
import (
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
"github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/iam"
|
"github.com/aws/aws-sdk-go-v2/service/iam"
|
||||||
|
"github.com/aws/aws-sdk-go-v2/service/iam/types"
|
||||||
"github.com/nabbar/golib/aws/helper"
|
"github.com/nabbar/golib/aws/helper"
|
||||||
"github.com/nabbar/golib/errors"
|
"github.com/nabbar/golib/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (cli *client) AccessList(username string) (map[string]bool, errors.Error) {
|
func (cli *client) AccessList(username string) (map[string]bool, errors.Error) {
|
||||||
var req iam.ListAccessKeysRequest
|
var req = &iam.ListAccessKeysInput{}
|
||||||
|
|
||||||
if username != "" {
|
if username != "" {
|
||||||
req = cli.iam.ListAccessKeysRequest(&iam.ListAccessKeysInput{
|
req = &iam.ListAccessKeysInput{
|
||||||
UserName: aws.String(username),
|
UserName: aws.String(username),
|
||||||
})
|
}
|
||||||
} else {
|
|
||||||
req = cli.iam.ListAccessKeysRequest(&iam.ListAccessKeysInput{})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
out, err := cli.iam.ListAccessKeys(cli.GetContext(), req)
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, cli.GetError(err)
|
return nil, cli.GetError(err)
|
||||||
@@ -30,9 +28,9 @@ func (cli *client) AccessList(username string) (map[string]bool, errors.Error) {
|
|||||||
|
|
||||||
for _, a := range out.AccessKeyMetadata {
|
for _, a := range out.AccessKeyMetadata {
|
||||||
switch a.Status {
|
switch a.Status {
|
||||||
case iam.StatusTypeActive:
|
case types.StatusTypeActive:
|
||||||
res[*a.AccessKeyId] = true
|
res[*a.AccessKeyId] = true
|
||||||
case iam.StatusTypeInactive:
|
case types.StatusTypeInactive:
|
||||||
res[*a.AccessKeyId] = false
|
res[*a.AccessKeyId] = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -42,18 +40,15 @@ func (cli *client) AccessList(username string) (map[string]bool, errors.Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) AccessCreate(username string) (string, string, errors.Error) {
|
func (cli *client) AccessCreate(username string) (string, string, errors.Error) {
|
||||||
var req iam.CreateAccessKeyRequest
|
var req = &iam.CreateAccessKeyInput{}
|
||||||
|
|
||||||
if username != "" {
|
if username != "" {
|
||||||
req = cli.iam.CreateAccessKeyRequest(&iam.CreateAccessKeyInput{
|
req = &iam.CreateAccessKeyInput{
|
||||||
UserName: aws.String(username),
|
UserName: aws.String(username),
|
||||||
})
|
}
|
||||||
} else {
|
|
||||||
req = cli.iam.CreateAccessKeyRequest(&iam.CreateAccessKeyInput{})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
out, err := cli.iam.CreateAccessKey(cli.GetContext(), req)
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", cli.GetError(err)
|
return "", "", cli.GetError(err)
|
||||||
@@ -65,21 +60,18 @@ func (cli *client) AccessCreate(username string) (string, string, errors.Error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) AccessDelete(username, accessKey string) errors.Error {
|
func (cli *client) AccessDelete(username, accessKey string) errors.Error {
|
||||||
var req iam.DeleteAccessKeyRequest
|
var req = &iam.DeleteAccessKeyInput{
|
||||||
|
|
||||||
if username != "" {
|
|
||||||
req = cli.iam.DeleteAccessKeyRequest(&iam.DeleteAccessKeyInput{
|
|
||||||
AccessKeyId: aws.String(accessKey),
|
AccessKeyId: aws.String(accessKey),
|
||||||
UserName: aws.String(username),
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
req = cli.iam.DeleteAccessKeyRequest(&iam.DeleteAccessKeyInput{
|
|
||||||
AccessKeyId: aws.String(accessKey),
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
if username != "" {
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
req = &iam.DeleteAccessKeyInput{
|
||||||
|
AccessKeyId: aws.String(accessKey),
|
||||||
|
UserName: aws.String(username),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := cli.iam.DeleteAccessKey(cli.GetContext(), req)
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
@@ -3,39 +3,40 @@ package user
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/service/iam"
|
sdkiam "github.com/aws/aws-sdk-go-v2/service/iam"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
sdkitp "github.com/aws/aws-sdk-go-v2/service/iam/types"
|
||||||
"github.com/nabbar/golib/aws/helper"
|
sdksss "github.com/aws/aws-sdk-go-v2/service/s3"
|
||||||
"github.com/nabbar/golib/errors"
|
libhlp "github.com/nabbar/golib/aws/helper"
|
||||||
|
liberr "github.com/nabbar/golib/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
type client struct {
|
type client struct {
|
||||||
helper.Helper
|
libhlp.Helper
|
||||||
iam *iam.Client
|
iam *sdkiam.Client
|
||||||
s3 *s3.Client
|
s3 *sdksss.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
type User interface {
|
type User interface {
|
||||||
List() (map[string]string, errors.Error)
|
List() (map[string]string, liberr.Error)
|
||||||
Get(username string) (*iam.User, errors.Error)
|
Get(username string) (*sdkitp.User, liberr.Error)
|
||||||
Create(username string) errors.Error
|
Create(username string) liberr.Error
|
||||||
Delete(username string) errors.Error
|
Delete(username string) liberr.Error
|
||||||
|
|
||||||
PolicyPut(policyDocument, policyName, username string) errors.Error
|
PolicyPut(policyDocument, policyName, username string) liberr.Error
|
||||||
PolicyAttach(policyARN, username string) errors.Error
|
PolicyAttach(policyARN, username string) liberr.Error
|
||||||
|
|
||||||
LoginCheck(username string) errors.Error
|
LoginCheck(username string) liberr.Error
|
||||||
LoginCreate(username, password string) errors.Error
|
LoginCreate(username, password string) liberr.Error
|
||||||
LoginDelete(username string) errors.Error
|
LoginDelete(username string) liberr.Error
|
||||||
|
|
||||||
AccessList(username string) (map[string]bool, errors.Error)
|
AccessList(username string) (map[string]bool, liberr.Error)
|
||||||
AccessCreate(username string) (string, string, errors.Error)
|
AccessCreate(username string) (string, string, liberr.Error)
|
||||||
AccessDelete(username, accessKey string) errors.Error
|
AccessDelete(username, accessKey string) liberr.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(ctx context.Context, bucket string, iam *iam.Client, s3 *s3.Client) User {
|
func New(ctx context.Context, bucket string, iam *sdkiam.Client, s3 *sdksss.Client) User {
|
||||||
return &client{
|
return &client{
|
||||||
Helper: helper.New(ctx, bucket),
|
Helper: libhlp.New(ctx, bucket),
|
||||||
iam: iam,
|
iam: iam,
|
||||||
s3: s3,
|
s3: s3,
|
||||||
}
|
}
|
||||||
|
@@ -8,26 +8,20 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (cli *client) LoginCheck(username string) errors.Error {
|
func (cli *client) LoginCheck(username string) errors.Error {
|
||||||
req := cli.iam.GetLoginProfileRequest(&iam.GetLoginProfileInput{
|
_, err := cli.iam.GetLoginProfile(cli.GetContext(), &iam.GetLoginProfileInput{
|
||||||
UserName: aws.String(username),
|
UserName: aws.String(username),
|
||||||
})
|
})
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) LoginCreate(username, password string) errors.Error {
|
func (cli *client) LoginCreate(username, password string) errors.Error {
|
||||||
req := cli.iam.CreateLoginProfileRequest(&iam.CreateLoginProfileInput{
|
out, err := cli.iam.CreateLoginProfile(cli.GetContext(), &iam.CreateLoginProfileInput{
|
||||||
UserName: aws.String(username),
|
UserName: aws.String(username),
|
||||||
Password: aws.String(password),
|
Password: aws.String(password),
|
||||||
PasswordResetRequired: aws.Bool(false),
|
PasswordResetRequired: aws.Bool(false),
|
||||||
})
|
})
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
} else if out.LoginProfile == nil {
|
} else if out.LoginProfile == nil {
|
||||||
@@ -38,12 +32,9 @@ func (cli *client) LoginCreate(username, password string) errors.Error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) LoginDelete(username string) errors.Error {
|
func (cli *client) LoginDelete(username string) errors.Error {
|
||||||
req := cli.iam.DeleteLoginProfileRequest(&iam.DeleteLoginProfileInput{
|
_, err := cli.iam.DeleteLoginProfile(cli.GetContext(), &iam.DeleteLoginProfileInput{
|
||||||
UserName: aws.String(username),
|
UserName: aws.String(username),
|
||||||
})
|
})
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
@@ -7,26 +7,20 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (cli *client) PolicyPut(policyDocument, policyName, username string) errors.Error {
|
func (cli *client) PolicyPut(policyDocument, policyName, username string) errors.Error {
|
||||||
req := cli.iam.PutUserPolicyRequest(&iam.PutUserPolicyInput{
|
_, err := cli.iam.PutUserPolicy(cli.GetContext(), &iam.PutUserPolicyInput{
|
||||||
PolicyDocument: aws.String(policyDocument),
|
PolicyDocument: aws.String(policyDocument),
|
||||||
PolicyName: aws.String(policyName),
|
PolicyName: aws.String(policyName),
|
||||||
UserName: aws.String(username),
|
UserName: aws.String(username),
|
||||||
})
|
})
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) PolicyAttach(policyARN, username string) errors.Error {
|
func (cli *client) PolicyAttach(policyARN, username string) errors.Error {
|
||||||
req := cli.iam.AttachUserPolicyRequest(&iam.AttachUserPolicyInput{
|
_, err := cli.iam.AttachUserPolicy(cli.GetContext(), &iam.AttachUserPolicyInput{
|
||||||
PolicyArn: aws.String(policyARN),
|
PolicyArn: aws.String(policyARN),
|
||||||
UserName: aws.String(username),
|
UserName: aws.String(username),
|
||||||
})
|
})
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
@@ -3,15 +3,13 @@ package user
|
|||||||
import (
|
import (
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
"github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/iam"
|
"github.com/aws/aws-sdk-go-v2/service/iam"
|
||||||
|
"github.com/aws/aws-sdk-go-v2/service/iam/types"
|
||||||
"github.com/nabbar/golib/aws/helper"
|
"github.com/nabbar/golib/aws/helper"
|
||||||
"github.com/nabbar/golib/errors"
|
"github.com/nabbar/golib/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (cli *client) List() (map[string]string, errors.Error) {
|
func (cli *client) List() (map[string]string, errors.Error) {
|
||||||
req := cli.iam.ListUsersRequest(&iam.ListUsersInput{})
|
out, err := cli.iam.ListUsers(cli.GetContext(), &iam.ListUsersInput{})
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, cli.GetError(err)
|
return nil, cli.GetError(err)
|
||||||
@@ -28,14 +26,11 @@ func (cli *client) List() (map[string]string, errors.Error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Get(username string) (*iam.User, errors.Error) {
|
func (cli *client) Get(username string) (*types.User, errors.Error) {
|
||||||
req := cli.iam.GetUserRequest(&iam.GetUserInput{
|
out, err := cli.iam.GetUser(cli.GetContext(), &iam.GetUserInput{
|
||||||
UserName: aws.String(username),
|
UserName: aws.String(username),
|
||||||
})
|
})
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, cli.GetError(err)
|
return nil, cli.GetError(err)
|
||||||
}
|
}
|
||||||
@@ -44,13 +39,10 @@ func (cli *client) Get(username string) (*iam.User, errors.Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Create(username string) errors.Error {
|
func (cli *client) Create(username string) errors.Error {
|
||||||
req := cli.iam.CreateUserRequest(&iam.CreateUserInput{
|
out, err := cli.iam.CreateUser(cli.GetContext(), &iam.CreateUserInput{
|
||||||
UserName: aws.String(username),
|
UserName: aws.String(username),
|
||||||
})
|
})
|
||||||
|
|
||||||
out, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
} else if out.User == nil {
|
} else if out.User == nil {
|
||||||
@@ -61,12 +53,9 @@ func (cli *client) Create(username string) errors.Error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cli *client) Delete(username string) errors.Error {
|
func (cli *client) Delete(username string) errors.Error {
|
||||||
req := cli.iam.DeleteUserRequest(&iam.DeleteUserInput{
|
_, err := cli.iam.DeleteUser(cli.GetContext(), &iam.DeleteUserInput{
|
||||||
UserName: aws.String(username),
|
UserName: aws.String(username),
|
||||||
})
|
})
|
||||||
|
|
||||||
_, err := req.Send(cli.GetContext())
|
|
||||||
defer cli.Close(req.HTTPRequest, req.HTTPResponse)
|
|
||||||
|
|
||||||
return cli.GetError(err)
|
return cli.GetError(err)
|
||||||
}
|
}
|
||||||
|
@@ -2,7 +2,7 @@ package aws_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
"github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/iam"
|
"github.com/aws/aws-sdk-go-v2/service/iam/types"
|
||||||
"github.com/nabbar/golib/password"
|
"github.com/nabbar/golib/password"
|
||||||
. "github.com/onsi/ginkgo"
|
. "github.com/onsi/ginkgo"
|
||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
@@ -34,11 +34,11 @@ var _ = Describe("User", func() {
|
|||||||
})
|
})
|
||||||
Context("Get", func() {
|
Context("Get", func() {
|
||||||
It("Must succeed", func() {
|
It("Must succeed", func() {
|
||||||
var user *iam.User
|
var user *types.User
|
||||||
|
|
||||||
if minioMode {
|
if minioMode {
|
||||||
err = nil
|
err = nil
|
||||||
user = &iam.User{
|
user = &types.User{
|
||||||
UserName: aws.String(username),
|
UserName: aws.String(username),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
17
go.mod
17
go.mod
@@ -4,12 +4,17 @@ go 1.15
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
|
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
|
||||||
github.com/aws/aws-sdk-go-v2 v0.24.0
|
github.com/aws/aws-sdk-go-v2 v0.26.0
|
||||||
|
github.com/aws/aws-sdk-go-v2/config v0.1.1
|
||||||
|
github.com/aws/aws-sdk-go-v2/credentials v0.1.1
|
||||||
|
github.com/aws/aws-sdk-go-v2/service/iam v0.26.0
|
||||||
|
github.com/aws/aws-sdk-go-v2/service/s3 v0.26.0
|
||||||
github.com/fatih/color v1.9.0
|
github.com/fatih/color v1.9.0
|
||||||
github.com/gin-gonic/gin v1.6.3
|
github.com/gin-gonic/gin v1.6.3
|
||||||
github.com/go-ldap/ldap/v3 v3.2.3
|
github.com/go-ldap/ldap/v3 v3.2.3
|
||||||
github.com/go-ole/go-ole v1.2.4 // indirect
|
github.com/go-ole/go-ole v1.2.4 // indirect
|
||||||
github.com/go-playground/validator/v10 v10.4.0
|
github.com/go-playground/validator/v10 v10.4.0
|
||||||
|
github.com/go-sql-driver/mysql v1.5.0 // indirect
|
||||||
github.com/gobuffalo/envy v1.9.0 // indirect
|
github.com/gobuffalo/envy v1.9.0 // indirect
|
||||||
github.com/gobuffalo/packd v1.0.0 // indirect
|
github.com/gobuffalo/packd v1.0.0 // indirect
|
||||||
github.com/gobuffalo/packr v1.30.1
|
github.com/gobuffalo/packr v1.30.1
|
||||||
@@ -28,7 +33,7 @@ require (
|
|||||||
github.com/onsi/ginkgo v1.14.1
|
github.com/onsi/ginkgo v1.14.1
|
||||||
github.com/onsi/gomega v1.10.2
|
github.com/onsi/gomega v1.10.2
|
||||||
github.com/rogpeppe/go-internal v1.6.2 // indirect
|
github.com/rogpeppe/go-internal v1.6.2 // indirect
|
||||||
github.com/shirou/gopsutil v2.20.8+incompatible
|
github.com/shirou/gopsutil v2.20.9+incompatible
|
||||||
github.com/sirupsen/logrus v1.7.0
|
github.com/sirupsen/logrus v1.7.0
|
||||||
github.com/spf13/jwalterweatherman v1.1.0
|
github.com/spf13/jwalterweatherman v1.1.0
|
||||||
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect
|
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect
|
||||||
@@ -36,11 +41,11 @@ require (
|
|||||||
github.com/ugorji/go v1.1.9 // indirect
|
github.com/ugorji/go v1.1.9 // indirect
|
||||||
github.com/vbauerster/mpb/v5 v5.3.0
|
github.com/vbauerster/mpb/v5 v5.3.0
|
||||||
github.com/xanzy/go-gitlab v0.38.1
|
github.com/xanzy/go-gitlab v0.38.1
|
||||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a
|
golang.org/x/crypto v0.0.0-20201001193750-eb9a90e9f9cb
|
||||||
golang.org/x/net v0.0.0-20200927032502-5d4f70055728
|
golang.org/x/net v0.0.0-20200930145003-4acb6c075d10
|
||||||
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43
|
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43
|
||||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208
|
golang.org/x/sync v0.0.0-20200930132711-30421366ff76
|
||||||
golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c // indirect
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f // indirect
|
||||||
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect
|
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect
|
||||||
gopkg.in/yaml.v2 v2.3.0 // indirect
|
gopkg.in/yaml.v2 v2.3.0 // indirect
|
||||||
)
|
)
|
||||||
|
Reference in New Issue
Block a user