Skip to content

Commit

Permalink
Migrate to aws-sdk-go-v2 (#286)
Browse files Browse the repository at this point in the history
* Pass context to Presigner
* Update at-wat/mqtt-go to v0.14.0
* Add migration guide
  • Loading branch information
at-wat authored Jul 2, 2021
1 parent f4ca396 commit 3c90fde
Show file tree
Hide file tree
Showing 16 changed files with 329 additions and 160 deletions.
35 changes: 35 additions & 0 deletions MIGRATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Migration guide

## v6

- aws/aws-sdk-go is updated to aws/aws-sdk-go-v2
- 🔄Update presign dialer constructor argument:
```diff
-sess, err := session.NewSession()
+cfg, err := config.LoadDefaultConfig(ctx)
if err != nil {
// error handling
}
-dialer, err := awsiotdev.NewPresignDialer(sess, endpoint)
+dialer, err := awsiotdev.NewPresignDialer(cfg, endpoint)
```
- 🔄If you want to use aws/aws-sdk-go (v1), with aws-iot-device-sdk-go v6:
```go
import (
"github.com/at-wat/mqtt-go"
"github.com/aws/aws-sdk-go/aws/session"

awsiotdev_v5 "github.com/seqsense/aws-iot-device-sdk-go/v5"
awsiotdev "github.com/seqsense/aws-iot-device-sdk-go/v6"
)

sess := session.Must(session.NewSession())
dialer, err := awsiotdev_v5.NewPresignDialer(sess, endpoint)
if err != nil {
// error handling
}

d, err := awsiotdev.New(thingName, &mqtt.NoContextDialer{dialer})
```
- at-wat/mqtt-go is updated to v0.14
- 🔄See https://github.com/at-wat/mqtt-go/blob/master/MIGRATION.md#v0140
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ Implemented features:
- Jobs
- Secure tunneling

## Migration guide

- [v6](MIGRATION.md#v6)

## Contributing

Your contributions like bug reports, bug fixes, feature requests and implementing new features are welcome.
Expand Down
3 changes: 2 additions & 1 deletion awsiotdev_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,15 @@
package awsiotdev

import (
"context"
"testing"

"github.com/at-wat/mqtt-go"
)

func TestNew(t *testing.T) {
const name = "thing_name1"
d, err := New(name, mqtt.DialerFunc(func() (*mqtt.BaseClient, error) {
d, err := New(name, mqtt.DialerFunc(func(ctx context.Context) (*mqtt.BaseClient, error) {
return &mqtt.BaseClient{}, nil
}))
if err != nil {
Expand Down
17 changes: 9 additions & 8 deletions dialer.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@
package awsiotdev

import (
"context"
"net/url"

"github.com/aws/aws-sdk-go/aws/client"
"github.com/aws/aws-sdk-go-v2/aws"

"github.com/at-wat/mqtt-go"

Expand All @@ -32,20 +33,20 @@ type presignDialer struct {
}

// NewPresignDialer returns WebSockets Dialer with AWS v4 presigned URL.
func NewPresignDialer(sess client.ConfigProvider, endpoint string, opts ...mqtt.DialOption) (mqtt.Dialer, error) {
func NewPresignDialer(cfg aws.Config, endpoint string, opts ...mqtt.DialOption) (mqtt.Dialer, error) {
return &presignDialer{
signer: presigner.New(sess),
signer: presigner.New(cfg),
endpoint: endpoint,
opts: opts,
}, nil
}

func (d *presignDialer) Dial() (*mqtt.BaseClient, error) {
url, err := d.signer.PresignWssNow(d.endpoint)
func (d *presignDialer) DialContext(ctx context.Context) (*mqtt.BaseClient, error) {
url, err := d.signer.PresignWssNow(ctx, d.endpoint)
if err != nil {
return nil, ioterr.New(err, "presigning wss URL")
}
cli, err := mqtt.Dial(url, d.opts...)
cli, err := mqtt.DialContext(ctx, url, d.opts...)
if err != nil {
return nil, ioterr.New(err, "dialing")
}
Expand All @@ -54,7 +55,7 @@ func (d *presignDialer) Dial() (*mqtt.BaseClient, error) {

// NewDialer creates default dialer for the given URL for AWS IoT.
// Supported protocols are mqtts and wss (with presigned URL).
func NewDialer(sess client.ConfigProvider, urlStr string, opts ...mqtt.DialOption) (mqtt.Dialer, error) {
func NewDialer(cfg aws.Config, urlStr string, opts ...mqtt.DialOption) (mqtt.Dialer, error) {
u, err := url.Parse(urlStr)
if err != nil {
return nil, ioterr.New(err, "parsing server URL")
Expand All @@ -63,7 +64,7 @@ func NewDialer(sess client.ConfigProvider, urlStr string, opts ...mqtt.DialOptio
case "mqtts":
return &mqtt.URLDialer{URL: urlStr, Options: opts}, nil
case "wss":
return NewPresignDialer(sess, u.Host)
return NewPresignDialer(cfg, u.Host)
default:
return nil, ioterr.New(mqtt.ErrUnsupportedProtocol, "new dialer")
}
Expand Down
26 changes: 11 additions & 15 deletions dialer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,20 +36,13 @@ import (
"golang.org/x/net/websocket"

"github.com/at-wat/mqtt-go"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/client"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"

"github.com/seqsense/aws-iot-device-sdk-go/v5/internal/ioterr"
"github.com/seqsense/aws-iot-device-sdk-go/v5/presigner"
)

type dummyConfigProvider struct{}

func (*dummyConfigProvider) ClientConfig(serviceName string, cfgs ...*aws.Config) client.Config {
return client.Config{}
}

func TestNewDialer(t *testing.T) {
t.Run("ValidURL", func(t *testing.T) {
cases := map[string]struct {
Expand All @@ -76,7 +69,7 @@ func TestNewDialer(t *testing.T) {
for name, c := range cases {
c := c
t.Run(name, func(t *testing.T) {
d, err := NewDialer(&dummyConfigProvider{}, c.url)
d, err := NewDialer(aws.Config{}, c.url)
if !errors.Is(err, c.err) {
var ie *ioterr.Error
if !errors.As(err, &ie) {
Expand All @@ -91,7 +84,7 @@ func TestNewDialer(t *testing.T) {
}
})
t.Run("InvalidURL", func(t *testing.T) {
_, err := NewDialer(&dummyConfigProvider{}, ":aaa")
_, err := NewDialer(aws.Config{}, ":aaa")
var ie *ioterr.Error
if !errors.As(err, &ie) {
t.Errorf("Expected error type: %T, actual: %T", ie, err)
Expand All @@ -109,8 +102,11 @@ func TestPresignDialer(t *testing.T) {
os.Setenv("AWS_SECRET_ACCESS_KEY", "1111111111111111111111111111111111111111")
os.Setenv("AWS_REGION", "world-1")

sess := session.Must(session.NewSession())
ps := presigner.New(sess)
cfg, err := config.LoadDefaultConfig(context.TODO())
if err != nil {
t.Fatal(err)
}
ps := presigner.New(cfg)

ln, err := net.Listen("tcp", ":0")
if err != nil {
Expand Down Expand Up @@ -149,15 +145,15 @@ func TestPresignDialer(t *testing.T) {

t.Run("Success", func(t *testing.T) {
chAccept <- true
conn, err := d.Dial()
conn, err := d.DialContext(context.Background())
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
_ = conn.Close()
})
t.Run("Error", func(t *testing.T) {
chAccept <- false
conn, err := d.Dial()
conn, err := d.DialContext(context.Background())
if err == nil {
_ = conn.Close()
t.Fatalf("Dial should fail")
Expand Down
2 changes: 1 addition & 1 deletion examples/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ go 1.16
replace github.com/seqsense/aws-iot-device-sdk-go/v5 => ../

require (
github.com/at-wat/mqtt-go v0.13.1
github.com/at-wat/mqtt-go v0.14.0
github.com/mitchellh/mapstructure v1.4.1
github.com/seqsense/aws-iot-device-sdk-go/v5 v5.0.0-00010101000000-000000000000
)
46 changes: 24 additions & 22 deletions examples/go.sum
Original file line number Diff line number Diff line change
@@ -1,38 +1,41 @@
github.com/at-wat/mqtt-go v0.13.1 h1:cJdZeBoKUmkm3cAmV41sjiIDPmocftP2QxjZpNqLs4M=
github.com/at-wat/mqtt-go v0.13.1/go.mod h1:KFT1ZD+oF1EOj1edKFJ4/AKzjluzc6qEP1EweWaIOEU=
github.com/aws/aws-sdk-go v1.38.68 h1:aOG8geU4SohNp659eKBHRBgbqSrZ6jNZlfimIuJAwL8=
github.com/aws/aws-sdk-go v1.38.68/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
github.com/at-wat/mqtt-go v0.14.0 h1:16OtMOxGpiLR8aIxxj0p9NGu44OCb3NvZojpQIeljXg=
github.com/at-wat/mqtt-go v0.14.0/go.mod h1:CJ14TMAnpCE7N3El+HXHn6ISkHqVt2y92m3R4pfhIAY=
github.com/aws/aws-sdk-go-v2 v1.6.0 h1:r20hdhm8wZmKkClREfacXrKfX0Y7/s0aOoeraFbf/sY=
github.com/aws/aws-sdk-go-v2 v1.6.0/go.mod h1:tI4KhsR5VkzlUa2DZAdwx7wCAYGwkZZ1H31PYrBFx1w=
github.com/aws/aws-sdk-go-v2/config v1.3.0 h1:0JAnp0WcsgKilFLiZEScUTKIvTKa2LkicadZADza+u0=
github.com/aws/aws-sdk-go-v2/config v1.3.0/go.mod h1:lOxzHWDt/k7MMidA/K8DgXL4+ynnZYsDq65Qhs/l3dg=
github.com/aws/aws-sdk-go-v2/credentials v1.2.1 h1:AqQ8PzWll1wegNUOfIKcbp/JspTbJl54gNonrO6VUsY=
github.com/aws/aws-sdk-go-v2/credentials v1.2.1/go.mod h1:Rfvim1eZTC9W5s8YJyYYtl1KMk6e8fHv+wMRQGO4Ru0=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.1.1 h1:w1ocBIhQkLgupEB3d0uOuBddqVYl0xpubz7HSTzWG8A=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.1.1/go.mod h1:GTXAhrxHQOj9N+J5tYVjwt+rpRyy/42qLjlgw9pz1a0=
github.com/aws/aws-sdk-go-v2/internal/ini v1.0.0 h1:k7I9E6tyVWBo7H9ffpnxDWudtjau6Qt9rnOYgV+ciEQ=
github.com/aws/aws-sdk-go-v2/internal/ini v1.0.0/go.mod h1:g3XMXuxvqSMUjnsXXp/960152w0wFS4CXVYgQaSVOHE=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.1.1 h1:l7pDLsmOGrnR8LT+3gIv8NlHpUhs7220E457KEC2UM0=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.1.1/go.mod h1:2+ehJPkdIdl46VCj67Emz/EH2hpebHZtaLdzqg+sWOI=
github.com/aws/aws-sdk-go-v2/service/iotsecuretunneling v1.2.1/go.mod h1:5DB2Y0fmLB01o9HxF651iU0X8iACl0etxPrfe3PmezA=
github.com/aws/aws-sdk-go-v2/service/sso v1.2.1 h1:alpXc5UG7al7QnttHe/9hfvUfitV8r3w0onPpPkGzi0=
github.com/aws/aws-sdk-go-v2/service/sso v1.2.1/go.mod h1:VimPFPltQ/920i1X0Sb0VJBROLIHkDg2MNP10D46OGs=
github.com/aws/aws-sdk-go-v2/service/sts v1.4.1 h1:9Z00tExoaLutWVDmY6LyvIAcKjHetkbdmpRt4JN/FN0=
github.com/aws/aws-sdk-go-v2/service/sts v1.4.1/go.mod h1:G9osDWA52WQ38BDcj65VY1cNmcAQXAXTsE8IWH8j81w=
github.com/aws/smithy-go v1.4.0 h1:3rsQpgRe+OoQgJhEwGNpIkosl0fJLdmQqF4gSFRjg+4=
github.com/aws/smithy-go v1.4.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo=
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q=
golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
Expand All @@ -41,5 +44,4 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
10 changes: 6 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
module github.com/seqsense/aws-iot-device-sdk-go/v5

require (
github.com/at-wat/mqtt-go v0.13.1
github.com/aws/aws-sdk-go v1.38.68
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/at-wat/mqtt-go v0.14.0
github.com/aws/aws-sdk-go-v2 v1.6.0
github.com/aws/aws-sdk-go-v2/config v1.3.0
github.com/aws/aws-sdk-go-v2/credentials v1.2.1
github.com/aws/aws-sdk-go-v2/service/iotsecuretunneling v1.2.1
github.com/google/uuid v1.2.0
golang.org/x/net v0.0.0-20210525063256-abc453219eb5
golang.org/x/net v0.0.0-20210614182718-04defd469f4e
google.golang.org/protobuf v1.27.1
)

Expand Down
Loading

0 comments on commit 3c90fde

Please sign in to comment.