mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-11-02 11:38:02 +00:00
Migrate built in auto seal to go-kms-wrapping (#8118)
This commit is contained in:
2
Makefile
2
Makefile
@@ -195,7 +195,6 @@ proto:
|
|||||||
protoc helper/storagepacker/types.proto --go_out=plugins=grpc,paths=source_relative:.
|
protoc helper/storagepacker/types.proto --go_out=plugins=grpc,paths=source_relative:.
|
||||||
protoc helper/forwarding/types.proto --go_out=plugins=grpc,paths=source_relative:.
|
protoc helper/forwarding/types.proto --go_out=plugins=grpc,paths=source_relative:.
|
||||||
protoc sdk/logical/*.proto --go_out=plugins=grpc,paths=source_relative:.
|
protoc sdk/logical/*.proto --go_out=plugins=grpc,paths=source_relative:.
|
||||||
protoc sdk/physical/types.proto --go_out=plugins=grpc,paths=source_relative:.
|
|
||||||
protoc physical/raft/types.proto --go_out=plugins=grpc,paths=source_relative:.
|
protoc physical/raft/types.proto --go_out=plugins=grpc,paths=source_relative:.
|
||||||
protoc helper/identity/mfa/types.proto --go_out=plugins=grpc,paths=source_relative:.
|
protoc helper/identity/mfa/types.proto --go_out=plugins=grpc,paths=source_relative:.
|
||||||
protoc helper/identity/types.proto --go_out=plugins=grpc,paths=source_relative:.
|
protoc helper/identity/types.proto --go_out=plugins=grpc,paths=source_relative:.
|
||||||
@@ -203,7 +202,6 @@ proto:
|
|||||||
protoc sdk/plugin/pb/*.proto --go_out=plugins=grpc,paths=source_relative:.
|
protoc sdk/plugin/pb/*.proto --go_out=plugins=grpc,paths=source_relative:.
|
||||||
sed -i -e 's/Id/ID/' vault/request_forwarding_service.pb.go
|
sed -i -e 's/Id/ID/' vault/request_forwarding_service.pb.go
|
||||||
sed -i -e 's/Idp/IDP/' -e 's/Url/URL/' -e 's/Id/ID/' -e 's/IDentity/Identity/' -e 's/EntityId/EntityID/' -e 's/Api/API/' -e 's/Qr/QR/' -e 's/Totp/TOTP/' -e 's/Mfa/MFA/' -e 's/Pingid/PingID/' -e 's/protobuf:"/sentinel:"" protobuf:"/' -e 's/namespaceId/namespaceID/' -e 's/Ttl/TTL/' -e 's/BoundCidrs/BoundCIDRs/' helper/identity/types.pb.go helper/identity/mfa/types.pb.go helper/storagepacker/types.pb.go sdk/plugin/pb/backend.pb.go sdk/logical/identity.pb.go
|
sed -i -e 's/Idp/IDP/' -e 's/Url/URL/' -e 's/Id/ID/' -e 's/IDentity/Identity/' -e 's/EntityId/EntityID/' -e 's/Api/API/' -e 's/Qr/QR/' -e 's/Totp/TOTP/' -e 's/Mfa/MFA/' -e 's/Pingid/PingID/' -e 's/protobuf:"/sentinel:"" protobuf:"/' -e 's/namespaceId/namespaceID/' -e 's/Ttl/TTL/' -e 's/BoundCidrs/BoundCIDRs/' helper/identity/types.pb.go helper/identity/mfa/types.pb.go helper/storagepacker/types.pb.go sdk/plugin/pb/backend.pb.go sdk/logical/identity.pb.go
|
||||||
sed -i -e 's/Iv/IV/' -e 's/Hmac/HMAC/' sdk/physical/types.pb.go
|
|
||||||
|
|
||||||
fmtcheck:
|
fmtcheck:
|
||||||
@true
|
@true
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ require (
|
|||||||
github.com/hashicorp/hcl v1.0.0
|
github.com/hashicorp/hcl v1.0.0
|
||||||
github.com/hashicorp/vault/sdk v0.1.14-0.20191218213202-9caafff72a1f
|
github.com/hashicorp/vault/sdk v0.1.14-0.20191218213202-9caafff72a1f
|
||||||
github.com/mitchellh/mapstructure v1.1.2
|
github.com/mitchellh/mapstructure v1.1.2
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4
|
||||||
gopkg.in/square/go-jose.v2 v2.3.1
|
gopkg.in/square/go-jose.v2 v2.3.1
|
||||||
)
|
)
|
||||||
|
|||||||
91
api/go.sum
91
api/go.sum
@@ -1,8 +1,32 @@
|
|||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
|
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
|
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||||
|
cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts=
|
||||||
|
github.com/Azure/azure-sdk-for-go v36.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
|
||||||
|
github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
|
||||||
|
github.com/Azure/go-autorest/autorest v0.9.2/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.6.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.7.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
|
||||||
|
github.com/Azure/go-autorest/autorest/azure/auth v0.4.0/go.mod h1:Oo5cRhLvZteXzI2itUm5ziqsoIxRkzrt3t61FeZaS18=
|
||||||
|
github.com/Azure/go-autorest/autorest/azure/cli v0.3.0/go.mod h1:rNYMNAefZMRowqCV0cVhr/YDW5dD7afFq9nXAXL4ykE=
|
||||||
|
github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
|
||||||
|
github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
|
||||||
|
github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA=
|
||||||
|
github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI=
|
||||||
|
github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
|
||||||
|
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||||
|
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190620160927-9418d7b0cd0f/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ=
|
||||||
|
github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
|
||||||
github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs=
|
github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs=
|
||||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
||||||
|
github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||||
|
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||||
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
|
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
|
||||||
@@ -11,6 +35,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
|
|||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||||
|
github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
|
||||||
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
|
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
|
||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
|
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
|
||||||
@@ -18,13 +44,23 @@ github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkPro
|
|||||||
github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa/Cohzb8=
|
github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa/Cohzb8=
|
||||||
github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31 h1:28FVBuwkwowZMjbA7M0wXsI6t3PYulRTMio3SO+eKCM=
|
github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31 h1:28FVBuwkwowZMjbA7M0wXsI6t3PYulRTMio3SO+eKCM=
|
||||||
github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
|
github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
|
||||||
|
github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
|
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
||||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
|
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
|
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
|
||||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||||
@@ -33,9 +69,11 @@ github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng
|
|||||||
github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI=
|
github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI=
|
||||||
github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI=
|
github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI=
|
||||||
github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
|
github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
|
||||||
|
github.com/hashicorp/go-hclog v0.10.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
|
||||||
github.com/hashicorp/go-hclog v0.10.1 h1:uyt/l0dWjJ879yiAu+T7FG3/6QX+zwm4bQ8P7XsYt3o=
|
github.com/hashicorp/go-hclog v0.10.1 h1:uyt/l0dWjJ879yiAu+T7FG3/6QX+zwm4bQ8P7XsYt3o=
|
||||||
github.com/hashicorp/go-hclog v0.10.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
|
github.com/hashicorp/go-hclog v0.10.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
|
||||||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||||
|
github.com/hashicorp/go-kms-wrapping v0.0.0-20191129225826-634facde9f88/go.mod h1:Pm+Umb/6Gij6ZG534L7QDyvkauaOQWGb+arj9aFjCE0=
|
||||||
github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o=
|
github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o=
|
||||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
||||||
github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY=
|
github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY=
|
||||||
@@ -53,8 +91,15 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
|
|||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||||
|
github.com/hashicorp/vault/api v1.0.5-0.20191122173911-80fcc7907c78/go.mod h1:Uf8LaHyrYsgVgHzO2tMZKhqRGlL3UJ6XaSwW2EA1Iqo=
|
||||||
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
||||||
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||||
|
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||||
|
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||||
|
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||||
github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA=
|
github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA=
|
||||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||||
@@ -73,7 +118,10 @@ github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUb
|
|||||||
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
|
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
|
||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
||||||
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
|
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
|
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
|
||||||
|
github.com/oracle/oci-go-sdk v12.5.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888=
|
||||||
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||||
github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I=
|
github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I=
|
||||||
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||||
@@ -88,26 +136,39 @@ github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R
|
|||||||
github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||||
github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
|
github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
|
||||||
github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
|
github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
|
||||||
|
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||||
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
|
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
|
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
|
||||||
|
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480 h1:O5YqonU5IWby+w98jVUG9h7zlCWCcH4RHyPVReBmhzk=
|
||||||
|
golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
|
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH9uqVPRCUVUDhs0wnbA=
|
||||||
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@@ -118,26 +179,46 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||||||
golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191008105621-543471e840be h1:QAcqgptGM8IQBC9K/RC4o+O9YmqEm0diQn9QmZw/0mU=
|
golang.org/x/sys v0.0.0-20191008105621-543471e840be h1:QAcqgptGM8IQBC9K/RC4o+O9YmqEm0diQn9QmZw/0mU=
|
||||||
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db h1:6/JqlYfC1CCaLnGceQTI+sDGhC9UBSPAsBqI0Gun6kU=
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||||
|
google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||||
|
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
|
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
|
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||||
google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
gopkg.in/square/go-jose.v2 v2.3.1 h1:SK5KegNXmKmqE342YYN2qPHEnUYeoMiXXl1poUlI+o4=
|
gopkg.in/square/go-jose.v2 v2.3.1 h1:SK5KegNXmKmqE342YYN2qPHEnUYeoMiXXl1poUlI+o4=
|
||||||
gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
|
gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ import (
|
|||||||
"github.com/aws/aws-sdk-go/aws/endpoints"
|
"github.com/aws/aws-sdk-go/aws/endpoints"
|
||||||
"github.com/aws/aws-sdk-go/service/ec2"
|
"github.com/aws/aws-sdk-go/service/ec2"
|
||||||
"github.com/aws/aws-sdk-go/service/iam"
|
"github.com/aws/aws-sdk-go/service/iam"
|
||||||
"github.com/hashicorp/vault/helper/awsutil"
|
|
||||||
"github.com/hashicorp/vault/sdk/framework"
|
"github.com/hashicorp/vault/sdk/framework"
|
||||||
|
"github.com/hashicorp/vault/sdk/helper/awsutil"
|
||||||
"github.com/hashicorp/vault/sdk/helper/consts"
|
"github.com/hashicorp/vault/sdk/helper/consts"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
"github.com/hashicorp/vault/sdk/logical"
|
||||||
cache "github.com/patrickmn/go-cache"
|
cache "github.com/patrickmn/go-cache"
|
||||||
@@ -255,14 +255,14 @@ func (b *backend) resolveArnToRealUniqueId(ctx context.Context, s logical.Storag
|
|||||||
}
|
}
|
||||||
iamClient, err := b.clientIAM(ctx, s, region.ID(), entity.AccountNumber)
|
iamClient, err := b.clientIAM(ctx, s, region.ID(), entity.AccountNumber)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", awsutil.AppendLogicalError(err)
|
return "", awsutil.AppendAWSError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch entity.Type {
|
switch entity.Type {
|
||||||
case "user":
|
case "user":
|
||||||
userInfo, err := iamClient.GetUser(&iam.GetUserInput{UserName: &entity.FriendlyName})
|
userInfo, err := iamClient.GetUser(&iam.GetUserInput{UserName: &entity.FriendlyName})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", awsutil.AppendLogicalError(err)
|
return "", awsutil.AppendAWSError(err)
|
||||||
}
|
}
|
||||||
if userInfo == nil {
|
if userInfo == nil {
|
||||||
return "", fmt.Errorf("got nil result from GetUser")
|
return "", fmt.Errorf("got nil result from GetUser")
|
||||||
@@ -271,7 +271,7 @@ func (b *backend) resolveArnToRealUniqueId(ctx context.Context, s logical.Storag
|
|||||||
case "role":
|
case "role":
|
||||||
roleInfo, err := iamClient.GetRole(&iam.GetRoleInput{RoleName: &entity.FriendlyName})
|
roleInfo, err := iamClient.GetRole(&iam.GetRoleInput{RoleName: &entity.FriendlyName})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", awsutil.AppendLogicalError(err)
|
return "", awsutil.AppendAWSError(err)
|
||||||
}
|
}
|
||||||
if roleInfo == nil {
|
if roleInfo == nil {
|
||||||
return "", fmt.Errorf("got nil result from GetRole")
|
return "", fmt.Errorf("got nil result from GetRole")
|
||||||
@@ -280,7 +280,7 @@ func (b *backend) resolveArnToRealUniqueId(ctx context.Context, s logical.Storag
|
|||||||
case "instance-profile":
|
case "instance-profile":
|
||||||
profileInfo, err := iamClient.GetInstanceProfile(&iam.GetInstanceProfileInput{InstanceProfileName: &entity.FriendlyName})
|
profileInfo, err := iamClient.GetInstanceProfile(&iam.GetInstanceProfileInput{InstanceProfileName: &entity.FriendlyName})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", awsutil.AppendLogicalError(err)
|
return "", awsutil.AppendAWSError(err)
|
||||||
}
|
}
|
||||||
if profileInfo == nil {
|
if profileInfo == nil {
|
||||||
return "", fmt.Errorf("got nil result from GetInstanceProfile")
|
return "", fmt.Errorf("got nil result from GetInstanceProfile")
|
||||||
|
|||||||
@@ -13,9 +13,8 @@ import (
|
|||||||
"github.com/aws/aws-sdk-go/aws/session"
|
"github.com/aws/aws-sdk-go/aws/session"
|
||||||
"github.com/aws/aws-sdk-go/service/sts"
|
"github.com/aws/aws-sdk-go/service/sts"
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
"github.com/hashicorp/go-hclog"
|
|
||||||
"github.com/hashicorp/vault/api"
|
"github.com/hashicorp/vault/api"
|
||||||
"github.com/hashicorp/vault/helper/awsutil"
|
"github.com/hashicorp/vault/sdk/helper/awsutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CLIHandler struct{}
|
type CLIHandler struct{}
|
||||||
@@ -39,7 +38,10 @@ func GenerateLoginData(creds *credentials.Credentials, headerValue, configuredRe
|
|||||||
loginData := make(map[string]interface{})
|
loginData := make(map[string]interface{})
|
||||||
|
|
||||||
// Use the credentials we've found to construct an STS session
|
// Use the credentials we've found to construct an STS session
|
||||||
region := awsutil.GetOrDefaultRegion(hclog.Default(), configuredRegion)
|
region, err := awsutil.GetRegion(configuredRegion)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
stsSession, err := session.NewSessionWithOptions(session.Options{
|
stsSession, err := session.NewSessionWithOptions(session.Options{
|
||||||
Config: aws.Config{
|
Config: aws.Config{
|
||||||
Credentials: creds,
|
Credentials: creds,
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import (
|
|||||||
"github.com/aws/aws-sdk-go/service/sts"
|
"github.com/aws/aws-sdk-go/service/sts"
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
cleanhttp "github.com/hashicorp/go-cleanhttp"
|
cleanhttp "github.com/hashicorp/go-cleanhttp"
|
||||||
"github.com/hashicorp/vault/helper/awsutil"
|
"github.com/hashicorp/vault/sdk/helper/awsutil"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
"github.com/hashicorp/vault/sdk/logical"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ import (
|
|||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
cleanhttp "github.com/hashicorp/go-cleanhttp"
|
cleanhttp "github.com/hashicorp/go-cleanhttp"
|
||||||
uuid "github.com/hashicorp/go-uuid"
|
uuid "github.com/hashicorp/go-uuid"
|
||||||
"github.com/hashicorp/vault/helper/awsutil"
|
|
||||||
"github.com/hashicorp/vault/sdk/framework"
|
"github.com/hashicorp/vault/sdk/framework"
|
||||||
|
"github.com/hashicorp/vault/sdk/helper/awsutil"
|
||||||
"github.com/hashicorp/vault/sdk/helper/cidrutil"
|
"github.com/hashicorp/vault/sdk/helper/cidrutil"
|
||||||
"github.com/hashicorp/vault/sdk/helper/jsonutil"
|
"github.com/hashicorp/vault/sdk/helper/jsonutil"
|
||||||
"github.com/hashicorp/vault/sdk/helper/strutil"
|
"github.com/hashicorp/vault/sdk/helper/strutil"
|
||||||
@@ -137,7 +137,7 @@ func (b *backend) instanceIamRoleARN(iamClient *iam.IAM, instanceProfileName str
|
|||||||
InstanceProfileName: aws.String(instanceProfileName),
|
InstanceProfileName: aws.String(instanceProfileName),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", awsutil.AppendLogicalError(err)
|
return "", awsutil.AppendAWSError(err)
|
||||||
}
|
}
|
||||||
if profile == nil {
|
if profile == nil {
|
||||||
return "", fmt.Errorf("nil output while getting instance profile details")
|
return "", fmt.Errorf("nil output while getting instance profile details")
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/go-test/deep"
|
"github.com/go-test/deep"
|
||||||
"github.com/hashicorp/vault/helper/awsutil"
|
|
||||||
vlttesting "github.com/hashicorp/vault/helper/testhelpers/logical"
|
vlttesting "github.com/hashicorp/vault/helper/testhelpers/logical"
|
||||||
|
"github.com/hashicorp/vault/sdk/helper/awsutil"
|
||||||
"github.com/hashicorp/vault/sdk/helper/policyutil"
|
"github.com/hashicorp/vault/sdk/helper/policyutil"
|
||||||
"github.com/hashicorp/vault/sdk/helper/strutil"
|
"github.com/hashicorp/vault/sdk/helper/strutil"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
"github.com/hashicorp/vault/sdk/logical"
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import (
|
|||||||
"github.com/aws/aws-sdk-go/service/sts"
|
"github.com/aws/aws-sdk-go/service/sts"
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
cleanhttp "github.com/hashicorp/go-cleanhttp"
|
cleanhttp "github.com/hashicorp/go-cleanhttp"
|
||||||
"github.com/hashicorp/vault/helper/awsutil"
|
"github.com/hashicorp/vault/sdk/helper/awsutil"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
"github.com/hashicorp/vault/sdk/logical"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ import (
|
|||||||
"github.com/aws/aws-sdk-go/service/iam"
|
"github.com/aws/aws-sdk-go/service/iam"
|
||||||
"github.com/aws/aws-sdk-go/service/sts"
|
"github.com/aws/aws-sdk-go/service/sts"
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
"github.com/hashicorp/vault/helper/awsutil"
|
|
||||||
"github.com/hashicorp/vault/sdk/framework"
|
"github.com/hashicorp/vault/sdk/framework"
|
||||||
|
"github.com/hashicorp/vault/sdk/helper/awsutil"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
"github.com/hashicorp/vault/sdk/logical"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import (
|
|||||||
"github.com/hashicorp/vault/api"
|
"github.com/hashicorp/vault/api"
|
||||||
awsauth "github.com/hashicorp/vault/builtin/credential/aws"
|
awsauth "github.com/hashicorp/vault/builtin/credential/aws"
|
||||||
"github.com/hashicorp/vault/command/agent/auth"
|
"github.com/hashicorp/vault/command/agent/auth"
|
||||||
"github.com/hashicorp/vault/helper/awsutil"
|
"github.com/hashicorp/vault/sdk/helper/awsutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package command
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@@ -189,6 +190,11 @@ func TestAuditEnableCommand_Run(t *testing.T) {
|
|||||||
args = append(args, "file_path=discard")
|
args = append(args, "file_path=discard")
|
||||||
case "socket":
|
case "socket":
|
||||||
args = append(args, "address=127.0.0.1:8888")
|
args = append(args, "address=127.0.0.1:8888")
|
||||||
|
case "syslog":
|
||||||
|
if _, exists := os.LookupEnv("WSLENV"); exists {
|
||||||
|
t.Log("skipping syslog test on WSL")
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
code := cmd.Run(args)
|
code := cmd.Run(args)
|
||||||
if exp := 0; code != exp {
|
if exp := 0; code != exp {
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
hclog "github.com/hashicorp/go-hclog"
|
hclog "github.com/hashicorp/go-hclog"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
|
aeadwrapper "github.com/hashicorp/go-kms-wrapping/wrappers/aead"
|
||||||
"github.com/hashicorp/vault/api"
|
"github.com/hashicorp/vault/api"
|
||||||
vaulthttp "github.com/hashicorp/vault/http"
|
vaulthttp "github.com/hashicorp/vault/http"
|
||||||
"github.com/hashicorp/vault/sdk/helper/logging"
|
"github.com/hashicorp/vault/sdk/helper/logging"
|
||||||
@@ -16,7 +18,6 @@ import (
|
|||||||
"github.com/hashicorp/vault/shamir"
|
"github.com/hashicorp/vault/shamir"
|
||||||
"github.com/hashicorp/vault/vault"
|
"github.com/hashicorp/vault/vault"
|
||||||
"github.com/hashicorp/vault/vault/seal"
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
shamirseal "github.com/hashicorp/vault/vault/seal/shamir"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSealMigration(t *testing.T) {
|
func TestSealMigration(t *testing.T) {
|
||||||
@@ -29,9 +30,13 @@ func TestSealMigration(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
shamirSeal := vault.NewDefaultSeal(shamirseal.NewSeal(logger.Named("shamir")))
|
shamirwrapper := vault.NewDefaultSeal(&seal.Access{
|
||||||
|
Wrapper: aeadwrapper.NewWrapper(&wrapping.WrapperOptions{
|
||||||
|
Logger: logger.Named("shamir"),
|
||||||
|
}),
|
||||||
|
})
|
||||||
coreConfig := &vault.CoreConfig{
|
coreConfig := &vault.CoreConfig{
|
||||||
Seal: shamirSeal,
|
Seal: shamirwrapper,
|
||||||
Physical: phys,
|
Physical: phys,
|
||||||
HAPhysical: haPhys.(physical.HABackend),
|
HAPhysical: haPhys.(physical.HABackend),
|
||||||
DisableSealWrap: true,
|
DisableSealWrap: true,
|
||||||
@@ -201,7 +206,7 @@ func TestSealMigration(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
altTestSeal := seal.NewTestSeal(nil)
|
altTestSeal := seal.NewTestSeal(nil)
|
||||||
altTestSeal.Type = "test-alternate"
|
altTestSeal.SetType("test-alternate")
|
||||||
altSeal := vault.NewAutoSeal(altTestSeal)
|
altSeal := vault.NewAutoSeal(altTestSeal)
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -252,7 +257,7 @@ func TestSealMigration(t *testing.T) {
|
|||||||
|
|
||||||
core := cluster.Cores[0].Core
|
core := cluster.Cores[0].Core
|
||||||
|
|
||||||
if err := adjustCoreForSealMigration(logger, core, shamirSeal, altSeal); err != nil {
|
if err := adjustCoreForSealMigration(logger, core, shamirwrapper, altSeal); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,7 +293,7 @@ func TestSealMigration(t *testing.T) {
|
|||||||
{
|
{
|
||||||
logger.SetLevel(hclog.Trace)
|
logger.SetLevel(hclog.Trace)
|
||||||
logger.Info("integ: verify autoseal is off and the expected key shares work")
|
logger.Info("integ: verify autoseal is off and the expected key shares work")
|
||||||
coreConfig.Seal = shamirSeal
|
coreConfig.Seal = shamirwrapper
|
||||||
cluster := vault.NewTestCluster(t, coreConfig, clusterConfig)
|
cluster := vault.NewTestCluster(t, coreConfig, clusterConfig)
|
||||||
cluster.Start()
|
cluster.Start()
|
||||||
defer cluster.Cleanup()
|
defer cluster.Cleanup()
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ import (
|
|||||||
stackdriver "github.com/google/go-metrics-stackdriver"
|
stackdriver "github.com/google/go-metrics-stackdriver"
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
|
aeadwrapper "github.com/hashicorp/go-kms-wrapping/wrappers/aead"
|
||||||
"github.com/hashicorp/go-multierror"
|
"github.com/hashicorp/go-multierror"
|
||||||
"github.com/hashicorp/go-sockaddr"
|
"github.com/hashicorp/go-sockaddr"
|
||||||
"github.com/hashicorp/vault/audit"
|
"github.com/hashicorp/vault/audit"
|
||||||
@@ -50,7 +52,6 @@ import (
|
|||||||
sr "github.com/hashicorp/vault/serviceregistration"
|
sr "github.com/hashicorp/vault/serviceregistration"
|
||||||
"github.com/hashicorp/vault/vault"
|
"github.com/hashicorp/vault/vault"
|
||||||
vaultseal "github.com/hashicorp/vault/vault/seal"
|
vaultseal "github.com/hashicorp/vault/vault/seal"
|
||||||
shamirseal "github.com/hashicorp/vault/vault/seal/shamir"
|
|
||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
"github.com/mitchellh/go-testing-interface"
|
"github.com/mitchellh/go-testing-interface"
|
||||||
"github.com/posener/complete"
|
"github.com/posener/complete"
|
||||||
@@ -488,7 +489,7 @@ func (c *ServerCommand) runRecoveryMode() int {
|
|||||||
var sealConfigError error
|
var sealConfigError error
|
||||||
|
|
||||||
if len(config.Seals) == 0 {
|
if len(config.Seals) == 0 {
|
||||||
config.Seals = append(config.Seals, &server.Seal{Type: vaultseal.Shamir})
|
config.Seals = append(config.Seals, &server.Seal{Type: wrapping.Shamir})
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(config.Seals) > 1 {
|
if len(config.Seals) > 1 {
|
||||||
@@ -497,7 +498,7 @@ func (c *ServerCommand) runRecoveryMode() int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
configSeal := config.Seals[0]
|
configSeal := config.Seals[0]
|
||||||
sealType := vaultseal.Shamir
|
sealType := wrapping.Shamir
|
||||||
if !configSeal.Disabled && os.Getenv("VAULT_SEAL_TYPE") != "" {
|
if !configSeal.Disabled && os.Getenv("VAULT_SEAL_TYPE") != "" {
|
||||||
sealType = os.Getenv("VAULT_SEAL_TYPE")
|
sealType = os.Getenv("VAULT_SEAL_TYPE")
|
||||||
configSeal.Type = sealType
|
configSeal.Type = sealType
|
||||||
@@ -507,7 +508,11 @@ func (c *ServerCommand) runRecoveryMode() int {
|
|||||||
|
|
||||||
var seal vault.Seal
|
var seal vault.Seal
|
||||||
sealLogger := c.logger.Named(sealType)
|
sealLogger := c.logger.Named(sealType)
|
||||||
seal, sealConfigError = serverseal.ConfigureSeal(configSeal, &infoKeys, &info, sealLogger, vault.NewDefaultSeal(shamirseal.NewSeal(c.logger.Named("shamir"))))
|
seal, sealConfigError = serverseal.ConfigureSeal(configSeal, &infoKeys, &info, sealLogger, vault.NewDefaultSeal(&vaultseal.Access{
|
||||||
|
Wrapper: aeadwrapper.NewWrapper(&wrapping.WrapperOptions{
|
||||||
|
Logger: c.logger.Named("shamir"),
|
||||||
|
}),
|
||||||
|
}))
|
||||||
if sealConfigError != nil {
|
if sealConfigError != nil {
|
||||||
if !errwrap.ContainsType(sealConfigError, new(logical.KeyNotFoundError)) {
|
if !errwrap.ContainsType(sealConfigError, new(logical.KeyNotFoundError)) {
|
||||||
c.UI.Error(fmt.Sprintf(
|
c.UI.Error(fmt.Sprintf(
|
||||||
@@ -971,16 +976,16 @@ func (c *ServerCommand) Run(args []string) int {
|
|||||||
// Handle the case where no seal is provided
|
// Handle the case where no seal is provided
|
||||||
switch len(config.Seals) {
|
switch len(config.Seals) {
|
||||||
case 0:
|
case 0:
|
||||||
config.Seals = append(config.Seals, &server.Seal{Type: vaultseal.Shamir})
|
config.Seals = append(config.Seals, &server.Seal{Type: wrapping.Shamir})
|
||||||
case 1:
|
case 1:
|
||||||
// If there's only one seal and it's disabled assume they want to
|
// If there's only one seal and it's disabled assume they want to
|
||||||
// migrate to a shamir seal and simply didn't provide it
|
// migrate to a shamir seal and simply didn't provide it
|
||||||
if config.Seals[0].Disabled {
|
if config.Seals[0].Disabled {
|
||||||
config.Seals = append(config.Seals, &server.Seal{Type: vaultseal.Shamir})
|
config.Seals = append(config.Seals, &server.Seal{Type: wrapping.Shamir})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, configSeal := range config.Seals {
|
for _, configSeal := range config.Seals {
|
||||||
sealType := vaultseal.Shamir
|
sealType := wrapping.Shamir
|
||||||
if !configSeal.Disabled && os.Getenv("VAULT_SEAL_TYPE") != "" {
|
if !configSeal.Disabled && os.Getenv("VAULT_SEAL_TYPE") != "" {
|
||||||
sealType = os.Getenv("VAULT_SEAL_TYPE")
|
sealType = os.Getenv("VAULT_SEAL_TYPE")
|
||||||
configSeal.Type = sealType
|
configSeal.Type = sealType
|
||||||
@@ -991,7 +996,11 @@ func (c *ServerCommand) Run(args []string) int {
|
|||||||
var seal vault.Seal
|
var seal vault.Seal
|
||||||
sealLogger := c.logger.Named(sealType)
|
sealLogger := c.logger.Named(sealType)
|
||||||
allLoggers = append(allLoggers, sealLogger)
|
allLoggers = append(allLoggers, sealLogger)
|
||||||
seal, sealConfigError = serverseal.ConfigureSeal(configSeal, &infoKeys, &info, sealLogger, vault.NewDefaultSeal(shamirseal.NewSeal(c.logger.Named("shamir"))))
|
seal, sealConfigError = serverseal.ConfigureSeal(configSeal, &infoKeys, &info, sealLogger, vault.NewDefaultSeal(&vaultseal.Access{
|
||||||
|
Wrapper: aeadwrapper.NewWrapper(&wrapping.WrapperOptions{
|
||||||
|
Logger: c.logger.Named("shamir"),
|
||||||
|
}),
|
||||||
|
}))
|
||||||
if sealConfigError != nil {
|
if sealConfigError != nil {
|
||||||
if !errwrap.ContainsType(sealConfigError, new(logical.KeyNotFoundError)) {
|
if !errwrap.ContainsType(sealConfigError, new(logical.KeyNotFoundError)) {
|
||||||
c.UI.Error(fmt.Sprintf(
|
c.UI.Error(fmt.Sprintf(
|
||||||
@@ -1847,7 +1856,7 @@ func (c *ServerCommand) enableDev(core *vault.Core, coreConfig *vault.CoreConfig
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if core.SealAccess().StoredKeysSupported() != vault.StoredKeysNotSupported {
|
if core.SealAccess().StoredKeysSupported() != vaultseal.StoredKeysNotSupported {
|
||||||
barrierConfig.StoredShares = 1
|
barrierConfig.StoredShares = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1861,7 +1870,7 @@ func (c *ServerCommand) enableDev(core *vault.Core, coreConfig *vault.CoreConfig
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Handle unseal with stored keys
|
// Handle unseal with stored keys
|
||||||
if core.SealAccess().StoredKeysSupported() == vault.StoredKeysSupportedGeneric {
|
if core.SealAccess().StoredKeysSupported() == vaultseal.StoredKeysSupportedGeneric {
|
||||||
err := core.UnsealWithStoredKeys(ctx)
|
err := core.UnsealWithStoredKeys(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
@@ -3,40 +3,40 @@ package seal
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
log "github.com/hashicorp/go-hclog"
|
"github.com/hashicorp/go-hclog"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
"github.com/hashicorp/vault/command/server"
|
"github.com/hashicorp/vault/command/server"
|
||||||
"github.com/hashicorp/vault/vault"
|
"github.com/hashicorp/vault/vault"
|
||||||
"github.com/hashicorp/vault/vault/seal"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ConfigureSeal = configureSeal
|
ConfigureSeal = configureSeal
|
||||||
)
|
)
|
||||||
|
|
||||||
func configureSeal(configSeal *server.Seal, infoKeys *[]string, info *map[string]string, logger log.Logger, inseal vault.Seal) (outseal vault.Seal, err error) {
|
func configureSeal(configSeal *server.Seal, infoKeys *[]string, info *map[string]string, logger hclog.Logger, inseal vault.Seal) (outseal vault.Seal, err error) {
|
||||||
switch configSeal.Type {
|
switch configSeal.Type {
|
||||||
case seal.AliCloudKMS:
|
case wrapping.AliCloudKMS:
|
||||||
return configureAliCloudKMSSeal(configSeal, infoKeys, info, logger, inseal)
|
return configureAliCloudKMSSeal(configSeal, infoKeys, info, logger, inseal)
|
||||||
|
|
||||||
case seal.AWSKMS:
|
case wrapping.AWSKMS:
|
||||||
return configureAWSKMSSeal(configSeal, infoKeys, info, logger, inseal)
|
return configureAWSKMSSeal(configSeal, infoKeys, info, logger, inseal)
|
||||||
|
|
||||||
case seal.GCPCKMS:
|
case wrapping.AzureKeyVault:
|
||||||
return configureGCPCKMSSeal(configSeal, infoKeys, info, logger, inseal)
|
|
||||||
|
|
||||||
case seal.AzureKeyVault:
|
|
||||||
return configureAzureKeyVaultSeal(configSeal, infoKeys, info, logger, inseal)
|
return configureAzureKeyVaultSeal(configSeal, infoKeys, info, logger, inseal)
|
||||||
|
|
||||||
case seal.OCIKMS:
|
case wrapping.GCPCKMS:
|
||||||
|
return configureGCPCKMSSeal(configSeal, infoKeys, info, logger, inseal)
|
||||||
|
|
||||||
|
case wrapping.OCIKMS:
|
||||||
return configureOCIKMSSeal(configSeal, infoKeys, info, logger, inseal)
|
return configureOCIKMSSeal(configSeal, infoKeys, info, logger, inseal)
|
||||||
|
|
||||||
case seal.Transit:
|
case wrapping.Transit:
|
||||||
return configureTransitSeal(configSeal, infoKeys, info, logger, inseal)
|
return configureTransitSeal(configSeal, infoKeys, info, logger, inseal)
|
||||||
|
|
||||||
case seal.PKCS11:
|
case wrapping.PKCS11:
|
||||||
return nil, fmt.Errorf("Seal type 'pkcs11' requires the Vault Enterprise HSM binary")
|
return nil, fmt.Errorf("Seal type 'pkcs11' requires the Vault Enterprise HSM binary")
|
||||||
|
|
||||||
case seal.Shamir:
|
case wrapping.Shamir:
|
||||||
return inseal, nil
|
return inseal, nil
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -3,14 +3,15 @@ package seal
|
|||||||
import (
|
import (
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
|
"github.com/hashicorp/go-kms-wrapping/wrappers/alicloudkms"
|
||||||
"github.com/hashicorp/vault/command/server"
|
"github.com/hashicorp/vault/command/server"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
"github.com/hashicorp/vault/sdk/logical"
|
||||||
"github.com/hashicorp/vault/vault"
|
"github.com/hashicorp/vault/vault"
|
||||||
"github.com/hashicorp/vault/vault/seal/alicloudkms"
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
)
|
)
|
||||||
|
|
||||||
func configureAliCloudKMSSeal(configSeal *server.Seal, infoKeys *[]string, info *map[string]string, logger log.Logger, inseal vault.Seal) (vault.Seal, error) {
|
func configureAliCloudKMSSeal(configSeal *server.Seal, infoKeys *[]string, info *map[string]string, logger log.Logger, inseal vault.Seal) (vault.Seal, error) {
|
||||||
kms := alicloudkms.NewSeal(logger)
|
kms := alicloudkms.NewWrapper(nil)
|
||||||
kmsInfo, err := kms.SetConfig(configSeal.Config)
|
kmsInfo, err := kms.SetConfig(configSeal.Config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// If the error is any other than logical.KeyNotFoundError, return the error
|
// If the error is any other than logical.KeyNotFoundError, return the error
|
||||||
@@ -18,7 +19,9 @@ func configureAliCloudKMSSeal(configSeal *server.Seal, infoKeys *[]string, info
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
autoseal := vault.NewAutoSeal(kms)
|
autoseal := vault.NewAutoSeal(&seal.Access{
|
||||||
|
Wrapper: kms,
|
||||||
|
})
|
||||||
if kmsInfo != nil {
|
if kmsInfo != nil {
|
||||||
*infoKeys = append(*infoKeys, "Seal Type", "AliCloud KMS Region", "AliCloud KMS KeyID")
|
*infoKeys = append(*infoKeys, "Seal Type", "AliCloud KMS Region", "AliCloud KMS KeyID")
|
||||||
(*info)["Seal Type"] = configSeal.Type
|
(*info)["Seal Type"] = configSeal.Type
|
||||||
|
|||||||
@@ -2,15 +2,16 @@ package seal
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
log "github.com/hashicorp/go-hclog"
|
"github.com/hashicorp/go-hclog"
|
||||||
|
"github.com/hashicorp/go-kms-wrapping/wrappers/awskms"
|
||||||
"github.com/hashicorp/vault/command/server"
|
"github.com/hashicorp/vault/command/server"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
"github.com/hashicorp/vault/sdk/logical"
|
||||||
"github.com/hashicorp/vault/vault"
|
"github.com/hashicorp/vault/vault"
|
||||||
"github.com/hashicorp/vault/vault/seal/awskms"
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
)
|
)
|
||||||
|
|
||||||
func configureAWSKMSSeal(configSeal *server.Seal, infoKeys *[]string, info *map[string]string, logger log.Logger, inseal vault.Seal) (vault.Seal, error) {
|
func configureAWSKMSSeal(configSeal *server.Seal, infoKeys *[]string, info *map[string]string, logger hclog.Logger, inseal vault.Seal) (vault.Seal, error) {
|
||||||
kms := awskms.NewSeal(logger)
|
kms := awskms.NewWrapper(nil)
|
||||||
kmsInfo, err := kms.SetConfig(configSeal.Config)
|
kmsInfo, err := kms.SetConfig(configSeal.Config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// If the error is any other than logical.KeyNotFoundError, return the error
|
// If the error is any other than logical.KeyNotFoundError, return the error
|
||||||
@@ -18,7 +19,9 @@ func configureAWSKMSSeal(configSeal *server.Seal, infoKeys *[]string, info *map[
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
autoseal := vault.NewAutoSeal(kms)
|
autoseal := vault.NewAutoSeal(&seal.Access{
|
||||||
|
Wrapper: kms,
|
||||||
|
})
|
||||||
if kmsInfo != nil {
|
if kmsInfo != nil {
|
||||||
*infoKeys = append(*infoKeys, "Seal Type", "AWS KMS Region", "AWS KMS KeyID")
|
*infoKeys = append(*infoKeys, "Seal Type", "AWS KMS Region", "AWS KMS KeyID")
|
||||||
(*info)["Seal Type"] = configSeal.Type
|
(*info)["Seal Type"] = configSeal.Type
|
||||||
|
|||||||
@@ -3,14 +3,15 @@ package seal
|
|||||||
import (
|
import (
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
|
"github.com/hashicorp/go-kms-wrapping/wrappers/azurekeyvault"
|
||||||
"github.com/hashicorp/vault/command/server"
|
"github.com/hashicorp/vault/command/server"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
"github.com/hashicorp/vault/sdk/logical"
|
||||||
"github.com/hashicorp/vault/vault"
|
"github.com/hashicorp/vault/vault"
|
||||||
"github.com/hashicorp/vault/vault/seal/azurekeyvault"
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
)
|
)
|
||||||
|
|
||||||
func configureAzureKeyVaultSeal(configSeal *server.Seal, infoKeys *[]string, info *map[string]string, logger log.Logger, inseal vault.Seal) (vault.Seal, error) {
|
func configureAzureKeyVaultSeal(configSeal *server.Seal, infoKeys *[]string, info *map[string]string, logger log.Logger, inseal vault.Seal) (vault.Seal, error) {
|
||||||
kv := azurekeyvault.NewSeal(logger)
|
kv := azurekeyvault.NewWrapper(nil)
|
||||||
kvInfo, err := kv.SetConfig(configSeal.Config)
|
kvInfo, err := kv.SetConfig(configSeal.Config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// If the error is any other than logical.KeyNotFoundError, return the error
|
// If the error is any other than logical.KeyNotFoundError, return the error
|
||||||
@@ -18,7 +19,9 @@ func configureAzureKeyVaultSeal(configSeal *server.Seal, infoKeys *[]string, inf
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
autoseal := vault.NewAutoSeal(kv)
|
autoseal := vault.NewAutoSeal(&seal.Access{
|
||||||
|
Wrapper: kv,
|
||||||
|
})
|
||||||
if kvInfo != nil {
|
if kvInfo != nil {
|
||||||
*infoKeys = append(*infoKeys, "Seal Type", "Azure Environment", "Azure Vault Name", "Azure Key Name")
|
*infoKeys = append(*infoKeys, "Seal Type", "Azure Environment", "Azure Vault Name", "Azure Key Name")
|
||||||
(*info)["Seal Type"] = configSeal.Type
|
(*info)["Seal Type"] = configSeal.Type
|
||||||
|
|||||||
@@ -3,14 +3,17 @@ package seal
|
|||||||
import (
|
import (
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
|
"github.com/hashicorp/go-kms-wrapping/wrappers/gcpckms"
|
||||||
"github.com/hashicorp/vault/command/server"
|
"github.com/hashicorp/vault/command/server"
|
||||||
|
"github.com/hashicorp/vault/sdk/helper/useragent"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
"github.com/hashicorp/vault/sdk/logical"
|
||||||
"github.com/hashicorp/vault/vault"
|
"github.com/hashicorp/vault/vault"
|
||||||
"github.com/hashicorp/vault/vault/seal/gcpckms"
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
)
|
)
|
||||||
|
|
||||||
func configureGCPCKMSSeal(configSeal *server.Seal, infoKeys *[]string, info *map[string]string, logger log.Logger, inseal vault.Seal) (vault.Seal, error) {
|
func configureGCPCKMSSeal(configSeal *server.Seal, infoKeys *[]string, info *map[string]string, logger log.Logger, inseal vault.Seal) (vault.Seal, error) {
|
||||||
kms := gcpckms.NewSeal(logger)
|
kms := gcpckms.NewWrapper(nil)
|
||||||
|
configSeal.Config["user_agent"] = useragent.String()
|
||||||
kmsInfo, err := kms.SetConfig(configSeal.Config)
|
kmsInfo, err := kms.SetConfig(configSeal.Config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// If the error is any other than logical.KeyNotFoundError, return the error
|
// If the error is any other than logical.KeyNotFoundError, return the error
|
||||||
@@ -18,7 +21,9 @@ func configureGCPCKMSSeal(configSeal *server.Seal, infoKeys *[]string, info *map
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
autoseal := vault.NewAutoSeal(kms)
|
autoseal := vault.NewAutoSeal(&seal.Access{
|
||||||
|
Wrapper: kms,
|
||||||
|
})
|
||||||
if kmsInfo != nil {
|
if kmsInfo != nil {
|
||||||
*infoKeys = append(*infoKeys, "Seal Type", "GCP KMS Project", "GCP KMS Region", "GCP KMS Key Ring", "GCP KMS Crypto Key")
|
*infoKeys = append(*infoKeys, "Seal Type", "GCP KMS Project", "GCP KMS Region", "GCP KMS Key Ring", "GCP KMS Crypto Key")
|
||||||
(*info)["Seal Type"] = configSeal.Type
|
(*info)["Seal Type"] = configSeal.Type
|
||||||
|
|||||||
@@ -3,23 +3,29 @@ package seal
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
|
"github.com/hashicorp/go-kms-wrapping/wrappers/ocikms"
|
||||||
"github.com/hashicorp/vault/command/server"
|
"github.com/hashicorp/vault/command/server"
|
||||||
"github.com/hashicorp/vault/vault"
|
"github.com/hashicorp/vault/vault"
|
||||||
"github.com/hashicorp/vault/vault/seal/ocikms"
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
)
|
)
|
||||||
|
|
||||||
func configureOCIKMSSeal(configSeal *server.Seal, infoKeys *[]string, info *map[string]string, logger log.Logger, inseal vault.Seal) (vault.Seal, error) {
|
func configureOCIKMSSeal(configSeal *server.Seal, infoKeys *[]string, info *map[string]string, logger log.Logger, inseal vault.Seal) (vault.Seal, error) {
|
||||||
kms := ocikms.NewSeal(logger)
|
kms := ocikms.NewWrapper(nil)
|
||||||
kmsInfo, err := kms.SetConfig(configSeal.Config)
|
kmsInfo, err := kms.SetConfig(configSeal.Config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("error on setting up config for OCI KMS", "error", err)
|
logger.Error("error on setting up config for OCI KMS", "error", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
autoseal := vault.NewAutoSeal(kms)
|
autoseal := vault.NewAutoSeal(&seal.Access{
|
||||||
|
Wrapper: kms,
|
||||||
|
})
|
||||||
if kmsInfo != nil {
|
if kmsInfo != nil {
|
||||||
*infoKeys = append(*infoKeys, "Seal Type", "OCI KMS KeyID")
|
*infoKeys = append(*infoKeys, "Seal Type", "OCI KMS KeyID")
|
||||||
(*info)["Seal Type"] = configSeal.Type
|
(*info)["Seal Type"] = configSeal.Type
|
||||||
(*info)["OCI KMS KeyID"] = kmsInfo["key_id"]
|
(*info)["OCI KMS KeyID"] = kmsInfo[ocikms.KMSConfigKeyID]
|
||||||
|
(*info)["OCI KMS Crypto Endpoint"] = kmsInfo[ocikms.KMSConfigCryptoEndpoint]
|
||||||
|
(*info)["OCI KMS Management Endpoint"] = kmsInfo[ocikms.KMSConfigManagementEndpoint]
|
||||||
|
(*info)["OCI KMS Principal Type"] = kmsInfo["principal_type"]
|
||||||
}
|
}
|
||||||
return autoseal, nil
|
return autoseal, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,14 +3,18 @@ package seal
|
|||||||
import (
|
import (
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
|
"github.com/hashicorp/go-kms-wrapping/wrappers/transit"
|
||||||
"github.com/hashicorp/vault/command/server"
|
"github.com/hashicorp/vault/command/server"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
"github.com/hashicorp/vault/sdk/logical"
|
||||||
"github.com/hashicorp/vault/vault"
|
"github.com/hashicorp/vault/vault"
|
||||||
"github.com/hashicorp/vault/vault/seal/transit"
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
)
|
)
|
||||||
|
|
||||||
func configureTransitSeal(configSeal *server.Seal, infoKeys *[]string, info *map[string]string, logger log.Logger, inseal vault.Seal) (vault.Seal, error) {
|
func configureTransitSeal(configSeal *server.Seal, infoKeys *[]string, info *map[string]string, logger log.Logger, inseal vault.Seal) (vault.Seal, error) {
|
||||||
transitSeal := transit.NewSeal(logger)
|
transitSeal := transit.NewWrapper(&wrapping.WrapperOptions{
|
||||||
|
Logger: logger.ResetNamed("seal-transit"),
|
||||||
|
})
|
||||||
sealInfo, err := transitSeal.SetConfig(configSeal.Config)
|
sealInfo, err := transitSeal.SetConfig(configSeal.Config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// If the error is any other than logical.KeyNotFoundError, return the error
|
// If the error is any other than logical.KeyNotFoundError, return the error
|
||||||
@@ -18,7 +22,9 @@ func configureTransitSeal(configSeal *server.Seal, infoKeys *[]string, info *map
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
autoseal := vault.NewAutoSeal(transitSeal)
|
autoseal := vault.NewAutoSeal(&seal.Access{
|
||||||
|
Wrapper: transitSeal,
|
||||||
|
})
|
||||||
if sealInfo != nil {
|
if sealInfo != nil {
|
||||||
*infoKeys = append(*infoKeys, "Seal Type", "Transit Address", "Transit Mount Path", "Transit Key Name")
|
*infoKeys = append(*infoKeys, "Seal Type", "Transit Address", "Transit Mount Path", "Transit Key Name")
|
||||||
(*info)["Seal Type"] = configSeal.Type
|
(*info)["Seal Type"] = configSeal.Type
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package transit_test
|
package seal_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@@ -6,45 +6,43 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
log "github.com/hashicorp/go-hclog"
|
"github.com/hashicorp/go-kms-wrapping/wrappers/transit"
|
||||||
"github.com/hashicorp/go-uuid"
|
"github.com/hashicorp/go-uuid"
|
||||||
"github.com/hashicorp/vault/api"
|
"github.com/hashicorp/vault/api"
|
||||||
"github.com/hashicorp/vault/helper/testhelpers/docker"
|
|
||||||
"github.com/hashicorp/vault/sdk/helper/logging"
|
|
||||||
"github.com/hashicorp/vault/vault/seal/transit"
|
|
||||||
"github.com/ory/dockertest"
|
"github.com/ory/dockertest"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestTransitSeal_Lifecycle(t *testing.T) {
|
func TestTransitWrapper_Lifecycle(t *testing.T) {
|
||||||
if os.Getenv("VAULT_ACC") == "" {
|
if os.Getenv("VAULT_ACC") == "" {
|
||||||
t.Skip()
|
t.Skip()
|
||||||
}
|
}
|
||||||
cleanup, retAddress, token, mountPath, keyName, _ := prepareTestContainer(t)
|
cleanup, retAddress, token, mountPath, keyName, _ := prepareTestContainer(t)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
sealConfig := map[string]string{
|
wrapperConfig := map[string]string{
|
||||||
"address": retAddress,
|
"address": retAddress,
|
||||||
"token": token,
|
"token": token,
|
||||||
"mount_path": mountPath,
|
"mount_path": mountPath,
|
||||||
"key_name": keyName,
|
"key_name": keyName,
|
||||||
}
|
}
|
||||||
s := transit.NewSeal(logging.NewVaultLogger(log.Trace))
|
s := transit.NewWrapper(nil)
|
||||||
_, err := s.SetConfig(sealConfig)
|
_, err := s.SetConfig(wrapperConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("error setting seal config: %v", err)
|
t.Fatalf("error setting wrapper config: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test Encrypt and Decrypt calls
|
// Test Encrypt and Decrypt calls
|
||||||
input := []byte("foo")
|
input := []byte("foo")
|
||||||
swi, err := s.Encrypt(context.Background(), input)
|
swi, err := s.Encrypt(context.Background(), input, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %s", err.Error())
|
t.Fatalf("err: %s", err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
pt, err := s.Decrypt(context.Background(), swi)
|
pt, err := s.Decrypt(context.Background(), swi, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %s", err.Error())
|
t.Fatalf("err: %s", err.Error())
|
||||||
}
|
}
|
||||||
@@ -82,28 +80,28 @@ func TestTransitSeal_TokenRenewal(t *testing.T) {
|
|||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
sealConfig := map[string]string{
|
wrapperConfig := map[string]string{
|
||||||
"address": retAddress,
|
"address": retAddress,
|
||||||
"token": rsp.Auth.ClientToken,
|
"token": rsp.Auth.ClientToken,
|
||||||
"mount_path": mountPath,
|
"mount_path": mountPath,
|
||||||
"key_name": keyName,
|
"key_name": keyName,
|
||||||
}
|
}
|
||||||
s := transit.NewSeal(logging.NewVaultLogger(log.Trace))
|
s := transit.NewWrapper(nil)
|
||||||
_, err = s.SetConfig(sealConfig)
|
_, err = s.SetConfig(wrapperConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("error setting seal config: %v", err)
|
t.Fatalf("error setting wrapper config: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
time.Sleep(7 * time.Second)
|
time.Sleep(7 * time.Second)
|
||||||
|
|
||||||
// Test Encrypt and Decrypt calls
|
// Test Encrypt and Decrypt calls
|
||||||
input := []byte("foo")
|
input := []byte("foo")
|
||||||
swi, err := s.Encrypt(context.Background(), input)
|
swi, err := s.Encrypt(context.Background(), input, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %s", err.Error())
|
t.Fatalf("err: %s", err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
pt, err := s.Decrypt(context.Background(), swi)
|
pt, err := s.Decrypt(context.Background(), swi, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %s", err.Error())
|
t.Fatalf("err: %s", err.Error())
|
||||||
}
|
}
|
||||||
@@ -144,7 +142,19 @@ func prepareTestContainer(t *testing.T) (cleanup func(), retAddress, token, moun
|
|||||||
}
|
}
|
||||||
|
|
||||||
cleanup = func() {
|
cleanup = func() {
|
||||||
docker.CleanupResource(t, pool, resource)
|
var err error
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
err = pool.Purge(resource)
|
||||||
|
if err == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.Contains(err.Error(), "No such container") {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t.Fatalf("Failed to cleanup local container: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
retAddress = fmt.Sprintf("http://127.0.0.1:%s", resource.GetPort("8200/tcp"))
|
retAddress = fmt.Sprintf("http://127.0.0.1:%s", resource.GetPort("8200/tcp"))
|
||||||
@@ -7,10 +7,11 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
|
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
|
aeadwrapper "github.com/hashicorp/go-kms-wrapping/wrappers/aead"
|
||||||
"github.com/hashicorp/vault/command/server"
|
"github.com/hashicorp/vault/command/server"
|
||||||
"github.com/hashicorp/vault/vault"
|
"github.com/hashicorp/vault/vault"
|
||||||
vaultseal "github.com/hashicorp/vault/vault/seal"
|
vaultseal "github.com/hashicorp/vault/vault/seal"
|
||||||
shamirseal "github.com/hashicorp/vault/vault/seal/shamir"
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -31,7 +32,7 @@ func adjustCoreForSealMigration(logger log.Logger, core *vault.Core, barrierSeal
|
|||||||
|
|
||||||
// If we don't have an existing config or if it's the deprecated auto seal
|
// If we don't have an existing config or if it's the deprecated auto seal
|
||||||
// which needs an upgrade, skip out
|
// which needs an upgrade, skip out
|
||||||
if existBarrierSealConfig == nil || existBarrierSealConfig.Type == vaultseal.HSMAutoDeprecated {
|
if existBarrierSealConfig == nil || existBarrierSealConfig.Type == wrapping.HSMAutoDeprecated {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,11 +45,11 @@ func adjustCoreForSealMigration(logger log.Logger, core *vault.Core, barrierSeal
|
|||||||
|
|
||||||
// If we're not coming from Shamir, and the existing type doesn't match
|
// If we're not coming from Shamir, and the existing type doesn't match
|
||||||
// the barrier type, we need both the migration seal and the new seal
|
// the barrier type, we need both the migration seal and the new seal
|
||||||
if existBarrierSealConfig.Type != vaultseal.Shamir && barrierSeal.BarrierType() != vaultseal.Shamir {
|
if existBarrierSealConfig.Type != wrapping.Shamir && barrierSeal.BarrierType() != wrapping.Shamir {
|
||||||
return errors.New(`Trying to migrate from auto-seal to auto-seal but no "disabled" seal stanza found`)
|
return errors.New(`Trying to migrate from auto-seal to auto-seal but no "disabled" seal stanza found`)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if unwrapSeal.BarrierType() == vaultseal.Shamir {
|
if unwrapSeal.BarrierType() == wrapping.Shamir {
|
||||||
return errors.New("Shamir seals cannot be set disabled (they should simply not be set)")
|
return errors.New("Shamir seals cannot be set disabled (they should simply not be set)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -64,14 +65,18 @@ func adjustCoreForSealMigration(logger log.Logger, core *vault.Core, barrierSeal
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if existBarrierSealConfig.Type != vaultseal.Shamir && existRecoverySealConfig == nil {
|
if existBarrierSealConfig.Type != wrapping.Shamir && existRecoverySealConfig == nil {
|
||||||
return errors.New(`Recovery seal configuration not found for existing seal`)
|
return errors.New(`Recovery seal configuration not found for existing seal`)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch existBarrierSealConfig.Type {
|
switch existBarrierSealConfig.Type {
|
||||||
case vaultseal.Shamir:
|
case wrapping.Shamir:
|
||||||
// The value reflected in config is what we're going to
|
// The value reflected in config is what we're going to
|
||||||
existSeal = vault.NewDefaultSeal(shamirseal.NewSeal(logger.Named("shamir")))
|
existSeal = vault.NewDefaultSeal(&vaultseal.Access{
|
||||||
|
Wrapper: aeadwrapper.NewWrapper(&wrapping.WrapperOptions{
|
||||||
|
Logger: logger.Named("shamir"),
|
||||||
|
}),
|
||||||
|
})
|
||||||
newSeal = barrierSeal
|
newSeal = barrierSeal
|
||||||
newBarrierSealConfig := &vault.SealConfig{
|
newBarrierSealConfig := &vault.SealConfig{
|
||||||
Type: newSeal.BarrierType(),
|
Type: newSeal.BarrierType(),
|
||||||
@@ -83,7 +88,7 @@ func adjustCoreForSealMigration(logger log.Logger, core *vault.Core, barrierSeal
|
|||||||
newSeal.SetCachedRecoveryConfig(existBarrierSealConfig)
|
newSeal.SetCachedRecoveryConfig(existBarrierSealConfig)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if onEnterprise && barrierSeal.BarrierType() == vaultseal.Shamir {
|
if onEnterprise && barrierSeal.BarrierType() == wrapping.Shamir {
|
||||||
return errors.New("Migrating from autoseal to Shamir seal is not currently supported on Vault Enterprise")
|
return errors.New("Migrating from autoseal to Shamir seal is not currently supported on Vault Enterprise")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
24
go.mod
24
go.mod
@@ -8,8 +8,8 @@ replace github.com/hashicorp/vault/sdk => ./sdk
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
cloud.google.com/go v0.39.0
|
cloud.google.com/go v0.39.0
|
||||||
github.com/Azure/azure-sdk-for-go v29.0.0+incompatible
|
github.com/Azure/azure-sdk-for-go v36.2.0+incompatible
|
||||||
github.com/Azure/go-autorest v11.7.1+incompatible
|
github.com/Azure/go-autorest/autorest v0.9.2
|
||||||
github.com/NYTimes/gziphandler v1.1.1
|
github.com/NYTimes/gziphandler v1.1.1
|
||||||
github.com/SAP/go-hdb v0.14.1
|
github.com/SAP/go-hdb v0.14.1
|
||||||
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect
|
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect
|
||||||
@@ -28,7 +28,6 @@ require (
|
|||||||
github.com/cockroachdb/apd v1.1.0 // indirect
|
github.com/cockroachdb/apd v1.1.0 // indirect
|
||||||
github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c
|
github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c
|
||||||
github.com/coreos/go-semver v0.2.0
|
github.com/coreos/go-semver v0.2.0
|
||||||
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d // indirect
|
|
||||||
github.com/denisenkom/go-mssqldb v0.0.0-20190412130859-3b1d194e553a
|
github.com/denisenkom/go-mssqldb v0.0.0-20190412130859-3b1d194e553a
|
||||||
github.com/dnaeon/go-vcr v1.0.1 // indirect
|
github.com/dnaeon/go-vcr v1.0.1 // indirect
|
||||||
github.com/dsnet/compress v0.0.1 // indirect
|
github.com/dsnet/compress v0.0.1 // indirect
|
||||||
@@ -48,13 +47,14 @@ require (
|
|||||||
github.com/golang/protobuf v1.3.2
|
github.com/golang/protobuf v1.3.2
|
||||||
github.com/google/go-github v17.0.0+incompatible
|
github.com/google/go-github v17.0.0+incompatible
|
||||||
github.com/google/go-metrics-stackdriver v0.0.0-20190816035513-b52628e82e2a
|
github.com/google/go-metrics-stackdriver v0.0.0-20190816035513-b52628e82e2a
|
||||||
github.com/google/go-querystring v1.0.0 // indirect
|
github.com/grpc-ecosystem/grpc-gateway v1.8.5 // indirect
|
||||||
github.com/hashicorp/consul-template v0.22.0
|
github.com/hashicorp/consul-template v0.22.0
|
||||||
github.com/hashicorp/consul/api v1.1.0
|
github.com/hashicorp/consul/api v1.1.0
|
||||||
github.com/hashicorp/errwrap v1.0.0
|
github.com/hashicorp/errwrap v1.0.0
|
||||||
github.com/hashicorp/go-cleanhttp v0.5.1
|
github.com/hashicorp/go-cleanhttp v0.5.1
|
||||||
github.com/hashicorp/go-gcp-common v0.5.0
|
github.com/hashicorp/go-gcp-common v0.5.0
|
||||||
github.com/hashicorp/go-hclog v0.10.1
|
github.com/hashicorp/go-hclog v0.10.1
|
||||||
|
github.com/hashicorp/go-kms-wrapping v0.0.0-20191229213738-edc2c6e9ee1d
|
||||||
github.com/hashicorp/go-memdb v1.0.2
|
github.com/hashicorp/go-memdb v1.0.2
|
||||||
github.com/hashicorp/go-msgpack v0.5.5
|
github.com/hashicorp/go-msgpack v0.5.5
|
||||||
github.com/hashicorp/go-multierror v1.0.0
|
github.com/hashicorp/go-multierror v1.0.0
|
||||||
@@ -69,7 +69,7 @@ require (
|
|||||||
github.com/hashicorp/raft v1.1.2-0.20191002163536-9c6bd3e3eb17
|
github.com/hashicorp/raft v1.1.2-0.20191002163536-9c6bd3e3eb17
|
||||||
github.com/hashicorp/raft-snapshot v1.0.2-0.20190827162939-8117efcc5aab
|
github.com/hashicorp/raft-snapshot v1.0.2-0.20190827162939-8117efcc5aab
|
||||||
github.com/hashicorp/vault-plugin-auth-alicloud v0.5.2-0.20190814210027-93970f08f2ec
|
github.com/hashicorp/vault-plugin-auth-alicloud v0.5.2-0.20190814210027-93970f08f2ec
|
||||||
github.com/hashicorp/vault-plugin-auth-azure v0.5.2-0.20190814210035-08e00d801115
|
github.com/hashicorp/vault-plugin-auth-azure v0.5.2-0.20191119151105-86f21fbc96e3
|
||||||
github.com/hashicorp/vault-plugin-auth-centrify v0.5.2-0.20190814210042-090ec2ed93ce
|
github.com/hashicorp/vault-plugin-auth-centrify v0.5.2-0.20190814210042-090ec2ed93ce
|
||||||
github.com/hashicorp/vault-plugin-auth-cf v0.0.0-20190821162840-1c2205826fee
|
github.com/hashicorp/vault-plugin-auth-cf v0.0.0-20190821162840-1c2205826fee
|
||||||
github.com/hashicorp/vault-plugin-auth-gcp v0.5.2-0.20190930204802-acfd134850c2
|
github.com/hashicorp/vault-plugin-auth-gcp v0.5.2-0.20190930204802-acfd134850c2
|
||||||
@@ -80,12 +80,12 @@ require (
|
|||||||
github.com/hashicorp/vault-plugin-database-elasticsearch v0.0.0-20190814210117-e079e01fbb93
|
github.com/hashicorp/vault-plugin-database-elasticsearch v0.0.0-20190814210117-e079e01fbb93
|
||||||
github.com/hashicorp/vault-plugin-secrets-ad v0.6.2
|
github.com/hashicorp/vault-plugin-secrets-ad v0.6.2
|
||||||
github.com/hashicorp/vault-plugin-secrets-alicloud v0.5.2-0.20190814210129-4d18bec92f56
|
github.com/hashicorp/vault-plugin-secrets-alicloud v0.5.2-0.20190814210129-4d18bec92f56
|
||||||
github.com/hashicorp/vault-plugin-secrets-azure v0.5.2
|
github.com/hashicorp/vault-plugin-secrets-azure v0.5.3-0.20191119150734-45c076c82f1d
|
||||||
github.com/hashicorp/vault-plugin-secrets-gcp v0.5.3-0.20191112195538-3c798536d157
|
github.com/hashicorp/vault-plugin-secrets-gcp v0.5.3-0.20191119222840-524d5b57ed36
|
||||||
github.com/hashicorp/vault-plugin-secrets-gcpkms v0.5.2-0.20190814210149-315cdbf5de6e
|
github.com/hashicorp/vault-plugin-secrets-gcpkms v0.5.2-0.20190814210149-315cdbf5de6e
|
||||||
github.com/hashicorp/vault-plugin-secrets-kv v0.5.2-0.20191017213228-e8cf7060a4d0
|
github.com/hashicorp/vault-plugin-secrets-kv v0.5.2-0.20191017213228-e8cf7060a4d0
|
||||||
github.com/hashicorp/vault/api v1.0.5-0.20191218213558-0bc25f908162
|
github.com/hashicorp/vault/api v1.0.5-0.20191218213558-0bc25f908162
|
||||||
github.com/hashicorp/vault/sdk v0.1.14-0.20191218213202-9caafff72a1f
|
github.com/hashicorp/vault/sdk v0.1.14-0.20191229212425-c478d00be0d6
|
||||||
github.com/influxdata/influxdb v0.0.0-20190411212539-d24b7ba8c4c4
|
github.com/influxdata/influxdb v0.0.0-20190411212539-d24b7ba8c4c4
|
||||||
github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 // indirect
|
github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 // indirect
|
||||||
github.com/jackc/pgx v3.3.0+incompatible // indirect
|
github.com/jackc/pgx v3.3.0+incompatible // indirect
|
||||||
@@ -94,7 +94,6 @@ require (
|
|||||||
github.com/joyent/triton-go v0.0.0-20190112182421-51ffac552869
|
github.com/joyent/triton-go v0.0.0-20190112182421-51ffac552869
|
||||||
github.com/keybase/go-crypto v0.0.0-20190403132359-d65b6b94177f
|
github.com/keybase/go-crypto v0.0.0-20190403132359-d65b6b94177f
|
||||||
github.com/kr/pretty v0.1.0
|
github.com/kr/pretty v0.1.0
|
||||||
github.com/kr/pty v1.1.3 // indirect
|
|
||||||
github.com/kr/text v0.1.0
|
github.com/kr/text v0.1.0
|
||||||
github.com/lib/pq v1.2.0
|
github.com/lib/pq v1.2.0
|
||||||
github.com/mattn/go-colorable v0.1.4
|
github.com/mattn/go-colorable v0.1.4
|
||||||
@@ -109,7 +108,7 @@ require (
|
|||||||
github.com/ncw/swift v1.0.47
|
github.com/ncw/swift v1.0.47
|
||||||
github.com/nwaples/rardecode v1.0.0 // indirect
|
github.com/nwaples/rardecode v1.0.0 // indirect
|
||||||
github.com/oklog/run v1.0.0
|
github.com/oklog/run v1.0.0
|
||||||
github.com/oracle/oci-go-sdk v7.0.0+incompatible
|
github.com/oracle/oci-go-sdk v12.5.0+incompatible
|
||||||
github.com/ory/dockertest v3.3.5+incompatible
|
github.com/ory/dockertest v3.3.5+incompatible
|
||||||
github.com/patrickmn/go-cache v2.1.0+incompatible
|
github.com/patrickmn/go-cache v2.1.0+incompatible
|
||||||
github.com/pkg/errors v0.8.1
|
github.com/pkg/errors v0.8.1
|
||||||
@@ -130,9 +129,8 @@ require (
|
|||||||
go.uber.org/atomic v1.4.0
|
go.uber.org/atomic v1.4.0
|
||||||
golang.org/x/crypto v0.0.0-20191106202628-ed6320f186d4
|
golang.org/x/crypto v0.0.0-20191106202628-ed6320f186d4
|
||||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7
|
||||||
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45
|
||||||
google.golang.org/api v0.5.0
|
google.golang.org/api v0.14.0
|
||||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64
|
|
||||||
google.golang.org/grpc v1.22.0
|
google.golang.org/grpc v1.22.0
|
||||||
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce
|
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce
|
||||||
gopkg.in/ory-am/dockertest.v3 v3.3.4
|
gopkg.in/ory-am/dockertest.v3 v3.3.4
|
||||||
|
|||||||
156
go.sum
156
go.sum
@@ -2,25 +2,46 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
|
|||||||
cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
cloud.google.com/go v0.37.2/go.mod h1:H8IAquKe2L30IxoupDgqTaQvKSwF/c8prYHynGIWQbA=
|
cloud.google.com/go v0.37.2/go.mod h1:H8IAquKe2L30IxoupDgqTaQvKSwF/c8prYHynGIWQbA=
|
||||||
cloud.google.com/go v0.37.4 h1:glPeL3BQJsbF6aIIYfZizMwc5LTYz250bDMjttbBGAU=
|
|
||||||
cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
|
cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
|
||||||
|
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||||
cloud.google.com/go v0.39.0 h1:UgQP9na6OTfp4dsAiz/eFpFA1C6tPdH5wiRdi19tuMw=
|
cloud.google.com/go v0.39.0 h1:UgQP9na6OTfp4dsAiz/eFpFA1C6tPdH5wiRdi19tuMw=
|
||||||
cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts=
|
cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts=
|
||||||
code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f h1:UrKzEwTgeiff9vxdrfdqxibzpWjxLnuXDI5m6z3GJAk=
|
code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f h1:UrKzEwTgeiff9vxdrfdqxibzpWjxLnuXDI5m6z3GJAk=
|
||||||
code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f/go.mod h1:sk5LnIjB/nIEU7yP5sDQExVm62wu0pBh3yrElngUisI=
|
code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f/go.mod h1:sk5LnIjB/nIEU7yP5sDQExVm62wu0pBh3yrElngUisI=
|
||||||
contrib.go.opencensus.io/exporter/ocagent v0.4.12 h1:jGFvw3l57ViIVEPKKEUXPcLYIXJmQxLUh6ey1eJhwyc=
|
|
||||||
contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA=
|
|
||||||
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
|
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
|
||||||
git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
|
git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
|
||||||
github.com/Azure/azure-sdk-for-go v29.0.0+incompatible h1:CYPU39ULbGjQBo3gXIqiWouK0C4F+Pt2Zx5CqGvqknE=
|
github.com/Azure/azure-sdk-for-go v36.2.0+incompatible h1:09cv2WoH0g6jl6m2iT+R9qcIPZKhXEL0sbmLhxP895s=
|
||||||
github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
|
github.com/Azure/azure-sdk-for-go v36.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=
|
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
|
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
|
||||||
github.com/Azure/go-autorest v11.7.1+incompatible h1:M2YZIajBBVekV86x0rr1443Lc1F/Ylxb9w+5EtSyX3Q=
|
github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
|
||||||
github.com/Azure/go-autorest v11.7.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
|
github.com/Azure/go-autorest/autorest v0.9.2 h1:6AWuh3uWrsZJcNoCHrCF/+g4aKPCU39kaMO6/qrnK/4=
|
||||||
|
github.com/Azure/go-autorest/autorest v0.9.2/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.6.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.7.0 h1:PUMxSVw3tEImG0JTRqbxjXLKCSoPk7DartDELqlOuiI=
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.7.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
|
||||||
|
github.com/Azure/go-autorest/autorest/azure/auth v0.4.0 h1:18ld/uw9Rr7VkNie7a7RMAcFIWrJdlUL59TWGfcu530=
|
||||||
|
github.com/Azure/go-autorest/autorest/azure/auth v0.4.0/go.mod h1:Oo5cRhLvZteXzI2itUm5ziqsoIxRkzrt3t61FeZaS18=
|
||||||
|
github.com/Azure/go-autorest/autorest/azure/cli v0.3.0 h1:5PAqnv+CSTwW9mlZWZAizmzrazFWEgZykEZXpr2hDtY=
|
||||||
|
github.com/Azure/go-autorest/autorest/azure/cli v0.3.0/go.mod h1:rNYMNAefZMRowqCV0cVhr/YDW5dD7afFq9nXAXL4ykE=
|
||||||
|
github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
|
||||||
|
github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM=
|
||||||
|
github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc=
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
|
||||||
|
github.com/Azure/go-autorest/autorest/to v0.3.0 h1:zebkZaadz7+wIQYgC7GXaz3Wb28yKYfVkkBKwc38VF8=
|
||||||
|
github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA=
|
||||||
|
github.com/Azure/go-autorest/autorest/validation v0.2.0 h1:15vMO4y76dehZSq7pAaOLQxC6dZYsSrj2GQpflyM/L4=
|
||||||
|
github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI=
|
||||||
|
github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY=
|
||||||
|
github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
|
||||||
|
github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k=
|
||||||
|
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
|
||||||
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/DataDog/datadog-go v2.2.0+incompatible h1:V5BKkxACZLjzHjSgBbr2gvLA2Ae49yhc6CSY7MLy5k4=
|
|
||||||
github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||||
github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4=
|
github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4=
|
||||||
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||||
@@ -44,7 +65,6 @@ github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af h1:DBNMBMuMiWYu0b+8KM
|
|||||||
github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw=
|
github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw=
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190412020505-60e2075261b6 h1:5RwdKFlGKokYBbq4M2ZZ0LzfxdK4e1L4rwQH+76wPkE=
|
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190412020505-60e2075261b6/go.mod h1:T9M45xf79ahXVelWoOBmH0y4aC1t5kXO5BxwyakgIGA=
|
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190412020505-60e2075261b6/go.mod h1:T9M45xf79ahXVelWoOBmH0y4aC1t5kXO5BxwyakgIGA=
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190620160927-9418d7b0cd0f h1:oRD16bhpKNAanfcDDVU+J0NXqsgHIvGbbe/sy+r6Rs0=
|
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190620160927-9418d7b0cd0f h1:oRD16bhpKNAanfcDDVU+J0NXqsgHIvGbbe/sy+r6Rs0=
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190620160927-9418d7b0cd0f/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ=
|
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190620160927-9418d7b0cd0f/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ=
|
||||||
@@ -55,9 +75,7 @@ github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb
|
|||||||
github.com/apple/foundationdb/bindings/go v0.0.0-20190411004307-cd5c9d91fad2 h1:VoHKYIXEQU5LWoambPBOvYxyLqZYHuj+rj5DVnMUc3k=
|
github.com/apple/foundationdb/bindings/go v0.0.0-20190411004307-cd5c9d91fad2 h1:VoHKYIXEQU5LWoambPBOvYxyLqZYHuj+rj5DVnMUc3k=
|
||||||
github.com/apple/foundationdb/bindings/go v0.0.0-20190411004307-cd5c9d91fad2/go.mod h1:OMVSB21p9+xQUIqlGizHPZfjK+SHws1ht+ZytVDoz9U=
|
github.com/apple/foundationdb/bindings/go v0.0.0-20190411004307-cd5c9d91fad2/go.mod h1:OMVSB21p9+xQUIqlGizHPZfjK+SHws1ht+ZytVDoz9U=
|
||||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
||||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=
|
|
||||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
||||||
github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 h1:EFSB7Zo9Eg91v7MJPVsifUysc/wPdN+NOnVe6bWbdBM=
|
|
||||||
github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg=
|
github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg=
|
||||||
github.com/armon/go-metrics v0.3.0 h1:B7AQgHi8QSEi4uHu7Sbsga+IJDU+CENgjxoo81vDUqU=
|
github.com/armon/go-metrics v0.3.0 h1:B7AQgHi8QSEi4uHu7Sbsga+IJDU+CENgjxoo81vDUqU=
|
||||||
github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs=
|
github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs=
|
||||||
@@ -68,6 +86,7 @@ github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI=
|
|||||||
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
||||||
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf h1:eg0MeVzsP1G42dRafH3vf+al2vQIJU0YHX+1Tw87oco=
|
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf h1:eg0MeVzsP1G42dRafH3vf+al2vQIJU0YHX+1Tw87oco=
|
||||||
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
|
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
|
||||||
|
github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||||
github.com/aws/aws-sdk-go v1.25.41 h1:/hj7nZ0586wFqpwjNpzWiUTwtaMgxAZNZKHay80MdXw=
|
github.com/aws/aws-sdk-go v1.25.41 h1:/hj7nZ0586wFqpwjNpzWiUTwtaMgxAZNZKHay80MdXw=
|
||||||
github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||||
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA=
|
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA=
|
||||||
@@ -80,7 +99,6 @@ github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYE
|
|||||||
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
|
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
|
||||||
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
|
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
|
||||||
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
|
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
|
||||||
github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4=
|
|
||||||
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
|
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
|
||||||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI=
|
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI=
|
||||||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
|
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
|
||||||
@@ -89,8 +107,6 @@ github.com/briankassouf/jose v0.9.2-0.20180619214549-d2569464773f h1:ZMEzE7R0WNq
|
|||||||
github.com/briankassouf/jose v0.9.2-0.20180619214549-d2569464773f/go.mod h1:HQhVmdUf7dBNwIIdBTivnCDxcf6IZY3/zrb+uKSJz6Y=
|
github.com/briankassouf/jose v0.9.2-0.20180619214549-d2569464773f/go.mod h1:HQhVmdUf7dBNwIIdBTivnCDxcf6IZY3/zrb+uKSJz6Y=
|
||||||
github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
|
github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
|
||||||
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
|
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.0 h1:LzQXZOgg4CQfE6bFvXGM30YZL1WW/M337pXml+GrcZ4=
|
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
|
||||||
github.com/centrify/cloud-golang-sdk v0.0.0-20190214225812-119110094d0f h1:gJzxrodnNd/CtPXjO3WYiakyNzHg3rtAi7rO74ejHYU=
|
github.com/centrify/cloud-golang-sdk v0.0.0-20190214225812-119110094d0f h1:gJzxrodnNd/CtPXjO3WYiakyNzHg3rtAi7rO74ejHYU=
|
||||||
github.com/centrify/cloud-golang-sdk v0.0.0-20190214225812-119110094d0f/go.mod h1:C0rtzmGXgN78pYR0tGJFhtHgkbAs0lIbHwkB81VxDQE=
|
github.com/centrify/cloud-golang-sdk v0.0.0-20190214225812-119110094d0f/go.mod h1:C0rtzmGXgN78pYR0tGJFhtHgkbAs0lIbHwkB81VxDQE=
|
||||||
github.com/chrismalek/oktasdk-go v0.0.0-20181212195951-3430665dfaa0 h1:CWU8piLyqoi9qXEUwzOh5KFKGgmSU5ZhktJyYcq6ryQ=
|
github.com/chrismalek/oktasdk-go v0.0.0-20181212195951-3430665dfaa0 h1:CWU8piLyqoi9qXEUwzOh5KFKGgmSU5ZhktJyYcq6ryQ=
|
||||||
@@ -99,7 +115,6 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyY
|
|||||||
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
|
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
|
||||||
github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA=
|
github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA=
|
||||||
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
|
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
|
||||||
github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI=
|
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cloudfoundry-community/go-cfclient v0.0.0-20190201205600-f136f9222381 h1:rdRS5BT13Iae9ssvcslol66gfOOXjaLYwqerEn/cl9s=
|
github.com/cloudfoundry-community/go-cfclient v0.0.0-20190201205600-f136f9222381 h1:rdRS5BT13Iae9ssvcslol66gfOOXjaLYwqerEn/cl9s=
|
||||||
github.com/cloudfoundry-community/go-cfclient v0.0.0-20190201205600-f136f9222381/go.mod h1:e5+USP2j8Le2M0Jo3qKPFnNhuo1wueU4nWHCXBOfQ14=
|
github.com/cloudfoundry-community/go-cfclient v0.0.0-20190201205600-f136f9222381/go.mod h1:e5+USP2j8Le2M0Jo3qKPFnNhuo1wueU4nWHCXBOfQ14=
|
||||||
@@ -115,7 +130,6 @@ github.com/coreos/go-oidc v2.0.0+incompatible h1:+RStIopZ8wooMx+Vs5Bt8zMXxV1ABl5
|
|||||||
github.com/coreos/go-oidc v2.0.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
|
github.com/coreos/go-oidc v2.0.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
|
||||||
github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY=
|
github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY=
|
||||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7 h1:u9SHYsPQNyt5tgDm3YN7+9dYrpK96E5wFilTFWIDZOM=
|
|
||||||
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d h1:t5Wuyh53qYyg9eqn4BbnlIT+vmhyww0TatL+zT3uWgI=
|
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d h1:t5Wuyh53qYyg9eqn4BbnlIT+vmhyww0TatL+zT3uWgI=
|
||||||
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
@@ -134,7 +148,6 @@ github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY=
|
|||||||
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
|
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
|
||||||
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
|
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
|
||||||
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
|
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
|
||||||
github.com/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk=
|
|
||||||
github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||||
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
|
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
|
||||||
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||||
@@ -190,16 +203,13 @@ github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dT
|
|||||||
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
|
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
|
||||||
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31 h1:28FVBuwkwowZMjbA7M0wXsI6t3PYulRTMio3SO+eKCM=
|
|
||||||
github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
|
github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
|
||||||
github.com/go-test/deep v1.0.2 h1:onZX1rnHT3Wv6cqNgYyFOOlgVKJrksuCMCRvJStbMYw=
|
github.com/go-test/deep v1.0.2 h1:onZX1rnHT3Wv6cqNgYyFOOlgVKJrksuCMCRvJStbMYw=
|
||||||
github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
|
github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
|
||||||
github.com/gocql/gocql v0.0.0-20190402132108-0e1d5de854df h1:fwXmhM0OqixzJDOGgTSyNH9eEDij9uGTXwsyWXvyR0A=
|
github.com/gocql/gocql v0.0.0-20190402132108-0e1d5de854df h1:fwXmhM0OqixzJDOGgTSyNH9eEDij9uGTXwsyWXvyR0A=
|
||||||
github.com/gocql/gocql v0.0.0-20190402132108-0e1d5de854df/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0=
|
github.com/gocql/gocql v0.0.0-20190402132108-0e1d5de854df/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0=
|
||||||
github.com/gogo/protobuf v1.0.0 h1:2jyBKDKU/8v3v2xVR2PtiWQviFUyiaGk2rpfyFT8rTM=
|
|
||||||
github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
github.com/gogo/protobuf v1.2.0 h1:xU6/SpYbvkNYiptHJYEDRseDLvYE7wSqhYYNy0QSUzI=
|
|
||||||
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
|
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
|
||||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||||
@@ -211,9 +221,7 @@ github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4er
|
|||||||
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
|
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
|
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
@@ -221,15 +229,11 @@ github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8l
|
|||||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
||||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a h1:ZJu5NB1Bk5ms4vw0Xu4i+jD32SE9jQXyfnOvwhHqlT0=
|
|
||||||
github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=
|
|
||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
|
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
|
||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
|
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
|
|
||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
|
github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
|
||||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
@@ -248,8 +252,9 @@ github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA=
|
|||||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/googleapis/gax-go v2.0.0+incompatible h1:j0GKcs05QVmm7yesiZq2+9cxHkNK9YM6zKx4D2qucQU=
|
github.com/googleapis/gax-go v2.0.0+incompatible h1:j0GKcs05QVmm7yesiZq2+9cxHkNK9YM6zKx4D2qucQU=
|
||||||
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
|
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.4 h1:hU4mGcQI4DaAYW+IbTun+2qEZVFxK0ySjQLTbS0VQKc=
|
|
||||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
|
github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20180628210949-0892b62f0d9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
github.com/gopherjs/gopherjs v0.0.0-20180628210949-0892b62f0d9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
|
||||||
@@ -267,7 +272,6 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de
|
|||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.4.1 h1:pX7cnDwSSmG0dR9yNjCQSSpmsJOqFdT7SzVp5Yl9uVw=
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.4.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
|
github.com/grpc-ecosystem/grpc-gateway v1.4.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
|
github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
|
github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
|
||||||
@@ -291,20 +295,21 @@ github.com/hashicorp/go-gatedio v0.5.0/go.mod h1:Lr3t8L6IyxD3DAeaUxGcgl2JnRUpWMC
|
|||||||
github.com/hashicorp/go-gcp-common v0.5.0 h1:kkIQTjNTopn4eXQ1+lCiHYZXUtgIZvbc6YtAQkMnTos=
|
github.com/hashicorp/go-gcp-common v0.5.0 h1:kkIQTjNTopn4eXQ1+lCiHYZXUtgIZvbc6YtAQkMnTos=
|
||||||
github.com/hashicorp/go-gcp-common v0.5.0/go.mod h1:IDGUI2N/OS3PiU4qZcXJeWKPI6O/9Y8hOrbSiMcqyYw=
|
github.com/hashicorp/go-gcp-common v0.5.0/go.mod h1:IDGUI2N/OS3PiU4qZcXJeWKPI6O/9Y8hOrbSiMcqyYw=
|
||||||
github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI=
|
github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI=
|
||||||
github.com/hashicorp/go-hclog v0.8.0 h1:z3ollgGRg8RjfJH6UVBaG54R70GFd++QOkvnJH3VSBY=
|
|
||||||
github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
|
github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
|
||||||
github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
|
github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
|
||||||
github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI=
|
|
||||||
github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
|
github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
|
||||||
|
github.com/hashicorp/go-hclog v0.10.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
|
||||||
github.com/hashicorp/go-hclog v0.10.1 h1:uyt/l0dWjJ879yiAu+T7FG3/6QX+zwm4bQ8P7XsYt3o=
|
github.com/hashicorp/go-hclog v0.10.1 h1:uyt/l0dWjJ879yiAu+T7FG3/6QX+zwm4bQ8P7XsYt3o=
|
||||||
github.com/hashicorp/go-hclog v0.10.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
|
github.com/hashicorp/go-hclog v0.10.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
|
||||||
github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=
|
|
||||||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||||
github.com/hashicorp/go-immutable-radix v1.1.0 h1:vN9wG1D6KG6YHRTWr8512cxGOVgTMEfgEdSj/hr8MPc=
|
github.com/hashicorp/go-immutable-radix v1.1.0 h1:vN9wG1D6KG6YHRTWr8512cxGOVgTMEfgEdSj/hr8MPc=
|
||||||
github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||||
|
github.com/hashicorp/go-kms-wrapping v0.0.0-20191129225826-634facde9f88 h1:YMLQiDrLQT1QEollUbw+yxpW0yJiKVHDGmMpBISeACA=
|
||||||
|
github.com/hashicorp/go-kms-wrapping v0.0.0-20191129225826-634facde9f88/go.mod h1:Pm+Umb/6Gij6ZG534L7QDyvkauaOQWGb+arj9aFjCE0=
|
||||||
|
github.com/hashicorp/go-kms-wrapping v0.0.0-20191229213738-edc2c6e9ee1d h1:smWxnN+O7eRYqt0nDSwdbxacOczfnf3hMAxT9SMxeno=
|
||||||
|
github.com/hashicorp/go-kms-wrapping v0.0.0-20191229213738-edc2c6e9ee1d/go.mod h1:cGIibZmMx9qlxS1pZTUrEgGqA+7u3zJyvVYMhjU2bDs=
|
||||||
github.com/hashicorp/go-memdb v1.0.2 h1:AIjzJlwIxz2inhZqRJZfe6D15lPeF0/cZyS1BVlnlHg=
|
github.com/hashicorp/go-memdb v1.0.2 h1:AIjzJlwIxz2inhZqRJZfe6D15lPeF0/cZyS1BVlnlHg=
|
||||||
github.com/hashicorp/go-memdb v1.0.2/go.mod h1:I6dKdmYhZqU0RJSheVEWgTNWdVQH5QvTgIUQ0t/t32M=
|
github.com/hashicorp/go-memdb v1.0.2/go.mod h1:I6dKdmYhZqU0RJSheVEWgTNWdVQH5QvTgIUQ0t/t32M=
|
||||||
github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=
|
|
||||||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
||||||
github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=
|
github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=
|
||||||
github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
||||||
@@ -314,13 +319,10 @@ github.com/hashicorp/go-plugin v1.0.1 h1:4OtAfUGbnKC6yS48p0CtMX2oFYtzFZVv6rok3cR
|
|||||||
github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY=
|
github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY=
|
||||||
github.com/hashicorp/go-raftchunking v0.6.3-0.20191002164813-7e9e8525653a h1:FmnBDwGwlTgugDGbVxwV8UavqSMACbGrUpfc98yFLR4=
|
github.com/hashicorp/go-raftchunking v0.6.3-0.20191002164813-7e9e8525653a h1:FmnBDwGwlTgugDGbVxwV8UavqSMACbGrUpfc98yFLR4=
|
||||||
github.com/hashicorp/go-raftchunking v0.6.3-0.20191002164813-7e9e8525653a/go.mod h1:xbXnmKqX9/+RhPkJ4zrEx4738HacP72aaUPlT2RZ4sU=
|
github.com/hashicorp/go-raftchunking v0.6.3-0.20191002164813-7e9e8525653a/go.mod h1:xbXnmKqX9/+RhPkJ4zrEx4738HacP72aaUPlT2RZ4sU=
|
||||||
github.com/hashicorp/go-retryablehttp v0.5.3 h1:QlWt0KvWT0lq8MFppF9tsJGF+ynG7ztc2KIPhzRGk7s=
|
|
||||||
github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
|
github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
|
||||||
github.com/hashicorp/go-retryablehttp v0.5.4 h1:1BZvpawXoJCWX6pNtow9+rpEj+3itIlutiqnntI6jOE=
|
|
||||||
github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
|
github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
|
||||||
github.com/hashicorp/go-retryablehttp v0.6.2 h1:bHM2aVXwBtBJWxHtkSrWuI4umABCUczs52eiUS9nSiw=
|
github.com/hashicorp/go-retryablehttp v0.6.2 h1:bHM2aVXwBtBJWxHtkSrWuI4umABCUczs52eiUS9nSiw=
|
||||||
github.com/hashicorp/go-retryablehttp v0.6.2/go.mod h1:gEx6HMUGxYYhJScX7W1Il64m6cc2C1mDaW3NQ9sY1FY=
|
github.com/hashicorp/go-retryablehttp v0.6.2/go.mod h1:gEx6HMUGxYYhJScX7W1Il64m6cc2C1mDaW3NQ9sY1FY=
|
||||||
github.com/hashicorp/go-rootcerts v1.0.0 h1:Rqb66Oo1X/eSV1x66xbDccZjhJigjg0+e82kpwzSwCI=
|
|
||||||
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
|
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
|
||||||
github.com/hashicorp/go-rootcerts v1.0.1 h1:DMo4fmknnz0E0evoNYnV48RjWndOsmd6OW+09R3cEP8=
|
github.com/hashicorp/go-rootcerts v1.0.1 h1:DMo4fmknnz0E0evoNYnV48RjWndOsmd6OW+09R3cEP8=
|
||||||
github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
|
github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
|
||||||
@@ -330,11 +332,9 @@ github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjG
|
|||||||
github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE=
|
github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE=
|
||||||
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
|
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
|
||||||
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE=
|
|
||||||
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
github.com/hashicorp/go-uuid v1.0.2-0.20191001231223-f32f5fe8d6a8 h1:PKbxRbsOP7R3f/TpdqcgXrO69T3yd9nLoR+RMRUxSxA=
|
github.com/hashicorp/go-uuid v1.0.2-0.20191001231223-f32f5fe8d6a8 h1:PKbxRbsOP7R3f/TpdqcgXrO69T3yd9nLoR+RMRUxSxA=
|
||||||
github.com/hashicorp/go-uuid v1.0.2-0.20191001231223-f32f5fe8d6a8/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
github.com/hashicorp/go-uuid v1.0.2-0.20191001231223-f32f5fe8d6a8/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
github.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0=
|
|
||||||
github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
||||||
github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E=
|
github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E=
|
||||||
github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
||||||
@@ -342,7 +342,6 @@ github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA
|
|||||||
github.com/hashicorp/gokrb5 v7.3.1-0.20191209171754-1a6fa9886ec3+incompatible h1:9fIGLV0+jeF9D/oT4gZE0oh336tsKA7mxjinPOxKIjU=
|
github.com/hashicorp/gokrb5 v7.3.1-0.20191209171754-1a6fa9886ec3+incompatible h1:9fIGLV0+jeF9D/oT4gZE0oh336tsKA7mxjinPOxKIjU=
|
||||||
github.com/hashicorp/gokrb5 v7.3.1-0.20191209171754-1a6fa9886ec3+incompatible/go.mod h1:ke+MQBkyg7J7V+tM7GWSeDTlF27zlpm+u9nP3AANFEg=
|
github.com/hashicorp/gokrb5 v7.3.1-0.20191209171754-1a6fa9886ec3+incompatible/go.mod h1:ke+MQBkyg7J7V+tM7GWSeDTlF27zlpm+u9nP3AANFEg=
|
||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk=
|
github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk=
|
||||||
github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
||||||
@@ -362,19 +361,17 @@ github.com/hashicorp/raft v1.1.2-0.20191002163536-9c6bd3e3eb17/go.mod h1:vPAJM8A
|
|||||||
github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk=
|
github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk=
|
||||||
github.com/hashicorp/raft-snapshot v1.0.2-0.20190827162939-8117efcc5aab h1:WzGMwlO1DvaC93SvVOBOKtn+nXGEDXapyJuaRV3/VaY=
|
github.com/hashicorp/raft-snapshot v1.0.2-0.20190827162939-8117efcc5aab h1:WzGMwlO1DvaC93SvVOBOKtn+nXGEDXapyJuaRV3/VaY=
|
||||||
github.com/hashicorp/raft-snapshot v1.0.2-0.20190827162939-8117efcc5aab/go.mod h1:5sL9eUn72lH5DzsFIJ9jaysITbHksSSszImWSOTC8Ic=
|
github.com/hashicorp/raft-snapshot v1.0.2-0.20190827162939-8117efcc5aab/go.mod h1:5sL9eUn72lH5DzsFIJ9jaysITbHksSSszImWSOTC8Ic=
|
||||||
github.com/hashicorp/serf v0.8.2 h1:YZ7UKsJv+hKjqGVUUbtE3HNj79Eln2oQ75tniF6iPt0=
|
|
||||||
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
|
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
|
||||||
github.com/hashicorp/serf v0.8.3 h1:MWYcmct5EtKz0efYooPcL0yNkem+7kWxqXDi/UIh+8k=
|
github.com/hashicorp/serf v0.8.3 h1:MWYcmct5EtKz0efYooPcL0yNkem+7kWxqXDi/UIh+8k=
|
||||||
github.com/hashicorp/serf v0.8.3/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc1oal+k=
|
github.com/hashicorp/serf v0.8.3/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc1oal+k=
|
||||||
github.com/hashicorp/vault-plugin-auth-alicloud v0.5.2-0.20190814210027-93970f08f2ec h1:HXVE8h6RXFsPJgwWpE+5CscsgekqtX4nhDlZGV9jEe4=
|
github.com/hashicorp/vault-plugin-auth-alicloud v0.5.2-0.20190814210027-93970f08f2ec h1:HXVE8h6RXFsPJgwWpE+5CscsgekqtX4nhDlZGV9jEe4=
|
||||||
github.com/hashicorp/vault-plugin-auth-alicloud v0.5.2-0.20190814210027-93970f08f2ec/go.mod h1:TYFfVFgKF9x92T7uXouI9rLPkNnyXo/KkNcj5t+mjdM=
|
github.com/hashicorp/vault-plugin-auth-alicloud v0.5.2-0.20190814210027-93970f08f2ec/go.mod h1:TYFfVFgKF9x92T7uXouI9rLPkNnyXo/KkNcj5t+mjdM=
|
||||||
github.com/hashicorp/vault-plugin-auth-azure v0.5.2-0.20190814210035-08e00d801115 h1:E57y918o+c+NoI5k7ohbpZu7vRm1XZKZfC5VQVpJvDI=
|
github.com/hashicorp/vault-plugin-auth-azure v0.5.2-0.20191119151105-86f21fbc96e3 h1:MPJR3FJzYAbj7hiy0WrUQ8anvZCnE7pZxDTPl4lKFdw=
|
||||||
github.com/hashicorp/vault-plugin-auth-azure v0.5.2-0.20190814210035-08e00d801115/go.mod h1:sRhTnkcbjJgPeES0ddCTq8S2waSakyMiWLUwO5J/Wjk=
|
github.com/hashicorp/vault-plugin-auth-azure v0.5.2-0.20191119151105-86f21fbc96e3/go.mod h1:D5qI4EY3QwWXqlpnyvRVtFw5CPlJwmlxkxN3SVQeV/U=
|
||||||
github.com/hashicorp/vault-plugin-auth-centrify v0.5.2-0.20190814210042-090ec2ed93ce h1:X8umWdCqSVk/75ZjEBDxYL+V8i+jK3KbJbFoyOryCww=
|
github.com/hashicorp/vault-plugin-auth-centrify v0.5.2-0.20190814210042-090ec2ed93ce h1:X8umWdCqSVk/75ZjEBDxYL+V8i+jK3KbJbFoyOryCww=
|
||||||
github.com/hashicorp/vault-plugin-auth-centrify v0.5.2-0.20190814210042-090ec2ed93ce/go.mod h1:WstOCHERNbk2dblnY5MV9Qeh/hzTSQpVs5xPuyAzlBo=
|
github.com/hashicorp/vault-plugin-auth-centrify v0.5.2-0.20190814210042-090ec2ed93ce/go.mod h1:WstOCHERNbk2dblnY5MV9Qeh/hzTSQpVs5xPuyAzlBo=
|
||||||
github.com/hashicorp/vault-plugin-auth-cf v0.0.0-20190821162840-1c2205826fee h1:gJG1PJGiqi+0M0HTYlwDyV5CyetLhFl9DxyMJre5H9Y=
|
github.com/hashicorp/vault-plugin-auth-cf v0.0.0-20190821162840-1c2205826fee h1:gJG1PJGiqi+0M0HTYlwDyV5CyetLhFl9DxyMJre5H9Y=
|
||||||
github.com/hashicorp/vault-plugin-auth-cf v0.0.0-20190821162840-1c2205826fee/go.mod h1:zOag32+pm1R4FFNhXMLP506Oesjoai3gHEEpxqUaTr0=
|
github.com/hashicorp/vault-plugin-auth-cf v0.0.0-20190821162840-1c2205826fee/go.mod h1:zOag32+pm1R4FFNhXMLP506Oesjoai3gHEEpxqUaTr0=
|
||||||
github.com/hashicorp/vault-plugin-auth-gcp v0.5.1 h1:8DR00s+Wmc21i3sfzvsqW88VMdf6NI2ue+onGoHshww=
|
|
||||||
github.com/hashicorp/vault-plugin-auth-gcp v0.5.1/go.mod h1:eLj92eX8MPI4vY1jaazVLF2sVbSAJ3LRHLRhF/pUmlI=
|
github.com/hashicorp/vault-plugin-auth-gcp v0.5.1/go.mod h1:eLj92eX8MPI4vY1jaazVLF2sVbSAJ3LRHLRhF/pUmlI=
|
||||||
github.com/hashicorp/vault-plugin-auth-gcp v0.5.2-0.20190930204802-acfd134850c2 h1:gtpqHauSoJCxZStLVWKMQcsdW61EewJSoegMrZLQ/GU=
|
github.com/hashicorp/vault-plugin-auth-gcp v0.5.2-0.20190930204802-acfd134850c2 h1:gtpqHauSoJCxZStLVWKMQcsdW61EewJSoegMrZLQ/GU=
|
||||||
github.com/hashicorp/vault-plugin-auth-gcp v0.5.2-0.20190930204802-acfd134850c2/go.mod h1:j0hMnnTD44zXGQhLM1jarYDaTmSp6OPiOzgFQ6mNgzc=
|
github.com/hashicorp/vault-plugin-auth-gcp v0.5.2-0.20190930204802-acfd134850c2/go.mod h1:j0hMnnTD44zXGQhLM1jarYDaTmSp6OPiOzgFQ6mNgzc=
|
||||||
@@ -392,18 +389,16 @@ github.com/hashicorp/vault-plugin-secrets-ad v0.6.2 h1:gz3TolHTqE+HitO5FXwrDhXeZ
|
|||||||
github.com/hashicorp/vault-plugin-secrets-ad v0.6.2/go.mod h1:beQFPnMIABuWeeCVPFbSAWmJgm3kcGqpswGOGOiJjYc=
|
github.com/hashicorp/vault-plugin-secrets-ad v0.6.2/go.mod h1:beQFPnMIABuWeeCVPFbSAWmJgm3kcGqpswGOGOiJjYc=
|
||||||
github.com/hashicorp/vault-plugin-secrets-alicloud v0.5.2-0.20190814210129-4d18bec92f56 h1:PGE26//x1eiAbZ1ExffhKa4y9xgDKLd9BHDZRkOzbEY=
|
github.com/hashicorp/vault-plugin-secrets-alicloud v0.5.2-0.20190814210129-4d18bec92f56 h1:PGE26//x1eiAbZ1ExffhKa4y9xgDKLd9BHDZRkOzbEY=
|
||||||
github.com/hashicorp/vault-plugin-secrets-alicloud v0.5.2-0.20190814210129-4d18bec92f56/go.mod h1:hJ42zFd3bHyE8O2liBUG+VPY0JxdMrj51TOwVGViUIU=
|
github.com/hashicorp/vault-plugin-secrets-alicloud v0.5.2-0.20190814210129-4d18bec92f56/go.mod h1:hJ42zFd3bHyE8O2liBUG+VPY0JxdMrj51TOwVGViUIU=
|
||||||
github.com/hashicorp/vault-plugin-secrets-azure v0.5.2 h1:8Jz4kl0D4+DPpP13jbIrysv1RYogUBucxC4D5xPBkiA=
|
github.com/hashicorp/vault-plugin-secrets-azure v0.5.3-0.20191119150734-45c076c82f1d h1:Upi6xoJeeElnius+UKQhnG92Qg+OK6RU7MUtV4EnTWE=
|
||||||
github.com/hashicorp/vault-plugin-secrets-azure v0.5.2/go.mod h1:SBc53adxMmf+o8zqRbqYvq+nuSrz8OHYmgmPfxVMJEo=
|
github.com/hashicorp/vault-plugin-secrets-azure v0.5.3-0.20191119150734-45c076c82f1d/go.mod h1:EPotRM+iyjLgjheuUxdhrRNqXi4PxkDZJQDjbolNUCE=
|
||||||
github.com/hashicorp/vault-plugin-secrets-gcp v0.5.3-0.20191112195538-3c798536d157 h1:fXpYB9aF6Jgv0tZFjh46GqEkH7jIiGAwkD9Gkh2RuDw=
|
github.com/hashicorp/vault-plugin-secrets-gcp v0.5.3-0.20191119222840-524d5b57ed36 h1:bZudT1kURwa3Den34VKSwn/RHevUeY5kF6zMKwQ19vA=
|
||||||
github.com/hashicorp/vault-plugin-secrets-gcp v0.5.3-0.20191112195538-3c798536d157/go.mod h1:Sc+ba3kscakE5a/pi8JJhWvXWok3cpt1P77DApmUuDc=
|
github.com/hashicorp/vault-plugin-secrets-gcp v0.5.3-0.20191119222840-524d5b57ed36/go.mod h1:2szK4N9wdRkaKFyPrde+2a5DeR6IQs1fOBPyy7XBuTY=
|
||||||
github.com/hashicorp/vault-plugin-secrets-gcpkms v0.5.2-0.20190814210149-315cdbf5de6e h1:RjQBOFneGwxhHsymNtbEUJXAjMO74GlZcmUrGqJnYxY=
|
github.com/hashicorp/vault-plugin-secrets-gcpkms v0.5.2-0.20190814210149-315cdbf5de6e h1:RjQBOFneGwxhHsymNtbEUJXAjMO74GlZcmUrGqJnYxY=
|
||||||
github.com/hashicorp/vault-plugin-secrets-gcpkms v0.5.2-0.20190814210149-315cdbf5de6e/go.mod h1:5prAHuCcBiyv+xfGBviTVYeDQUhmQYN7WrxC2gMRWeQ=
|
github.com/hashicorp/vault-plugin-secrets-gcpkms v0.5.2-0.20190814210149-315cdbf5de6e/go.mod h1:5prAHuCcBiyv+xfGBviTVYeDQUhmQYN7WrxC2gMRWeQ=
|
||||||
github.com/hashicorp/vault-plugin-secrets-kv v0.5.2-0.20191017213228-e8cf7060a4d0 h1:w4qR/yfqWOYmncR1HK1CVU7iHkqgcf0USWtbp/fTHM4=
|
github.com/hashicorp/vault-plugin-secrets-kv v0.5.2-0.20191017213228-e8cf7060a4d0 h1:w4qR/yfqWOYmncR1HK1CVU7iHkqgcf0USWtbp/fTHM4=
|
||||||
github.com/hashicorp/vault-plugin-secrets-kv v0.5.2-0.20191017213228-e8cf7060a4d0/go.mod h1:H0VKQagsJoK9o2qpULMgbspuWVnFe3G4S/K7f0Dr8qY=
|
github.com/hashicorp/vault-plugin-secrets-kv v0.5.2-0.20191017213228-e8cf7060a4d0/go.mod h1:H0VKQagsJoK9o2qpULMgbspuWVnFe3G4S/K7f0Dr8qY=
|
||||||
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb h1:b5rjCoWHc7eqmAS4/qyk21ZsHyb6Mxv/jykxvNTkU4M=
|
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb h1:b5rjCoWHc7eqmAS4/qyk21ZsHyb6Mxv/jykxvNTkU4M=
|
||||||
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
||||||
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ=
|
|
||||||
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
|
||||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||||
@@ -457,21 +452,17 @@ github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0=
|
|||||||
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11 h1:YFh+sjyJTMQSYjKwM4dFKhJPJC/wfo98tPUc17HdoYw=
|
github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11 h1:YFh+sjyJTMQSYjKwM4dFKhJPJC/wfo98tPUc17HdoYw=
|
||||||
github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11/go.mod h1:Ah2dBMoxZEqk118as2T4u4fjfXarE0pPnMJaArZQZsI=
|
github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11/go.mod h1:Ah2dBMoxZEqk118as2T4u4fjfXarE0pPnMJaArZQZsI=
|
||||||
github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4=
|
|
||||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||||
github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA=
|
github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA=
|
||||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs=
|
|
||||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
|
|
||||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10=
|
github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10=
|
||||||
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
|
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
|
||||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
github.com/mattn/go-shellwords v1.0.5 h1:JhhFTIOslh5ZsPrpa3Wdg8bF0WI3b44EMblmU9wIsXc=
|
github.com/mattn/go-shellwords v1.0.5 h1:JhhFTIOslh5ZsPrpa3Wdg8bF0WI3b44EMblmU9wIsXc=
|
||||||
github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
|
github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.0 h1:YNOwxxSJzSUARoD9KRZLzM9Y858MNGCOACTvCW9TSAc=
|
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.0/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.0/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
@@ -496,14 +487,12 @@ github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUb
|
|||||||
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
|
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
|
||||||
github.com/mitchellh/hashstructure v1.0.0 h1:ZkRJX1CyOoTkar7p/mLS5TZU4nJ1Rn/F8u9dGS02Q3Y=
|
github.com/mitchellh/hashstructure v1.0.0 h1:ZkRJX1CyOoTkar7p/mLS5TZU4nJ1Rn/F8u9dGS02Q3Y=
|
||||||
github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ=
|
github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ=
|
||||||
github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY=
|
|
||||||
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
|
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
|
||||||
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
|
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
|
||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
github.com/mitchellh/pointerstructure v0.0.0-20190430161007-f252a8fd71c8 h1:1CO5wil3HuiVLrUQ2ovSTO+6AfNOA5EMkHHVyHE9IwA=
|
github.com/mitchellh/pointerstructure v0.0.0-20190430161007-f252a8fd71c8 h1:1CO5wil3HuiVLrUQ2ovSTO+6AfNOA5EMkHHVyHE9IwA=
|
||||||
github.com/mitchellh/pointerstructure v0.0.0-20190430161007-f252a8fd71c8/go.mod h1:k4XwG94++jLVsSiTxo7qdIfXA9pj9EAeo0QsNNJOLZ8=
|
github.com/mitchellh/pointerstructure v0.0.0-20190430161007-f252a8fd71c8/go.mod h1:k4XwG94++jLVsSiTxo7qdIfXA9pj9EAeo0QsNNJOLZ8=
|
||||||
github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY=
|
|
||||||
github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
||||||
github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE=
|
github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE=
|
||||||
github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
||||||
@@ -522,13 +511,11 @@ github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw=
|
|||||||
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
|
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
|
||||||
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=
|
|
||||||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w=
|
github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w=
|
||||||
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU=
|
|
||||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo=
|
github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo=
|
||||||
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
@@ -541,26 +528,23 @@ github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59P
|
|||||||
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
|
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
|
||||||
github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
|
github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
|
||||||
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
|
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
|
||||||
github.com/oracle/oci-go-sdk v7.0.0+incompatible h1:oj5ESjXwwkFRdhZSnPlShvLWYdt/IZ65RQxveYM3maA=
|
|
||||||
github.com/oracle/oci-go-sdk v7.0.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888=
|
github.com/oracle/oci-go-sdk v7.0.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888=
|
||||||
github.com/ory/dockertest v3.3.4+incompatible h1:VrpM6Gqg7CrPm3bL4Wm1skO+zFWLbh7/Xb5kGEbJRh8=
|
github.com/oracle/oci-go-sdk v12.5.0+incompatible h1:pr08ECoaDKHWO9tnzJB1YqClEs7ZK1CFOez2DQocH14=
|
||||||
|
github.com/oracle/oci-go-sdk v12.5.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888=
|
||||||
github.com/ory/dockertest v3.3.4+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs=
|
github.com/ory/dockertest v3.3.4+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs=
|
||||||
github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA=
|
github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA=
|
||||||
github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs=
|
github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs=
|
||||||
github.com/oxtoacart/bpool v0.0.0-20150712133111-4e1c5567d7c2 h1:CXwSGu/LYmbjEab5aMCs5usQRVBGThelUKBNnoSOuso=
|
github.com/oxtoacart/bpool v0.0.0-20150712133111-4e1c5567d7c2 h1:CXwSGu/LYmbjEab5aMCs5usQRVBGThelUKBNnoSOuso=
|
||||||
github.com/oxtoacart/bpool v0.0.0-20150712133111-4e1c5567d7c2/go.mod h1:L3UMQOThbttwfYRNFOWLLVXMhk5Lkio4GGOtw5UrxS0=
|
github.com/oxtoacart/bpool v0.0.0-20150712133111-4e1c5567d7c2/go.mod h1:L3UMQOThbttwfYRNFOWLLVXMhk5Lkio4GGOtw5UrxS0=
|
||||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=
|
|
||||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||||
github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
|
github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
|
||||||
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||||
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
|
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
|
||||||
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
|
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
|
||||||
github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I=
|
|
||||||
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||||
github.com/pierrec/lz4 v2.2.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
github.com/pierrec/lz4 v2.2.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||||
github.com/pierrec/lz4 v2.2.6+incompatible h1:6aCX4/YZ9v8q69hTyiR7dNLnTA3fgtKHVVW5BCd5Znw=
|
github.com/pierrec/lz4 v2.2.6+incompatible h1:6aCX4/YZ9v8q69hTyiR7dNLnTA3fgtKHVVW5BCd5Znw=
|
||||||
github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||||
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
|
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
@@ -573,24 +557,20 @@ github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAm
|
|||||||
github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
|
github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
|
||||||
github.com/pquerna/otp v1.2.1-0.20191009055518-468c2dd2b58d h1:PinQItctnaL2LtkaSM678+ZLLy5TajwOeXzWvYC7tII=
|
github.com/pquerna/otp v1.2.1-0.20191009055518-468c2dd2b58d h1:PinQItctnaL2LtkaSM678+ZLLy5TajwOeXzWvYC7tII=
|
||||||
github.com/pquerna/otp v1.2.1-0.20191009055518-468c2dd2b58d/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg=
|
github.com/pquerna/otp v1.2.1-0.20191009055518-468c2dd2b58d/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg=
|
||||||
github.com/prometheus/client_golang v0.8.0 h1:1921Yw9Gc3iSc4VQh3PIoOqgPCZS7G/4xQNVUp8Mda8=
|
|
||||||
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
|
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
|
||||||
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829 h1:D+CiwcpGTW6pL6bv6KI3KbyEyCKyS+1JWS2h8PNDnGA=
|
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829 h1:D+CiwcpGTW6pL6bv6KI3KbyEyCKyS+1JWS2h8PNDnGA=
|
||||||
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
|
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
|
||||||
github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612 h1:13pIdM2tpaDi4OVe24fgoIS7ZTqMt0QI+bwQsX5hq+g=
|
|
||||||
github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f h1:BVwpUVJDADN2ufcGik7W992pyps0wZ888b/y9GXcLTU=
|
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f h1:BVwpUVJDADN2ufcGik7W992pyps0wZ888b/y9GXcLTU=
|
||||||
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
github.com/prometheus/common v0.0.0-20180518154759-7600349dcfe1 h1:osmNoEW2SCW3L7EX0km2LYM8HKpNWRiouxjE3XHkyGc=
|
|
||||||
github.com/prometheus/common v0.0.0-20180518154759-7600349dcfe1/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
github.com/prometheus/common v0.0.0-20180518154759-7600349dcfe1/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||||
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||||
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||||
github.com/prometheus/common v0.2.0 h1:kUZDBDTdBVBYBj5Tmh2NZLlF60mfjA27rM34b+cVwNU=
|
github.com/prometheus/common v0.2.0 h1:kUZDBDTdBVBYBj5Tmh2NZLlF60mfjA27rM34b+cVwNU=
|
||||||
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||||
github.com/prometheus/procfs v0.0.0-20180612222113-7d6f385de8be h1:MoyXp/VjXUwM0GyDcdwT7Ubea2gxOSHpPaFo3qV+Y2A=
|
|
||||||
github.com/prometheus/procfs v0.0.0-20180612222113-7d6f385de8be/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20180612222113-7d6f385de8be/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
@@ -616,9 +596,7 @@ github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 h1:udFKJ0aHUL60LboW/A+D
|
|||||||
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
|
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
|
||||||
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE=
|
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE=
|
||||||
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
|
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
|
||||||
github.com/sirupsen/logrus v1.0.5 h1:8c8b5uO0zS4X6RPl/sd1ENwSkIc0/H2PaHxE3udaE8I=
|
|
||||||
github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
|
github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
|
||||||
github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
|
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||||
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
||||||
@@ -631,19 +609,16 @@ github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2
|
|||||||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||||
github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E=
|
github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E=
|
||||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||||
github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8=
|
|
||||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||||
github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4=
|
github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4=
|
||||||
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94 h1:0ngsPmuP6XIjiFRNFYlvKwSr5zff2v+uPHaffZ6/M4k=
|
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94 h1:0ngsPmuP6XIjiFRNFYlvKwSr5zff2v+uPHaffZ6/M4k=
|
||||||
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
|
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
|
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
|
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
|
||||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
@@ -671,11 +646,8 @@ go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
|
|||||||
go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A=
|
go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A=
|
||||||
go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M=
|
go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M=
|
||||||
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
||||||
go.opencensus.io v0.20.2 h1:NAfh7zF0/3/HqtMvJNZ/RFrSlCE6ZTlHmKfhL/Dm1Jk=
|
|
||||||
go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
|
||||||
go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg=
|
go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg=
|
||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||||
go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4=
|
|
||||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
|
go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
|
||||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
@@ -685,17 +657,14 @@ go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o=
|
|||||||
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||||
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
|
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
|
||||||
golang.org/x/build v0.0.0-20190314133821-5284462c4bec/go.mod h1:atTaCNAy0f16Ah5aV1gMSwgiKVHwu/JncqDpuRr7lS4=
|
golang.org/x/build v0.0.0-20190314133821-5284462c4bec/go.mod h1:atTaCNAy0f16Ah5aV1gMSwgiKVHwu/JncqDpuRr7lS4=
|
||||||
golang.org/x/crypto v0.0.0-20180608092829-8ac0e0d97ce4 h1:wviDUSmtheHRBfoY8B9U8ELl2USoXi2YFwdGdpIIkzI=
|
|
||||||
golang.org/x/crypto v0.0.0-20180608092829-8ac0e0d97ce4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180608092829-8ac0e0d97ce4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c h1:Vj5n4GlwjmQteupaxJ9+0FNOmBrHfq7vN4btdGoDZgI=
|
|
||||||
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo=
|
golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
|
||||||
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc=
|
|
||||||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20191106202628-ed6320f186d4 h1:PDpCLFAH/YIX0QpHPf2eO7L4rC2OOirBrKtXTLLiNTY=
|
golang.org/x/crypto v0.0.0-20191106202628-ed6320f186d4 h1:PDpCLFAH/YIX0QpHPf2eO7L4rC2OOirBrKtXTLLiNTY=
|
||||||
golang.org/x/crypto v0.0.0-20191106202628-ed6320f186d4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20191106202628-ed6320f186d4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
@@ -709,7 +678,6 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl
|
|||||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA=
|
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
@@ -722,9 +690,8 @@ golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73r
|
|||||||
golang.org/x/net v0.0.0-20190206173232-65e2d4e15006/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190206173232-65e2d4e15006/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
|
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
|
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
@@ -736,20 +703,19 @@ golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAG
|
|||||||
golang.org/x/oauth2 v0.0.0-20190130055435-99b60b757ec1/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190130055435-99b60b757ec1/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190319182350-c85d3e98c914/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190319182350-c85d3e98c914/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a h1:tImsplftrFpALCYumobsd0K86vlAs/eXGFms2txfJfA=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
|
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI=
|
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs=
|
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
@@ -761,26 +727,22 @@ golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5 h1:sM3evRHxE/1RuMe1FYAL3j7C7fUfIjkbE+NiDAYUF8U=
|
|
||||||
golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190730183949-1393eb018365/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190730183949-1393eb018365/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ=
|
|
||||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191008105621-543471e840be h1:QAcqgptGM8IQBC9K/RC4o+O9YmqEm0diQn9QmZw/0mU=
|
golang.org/x/sys v0.0.0-20191008105621-543471e840be h1:QAcqgptGM8IQBC9K/RC4o+O9YmqEm0diQn9QmZw/0mU=
|
||||||
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db h1:6/JqlYfC1CCaLnGceQTI+sDGhC9UBSPAsBqI0Gun6kU=
|
|
||||||
golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2 h1:+DCIGbF/swA92ohVg0//6X2IVY3KZs6p9mix0ziNYJM=
|
|
||||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=
|
||||||
@@ -793,8 +755,8 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm
|
|||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384 h1:TFlARGu6Czu1z7q93HTxcP1P+/ZFC/IKythI5RzrnRg=
|
|
||||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
golang.org/x/tools v0.0.0-20190718200317-82a3ea8a504c/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
|
golang.org/x/tools v0.0.0-20190718200317-82a3ea8a504c/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
|
||||||
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||||
@@ -803,37 +765,36 @@ google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+
|
|||||||
google.golang.org/api v0.2.0/go.mod h1:IfRCZScioGtypHNTlz3gFk67J8uePVW7uDTBzXuIkhU=
|
google.golang.org/api v0.2.0/go.mod h1:IfRCZScioGtypHNTlz3gFk67J8uePVW7uDTBzXuIkhU=
|
||||||
google.golang.org/api v0.3.0/go.mod h1:IuvZyQh8jgscv8qWfQ4ABd8m7hEudgBFM/EdhA3BnXw=
|
google.golang.org/api v0.3.0/go.mod h1:IuvZyQh8jgscv8qWfQ4ABd8m7hEudgBFM/EdhA3BnXw=
|
||||||
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
|
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
|
||||||
google.golang.org/api v0.3.2 h1:iTp+3yyl/KOtxa/d1/JUE0GGSoR6FuW5udver22iwpw=
|
|
||||||
google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
|
google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
|
||||||
google.golang.org/api v0.5.0 h1:lj9SyhMzyoa38fgFF0oO2T6pjs5IzkLPKfVtxpyCRMM=
|
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||||
google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||||
|
google.golang.org/api v0.14.0 h1:uMf5uLi4eQMRrMKhCplNik4U4H8Z6C1br3zOtAa/aDE=
|
||||||
|
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
|
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
|
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/appengine v1.6.0 h1:Tfd7cKwKbFRsI8RMAD3oqqw7JPFRrvFlOsfbgVkjOOw=
|
google.golang.org/appengine v1.6.0 h1:Tfd7cKwKbFRsI8RMAD3oqqw7JPFRrvFlOsfbgVkjOOw=
|
||||||
google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/genproto v0.0.0-20180608181217-32ee49c4dd80 h1:GL7nK1hkDKrkor0eVOYcMdIsUGErFnaC2gpBOVC+vbI=
|
|
||||||
google.golang.org/genproto v0.0.0-20180608181217-32ee49c4dd80/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20180608181217-32ee49c4dd80/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
|
google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
|
||||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107 h1:xtNn7qFlagY2mQNFHMSRPjT2RkOV4OXM7P5TVy9xATo=
|
|
||||||
google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
google.golang.org/genproto v0.0.0-20190513181449-d00d292a067c h1:m9avZ3wyOWBR0fLC+qWbMBulk+Jiiqelngssgp8jfIs=
|
|
||||||
google.golang.org/genproto v0.0.0-20190513181449-d00d292a067c/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
|
google.golang.org/genproto v0.0.0-20190513181449-d00d292a067c/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
|
||||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64 h1:iKtrH9Y8mcbADOP0YFaEMth7OfuHY9xHOwNj4znpM1A=
|
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64 h1:iKtrH9Y8mcbADOP0YFaEMth7OfuHY9xHOwNj4znpM1A=
|
||||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
google.golang.org/grpc v1.14.0 h1:ArxJuB1NWfPY6r9Gp9gqwplT0Ge7nqv9msgu03lHLmo=
|
|
||||||
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||||
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
|
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
|
||||||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||||
google.golang.org/grpc v1.22.0 h1:J0UbZOIrCAl+fpTOf8YLs4dJo8L/owV4LYVtAXQoPkw=
|
google.golang.org/grpc v1.22.0 h1:J0UbZOIrCAl+fpTOf8YLs4dJo8L/owV4LYVtAXQoPkw=
|
||||||
google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
|
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
|
||||||
@@ -883,6 +844,7 @@ honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWh
|
|||||||
honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
k8s.io/api v0.0.0-20190409092523-d687e77c8ae9 h1:c9UEl5z8gk1DGh/g3snETZ+a52YeR9VdbX/3BQ4PHas=
|
k8s.io/api v0.0.0-20190409092523-d687e77c8ae9 h1:c9UEl5z8gk1DGh/g3snETZ+a52YeR9VdbX/3BQ4PHas=
|
||||||
k8s.io/api v0.0.0-20190409092523-d687e77c8ae9/go.mod h1:FQEUn50aaytlU65qqBn/w+5ugllHwrBzKm7DzbnXdzE=
|
k8s.io/api v0.0.0-20190409092523-d687e77c8ae9/go.mod h1:FQEUn50aaytlU65qqBn/w+5ugllHwrBzKm7DzbnXdzE=
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import (
|
|||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
cleanhttp "github.com/hashicorp/go-cleanhttp"
|
cleanhttp "github.com/hashicorp/go-cleanhttp"
|
||||||
uuid "github.com/hashicorp/go-uuid"
|
uuid "github.com/hashicorp/go-uuid"
|
||||||
"github.com/hashicorp/vault/helper/awsutil"
|
"github.com/hashicorp/vault/sdk/helper/awsutil"
|
||||||
"github.com/hashicorp/vault/sdk/helper/consts"
|
"github.com/hashicorp/vault/sdk/helper/consts"
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
"github.com/hashicorp/vault/sdk/physical"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import (
|
|||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
"github.com/hashicorp/go-raftchunking"
|
"github.com/hashicorp/go-raftchunking"
|
||||||
"github.com/hashicorp/go-uuid"
|
"github.com/hashicorp/go-uuid"
|
||||||
"github.com/hashicorp/raft"
|
"github.com/hashicorp/raft"
|
||||||
@@ -658,7 +659,7 @@ func (b *RaftBackend) Peers(ctx context.Context) ([]Peer, error) {
|
|||||||
// Snapshot takes a raft snapshot, packages it into a archive file and writes it
|
// Snapshot takes a raft snapshot, packages it into a archive file and writes it
|
||||||
// to the provided writer. Seal access is used to encrypt the SHASUM file so we
|
// to the provided writer. Seal access is used to encrypt the SHASUM file so we
|
||||||
// can validate the snapshot was taken using the same master keys or not.
|
// can validate the snapshot was taken using the same master keys or not.
|
||||||
func (b *RaftBackend) Snapshot(out *logical.HTTPResponseWriter, access seal.Access) error {
|
func (b *RaftBackend) Snapshot(out *logical.HTTPResponseWriter, access *seal.Access) error {
|
||||||
b.l.RLock()
|
b.l.RLock()
|
||||||
defer b.l.RUnlock()
|
defer b.l.RUnlock()
|
||||||
|
|
||||||
@@ -701,7 +702,7 @@ func (b *RaftBackend) Snapshot(out *logical.HTTPResponseWriter, access seal.Acce
|
|||||||
// access is used to decrypt the SHASUM file in the archive to ensure this
|
// access is used to decrypt the SHASUM file in the archive to ensure this
|
||||||
// snapshot has the same master key as the running instance. If the provided
|
// snapshot has the same master key as the running instance. If the provided
|
||||||
// access is nil then it will skip that validation.
|
// access is nil then it will skip that validation.
|
||||||
func (b *RaftBackend) WriteSnapshotToTemp(in io.ReadCloser, access seal.Access) (*os.File, func(), raft.SnapshotMeta, error) {
|
func (b *RaftBackend) WriteSnapshotToTemp(in io.ReadCloser, access *seal.Access) (*os.File, func(), raft.SnapshotMeta, error) {
|
||||||
b.l.RLock()
|
b.l.RLock()
|
||||||
defer b.l.RUnlock()
|
defer b.l.RUnlock()
|
||||||
|
|
||||||
@@ -1036,7 +1037,7 @@ func (l *RaftLock) Value() (bool, string, error) {
|
|||||||
// sealer implements the snapshot.Sealer interface and is used in the snapshot
|
// sealer implements the snapshot.Sealer interface and is used in the snapshot
|
||||||
// process for encrypting/decrypting the SHASUM file in snapshot archives.
|
// process for encrypting/decrypting the SHASUM file in snapshot archives.
|
||||||
type sealer struct {
|
type sealer struct {
|
||||||
access seal.Access
|
access *seal.Access
|
||||||
}
|
}
|
||||||
|
|
||||||
// Seal encrypts the data with using the seal access object.
|
// Seal encrypts the data with using the seal access object.
|
||||||
@@ -1044,7 +1045,7 @@ func (s sealer) Seal(ctx context.Context, pt []byte) ([]byte, error) {
|
|||||||
if s.access == nil {
|
if s.access == nil {
|
||||||
return nil, errors.New("no seal access available")
|
return nil, errors.New("no seal access available")
|
||||||
}
|
}
|
||||||
eblob, err := s.access.Encrypt(ctx, pt)
|
eblob, err := s.access.Encrypt(ctx, pt, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -1058,11 +1059,11 @@ func (s sealer) Open(ctx context.Context, ct []byte) ([]byte, error) {
|
|||||||
return nil, errors.New("no seal access available")
|
return nil, errors.New("no seal access available")
|
||||||
}
|
}
|
||||||
|
|
||||||
var eblob physical.EncryptedBlobInfo
|
var eblob wrapping.EncryptedBlobInfo
|
||||||
err := proto.Unmarshal(ct, &eblob)
|
err := proto.Unmarshal(ct, &eblob)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return s.access.Decrypt(ctx, &eblob)
|
return s.access.Decrypt(ctx, &eblob, nil)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import (
|
|||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
"github.com/hashicorp/go-cleanhttp"
|
"github.com/hashicorp/go-cleanhttp"
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
"github.com/hashicorp/vault/helper/awsutil"
|
"github.com/hashicorp/vault/sdk/helper/awsutil"
|
||||||
"github.com/hashicorp/vault/sdk/helper/consts"
|
"github.com/hashicorp/vault/sdk/helper/consts"
|
||||||
"github.com/hashicorp/vault/sdk/helper/parseutil"
|
"github.com/hashicorp/vault/sdk/helper/parseutil"
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
"github.com/hashicorp/vault/sdk/physical"
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import (
|
|||||||
"github.com/aws/aws-sdk-go/aws/session"
|
"github.com/aws/aws-sdk-go/aws/session"
|
||||||
"github.com/aws/aws-sdk-go/service/s3"
|
"github.com/aws/aws-sdk-go/service/s3"
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
"github.com/hashicorp/vault/helper/awsutil"
|
"github.com/hashicorp/vault/sdk/helper/awsutil"
|
||||||
"github.com/hashicorp/vault/sdk/helper/logging"
|
"github.com/hashicorp/vault/sdk/helper/logging"
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
"github.com/hashicorp/vault/sdk/physical"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ import (
|
|||||||
|
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
|
"github.com/hashicorp/go-kms-wrapping/entropy"
|
||||||
"github.com/hashicorp/go-multierror"
|
"github.com/hashicorp/go-multierror"
|
||||||
"github.com/hashicorp/vault/sdk/helper/consts"
|
"github.com/hashicorp/vault/sdk/helper/consts"
|
||||||
"github.com/hashicorp/vault/sdk/helper/entropy"
|
|
||||||
"github.com/hashicorp/vault/sdk/helper/errutil"
|
"github.com/hashicorp/vault/sdk/helper/errutil"
|
||||||
"github.com/hashicorp/vault/sdk/helper/license"
|
"github.com/hashicorp/vault/sdk/helper/license"
|
||||||
"github.com/hashicorp/vault/sdk/helper/logging"
|
"github.com/hashicorp/vault/sdk/helper/logging"
|
||||||
|
|||||||
10
sdk/go.mod
10
sdk/go.mod
@@ -5,14 +5,16 @@ go 1.13
|
|||||||
require (
|
require (
|
||||||
github.com/armon/go-metrics v0.3.0
|
github.com/armon/go-metrics v0.3.0
|
||||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310
|
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310
|
||||||
|
github.com/aws/aws-sdk-go v1.25.37
|
||||||
github.com/fatih/structs v1.1.0
|
github.com/fatih/structs v1.1.0
|
||||||
github.com/go-ldap/ldap/v3 v3.1.3
|
github.com/go-ldap/ldap/v3 v3.1.3
|
||||||
github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31
|
github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31
|
||||||
github.com/golang/protobuf v1.3.1
|
github.com/golang/protobuf v1.3.2
|
||||||
github.com/golang/snappy v0.0.1
|
github.com/golang/snappy v0.0.1
|
||||||
github.com/hashicorp/errwrap v1.0.0
|
github.com/hashicorp/errwrap v1.0.0
|
||||||
github.com/hashicorp/go-hclog v0.10.1
|
github.com/hashicorp/go-hclog v0.10.1
|
||||||
github.com/hashicorp/go-immutable-radix v1.0.0
|
github.com/hashicorp/go-immutable-radix v1.0.0
|
||||||
|
github.com/hashicorp/go-kms-wrapping v0.0.0-20191129225826-634facde9f88
|
||||||
github.com/hashicorp/go-multierror v1.0.0
|
github.com/hashicorp/go-multierror v1.0.0
|
||||||
github.com/hashicorp/go-plugin v1.0.1
|
github.com/hashicorp/go-plugin v1.0.1
|
||||||
github.com/hashicorp/go-sockaddr v1.0.2
|
github.com/hashicorp/go-sockaddr v1.0.2
|
||||||
@@ -20,16 +22,12 @@ require (
|
|||||||
github.com/hashicorp/go-version v1.1.0
|
github.com/hashicorp/go-version v1.1.0
|
||||||
github.com/hashicorp/golang-lru v0.5.1
|
github.com/hashicorp/golang-lru v0.5.1
|
||||||
github.com/hashicorp/hcl v1.0.0
|
github.com/hashicorp/hcl v1.0.0
|
||||||
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d // indirect
|
|
||||||
github.com/mitchellh/copystructure v1.0.0
|
github.com/mitchellh/copystructure v1.0.0
|
||||||
github.com/mitchellh/go-testing-interface v1.0.0
|
github.com/mitchellh/go-testing-interface v1.0.0
|
||||||
github.com/mitchellh/mapstructure v1.1.2
|
github.com/mitchellh/mapstructure v1.1.2
|
||||||
github.com/pierrec/lz4 v2.0.5+incompatible
|
github.com/pierrec/lz4 v2.0.5+incompatible
|
||||||
github.com/ryanuber/go-glob v1.0.0
|
github.com/ryanuber/go-glob v1.0.0
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2
|
golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 // indirect
|
|
||||||
golang.org/x/sys v0.0.0-20191008105621-543471e840be
|
golang.org/x/sys v0.0.0-20191008105621-543471e840be
|
||||||
golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db // indirect
|
|
||||||
google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107 // indirect
|
|
||||||
google.golang.org/grpc v1.22.0
|
google.golang.org/grpc v1.22.0
|
||||||
)
|
)
|
||||||
|
|||||||
125
sdk/go.sum
125
sdk/go.sum
@@ -1,12 +1,36 @@
|
|||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
|
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
|
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||||
|
cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts=
|
||||||
|
github.com/Azure/azure-sdk-for-go v36.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
|
||||||
|
github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
|
||||||
|
github.com/Azure/go-autorest/autorest v0.9.2/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.6.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.7.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
|
||||||
|
github.com/Azure/go-autorest/autorest/azure/auth v0.4.0/go.mod h1:Oo5cRhLvZteXzI2itUm5ziqsoIxRkzrt3t61FeZaS18=
|
||||||
|
github.com/Azure/go-autorest/autorest/azure/cli v0.3.0/go.mod h1:rNYMNAefZMRowqCV0cVhr/YDW5dD7afFq9nXAXL4ykE=
|
||||||
|
github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
|
||||||
|
github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
|
||||||
|
github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA=
|
||||||
|
github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI=
|
||||||
|
github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
|
||||||
|
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||||
|
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190620160927-9418d7b0cd0f/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ=
|
||||||
|
github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
|
||||||
github.com/armon/go-metrics v0.3.0 h1:B7AQgHi8QSEi4uHu7Sbsga+IJDU+CENgjxoo81vDUqU=
|
github.com/armon/go-metrics v0.3.0 h1:B7AQgHi8QSEi4uHu7Sbsga+IJDU+CENgjxoo81vDUqU=
|
||||||
github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs=
|
github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs=
|
||||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310 h1:BUAU3CGlLvorLI26FmByPp2eC2qla6E1Tw+scpcg/to=
|
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310 h1:BUAU3CGlLvorLI26FmByPp2eC2qla6E1Tw+scpcg/to=
|
||||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
||||||
|
github.com/aws/aws-sdk-go v1.25.37 h1:gBtB/F3dophWpsUQKN/Kni+JzYEH2mGHF4hWNtfED1w=
|
||||||
|
github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||||
|
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||||
github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=
|
|
||||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||||
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
|
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
|
||||||
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
|
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
|
||||||
@@ -14,6 +38,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
|
|||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||||
|
github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
|
||||||
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
|
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
|
||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
|
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
|
||||||
@@ -24,32 +50,50 @@ github.com/go-ldap/ldap/v3 v3.1.3 h1:RIgdpHXJpsUqUK5WXwKyVsESrGFqo5BRWPk3RR4/ogQ
|
|||||||
github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa/Cohzb8=
|
github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa/Cohzb8=
|
||||||
github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31 h1:28FVBuwkwowZMjbA7M0wXsI6t3PYulRTMio3SO+eKCM=
|
github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31 h1:28FVBuwkwowZMjbA7M0wXsI6t3PYulRTMio3SO+eKCM=
|
||||||
github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
|
github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
|
||||||
|
github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
|
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
||||||
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
||||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
|
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
|
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
|
||||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||||
|
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||||
github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI=
|
github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI=
|
||||||
|
github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
|
||||||
|
github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
|
||||||
|
github.com/hashicorp/go-hclog v0.10.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
|
||||||
github.com/hashicorp/go-hclog v0.10.1 h1:uyt/l0dWjJ879yiAu+T7FG3/6QX+zwm4bQ8P7XsYt3o=
|
github.com/hashicorp/go-hclog v0.10.1 h1:uyt/l0dWjJ879yiAu+T7FG3/6QX+zwm4bQ8P7XsYt3o=
|
||||||
github.com/hashicorp/go-hclog v0.10.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
|
github.com/hashicorp/go-hclog v0.10.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
|
||||||
github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=
|
github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=
|
||||||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||||
|
github.com/hashicorp/go-kms-wrapping v0.0.0-20191129225826-634facde9f88 h1:YMLQiDrLQT1QEollUbw+yxpW0yJiKVHDGmMpBISeACA=
|
||||||
|
github.com/hashicorp/go-kms-wrapping v0.0.0-20191129225826-634facde9f88/go.mod h1:Pm+Umb/6Gij6ZG534L7QDyvkauaOQWGb+arj9aFjCE0=
|
||||||
github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o=
|
github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o=
|
||||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
||||||
github.com/hashicorp/go-plugin v1.0.1 h1:4OtAfUGbnKC6yS48p0CtMX2oFYtzFZVv6rok3cRWgnE=
|
github.com/hashicorp/go-plugin v1.0.1 h1:4OtAfUGbnKC6yS48p0CtMX2oFYtzFZVv6rok3cRWgnE=
|
||||||
github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY=
|
github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY=
|
||||||
github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
|
github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
|
||||||
|
github.com/hashicorp/go-retryablehttp v0.6.2/go.mod h1:gEx6HMUGxYYhJScX7W1Il64m6cc2C1mDaW3NQ9sY1FY=
|
||||||
|
github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
|
||||||
github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=
|
github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=
|
||||||
github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=
|
github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=
|
||||||
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
|
github.com/hashicorp/go-uuid v1.0.2-0.20191001231223-f32f5fe8d6a8/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=
|
github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=
|
||||||
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
github.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0=
|
github.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0=
|
||||||
@@ -59,25 +103,31 @@ github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+
|
|||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||||
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb h1:b5rjCoWHc7eqmAS4/qyk21ZsHyb6Mxv/jykxvNTkU4M=
|
github.com/hashicorp/vault/api v1.0.5-0.20191122173911-80fcc7907c78/go.mod h1:Uf8LaHyrYsgVgHzO2tMZKhqRGlL3UJ6XaSwW2EA1Iqo=
|
||||||
|
github.com/hashicorp/vault/sdk v0.1.14-0.20191108161836-82f2b5571044/go.mod h1:PcekaFGiPJyHnFy+NZhP6ll650zEw51Ag7g/YEa+EOU=
|
||||||
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
||||||
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ=
|
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ=
|
||||||
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
||||||
github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4=
|
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
|
||||||
|
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||||
|
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||||
|
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||||
|
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||||
github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA=
|
github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA=
|
||||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||||
github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI=
|
|
||||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10=
|
github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10=
|
||||||
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
|
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
github.com/mitchellh/cli v1.0.0 h1:iGBIsUe3+HZ/AD/Vd7DErOt5sU9fa8Uj7A2s1aggv1Y=
|
|
||||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
||||||
github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ=
|
github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ=
|
||||||
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
|
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
|
||||||
github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77 h1:7GoSOOW2jpsfkntVKaS2rAr1TJqfcxotyaUcuxoZSzg=
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
||||||
github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=
|
github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=
|
||||||
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
||||||
@@ -86,8 +136,11 @@ github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQz
|
|||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY=
|
github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY=
|
||||||
github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
||||||
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
|
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw=
|
github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw=
|
||||||
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
|
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
|
||||||
|
github.com/oracle/oci-go-sdk v12.5.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888=
|
||||||
github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
|
github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
|
||||||
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||||
github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I=
|
github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I=
|
||||||
@@ -95,72 +148,98 @@ github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi
|
|||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.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 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/posener/complete v1.1.1 h1:ccV59UEOTzVDnDUEFdT95ZzHVZ+5+158q8+SJb2QV5w=
|
|
||||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||||
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
|
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
|
||||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||||
github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s=
|
|
||||||
github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||||
github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
|
github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
|
||||||
github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
|
github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
|
||||||
|
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||||
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
|
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
|
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480 h1:O5YqonU5IWby+w98jVUG9h7zlCWCcH4RHyPVReBmhzk=
|
||||||
|
golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
|
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d h1:g9qWBGx4puODJTMVyoPrpoxPFgVGd+z1DZwjfRu4d0I=
|
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
|
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH9uqVPRCUVUDhs0wnbA=
|
||||||
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw=
|
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI=
|
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc h1:MeuS1UDyZyFH++6vVy44PuufTeFF0d0nfI6XB87YGSk=
|
|
||||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc h1:WiYx1rIFmx8c0mXAFtv5D/mHyKe1+jmuP7PViuwqwuQ=
|
|
||||||
golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191008105621-543471e840be h1:QAcqgptGM8IQBC9K/RC4o+O9YmqEm0diQn9QmZw/0mU=
|
golang.org/x/sys v0.0.0-20191008105621-543471e840be h1:QAcqgptGM8IQBC9K/RC4o+O9YmqEm0diQn9QmZw/0mU=
|
||||||
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db h1:6/JqlYfC1CCaLnGceQTI+sDGhC9UBSPAsBqI0Gun6kU=
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||||
|
google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||||
|
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
|
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107 h1:xtNn7qFlagY2mQNFHMSRPjT2RkOV4OXM7P5TVy9xATo=
|
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
google.golang.org/grpc v1.14.0 h1:ArxJuB1NWfPY6r9Gp9gqwplT0Ge7nqv9msgu03lHLmo=
|
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64 h1:iKtrH9Y8mcbADOP0YFaEMth7OfuHY9xHOwNj4znpM1A=
|
||||||
|
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||||
google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8=
|
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
|
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||||
google.golang.org/grpc v1.22.0 h1:J0UbZOIrCAl+fpTOf8YLs4dJo8L/owV4LYVtAXQoPkw=
|
google.golang.org/grpc v1.22.0 h1:J0UbZOIrCAl+fpTOf8YLs4dJo8L/owV4LYVtAXQoPkw=
|
||||||
google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
|
gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
package awsutil
|
package awsutil
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
awsRequest "github.com/aws/aws-sdk-go/aws/request"
|
awsRequest "github.com/aws/aws-sdk-go/aws/request"
|
||||||
multierror "github.com/hashicorp/go-multierror"
|
multierror "github.com/hashicorp/go-multierror"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var ErrUpstreamRateLimited = errors.New("upstream rate limited")
|
||||||
|
|
||||||
// CheckAWSError will examine an error and convert to a logical error if
|
// CheckAWSError will examine an error and convert to a logical error if
|
||||||
// appropriate. If no appropriate error is found, return nil
|
// appropriate. If no appropriate error is found, return nil
|
||||||
func CheckAWSError(err error) error {
|
func CheckAWSError(err error) error {
|
||||||
@@ -13,17 +16,17 @@ func CheckAWSError(err error) error {
|
|||||||
// known request limiting errors:
|
// known request limiting errors:
|
||||||
// https://github.com/aws/aws-sdk-go/blob/488d634b5a699b9118ac2befb5135922b4a77210/aws/request/retryer.go#L35
|
// https://github.com/aws/aws-sdk-go/blob/488d634b5a699b9118ac2befb5135922b4a77210/aws/request/retryer.go#L35
|
||||||
if awsRequest.IsErrorThrottle(err) {
|
if awsRequest.IsErrorThrottle(err) {
|
||||||
return logical.ErrUpstreamRateLimited
|
return ErrUpstreamRateLimited
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// AppendLogicalError checks if the given error is a known AWS error we modify,
|
// AppendAWSError checks if the given error is a known AWS error we modify,
|
||||||
// and if so then returns a go-multierror, appending the original and the
|
// and if so then returns a go-multierror, appending the original and the
|
||||||
// logical error.
|
// AWS error.
|
||||||
// If the error is not an AWS error, or not an error we wish to modify, then
|
// If the error is not an AWS error, or not an error we wish to modify, then
|
||||||
// return the original error.
|
// return the original error.
|
||||||
func AppendLogicalError(err error) error {
|
func AppendAWSError(err error) error {
|
||||||
if awserr := CheckAWSError(err); awserr != nil {
|
if awserr := CheckAWSError(err); awserr != nil {
|
||||||
err = multierror.Append(err, awserr)
|
err = multierror.Append(err, awserr)
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,6 @@ import (
|
|||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
multierror "github.com/hashicorp/go-multierror"
|
multierror "github.com/hashicorp/go-multierror"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func Test_CheckAWSError(t *testing.T) {
|
func Test_CheckAWSError(t *testing.T) {
|
||||||
@@ -22,12 +21,12 @@ func Test_CheckAWSError(t *testing.T) {
|
|||||||
{
|
{
|
||||||
Name: "Upstream throttle error",
|
Name: "Upstream throttle error",
|
||||||
Err: awserr.New("Throttling", "", nil),
|
Err: awserr.New("Throttling", "", nil),
|
||||||
Expected: logical.ErrUpstreamRateLimited,
|
Expected: ErrUpstreamRateLimited,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "Upstream RequestLimitExceeded",
|
Name: "Upstream RequestLimitExceeded",
|
||||||
Err: awserr.New("RequestLimitExceeded", "Request rate limited", nil),
|
Err: awserr.New("RequestLimitExceeded", "Request rate limited", nil),
|
||||||
Expected: logical.ErrUpstreamRateLimited,
|
Expected: ErrUpstreamRateLimited,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +46,7 @@ func Test_CheckAWSError(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_AppendLogicalError(t *testing.T) {
|
func Test_AppendRateLimitedError(t *testing.T) {
|
||||||
awsErr := awserr.New("Throttling", "", nil)
|
awsErr := awserr.New("Throttling", "", nil)
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
Name string
|
Name string
|
||||||
@@ -62,7 +61,7 @@ func Test_AppendLogicalError(t *testing.T) {
|
|||||||
{
|
{
|
||||||
Name: "Upstream throttle error",
|
Name: "Upstream throttle error",
|
||||||
Err: awsErr,
|
Err: awsErr,
|
||||||
Expected: multierror.Append(awsErr, logical.ErrUpstreamRateLimited),
|
Expected: multierror.Append(awsErr, ErrUpstreamRateLimited),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "Nil",
|
Name: "Nil",
|
||||||
@@ -71,7 +70,7 @@ func Test_AppendLogicalError(t *testing.T) {
|
|||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
t.Run(tc.Name, func(t *testing.T) {
|
t.Run(tc.Name, func(t *testing.T) {
|
||||||
err := AppendLogicalError(tc.Err)
|
err := AppendAWSError(tc.Err)
|
||||||
if err == nil && tc.Expected != nil {
|
if err == nil && tc.Expected != nil {
|
||||||
t.Fatalf("expected non-nil error (%#v), got nil", tc.Expected)
|
t.Fatalf("expected non-nil error (%#v), got nil", tc.Expected)
|
||||||
}
|
}
|
||||||
73
sdk/helper/awsutil/region.go
Normal file
73
sdk/helper/awsutil/region.go
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
package awsutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/ec2metadata"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/session"
|
||||||
|
"github.com/hashicorp/errwrap"
|
||||||
|
)
|
||||||
|
|
||||||
|
// "us-east-1 is used because it's where AWS first provides support for new features,
|
||||||
|
// is a widely used region, and is the most common one for some services like STS.
|
||||||
|
const DefaultRegion = "us-east-1"
|
||||||
|
|
||||||
|
var ec2MetadataBaseURL = "http://169.254.169.254"
|
||||||
|
|
||||||
|
/*
|
||||||
|
It's impossible to mimic "normal" AWS behavior here because it's not consistent
|
||||||
|
or well-defined. For example, boto3, the Python SDK (which the aws cli uses),
|
||||||
|
loads `~/.aws/config` by default and only reads the `AWS_DEFAULT_REGION` environment
|
||||||
|
variable (and not `AWS_REGION`, while the golang SDK does _mostly_ the opposite -- it
|
||||||
|
reads the region **only** from `AWS_REGION` and not at all `~/.aws/config`, **unless**
|
||||||
|
the `AWS_SDK_LOAD_CONFIG` environment variable is set. So, we must define our own
|
||||||
|
approach to walking AWS config and deciding what to use.
|
||||||
|
|
||||||
|
Our chosen approach is:
|
||||||
|
|
||||||
|
"More specific takes precedence over less specific."
|
||||||
|
|
||||||
|
1. User-provided configuration is the most explicit.
|
||||||
|
2. Environment variables are potentially shared across many invocations and so they have less precedence.
|
||||||
|
3. Configuration in `~/.aws/config` is shared across all invocations of a given user and so this has even less precedence.
|
||||||
|
4. Configuration retrieved from the EC2 instance metadata service is shared by all invocations on a given machine, and so it has the lowest precedence.
|
||||||
|
|
||||||
|
This approach should be used in future updates to this logic.
|
||||||
|
*/
|
||||||
|
func GetRegion(configuredRegion string) (string, error) {
|
||||||
|
if configuredRegion != "" {
|
||||||
|
return configuredRegion, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
sess, err := session.NewSessionWithOptions(session.Options{
|
||||||
|
SharedConfigState: session.SharedConfigEnable,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return "", errwrap.Wrapf("got error when starting session: {{err}}", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
region := aws.StringValue(sess.Config.Region)
|
||||||
|
if region != "" {
|
||||||
|
return region, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata := ec2metadata.New(sess, &aws.Config{
|
||||||
|
Endpoint: aws.String(ec2MetadataBaseURL + "/latest"),
|
||||||
|
EC2MetadataDisableTimeoutOverride: aws.Bool(true),
|
||||||
|
HTTPClient: &http.Client{
|
||||||
|
Timeout: time.Second,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if !metadata.Available() {
|
||||||
|
return DefaultRegion, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
region, err = metadata.Region()
|
||||||
|
if err != nil {
|
||||||
|
return "", errwrap.Wrapf("unable to retrieve region from instance metadata: {{err}}", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return region, nil
|
||||||
|
}
|
||||||
@@ -10,7 +10,6 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
hclog "github.com/hashicorp/go-hclog"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const testConfigFile = `[default]
|
const testConfigFile = `[default]
|
||||||
@@ -20,13 +19,12 @@ output=json`
|
|||||||
var (
|
var (
|
||||||
shouldTestFiles = os.Getenv("VAULT_ACC_AWS_FILES") == "1"
|
shouldTestFiles = os.Getenv("VAULT_ACC_AWS_FILES") == "1"
|
||||||
|
|
||||||
logger = hclog.NewNullLogger()
|
|
||||||
expectedTestRegion = "us-west-2"
|
expectedTestRegion = "us-west-2"
|
||||||
unexpectedTestRegion = "us-east-2"
|
unexpectedTestRegion = "us-east-2"
|
||||||
regionEnvKeys = []string{"AWS_REGION", "AWS_DEFAULT_REGION"}
|
regionEnvKeys = []string{"AWS_REGION", "AWS_DEFAULT_REGION"}
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetOrDefaultRegion_UserConfigPreferredFirst(t *testing.T) {
|
func TestGetRegion_UserConfigPreferredFirst(t *testing.T) {
|
||||||
configuredRegion := expectedTestRegion
|
configuredRegion := expectedTestRegion
|
||||||
|
|
||||||
cleanupEnv := setEnvRegion(t, unexpectedTestRegion)
|
cleanupEnv := setEnvRegion(t, unexpectedTestRegion)
|
||||||
@@ -38,13 +36,16 @@ func TestGetOrDefaultRegion_UserConfigPreferredFirst(t *testing.T) {
|
|||||||
cleanupMetadata := setInstanceMetadata(t, unexpectedTestRegion)
|
cleanupMetadata := setInstanceMetadata(t, unexpectedTestRegion)
|
||||||
defer cleanupMetadata()
|
defer cleanupMetadata()
|
||||||
|
|
||||||
result := GetOrDefaultRegion(logger, configuredRegion)
|
result, err := GetRegion(configuredRegion)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
if result != expectedTestRegion {
|
if result != expectedTestRegion {
|
||||||
t.Fatalf("expected: %s; actual: %s", expectedTestRegion, result)
|
t.Fatalf("expected: %s; actual: %s", expectedTestRegion, result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetOrDefaultRegion_EnvVarsPreferredSecond(t *testing.T) {
|
func TestGetRegion_EnvVarsPreferredSecond(t *testing.T) {
|
||||||
configuredRegion := ""
|
configuredRegion := ""
|
||||||
|
|
||||||
cleanupEnv := setEnvRegion(t, expectedTestRegion)
|
cleanupEnv := setEnvRegion(t, expectedTestRegion)
|
||||||
@@ -56,13 +57,16 @@ func TestGetOrDefaultRegion_EnvVarsPreferredSecond(t *testing.T) {
|
|||||||
cleanupMetadata := setInstanceMetadata(t, unexpectedTestRegion)
|
cleanupMetadata := setInstanceMetadata(t, unexpectedTestRegion)
|
||||||
defer cleanupMetadata()
|
defer cleanupMetadata()
|
||||||
|
|
||||||
result := GetOrDefaultRegion(logger, configuredRegion)
|
result, err := GetRegion(configuredRegion)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
if result != expectedTestRegion {
|
if result != expectedTestRegion {
|
||||||
t.Fatalf("expected: %s; actual: %s", expectedTestRegion, result)
|
t.Fatalf("expected: %s; actual: %s", expectedTestRegion, result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetOrDefaultRegion_ConfigFilesPreferredThird(t *testing.T) {
|
func TestGetRegion_ConfigFilesPreferredThird(t *testing.T) {
|
||||||
if !shouldTestFiles {
|
if !shouldTestFiles {
|
||||||
// In some test environments, like a CI environment, we may not have the
|
// In some test environments, like a CI environment, we may not have the
|
||||||
// permissions to write to the ~/.aws/config file. Thus, this test is off
|
// permissions to write to the ~/.aws/config file. Thus, this test is off
|
||||||
@@ -80,13 +84,16 @@ func TestGetOrDefaultRegion_ConfigFilesPreferredThird(t *testing.T) {
|
|||||||
cleanupMetadata := setInstanceMetadata(t, unexpectedTestRegion)
|
cleanupMetadata := setInstanceMetadata(t, unexpectedTestRegion)
|
||||||
defer cleanupMetadata()
|
defer cleanupMetadata()
|
||||||
|
|
||||||
result := GetOrDefaultRegion(logger, configuredRegion)
|
result, err := GetRegion(configuredRegion)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
if result != expectedTestRegion {
|
if result != expectedTestRegion {
|
||||||
t.Fatalf("expected: %s; actual: %s", expectedTestRegion, result)
|
t.Fatalf("expected: %s; actual: %s", expectedTestRegion, result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetOrDefaultRegion_ConfigFileUnfound(t *testing.T) {
|
func TestGetRegion_ConfigFileUnfound(t *testing.T) {
|
||||||
if enabled := os.Getenv("VAULT_ACC"); enabled == "" {
|
if enabled := os.Getenv("VAULT_ACC"); enabled == "" {
|
||||||
t.Skip()
|
t.Skip()
|
||||||
}
|
}
|
||||||
@@ -104,13 +111,16 @@ func TestGetOrDefaultRegion_ConfigFileUnfound(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
result := GetOrDefaultRegion(logger, configuredRegion)
|
result, err := GetRegion(configuredRegion)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
if result != DefaultRegion {
|
if result != DefaultRegion {
|
||||||
t.Fatalf("expected: %s; actual: %s", DefaultRegion, result)
|
t.Fatalf("expected: %s; actual: %s", DefaultRegion, result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetOrDefaultRegion_EC2InstanceMetadataPreferredFourth(t *testing.T) {
|
func TestGetRegion_EC2InstanceMetadataPreferredFourth(t *testing.T) {
|
||||||
if !shouldTestFiles {
|
if !shouldTestFiles {
|
||||||
// In some test environments, like a CI environment, we may not have the
|
// In some test environments, like a CI environment, we may not have the
|
||||||
// permissions to write to the ~/.aws/config file. Thus, this test is off
|
// permissions to write to the ~/.aws/config file. Thus, this test is off
|
||||||
@@ -128,13 +138,16 @@ func TestGetOrDefaultRegion_EC2InstanceMetadataPreferredFourth(t *testing.T) {
|
|||||||
cleanupMetadata := setInstanceMetadata(t, expectedTestRegion)
|
cleanupMetadata := setInstanceMetadata(t, expectedTestRegion)
|
||||||
defer cleanupMetadata()
|
defer cleanupMetadata()
|
||||||
|
|
||||||
result := GetOrDefaultRegion(logger, configuredRegion)
|
result, err := GetRegion(configuredRegion)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
if result != expectedTestRegion {
|
if result != expectedTestRegion {
|
||||||
t.Fatalf("expected: %s; actual: %s", expectedTestRegion, result)
|
t.Fatalf("expected: %s; actual: %s", expectedTestRegion, result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetOrDefaultRegion_DefaultsToDefaultRegionWhenRegionUnavailable(t *testing.T) {
|
func TestGetRegion_DefaultsToDefaultRegionWhenRegionUnavailable(t *testing.T) {
|
||||||
if enabled := os.Getenv("VAULT_ACC"); enabled == "" {
|
if enabled := os.Getenv("VAULT_ACC"); enabled == "" {
|
||||||
t.Skip()
|
t.Skip()
|
||||||
}
|
}
|
||||||
@@ -147,7 +160,10 @@ func TestGetOrDefaultRegion_DefaultsToDefaultRegionWhenRegionUnavailable(t *test
|
|||||||
cleanupFile := setConfigFileRegion(t, "")
|
cleanupFile := setConfigFileRegion(t, "")
|
||||||
defer cleanupFile()
|
defer cleanupFile()
|
||||||
|
|
||||||
result := GetOrDefaultRegion(logger, configuredRegion)
|
result, err := GetRegion(configuredRegion)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
if result != DefaultRegion {
|
if result != DefaultRegion {
|
||||||
t.Fatalf("expected: %s; actual: %s", DefaultRegion, result)
|
t.Fatalf("expected: %s; actual: %s", DefaultRegion, result)
|
||||||
}
|
}
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
package entropy
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/hashicorp/errwrap"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Sourcer interface {
|
|
||||||
GetRandom(bytes int) ([]byte, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type Reader struct {
|
|
||||||
source Sourcer
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewReader(source Sourcer) *Reader {
|
|
||||||
return &Reader{source}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read reads exactly len(p) bytes from r into p.
|
|
||||||
// If r returns an error having read at least len(p) bytes, the error is dropped.
|
|
||||||
// It returns the number of bytes copied and an error if fewer bytes were read.
|
|
||||||
// On return, n == len(p) if and only if err == nil.
|
|
||||||
func (r *Reader) Read(p []byte) (n int, err error) {
|
|
||||||
requested := len(p)
|
|
||||||
randBytes, err := r.source.GetRandom(requested)
|
|
||||||
delivered := copy(p, randBytes)
|
|
||||||
if delivered != requested {
|
|
||||||
if err != nil {
|
|
||||||
return delivered, errwrap.Wrapf("unable to fill provided buffer with entropy: {{err}}", err)
|
|
||||||
}
|
|
||||||
return delivered, fmt.Errorf("unable to fill provided buffer with entropy")
|
|
||||||
}
|
|
||||||
|
|
||||||
return delivered, nil
|
|
||||||
}
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
package entropy
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/hashicorp/errwrap"
|
|
||||||
)
|
|
||||||
|
|
||||||
type mockSourcer struct{}
|
|
||||||
type mockSourcerWithError struct{}
|
|
||||||
type mockSourcerFailureWithError struct{}
|
|
||||||
type mockSourcerFailureWithoutError struct{}
|
|
||||||
|
|
||||||
// simulates a successful sourcer
|
|
||||||
func (m *mockSourcer) GetRandom(bytes int) ([]byte, error) {
|
|
||||||
return make([]byte, bytes), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// simulates a sourcer that reads in the requested number of bytes but encounters an error.
|
|
||||||
// Read should drop any error if the number of bytes specified were successfully read.
|
|
||||||
func (m *mockSourcerWithError) GetRandom(bytes int) ([]byte, error) {
|
|
||||||
return make([]byte, bytes), errors.New("boom but you shouldn't care")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *mockSourcerFailureWithError) GetRandom(bytes int) ([]byte, error) {
|
|
||||||
numRetBytes := bytes - 1
|
|
||||||
return make([]byte, numRetBytes), fmt.Errorf("requested %d bytes of entropy but only filled %d", bytes, numRetBytes)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *mockSourcerFailureWithoutError) GetRandom(bytes int) ([]byte, error) {
|
|
||||||
numRetBytes := bytes - 1
|
|
||||||
return make([]byte, numRetBytes), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestRead(t *testing.T) {
|
|
||||||
var tests = []struct {
|
|
||||||
sourcer Sourcer
|
|
||||||
preReadBuff []byte
|
|
||||||
postReadBuff []byte
|
|
||||||
outErr error
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
new(mockSourcer),
|
|
||||||
[]byte{1, 2, 3, 4},
|
|
||||||
[]byte{0, 0, 0, 0},
|
|
||||||
nil,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
new(mockSourcerWithError),
|
|
||||||
[]byte{1, 2, 3, 4},
|
|
||||||
[]byte{0, 0, 0, 0},
|
|
||||||
nil,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
new(mockSourcerFailureWithError),
|
|
||||||
[]byte{1, 2, 3, 4},
|
|
||||||
nil,
|
|
||||||
errwrap.Wrapf("unable to fill provided buffer with entropy: {{err}}", fmt.Errorf("requested %d bytes of entropy but only filled %d", 4, 3)),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
new(mockSourcerFailureWithoutError),
|
|
||||||
[]byte{1, 2, 3, 4},
|
|
||||||
nil,
|
|
||||||
fmt.Errorf("unable to fill provided buffer with entropy"),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, test := range tests {
|
|
||||||
mockReader := NewReader(test.sourcer)
|
|
||||||
buff := make([]byte, len(test.preReadBuff))
|
|
||||||
copy(buff, test.preReadBuff)
|
|
||||||
_, err := mockReader.Read(buff)
|
|
||||||
// validate the error, both should be nil or have the same Error()
|
|
||||||
switch {
|
|
||||||
case err != nil && test.outErr != nil:
|
|
||||||
if err.Error() != test.outErr.Error() {
|
|
||||||
t.Fatalf("error mismatch: expected %#v got %#v", err, test.outErr)
|
|
||||||
}
|
|
||||||
case err != test.outErr:
|
|
||||||
t.Fatalf("error mismatch: expected %#v got %#v", err, test.outErr)
|
|
||||||
case err == nil && !bytes.Equal(buff, test.postReadBuff):
|
|
||||||
t.Fatalf("after read expected buff to be: %#v but got: %#v", test.postReadBuff, buff)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
package physical
|
package physical
|
||||||
|
|
||||||
|
import wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
|
|
||||||
// Entry is used to represent data stored by the physical backend
|
// Entry is used to represent data stored by the physical backend
|
||||||
type Entry struct {
|
type Entry struct {
|
||||||
Key string
|
Key string
|
||||||
@@ -13,5 +15,5 @@ type Entry struct {
|
|||||||
// is used to carry information about whether seal wrapping is *desired*
|
// is used to carry information about whether seal wrapping is *desired*
|
||||||
// regardless of whether it's currently available. The struct below stores
|
// regardless of whether it's currently available. The struct below stores
|
||||||
// needed information when it's actually performed.
|
// needed information when it's actually performed.
|
||||||
SealWrapInfo *EncryptedBlobInfo `json:"seal_wrap_info,omitempty"`
|
SealWrapInfo *wrapping.EncryptedBlobInfo `json:"seal_wrap_info,omitempty"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,221 +0,0 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
|
||||||
// source: sdk/physical/types.proto
|
|
||||||
|
|
||||||
package physical
|
|
||||||
|
|
||||||
import (
|
|
||||||
fmt "fmt"
|
|
||||||
proto "github.com/golang/protobuf/proto"
|
|
||||||
math "math"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Reference imports to suppress errors if they are not otherwise used.
|
|
||||||
var _ = proto.Marshal
|
|
||||||
var _ = fmt.Errorf
|
|
||||||
var _ = math.Inf
|
|
||||||
|
|
||||||
// This is a compile-time assertion to ensure that this generated file
|
|
||||||
// is compatible with the proto package it is being compiled against.
|
|
||||||
// A compilation error at this line likely means your copy of the
|
|
||||||
// proto package needs to be updated.
|
|
||||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
|
||||||
|
|
||||||
type EncryptedBlobInfo struct {
|
|
||||||
Ciphertext []byte `protobuf:"bytes,1,opt,name=ciphertext,proto3" json:"ciphertext,omitempty"`
|
|
||||||
IV []byte `protobuf:"bytes,2,opt,name=iv,proto3" json:"iv,omitempty"`
|
|
||||||
HMAC []byte `protobuf:"bytes,3,opt,name=hmac,proto3" json:"hmac,omitempty"`
|
|
||||||
Wrapped bool `protobuf:"varint,4,opt,name=wrapped,proto3" json:"wrapped,omitempty"`
|
|
||||||
KeyInfo *SealKeyInfo `protobuf:"bytes,5,opt,name=key_info,json=keyInfo,proto3" json:"key_info,omitempty"`
|
|
||||||
// Key is the Key value for the entry that corresponds to
|
|
||||||
// physical.Entry.Key's value
|
|
||||||
Key string `protobuf:"bytes,6,opt,name=key,proto3" json:"key,omitempty"`
|
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
XXX_sizecache int32 `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *EncryptedBlobInfo) Reset() { *m = EncryptedBlobInfo{} }
|
|
||||||
func (m *EncryptedBlobInfo) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*EncryptedBlobInfo) ProtoMessage() {}
|
|
||||||
func (*EncryptedBlobInfo) Descriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_21dce1f497d1541e, []int{0}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *EncryptedBlobInfo) XXX_Unmarshal(b []byte) error {
|
|
||||||
return xxx_messageInfo_EncryptedBlobInfo.Unmarshal(m, b)
|
|
||||||
}
|
|
||||||
func (m *EncryptedBlobInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|
||||||
return xxx_messageInfo_EncryptedBlobInfo.Marshal(b, m, deterministic)
|
|
||||||
}
|
|
||||||
func (m *EncryptedBlobInfo) XXX_Merge(src proto.Message) {
|
|
||||||
xxx_messageInfo_EncryptedBlobInfo.Merge(m, src)
|
|
||||||
}
|
|
||||||
func (m *EncryptedBlobInfo) XXX_Size() int {
|
|
||||||
return xxx_messageInfo_EncryptedBlobInfo.Size(m)
|
|
||||||
}
|
|
||||||
func (m *EncryptedBlobInfo) XXX_DiscardUnknown() {
|
|
||||||
xxx_messageInfo_EncryptedBlobInfo.DiscardUnknown(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var xxx_messageInfo_EncryptedBlobInfo proto.InternalMessageInfo
|
|
||||||
|
|
||||||
func (m *EncryptedBlobInfo) GetCiphertext() []byte {
|
|
||||||
if m != nil {
|
|
||||||
return m.Ciphertext
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *EncryptedBlobInfo) GetIV() []byte {
|
|
||||||
if m != nil {
|
|
||||||
return m.IV
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *EncryptedBlobInfo) GetHMAC() []byte {
|
|
||||||
if m != nil {
|
|
||||||
return m.HMAC
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *EncryptedBlobInfo) GetWrapped() bool {
|
|
||||||
if m != nil {
|
|
||||||
return m.Wrapped
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *EncryptedBlobInfo) GetKeyInfo() *SealKeyInfo {
|
|
||||||
if m != nil {
|
|
||||||
return m.KeyInfo
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *EncryptedBlobInfo) GetKey() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Key
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// SealKeyInfo contains information regarding the seal used to encrypt the entry.
|
|
||||||
type SealKeyInfo struct {
|
|
||||||
// Mechanism is the method used by the seal to encrypt and sign the
|
|
||||||
// data as defined by the seal.
|
|
||||||
Mechanism uint64 `protobuf:"varint,1,opt,name=Mechanism,proto3" json:"Mechanism,omitempty"`
|
|
||||||
HMACMechanism uint64 `protobuf:"varint,2,opt,name=HMACMechanism,proto3" json:"HMACMechanism,omitempty"`
|
|
||||||
// This is an opaque ID used by the seal to identify the specific
|
|
||||||
// key to use as defined by the seal. This could be a version, key
|
|
||||||
// label, or something else.
|
|
||||||
KeyID string `protobuf:"bytes,3,opt,name=KeyID,proto3" json:"KeyID,omitempty"`
|
|
||||||
HMACKeyID string `protobuf:"bytes,4,opt,name=HMACKeyID,proto3" json:"HMACKeyID,omitempty"`
|
|
||||||
// These value are used when generating our own data encryption keys
|
|
||||||
// and encrypting them using the autoseal
|
|
||||||
WrappedKey []byte `protobuf:"bytes,5,opt,name=WrappedKey,proto3" json:"WrappedKey,omitempty"`
|
|
||||||
// Mechanism specific flags
|
|
||||||
Flags uint64 `protobuf:"varint,6,opt,name=Flags,proto3" json:"Flags,omitempty"`
|
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
XXX_sizecache int32 `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *SealKeyInfo) Reset() { *m = SealKeyInfo{} }
|
|
||||||
func (m *SealKeyInfo) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*SealKeyInfo) ProtoMessage() {}
|
|
||||||
func (*SealKeyInfo) Descriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_21dce1f497d1541e, []int{1}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *SealKeyInfo) XXX_Unmarshal(b []byte) error {
|
|
||||||
return xxx_messageInfo_SealKeyInfo.Unmarshal(m, b)
|
|
||||||
}
|
|
||||||
func (m *SealKeyInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|
||||||
return xxx_messageInfo_SealKeyInfo.Marshal(b, m, deterministic)
|
|
||||||
}
|
|
||||||
func (m *SealKeyInfo) XXX_Merge(src proto.Message) {
|
|
||||||
xxx_messageInfo_SealKeyInfo.Merge(m, src)
|
|
||||||
}
|
|
||||||
func (m *SealKeyInfo) XXX_Size() int {
|
|
||||||
return xxx_messageInfo_SealKeyInfo.Size(m)
|
|
||||||
}
|
|
||||||
func (m *SealKeyInfo) XXX_DiscardUnknown() {
|
|
||||||
xxx_messageInfo_SealKeyInfo.DiscardUnknown(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var xxx_messageInfo_SealKeyInfo proto.InternalMessageInfo
|
|
||||||
|
|
||||||
func (m *SealKeyInfo) GetMechanism() uint64 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Mechanism
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *SealKeyInfo) GetHMACMechanism() uint64 {
|
|
||||||
if m != nil {
|
|
||||||
return m.HMACMechanism
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *SealKeyInfo) GetKeyID() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.KeyID
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *SealKeyInfo) GetHMACKeyID() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.HMACKeyID
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *SealKeyInfo) GetWrappedKey() []byte {
|
|
||||||
if m != nil {
|
|
||||||
return m.WrappedKey
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *SealKeyInfo) GetFlags() uint64 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Flags
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
proto.RegisterType((*EncryptedBlobInfo)(nil), "physical.EncryptedBlobInfo")
|
|
||||||
proto.RegisterType((*SealKeyInfo)(nil), "physical.SealKeyInfo")
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() { proto.RegisterFile("sdk/physical/types.proto", fileDescriptor_21dce1f497d1541e) }
|
|
||||||
|
|
||||||
var fileDescriptor_21dce1f497d1541e = []byte{
|
|
||||||
// 316 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0x91, 0x5d, 0x4b, 0xfb, 0x30,
|
|
||||||
0x14, 0xc6, 0x69, 0xd7, 0xbd, 0x9d, 0xed, 0xff, 0x47, 0x83, 0x42, 0x2e, 0x44, 0xca, 0x10, 0xac,
|
|
||||||
0x37, 0xad, 0xe8, 0x27, 0x70, 0xbe, 0xa0, 0x8c, 0xdd, 0xc4, 0x0b, 0xc1, 0x1b, 0xc9, 0xb2, 0x6c,
|
|
||||||
0x09, 0xed, 0x9a, 0xd0, 0x66, 0xd3, 0x7c, 0x30, 0xaf, 0xfc, 0x72, 0x92, 0x94, 0xb1, 0x7a, 0x77,
|
|
||||||
0xce, 0x2f, 0x0f, 0x0f, 0xcf, 0x93, 0x03, 0xb8, 0x5e, 0xe6, 0x99, 0x16, 0xb6, 0x96, 0x8c, 0x16,
|
|
||||||
0x99, 0xb1, 0x9a, 0xd7, 0xa9, 0xae, 0x94, 0x51, 0x68, 0xb0, 0xa7, 0x93, 0xef, 0x00, 0x8e, 0x1f,
|
|
||||||
0x4b, 0x56, 0x59, 0x6d, 0xf8, 0x72, 0x5a, 0xa8, 0xc5, 0x4b, 0xb9, 0x52, 0xe8, 0x1c, 0x80, 0x49,
|
|
||||||
0x2d, 0x78, 0x65, 0xf8, 0x97, 0xc1, 0x41, 0x1c, 0x24, 0x63, 0xd2, 0x22, 0xe8, 0x3f, 0x84, 0x72,
|
|
||||||
0x87, 0x43, 0xcf, 0x43, 0xb9, 0x43, 0x08, 0x22, 0xb1, 0xa1, 0x0c, 0x77, 0x3c, 0xf1, 0x33, 0xc2,
|
|
||||||
0xd0, 0xff, 0xac, 0xa8, 0xd6, 0x7c, 0x89, 0xa3, 0x38, 0x48, 0x06, 0x64, 0xbf, 0xa2, 0x6b, 0x18,
|
|
||||||
0xe4, 0xdc, 0x7e, 0xc8, 0x72, 0xa5, 0x70, 0x37, 0x0e, 0x92, 0xd1, 0xcd, 0x69, 0xba, 0x0f, 0x94,
|
|
||||||
0xbe, 0x72, 0x5a, 0xcc, 0xb8, 0x75, 0x31, 0x48, 0x3f, 0x6f, 0x06, 0x74, 0x04, 0x9d, 0x9c, 0x5b,
|
|
||||||
0xdc, 0x8b, 0x83, 0x64, 0x48, 0xdc, 0x38, 0xf9, 0x09, 0x60, 0xd4, 0x92, 0xa2, 0x33, 0x18, 0xce,
|
|
||||||
0x39, 0x13, 0xb4, 0x94, 0xf5, 0xc6, 0x07, 0x8e, 0xc8, 0x01, 0xa0, 0x0b, 0xf8, 0xf7, 0x3c, 0xbf,
|
|
||||||
0xbb, 0x3f, 0x28, 0x42, 0xaf, 0xf8, 0x0b, 0xd1, 0x09, 0x74, 0x9d, 0xdd, 0x83, 0xaf, 0x31, 0x24,
|
|
||||||
0xcd, 0xe2, 0x9c, 0x9d, 0xac, 0x79, 0x89, 0xfc, 0xcb, 0x01, 0xb8, 0x9f, 0x7a, 0x6b, 0x6a, 0xcd,
|
|
||||||
0xb8, 0xf5, 0x6d, 0xc6, 0xa4, 0x45, 0x9c, 0xe7, 0x53, 0x41, 0xd7, 0xb5, 0xcf, 0x1e, 0x91, 0x66,
|
|
||||||
0x99, 0x5e, 0xbd, 0x5f, 0xae, 0xa5, 0x11, 0xdb, 0x45, 0xca, 0xd4, 0x26, 0x13, 0xb4, 0x16, 0x92,
|
|
||||||
0xa9, 0x4a, 0x67, 0x3b, 0xba, 0x2d, 0x4c, 0xd6, 0x3e, 0xdb, 0xa2, 0xe7, 0x2f, 0x76, 0xfb, 0x1b,
|
|
||||||
0x00, 0x00, 0xff, 0xff, 0xc6, 0x34, 0xf8, 0x45, 0xcd, 0x01, 0x00, 0x00,
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
option go_package = "github.com/hashicorp/vault/sdk/physical";
|
|
||||||
|
|
||||||
package physical;
|
|
||||||
|
|
||||||
message EncryptedBlobInfo {
|
|
||||||
bytes ciphertext = 1;
|
|
||||||
bytes iv = 2;
|
|
||||||
bytes hmac = 3;
|
|
||||||
bool wrapped = 4;
|
|
||||||
SealKeyInfo key_info = 5;
|
|
||||||
|
|
||||||
// Key is the Key value for the entry that corresponds to
|
|
||||||
// physical.Entry.Key's value
|
|
||||||
string key = 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
// SealKeyInfo contains information regarding the seal used to encrypt the entry.
|
|
||||||
message SealKeyInfo {
|
|
||||||
// Mechanism is the method used by the seal to encrypt and sign the
|
|
||||||
// data as defined by the seal.
|
|
||||||
uint64 Mechanism = 1;
|
|
||||||
uint64 HMACMechanism = 2;
|
|
||||||
|
|
||||||
// This is an opaque ID used by the seal to identify the specific
|
|
||||||
// key to use as defined by the seal. This could be a version, key
|
|
||||||
// label, or something else.
|
|
||||||
string KeyID = 3;
|
|
||||||
string HMACKeyID = 4;
|
|
||||||
|
|
||||||
// These value are used when generating our own data encryption keys
|
|
||||||
// and encrypting them using the autoseal
|
|
||||||
bytes WrappedKey = 5;
|
|
||||||
|
|
||||||
// Mechanism specific flags
|
|
||||||
uint64 Flags = 6;
|
|
||||||
}
|
|
||||||
@@ -21,6 +21,8 @@ import (
|
|||||||
metrics "github.com/armon/go-metrics"
|
metrics "github.com/armon/go-metrics"
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
|
aeadwrapper "github.com/hashicorp/go-kms-wrapping/wrappers/aead"
|
||||||
multierror "github.com/hashicorp/go-multierror"
|
multierror "github.com/hashicorp/go-multierror"
|
||||||
uuid "github.com/hashicorp/go-uuid"
|
uuid "github.com/hashicorp/go-uuid"
|
||||||
"github.com/hashicorp/vault/api"
|
"github.com/hashicorp/vault/api"
|
||||||
@@ -42,8 +44,7 @@ import (
|
|||||||
sr "github.com/hashicorp/vault/serviceregistration"
|
sr "github.com/hashicorp/vault/serviceregistration"
|
||||||
"github.com/hashicorp/vault/shamir"
|
"github.com/hashicorp/vault/shamir"
|
||||||
"github.com/hashicorp/vault/vault/cluster"
|
"github.com/hashicorp/vault/vault/cluster"
|
||||||
"github.com/hashicorp/vault/vault/seal"
|
vaultseal "github.com/hashicorp/vault/vault/seal"
|
||||||
shamirseal "github.com/hashicorp/vault/vault/seal/shamir"
|
|
||||||
cache "github.com/patrickmn/go-cache"
|
cache "github.com/patrickmn/go-cache"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
@@ -157,7 +158,7 @@ type unlockInformation struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type raftInformation struct {
|
type raftInformation struct {
|
||||||
challenge *physical.EncryptedBlobInfo
|
challenge *wrapping.EncryptedBlobInfo
|
||||||
leaderClient *api.Client
|
leaderClient *api.Client
|
||||||
leaderBarrierConfig *SealConfig
|
leaderBarrierConfig *SealConfig
|
||||||
nonVoter bool
|
nonVoter bool
|
||||||
@@ -770,7 +771,11 @@ func NewCore(conf *CoreConfig) (*Core, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if c.seal == nil {
|
if c.seal == nil {
|
||||||
c.seal = NewDefaultSeal(shamirseal.NewSeal(c.logger.Named("shamir")))
|
c.seal = NewDefaultSeal(&vaultseal.Access{
|
||||||
|
Wrapper: aeadwrapper.NewWrapper(&wrapping.WrapperOptions{
|
||||||
|
Logger: c.logger.Named("shamir"),
|
||||||
|
}),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
c.seal.SetCore(c)
|
c.seal.SetCore(c)
|
||||||
|
|
||||||
@@ -990,17 +995,17 @@ func (c *Core) unseal(key []byte, useRecoveryKeys bool) (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if masterKey != nil {
|
if masterKey != nil {
|
||||||
if c.seal.BarrierType() == seal.Shamir {
|
if c.seal.BarrierType() == wrapping.Shamir {
|
||||||
// If this is a legacy shamir seal this serves no purpose but it
|
// If this is a legacy shamir seal this serves no purpose but it
|
||||||
// doesn't hurt.
|
// doesn't hurt.
|
||||||
err = c.seal.GetAccess().(*shamirseal.ShamirSeal).SetKey(masterKey)
|
err = c.seal.GetAccess().Wrapper.(*aeadwrapper.Wrapper).SetAESGCMKeyBytes(masterKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !c.isRaftUnseal() {
|
if !c.isRaftUnseal() {
|
||||||
if c.seal.BarrierType() == seal.Shamir {
|
if c.seal.BarrierType() == wrapping.Shamir {
|
||||||
cfg, err := c.seal.BarrierConfig(ctx)
|
cfg, err := c.seal.BarrierConfig(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
@@ -1037,7 +1042,7 @@ func (c *Core) unseal(key []byte, useRecoveryKeys bool) (bool, error) {
|
|||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
keyringFound := false
|
keyringFound := false
|
||||||
haveMasterKey := c.seal.StoredKeysSupported() != StoredKeysSupportedShamirMaster
|
haveMasterKey := c.seal.StoredKeysSupported() != vaultseal.StoredKeysSupportedShamirMaster
|
||||||
defer func() {
|
defer func() {
|
||||||
if keyringFound && haveMasterKey {
|
if keyringFound && haveMasterKey {
|
||||||
_, err := c.unsealInternal(ctx, masterKey)
|
_, err := c.unsealInternal(ctx, masterKey)
|
||||||
@@ -1171,7 +1176,7 @@ func (c *Core) unsealPart(ctx context.Context, seal Seal, key []byte, useRecover
|
|||||||
// keys setup, nor 2) seals that support recovery keys but not stored keys.
|
// keys setup, nor 2) seals that support recovery keys but not stored keys.
|
||||||
// If insufficient shares are provided, shamir.Combine will error, and if
|
// If insufficient shares are provided, shamir.Combine will error, and if
|
||||||
// no stored keys are found it will return masterKey as nil.
|
// no stored keys are found it will return masterKey as nil.
|
||||||
if seal.StoredKeysSupported() == StoredKeysSupportedGeneric {
|
if seal.StoredKeysSupported() == vaultseal.StoredKeysSupportedGeneric {
|
||||||
masterKeyShares, err := seal.GetStoredKeys(ctx)
|
masterKeyShares, err := seal.GetStoredKeys(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errwrap.Wrapf("unable to retrieve stored keys: {{err}}", err)
|
return nil, errwrap.Wrapf("unable to retrieve stored keys: {{err}}", err)
|
||||||
@@ -1196,8 +1201,8 @@ func (c *Core) unsealPart(ctx context.Context, seal Seal, key []byte, useRecover
|
|||||||
|
|
||||||
// If we have a migration seal, now's the time!
|
// If we have a migration seal, now's the time!
|
||||||
if c.migrationSeal != nil {
|
if c.migrationSeal != nil {
|
||||||
if seal.StoredKeysSupported() == StoredKeysSupportedShamirMaster {
|
if seal.StoredKeysSupported() == vaultseal.StoredKeysSupportedShamirMaster {
|
||||||
err = seal.GetAccess().(*shamirseal.ShamirSeal).SetKey(masterKey)
|
err = seal.GetAccess().Wrapper.(*aeadwrapper.Wrapper).SetAESGCMKeyBytes(masterKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errwrap.Wrapf("failed to set master key in seal: {{err}}", err)
|
return nil, errwrap.Wrapf("failed to set master key in seal: {{err}}", err)
|
||||||
}
|
}
|
||||||
@@ -1245,7 +1250,7 @@ func (c *Core) unsealPart(ctx context.Context, seal Seal, key []byte, useRecover
|
|||||||
|
|
||||||
// We have recovery keys; we're going to use them as the new
|
// We have recovery keys; we're going to use them as the new
|
||||||
// shamir KeK.
|
// shamir KeK.
|
||||||
err = c.seal.GetAccess().(*shamirseal.ShamirSeal).SetKey(recoveryKey)
|
err = c.seal.GetAccess().Wrapper.(*aeadwrapper.Wrapper).SetAESGCMKeyBytes(recoveryKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errwrap.Wrapf("failed to set master key in seal: {{err}}", err)
|
return nil, errwrap.Wrapf("failed to set master key in seal: {{err}}", err)
|
||||||
}
|
}
|
||||||
@@ -2048,7 +2053,7 @@ func (c *Core) PhysicalSealConfigs(ctx context.Context) (*SealConfig, *SealConfi
|
|||||||
// In older versions of vault the default seal would not store a type. This
|
// In older versions of vault the default seal would not store a type. This
|
||||||
// is here to offer backwards compatibility for older seal configs.
|
// is here to offer backwards compatibility for older seal configs.
|
||||||
if barrierConf.Type == "" {
|
if barrierConf.Type == "" {
|
||||||
barrierConf.Type = seal.Shamir
|
barrierConf.Type = wrapping.Shamir
|
||||||
}
|
}
|
||||||
|
|
||||||
var recoveryConf *SealConfig
|
var recoveryConf *SealConfig
|
||||||
@@ -2068,7 +2073,7 @@ func (c *Core) PhysicalSealConfigs(ctx context.Context) (*SealConfig, *SealConfi
|
|||||||
// In older versions of vault the default seal would not store a type. This
|
// In older versions of vault the default seal would not store a type. This
|
||||||
// is here to offer backwards compatibility for older seal configs.
|
// is here to offer backwards compatibility for older seal configs.
|
||||||
if recoveryConf.Type == "" {
|
if recoveryConf.Type == "" {
|
||||||
recoveryConf.Type = seal.Shamir
|
recoveryConf.Type = wrapping.Shamir
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2098,7 +2103,7 @@ func (c *Core) SetSealsForMigration(migrationSeal, newSeal, unwrapSeal Seal) {
|
|||||||
// that can be used to unseal the barrier.
|
// that can be used to unseal the barrier.
|
||||||
func (c *Core) unsealKeyToMasterKey(ctx context.Context, combinedKey []byte) ([]byte, error) {
|
func (c *Core) unsealKeyToMasterKey(ctx context.Context, combinedKey []byte) ([]byte, error) {
|
||||||
switch c.seal.StoredKeysSupported() {
|
switch c.seal.StoredKeysSupported() {
|
||||||
case StoredKeysSupportedGeneric:
|
case vaultseal.StoredKeysSupportedGeneric:
|
||||||
if err := c.seal.VerifyRecoveryKey(ctx, combinedKey); err != nil {
|
if err := c.seal.VerifyRecoveryKey(ctx, combinedKey); err != nil {
|
||||||
return nil, errwrap.Wrapf("recovery key verification failed: {{err}}", err)
|
return nil, errwrap.Wrapf("recovery key verification failed: {{err}}", err)
|
||||||
}
|
}
|
||||||
@@ -2112,15 +2117,19 @@ func (c *Core) unsealKeyToMasterKey(ctx context.Context, combinedKey []byte) ([]
|
|||||||
}
|
}
|
||||||
return storedKeys[0], nil
|
return storedKeys[0], nil
|
||||||
|
|
||||||
case StoredKeysSupportedShamirMaster:
|
case vaultseal.StoredKeysSupportedShamirMaster:
|
||||||
testseal := NewDefaultSeal(shamirseal.NewSeal(c.logger.Named("testseal")))
|
testseal := NewDefaultSeal(&vaultseal.Access{
|
||||||
|
Wrapper: aeadwrapper.NewWrapper(&wrapping.WrapperOptions{
|
||||||
|
Logger: c.logger.Named("testseal"),
|
||||||
|
}),
|
||||||
|
})
|
||||||
testseal.SetCore(c)
|
testseal.SetCore(c)
|
||||||
cfg, err := c.seal.BarrierConfig(ctx)
|
cfg, err := c.seal.BarrierConfig(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errwrap.Wrapf("failed to setup test barrier config: {{err}}", err)
|
return nil, errwrap.Wrapf("failed to setup test barrier config: {{err}}", err)
|
||||||
}
|
}
|
||||||
testseal.SetCachedBarrierConfig(cfg)
|
testseal.SetCachedBarrierConfig(cfg)
|
||||||
err = testseal.GetAccess().(*shamirseal.ShamirSeal).SetKey(combinedKey)
|
err = testseal.GetAccess().Wrapper.(*aeadwrapper.Wrapper).SetAESGCMKeyBytes(combinedKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errwrap.Wrapf("failed to setup unseal key: {{err}}", err)
|
return nil, errwrap.Wrapf("failed to setup unseal key: {{err}}", err)
|
||||||
}
|
}
|
||||||
@@ -2133,7 +2142,7 @@ func (c *Core) unsealKeyToMasterKey(ctx context.Context, combinedKey []byte) ([]
|
|||||||
}
|
}
|
||||||
return storedKeys[0], nil
|
return storedKeys[0], nil
|
||||||
|
|
||||||
case StoredKeysNotSupported:
|
case vaultseal.StoredKeysNotSupported:
|
||||||
return combinedKey, nil
|
return combinedKey, nil
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("invalid seal")
|
return nil, fmt.Errorf("invalid seal")
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import (
|
|||||||
"github.com/hashicorp/vault/sdk/helper/logging"
|
"github.com/hashicorp/vault/sdk/helper/logging"
|
||||||
"github.com/hashicorp/vault/sdk/physical/inmem"
|
"github.com/hashicorp/vault/sdk/physical/inmem"
|
||||||
"github.com/hashicorp/vault/vault"
|
"github.com/hashicorp/vault/vault"
|
||||||
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSysRekey_Verification(t *testing.T) {
|
func TestSysRekey_Verification(t *testing.T) {
|
||||||
@@ -43,14 +44,14 @@ func testSysRekey_Verification(t *testing.T, recovery bool, legacyShamir bool) {
|
|||||||
panic("invalid case")
|
panic("invalid case")
|
||||||
}
|
}
|
||||||
opts.SealFunc = func() vault.Seal {
|
opts.SealFunc = func() vault.Seal {
|
||||||
return vault.NewTestSeal(t, &vault.TestSealOpts{
|
return vault.NewTestSeal(t, &seal.TestSealOpts{
|
||||||
StoredKeys: vault.StoredKeysSupportedGeneric,
|
StoredKeys: seal.StoredKeysSupportedGeneric,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
case legacyShamir:
|
case legacyShamir:
|
||||||
opts.SealFunc = func() vault.Seal {
|
opts.SealFunc = func() vault.Seal {
|
||||||
return vault.NewTestSeal(t, &vault.TestSealOpts{
|
return vault.NewTestSeal(t, &seal.TestSealOpts{
|
||||||
StoredKeys: vault.StoredKeysNotSupported,
|
StoredKeys: seal.StoredKeysNotSupported,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
12
vault/ha.go
12
vault/ha.go
@@ -10,10 +10,9 @@ import (
|
|||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/hashicorp/vault/vault/seal/shamir"
|
|
||||||
|
|
||||||
"github.com/armon/go-metrics"
|
"github.com/armon/go-metrics"
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
|
aeadwrapper "github.com/hashicorp/go-kms-wrapping/wrappers/aead"
|
||||||
"github.com/hashicorp/go-multierror"
|
"github.com/hashicorp/go-multierror"
|
||||||
"github.com/hashicorp/go-uuid"
|
"github.com/hashicorp/go-uuid"
|
||||||
"github.com/hashicorp/vault/helper/namespace"
|
"github.com/hashicorp/vault/helper/namespace"
|
||||||
@@ -23,6 +22,7 @@ import (
|
|||||||
"github.com/hashicorp/vault/sdk/helper/jsonutil"
|
"github.com/hashicorp/vault/sdk/helper/jsonutil"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
"github.com/hashicorp/vault/sdk/logical"
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
"github.com/hashicorp/vault/sdk/physical"
|
||||||
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
"github.com/oklog/run"
|
"github.com/oklog/run"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -781,9 +781,9 @@ func (c *Core) reloadShamirKey(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
var shamirKey []byte
|
var shamirKey []byte
|
||||||
switch c.seal.StoredKeysSupported() {
|
switch c.seal.StoredKeysSupported() {
|
||||||
case StoredKeysSupportedGeneric:
|
case seal.StoredKeysSupportedGeneric:
|
||||||
return nil
|
return nil
|
||||||
case StoredKeysSupportedShamirMaster:
|
case seal.StoredKeysSupportedShamirMaster:
|
||||||
entry, err := c.barrier.Get(ctx, shamirKekPath)
|
entry, err := c.barrier.Get(ctx, shamirKekPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -792,14 +792,14 @@ func (c *Core) reloadShamirKey(ctx context.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
shamirKey = entry.Value
|
shamirKey = entry.Value
|
||||||
case StoredKeysNotSupported:
|
case seal.StoredKeysNotSupported:
|
||||||
keyring, err := c.barrier.Keyring()
|
keyring, err := c.barrier.Keyring()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errwrap.Wrapf("failed to update seal access: {{err}}", err)
|
return errwrap.Wrapf("failed to update seal access: {{err}}", err)
|
||||||
}
|
}
|
||||||
shamirKey = keyring.masterKey
|
shamirKey = keyring.masterKey
|
||||||
}
|
}
|
||||||
return c.seal.GetAccess().(*shamir.ShamirSeal).SetKey(shamirKey)
|
return c.seal.GetAccess().Wrapper.(*aeadwrapper.Wrapper).SetAESGCMKeyBytes(shamirKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Core) performKeyUpgrades(ctx context.Context) error {
|
func (c *Core) performKeyUpgrades(ctx context.Context) error {
|
||||||
|
|||||||
@@ -9,14 +9,15 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
"github.com/hashicorp/vault/physical/raft"
|
"github.com/hashicorp/vault/physical/raft"
|
||||||
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
|
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
|
aeadwrapper "github.com/hashicorp/go-kms-wrapping/wrappers/aead"
|
||||||
"github.com/hashicorp/vault/helper/namespace"
|
"github.com/hashicorp/vault/helper/namespace"
|
||||||
"github.com/hashicorp/vault/helper/pgpkeys"
|
"github.com/hashicorp/vault/helper/pgpkeys"
|
||||||
"github.com/hashicorp/vault/shamir"
|
"github.com/hashicorp/vault/shamir"
|
||||||
"github.com/hashicorp/vault/vault/seal"
|
|
||||||
shamirseal "github.com/hashicorp/vault/vault/seal/shamir"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// InitParams keeps the init function from being littered with too many
|
// InitParams keeps the init function from being littered with too many
|
||||||
@@ -145,7 +146,7 @@ func (c *Core) Initialize(ctx context.Context, initParams *InitParams) (*InitRes
|
|||||||
// which means both that the shares will be different *AND* there would
|
// which means both that the shares will be different *AND* there would
|
||||||
// need to be a way to actually allow fetching of the generated keys by
|
// need to be a way to actually allow fetching of the generated keys by
|
||||||
// operators.
|
// operators.
|
||||||
if c.SealAccess().StoredKeysSupported() == StoredKeysSupportedGeneric {
|
if c.SealAccess().StoredKeysSupported() == seal.StoredKeysSupportedGeneric {
|
||||||
if len(barrierConfig.PGPKeys) > 0 {
|
if len(barrierConfig.PGPKeys) > 0 {
|
||||||
return nil, fmt.Errorf("PGP keys not supported when storing shares")
|
return nil, fmt.Errorf("PGP keys not supported when storing shares")
|
||||||
}
|
}
|
||||||
@@ -254,7 +255,7 @@ func (c *Core) Initialize(ctx context.Context, initParams *InitParams) (*InitRes
|
|||||||
|
|
||||||
var sealKey []byte
|
var sealKey []byte
|
||||||
var sealKeyShares [][]byte
|
var sealKeyShares [][]byte
|
||||||
if barrierConfig.StoredShares == 1 && c.seal.BarrierType() == seal.Shamir {
|
if barrierConfig.StoredShares == 1 && c.seal.BarrierType() == wrapping.Shamir {
|
||||||
sealKey, sealKeyShares, err = c.generateShares(barrierConfig)
|
sealKey, sealKeyShares, err = c.generateShares(barrierConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.logger.Error("error generating shares", "error", err)
|
c.logger.Error("error generating shares", "error", err)
|
||||||
@@ -300,9 +301,9 @@ func (c *Core) Initialize(ctx context.Context, initParams *InitParams) (*InitRes
|
|||||||
// If we are storing shares, pop them out of the returned results and push
|
// If we are storing shares, pop them out of the returned results and push
|
||||||
// them through the seal
|
// them through the seal
|
||||||
switch c.seal.StoredKeysSupported() {
|
switch c.seal.StoredKeysSupported() {
|
||||||
case StoredKeysSupportedShamirMaster:
|
case seal.StoredKeysSupportedShamirMaster:
|
||||||
keysToStore := [][]byte{barrierKey}
|
keysToStore := [][]byte{barrierKey}
|
||||||
if err := c.seal.GetAccess().(*shamirseal.ShamirSeal).SetKey(sealKey); err != nil {
|
if err := c.seal.GetAccess().Wrapper.(*aeadwrapper.Wrapper).SetAESGCMKeyBytes(sealKey); err != nil {
|
||||||
c.logger.Error("failed to set seal key", "error", err)
|
c.logger.Error("failed to set seal key", "error", err)
|
||||||
return nil, errwrap.Wrapf("failed to set seal key: {{err}}", err)
|
return nil, errwrap.Wrapf("failed to set seal key: {{err}}", err)
|
||||||
}
|
}
|
||||||
@@ -311,7 +312,7 @@ func (c *Core) Initialize(ctx context.Context, initParams *InitParams) (*InitRes
|
|||||||
return nil, errwrap.Wrapf("failed to store keys: {{err}}", err)
|
return nil, errwrap.Wrapf("failed to store keys: {{err}}", err)
|
||||||
}
|
}
|
||||||
results.SecretShares = sealKeyShares
|
results.SecretShares = sealKeyShares
|
||||||
case StoredKeysSupportedGeneric:
|
case seal.StoredKeysSupportedGeneric:
|
||||||
keysToStore := [][]byte{barrierKey}
|
keysToStore := [][]byte{barrierKey}
|
||||||
if err := c.seal.SetStoredKeys(ctx, keysToStore); err != nil {
|
if err := c.seal.SetStoredKeys(ctx, keysToStore); err != nil {
|
||||||
c.logger.Error("failed to store keys", "error", err)
|
c.logger.Error("failed to store keys", "error", err)
|
||||||
@@ -407,7 +408,7 @@ func (c *Core) UnsealWithStoredKeys(ctx context.Context) error {
|
|||||||
c.unsealWithStoredKeysLock.Lock()
|
c.unsealWithStoredKeysLock.Lock()
|
||||||
defer c.unsealWithStoredKeysLock.Unlock()
|
defer c.unsealWithStoredKeysLock.Unlock()
|
||||||
|
|
||||||
if c.seal.BarrierType() == seal.Shamir {
|
if c.seal.BarrierType() == wrapping.Shamir {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
"github.com/hashicorp/vault/sdk/helper/logging"
|
"github.com/hashicorp/vault/sdk/helper/logging"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
"github.com/hashicorp/vault/sdk/logical"
|
||||||
"github.com/hashicorp/vault/sdk/physical/inmem"
|
"github.com/hashicorp/vault/sdk/physical/inmem"
|
||||||
"github.com/hashicorp/vault/vault/seal"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCore_Init(t *testing.T) {
|
func TestCore_Init(t *testing.T) {
|
||||||
@@ -80,7 +80,7 @@ func testCore_Init_Common(t *testing.T, c *Core, conf *CoreConfig, barrierConf,
|
|||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.seal.BarrierType() == seal.Shamir && len(res.SecretShares) != barrierConf.SecretShares {
|
if c.seal.BarrierType() == wrapping.Shamir && len(res.SecretShares) != barrierConf.SecretShares {
|
||||||
t.Fatalf("Bad: got\n%#v\nexpected conf matching\n%#v\n", *res, *barrierConf)
|
t.Fatalf("Bad: got\n%#v\nexpected conf matching\n%#v\n", *res, *barrierConf)
|
||||||
}
|
}
|
||||||
if recoveryConf != nil {
|
if recoveryConf != nil {
|
||||||
|
|||||||
@@ -8,13 +8,13 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
proto "github.com/golang/protobuf/proto"
|
proto "github.com/golang/protobuf/proto"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
uuid "github.com/hashicorp/go-uuid"
|
uuid "github.com/hashicorp/go-uuid"
|
||||||
"github.com/hashicorp/vault/helper/namespace"
|
"github.com/hashicorp/vault/helper/namespace"
|
||||||
"github.com/hashicorp/vault/physical/raft"
|
"github.com/hashicorp/vault/physical/raft"
|
||||||
"github.com/hashicorp/vault/sdk/framework"
|
"github.com/hashicorp/vault/sdk/framework"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
"github.com/hashicorp/vault/sdk/logical"
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
"github.com/hashicorp/vault/sdk/physical"
|
||||||
"github.com/hashicorp/vault/vault/seal"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// raftStoragePaths returns paths for use when raft is the storage mechanism.
|
// raftStoragePaths returns paths for use when raft is the storage mechanism.
|
||||||
@@ -192,7 +192,7 @@ func (b *SystemBackend) handleRaftBootstrapChallengeWrite() framework.OperationF
|
|||||||
}
|
}
|
||||||
|
|
||||||
sealAccess := b.Core.seal.GetAccess()
|
sealAccess := b.Core.seal.GetAccess()
|
||||||
eBlob, err := sealAccess.Encrypt(ctx, uuid)
|
eBlob, err := sealAccess.Encrypt(ctx, uuid, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -337,7 +337,7 @@ func (b *SystemBackend) handleStorageRaftSnapshotWrite(force bool) framework.Ope
|
|||||||
case err == nil:
|
case err == nil:
|
||||||
case strings.Contains(err.Error(), "failed to open the sealed hashes"):
|
case strings.Contains(err.Error(), "failed to open the sealed hashes"):
|
||||||
switch b.Core.seal.BarrierType() {
|
switch b.Core.seal.BarrierType() {
|
||||||
case seal.Shamir:
|
case wrapping.Shamir:
|
||||||
return logical.ErrorResponse("could not verify hash file, possibly the snapshot is using a different set of unseal keys; use the snapshot-force API to bypass this check"), logical.ErrInvalidRequest
|
return logical.ErrorResponse("could not verify hash file, possibly the snapshot is using a different set of unseal keys; use the snapshot-force API to bypass this check"), logical.ErrInvalidRequest
|
||||||
default:
|
default:
|
||||||
return logical.ErrorResponse("could not verify hash file, possibly the snapshot is using a different autoseal key; use the snapshot-force API to bypass this check"), logical.ErrInvalidRequest
|
return logical.ErrorResponse("could not verify hash file, possibly the snapshot is using a different autoseal key; use the snapshot-force API to bypass this check"), logical.ErrInvalidRequest
|
||||||
|
|||||||
@@ -17,12 +17,12 @@ import (
|
|||||||
proto "github.com/golang/protobuf/proto"
|
proto "github.com/golang/protobuf/proto"
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
cleanhttp "github.com/hashicorp/go-cleanhttp"
|
cleanhttp "github.com/hashicorp/go-cleanhttp"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
uuid "github.com/hashicorp/go-uuid"
|
uuid "github.com/hashicorp/go-uuid"
|
||||||
"github.com/hashicorp/vault/api"
|
"github.com/hashicorp/vault/api"
|
||||||
"github.com/hashicorp/vault/physical/raft"
|
"github.com/hashicorp/vault/physical/raft"
|
||||||
"github.com/hashicorp/vault/sdk/helper/jsonutil"
|
"github.com/hashicorp/vault/sdk/helper/jsonutil"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
"github.com/hashicorp/vault/sdk/logical"
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
|
||||||
"github.com/hashicorp/vault/vault/seal"
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
"github.com/mitchellh/mapstructure"
|
"github.com/mitchellh/mapstructure"
|
||||||
"golang.org/x/net/http2"
|
"golang.org/x/net/http2"
|
||||||
@@ -491,13 +491,14 @@ func (c *Core) raftSnapshotRestoreCallback(grabLock bool, sealNode bool) func(co
|
|||||||
// The snapshot contained a master key or keyring we couldn't
|
// The snapshot contained a master key or keyring we couldn't
|
||||||
// recover
|
// recover
|
||||||
switch c.seal.BarrierType() {
|
switch c.seal.BarrierType() {
|
||||||
case seal.Shamir:
|
case wrapping.Shamir:
|
||||||
// If we are a shamir seal we can't do anything. Just
|
// If we are a shamir seal we can't do anything. Just
|
||||||
// seal all nodes.
|
// seal all nodes.
|
||||||
|
|
||||||
// Seal ourselves
|
// Seal ourselves
|
||||||
c.logger.Info("failed to perform key upgrades, sealing", "error", err)
|
c.logger.Info("failed to perform key upgrades, sealing", "error", err)
|
||||||
return err
|
return err
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// If we are using an auto-unseal we can try to use the seal to
|
// If we are using an auto-unseal we can try to use the seal to
|
||||||
// unseal again. If the auto-unseal mechanism has changed then
|
// unseal again. If the auto-unseal mechanism has changed then
|
||||||
@@ -599,7 +600,7 @@ func (c *Core) JoinRaftCluster(ctx context.Context, leaderAddr string, tlsConfig
|
|||||||
return errwrap.Wrapf("error decoding challenge: {{err}}", err)
|
return errwrap.Wrapf("error decoding challenge: {{err}}", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
eBlob := &physical.EncryptedBlobInfo{}
|
eBlob := &wrapping.EncryptedBlobInfo{}
|
||||||
if err := proto.Unmarshal(challengeRaw, eBlob); err != nil {
|
if err := proto.Unmarshal(challengeRaw, eBlob); err != nil {
|
||||||
return errwrap.Wrapf("error decoding challenge: {{err}}", err)
|
return errwrap.Wrapf("error decoding challenge: {{err}}", err)
|
||||||
}
|
}
|
||||||
@@ -609,7 +610,7 @@ func (c *Core) JoinRaftCluster(ctx context.Context, leaderAddr string, tlsConfig
|
|||||||
leaderBarrierConfig: &sealConfig,
|
leaderBarrierConfig: &sealConfig,
|
||||||
nonVoter: nonVoter,
|
nonVoter: nonVoter,
|
||||||
}
|
}
|
||||||
if c.seal.BarrierType() == seal.Shamir {
|
if c.seal.BarrierType() == wrapping.Shamir {
|
||||||
c.raftInfo = raftInfo
|
c.raftInfo = raftInfo
|
||||||
c.seal.SetBarrierConfig(ctx, &sealConfig)
|
c.seal.SetBarrierConfig(ctx, &sealConfig)
|
||||||
return nil
|
return nil
|
||||||
@@ -651,7 +652,7 @@ func (c *Core) JoinRaftCluster(ctx context.Context, leaderAddr string, tlsConfig
|
|||||||
// This is used in tests to override the cluster address
|
// This is used in tests to override the cluster address
|
||||||
var UpdateClusterAddrForTests uint32
|
var UpdateClusterAddrForTests uint32
|
||||||
|
|
||||||
func (c *Core) joinRaftSendAnswer(ctx context.Context, sealAccess seal.Access, raftInfo *raftInformation) error {
|
func (c *Core) joinRaftSendAnswer(ctx context.Context, sealAccess *seal.Access, raftInfo *raftInformation) error {
|
||||||
if raftInfo.challenge == nil {
|
if raftInfo.challenge == nil {
|
||||||
return errors.New("raft challenge is nil")
|
return errors.New("raft challenge is nil")
|
||||||
}
|
}
|
||||||
@@ -665,7 +666,7 @@ func (c *Core) joinRaftSendAnswer(ctx context.Context, sealAccess seal.Access, r
|
|||||||
return errors.New("raft is already initialized")
|
return errors.New("raft is already initialized")
|
||||||
}
|
}
|
||||||
|
|
||||||
plaintext, err := sealAccess.Decrypt(ctx, raftInfo.challenge)
|
plaintext, err := sealAccess.Decrypt(ctx, raftInfo.challenge, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errwrap.Wrapf("error decrypting challenge: {{err}}", err)
|
return errwrap.Wrapf("error decrypting challenge: {{err}}", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
|
aeadwrapper "github.com/hashicorp/go-kms-wrapping/wrappers/aead"
|
||||||
"github.com/hashicorp/go-uuid"
|
"github.com/hashicorp/go-uuid"
|
||||||
"github.com/hashicorp/vault/helper/pgpkeys"
|
"github.com/hashicorp/vault/helper/pgpkeys"
|
||||||
"github.com/hashicorp/vault/sdk/helper/consts"
|
"github.com/hashicorp/vault/sdk/helper/consts"
|
||||||
@@ -18,7 +20,6 @@ import (
|
|||||||
"github.com/hashicorp/vault/sdk/physical"
|
"github.com/hashicorp/vault/sdk/physical"
|
||||||
"github.com/hashicorp/vault/shamir"
|
"github.com/hashicorp/vault/shamir"
|
||||||
"github.com/hashicorp/vault/vault/seal"
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
shamirseal "github.com/hashicorp/vault/vault/seal/shamir"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -169,7 +170,7 @@ func (c *Core) RekeyInit(config *SealConfig, recovery bool) logical.HTTPCodedErr
|
|||||||
// BarrierRekeyInit is used to initialize the rekey settings for the barrier key
|
// BarrierRekeyInit is used to initialize the rekey settings for the barrier key
|
||||||
func (c *Core) BarrierRekeyInit(config *SealConfig) logical.HTTPCodedError {
|
func (c *Core) BarrierRekeyInit(config *SealConfig) logical.HTTPCodedError {
|
||||||
switch c.seal.BarrierType() {
|
switch c.seal.BarrierType() {
|
||||||
case seal.Shamir:
|
case wrapping.Shamir:
|
||||||
// As of Vault 1.3 all seals use StoredShares==1. The one exception is
|
// As of Vault 1.3 all seals use StoredShares==1. The one exception is
|
||||||
// legacy shamir seals, which we can read but not write (by design).
|
// legacy shamir seals, which we can read but not write (by design).
|
||||||
// So if someone does a rekey, regardless of their intention, we're going
|
// So if someone does a rekey, regardless of their intention, we're going
|
||||||
@@ -332,7 +333,7 @@ func (c *Core) BarrierRekeyUpdate(ctx context.Context, key []byte, nonce string)
|
|||||||
var existingConfig *SealConfig
|
var existingConfig *SealConfig
|
||||||
var err error
|
var err error
|
||||||
var useRecovery bool // Determines whether recovery key is being used to rekey the master key
|
var useRecovery bool // Determines whether recovery key is being used to rekey the master key
|
||||||
if c.seal.StoredKeysSupported() == StoredKeysSupportedGeneric && c.seal.RecoveryKeySupported() {
|
if c.seal.StoredKeysSupported() == seal.StoredKeysSupportedGeneric && c.seal.RecoveryKeySupported() {
|
||||||
existingConfig, err = c.seal.RecoveryConfig(ctx)
|
existingConfig, err = c.seal.RecoveryConfig(ctx)
|
||||||
useRecovery = true
|
useRecovery = true
|
||||||
} else {
|
} else {
|
||||||
@@ -396,11 +397,15 @@ func (c *Core) BarrierRekeyUpdate(ctx context.Context, key []byte, nonce string)
|
|||||||
c.logger.Error("rekey recovery key verification failed", "error", err)
|
c.logger.Error("rekey recovery key verification failed", "error", err)
|
||||||
return nil, logical.CodedError(http.StatusBadRequest, errwrap.Wrapf("recovery key verification failed: {{err}}", err).Error())
|
return nil, logical.CodedError(http.StatusBadRequest, errwrap.Wrapf("recovery key verification failed: {{err}}", err).Error())
|
||||||
}
|
}
|
||||||
case c.seal.BarrierType() == seal.Shamir:
|
case c.seal.BarrierType() == wrapping.Shamir:
|
||||||
if c.seal.StoredKeysSupported() == StoredKeysSupportedShamirMaster {
|
if c.seal.StoredKeysSupported() == seal.StoredKeysSupportedShamirMaster {
|
||||||
testseal := NewDefaultSeal(shamirseal.NewSeal(c.logger.Named("testseal")))
|
testseal := NewDefaultSeal(&seal.Access{
|
||||||
|
Wrapper: aeadwrapper.NewWrapper(&wrapping.WrapperOptions{
|
||||||
|
Logger: c.logger.Named("testseal"),
|
||||||
|
}),
|
||||||
|
})
|
||||||
testseal.SetCore(c)
|
testseal.SetCore(c)
|
||||||
err = testseal.GetAccess().(*shamirseal.ShamirSeal).SetKey(recoveredKey)
|
err = testseal.GetAccess().Wrapper.(*aeadwrapper.Wrapper).SetAESGCMKeyBytes(recoveredKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, logical.CodedError(http.StatusInternalServerError, errwrap.Wrapf("failed to setup unseal key: {{err}}", err).Error())
|
return nil, logical.CodedError(http.StatusInternalServerError, errwrap.Wrapf("failed to setup unseal key: {{err}}", err).Error())
|
||||||
}
|
}
|
||||||
@@ -433,7 +438,7 @@ func (c *Core) BarrierRekeyUpdate(ctx context.Context, key []byte, nonce string)
|
|||||||
results := &RekeyResult{
|
results := &RekeyResult{
|
||||||
Backup: c.barrierRekeyConfig.Backup,
|
Backup: c.barrierRekeyConfig.Backup,
|
||||||
}
|
}
|
||||||
if c.seal.StoredKeysSupported() != StoredKeysSupportedGeneric {
|
if c.seal.StoredKeysSupported() != seal.StoredKeysSupportedGeneric {
|
||||||
// Set result.SecretShares to the new key itself if only a single key
|
// Set result.SecretShares to the new key itself if only a single key
|
||||||
// part is used -- no Shamir split required.
|
// part is used -- no Shamir split required.
|
||||||
if c.barrierRekeyConfig.SecretShares == 1 {
|
if c.barrierRekeyConfig.SecretShares == 1 {
|
||||||
@@ -516,7 +521,7 @@ func (c *Core) BarrierRekeyUpdate(ctx context.Context, key []byte, nonce string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Core) performBarrierRekey(ctx context.Context, newSealKey []byte) logical.HTTPCodedError {
|
func (c *Core) performBarrierRekey(ctx context.Context, newSealKey []byte) logical.HTTPCodedError {
|
||||||
legacyUpgrade := c.seal.StoredKeysSupported() == StoredKeysNotSupported
|
legacyUpgrade := c.seal.StoredKeysSupported() == seal.StoredKeysNotSupported
|
||||||
if legacyUpgrade {
|
if legacyUpgrade {
|
||||||
// We won't be able to call SetStoredKeys without setting StoredShares=1.
|
// We won't be able to call SetStoredKeys without setting StoredShares=1.
|
||||||
existingConfig, err := c.seal.BarrierConfig(ctx)
|
existingConfig, err := c.seal.BarrierConfig(ctx)
|
||||||
@@ -527,8 +532,8 @@ func (c *Core) performBarrierRekey(ctx context.Context, newSealKey []byte) logic
|
|||||||
c.seal.SetCachedBarrierConfig(existingConfig)
|
c.seal.SetCachedBarrierConfig(existingConfig)
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.seal.StoredKeysSupported() != StoredKeysSupportedGeneric {
|
if c.seal.StoredKeysSupported() != seal.StoredKeysSupportedGeneric {
|
||||||
err := c.seal.GetAccess().(*shamirseal.ShamirSeal).SetKey(newSealKey)
|
err := c.seal.GetAccess().Wrapper.(*aeadwrapper.Wrapper).SetAESGCMKeyBytes(newSealKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return logical.CodedError(http.StatusInternalServerError, errwrap.Wrapf("failed to update barrier seal key: {{err}}", err).Error())
|
return logical.CodedError(http.StatusInternalServerError, errwrap.Wrapf("failed to update barrier seal key: {{err}}", err).Error())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import (
|
|||||||
"github.com/hashicorp/vault/sdk/helper/logging"
|
"github.com/hashicorp/vault/sdk/helper/logging"
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
"github.com/hashicorp/vault/sdk/physical"
|
||||||
"github.com/hashicorp/vault/sdk/physical/inmem"
|
"github.com/hashicorp/vault/sdk/physical/inmem"
|
||||||
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCore_Rekey_Lifecycle(t *testing.T) {
|
func TestCore_Rekey_Lifecycle(t *testing.T) {
|
||||||
@@ -328,7 +329,7 @@ func TestCore_Rekey_Legacy(t *testing.T) {
|
|||||||
SecretThreshold: 1,
|
SecretThreshold: 1,
|
||||||
}
|
}
|
||||||
c, masterKeys, _, root := TestCoreUnsealedWithConfigSealOpts(t, bc, nil,
|
c, masterKeys, _, root := TestCoreUnsealedWithConfigSealOpts(t, bc, nil,
|
||||||
&TestSealOpts{StoredKeys: StoredKeysNotSupported})
|
&seal.TestSealOpts{StoredKeys: seal.StoredKeysNotSupported})
|
||||||
testCore_Rekey_Update_Common(t, c, masterKeys, root, false)
|
testCore_Rekey_Update_Common(t, c, masterKeys, root, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -518,7 +519,7 @@ func TestSysRekey_Verification_Invalid(t *testing.T) {
|
|||||||
core, _, _, _ := TestCoreUnsealedWithConfigSealOpts(t,
|
core, _, _, _ := TestCoreUnsealedWithConfigSealOpts(t,
|
||||||
&SealConfig{StoredShares: 1, SecretShares: 1, SecretThreshold: 1},
|
&SealConfig{StoredShares: 1, SecretShares: 1, SecretThreshold: 1},
|
||||||
&SealConfig{StoredShares: 1, SecretShares: 1, SecretThreshold: 1},
|
&SealConfig{StoredShares: 1, SecretShares: 1, SecretThreshold: 1},
|
||||||
&TestSealOpts{StoredKeys: StoredKeysSupportedGeneric})
|
&seal.TestSealOpts{StoredKeys: seal.StoredKeysSupportedGeneric})
|
||||||
|
|
||||||
err := core.BarrierRekeyInit(&SealConfig{
|
err := core.BarrierRekeyInit(&SealConfig{
|
||||||
VerificationRequired: true,
|
VerificationRequired: true,
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import (
|
|||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
"github.com/hashicorp/vault/sdk/helper/jsonutil"
|
"github.com/hashicorp/vault/sdk/helper/jsonutil"
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
"github.com/hashicorp/vault/sdk/physical"
|
||||||
"github.com/hashicorp/vault/vault/seal"
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
@@ -49,35 +50,12 @@ const (
|
|||||||
RecoveryTypeShamir = "shamir"
|
RecoveryTypeShamir = "shamir"
|
||||||
)
|
)
|
||||||
|
|
||||||
type StoredKeysSupport int
|
|
||||||
|
|
||||||
const (
|
|
||||||
// The 0 value of StoredKeysSupport is an invalid option
|
|
||||||
StoredKeysInvalid StoredKeysSupport = iota
|
|
||||||
StoredKeysNotSupported
|
|
||||||
StoredKeysSupportedGeneric
|
|
||||||
StoredKeysSupportedShamirMaster
|
|
||||||
)
|
|
||||||
|
|
||||||
func (s StoredKeysSupport) String() string {
|
|
||||||
switch s {
|
|
||||||
case StoredKeysNotSupported:
|
|
||||||
return "Old-style Shamir"
|
|
||||||
case StoredKeysSupportedGeneric:
|
|
||||||
return "AutoUnseal"
|
|
||||||
case StoredKeysSupportedShamirMaster:
|
|
||||||
return "New-style Shamir"
|
|
||||||
default:
|
|
||||||
return "Invalid StoredKeys type"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type Seal interface {
|
type Seal interface {
|
||||||
SetCore(*Core)
|
SetCore(*Core)
|
||||||
Init(context.Context) error
|
Init(context.Context) error
|
||||||
Finalize(context.Context) error
|
Finalize(context.Context) error
|
||||||
|
|
||||||
StoredKeysSupported() StoredKeysSupport
|
StoredKeysSupported() seal.StoredKeysSupport
|
||||||
SealWrapable() bool
|
SealWrapable() bool
|
||||||
SetStoredKeys(context.Context, [][]byte) error
|
SetStoredKeys(context.Context, [][]byte) error
|
||||||
GetStoredKeys(context.Context) ([][]byte, error)
|
GetStoredKeys(context.Context) ([][]byte, error)
|
||||||
@@ -96,16 +74,16 @@ type Seal interface {
|
|||||||
SetRecoveryKey(context.Context, []byte) error
|
SetRecoveryKey(context.Context, []byte) error
|
||||||
VerifyRecoveryKey(context.Context, []byte) error
|
VerifyRecoveryKey(context.Context, []byte) error
|
||||||
|
|
||||||
GetAccess() seal.Access
|
GetAccess() *seal.Access
|
||||||
}
|
}
|
||||||
|
|
||||||
type defaultSeal struct {
|
type defaultSeal struct {
|
||||||
access seal.Access
|
access *seal.Access
|
||||||
config atomic.Value
|
config atomic.Value
|
||||||
core *Core
|
core *Core
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDefaultSeal(lowLevel seal.Access) Seal {
|
func NewDefaultSeal(lowLevel *seal.Access) Seal {
|
||||||
ret := &defaultSeal{
|
ret := &defaultSeal{
|
||||||
access: lowLevel,
|
access: lowLevel,
|
||||||
}
|
}
|
||||||
@@ -124,11 +102,11 @@ func (d *defaultSeal) checkCore() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *defaultSeal) GetAccess() seal.Access {
|
func (d *defaultSeal) GetAccess() *seal.Access {
|
||||||
return d.access
|
return d.access
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *defaultSeal) SetAccess(access seal.Access) {
|
func (d *defaultSeal) SetAccess(access *seal.Access) {
|
||||||
d.access = access
|
d.access = access
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,22 +123,22 @@ func (d *defaultSeal) Finalize(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *defaultSeal) BarrierType() string {
|
func (d *defaultSeal) BarrierType() string {
|
||||||
return seal.Shamir
|
return wrapping.Shamir
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *defaultSeal) StoredKeysSupported() StoredKeysSupport {
|
func (d *defaultSeal) StoredKeysSupported() seal.StoredKeysSupport {
|
||||||
isLegacy, err := d.LegacySeal()
|
isLegacy, err := d.LegacySeal()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if d.core != nil && d.core.logger != nil {
|
if d.core != nil && d.core.logger != nil {
|
||||||
d.core.logger.Error("no seal config found, can't determine if legacy or new-style shamir")
|
d.core.logger.Error("no seal config found, can't determine if legacy or new-style shamir")
|
||||||
}
|
}
|
||||||
return StoredKeysInvalid
|
return seal.StoredKeysInvalid
|
||||||
}
|
}
|
||||||
switch {
|
switch {
|
||||||
case isLegacy:
|
case isLegacy:
|
||||||
return StoredKeysNotSupported
|
return seal.StoredKeysNotSupported
|
||||||
default:
|
default:
|
||||||
return StoredKeysSupportedShamirMaster
|
return seal.StoredKeysSupportedShamirMaster
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -438,7 +416,7 @@ func (s *SealConfig) Clone() *SealConfig {
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeStoredKeys(ctx context.Context, storage physical.Backend, encryptor seal.Encryptor, keys [][]byte) error {
|
func writeStoredKeys(ctx context.Context, storage physical.Backend, encryptor *seal.Access, keys [][]byte) error {
|
||||||
if keys == nil {
|
if keys == nil {
|
||||||
return fmt.Errorf("keys were nil")
|
return fmt.Errorf("keys were nil")
|
||||||
}
|
}
|
||||||
@@ -452,7 +430,7 @@ func writeStoredKeys(ctx context.Context, storage physical.Backend, encryptor se
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encrypt and marshal the keys
|
// Encrypt and marshal the keys
|
||||||
blobInfo, err := encryptor.Encrypt(ctx, buf)
|
blobInfo, err := encryptor.Encrypt(ctx, buf, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errwrap.Wrapf("failed to encrypt keys for storage: {{err}}", err)
|
return errwrap.Wrapf("failed to encrypt keys for storage: {{err}}", err)
|
||||||
}
|
}
|
||||||
@@ -475,7 +453,7 @@ func writeStoredKeys(ctx context.Context, storage physical.Backend, encryptor se
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func readStoredKeys(ctx context.Context, storage physical.Backend, encryptor seal.Encryptor) ([][]byte, error) {
|
func readStoredKeys(ctx context.Context, storage physical.Backend, encryptor *seal.Access) ([][]byte, error) {
|
||||||
pe, err := storage.Get(ctx, StoredBarrierKeysPath)
|
pe, err := storage.Get(ctx, StoredBarrierKeysPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errwrap.Wrapf("failed to fetch stored keys: {{err}}", err)
|
return nil, errwrap.Wrapf("failed to fetch stored keys: {{err}}", err)
|
||||||
@@ -487,12 +465,12 @@ func readStoredKeys(ctx context.Context, storage physical.Backend, encryptor sea
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
blobInfo := &physical.EncryptedBlobInfo{}
|
blobInfo := &wrapping.EncryptedBlobInfo{}
|
||||||
if err := proto.Unmarshal(pe.Value, blobInfo); err != nil {
|
if err := proto.Unmarshal(pe.Value, blobInfo); err != nil {
|
||||||
return nil, errwrap.Wrapf("failed to proto decode stored keys: {{err}}", err)
|
return nil, errwrap.Wrapf("failed to proto decode stored keys: {{err}}", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
pt, err := encryptor.Decrypt(ctx, blobInfo)
|
pt, err := encryptor.Decrypt(ctx, blobInfo, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errwrap.Wrapf("failed to decrypt encrypted stored keys: {{err}}", err)
|
return nil, errwrap.Wrapf("failed to decrypt encrypted stored keys: {{err}}", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,48 +0,0 @@
|
|||||||
package alicloudkms
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"os"
|
|
||||||
"reflect"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
log "github.com/hashicorp/go-hclog"
|
|
||||||
"github.com/hashicorp/vault/sdk/helper/logging"
|
|
||||||
)
|
|
||||||
|
|
||||||
// This test executes real calls. The calls themselves should be free,
|
|
||||||
// but the KMS key used is generally not free. Alibaba doesn't publish
|
|
||||||
// the price but it can be assumed to be around $1/month because that's
|
|
||||||
// what AWS charges for the same.
|
|
||||||
//
|
|
||||||
// To run this test, the following env variables need to be set:
|
|
||||||
// - VAULT_ALICLOUDKMS_SEAL_KEY_ID
|
|
||||||
// - ALICLOUD_REGION
|
|
||||||
// - ALICLOUD_ACCESS_KEY
|
|
||||||
// - ALICLOUD_SECRET_KEY
|
|
||||||
func TestAccAliCloudKMSSeal_Lifecycle(t *testing.T) {
|
|
||||||
if os.Getenv("VAULT_ACC") == "" {
|
|
||||||
t.SkipNow()
|
|
||||||
}
|
|
||||||
|
|
||||||
s := NewSeal(logging.NewVaultLogger(log.Trace))
|
|
||||||
_, err := s.SetConfig(nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err : %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
input := []byte("foo")
|
|
||||||
swi, err := s.Encrypt(context.Background(), input)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
pt, err := s.Decrypt(context.Background(), swi)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if !reflect.DeepEqual(input, pt) {
|
|
||||||
t.Fatalf("expected %s, got %s", input, pt)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,123 +0,0 @@
|
|||||||
package alicloudkms
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/base64"
|
|
||||||
"errors"
|
|
||||||
"os"
|
|
||||||
"reflect"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/aliyun/alibaba-cloud-sdk-go/services/kms"
|
|
||||||
log "github.com/hashicorp/go-hclog"
|
|
||||||
"github.com/hashicorp/vault/sdk/helper/logging"
|
|
||||||
)
|
|
||||||
|
|
||||||
const aliCloudTestKeyID = "foo"
|
|
||||||
|
|
||||||
func TestAliCloudKMSSeal(t *testing.T) {
|
|
||||||
s := NewSeal(logging.NewVaultLogger(log.Trace))
|
|
||||||
s.client = &mockAliCloudKMSSealClient{
|
|
||||||
keyID: aliCloudTestKeyID,
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := s.SetConfig(nil); err == nil {
|
|
||||||
t.Fatal("expected error when AliCloudKMSSeal key ID is not provided")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the key
|
|
||||||
if err := os.Setenv(EnvAliCloudKMSSealKeyID, aliCloudTestKeyID); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
if err := os.Unsetenv(EnvAliCloudKMSSealKeyID); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if _, err := s.SetConfig(nil); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAliCloudKMSSeal_Lifecycle(t *testing.T) {
|
|
||||||
s := NewSeal(logging.NewVaultLogger(log.Trace))
|
|
||||||
s.client = &mockAliCloudKMSSealClient{
|
|
||||||
keyID: aliCloudTestKeyID,
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := os.Setenv(EnvAliCloudKMSSealKeyID, aliCloudTestKeyID); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
if err := os.Unsetenv(EnvAliCloudKMSSealKeyID); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if _, err := s.SetConfig(nil); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test Encrypt and Decrypt calls
|
|
||||||
input := []byte("foo")
|
|
||||||
swi, err := s.Encrypt(context.Background(), input)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
pt, err := s.Decrypt(context.Background(), swi)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if !reflect.DeepEqual(input, pt) {
|
|
||||||
t.Fatalf("expected %s, got %s", input, pt)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type mockAliCloudKMSSealClient struct {
|
|
||||||
keyID string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Encrypt is a mocked call that returns a base64 encoded string.
|
|
||||||
func (m *mockAliCloudKMSSealClient) Encrypt(request *kms.EncryptRequest) (response *kms.EncryptResponse, err error) {
|
|
||||||
m.keyID = request.KeyId
|
|
||||||
|
|
||||||
encoded := make([]byte, base64.StdEncoding.EncodedLen(len(request.Plaintext)))
|
|
||||||
base64.StdEncoding.Encode(encoded, []byte(request.Plaintext))
|
|
||||||
|
|
||||||
output := kms.CreateEncryptResponse()
|
|
||||||
output.CiphertextBlob = string(encoded)
|
|
||||||
output.KeyId = request.KeyId
|
|
||||||
return output, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decrypt is a mocked call that returns a decoded base64 string.
|
|
||||||
func (m *mockAliCloudKMSSealClient) Decrypt(request *kms.DecryptRequest) (response *kms.DecryptResponse, err error) {
|
|
||||||
decLen := base64.StdEncoding.DecodedLen(len(request.CiphertextBlob))
|
|
||||||
decoded := make([]byte, decLen)
|
|
||||||
len, err := base64.StdEncoding.Decode(decoded, []byte(request.CiphertextBlob))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if len < decLen {
|
|
||||||
decoded = decoded[:len]
|
|
||||||
}
|
|
||||||
|
|
||||||
output := kms.CreateDecryptResponse()
|
|
||||||
output.KeyId = m.keyID
|
|
||||||
output.Plaintext = string(decoded)
|
|
||||||
return output, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DescribeKey is a mocked call that returns the keyID.
|
|
||||||
func (m *mockAliCloudKMSSealClient) DescribeKey(request *kms.DescribeKeyRequest) (response *kms.DescribeKeyResponse, err error) {
|
|
||||||
if m.keyID == "" {
|
|
||||||
return nil, errors.New("key not found")
|
|
||||||
}
|
|
||||||
output := kms.CreateDescribeKeyResponse()
|
|
||||||
output.KeyMetadata = kms.KeyMetadata{
|
|
||||||
KeyId: m.keyID,
|
|
||||||
}
|
|
||||||
return output, nil
|
|
||||||
}
|
|
||||||
@@ -1,181 +0,0 @@
|
|||||||
package awskms
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"os"
|
|
||||||
"reflect"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
|
||||||
log "github.com/hashicorp/go-hclog"
|
|
||||||
"github.com/hashicorp/vault/sdk/helper/logging"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestAWSKMSSeal(t *testing.T) {
|
|
||||||
s := NewSeal(logging.NewVaultLogger(log.Trace))
|
|
||||||
s.client = &mockAWSKMSSealClient{
|
|
||||||
keyID: aws.String(awsTestKeyID),
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := s.SetConfig(nil)
|
|
||||||
if err == nil {
|
|
||||||
t.Fatal("expected error when AWSKMSSeal key ID is not provided")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the key
|
|
||||||
oldKeyID := os.Getenv(EnvAWSKMSSealKeyID)
|
|
||||||
os.Setenv(EnvAWSKMSSealKeyID, awsTestKeyID)
|
|
||||||
defer os.Setenv(EnvAWSKMSSealKeyID, oldKeyID)
|
|
||||||
_, err = s.SetConfig(nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAWSKMSSeal_Lifecycle(t *testing.T) {
|
|
||||||
if os.Getenv(EnvAWSKMSSealKeyID) == "" {
|
|
||||||
t.SkipNow()
|
|
||||||
}
|
|
||||||
s := NewSeal(logging.NewVaultLogger(log.Trace))
|
|
||||||
s.client = &mockAWSKMSSealClient{
|
|
||||||
keyID: aws.String(awsTestKeyID),
|
|
||||||
}
|
|
||||||
oldKeyID := os.Getenv(EnvAWSKMSSealKeyID)
|
|
||||||
os.Setenv(EnvAWSKMSSealKeyID, awsTestKeyID)
|
|
||||||
defer os.Setenv(EnvAWSKMSSealKeyID, oldKeyID)
|
|
||||||
testEncryptionRoundTrip(t, s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// This test executes real calls. The calls themselves should be free,
|
|
||||||
// but the KMS key used is generally not free. AWS charges about $1/month
|
|
||||||
// per key.
|
|
||||||
//
|
|
||||||
// To run this test, the following env variables need to be set:
|
|
||||||
// - VAULT_AWSKMS_SEAL_KEY_ID
|
|
||||||
// - AWS_REGION
|
|
||||||
// - AWS_ACCESS_KEY_ID
|
|
||||||
// - AWS_SECRET_ACCESS_KEY
|
|
||||||
func TestAccAWSKMSSeal_Lifecycle(t *testing.T) {
|
|
||||||
if os.Getenv(EnvAWSKMSSealKeyID) == "" {
|
|
||||||
t.SkipNow()
|
|
||||||
}
|
|
||||||
s := NewSeal(logging.NewVaultLogger(log.Trace))
|
|
||||||
testEncryptionRoundTrip(t, s)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testEncryptionRoundTrip(t *testing.T, seal *AWSKMSSeal) {
|
|
||||||
seal.SetConfig(nil)
|
|
||||||
input := []byte("foo")
|
|
||||||
swi, err := seal.Encrypt(context.Background(), input)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
pt, err := seal.Decrypt(context.Background(), swi)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if !reflect.DeepEqual(input, pt) {
|
|
||||||
t.Fatalf("expected %s, got %s", input, pt)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAWSKMSSeal_custom_endpoint(t *testing.T) {
|
|
||||||
customEndpoint := "https://custom.endpoint"
|
|
||||||
customEndpoint2 := "https://custom.endpoint.2"
|
|
||||||
endpointENV := "AWS_KMS_ENDPOINT"
|
|
||||||
|
|
||||||
// unset at end of test
|
|
||||||
os.Setenv(EnvAWSKMSSealKeyID, awsTestKeyID)
|
|
||||||
defer func() {
|
|
||||||
if err := os.Unsetenv(EnvAWSKMSSealKeyID); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
cfg := make(map[string]string)
|
|
||||||
cfg["endpoint"] = customEndpoint
|
|
||||||
|
|
||||||
testCases := []struct {
|
|
||||||
Title string
|
|
||||||
Env string
|
|
||||||
Config map[string]string
|
|
||||||
Expected *string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
// Default will have nil for the config endpoint, and be looked up
|
|
||||||
// dynamically by the SDK
|
|
||||||
Title: "Default",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Title: "Environment",
|
|
||||||
Env: customEndpoint,
|
|
||||||
Expected: aws.String(customEndpoint),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Title: "Config",
|
|
||||||
Config: cfg,
|
|
||||||
Expected: aws.String(customEndpoint),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
// Expect environment to take precedence over configuration
|
|
||||||
Title: "Env-Config",
|
|
||||||
Env: customEndpoint2,
|
|
||||||
Config: cfg,
|
|
||||||
Expected: aws.String(customEndpoint2),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range testCases {
|
|
||||||
t.Run(tc.Title, func(t *testing.T) {
|
|
||||||
s := NewSeal(logging.NewVaultLogger(log.Trace))
|
|
||||||
|
|
||||||
s.client = &mockAWSKMSSealClient{
|
|
||||||
keyID: aws.String(awsTestKeyID),
|
|
||||||
}
|
|
||||||
|
|
||||||
if tc.Env != "" {
|
|
||||||
if err := os.Setenv(endpointENV, tc.Env); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// cfg starts as nil, and takes a test case value if given. If not,
|
|
||||||
// SetConfig is called with nil and creates it's own config
|
|
||||||
var cfg map[string]string
|
|
||||||
if tc.Config != nil {
|
|
||||||
cfg = tc.Config
|
|
||||||
}
|
|
||||||
if _, err := s.SetConfig(cfg); err != nil {
|
|
||||||
t.Fatalf("error setting config: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// call getAWSKMSClient() to get the configured client and verify it's
|
|
||||||
// endpoint
|
|
||||||
k, err := s.getAWSKMSClient()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if tc.Expected == nil && k.Config.Endpoint != nil {
|
|
||||||
t.Fatalf("Expected nil endpoint, got: (%s)", *k.Config.Endpoint)
|
|
||||||
}
|
|
||||||
|
|
||||||
if tc.Expected != nil {
|
|
||||||
if k.Config.Endpoint == nil {
|
|
||||||
t.Fatal("expected custom endpoint, but config was nil")
|
|
||||||
}
|
|
||||||
if *k.Config.Endpoint != *tc.Expected {
|
|
||||||
t.Fatalf("expected custom endpoint (%s), got: (%s)", *tc.Expected, *k.Config.Endpoint)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// clear endpoint env after each test
|
|
||||||
if err := os.Unsetenv(endpointENV); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
package azurekeyvault
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"os"
|
|
||||||
"reflect"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
log "github.com/hashicorp/go-hclog"
|
|
||||||
"github.com/hashicorp/vault/sdk/helper/logging"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestAzureKeyVault_SetConfig(t *testing.T) {
|
|
||||||
if os.Getenv("VAULT_ACC") == "" {
|
|
||||||
t.SkipNow()
|
|
||||||
}
|
|
||||||
|
|
||||||
seal := NewSeal(logging.NewVaultLogger(log.Trace))
|
|
||||||
|
|
||||||
tenantID := os.Getenv("AZURE_TENANT_ID")
|
|
||||||
os.Unsetenv("AZURE_TENANT_ID")
|
|
||||||
|
|
||||||
// Attempt to set config, expect failure due to missing config
|
|
||||||
_, err := seal.SetConfig(nil)
|
|
||||||
if err == nil {
|
|
||||||
t.Fatal("expected error when Azure Key Vault config values are not provided")
|
|
||||||
}
|
|
||||||
|
|
||||||
os.Setenv("AZURE_TENANT_ID", tenantID)
|
|
||||||
|
|
||||||
_, err = seal.SetConfig(nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAzureKeyVault_Lifecycle(t *testing.T) {
|
|
||||||
if os.Getenv("VAULT_ACC") == "" {
|
|
||||||
t.SkipNow()
|
|
||||||
}
|
|
||||||
|
|
||||||
s := NewSeal(logging.NewVaultLogger(log.Trace))
|
|
||||||
_, err := s.SetConfig(nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test Encrypt and Decrypt calls
|
|
||||||
input := []byte("foo")
|
|
||||||
swi, err := s.Encrypt(context.Background(), input)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
pt, err := s.Decrypt(context.Background(), swi)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if !reflect.DeepEqual(input, pt) {
|
|
||||||
t.Fatalf("expected %s, got %s", input, pt)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,72 +1,36 @@
|
|||||||
package seal
|
package seal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/aes"
|
"sync"
|
||||||
"crypto/cipher"
|
|
||||||
"errors"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
metrics "github.com/armon/go-metrics"
|
metrics "github.com/armon/go-metrics"
|
||||||
"github.com/hashicorp/errwrap"
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
uuid "github.com/hashicorp/go-uuid"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Envelope struct{}
|
type Envelope struct {
|
||||||
|
envelope *wrapping.Envelope
|
||||||
type EnvelopeInfo struct {
|
once sync.Once
|
||||||
Ciphertext []byte
|
|
||||||
Key []byte
|
|
||||||
IV []byte
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewEnvelope() *Envelope {
|
func NewEnvelope() *Envelope {
|
||||||
return &Envelope{}
|
return &Envelope{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Envelope) Encrypt(plaintext []byte) (*EnvelopeInfo, error) {
|
func (e *Envelope) init() {
|
||||||
|
e.envelope = new(wrapping.Envelope)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Envelope) Encrypt(plaintext, aad []byte) (*wrapping.EnvelopeInfo, error) {
|
||||||
defer metrics.MeasureSince([]string{"seal", "envelope", "encrypt"}, time.Now())
|
defer metrics.MeasureSince([]string{"seal", "envelope", "encrypt"}, time.Now())
|
||||||
|
e.once.Do(e.init)
|
||||||
|
|
||||||
// Generate DEK
|
return e.envelope.Encrypt(plaintext, aad)
|
||||||
key, err := uuid.GenerateRandomBytes(32)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
iv, err := uuid.GenerateRandomBytes(12)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
aead, err := e.aeadEncrypter(key)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &EnvelopeInfo{
|
|
||||||
Ciphertext: aead.Seal(nil, iv, plaintext, nil),
|
|
||||||
Key: key,
|
|
||||||
IV: iv,
|
|
||||||
}, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Envelope) Decrypt(data *EnvelopeInfo) ([]byte, error) {
|
func (e *Envelope) Decrypt(data *wrapping.EnvelopeInfo, aad []byte) ([]byte, error) {
|
||||||
defer metrics.MeasureSince([]string{"seal", "envelope", "decrypt"}, time.Now())
|
defer metrics.MeasureSince([]string{"seal", "envelope", "decrypt"}, time.Now())
|
||||||
|
e.once.Do(e.init)
|
||||||
|
|
||||||
aead, err := e.aeadEncrypter(data.Key)
|
return e.envelope.Decrypt(data, aad)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return aead.Open(nil, data.IV, data.Ciphertext, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *Envelope) aeadEncrypter(key []byte) (cipher.AEAD, error) {
|
|
||||||
aesCipher, err := aes.NewCipher(key)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errwrap.Wrapf("failed to create cipher: {{err}}", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the GCM mode AEAD
|
|
||||||
gcm, err := cipher.NewGCM(aesCipher)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.New("failed to initialize GCM mode")
|
|
||||||
}
|
|
||||||
|
|
||||||
return gcm, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,12 +7,12 @@ import (
|
|||||||
|
|
||||||
func TestEnvelope(t *testing.T) {
|
func TestEnvelope(t *testing.T) {
|
||||||
input := []byte("test")
|
input := []byte("test")
|
||||||
env, err := NewEnvelope().Encrypt(input)
|
env, err := NewEnvelope().Encrypt(input, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
output, err := NewEnvelope().Decrypt(env)
|
output, err := NewEnvelope().Decrypt(env, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,105 +0,0 @@
|
|||||||
package gcpckms
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"reflect"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
log "github.com/hashicorp/go-hclog"
|
|
||||||
"github.com/hashicorp/vault/sdk/helper/logging"
|
|
||||||
context "golang.org/x/net/context"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// These values need to match the values from the hc-value-testing project
|
|
||||||
gcpckmsTestProjectID = "hc-vault-testing"
|
|
||||||
gcpckmsTestLocationID = "global"
|
|
||||||
gcpckmsTestKeyRing = "vault-test-keyring"
|
|
||||||
gcpckmsTestCryptoKey = "vault-test-key"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestGCPCKMSSeal(t *testing.T) {
|
|
||||||
// Do an error check before env vars are set
|
|
||||||
s := NewSeal(logging.NewVaultLogger(log.Trace))
|
|
||||||
_, err := s.SetConfig(nil)
|
|
||||||
if err == nil {
|
|
||||||
t.Fatal("expected error when GCPCKMSSeal required values are not provided")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now test for cases where CKMS values are provided
|
|
||||||
checkAndSetEnvVars(t)
|
|
||||||
|
|
||||||
configCases := map[string]map[string]string{
|
|
||||||
"env_var": nil,
|
|
||||||
"config": map[string]string{
|
|
||||||
"credentials": os.Getenv("GOOGLE_APPLICATION_CREDENTIALS"),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for name, config := range configCases {
|
|
||||||
t.Run(name, func(t *testing.T) {
|
|
||||||
s := NewSeal(logging.NewVaultLogger(log.Trace))
|
|
||||||
_, err := s.SetConfig(config)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("error setting seal config: %v", err)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGCPCKMSSeal_Lifecycle(t *testing.T) {
|
|
||||||
checkAndSetEnvVars(t)
|
|
||||||
|
|
||||||
s := NewSeal(logging.NewVaultLogger(log.Trace))
|
|
||||||
_, err := s.SetConfig(nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("error setting seal config: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test Encrypt and Decrypt calls
|
|
||||||
input := []byte("foo")
|
|
||||||
swi, err := s.Encrypt(context.Background(), input)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
pt, err := s.Decrypt(context.Background(), swi)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if !reflect.DeepEqual(input, pt) {
|
|
||||||
t.Fatalf("expected %s, got %s", input, pt)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// checkAndSetEnvVars check and sets the required env vars. It will skip tests that are
|
|
||||||
// not ran as acceptance tests since they require calling to external APIs.
|
|
||||||
func checkAndSetEnvVars(t *testing.T) {
|
|
||||||
t.Helper()
|
|
||||||
|
|
||||||
// Skip tests if we are not running acceptance tests
|
|
||||||
if os.Getenv("VAULT_ACC") == "" {
|
|
||||||
t.SkipNow()
|
|
||||||
}
|
|
||||||
|
|
||||||
if os.Getenv("GOOGLE_APPLICATION_CREDENTIALS") == "" && os.Getenv(EnvGCPCKMSSealCredsPath) == "" {
|
|
||||||
t.Fatal("unable to get GCP credentials via environment variables")
|
|
||||||
}
|
|
||||||
|
|
||||||
if os.Getenv(EnvGCPCKMSSealProject) == "" {
|
|
||||||
os.Setenv(EnvGCPCKMSSealProject, gcpckmsTestProjectID)
|
|
||||||
}
|
|
||||||
|
|
||||||
if os.Getenv(EnvGCPCKMSSealLocation) == "" {
|
|
||||||
os.Setenv(EnvGCPCKMSSealLocation, gcpckmsTestLocationID)
|
|
||||||
}
|
|
||||||
|
|
||||||
if os.Getenv(EnvGCPCKMSSealKeyRing) == "" {
|
|
||||||
os.Setenv(EnvGCPCKMSSealKeyRing, gcpckmsTestKeyRing)
|
|
||||||
}
|
|
||||||
|
|
||||||
if os.Getenv(EnvGCPCKMSSealCryptoKey) == "" {
|
|
||||||
os.Setenv(EnvGCPCKMSSealCryptoKey, gcpckmsTestCryptoKey)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
// Copyright © 2019, Oracle and/or its affiliates.
|
|
||||||
package ocikms
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"reflect"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
log "github.com/hashicorp/go-hclog"
|
|
||||||
"github.com/hashicorp/vault/sdk/helper/logging"
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* To run these tests, ensure you setup:
|
|
||||||
* 1. OCI SDK with your credentials. Refer to here:
|
|
||||||
* https://docs.cloud.oracle.com/iaas/Content/API/Concepts/sdkconfig.htm
|
|
||||||
* 2. Go to ocikms folder: vault/vault/seal/ocikms
|
|
||||||
* VAULT_OCIKMS_SEAL_KEY_ID="your-kms-key" VAULT_OCIKMS_CRYPTO_ENDPOINT="your-kms-crypto-endpoint" go test
|
|
||||||
*/
|
|
||||||
|
|
||||||
func TestOCIKMSSeal(t *testing.T) {
|
|
||||||
initSeal(t)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestOCIKMSSeal_LifeCycle(t *testing.T) {
|
|
||||||
s := initSeal(t)
|
|
||||||
|
|
||||||
// Test Encrypt and Decrypt calls
|
|
||||||
input := []byte("foo")
|
|
||||||
swi, err := s.Encrypt(context.Background(), input)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
pt, err := s.Decrypt(context.Background(), swi)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if !reflect.DeepEqual(input, pt) {
|
|
||||||
t.Fatalf("expected %s, got %s", input, pt)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func initSeal(t *testing.T) *OCIKMSSeal {
|
|
||||||
// Skip tests if we are not running acceptance tests
|
|
||||||
if os.Getenv("VAULT_ACC") == "" {
|
|
||||||
t.SkipNow()
|
|
||||||
}
|
|
||||||
s := NewSeal(logging.NewVaultLogger(log.Trace))
|
|
||||||
_, err := s.SetConfig(nil)
|
|
||||||
if err == nil {
|
|
||||||
t.Fatal("expected error when OCIKMSSeal required values are not provided")
|
|
||||||
}
|
|
||||||
|
|
||||||
mockConfig := map[string]string{
|
|
||||||
|
|
||||||
"auth_type_api_key": "true",
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = s.SetConfig(mockConfig)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("error setting seal config: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
@@ -2,39 +2,83 @@ package seal
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
metrics "github.com/armon/go-metrics"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type StoredKeysSupport int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Shamir = "shamir"
|
// The 0 value of StoredKeysSupport is an invalid option
|
||||||
PKCS11 = "pkcs11"
|
StoredKeysInvalid StoredKeysSupport = iota
|
||||||
AliCloudKMS = "alicloudkms"
|
StoredKeysNotSupported
|
||||||
AWSKMS = "awskms"
|
StoredKeysSupportedGeneric
|
||||||
GCPCKMS = "gcpckms"
|
StoredKeysSupportedShamirMaster
|
||||||
AzureKeyVault = "azurekeyvault"
|
|
||||||
OCIKMS = "ocikms"
|
|
||||||
Transit = "transit"
|
|
||||||
Test = "test-auto"
|
|
||||||
|
|
||||||
// HSMAutoDeprecated is a deprecated seal type prior to 0.9.0.
|
|
||||||
// It is still referenced in certain code paths for upgrade purporses
|
|
||||||
HSMAutoDeprecated = "hsm-auto"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Encryptor interface {
|
func (s StoredKeysSupport) String() string {
|
||||||
Encrypt(context.Context, []byte) (*physical.EncryptedBlobInfo, error)
|
switch s {
|
||||||
Decrypt(context.Context, *physical.EncryptedBlobInfo) ([]byte, error)
|
case StoredKeysNotSupported:
|
||||||
|
return "Old-style Shamir"
|
||||||
|
case StoredKeysSupportedGeneric:
|
||||||
|
return "AutoUnseal"
|
||||||
|
case StoredKeysSupportedShamirMaster:
|
||||||
|
return "New-style Shamir"
|
||||||
|
default:
|
||||||
|
return "Invalid StoredKeys type"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Access is the embedded implementation of autoSeal that contains logic
|
// Access is the embedded implementation of autoSeal that contains logic
|
||||||
// specific to encrypting and decrypting data, or in this case keys.
|
// specific to encrypting and decrypting data, or in this case keys.
|
||||||
type Access interface {
|
type Access struct {
|
||||||
SealType() string
|
wrapping.Wrapper
|
||||||
KeyID() string
|
OverriddenType string
|
||||||
|
}
|
||||||
Init(context.Context) error
|
|
||||||
Finalize(context.Context) error
|
func (a *Access) SetType(t string) {
|
||||||
|
a.OverriddenType = t
|
||||||
Encryptor
|
}
|
||||||
|
|
||||||
|
func (a *Access) Type() string {
|
||||||
|
if a.OverriddenType != "" {
|
||||||
|
return a.OverriddenType
|
||||||
|
}
|
||||||
|
return a.Wrapper.Type()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *Access) Encrypt(ctx context.Context, plaintext, aad []byte) (blob *wrapping.EncryptedBlobInfo, err error) {
|
||||||
|
defer func(now time.Time) {
|
||||||
|
metrics.MeasureSince([]string{"seal", "encrypt", "time"}, now)
|
||||||
|
metrics.MeasureSince([]string{"seal", a.Wrapper.Type(), "encrypt", "time"}, now)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
metrics.IncrCounter([]string{"seal", "encrypt", "error"}, 1)
|
||||||
|
metrics.IncrCounter([]string{"seal", a.Wrapper.Type(), "encrypt", "error"}, 1)
|
||||||
|
}
|
||||||
|
}(time.Now())
|
||||||
|
|
||||||
|
metrics.IncrCounter([]string{"seal", "encrypt"}, 1)
|
||||||
|
metrics.IncrCounter([]string{"seal", a.Wrapper.Type(), "encrypt"}, 1)
|
||||||
|
|
||||||
|
return a.Wrapper.Encrypt(ctx, plaintext, aad)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *Access) Decrypt(ctx context.Context, data *wrapping.EncryptedBlobInfo, aad []byte) (pt []byte, err error) {
|
||||||
|
defer func(now time.Time) {
|
||||||
|
metrics.MeasureSince([]string{"seal", "decrypt", "time"}, now)
|
||||||
|
metrics.MeasureSince([]string{"seal", a.Wrapper.Type(), "decrypt", "time"}, now)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
metrics.IncrCounter([]string{"seal", "decrypt", "error"}, 1)
|
||||||
|
metrics.IncrCounter([]string{"seal", a.Wrapper.Type(), "decrypt", "error"}, 1)
|
||||||
|
}
|
||||||
|
}(time.Now())
|
||||||
|
|
||||||
|
metrics.IncrCounter([]string{"seal", "decrypt"}, 1)
|
||||||
|
metrics.IncrCounter([]string{"seal", a.Wrapper.Type(), "decrypt"}, 1)
|
||||||
|
|
||||||
|
return a.Wrapper.Decrypt(ctx, data, aad)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,89 +1,24 @@
|
|||||||
package seal
|
package seal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"github.com/hashicorp/go-hclog"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
"github.com/hashicorp/vault/helper/xor"
|
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type TestSeal struct {
|
type TestSealOpts struct {
|
||||||
Type string
|
Logger hclog.Logger
|
||||||
secret []byte
|
StoredKeys StoredKeysSupport
|
||||||
keyId string
|
Secret []byte
|
||||||
|
Name string
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ Access = (*TestSeal)(nil)
|
func NewTestSeal(opts *TestSealOpts) *Access {
|
||||||
|
if opts == nil {
|
||||||
func NewTestSeal(secret []byte) *TestSeal {
|
opts = new(TestSealOpts)
|
||||||
return &TestSeal{
|
|
||||||
Type: Test,
|
|
||||||
secret: secret,
|
|
||||||
keyId: "static-key",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TestSeal) Init(_ context.Context) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *TestSeal) Finalize(_ context.Context) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *TestSeal) SealType() string {
|
|
||||||
return t.Type
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *TestSeal) KeyID() string {
|
|
||||||
return t.keyId
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *TestSeal) SetKeyID(k string) {
|
|
||||||
t.keyId = k
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *TestSeal) Encrypt(_ context.Context, plaintext []byte) (*physical.EncryptedBlobInfo, error) {
|
|
||||||
ct, err := t.obscureBytes(plaintext)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return &physical.EncryptedBlobInfo{
|
return &Access{
|
||||||
Ciphertext: ct,
|
Wrapper: wrapping.NewTestWrapper(opts.Secret),
|
||||||
KeyInfo: &physical.SealKeyInfo{
|
OverriddenType: opts.Name,
|
||||||
KeyID: t.KeyID(),
|
|
||||||
},
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *TestSeal) Decrypt(_ context.Context, dwi *physical.EncryptedBlobInfo) ([]byte, error) {
|
|
||||||
return t.obscureBytes(dwi.Ciphertext)
|
|
||||||
}
|
|
||||||
|
|
||||||
// obscureBytes is a helper to simulate "encryption/decryption"
|
|
||||||
// on protected values.
|
|
||||||
func (t *TestSeal) obscureBytes(in []byte) ([]byte, error) {
|
|
||||||
out := make([]byte, len(in))
|
|
||||||
|
|
||||||
if len(t.secret) != 0 {
|
|
||||||
// make sure they are the same length
|
|
||||||
localSecret := make([]byte, len(in))
|
|
||||||
copy(localSecret, t.secret)
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
out, err = xor.XORBytes(in, localSecret)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
|
||||||
// if there is no secret, simply reverse the string
|
|
||||||
for i := 0; i < len(in); i++ {
|
|
||||||
out[i] = in[len(in)-1-i]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return out, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,114 +0,0 @@
|
|||||||
package shamir
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"crypto/aes"
|
|
||||||
"crypto/cipher"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
log "github.com/hashicorp/go-hclog"
|
|
||||||
"github.com/hashicorp/go-uuid"
|
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
|
||||||
"github.com/hashicorp/vault/vault/seal"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ShamirSeal implements the seal.Access interface for Shamir unseal
|
|
||||||
type ShamirSeal struct {
|
|
||||||
logger log.Logger
|
|
||||||
key []byte
|
|
||||||
aead cipher.AEAD
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure that we are implementing AutoSealAccess
|
|
||||||
var _ seal.Access = (*ShamirSeal)(nil)
|
|
||||||
|
|
||||||
// NewSeal creates a new ShamirSeal with the provided logger
|
|
||||||
func NewSeal(logger log.Logger) *ShamirSeal {
|
|
||||||
seal := &ShamirSeal{
|
|
||||||
logger: logger,
|
|
||||||
}
|
|
||||||
return seal
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *ShamirSeal) GetKey() []byte {
|
|
||||||
return s.key
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *ShamirSeal) SetKey(key []byte) error {
|
|
||||||
aesCipher, err := aes.NewCipher(key)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
aead, err := cipher.NewGCM(aesCipher)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
s.key = key
|
|
||||||
s.aead = aead
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Init is called during core.Initialize. No-op at the moment.
|
|
||||||
func (s *ShamirSeal) Init(_ context.Context) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finalize is called during shutdown. This is a no-op since
|
|
||||||
// ShamirSeal doesn't require any cleanup.
|
|
||||||
func (s *ShamirSeal) Finalize(_ context.Context) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SealType returns the seal type for this particular seal implementation.
|
|
||||||
func (s *ShamirSeal) SealType() string {
|
|
||||||
return seal.Shamir
|
|
||||||
}
|
|
||||||
|
|
||||||
// KeyID returns the last known key id.
|
|
||||||
func (s *ShamirSeal) KeyID() string {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// Encrypt is used to encrypt the plaintext using the aead held by the seal.
|
|
||||||
func (s *ShamirSeal) Encrypt(_ context.Context, plaintext []byte) (*physical.EncryptedBlobInfo, error) {
|
|
||||||
if plaintext == nil {
|
|
||||||
return nil, fmt.Errorf("given plaintext for encryption is nil")
|
|
||||||
}
|
|
||||||
|
|
||||||
if s.aead == nil {
|
|
||||||
return nil, errors.New("aead is not configured in the seal")
|
|
||||||
}
|
|
||||||
|
|
||||||
iv, err := uuid.GenerateRandomBytes(12)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
ciphertext := s.aead.Seal(nil, iv, plaintext, nil)
|
|
||||||
|
|
||||||
return &physical.EncryptedBlobInfo{
|
|
||||||
Ciphertext: append(iv, ciphertext...),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *ShamirSeal) Decrypt(_ context.Context, in *physical.EncryptedBlobInfo) ([]byte, error) {
|
|
||||||
if in == nil {
|
|
||||||
return nil, fmt.Errorf("given plaintext for encryption is nil")
|
|
||||||
}
|
|
||||||
|
|
||||||
if s.aead == nil {
|
|
||||||
return nil, errors.New("aead is not configured in the seal")
|
|
||||||
}
|
|
||||||
|
|
||||||
iv, ciphertext := in.Ciphertext[:12], in.Ciphertext[12:]
|
|
||||||
|
|
||||||
plaintext, err := s.aead.Open(nil, iv, ciphertext, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return plaintext, nil
|
|
||||||
}
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
package transit
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"strings"
|
|
||||||
"sync/atomic"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/armon/go-metrics"
|
|
||||||
|
|
||||||
log "github.com/hashicorp/go-hclog"
|
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
|
||||||
"github.com/hashicorp/vault/vault/seal"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Seal is a seal that leverages Vault's Transit secret
|
|
||||||
// engine
|
|
||||||
type Seal struct {
|
|
||||||
logger log.Logger
|
|
||||||
client transitClientEncryptor
|
|
||||||
currentKeyID *atomic.Value
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ seal.Access = (*Seal)(nil)
|
|
||||||
|
|
||||||
// NewSeal creates a new transit seal
|
|
||||||
func NewSeal(logger log.Logger) *Seal {
|
|
||||||
s := &Seal{
|
|
||||||
logger: logger.ResetNamed("seal-transit"),
|
|
||||||
currentKeyID: new(atomic.Value),
|
|
||||||
}
|
|
||||||
s.currentKeyID.Store("")
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetConfig processes the config info from the server config
|
|
||||||
func (s *Seal) SetConfig(config map[string]string) (map[string]string, error) {
|
|
||||||
client, sealInfo, err := newTransitClient(s.logger, config)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
s.client = client
|
|
||||||
|
|
||||||
// Send a value to test the seal and to set the current key id
|
|
||||||
if _, err := s.Encrypt(context.Background(), []byte("a")); err != nil {
|
|
||||||
client.Close()
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return sealInfo, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Init is called during core.Initialize
|
|
||||||
func (s *Seal) Init(_ context.Context) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finalize is called during shutdown
|
|
||||||
func (s *Seal) Finalize(_ context.Context) error {
|
|
||||||
s.client.Close()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SealType returns the seal type for this particular seal implementation.
|
|
||||||
func (s *Seal) SealType() string {
|
|
||||||
return seal.Transit
|
|
||||||
}
|
|
||||||
|
|
||||||
// KeyID returns the last known key id.
|
|
||||||
func (s *Seal) KeyID() string {
|
|
||||||
return s.currentKeyID.Load().(string)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Encrypt is used to encrypt using Vaults Transit engine
|
|
||||||
func (s *Seal) Encrypt(_ context.Context, plaintext []byte) (blob *physical.EncryptedBlobInfo, err error) {
|
|
||||||
defer func(now time.Time) {
|
|
||||||
metrics.MeasureSince([]string{"seal", "encrypt", "time"}, now)
|
|
||||||
metrics.MeasureSince([]string{"seal", "transit", "encrypt", "time"}, now)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
metrics.IncrCounter([]string{"seal", "encrypt", "error"}, 1)
|
|
||||||
metrics.IncrCounter([]string{"seal", "transit", "encrypt", "error"}, 1)
|
|
||||||
}
|
|
||||||
}(time.Now())
|
|
||||||
|
|
||||||
metrics.IncrCounter([]string{"seal", "encrypt"}, 1)
|
|
||||||
metrics.IncrCounter([]string{"seal", "transit", "encrypt"}, 1)
|
|
||||||
|
|
||||||
ciphertext, err := s.client.Encrypt(plaintext)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
splitKey := strings.Split(string(ciphertext), ":")
|
|
||||||
if len(splitKey) != 3 {
|
|
||||||
return nil, errors.New("invalid ciphertext returned")
|
|
||||||
}
|
|
||||||
keyID := splitKey[1]
|
|
||||||
s.currentKeyID.Store(keyID)
|
|
||||||
|
|
||||||
ret := &physical.EncryptedBlobInfo{
|
|
||||||
Ciphertext: ciphertext,
|
|
||||||
KeyInfo: &physical.SealKeyInfo{
|
|
||||||
KeyID: keyID,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
return ret, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decrypt is used to decrypt the ciphertext
|
|
||||||
func (s *Seal) Decrypt(_ context.Context, in *physical.EncryptedBlobInfo) (pt []byte, err error) {
|
|
||||||
defer func(now time.Time) {
|
|
||||||
metrics.MeasureSince([]string{"seal", "decrypt", "time"}, now)
|
|
||||||
metrics.MeasureSince([]string{"seal", "transit", "decrypt", "time"}, now)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
metrics.IncrCounter([]string{"seal", "decrypt", "error"}, 1)
|
|
||||||
metrics.IncrCounter([]string{"seal", "transit", "decrypt", "error"}, 1)
|
|
||||||
}
|
|
||||||
}(time.Now())
|
|
||||||
|
|
||||||
metrics.IncrCounter([]string{"seal", "decrypt"}, 1)
|
|
||||||
metrics.IncrCounter([]string{"seal", "transit", "decrypt"}, 1)
|
|
||||||
|
|
||||||
plaintext, err := s.client.Decrypt(in.Ciphertext)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return plaintext, nil
|
|
||||||
}
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
package transit
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
log "github.com/hashicorp/go-hclog"
|
|
||||||
"github.com/hashicorp/vault/sdk/helper/logging"
|
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
|
||||||
"github.com/hashicorp/vault/vault/seal"
|
|
||||||
)
|
|
||||||
|
|
||||||
type testTransitClient struct {
|
|
||||||
keyID string
|
|
||||||
seal seal.Access
|
|
||||||
}
|
|
||||||
|
|
||||||
func newTestTransitClient(keyID string) *testTransitClient {
|
|
||||||
return &testTransitClient{
|
|
||||||
keyID: keyID,
|
|
||||||
seal: seal.NewTestSeal(nil),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *testTransitClient) Close() {}
|
|
||||||
|
|
||||||
func (m *testTransitClient) Encrypt(plaintext []byte) ([]byte, error) {
|
|
||||||
v, err := m.seal.Encrypt(context.Background(), plaintext)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return []byte(fmt.Sprintf("v1:%s:%s", m.keyID, string(v.Ciphertext))), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *testTransitClient) Decrypt(ciphertext []byte) ([]byte, error) {
|
|
||||||
splitKey := strings.Split(string(ciphertext), ":")
|
|
||||||
if len(splitKey) != 3 {
|
|
||||||
return nil, errors.New("invalid ciphertext returned")
|
|
||||||
}
|
|
||||||
|
|
||||||
data := &physical.EncryptedBlobInfo{
|
|
||||||
Ciphertext: []byte(splitKey[2]),
|
|
||||||
}
|
|
||||||
v, err := m.seal.Decrypt(context.Background(), data)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return v, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTransitSeal_Lifecycle(t *testing.T) {
|
|
||||||
s := NewSeal(logging.NewVaultLogger(log.Trace))
|
|
||||||
|
|
||||||
keyID := "test-key"
|
|
||||||
s.client = newTestTransitClient(keyID)
|
|
||||||
|
|
||||||
// Test Encrypt and Decrypt calls
|
|
||||||
input := []byte("foo")
|
|
||||||
swi, err := s.Encrypt(context.Background(), input)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
pt, err := s.Decrypt(context.Background(), swi)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("err: %s", err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if !reflect.DeepEqual(input, pt) {
|
|
||||||
t.Fatalf("expected %s, got %s", input, pt)
|
|
||||||
}
|
|
||||||
|
|
||||||
if s.KeyID() != keyID {
|
|
||||||
t.Fatalf("key id does not match: expected %s, got %s", keyID, s.KeyID())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,6 +2,8 @@ package vault
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SealAccess is a wrapper around Seal that exposes accessor methods
|
// SealAccess is a wrapper around Seal that exposes accessor methods
|
||||||
@@ -15,7 +17,7 @@ func NewSealAccess(seal Seal) *SealAccess {
|
|||||||
return &SealAccess{seal: seal}
|
return &SealAccess{seal: seal}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SealAccess) StoredKeysSupported() StoredKeysSupport {
|
func (s *SealAccess) StoredKeysSupported() seal.StoredKeysSupport {
|
||||||
return s.seal.StoredKeysSupported()
|
return s.seal.StoredKeysSupported()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,3 +47,7 @@ func (s *SealAccess) ClearCaches(ctx context.Context) {
|
|||||||
s.seal.SetRecoveryConfig(ctx, nil)
|
s.seal.SetRecoveryConfig(ctx, nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SealAccess) GetAccess() *seal.Access {
|
||||||
|
return s.seal.GetAccess()
|
||||||
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import (
|
|||||||
proto "github.com/golang/protobuf/proto"
|
proto "github.com/golang/protobuf/proto"
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
"github.com/hashicorp/vault/sdk/physical"
|
||||||
"github.com/hashicorp/vault/vault/seal"
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
)
|
)
|
||||||
@@ -22,7 +23,7 @@ var barrierTypeUpgradeCheck = func(_ string, _ *SealConfig) {}
|
|||||||
// decrypting stored keys via an underlying AutoSealAccess implementation, as
|
// decrypting stored keys via an underlying AutoSealAccess implementation, as
|
||||||
// well as logic related to recovery keys and barrier config.
|
// well as logic related to recovery keys and barrier config.
|
||||||
type autoSeal struct {
|
type autoSeal struct {
|
||||||
seal.Access
|
*seal.Access
|
||||||
|
|
||||||
barrierConfig atomic.Value
|
barrierConfig atomic.Value
|
||||||
recoveryConfig atomic.Value
|
recoveryConfig atomic.Value
|
||||||
@@ -33,7 +34,7 @@ type autoSeal struct {
|
|||||||
// Ensure we are implementing the Seal interface
|
// Ensure we are implementing the Seal interface
|
||||||
var _ Seal = (*autoSeal)(nil)
|
var _ Seal = (*autoSeal)(nil)
|
||||||
|
|
||||||
func NewAutoSeal(lowLevel seal.Access) *autoSeal {
|
func NewAutoSeal(lowLevel *seal.Access) *autoSeal {
|
||||||
ret := &autoSeal{
|
ret := &autoSeal{
|
||||||
Access: lowLevel,
|
Access: lowLevel,
|
||||||
}
|
}
|
||||||
@@ -46,7 +47,7 @@ func (d *autoSeal) SealWrapable() bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *autoSeal) GetAccess() seal.Access {
|
func (d *autoSeal) GetAccess() *seal.Access {
|
||||||
return d.Access
|
return d.Access
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,11 +75,11 @@ func (d *autoSeal) Finalize(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *autoSeal) BarrierType() string {
|
func (d *autoSeal) BarrierType() string {
|
||||||
return d.SealType()
|
return d.Type()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *autoSeal) StoredKeysSupported() StoredKeysSupport {
|
func (d *autoSeal) StoredKeysSupported() seal.StoredKeysSupport {
|
||||||
return StoredKeysSupportedGeneric
|
return seal.StoredKeysSupportedGeneric
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *autoSeal) RecoveryKeySupported() bool {
|
func (d *autoSeal) RecoveryKeySupported() bool {
|
||||||
@@ -88,13 +89,13 @@ func (d *autoSeal) RecoveryKeySupported() bool {
|
|||||||
// SetStoredKeys uses the autoSeal.Access.Encrypts method to wrap the keys. The stored entry
|
// SetStoredKeys uses the autoSeal.Access.Encrypts method to wrap the keys. The stored entry
|
||||||
// does not need to be seal wrapped in this case.
|
// does not need to be seal wrapped in this case.
|
||||||
func (d *autoSeal) SetStoredKeys(ctx context.Context, keys [][]byte) error {
|
func (d *autoSeal) SetStoredKeys(ctx context.Context, keys [][]byte) error {
|
||||||
return writeStoredKeys(ctx, d.core.physical, d, keys)
|
return writeStoredKeys(ctx, d.core.physical, d.Access, keys)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetStoredKeys retrieves the key shares by unwrapping the encrypted key using the
|
// GetStoredKeys retrieves the key shares by unwrapping the encrypted key using the
|
||||||
// autoseal.
|
// autoseal.
|
||||||
func (d *autoSeal) GetStoredKeys(ctx context.Context) ([][]byte, error) {
|
func (d *autoSeal) GetStoredKeys(ctx context.Context) ([][]byte, error) {
|
||||||
return readStoredKeys(ctx, d.core.physical, d)
|
return readStoredKeys(ctx, d.core.physical, d.Access)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *autoSeal) upgradeStoredKeys(ctx context.Context) error {
|
func (d *autoSeal) upgradeStoredKeys(ctx context.Context) error {
|
||||||
@@ -106,7 +107,7 @@ func (d *autoSeal) upgradeStoredKeys(ctx context.Context) error {
|
|||||||
return fmt.Errorf("no stored keys found")
|
return fmt.Errorf("no stored keys found")
|
||||||
}
|
}
|
||||||
|
|
||||||
blobInfo := &physical.EncryptedBlobInfo{}
|
blobInfo := &wrapping.EncryptedBlobInfo{}
|
||||||
if err := proto.Unmarshal(pe.Value, blobInfo); err != nil {
|
if err := proto.Unmarshal(pe.Value, blobInfo); err != nil {
|
||||||
return errwrap.Wrapf("failed to proto decode stored keys: {{err}}", err)
|
return errwrap.Wrapf("failed to proto decode stored keys: {{err}}", err)
|
||||||
}
|
}
|
||||||
@@ -114,7 +115,7 @@ func (d *autoSeal) upgradeStoredKeys(ctx context.Context) error {
|
|||||||
if blobInfo.KeyInfo != nil && blobInfo.KeyInfo.KeyID != d.Access.KeyID() {
|
if blobInfo.KeyInfo != nil && blobInfo.KeyInfo.KeyID != d.Access.KeyID() {
|
||||||
d.logger.Info("upgrading stored keys")
|
d.logger.Info("upgrading stored keys")
|
||||||
|
|
||||||
pt, err := d.Decrypt(ctx, blobInfo)
|
pt, err := d.Decrypt(ctx, blobInfo, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errwrap.Wrapf("failed to decrypt encrypted stored keys: {{err}}", err)
|
return errwrap.Wrapf("failed to decrypt encrypted stored keys: {{err}}", err)
|
||||||
}
|
}
|
||||||
@@ -139,7 +140,7 @@ func (d *autoSeal) upgradeStoredKeys(ctx context.Context) error {
|
|||||||
func (d *autoSeal) UpgradeKeys(ctx context.Context) error {
|
func (d *autoSeal) UpgradeKeys(ctx context.Context) error {
|
||||||
// Many of the seals update their keys to the latest KeyID when Encrypt
|
// Many of the seals update their keys to the latest KeyID when Encrypt
|
||||||
// is called.
|
// is called.
|
||||||
if _, err := d.Encrypt(ctx, []byte("a")); err != nil {
|
if _, err := d.Encrypt(ctx, []byte("a"), nil); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -384,7 +385,7 @@ func (d *autoSeal) SetRecoveryKey(ctx context.Context, key []byte) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encrypt and marshal the keys
|
// Encrypt and marshal the keys
|
||||||
blobInfo, err := d.Encrypt(ctx, key)
|
blobInfo, err := d.Encrypt(ctx, key, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errwrap.Wrapf("failed to encrypt keys for storage: {{err}}", err)
|
return errwrap.Wrapf("failed to encrypt keys for storage: {{err}}", err)
|
||||||
}
|
}
|
||||||
@@ -422,12 +423,12 @@ func (d *autoSeal) getRecoveryKeyInternal(ctx context.Context) ([]byte, error) {
|
|||||||
return nil, fmt.Errorf("no recovery key found")
|
return nil, fmt.Errorf("no recovery key found")
|
||||||
}
|
}
|
||||||
|
|
||||||
blobInfo := &physical.EncryptedBlobInfo{}
|
blobInfo := &wrapping.EncryptedBlobInfo{}
|
||||||
if err := proto.Unmarshal(pe.Value, blobInfo); err != nil {
|
if err := proto.Unmarshal(pe.Value, blobInfo); err != nil {
|
||||||
return nil, errwrap.Wrapf("failed to proto decode stored keys: {{err}}", err)
|
return nil, errwrap.Wrapf("failed to proto decode stored keys: {{err}}", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
pt, err := d.Decrypt(ctx, blobInfo)
|
pt, err := d.Decrypt(ctx, blobInfo, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errwrap.Wrapf("failed to decrypt encrypted stored keys: {{err}}", err)
|
return nil, errwrap.Wrapf("failed to decrypt encrypted stored keys: {{err}}", err)
|
||||||
}
|
}
|
||||||
@@ -444,7 +445,7 @@ func (d *autoSeal) upgradeRecoveryKey(ctx context.Context) error {
|
|||||||
return fmt.Errorf("no recovery key found")
|
return fmt.Errorf("no recovery key found")
|
||||||
}
|
}
|
||||||
|
|
||||||
blobInfo := &physical.EncryptedBlobInfo{}
|
blobInfo := &wrapping.EncryptedBlobInfo{}
|
||||||
if err := proto.Unmarshal(pe.Value, blobInfo); err != nil {
|
if err := proto.Unmarshal(pe.Value, blobInfo); err != nil {
|
||||||
return errwrap.Wrapf("failed to proto decode recovery key: {{err}}", err)
|
return errwrap.Wrapf("failed to proto decode recovery key: {{err}}", err)
|
||||||
}
|
}
|
||||||
@@ -452,7 +453,7 @@ func (d *autoSeal) upgradeRecoveryKey(ctx context.Context) error {
|
|||||||
if blobInfo.KeyInfo != nil && blobInfo.KeyInfo.KeyID != d.Access.KeyID() {
|
if blobInfo.KeyInfo != nil && blobInfo.KeyInfo.KeyID != d.Access.KeyID() {
|
||||||
d.logger.Info("upgrading recovery key")
|
d.logger.Info("upgrading recovery key")
|
||||||
|
|
||||||
pt, err := d.Decrypt(ctx, blobInfo)
|
pt, err := d.Decrypt(ctx, blobInfo, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errwrap.Wrapf("failed to decrypt encrypted recovery key: {{err}}", err)
|
return errwrap.Wrapf("failed to decrypt encrypted recovery key: {{err}}", err)
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
proto "github.com/golang/protobuf/proto"
|
proto "github.com/golang/protobuf/proto"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
"github.com/hashicorp/vault/sdk/physical"
|
||||||
"github.com/hashicorp/vault/vault/seal"
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
)
|
)
|
||||||
@@ -64,7 +65,7 @@ func TestAutoSeal_UpgradeKeys(t *testing.T) {
|
|||||||
var encKeys []string
|
var encKeys []string
|
||||||
changeKey := func(key string) {
|
changeKey := func(key string) {
|
||||||
encKeys = append(encKeys, key)
|
encKeys = append(encKeys, key)
|
||||||
testSeal.SetKeyID(key)
|
testSeal.Wrapper.(*wrapping.TestWrapper).SetKeyID(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set initial encryption key.
|
// Set initial encryption key.
|
||||||
@@ -123,7 +124,7 @@ func TestAutoSeal_UpgradeKeys(t *testing.T) {
|
|||||||
// in encKeys. Iterate over each phyEntry and verify it was
|
// in encKeys. Iterate over each phyEntry and verify it was
|
||||||
// encrypted with its corresponding key in encKeys.
|
// encrypted with its corresponding key in encKeys.
|
||||||
for i, phyEntry := range phyEntries {
|
for i, phyEntry := range phyEntries {
|
||||||
blobInfo := &physical.EncryptedBlobInfo{}
|
blobInfo := &wrapping.EncryptedBlobInfo{}
|
||||||
if err := proto.Unmarshal(phyEntry.Value, blobInfo); err != nil {
|
if err := proto.Unmarshal(phyEntry.Value, blobInfo); err != nil {
|
||||||
t.Errorf("phyKey = %s: failed to proto decode stored keys: %s", phyKey, err)
|
t.Errorf("phyKey = %s: failed to proto decode stored keys: %s", phyKey, err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,33 +3,28 @@ package vault
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
log "github.com/hashicorp/go-hclog"
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
|
vaultseal "github.com/hashicorp/vault/vault/seal"
|
||||||
testing "github.com/mitchellh/go-testing-interface"
|
testing "github.com/mitchellh/go-testing-interface"
|
||||||
)
|
)
|
||||||
|
|
||||||
type TestSealOpts struct {
|
|
||||||
Logger log.Logger
|
|
||||||
StoredKeys StoredKeysSupport
|
|
||||||
Secret []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCoreUnsealedWithConfigs(t testing.T, barrierConf, recoveryConf *SealConfig) (*Core, [][]byte, [][]byte, string) {
|
func TestCoreUnsealedWithConfigs(t testing.T, barrierConf, recoveryConf *SealConfig) (*Core, [][]byte, [][]byte, string) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
opts := &TestSealOpts{}
|
opts := &seal.TestSealOpts{}
|
||||||
if recoveryConf == nil {
|
if recoveryConf == nil {
|
||||||
opts.StoredKeys = StoredKeysSupportedShamirMaster
|
opts.StoredKeys = seal.StoredKeysSupportedShamirMaster
|
||||||
}
|
}
|
||||||
return TestCoreUnsealedWithConfigSealOpts(t, barrierConf, recoveryConf, opts)
|
return TestCoreUnsealedWithConfigSealOpts(t, barrierConf, recoveryConf, opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCoreUnsealedWithConfigSealOpts(t testing.T, barrierConf, recoveryConf *SealConfig, sealOpts *TestSealOpts) (*Core, [][]byte, [][]byte, string) {
|
func TestCoreUnsealedWithConfigSealOpts(t testing.T, barrierConf, recoveryConf *SealConfig, sealOpts *seal.TestSealOpts) (*Core, [][]byte, [][]byte, string) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
seal := NewTestSeal(t, sealOpts)
|
seal := NewTestSeal(t, sealOpts)
|
||||||
core := TestCoreWithSeal(t, seal, false)
|
core := TestCoreWithSeal(t, seal, false)
|
||||||
result, err := core.Initialize(context.Background(), &InitParams{
|
result, err := core.Initialize(context.Background(), &InitParams{
|
||||||
BarrierConfig: barrierConf,
|
BarrierConfig: barrierConf,
|
||||||
RecoveryConfig: recoveryConf,
|
RecoveryConfig: recoveryConf,
|
||||||
LegacyShamirSeal: sealOpts.StoredKeys == StoredKeysNotSupported,
|
LegacyShamirSeal: sealOpts.StoredKeys == vaultseal.StoredKeysNotSupported,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
|
|||||||
@@ -2,24 +2,29 @@ package vault
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/hashicorp/go-hclog"
|
"github.com/hashicorp/go-hclog"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
|
aeadwrapper "github.com/hashicorp/go-kms-wrapping/wrappers/aead"
|
||||||
"github.com/hashicorp/vault/sdk/helper/logging"
|
"github.com/hashicorp/vault/sdk/helper/logging"
|
||||||
"github.com/hashicorp/vault/vault/seal"
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
shamirseal "github.com/hashicorp/vault/vault/seal/shamir"
|
|
||||||
testing "github.com/mitchellh/go-testing-interface"
|
testing "github.com/mitchellh/go-testing-interface"
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewTestSeal(t testing.T, opts *TestSealOpts) Seal {
|
func NewTestSeal(t testing.T, opts *seal.TestSealOpts) Seal {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
if opts == nil {
|
if opts == nil {
|
||||||
opts = &TestSealOpts{}
|
opts = &seal.TestSealOpts{}
|
||||||
}
|
}
|
||||||
if opts.Logger == nil {
|
if opts.Logger == nil {
|
||||||
opts.Logger = logging.NewVaultLogger(hclog.Debug)
|
opts.Logger = logging.NewVaultLogger(hclog.Debug)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch opts.StoredKeys {
|
switch opts.StoredKeys {
|
||||||
case StoredKeysSupportedShamirMaster:
|
case seal.StoredKeysSupportedShamirMaster:
|
||||||
newSeal := NewDefaultSeal(shamirseal.NewSeal(opts.Logger))
|
newSeal := NewDefaultSeal(&seal.Access{
|
||||||
|
Wrapper: aeadwrapper.NewWrapper(&wrapping.WrapperOptions{
|
||||||
|
Logger: opts.Logger,
|
||||||
|
}),
|
||||||
|
})
|
||||||
// Need StoredShares set or this will look like a legacy shamir seal.
|
// Need StoredShares set or this will look like a legacy shamir seal.
|
||||||
newSeal.SetCachedBarrierConfig(&SealConfig{
|
newSeal.SetCachedBarrierConfig(&SealConfig{
|
||||||
StoredShares: 1,
|
StoredShares: 1,
|
||||||
@@ -27,8 +32,12 @@ func NewTestSeal(t testing.T, opts *TestSealOpts) Seal {
|
|||||||
SecretShares: 1,
|
SecretShares: 1,
|
||||||
})
|
})
|
||||||
return newSeal
|
return newSeal
|
||||||
case StoredKeysNotSupported:
|
case seal.StoredKeysNotSupported:
|
||||||
newSeal := NewDefaultSeal(shamirseal.NewSeal(opts.Logger))
|
newSeal := NewDefaultSeal(&seal.Access{
|
||||||
|
Wrapper: aeadwrapper.NewWrapper(&wrapping.WrapperOptions{
|
||||||
|
Logger: opts.Logger,
|
||||||
|
}),
|
||||||
|
})
|
||||||
newSeal.SetCachedBarrierConfig(&SealConfig{
|
newSeal.SetCachedBarrierConfig(&SealConfig{
|
||||||
StoredShares: 0,
|
StoredShares: 0,
|
||||||
SecretThreshold: 1,
|
SecretThreshold: 1,
|
||||||
@@ -36,6 +45,6 @@ func NewTestSeal(t testing.T, opts *TestSealOpts) Seal {
|
|||||||
})
|
})
|
||||||
return newSeal
|
return newSeal
|
||||||
default:
|
default:
|
||||||
return NewAutoSeal(seal.NewTestSeal(opts.Secret))
|
return NewAutoSeal(seal.NewTestSeal(opts))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import (
|
|||||||
|
|
||||||
proto "github.com/golang/protobuf/proto"
|
proto "github.com/golang/protobuf/proto"
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
"github.com/hashicorp/vault/sdk/helper/locksutil"
|
"github.com/hashicorp/vault/sdk/helper/locksutil"
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
"github.com/hashicorp/vault/sdk/physical"
|
||||||
)
|
)
|
||||||
@@ -69,7 +70,7 @@ func (d *sealUnwrapper) Get(ctx context.Context, key string) (*physical.Entry, e
|
|||||||
}
|
}
|
||||||
|
|
||||||
var performUnwrap bool
|
var performUnwrap bool
|
||||||
se := &physical.EncryptedBlobInfo{}
|
se := &wrapping.EncryptedBlobInfo{}
|
||||||
// If the value ends in our canary value, try to decode the bytes.
|
// If the value ends in our canary value, try to decode the bytes.
|
||||||
eLen := len(entry.Value)
|
eLen := len(entry.Value)
|
||||||
if eLen > 0 && entry.Value[eLen-1] == 's' {
|
if eLen > 0 && entry.Value[eLen-1] == 's' {
|
||||||
@@ -106,7 +107,7 @@ func (d *sealUnwrapper) Get(ctx context.Context, key string) (*physical.Entry, e
|
|||||||
}
|
}
|
||||||
|
|
||||||
performUnwrap = false
|
performUnwrap = false
|
||||||
se = &physical.EncryptedBlobInfo{}
|
se = &wrapping.EncryptedBlobInfo{}
|
||||||
// If the value ends in our canary value, try to decode the bytes.
|
// If the value ends in our canary value, try to decode the bytes.
|
||||||
eLen = len(entry.Value)
|
eLen = len(entry.Value)
|
||||||
if eLen > 0 && entry.Value[eLen-1] == 's' {
|
if eLen > 0 && entry.Value[eLen-1] == 's' {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import (
|
|||||||
|
|
||||||
proto "github.com/golang/protobuf/proto"
|
proto "github.com/golang/protobuf/proto"
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||||
"github.com/hashicorp/vault/sdk/physical"
|
"github.com/hashicorp/vault/sdk/physical"
|
||||||
"github.com/hashicorp/vault/sdk/physical/inmem"
|
"github.com/hashicorp/vault/sdk/physical/inmem"
|
||||||
)
|
)
|
||||||
@@ -56,7 +57,7 @@ func performTestSealUnwrapper(t *testing.T, phys physical.Backend, logger log.Lo
|
|||||||
// Save the original for comparison later
|
// Save the original for comparison later
|
||||||
origBytes := make([]byte, len(entry.Value))
|
origBytes := make([]byte, len(entry.Value))
|
||||||
copy(origBytes, entry.Value)
|
copy(origBytes, entry.Value)
|
||||||
se := &physical.EncryptedBlobInfo{
|
se := &wrapping.EncryptedBlobInfo{
|
||||||
Ciphertext: entry.Value,
|
Ciphertext: entry.Value,
|
||||||
}
|
}
|
||||||
seb, err := proto.Marshal(se)
|
seb, err := proto.Marshal(se)
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import (
|
|||||||
hclog "github.com/hashicorp/go-hclog"
|
hclog "github.com/hashicorp/go-hclog"
|
||||||
log "github.com/hashicorp/go-hclog"
|
log "github.com/hashicorp/go-hclog"
|
||||||
"github.com/hashicorp/vault/helper/metricsutil"
|
"github.com/hashicorp/vault/helper/metricsutil"
|
||||||
|
"github.com/hashicorp/vault/vault/seal"
|
||||||
"github.com/mitchellh/copystructure"
|
"github.com/mitchellh/copystructure"
|
||||||
|
|
||||||
"golang.org/x/crypto/ed25519"
|
"golang.org/x/crypto/ed25519"
|
||||||
@@ -267,7 +268,7 @@ func TestCoreInitClusterWrapperSetup(t testing.T, core *Core, handler http.Handl
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch core.seal.StoredKeysSupported() {
|
switch core.seal.StoredKeysSupported() {
|
||||||
case StoredKeysNotSupported:
|
case seal.StoredKeysNotSupported:
|
||||||
barrierConfig.StoredShares = 0
|
barrierConfig.StoredShares = 0
|
||||||
default:
|
default:
|
||||||
barrierConfig.StoredShares = 1
|
barrierConfig.StoredShares = 1
|
||||||
@@ -282,7 +283,7 @@ func TestCoreInitClusterWrapperSetup(t testing.T, core *Core, handler http.Handl
|
|||||||
BarrierConfig: barrierConfig,
|
BarrierConfig: barrierConfig,
|
||||||
RecoveryConfig: recoveryConfig,
|
RecoveryConfig: recoveryConfig,
|
||||||
}
|
}
|
||||||
if core.seal.StoredKeysSupported() == StoredKeysNotSupported {
|
if core.seal.StoredKeysSupported() == seal.StoredKeysNotSupported {
|
||||||
initParams.LegacyShamirSeal = true
|
initParams.LegacyShamirSeal = true
|
||||||
}
|
}
|
||||||
result, err := core.Initialize(context.Background(), initParams)
|
result, err := core.Initialize(context.Background(), initParams)
|
||||||
|
|||||||
@@ -213,7 +213,7 @@ func TestTokenStore_Salting(t *testing.T) {
|
|||||||
t.Fatalf("expected sha2-256 hmac; got sha1 hash")
|
t.Fatalf("expected sha2-256 hmac; got sha1 hash")
|
||||||
}
|
}
|
||||||
|
|
||||||
nsCtx := namespace.ContextWithNamespace(context.Background(), &namespace.Namespace{"testid", "ns1"})
|
nsCtx := namespace.ContextWithNamespace(context.Background(), &namespace.Namespace{ID: "testid", Path: "ns1"})
|
||||||
saltedID, err = ts.SaltID(nsCtx, "foo")
|
saltedID, err = ts.SaltID(nsCtx, "foo")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
|||||||
18
vendor/contrib.go.opencensus.io/exporter/ocagent/.travis.yml
generated
vendored
18
vendor/contrib.go.opencensus.io/exporter/ocagent/.travis.yml
generated
vendored
@@ -1,18 +0,0 @@
|
|||||||
language: go
|
|
||||||
|
|
||||||
go:
|
|
||||||
- 1.11.x
|
|
||||||
|
|
||||||
go_import_path: contrib.go.opencensus.io/exporter/ocagent
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
- GO_FILES=$(find . -iname '*.go' | grep -v /vendor/) # All the .go files, excluding vendor/ if any
|
|
||||||
- PKGS=$(go list ./... | grep -v /vendor/) # All the import paths, excluding vendor/ if any
|
|
||||||
|
|
||||||
script:
|
|
||||||
- go build ./... # Ensure dependency updates don't break build
|
|
||||||
- if [ -n "$(gofmt -s -l $GO_FILES)" ]; then echo "gofmt the following files:"; gofmt -s -l $GO_FILES; exit 1; fi
|
|
||||||
- go vet ./...
|
|
||||||
- GO111MODULE=on go test -v -race $PKGS # Run all the tests with the race detector enabled
|
|
||||||
- GO111MODULE=off go test -v -race $PKGS # Make sure tests still pass when not using Go modules.
|
|
||||||
- 'if [[ $TRAVIS_GO_VERSION = 1.8* ]]; then ! golint ./... | grep -vE "(_mock|_string|\.pb)\.go:"; fi'
|
|
||||||
24
vendor/contrib.go.opencensus.io/exporter/ocagent/CONTRIBUTING.md
generated
vendored
24
vendor/contrib.go.opencensus.io/exporter/ocagent/CONTRIBUTING.md
generated
vendored
@@ -1,24 +0,0 @@
|
|||||||
# How to contribute
|
|
||||||
|
|
||||||
We'd love to accept your patches and contributions to this project. There are
|
|
||||||
just a few small guidelines you need to follow.
|
|
||||||
|
|
||||||
## Contributor License Agreement
|
|
||||||
|
|
||||||
Contributions to this project must be accompanied by a Contributor License
|
|
||||||
Agreement. You (or your employer) retain the copyright to your contribution,
|
|
||||||
this simply gives us permission to use and redistribute your contributions as
|
|
||||||
part of the project. Head over to <https://cla.developers.google.com/> to see
|
|
||||||
your current agreements on file or to sign a new one.
|
|
||||||
|
|
||||||
You generally only need to submit a CLA once, so if you've already submitted one
|
|
||||||
(even if it was for a different project), you probably don't need to do it
|
|
||||||
again.
|
|
||||||
|
|
||||||
## Code reviews
|
|
||||||
|
|
||||||
All submissions, including submissions by project members, require review. We
|
|
||||||
use GitHub pull requests for this purpose. Consult [GitHub Help] for more
|
|
||||||
information on using pull requests.
|
|
||||||
|
|
||||||
[GitHub Help]: https://help.github.com/articles/about-pull-requests/
|
|
||||||
61
vendor/contrib.go.opencensus.io/exporter/ocagent/README.md
generated
vendored
61
vendor/contrib.go.opencensus.io/exporter/ocagent/README.md
generated
vendored
@@ -1,61 +0,0 @@
|
|||||||
# OpenCensus Agent Go Exporter
|
|
||||||
|
|
||||||
[![Build Status][travis-image]][travis-url] [![GoDoc][godoc-image]][godoc-url]
|
|
||||||
|
|
||||||
|
|
||||||
This repository contains the Go implementation of the OpenCensus Agent (OC-Agent) Exporter.
|
|
||||||
OC-Agent is a deamon process running in a VM that can retrieve spans/stats/metrics from
|
|
||||||
OpenCensus Library, export them to other backends and possibly push configurations back to
|
|
||||||
Library. See more details on [OC-Agent Readme][OCAgentReadme].
|
|
||||||
|
|
||||||
Note: This is an experimental repository and is likely to get backwards-incompatible changes.
|
|
||||||
Ultimately we may want to move the OC-Agent Go Exporter to [OpenCensus Go core library][OpenCensusGo].
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ go get -u contrib.go.opencensus.io/exporter/ocagent
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```go
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"contrib.go.opencensus.io/exporter/ocagent"
|
|
||||||
"go.opencensus.io/trace"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Example() {
|
|
||||||
exp, err := ocagent.NewExporter(ocagent.WithInsecure(), ocagent.WithServiceName("your-service-name"))
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Failed to create the agent exporter: %v", err)
|
|
||||||
}
|
|
||||||
defer exp.Stop()
|
|
||||||
|
|
||||||
// Now register it as a trace exporter.
|
|
||||||
trace.RegisterExporter(exp)
|
|
||||||
|
|
||||||
// Then use the OpenCensus tracing library, like we normally would.
|
|
||||||
ctx, span := trace.StartSpan(context.Background(), "AgentExporter-Example")
|
|
||||||
defer span.End()
|
|
||||||
|
|
||||||
for i := 0; i < 10; i++ {
|
|
||||||
_, iSpan := trace.StartSpan(ctx, fmt.Sprintf("Sample-%d", i))
|
|
||||||
<-time.After(6 * time.Millisecond)
|
|
||||||
iSpan.End()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
[OCAgentReadme]: https://github.com/census-instrumentation/opencensus-proto/tree/master/opencensus/proto/agent#opencensus-agent-proto
|
|
||||||
[OpenCensusGo]: https://github.com/census-instrumentation/opencensus-go
|
|
||||||
[godoc-image]: https://godoc.org/contrib.go.opencensus.io/exporter/ocagent?status.svg
|
|
||||||
[godoc-url]: https://godoc.org/contrib.go.opencensus.io/exporter/ocagent
|
|
||||||
[travis-image]: https://travis-ci.org/census-ecosystem/opencensus-go-exporter-ocagent.svg?branch=master
|
|
||||||
[travis-url]: https://travis-ci.org/census-ecosystem/opencensus-go-exporter-ocagent
|
|
||||||
|
|
||||||
38
vendor/contrib.go.opencensus.io/exporter/ocagent/common.go
generated
vendored
38
vendor/contrib.go.opencensus.io/exporter/ocagent/common.go
generated
vendored
@@ -1,38 +0,0 @@
|
|||||||
// Copyright 2018, OpenCensus Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package ocagent
|
|
||||||
|
|
||||||
import (
|
|
||||||
"math/rand"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
var randSrc = rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
||||||
|
|
||||||
// retries function fn upto n times, if fn returns an error lest it returns nil early.
|
|
||||||
// It applies exponential backoff in units of (1<<n) + jitter microsends.
|
|
||||||
func nTriesWithExponentialBackoff(nTries int64, timeBaseUnit time.Duration, fn func() error) (err error) {
|
|
||||||
for i := int64(0); i < nTries; i++ {
|
|
||||||
err = fn()
|
|
||||||
if err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
// Backoff for a time period with a pseudo-random jitter
|
|
||||||
jitter := time.Duration(randSrc.Float64()*100) * time.Microsecond
|
|
||||||
ts := jitter + ((1 << uint64(i)) * timeBaseUnit)
|
|
||||||
<-time.After(ts)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
97
vendor/contrib.go.opencensus.io/exporter/ocagent/connection.go
generated
vendored
97
vendor/contrib.go.opencensus.io/exporter/ocagent/connection.go
generated
vendored
@@ -1,97 +0,0 @@
|
|||||||
// Copyright 2018, OpenCensus Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package ocagent
|
|
||||||
|
|
||||||
import (
|
|
||||||
"math/rand"
|
|
||||||
"sync/atomic"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
sDisconnected int32 = 5 + iota
|
|
||||||
sConnected
|
|
||||||
)
|
|
||||||
|
|
||||||
func (ae *Exporter) setStateDisconnected() {
|
|
||||||
atomic.StoreInt32(&ae.connectionState, sDisconnected)
|
|
||||||
select {
|
|
||||||
case ae.disconnectedCh <- true:
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ae *Exporter) setStateConnected() {
|
|
||||||
atomic.StoreInt32(&ae.connectionState, sConnected)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ae *Exporter) connected() bool {
|
|
||||||
return atomic.LoadInt32(&ae.connectionState) == sConnected
|
|
||||||
}
|
|
||||||
|
|
||||||
const defaultConnReattemptPeriod = 10 * time.Second
|
|
||||||
|
|
||||||
func (ae *Exporter) indefiniteBackgroundConnection() error {
|
|
||||||
defer func() {
|
|
||||||
ae.backgroundConnectionDoneCh <- true
|
|
||||||
}()
|
|
||||||
|
|
||||||
connReattemptPeriod := ae.reconnectionPeriod
|
|
||||||
if connReattemptPeriod <= 0 {
|
|
||||||
connReattemptPeriod = defaultConnReattemptPeriod
|
|
||||||
}
|
|
||||||
|
|
||||||
// No strong seeding required, nano time can
|
|
||||||
// already help with pseudo uniqueness.
|
|
||||||
rng := rand.New(rand.NewSource(time.Now().UnixNano() + rand.Int63n(1024)))
|
|
||||||
|
|
||||||
// maxJitter: 1 + (70% of the connectionReattemptPeriod)
|
|
||||||
maxJitter := int64(1 + 0.7*float64(connReattemptPeriod))
|
|
||||||
|
|
||||||
for {
|
|
||||||
// Otherwise these will be the normal scenarios to enable
|
|
||||||
// reconnections if we trip out.
|
|
||||||
// 1. If we've stopped, return entirely
|
|
||||||
// 2. Otherwise block until we are disconnected, and
|
|
||||||
// then retry connecting
|
|
||||||
select {
|
|
||||||
case <-ae.stopCh:
|
|
||||||
return errStopped
|
|
||||||
|
|
||||||
case <-ae.disconnectedCh:
|
|
||||||
// Normal scenario that we'll wait for
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := ae.connect(); err == nil {
|
|
||||||
ae.setStateConnected()
|
|
||||||
} else {
|
|
||||||
ae.setStateDisconnected()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply some jitter to avoid lockstep retrials of other
|
|
||||||
// agent-exporters. Lockstep retrials could result in an
|
|
||||||
// innocent DDOS, by clogging the machine's resources and network.
|
|
||||||
jitter := time.Duration(rng.Int63n(maxJitter))
|
|
||||||
<-time.After(connReattemptPeriod + jitter)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ae *Exporter) connect() error {
|
|
||||||
cc, err := ae.dialToAgent()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return ae.enableConnectionStreams(cc)
|
|
||||||
}
|
|
||||||
10
vendor/contrib.go.opencensus.io/exporter/ocagent/go.mod
generated
vendored
10
vendor/contrib.go.opencensus.io/exporter/ocagent/go.mod
generated
vendored
@@ -1,10 +0,0 @@
|
|||||||
module contrib.go.opencensus.io/exporter/ocagent
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.0 // this is to match the version used in census-instrumentation/opencensus-service
|
|
||||||
github.com/golang/protobuf v1.3.1
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.8.5 // indirect
|
|
||||||
go.opencensus.io v0.20.2
|
|
||||||
google.golang.org/api v0.3.1
|
|
||||||
google.golang.org/grpc v1.19.1
|
|
||||||
)
|
|
||||||
130
vendor/contrib.go.opencensus.io/exporter/ocagent/go.sum
generated
vendored
130
vendor/contrib.go.opencensus.io/exporter/ocagent/go.sum
generated
vendored
@@ -1,130 +0,0 @@
|
|||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
|
||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
|
||||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
|
||||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
|
||||||
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.0 h1:LzQXZOgg4CQfE6bFvXGM30YZL1WW/M337pXml+GrcZ4=
|
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
|
|
||||||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
|
|
||||||
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
|
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
|
||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
|
||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
|
||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
|
||||||
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
|
||||||
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
|
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
|
||||||
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
|
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
|
||||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
|
||||||
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.8.5 h1:2+KSC78XiO6Qy0hIjfc1OD9H+hsaJdJlb8Kqsd41CTE=
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
|
||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
|
||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
|
||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
|
||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
|
||||||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
|
||||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
|
||||||
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
|
|
||||||
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
|
||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
|
||||||
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
|
|
||||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
|
||||||
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
|
||||||
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
|
||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
|
||||||
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
|
||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
|
||||||
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
|
||||||
go.opencensus.io v0.20.2 h1:NAfh7zF0/3/HqtMvJNZ/RFrSlCE6ZTlHmKfhL/Dm1Jk=
|
|
||||||
go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
|
||||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
|
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
|
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI=
|
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
|
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
||||||
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
|
||||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
google.golang.org/api v0.3.1 h1:oJra/lMfmtm13/rgY/8i3MzjFWYXvQIAKjQ3HqofMk8=
|
|
||||||
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
|
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
|
||||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19 h1:Lj2SnHtxkRGJDqnGaSjo+CCdIieEnwVazbOXILwQemk=
|
|
||||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
|
||||||
google.golang.org/grpc v1.19.1 h1:TrBcJ1yqAl1G++wO39nD/qtgpsW9/1+QGrluyMGEYgM=
|
|
||||||
google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
|
||||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
|
||||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
||||||
46
vendor/contrib.go.opencensus.io/exporter/ocagent/nodeinfo.go
generated
vendored
46
vendor/contrib.go.opencensus.io/exporter/ocagent/nodeinfo.go
generated
vendored
@@ -1,46 +0,0 @@
|
|||||||
// Copyright 2018, OpenCensus Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package ocagent
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
|
|
||||||
commonpb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1"
|
|
||||||
"go.opencensus.io"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NodeWithStartTime creates a node using nodeName and derives:
|
|
||||||
// Hostname from the environment
|
|
||||||
// Pid from the current process
|
|
||||||
// StartTimestamp from the start time of this process
|
|
||||||
// Language and library information.
|
|
||||||
func NodeWithStartTime(nodeName string) *commonpb.Node {
|
|
||||||
return &commonpb.Node{
|
|
||||||
Identifier: &commonpb.ProcessIdentifier{
|
|
||||||
HostName: os.Getenv("HOSTNAME"),
|
|
||||||
Pid: uint32(os.Getpid()),
|
|
||||||
StartTimestamp: timeToTimestamp(startTime),
|
|
||||||
},
|
|
||||||
LibraryInfo: &commonpb.LibraryInfo{
|
|
||||||
Language: commonpb.LibraryInfo_GO_LANG,
|
|
||||||
ExporterVersion: Version,
|
|
||||||
CoreLibraryVersion: opencensus.Version(),
|
|
||||||
},
|
|
||||||
ServiceInfo: &commonpb.ServiceInfo{
|
|
||||||
Name: nodeName,
|
|
||||||
},
|
|
||||||
Attributes: make(map[string]string),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
496
vendor/contrib.go.opencensus.io/exporter/ocagent/ocagent.go
generated
vendored
496
vendor/contrib.go.opencensus.io/exporter/ocagent/ocagent.go
generated
vendored
@@ -1,496 +0,0 @@
|
|||||||
// Copyright 2018, OpenCensus Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package ocagent
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"google.golang.org/api/support/bundler"
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
"google.golang.org/grpc/credentials"
|
|
||||||
"google.golang.org/grpc/metadata"
|
|
||||||
|
|
||||||
"go.opencensus.io/plugin/ocgrpc"
|
|
||||||
"go.opencensus.io/resource"
|
|
||||||
"go.opencensus.io/stats/view"
|
|
||||||
"go.opencensus.io/trace"
|
|
||||||
|
|
||||||
commonpb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1"
|
|
||||||
agentmetricspb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/metrics/v1"
|
|
||||||
agenttracepb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/trace/v1"
|
|
||||||
metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1"
|
|
||||||
resourcepb "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1"
|
|
||||||
tracepb "github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
var startupMu sync.Mutex
|
|
||||||
var startTime time.Time
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
startupMu.Lock()
|
|
||||||
startTime = time.Now()
|
|
||||||
startupMu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ trace.Exporter = (*Exporter)(nil)
|
|
||||||
var _ view.Exporter = (*Exporter)(nil)
|
|
||||||
|
|
||||||
type Exporter struct {
|
|
||||||
connectionState int32
|
|
||||||
|
|
||||||
// mu protects the non-atomic and non-channel variables
|
|
||||||
mu sync.RWMutex
|
|
||||||
// senderMu protects the concurrent unsafe traceExporter client
|
|
||||||
senderMu sync.RWMutex
|
|
||||||
started bool
|
|
||||||
stopped bool
|
|
||||||
agentAddress string
|
|
||||||
serviceName string
|
|
||||||
canDialInsecure bool
|
|
||||||
traceExporter agenttracepb.TraceService_ExportClient
|
|
||||||
metricsExporter agentmetricspb.MetricsService_ExportClient
|
|
||||||
nodeInfo *commonpb.Node
|
|
||||||
grpcClientConn *grpc.ClientConn
|
|
||||||
reconnectionPeriod time.Duration
|
|
||||||
resource *resourcepb.Resource
|
|
||||||
compressor string
|
|
||||||
headers map[string]string
|
|
||||||
|
|
||||||
startOnce sync.Once
|
|
||||||
stopCh chan bool
|
|
||||||
disconnectedCh chan bool
|
|
||||||
|
|
||||||
backgroundConnectionDoneCh chan bool
|
|
||||||
|
|
||||||
traceBundler *bundler.Bundler
|
|
||||||
|
|
||||||
// viewDataBundler is the bundler to enable conversion
|
|
||||||
// from OpenCensus-Go view.Data to metricspb.Metric.
|
|
||||||
// Please do not confuse it with metricsBundler!
|
|
||||||
viewDataBundler *bundler.Bundler
|
|
||||||
|
|
||||||
clientTransportCredentials credentials.TransportCredentials
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewExporter(opts ...ExporterOption) (*Exporter, error) {
|
|
||||||
exp, err := NewUnstartedExporter(opts...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if err := exp.Start(); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return exp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
const spanDataBufferSize = 300
|
|
||||||
|
|
||||||
func NewUnstartedExporter(opts ...ExporterOption) (*Exporter, error) {
|
|
||||||
e := new(Exporter)
|
|
||||||
for _, opt := range opts {
|
|
||||||
opt.withExporter(e)
|
|
||||||
}
|
|
||||||
traceBundler := bundler.NewBundler((*trace.SpanData)(nil), func(bundle interface{}) {
|
|
||||||
e.uploadTraces(bundle.([]*trace.SpanData))
|
|
||||||
})
|
|
||||||
traceBundler.DelayThreshold = 2 * time.Second
|
|
||||||
traceBundler.BundleCountThreshold = spanDataBufferSize
|
|
||||||
e.traceBundler = traceBundler
|
|
||||||
|
|
||||||
viewDataBundler := bundler.NewBundler((*view.Data)(nil), func(bundle interface{}) {
|
|
||||||
e.uploadViewData(bundle.([]*view.Data))
|
|
||||||
})
|
|
||||||
viewDataBundler.DelayThreshold = 2 * time.Second
|
|
||||||
viewDataBundler.BundleCountThreshold = 500 // TODO: (@odeke-em) make this configurable.
|
|
||||||
e.viewDataBundler = viewDataBundler
|
|
||||||
e.nodeInfo = NodeWithStartTime(e.serviceName)
|
|
||||||
e.resource = resourceProtoFromEnv()
|
|
||||||
|
|
||||||
return e, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
maxInitialConfigRetries = 10
|
|
||||||
maxInitialTracesRetries = 10
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
errAlreadyStarted = errors.New("already started")
|
|
||||||
errNotStarted = errors.New("not started")
|
|
||||||
errStopped = errors.New("stopped")
|
|
||||||
errNoConnection = errors.New("no active connection")
|
|
||||||
)
|
|
||||||
|
|
||||||
// Start dials to the agent, establishing a connection to it. It also
|
|
||||||
// initiates the Config and Trace services by sending over the initial
|
|
||||||
// messages that consist of the node identifier. Start invokes a background
|
|
||||||
// connector that will reattempt connections to the agent periodically
|
|
||||||
// if the connection dies.
|
|
||||||
func (ae *Exporter) Start() error {
|
|
||||||
var err = errAlreadyStarted
|
|
||||||
ae.startOnce.Do(func() {
|
|
||||||
ae.mu.Lock()
|
|
||||||
defer ae.mu.Unlock()
|
|
||||||
|
|
||||||
ae.started = true
|
|
||||||
ae.disconnectedCh = make(chan bool, 1)
|
|
||||||
ae.stopCh = make(chan bool)
|
|
||||||
ae.backgroundConnectionDoneCh = make(chan bool)
|
|
||||||
|
|
||||||
ae.setStateDisconnected()
|
|
||||||
go ae.indefiniteBackgroundConnection()
|
|
||||||
|
|
||||||
err = nil
|
|
||||||
})
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ae *Exporter) prepareAgentAddress() string {
|
|
||||||
if ae.agentAddress != "" {
|
|
||||||
return ae.agentAddress
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("%s:%d", DefaultAgentHost, DefaultAgentPort)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ae *Exporter) enableConnectionStreams(cc *grpc.ClientConn) error {
|
|
||||||
ae.mu.RLock()
|
|
||||||
started := ae.started
|
|
||||||
nodeInfo := ae.nodeInfo
|
|
||||||
ae.mu.RUnlock()
|
|
||||||
|
|
||||||
if !started {
|
|
||||||
return errNotStarted
|
|
||||||
}
|
|
||||||
|
|
||||||
ae.mu.Lock()
|
|
||||||
// If the previous clientConn was non-nil, close it
|
|
||||||
if ae.grpcClientConn != nil {
|
|
||||||
_ = ae.grpcClientConn.Close()
|
|
||||||
}
|
|
||||||
ae.grpcClientConn = cc
|
|
||||||
ae.mu.Unlock()
|
|
||||||
|
|
||||||
if err := ae.createTraceServiceConnection(ae.grpcClientConn, nodeInfo); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return ae.createMetricsServiceConnection(ae.grpcClientConn, nodeInfo)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ae *Exporter) createTraceServiceConnection(cc *grpc.ClientConn, node *commonpb.Node) error {
|
|
||||||
// Initiate the trace service by sending over node identifier info.
|
|
||||||
traceSvcClient := agenttracepb.NewTraceServiceClient(cc)
|
|
||||||
ctx := context.Background()
|
|
||||||
if len(ae.headers) > 0 {
|
|
||||||
ctx = metadata.NewOutgoingContext(ctx, metadata.New(ae.headers))
|
|
||||||
}
|
|
||||||
traceExporter, err := traceSvcClient.Export(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("Exporter.Start:: TraceServiceClient: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
firstTraceMessage := &agenttracepb.ExportTraceServiceRequest{
|
|
||||||
Node: node,
|
|
||||||
Resource: ae.resource,
|
|
||||||
}
|
|
||||||
if err := traceExporter.Send(firstTraceMessage); err != nil {
|
|
||||||
return fmt.Errorf("Exporter.Start:: Failed to initiate the Config service: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
ae.mu.Lock()
|
|
||||||
ae.traceExporter = traceExporter
|
|
||||||
ae.mu.Unlock()
|
|
||||||
|
|
||||||
// Initiate the config service by sending over node identifier info.
|
|
||||||
configStream, err := traceSvcClient.Config(context.Background())
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("Exporter.Start:: ConfigStream: %v", err)
|
|
||||||
}
|
|
||||||
firstCfgMessage := &agenttracepb.CurrentLibraryConfig{Node: node}
|
|
||||||
if err := configStream.Send(firstCfgMessage); err != nil {
|
|
||||||
return fmt.Errorf("Exporter.Start:: Failed to initiate the Config service: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// In the background, handle trace configurations that are beamed down
|
|
||||||
// by the agent, but also reply to it with the applied configuration.
|
|
||||||
go ae.handleConfigStreaming(configStream)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ae *Exporter) createMetricsServiceConnection(cc *grpc.ClientConn, node *commonpb.Node) error {
|
|
||||||
metricsSvcClient := agentmetricspb.NewMetricsServiceClient(cc)
|
|
||||||
metricsExporter, err := metricsSvcClient.Export(context.Background())
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("MetricsExporter: failed to start the service client: %v", err)
|
|
||||||
}
|
|
||||||
// Initiate the metrics service by sending over the first message just containing the Node and Resource.
|
|
||||||
firstMetricsMessage := &agentmetricspb.ExportMetricsServiceRequest{
|
|
||||||
Node: node,
|
|
||||||
Resource: ae.resource,
|
|
||||||
}
|
|
||||||
if err := metricsExporter.Send(firstMetricsMessage); err != nil {
|
|
||||||
return fmt.Errorf("MetricsExporter:: failed to send the first message: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
ae.mu.Lock()
|
|
||||||
ae.metricsExporter = metricsExporter
|
|
||||||
ae.mu.Unlock()
|
|
||||||
|
|
||||||
// With that we are good to go and can start sending metrics
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ae *Exporter) dialToAgent() (*grpc.ClientConn, error) {
|
|
||||||
addr := ae.prepareAgentAddress()
|
|
||||||
var dialOpts []grpc.DialOption
|
|
||||||
if ae.clientTransportCredentials != nil {
|
|
||||||
dialOpts = append(dialOpts, grpc.WithTransportCredentials(ae.clientTransportCredentials))
|
|
||||||
} else if ae.canDialInsecure {
|
|
||||||
dialOpts = append(dialOpts, grpc.WithInsecure())
|
|
||||||
}
|
|
||||||
if ae.compressor != "" {
|
|
||||||
dialOpts = append(dialOpts, grpc.WithDefaultCallOptions(grpc.UseCompressor(ae.compressor)))
|
|
||||||
}
|
|
||||||
dialOpts = append(dialOpts, grpc.WithStatsHandler(&ocgrpc.ClientHandler{}))
|
|
||||||
|
|
||||||
ctx := context.Background()
|
|
||||||
if len(ae.headers) > 0 {
|
|
||||||
ctx = metadata.NewOutgoingContext(ctx, metadata.New(ae.headers))
|
|
||||||
}
|
|
||||||
return grpc.DialContext(ctx, addr, dialOpts...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ae *Exporter) handleConfigStreaming(configStream agenttracepb.TraceService_ConfigClient) error {
|
|
||||||
// Note: We haven't yet implemented configuration sending so we
|
|
||||||
// should NOT be changing connection states within this function for now.
|
|
||||||
for {
|
|
||||||
recv, err := configStream.Recv()
|
|
||||||
if err != nil {
|
|
||||||
// TODO: Check if this is a transient error or exponential backoff-able.
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
cfg := recv.Config
|
|
||||||
if cfg == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise now apply the trace configuration sent down from the agent
|
|
||||||
if psamp := cfg.GetProbabilitySampler(); psamp != nil {
|
|
||||||
trace.ApplyConfig(trace.Config{DefaultSampler: trace.ProbabilitySampler(psamp.SamplingProbability)})
|
|
||||||
} else if csamp := cfg.GetConstantSampler(); csamp != nil {
|
|
||||||
alwaysSample := csamp.Decision == tracepb.ConstantSampler_ALWAYS_ON
|
|
||||||
if alwaysSample {
|
|
||||||
trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()})
|
|
||||||
} else {
|
|
||||||
trace.ApplyConfig(trace.Config{DefaultSampler: trace.NeverSample()})
|
|
||||||
}
|
|
||||||
} else { // TODO: Add the rate limiting sampler here
|
|
||||||
}
|
|
||||||
|
|
||||||
// Then finally send back to upstream the newly applied configuration
|
|
||||||
err = configStream.Send(&agenttracepb.CurrentLibraryConfig{Config: &tracepb.TraceConfig{Sampler: cfg.Sampler}})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stop shuts down all the connections and resources
|
|
||||||
// related to the exporter.
|
|
||||||
func (ae *Exporter) Stop() error {
|
|
||||||
ae.mu.RLock()
|
|
||||||
cc := ae.grpcClientConn
|
|
||||||
started := ae.started
|
|
||||||
stopped := ae.stopped
|
|
||||||
ae.mu.RUnlock()
|
|
||||||
|
|
||||||
if !started {
|
|
||||||
return errNotStarted
|
|
||||||
}
|
|
||||||
if stopped {
|
|
||||||
// TODO: tell the user that we've already stopped, so perhaps a sentinel error?
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
ae.Flush()
|
|
||||||
|
|
||||||
// Now close the underlying gRPC connection.
|
|
||||||
var err error
|
|
||||||
if cc != nil {
|
|
||||||
err = cc.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
// At this point we can change the state variables: started and stopped
|
|
||||||
ae.mu.Lock()
|
|
||||||
ae.started = false
|
|
||||||
ae.stopped = true
|
|
||||||
ae.mu.Unlock()
|
|
||||||
close(ae.stopCh)
|
|
||||||
|
|
||||||
// Ensure that the backgroundConnector returns
|
|
||||||
<-ae.backgroundConnectionDoneCh
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ae *Exporter) ExportSpan(sd *trace.SpanData) {
|
|
||||||
if sd == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_ = ae.traceBundler.Add(sd, 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ae *Exporter) ExportTraceServiceRequest(batch *agenttracepb.ExportTraceServiceRequest) error {
|
|
||||||
if batch == nil || len(batch.Spans) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
select {
|
|
||||||
case <-ae.stopCh:
|
|
||||||
return errStopped
|
|
||||||
|
|
||||||
default:
|
|
||||||
if !ae.connected() {
|
|
||||||
return errNoConnection
|
|
||||||
}
|
|
||||||
|
|
||||||
ae.senderMu.Lock()
|
|
||||||
err := ae.traceExporter.Send(batch)
|
|
||||||
ae.senderMu.Unlock()
|
|
||||||
if err != nil {
|
|
||||||
ae.setStateDisconnected()
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ae *Exporter) ExportView(vd *view.Data) {
|
|
||||||
if vd == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_ = ae.viewDataBundler.Add(vd, 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func ocSpanDataToPbSpans(sdl []*trace.SpanData) []*tracepb.Span {
|
|
||||||
if len(sdl) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
protoSpans := make([]*tracepb.Span, 0, len(sdl))
|
|
||||||
for _, sd := range sdl {
|
|
||||||
if sd != nil {
|
|
||||||
protoSpans = append(protoSpans, ocSpanToProtoSpan(sd))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return protoSpans
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ae *Exporter) uploadTraces(sdl []*trace.SpanData) {
|
|
||||||
select {
|
|
||||||
case <-ae.stopCh:
|
|
||||||
return
|
|
||||||
|
|
||||||
default:
|
|
||||||
if !ae.connected() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
protoSpans := ocSpanDataToPbSpans(sdl)
|
|
||||||
if len(protoSpans) == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
ae.senderMu.Lock()
|
|
||||||
err := ae.traceExporter.Send(&agenttracepb.ExportTraceServiceRequest{
|
|
||||||
Spans: protoSpans,
|
|
||||||
})
|
|
||||||
ae.senderMu.Unlock()
|
|
||||||
if err != nil {
|
|
||||||
ae.setStateDisconnected()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ocViewDataToPbMetrics(vdl []*view.Data) []*metricspb.Metric {
|
|
||||||
if len(vdl) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
metrics := make([]*metricspb.Metric, 0, len(vdl))
|
|
||||||
for _, vd := range vdl {
|
|
||||||
if vd != nil {
|
|
||||||
vmetric, err := viewDataToMetric(vd)
|
|
||||||
// TODO: (@odeke-em) somehow report this error, if it is non-nil.
|
|
||||||
if err == nil && vmetric != nil {
|
|
||||||
metrics = append(metrics, vmetric)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return metrics
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ae *Exporter) uploadViewData(vdl []*view.Data) {
|
|
||||||
select {
|
|
||||||
case <-ae.stopCh:
|
|
||||||
return
|
|
||||||
|
|
||||||
default:
|
|
||||||
if !ae.connected() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
protoMetrics := ocViewDataToPbMetrics(vdl)
|
|
||||||
if len(protoMetrics) == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err := ae.metricsExporter.Send(&agentmetricspb.ExportMetricsServiceRequest{
|
|
||||||
Metrics: protoMetrics,
|
|
||||||
// TODO:(@odeke-em)
|
|
||||||
// a) Figure out how to derive a Node from the environment
|
|
||||||
// b) Figure out how to derive a Resource from the environment
|
|
||||||
// or better letting users of the exporter configure it.
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
ae.setStateDisconnected()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ae *Exporter) Flush() {
|
|
||||||
ae.traceBundler.Flush()
|
|
||||||
ae.viewDataBundler.Flush()
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceProtoFromEnv() *resourcepb.Resource {
|
|
||||||
rs, _ := resource.FromEnv(context.Background())
|
|
||||||
if rs == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
rprs := &resourcepb.Resource{
|
|
||||||
Type: rs.Type,
|
|
||||||
}
|
|
||||||
if rs.Labels != nil {
|
|
||||||
rprs.Labels = make(map[string]string)
|
|
||||||
for k, v := range rs.Labels {
|
|
||||||
rprs.Labels[k] = v
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return rprs
|
|
||||||
}
|
|
||||||
128
vendor/contrib.go.opencensus.io/exporter/ocagent/options.go
generated
vendored
128
vendor/contrib.go.opencensus.io/exporter/ocagent/options.go
generated
vendored
@@ -1,128 +0,0 @@
|
|||||||
// Copyright 2018, OpenCensus Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package ocagent
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"google.golang.org/grpc/credentials"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
DefaultAgentPort uint16 = 55678
|
|
||||||
DefaultAgentHost string = "localhost"
|
|
||||||
)
|
|
||||||
|
|
||||||
type ExporterOption interface {
|
|
||||||
withExporter(e *Exporter)
|
|
||||||
}
|
|
||||||
|
|
||||||
type insecureGrpcConnection int
|
|
||||||
|
|
||||||
var _ ExporterOption = (*insecureGrpcConnection)(nil)
|
|
||||||
|
|
||||||
func (igc *insecureGrpcConnection) withExporter(e *Exporter) {
|
|
||||||
e.canDialInsecure = true
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithInsecure disables client transport security for the exporter's gRPC connection
|
|
||||||
// just like grpc.WithInsecure() https://godoc.org/google.golang.org/grpc#WithInsecure
|
|
||||||
// does. Note, by default, client security is required unless WithInsecure is used.
|
|
||||||
func WithInsecure() ExporterOption { return new(insecureGrpcConnection) }
|
|
||||||
|
|
||||||
type addressSetter string
|
|
||||||
|
|
||||||
func (as addressSetter) withExporter(e *Exporter) {
|
|
||||||
e.agentAddress = string(as)
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ ExporterOption = (*addressSetter)(nil)
|
|
||||||
|
|
||||||
// WithAddress allows one to set the address that the exporter will
|
|
||||||
// connect to the agent on. If unset, it will instead try to use
|
|
||||||
// connect to DefaultAgentHost:DefaultAgentPort
|
|
||||||
func WithAddress(addr string) ExporterOption {
|
|
||||||
return addressSetter(addr)
|
|
||||||
}
|
|
||||||
|
|
||||||
type serviceNameSetter string
|
|
||||||
|
|
||||||
func (sns serviceNameSetter) withExporter(e *Exporter) {
|
|
||||||
e.serviceName = string(sns)
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ ExporterOption = (*serviceNameSetter)(nil)
|
|
||||||
|
|
||||||
// WithServiceName allows one to set/override the service name
|
|
||||||
// that the exporter will report to the agent.
|
|
||||||
func WithServiceName(serviceName string) ExporterOption {
|
|
||||||
return serviceNameSetter(serviceName)
|
|
||||||
}
|
|
||||||
|
|
||||||
type reconnectionPeriod time.Duration
|
|
||||||
|
|
||||||
func (rp reconnectionPeriod) withExporter(e *Exporter) {
|
|
||||||
e.reconnectionPeriod = time.Duration(rp)
|
|
||||||
}
|
|
||||||
|
|
||||||
func WithReconnectionPeriod(rp time.Duration) ExporterOption {
|
|
||||||
return reconnectionPeriod(rp)
|
|
||||||
}
|
|
||||||
|
|
||||||
type compressorSetter string
|
|
||||||
|
|
||||||
func (c compressorSetter) withExporter(e *Exporter) {
|
|
||||||
e.compressor = string(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UseCompressor will set the compressor for the gRPC client to use when sending requests.
|
|
||||||
// It is the responsibility of the caller to ensure that the compressor set has been registered
|
|
||||||
// with google.golang.org/grpc/encoding. This can be done by encoding.RegisterCompressor. Some
|
|
||||||
// compressors auto-register on import, such as gzip, which can be registered by calling
|
|
||||||
// `import _ "google.golang.org/grpc/encoding/gzip"`
|
|
||||||
func UseCompressor(compressorName string) ExporterOption {
|
|
||||||
return compressorSetter(compressorName)
|
|
||||||
}
|
|
||||||
|
|
||||||
type headerSetter map[string]string
|
|
||||||
|
|
||||||
func (h headerSetter) withExporter(e *Exporter) {
|
|
||||||
e.headers = map[string]string(h)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithHeaders will send the provided headers when the gRPC stream connection
|
|
||||||
// is instantiated
|
|
||||||
func WithHeaders(headers map[string]string) ExporterOption {
|
|
||||||
return headerSetter(headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
type clientCredentials struct {
|
|
||||||
credentials.TransportCredentials
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ ExporterOption = (*clientCredentials)(nil)
|
|
||||||
|
|
||||||
// WithTLSCredentials allows the connection to use TLS credentials
|
|
||||||
// when talking to the server. It takes in grpc.TransportCredentials instead
|
|
||||||
// of say a Certificate file or a tls.Certificate, because the retrieving
|
|
||||||
// these credentials can be done in many ways e.g. plain file, in code tls.Config
|
|
||||||
// or by certificate rotation, so it is up to the caller to decide what to use.
|
|
||||||
func WithTLSCredentials(creds credentials.TransportCredentials) ExporterOption {
|
|
||||||
return &clientCredentials{TransportCredentials: creds}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cc *clientCredentials) withExporter(e *Exporter) {
|
|
||||||
e.clientTransportCredentials = cc.TransportCredentials
|
|
||||||
}
|
|
||||||
248
vendor/contrib.go.opencensus.io/exporter/ocagent/transform_spans.go
generated
vendored
248
vendor/contrib.go.opencensus.io/exporter/ocagent/transform_spans.go
generated
vendored
@@ -1,248 +0,0 @@
|
|||||||
// Copyright 2018, OpenCensus Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package ocagent
|
|
||||||
|
|
||||||
import (
|
|
||||||
"math"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"go.opencensus.io/trace"
|
|
||||||
"go.opencensus.io/trace/tracestate"
|
|
||||||
|
|
||||||
tracepb "github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1"
|
|
||||||
"github.com/golang/protobuf/ptypes/timestamp"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
maxAnnotationEventsPerSpan = 32
|
|
||||||
maxMessageEventsPerSpan = 128
|
|
||||||
)
|
|
||||||
|
|
||||||
func ocSpanToProtoSpan(sd *trace.SpanData) *tracepb.Span {
|
|
||||||
if sd == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
var namePtr *tracepb.TruncatableString
|
|
||||||
if sd.Name != "" {
|
|
||||||
namePtr = &tracepb.TruncatableString{Value: sd.Name}
|
|
||||||
}
|
|
||||||
return &tracepb.Span{
|
|
||||||
TraceId: sd.TraceID[:],
|
|
||||||
SpanId: sd.SpanID[:],
|
|
||||||
ParentSpanId: sd.ParentSpanID[:],
|
|
||||||
Status: ocStatusToProtoStatus(sd.Status),
|
|
||||||
StartTime: timeToTimestamp(sd.StartTime),
|
|
||||||
EndTime: timeToTimestamp(sd.EndTime),
|
|
||||||
Links: ocLinksToProtoLinks(sd.Links),
|
|
||||||
Kind: ocSpanKindToProtoSpanKind(sd.SpanKind),
|
|
||||||
Name: namePtr,
|
|
||||||
Attributes: ocAttributesToProtoAttributes(sd.Attributes),
|
|
||||||
TimeEvents: ocTimeEventsToProtoTimeEvents(sd.Annotations, sd.MessageEvents),
|
|
||||||
Tracestate: ocTracestateToProtoTracestate(sd.Tracestate),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var blankStatus trace.Status
|
|
||||||
|
|
||||||
func ocStatusToProtoStatus(status trace.Status) *tracepb.Status {
|
|
||||||
if status == blankStatus {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &tracepb.Status{
|
|
||||||
Code: status.Code,
|
|
||||||
Message: status.Message,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ocLinksToProtoLinks(links []trace.Link) *tracepb.Span_Links {
|
|
||||||
if len(links) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
sl := make([]*tracepb.Span_Link, 0, len(links))
|
|
||||||
for _, ocLink := range links {
|
|
||||||
// This redefinition is necessary to prevent ocLink.*ID[:] copies
|
|
||||||
// being reused -- in short we need a new ocLink per iteration.
|
|
||||||
ocLink := ocLink
|
|
||||||
|
|
||||||
sl = append(sl, &tracepb.Span_Link{
|
|
||||||
TraceId: ocLink.TraceID[:],
|
|
||||||
SpanId: ocLink.SpanID[:],
|
|
||||||
Type: ocLinkTypeToProtoLinkType(ocLink.Type),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return &tracepb.Span_Links{
|
|
||||||
Link: sl,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ocLinkTypeToProtoLinkType(oct trace.LinkType) tracepb.Span_Link_Type {
|
|
||||||
switch oct {
|
|
||||||
case trace.LinkTypeChild:
|
|
||||||
return tracepb.Span_Link_CHILD_LINKED_SPAN
|
|
||||||
case trace.LinkTypeParent:
|
|
||||||
return tracepb.Span_Link_PARENT_LINKED_SPAN
|
|
||||||
default:
|
|
||||||
return tracepb.Span_Link_TYPE_UNSPECIFIED
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ocAttributesToProtoAttributes(attrs map[string]interface{}) *tracepb.Span_Attributes {
|
|
||||||
if len(attrs) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
outMap := make(map[string]*tracepb.AttributeValue)
|
|
||||||
for k, v := range attrs {
|
|
||||||
switch v := v.(type) {
|
|
||||||
case bool:
|
|
||||||
outMap[k] = &tracepb.AttributeValue{Value: &tracepb.AttributeValue_BoolValue{BoolValue: v}}
|
|
||||||
|
|
||||||
case int:
|
|
||||||
outMap[k] = &tracepb.AttributeValue{Value: &tracepb.AttributeValue_IntValue{IntValue: int64(v)}}
|
|
||||||
|
|
||||||
case int64:
|
|
||||||
outMap[k] = &tracepb.AttributeValue{Value: &tracepb.AttributeValue_IntValue{IntValue: v}}
|
|
||||||
|
|
||||||
case string:
|
|
||||||
outMap[k] = &tracepb.AttributeValue{
|
|
||||||
Value: &tracepb.AttributeValue_StringValue{
|
|
||||||
StringValue: &tracepb.TruncatableString{Value: v},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return &tracepb.Span_Attributes{
|
|
||||||
AttributeMap: outMap,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This code is mostly copied from
|
|
||||||
// https://github.com/census-ecosystem/opencensus-go-exporter-stackdriver/blob/master/trace_proto.go#L46
|
|
||||||
func ocTimeEventsToProtoTimeEvents(as []trace.Annotation, es []trace.MessageEvent) *tracepb.Span_TimeEvents {
|
|
||||||
if len(as) == 0 && len(es) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
timeEvents := &tracepb.Span_TimeEvents{}
|
|
||||||
var annotations, droppedAnnotationsCount int
|
|
||||||
var messageEvents, droppedMessageEventsCount int
|
|
||||||
|
|
||||||
// Transform annotations
|
|
||||||
for i, a := range as {
|
|
||||||
if annotations >= maxAnnotationEventsPerSpan {
|
|
||||||
droppedAnnotationsCount = len(as) - i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
annotations++
|
|
||||||
timeEvents.TimeEvent = append(timeEvents.TimeEvent,
|
|
||||||
&tracepb.Span_TimeEvent{
|
|
||||||
Time: timeToTimestamp(a.Time),
|
|
||||||
Value: transformAnnotationToTimeEvent(&a),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transform message events
|
|
||||||
for i, e := range es {
|
|
||||||
if messageEvents >= maxMessageEventsPerSpan {
|
|
||||||
droppedMessageEventsCount = len(es) - i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
messageEvents++
|
|
||||||
timeEvents.TimeEvent = append(timeEvents.TimeEvent,
|
|
||||||
&tracepb.Span_TimeEvent{
|
|
||||||
Time: timeToTimestamp(e.Time),
|
|
||||||
Value: transformMessageEventToTimeEvent(&e),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Process dropped counter
|
|
||||||
timeEvents.DroppedAnnotationsCount = clip32(droppedAnnotationsCount)
|
|
||||||
timeEvents.DroppedMessageEventsCount = clip32(droppedMessageEventsCount)
|
|
||||||
|
|
||||||
return timeEvents
|
|
||||||
}
|
|
||||||
|
|
||||||
func transformAnnotationToTimeEvent(a *trace.Annotation) *tracepb.Span_TimeEvent_Annotation_ {
|
|
||||||
return &tracepb.Span_TimeEvent_Annotation_{
|
|
||||||
Annotation: &tracepb.Span_TimeEvent_Annotation{
|
|
||||||
Description: &tracepb.TruncatableString{Value: a.Message},
|
|
||||||
Attributes: ocAttributesToProtoAttributes(a.Attributes),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func transformMessageEventToTimeEvent(e *trace.MessageEvent) *tracepb.Span_TimeEvent_MessageEvent_ {
|
|
||||||
return &tracepb.Span_TimeEvent_MessageEvent_{
|
|
||||||
MessageEvent: &tracepb.Span_TimeEvent_MessageEvent{
|
|
||||||
Type: tracepb.Span_TimeEvent_MessageEvent_Type(e.EventType),
|
|
||||||
Id: uint64(e.MessageID),
|
|
||||||
UncompressedSize: uint64(e.UncompressedByteSize),
|
|
||||||
CompressedSize: uint64(e.CompressedByteSize),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// clip32 clips an int to the range of an int32.
|
|
||||||
func clip32(x int) int32 {
|
|
||||||
if x < math.MinInt32 {
|
|
||||||
return math.MinInt32
|
|
||||||
}
|
|
||||||
if x > math.MaxInt32 {
|
|
||||||
return math.MaxInt32
|
|
||||||
}
|
|
||||||
return int32(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
func timeToTimestamp(t time.Time) *timestamp.Timestamp {
|
|
||||||
nanoTime := t.UnixNano()
|
|
||||||
return ×tamp.Timestamp{
|
|
||||||
Seconds: nanoTime / 1e9,
|
|
||||||
Nanos: int32(nanoTime % 1e9),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ocSpanKindToProtoSpanKind(kind int) tracepb.Span_SpanKind {
|
|
||||||
switch kind {
|
|
||||||
case trace.SpanKindClient:
|
|
||||||
return tracepb.Span_CLIENT
|
|
||||||
case trace.SpanKindServer:
|
|
||||||
return tracepb.Span_SERVER
|
|
||||||
default:
|
|
||||||
return tracepb.Span_SPAN_KIND_UNSPECIFIED
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ocTracestateToProtoTracestate(ts *tracestate.Tracestate) *tracepb.Span_Tracestate {
|
|
||||||
if ts == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &tracepb.Span_Tracestate{
|
|
||||||
Entries: ocTracestateEntriesToProtoTracestateEntries(ts.Entries()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ocTracestateEntriesToProtoTracestateEntries(entries []tracestate.Entry) []*tracepb.Span_Tracestate_Entry {
|
|
||||||
protoEntries := make([]*tracepb.Span_Tracestate_Entry, 0, len(entries))
|
|
||||||
for _, entry := range entries {
|
|
||||||
protoEntries = append(protoEntries, &tracepb.Span_Tracestate_Entry{
|
|
||||||
Key: entry.Key,
|
|
||||||
Value: entry.Value,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return protoEntries
|
|
||||||
}
|
|
||||||
274
vendor/contrib.go.opencensus.io/exporter/ocagent/transform_stats_to_metrics.go
generated
vendored
274
vendor/contrib.go.opencensus.io/exporter/ocagent/transform_stats_to_metrics.go
generated
vendored
@@ -1,274 +0,0 @@
|
|||||||
// Copyright 2018, OpenCensus Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package ocagent
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"go.opencensus.io/stats"
|
|
||||||
"go.opencensus.io/stats/view"
|
|
||||||
"go.opencensus.io/tag"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/ptypes/timestamp"
|
|
||||||
|
|
||||||
metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
errNilMeasure = errors.New("expecting a non-nil stats.Measure")
|
|
||||||
errNilView = errors.New("expecting a non-nil view.View")
|
|
||||||
errNilViewData = errors.New("expecting a non-nil view.Data")
|
|
||||||
)
|
|
||||||
|
|
||||||
func viewDataToMetric(vd *view.Data) (*metricspb.Metric, error) {
|
|
||||||
if vd == nil {
|
|
||||||
return nil, errNilViewData
|
|
||||||
}
|
|
||||||
|
|
||||||
descriptor, err := viewToMetricDescriptor(vd.View)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
timeseries, err := viewDataToTimeseries(vd)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
metric := &metricspb.Metric{
|
|
||||||
MetricDescriptor: descriptor,
|
|
||||||
Timeseries: timeseries,
|
|
||||||
}
|
|
||||||
return metric, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func viewToMetricDescriptor(v *view.View) (*metricspb.MetricDescriptor, error) {
|
|
||||||
if v == nil {
|
|
||||||
return nil, errNilView
|
|
||||||
}
|
|
||||||
if v.Measure == nil {
|
|
||||||
return nil, errNilMeasure
|
|
||||||
}
|
|
||||||
|
|
||||||
desc := &metricspb.MetricDescriptor{
|
|
||||||
Name: stringOrCall(v.Name, v.Measure.Name),
|
|
||||||
Description: stringOrCall(v.Description, v.Measure.Description),
|
|
||||||
Unit: v.Measure.Unit(),
|
|
||||||
Type: aggregationToMetricDescriptorType(v),
|
|
||||||
LabelKeys: tagKeysToLabelKeys(v.TagKeys),
|
|
||||||
}
|
|
||||||
return desc, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func stringOrCall(first string, call func() string) string {
|
|
||||||
if first != "" {
|
|
||||||
return first
|
|
||||||
}
|
|
||||||
return call()
|
|
||||||
}
|
|
||||||
|
|
||||||
type measureType uint
|
|
||||||
|
|
||||||
const (
|
|
||||||
measureUnknown measureType = iota
|
|
||||||
measureInt64
|
|
||||||
measureFloat64
|
|
||||||
)
|
|
||||||
|
|
||||||
func measureTypeFromMeasure(m stats.Measure) measureType {
|
|
||||||
switch m.(type) {
|
|
||||||
default:
|
|
||||||
return measureUnknown
|
|
||||||
case *stats.Float64Measure:
|
|
||||||
return measureFloat64
|
|
||||||
case *stats.Int64Measure:
|
|
||||||
return measureInt64
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func aggregationToMetricDescriptorType(v *view.View) metricspb.MetricDescriptor_Type {
|
|
||||||
if v == nil || v.Aggregation == nil {
|
|
||||||
return metricspb.MetricDescriptor_UNSPECIFIED
|
|
||||||
}
|
|
||||||
if v.Measure == nil {
|
|
||||||
return metricspb.MetricDescriptor_UNSPECIFIED
|
|
||||||
}
|
|
||||||
|
|
||||||
switch v.Aggregation.Type {
|
|
||||||
case view.AggTypeCount:
|
|
||||||
// Cumulative on int64
|
|
||||||
return metricspb.MetricDescriptor_CUMULATIVE_INT64
|
|
||||||
|
|
||||||
case view.AggTypeDistribution:
|
|
||||||
// Cumulative types
|
|
||||||
return metricspb.MetricDescriptor_CUMULATIVE_DISTRIBUTION
|
|
||||||
|
|
||||||
case view.AggTypeLastValue:
|
|
||||||
// Gauge types
|
|
||||||
switch measureTypeFromMeasure(v.Measure) {
|
|
||||||
case measureFloat64:
|
|
||||||
return metricspb.MetricDescriptor_GAUGE_DOUBLE
|
|
||||||
case measureInt64:
|
|
||||||
return metricspb.MetricDescriptor_GAUGE_INT64
|
|
||||||
}
|
|
||||||
|
|
||||||
case view.AggTypeSum:
|
|
||||||
// Cumulative types
|
|
||||||
switch measureTypeFromMeasure(v.Measure) {
|
|
||||||
case measureFloat64:
|
|
||||||
return metricspb.MetricDescriptor_CUMULATIVE_DOUBLE
|
|
||||||
case measureInt64:
|
|
||||||
return metricspb.MetricDescriptor_CUMULATIVE_INT64
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// For all other cases, return unspecified.
|
|
||||||
return metricspb.MetricDescriptor_UNSPECIFIED
|
|
||||||
}
|
|
||||||
|
|
||||||
func tagKeysToLabelKeys(tagKeys []tag.Key) []*metricspb.LabelKey {
|
|
||||||
labelKeys := make([]*metricspb.LabelKey, 0, len(tagKeys))
|
|
||||||
for _, tagKey := range tagKeys {
|
|
||||||
labelKeys = append(labelKeys, &metricspb.LabelKey{
|
|
||||||
Key: tagKey.Name(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return labelKeys
|
|
||||||
}
|
|
||||||
|
|
||||||
func viewDataToTimeseries(vd *view.Data) ([]*metricspb.TimeSeries, error) {
|
|
||||||
if vd == nil || len(vd.Rows) == 0 {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Given that view.Data only contains Start, End
|
|
||||||
// the timestamps for all the row data will be the exact same
|
|
||||||
// per aggregation. However, the values will differ.
|
|
||||||
// Each row has its own tags.
|
|
||||||
startTimestamp := timeToProtoTimestamp(vd.Start)
|
|
||||||
endTimestamp := timeToProtoTimestamp(vd.End)
|
|
||||||
|
|
||||||
mType := measureTypeFromMeasure(vd.View.Measure)
|
|
||||||
timeseries := make([]*metricspb.TimeSeries, 0, len(vd.Rows))
|
|
||||||
// It is imperative that the ordering of "LabelValues" matches those
|
|
||||||
// of the Label keys in the metric descriptor.
|
|
||||||
for _, row := range vd.Rows {
|
|
||||||
labelValues := labelValuesFromTags(row.Tags)
|
|
||||||
point := rowToPoint(vd.View, row, endTimestamp, mType)
|
|
||||||
timeseries = append(timeseries, &metricspb.TimeSeries{
|
|
||||||
StartTimestamp: startTimestamp,
|
|
||||||
LabelValues: labelValues,
|
|
||||||
Points: []*metricspb.Point{point},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(timeseries) == 0 {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return timeseries, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func timeToProtoTimestamp(t time.Time) *timestamp.Timestamp {
|
|
||||||
unixNano := t.UnixNano()
|
|
||||||
return ×tamp.Timestamp{
|
|
||||||
Seconds: int64(unixNano / 1e9),
|
|
||||||
Nanos: int32(unixNano % 1e9),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func rowToPoint(v *view.View, row *view.Row, endTimestamp *timestamp.Timestamp, mType measureType) *metricspb.Point {
|
|
||||||
pt := &metricspb.Point{
|
|
||||||
Timestamp: endTimestamp,
|
|
||||||
}
|
|
||||||
|
|
||||||
switch data := row.Data.(type) {
|
|
||||||
case *view.CountData:
|
|
||||||
pt.Value = &metricspb.Point_Int64Value{Int64Value: data.Value}
|
|
||||||
|
|
||||||
case *view.DistributionData:
|
|
||||||
pt.Value = &metricspb.Point_DistributionValue{
|
|
||||||
DistributionValue: &metricspb.DistributionValue{
|
|
||||||
Count: data.Count,
|
|
||||||
Sum: float64(data.Count) * data.Mean, // because Mean := Sum/Count
|
|
||||||
// TODO: Add Exemplar
|
|
||||||
Buckets: bucketsToProtoBuckets(data.CountPerBucket),
|
|
||||||
BucketOptions: &metricspb.DistributionValue_BucketOptions{
|
|
||||||
Type: &metricspb.DistributionValue_BucketOptions_Explicit_{
|
|
||||||
Explicit: &metricspb.DistributionValue_BucketOptions_Explicit{
|
|
||||||
Bounds: v.Aggregation.Buckets,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
SumOfSquaredDeviation: data.SumOfSquaredDev,
|
|
||||||
}}
|
|
||||||
|
|
||||||
case *view.LastValueData:
|
|
||||||
setPointValue(pt, data.Value, mType)
|
|
||||||
|
|
||||||
case *view.SumData:
|
|
||||||
setPointValue(pt, data.Value, mType)
|
|
||||||
}
|
|
||||||
|
|
||||||
return pt
|
|
||||||
}
|
|
||||||
|
|
||||||
// Not returning anything from this function because metricspb.Point.is_Value is an unexported
|
|
||||||
// interface hence we just have to set its value by pointer.
|
|
||||||
func setPointValue(pt *metricspb.Point, value float64, mType measureType) {
|
|
||||||
if mType == measureInt64 {
|
|
||||||
pt.Value = &metricspb.Point_Int64Value{Int64Value: int64(value)}
|
|
||||||
} else {
|
|
||||||
pt.Value = &metricspb.Point_DoubleValue{DoubleValue: value}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func bucketsToProtoBuckets(countPerBucket []int64) []*metricspb.DistributionValue_Bucket {
|
|
||||||
distBuckets := make([]*metricspb.DistributionValue_Bucket, len(countPerBucket))
|
|
||||||
for i := 0; i < len(countPerBucket); i++ {
|
|
||||||
count := countPerBucket[i]
|
|
||||||
|
|
||||||
distBuckets[i] = &metricspb.DistributionValue_Bucket{
|
|
||||||
Count: count,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return distBuckets
|
|
||||||
}
|
|
||||||
|
|
||||||
func labelValuesFromTags(tags []tag.Tag) []*metricspb.LabelValue {
|
|
||||||
if len(tags) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
labelValues := make([]*metricspb.LabelValue, 0, len(tags))
|
|
||||||
for _, tag_ := range tags {
|
|
||||||
labelValues = append(labelValues, &metricspb.LabelValue{
|
|
||||||
Value: tag_.Value,
|
|
||||||
|
|
||||||
// It is imperative that we set the "HasValue" attribute,
|
|
||||||
// in order to distinguish missing a label from the empty string.
|
|
||||||
// https://godoc.org/github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1#LabelValue.HasValue
|
|
||||||
//
|
|
||||||
// OpenCensus-Go uses non-pointers for tags as seen by this function's arguments,
|
|
||||||
// so the best case that we can use to distinguish missing labels/tags from the
|
|
||||||
// empty string is by checking if the Tag.Key.Name() != "" to indicate that we have
|
|
||||||
// a value.
|
|
||||||
HasValue: tag_.Key.Name() != "",
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return labelValues
|
|
||||||
}
|
|
||||||
17
vendor/contrib.go.opencensus.io/exporter/ocagent/version.go
generated
vendored
17
vendor/contrib.go.opencensus.io/exporter/ocagent/version.go
generated
vendored
@@ -1,17 +0,0 @@
|
|||||||
// Copyright 2018, OpenCensus Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package ocagent
|
|
||||||
|
|
||||||
const Version = "0.0.1"
|
|
||||||
@@ -103,8 +103,8 @@ func (client AvailabilitySetsClient) CreateOrUpdatePreparer(ctx context.Context,
|
|||||||
// CreateOrUpdateSender sends the CreateOrUpdate request. The method will close the
|
// CreateOrUpdateSender sends the CreateOrUpdate request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client AvailabilitySetsClient) CreateOrUpdateSender(req *http.Request) (*http.Response, error) {
|
func (client AvailabilitySetsClient) CreateOrUpdateSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateOrUpdateResponder handles the response to the CreateOrUpdate request. The method always
|
// CreateOrUpdateResponder handles the response to the CreateOrUpdate request. The method always
|
||||||
@@ -180,8 +180,8 @@ func (client AvailabilitySetsClient) DeletePreparer(ctx context.Context, resourc
|
|||||||
// DeleteSender sends the Delete request. The method will close the
|
// DeleteSender sends the Delete request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client AvailabilitySetsClient) DeleteSender(req *http.Request) (*http.Response, error) {
|
func (client AvailabilitySetsClient) DeleteSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteResponder handles the response to the Delete request. The method always
|
// DeleteResponder handles the response to the Delete request. The method always
|
||||||
@@ -257,8 +257,8 @@ func (client AvailabilitySetsClient) GetPreparer(ctx context.Context, resourceGr
|
|||||||
// GetSender sends the Get request. The method will close the
|
// GetSender sends the Get request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client AvailabilitySetsClient) GetSender(req *http.Request) (*http.Response, error) {
|
func (client AvailabilitySetsClient) GetSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetResponder handles the response to the Get request. The method always
|
// GetResponder handles the response to the Get request. The method always
|
||||||
@@ -333,8 +333,8 @@ func (client AvailabilitySetsClient) ListPreparer(ctx context.Context, resourceG
|
|||||||
// ListSender sends the List request. The method will close the
|
// ListSender sends the List request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client AvailabilitySetsClient) ListSender(req *http.Request) (*http.Response, error) {
|
func (client AvailabilitySetsClient) ListSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListResponder handles the response to the List request. The method always
|
// ListResponder handles the response to the List request. The method always
|
||||||
@@ -448,8 +448,8 @@ func (client AvailabilitySetsClient) ListAvailableSizesPreparer(ctx context.Cont
|
|||||||
// ListAvailableSizesSender sends the ListAvailableSizes request. The method will close the
|
// ListAvailableSizesSender sends the ListAvailableSizes request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client AvailabilitySetsClient) ListAvailableSizesSender(req *http.Request) (*http.Response, error) {
|
func (client AvailabilitySetsClient) ListAvailableSizesSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListAvailableSizesResponder handles the response to the ListAvailableSizes request. The method always
|
// ListAvailableSizesResponder handles the response to the ListAvailableSizes request. The method always
|
||||||
@@ -466,7 +466,9 @@ func (client AvailabilitySetsClient) ListAvailableSizesResponder(resp *http.Resp
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ListBySubscription lists all availability sets in a subscription.
|
// ListBySubscription lists all availability sets in a subscription.
|
||||||
func (client AvailabilitySetsClient) ListBySubscription(ctx context.Context) (result AvailabilitySetListResultPage, err error) {
|
// Parameters:
|
||||||
|
// expand - the expand expression to apply to the operation.
|
||||||
|
func (client AvailabilitySetsClient) ListBySubscription(ctx context.Context, expand string) (result AvailabilitySetListResultPage, err error) {
|
||||||
if tracing.IsEnabled() {
|
if tracing.IsEnabled() {
|
||||||
ctx = tracing.StartSpan(ctx, fqdn+"/AvailabilitySetsClient.ListBySubscription")
|
ctx = tracing.StartSpan(ctx, fqdn+"/AvailabilitySetsClient.ListBySubscription")
|
||||||
defer func() {
|
defer func() {
|
||||||
@@ -478,7 +480,7 @@ func (client AvailabilitySetsClient) ListBySubscription(ctx context.Context) (re
|
|||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
result.fn = client.listBySubscriptionNextResults
|
result.fn = client.listBySubscriptionNextResults
|
||||||
req, err := client.ListBySubscriptionPreparer(ctx)
|
req, err := client.ListBySubscriptionPreparer(ctx, expand)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = autorest.NewErrorWithError(err, "compute.AvailabilitySetsClient", "ListBySubscription", nil, "Failure preparing request")
|
err = autorest.NewErrorWithError(err, "compute.AvailabilitySetsClient", "ListBySubscription", nil, "Failure preparing request")
|
||||||
return
|
return
|
||||||
@@ -500,7 +502,7 @@ func (client AvailabilitySetsClient) ListBySubscription(ctx context.Context) (re
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ListBySubscriptionPreparer prepares the ListBySubscription request.
|
// ListBySubscriptionPreparer prepares the ListBySubscription request.
|
||||||
func (client AvailabilitySetsClient) ListBySubscriptionPreparer(ctx context.Context) (*http.Request, error) {
|
func (client AvailabilitySetsClient) ListBySubscriptionPreparer(ctx context.Context, expand string) (*http.Request, error) {
|
||||||
pathParameters := map[string]interface{}{
|
pathParameters := map[string]interface{}{
|
||||||
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
}
|
}
|
||||||
@@ -509,6 +511,9 @@ func (client AvailabilitySetsClient) ListBySubscriptionPreparer(ctx context.Cont
|
|||||||
queryParameters := map[string]interface{}{
|
queryParameters := map[string]interface{}{
|
||||||
"api-version": APIVersion,
|
"api-version": APIVersion,
|
||||||
}
|
}
|
||||||
|
if len(expand) > 0 {
|
||||||
|
queryParameters["$expand"] = autorest.Encode("query", expand)
|
||||||
|
}
|
||||||
|
|
||||||
preparer := autorest.CreatePreparer(
|
preparer := autorest.CreatePreparer(
|
||||||
autorest.AsGet(),
|
autorest.AsGet(),
|
||||||
@@ -521,8 +526,8 @@ func (client AvailabilitySetsClient) ListBySubscriptionPreparer(ctx context.Cont
|
|||||||
// ListBySubscriptionSender sends the ListBySubscription request. The method will close the
|
// ListBySubscriptionSender sends the ListBySubscription request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client AvailabilitySetsClient) ListBySubscriptionSender(req *http.Request) (*http.Response, error) {
|
func (client AvailabilitySetsClient) ListBySubscriptionSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListBySubscriptionResponder handles the response to the ListBySubscription request. The method always
|
// ListBySubscriptionResponder handles the response to the ListBySubscription request. The method always
|
||||||
@@ -560,7 +565,7 @@ func (client AvailabilitySetsClient) listBySubscriptionNextResults(ctx context.C
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ListBySubscriptionComplete enumerates all values, automatically crossing page boundaries as required.
|
// ListBySubscriptionComplete enumerates all values, automatically crossing page boundaries as required.
|
||||||
func (client AvailabilitySetsClient) ListBySubscriptionComplete(ctx context.Context) (result AvailabilitySetListResultIterator, err error) {
|
func (client AvailabilitySetsClient) ListBySubscriptionComplete(ctx context.Context, expand string) (result AvailabilitySetListResultIterator, err error) {
|
||||||
if tracing.IsEnabled() {
|
if tracing.IsEnabled() {
|
||||||
ctx = tracing.StartSpan(ctx, fqdn+"/AvailabilitySetsClient.ListBySubscription")
|
ctx = tracing.StartSpan(ctx, fqdn+"/AvailabilitySetsClient.ListBySubscription")
|
||||||
defer func() {
|
defer func() {
|
||||||
@@ -571,7 +576,7 @@ func (client AvailabilitySetsClient) ListBySubscriptionComplete(ctx context.Cont
|
|||||||
tracing.EndSpan(ctx, sc, err)
|
tracing.EndSpan(ctx, sc, err)
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
result.page, err = client.ListBySubscription(ctx)
|
result.page, err = client.ListBySubscription(ctx, expand)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -638,8 +643,8 @@ func (client AvailabilitySetsClient) UpdatePreparer(ctx context.Context, resourc
|
|||||||
// UpdateSender sends the Update request. The method will close the
|
// UpdateSender sends the Update request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client AvailabilitySetsClient) UpdateSender(req *http.Request) (*http.Response, error) {
|
func (client AvailabilitySetsClient) UpdateSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateResponder handles the response to the Update request. The method always
|
// UpdateResponder handles the response to the Update request. The method always
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Package compute implements the Azure ARM Compute service API version 2017-12-01.
|
// Package compute implements the Azure ARM Compute service API version .
|
||||||
//
|
//
|
||||||
// Compute Client
|
// Compute Client
|
||||||
package compute
|
package compute
|
||||||
|
|||||||
776
vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2017-12-01/compute/disks.go
generated
vendored
Normal file
776
vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2017-12-01/compute/disks.go
generated
vendored
Normal file
@@ -0,0 +1,776 @@
|
|||||||
|
package compute
|
||||||
|
|
||||||
|
// Copyright (c) Microsoft and contributors. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
//
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
// Code generated by Microsoft (R) AutoRest Code Generator.
|
||||||
|
// Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/Azure/go-autorest/autorest"
|
||||||
|
"github.com/Azure/go-autorest/autorest/azure"
|
||||||
|
"github.com/Azure/go-autorest/autorest/validation"
|
||||||
|
"github.com/Azure/go-autorest/tracing"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DisksClient is the compute Client
|
||||||
|
type DisksClient struct {
|
||||||
|
BaseClient
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDisksClient creates an instance of the DisksClient client.
|
||||||
|
func NewDisksClient(subscriptionID string) DisksClient {
|
||||||
|
return NewDisksClientWithBaseURI(DefaultBaseURI, subscriptionID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDisksClientWithBaseURI creates an instance of the DisksClient client.
|
||||||
|
func NewDisksClientWithBaseURI(baseURI string, subscriptionID string) DisksClient {
|
||||||
|
return DisksClient{NewWithBaseURI(baseURI, subscriptionID)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOrUpdate creates or updates a disk.
|
||||||
|
// Parameters:
|
||||||
|
// resourceGroupName - the name of the resource group.
|
||||||
|
// diskName - the name of the managed disk that is being created. The name can't be changed after the disk is
|
||||||
|
// created. Supported characters for the name are a-z, A-Z, 0-9 and _. The maximum name length is 80
|
||||||
|
// characters.
|
||||||
|
// disk - disk object supplied in the body of the Put disk operation.
|
||||||
|
func (client DisksClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, diskName string, disk Disk) (result DisksCreateOrUpdateFuture, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/DisksClient.CreateOrUpdate")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response() != nil {
|
||||||
|
sc = result.Response().StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
if err := validation.Validate([]validation.Validation{
|
||||||
|
{TargetValue: disk,
|
||||||
|
Constraints: []validation.Constraint{{Target: "disk.DiskProperties", Name: validation.Null, Rule: false,
|
||||||
|
Chain: []validation.Constraint{{Target: "disk.DiskProperties.CreationData", Name: validation.Null, Rule: true,
|
||||||
|
Chain: []validation.Constraint{{Target: "disk.DiskProperties.CreationData.ImageReference", Name: validation.Null, Rule: false,
|
||||||
|
Chain: []validation.Constraint{{Target: "disk.DiskProperties.CreationData.ImageReference.ID", Name: validation.Null, Rule: true, Chain: nil}}},
|
||||||
|
}},
|
||||||
|
{Target: "disk.DiskProperties.EncryptionSettings", Name: validation.Null, Rule: false,
|
||||||
|
Chain: []validation.Constraint{{Target: "disk.DiskProperties.EncryptionSettings.DiskEncryptionKey", Name: validation.Null, Rule: false,
|
||||||
|
Chain: []validation.Constraint{{Target: "disk.DiskProperties.EncryptionSettings.DiskEncryptionKey.SourceVault", Name: validation.Null, Rule: true, Chain: nil},
|
||||||
|
{Target: "disk.DiskProperties.EncryptionSettings.DiskEncryptionKey.SecretURL", Name: validation.Null, Rule: true, Chain: nil},
|
||||||
|
}},
|
||||||
|
{Target: "disk.DiskProperties.EncryptionSettings.KeyEncryptionKey", Name: validation.Null, Rule: false,
|
||||||
|
Chain: []validation.Constraint{{Target: "disk.DiskProperties.EncryptionSettings.KeyEncryptionKey.SourceVault", Name: validation.Null, Rule: true, Chain: nil},
|
||||||
|
{Target: "disk.DiskProperties.EncryptionSettings.KeyEncryptionKey.KeyURL", Name: validation.Null, Rule: true, Chain: nil},
|
||||||
|
}},
|
||||||
|
}},
|
||||||
|
}}}}}); err != nil {
|
||||||
|
return result, validation.NewError("compute.DisksClient", "CreateOrUpdate", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := client.CreateOrUpdatePreparer(ctx, resourceGroupName, diskName, disk)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "CreateOrUpdate", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err = client.CreateOrUpdateSender(req)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "CreateOrUpdate", result.Response(), "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOrUpdatePreparer prepares the CreateOrUpdate request.
|
||||||
|
func (client DisksClient) CreateOrUpdatePreparer(ctx context.Context, resourceGroupName string, diskName string, disk Disk) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"diskName": autorest.Encode("path", diskName),
|
||||||
|
"resourceGroupName": autorest.Encode("path", resourceGroupName),
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-03-30"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
disk.ManagedBy = nil
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsContentType("application/json; charset=utf-8"),
|
||||||
|
autorest.AsPut(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/disks/{diskName}", pathParameters),
|
||||||
|
autorest.WithJSON(disk),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOrUpdateSender sends the CreateOrUpdate request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client DisksClient) CreateOrUpdateSender(req *http.Request) (future DisksCreateOrUpdateFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
var resp *http.Response
|
||||||
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
future.Future, err = azure.NewFutureFromResponse(resp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOrUpdateResponder handles the response to the CreateOrUpdate request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client DisksClient) CreateOrUpdateResponder(resp *http.Response) (result Disk, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete deletes a disk.
|
||||||
|
// Parameters:
|
||||||
|
// resourceGroupName - the name of the resource group.
|
||||||
|
// diskName - the name of the managed disk that is being created. The name can't be changed after the disk is
|
||||||
|
// created. Supported characters for the name are a-z, A-Z, 0-9 and _. The maximum name length is 80
|
||||||
|
// characters.
|
||||||
|
func (client DisksClient) Delete(ctx context.Context, resourceGroupName string, diskName string) (result DisksDeleteFuture, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/DisksClient.Delete")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response() != nil {
|
||||||
|
sc = result.Response().StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
req, err := client.DeletePreparer(ctx, resourceGroupName, diskName)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "Delete", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err = client.DeleteSender(req)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "Delete", result.Response(), "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeletePreparer prepares the Delete request.
|
||||||
|
func (client DisksClient) DeletePreparer(ctx context.Context, resourceGroupName string, diskName string) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"diskName": autorest.Encode("path", diskName),
|
||||||
|
"resourceGroupName": autorest.Encode("path", resourceGroupName),
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-03-30"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsDelete(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/disks/{diskName}", pathParameters),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteSender sends the Delete request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client DisksClient) DeleteSender(req *http.Request) (future DisksDeleteFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
var resp *http.Response
|
||||||
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
future.Future, err = azure.NewFutureFromResponse(resp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteResponder handles the response to the Delete request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client DisksClient) DeleteResponder(resp *http.Response) (result OperationStatusResponse, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted, http.StatusNoContent),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get gets information about a disk.
|
||||||
|
// Parameters:
|
||||||
|
// resourceGroupName - the name of the resource group.
|
||||||
|
// diskName - the name of the managed disk that is being created. The name can't be changed after the disk is
|
||||||
|
// created. Supported characters for the name are a-z, A-Z, 0-9 and _. The maximum name length is 80
|
||||||
|
// characters.
|
||||||
|
func (client DisksClient) Get(ctx context.Context, resourceGroupName string, diskName string) (result Disk, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/DisksClient.Get")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response.Response != nil {
|
||||||
|
sc = result.Response.Response.StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
req, err := client.GetPreparer(ctx, resourceGroupName, diskName)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "Get", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := client.GetSender(req)
|
||||||
|
if err != nil {
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "Get", resp, "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err = client.GetResponder(resp)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "Get", resp, "Failure responding to request")
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPreparer prepares the Get request.
|
||||||
|
func (client DisksClient) GetPreparer(ctx context.Context, resourceGroupName string, diskName string) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"diskName": autorest.Encode("path", diskName),
|
||||||
|
"resourceGroupName": autorest.Encode("path", resourceGroupName),
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-03-30"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsGet(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/disks/{diskName}", pathParameters),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSender sends the Get request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client DisksClient) GetSender(req *http.Request) (*http.Response, error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetResponder handles the response to the Get request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client DisksClient) GetResponder(resp *http.Response) (result Disk, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// GrantAccess grants access to a disk.
|
||||||
|
// Parameters:
|
||||||
|
// resourceGroupName - the name of the resource group.
|
||||||
|
// diskName - the name of the managed disk that is being created. The name can't be changed after the disk is
|
||||||
|
// created. Supported characters for the name are a-z, A-Z, 0-9 and _. The maximum name length is 80
|
||||||
|
// characters.
|
||||||
|
// grantAccessData - access data object supplied in the body of the get disk access operation.
|
||||||
|
func (client DisksClient) GrantAccess(ctx context.Context, resourceGroupName string, diskName string, grantAccessData GrantAccessData) (result DisksGrantAccessFuture, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/DisksClient.GrantAccess")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response() != nil {
|
||||||
|
sc = result.Response().StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
if err := validation.Validate([]validation.Validation{
|
||||||
|
{TargetValue: grantAccessData,
|
||||||
|
Constraints: []validation.Constraint{{Target: "grantAccessData.DurationInSeconds", Name: validation.Null, Rule: true, Chain: nil}}}}); err != nil {
|
||||||
|
return result, validation.NewError("compute.DisksClient", "GrantAccess", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := client.GrantAccessPreparer(ctx, resourceGroupName, diskName, grantAccessData)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "GrantAccess", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err = client.GrantAccessSender(req)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "GrantAccess", result.Response(), "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// GrantAccessPreparer prepares the GrantAccess request.
|
||||||
|
func (client DisksClient) GrantAccessPreparer(ctx context.Context, resourceGroupName string, diskName string, grantAccessData GrantAccessData) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"diskName": autorest.Encode("path", diskName),
|
||||||
|
"resourceGroupName": autorest.Encode("path", resourceGroupName),
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-03-30"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsContentType("application/json; charset=utf-8"),
|
||||||
|
autorest.AsPost(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/disks/{diskName}/beginGetAccess", pathParameters),
|
||||||
|
autorest.WithJSON(grantAccessData),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// GrantAccessSender sends the GrantAccess request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client DisksClient) GrantAccessSender(req *http.Request) (future DisksGrantAccessFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
var resp *http.Response
|
||||||
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
future.Future, err = azure.NewFutureFromResponse(resp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// GrantAccessResponder handles the response to the GrantAccess request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client DisksClient) GrantAccessResponder(resp *http.Response) (result AccessURI, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// List lists all the disks under a subscription.
|
||||||
|
func (client DisksClient) List(ctx context.Context) (result DiskListPage, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/DisksClient.List")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.dl.Response.Response != nil {
|
||||||
|
sc = result.dl.Response.Response.StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
result.fn = client.listNextResults
|
||||||
|
req, err := client.ListPreparer(ctx)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "List", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := client.ListSender(req)
|
||||||
|
if err != nil {
|
||||||
|
result.dl.Response = autorest.Response{Response: resp}
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "List", resp, "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result.dl, err = client.ListResponder(resp)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "List", resp, "Failure responding to request")
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListPreparer prepares the List request.
|
||||||
|
func (client DisksClient) ListPreparer(ctx context.Context) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-03-30"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsGet(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/providers/Microsoft.Compute/disks", pathParameters),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListSender sends the List request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client DisksClient) ListSender(req *http.Request) (*http.Response, error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListResponder handles the response to the List request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client DisksClient) ListResponder(resp *http.Response) (result DiskList, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// listNextResults retrieves the next set of results, if any.
|
||||||
|
func (client DisksClient) listNextResults(ctx context.Context, lastResults DiskList) (result DiskList, err error) {
|
||||||
|
req, err := lastResults.diskListPreparer(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return result, autorest.NewErrorWithError(err, "compute.DisksClient", "listNextResults", nil, "Failure preparing next results request")
|
||||||
|
}
|
||||||
|
if req == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp, err := client.ListSender(req)
|
||||||
|
if err != nil {
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return result, autorest.NewErrorWithError(err, "compute.DisksClient", "listNextResults", resp, "Failure sending next results request")
|
||||||
|
}
|
||||||
|
result, err = client.ListResponder(resp)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "listNextResults", resp, "Failure responding to next results request")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListComplete enumerates all values, automatically crossing page boundaries as required.
|
||||||
|
func (client DisksClient) ListComplete(ctx context.Context) (result DiskListIterator, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/DisksClient.List")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response().Response.Response != nil {
|
||||||
|
sc = result.page.Response().Response.Response.StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
result.page, err = client.List(ctx)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListByResourceGroup lists all the disks under a resource group.
|
||||||
|
// Parameters:
|
||||||
|
// resourceGroupName - the name of the resource group.
|
||||||
|
func (client DisksClient) ListByResourceGroup(ctx context.Context, resourceGroupName string) (result DiskListPage, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/DisksClient.ListByResourceGroup")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.dl.Response.Response != nil {
|
||||||
|
sc = result.dl.Response.Response.StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
result.fn = client.listByResourceGroupNextResults
|
||||||
|
req, err := client.ListByResourceGroupPreparer(ctx, resourceGroupName)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "ListByResourceGroup", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := client.ListByResourceGroupSender(req)
|
||||||
|
if err != nil {
|
||||||
|
result.dl.Response = autorest.Response{Response: resp}
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "ListByResourceGroup", resp, "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result.dl, err = client.ListByResourceGroupResponder(resp)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "ListByResourceGroup", resp, "Failure responding to request")
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListByResourceGroupPreparer prepares the ListByResourceGroup request.
|
||||||
|
func (client DisksClient) ListByResourceGroupPreparer(ctx context.Context, resourceGroupName string) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"resourceGroupName": autorest.Encode("path", resourceGroupName),
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-03-30"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsGet(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/disks", pathParameters),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListByResourceGroupSender sends the ListByResourceGroup request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client DisksClient) ListByResourceGroupSender(req *http.Request) (*http.Response, error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListByResourceGroupResponder handles the response to the ListByResourceGroup request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client DisksClient) ListByResourceGroupResponder(resp *http.Response) (result DiskList, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// listByResourceGroupNextResults retrieves the next set of results, if any.
|
||||||
|
func (client DisksClient) listByResourceGroupNextResults(ctx context.Context, lastResults DiskList) (result DiskList, err error) {
|
||||||
|
req, err := lastResults.diskListPreparer(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return result, autorest.NewErrorWithError(err, "compute.DisksClient", "listByResourceGroupNextResults", nil, "Failure preparing next results request")
|
||||||
|
}
|
||||||
|
if req == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp, err := client.ListByResourceGroupSender(req)
|
||||||
|
if err != nil {
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return result, autorest.NewErrorWithError(err, "compute.DisksClient", "listByResourceGroupNextResults", resp, "Failure sending next results request")
|
||||||
|
}
|
||||||
|
result, err = client.ListByResourceGroupResponder(resp)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "listByResourceGroupNextResults", resp, "Failure responding to next results request")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListByResourceGroupComplete enumerates all values, automatically crossing page boundaries as required.
|
||||||
|
func (client DisksClient) ListByResourceGroupComplete(ctx context.Context, resourceGroupName string) (result DiskListIterator, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/DisksClient.ListByResourceGroup")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response().Response.Response != nil {
|
||||||
|
sc = result.page.Response().Response.Response.StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
result.page, err = client.ListByResourceGroup(ctx, resourceGroupName)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// RevokeAccess revokes access to a disk.
|
||||||
|
// Parameters:
|
||||||
|
// resourceGroupName - the name of the resource group.
|
||||||
|
// diskName - the name of the managed disk that is being created. The name can't be changed after the disk is
|
||||||
|
// created. Supported characters for the name are a-z, A-Z, 0-9 and _. The maximum name length is 80
|
||||||
|
// characters.
|
||||||
|
func (client DisksClient) RevokeAccess(ctx context.Context, resourceGroupName string, diskName string) (result DisksRevokeAccessFuture, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/DisksClient.RevokeAccess")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response() != nil {
|
||||||
|
sc = result.Response().StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
req, err := client.RevokeAccessPreparer(ctx, resourceGroupName, diskName)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "RevokeAccess", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err = client.RevokeAccessSender(req)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "RevokeAccess", result.Response(), "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// RevokeAccessPreparer prepares the RevokeAccess request.
|
||||||
|
func (client DisksClient) RevokeAccessPreparer(ctx context.Context, resourceGroupName string, diskName string) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"diskName": autorest.Encode("path", diskName),
|
||||||
|
"resourceGroupName": autorest.Encode("path", resourceGroupName),
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-03-30"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsPost(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/disks/{diskName}/endGetAccess", pathParameters),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// RevokeAccessSender sends the RevokeAccess request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client DisksClient) RevokeAccessSender(req *http.Request) (future DisksRevokeAccessFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
var resp *http.Response
|
||||||
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
future.Future, err = azure.NewFutureFromResponse(resp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// RevokeAccessResponder handles the response to the RevokeAccess request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client DisksClient) RevokeAccessResponder(resp *http.Response) (result OperationStatusResponse, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update updates (patches) a disk.
|
||||||
|
// Parameters:
|
||||||
|
// resourceGroupName - the name of the resource group.
|
||||||
|
// diskName - the name of the managed disk that is being created. The name can't be changed after the disk is
|
||||||
|
// created. Supported characters for the name are a-z, A-Z, 0-9 and _. The maximum name length is 80
|
||||||
|
// characters.
|
||||||
|
// disk - disk object supplied in the body of the Patch disk operation.
|
||||||
|
func (client DisksClient) Update(ctx context.Context, resourceGroupName string, diskName string, disk DiskUpdate) (result DisksUpdateFuture, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/DisksClient.Update")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response() != nil {
|
||||||
|
sc = result.Response().StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
req, err := client.UpdatePreparer(ctx, resourceGroupName, diskName, disk)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "Update", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err = client.UpdateSender(req)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.DisksClient", "Update", result.Response(), "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdatePreparer prepares the Update request.
|
||||||
|
func (client DisksClient) UpdatePreparer(ctx context.Context, resourceGroupName string, diskName string, disk DiskUpdate) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"diskName": autorest.Encode("path", diskName),
|
||||||
|
"resourceGroupName": autorest.Encode("path", resourceGroupName),
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-03-30"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsContentType("application/json; charset=utf-8"),
|
||||||
|
autorest.AsPatch(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/disks/{diskName}", pathParameters),
|
||||||
|
autorest.WithJSON(disk),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateSender sends the Update request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client DisksClient) UpdateSender(req *http.Request) (future DisksUpdateFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
var resp *http.Response
|
||||||
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
future.Future, err = azure.NewFutureFromResponse(resp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateResponder handles the response to the Update request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client DisksClient) UpdateResponder(resp *http.Response) (result Disk, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
@@ -97,9 +97,9 @@ func (client ImagesClient) CreateOrUpdatePreparer(ctx context.Context, resourceG
|
|||||||
// CreateOrUpdateSender sends the CreateOrUpdate request. The method will close the
|
// CreateOrUpdateSender sends the CreateOrUpdate request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client ImagesClient) CreateOrUpdateSender(req *http.Request) (future ImagesCreateOrUpdateFuture, err error) {
|
func (client ImagesClient) CreateOrUpdateSender(req *http.Request) (future ImagesCreateOrUpdateFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
var resp *http.Response
|
var resp *http.Response
|
||||||
resp, err = autorest.SendWithSender(client, req,
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -174,9 +174,9 @@ func (client ImagesClient) DeletePreparer(ctx context.Context, resourceGroupName
|
|||||||
// DeleteSender sends the Delete request. The method will close the
|
// DeleteSender sends the Delete request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client ImagesClient) DeleteSender(req *http.Request) (future ImagesDeleteFuture, err error) {
|
func (client ImagesClient) DeleteSender(req *http.Request) (future ImagesDeleteFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
var resp *http.Response
|
var resp *http.Response
|
||||||
resp, err = autorest.SendWithSender(client, req,
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -261,8 +261,8 @@ func (client ImagesClient) GetPreparer(ctx context.Context, resourceGroupName st
|
|||||||
// GetSender sends the Get request. The method will close the
|
// GetSender sends the Get request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client ImagesClient) GetSender(req *http.Request) (*http.Response, error) {
|
func (client ImagesClient) GetSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetResponder handles the response to the Get request. The method always
|
// GetResponder handles the response to the Get request. The method always
|
||||||
@@ -335,8 +335,8 @@ func (client ImagesClient) ListPreparer(ctx context.Context) (*http.Request, err
|
|||||||
// ListSender sends the List request. The method will close the
|
// ListSender sends the List request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client ImagesClient) ListSender(req *http.Request) (*http.Response, error) {
|
func (client ImagesClient) ListSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListResponder handles the response to the List request. The method always
|
// ListResponder handles the response to the List request. The method always
|
||||||
@@ -448,8 +448,8 @@ func (client ImagesClient) ListByResourceGroupPreparer(ctx context.Context, reso
|
|||||||
// ListByResourceGroupSender sends the ListByResourceGroup request. The method will close the
|
// ListByResourceGroupSender sends the ListByResourceGroup request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client ImagesClient) ListByResourceGroupSender(req *http.Request) (*http.Response, error) {
|
func (client ImagesClient) ListByResourceGroupSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListByResourceGroupResponder handles the response to the ListByResourceGroup request. The method always
|
// ListByResourceGroupResponder handles the response to the ListByResourceGroup request. The method always
|
||||||
@@ -559,9 +559,9 @@ func (client ImagesClient) UpdatePreparer(ctx context.Context, resourceGroupName
|
|||||||
// UpdateSender sends the Update request. The method will close the
|
// UpdateSender sends the Update request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client ImagesClient) UpdateSender(req *http.Request) (future ImagesUpdateFuture, err error) {
|
func (client ImagesClient) UpdateSender(req *http.Request) (future ImagesUpdateFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
var resp *http.Response
|
var resp *http.Response
|
||||||
resp, err = autorest.SendWithSender(client, req,
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,9 +103,9 @@ func (client LogAnalyticsClient) ExportRequestRateByIntervalPreparer(ctx context
|
|||||||
// ExportRequestRateByIntervalSender sends the ExportRequestRateByInterval request. The method will close the
|
// ExportRequestRateByIntervalSender sends the ExportRequestRateByInterval request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client LogAnalyticsClient) ExportRequestRateByIntervalSender(req *http.Request) (future LogAnalyticsExportRequestRateByIntervalFuture, err error) {
|
func (client LogAnalyticsClient) ExportRequestRateByIntervalSender(req *http.Request) (future LogAnalyticsExportRequestRateByIntervalFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
var resp *http.Response
|
var resp *http.Response
|
||||||
resp, err = autorest.SendWithSender(client, req,
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -188,9 +188,9 @@ func (client LogAnalyticsClient) ExportThrottledRequestsPreparer(ctx context.Con
|
|||||||
// ExportThrottledRequestsSender sends the ExportThrottledRequests request. The method will close the
|
// ExportThrottledRequestsSender sends the ExportThrottledRequests request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client LogAnalyticsClient) ExportThrottledRequestsSender(req *http.Request) (future LogAnalyticsExportThrottledRequestsFuture, err error) {
|
func (client LogAnalyticsClient) ExportThrottledRequestsSender(req *http.Request) (future LogAnalyticsExportThrottledRequestsFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
var resp *http.Response
|
var resp *http.Response
|
||||||
resp, err = autorest.SendWithSender(client, req,
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
1541
vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2017-12-01/compute/models.go
generated
vendored
1541
vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2017-12-01/compute/models.go
generated
vendored
File diff suppressed because it is too large
Load Diff
@@ -91,8 +91,8 @@ func (client OperationsClient) ListPreparer(ctx context.Context) (*http.Request,
|
|||||||
// ListSender sends the List request. The method will close the
|
// ListSender sends the List request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client OperationsClient) ListSender(req *http.Request) (*http.Response, error) {
|
func (client OperationsClient) ListSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
|
||||||
autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListResponder handles the response to the List request. The method always
|
// ListResponder handles the response to the List request. The method always
|
||||||
|
|||||||
151
vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2017-12-01/compute/resourceskus.go
generated
vendored
Normal file
151
vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2017-12-01/compute/resourceskus.go
generated
vendored
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
package compute
|
||||||
|
|
||||||
|
// Copyright (c) Microsoft and contributors. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
//
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
// Code generated by Microsoft (R) AutoRest Code Generator.
|
||||||
|
// Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/Azure/go-autorest/autorest"
|
||||||
|
"github.com/Azure/go-autorest/autorest/azure"
|
||||||
|
"github.com/Azure/go-autorest/tracing"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ResourceSkusClient is the compute Client
|
||||||
|
type ResourceSkusClient struct {
|
||||||
|
BaseClient
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewResourceSkusClient creates an instance of the ResourceSkusClient client.
|
||||||
|
func NewResourceSkusClient(subscriptionID string) ResourceSkusClient {
|
||||||
|
return NewResourceSkusClientWithBaseURI(DefaultBaseURI, subscriptionID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewResourceSkusClientWithBaseURI creates an instance of the ResourceSkusClient client.
|
||||||
|
func NewResourceSkusClientWithBaseURI(baseURI string, subscriptionID string) ResourceSkusClient {
|
||||||
|
return ResourceSkusClient{NewWithBaseURI(baseURI, subscriptionID)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// List gets the list of Microsoft.Compute SKUs available for your Subscription.
|
||||||
|
func (client ResourceSkusClient) List(ctx context.Context) (result ResourceSkusResultPage, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/ResourceSkusClient.List")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.rsr.Response.Response != nil {
|
||||||
|
sc = result.rsr.Response.Response.StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
result.fn = client.listNextResults
|
||||||
|
req, err := client.ListPreparer(ctx)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.ResourceSkusClient", "List", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := client.ListSender(req)
|
||||||
|
if err != nil {
|
||||||
|
result.rsr.Response = autorest.Response{Response: resp}
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.ResourceSkusClient", "List", resp, "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result.rsr, err = client.ListResponder(resp)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.ResourceSkusClient", "List", resp, "Failure responding to request")
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListPreparer prepares the List request.
|
||||||
|
func (client ResourceSkusClient) ListPreparer(ctx context.Context) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-09-01"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsGet(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/providers/Microsoft.Compute/skus", pathParameters),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListSender sends the List request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client ResourceSkusClient) ListSender(req *http.Request) (*http.Response, error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListResponder handles the response to the List request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client ResourceSkusClient) ListResponder(resp *http.Response) (result ResourceSkusResult, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// listNextResults retrieves the next set of results, if any.
|
||||||
|
func (client ResourceSkusClient) listNextResults(ctx context.Context, lastResults ResourceSkusResult) (result ResourceSkusResult, err error) {
|
||||||
|
req, err := lastResults.resourceSkusResultPreparer(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return result, autorest.NewErrorWithError(err, "compute.ResourceSkusClient", "listNextResults", nil, "Failure preparing next results request")
|
||||||
|
}
|
||||||
|
if req == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp, err := client.ListSender(req)
|
||||||
|
if err != nil {
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return result, autorest.NewErrorWithError(err, "compute.ResourceSkusClient", "listNextResults", resp, "Failure sending next results request")
|
||||||
|
}
|
||||||
|
result, err = client.ListResponder(resp)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.ResourceSkusClient", "listNextResults", resp, "Failure responding to next results request")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListComplete enumerates all values, automatically crossing page boundaries as required.
|
||||||
|
func (client ResourceSkusClient) ListComplete(ctx context.Context) (result ResourceSkusResultIterator, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/ResourceSkusClient.List")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response().Response.Response != nil {
|
||||||
|
sc = result.page.Response().Response.Response.StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
result.page, err = client.List(ctx)
|
||||||
|
return
|
||||||
|
}
|
||||||
770
vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2017-12-01/compute/snapshots.go
generated
vendored
Normal file
770
vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2017-12-01/compute/snapshots.go
generated
vendored
Normal file
@@ -0,0 +1,770 @@
|
|||||||
|
package compute
|
||||||
|
|
||||||
|
// Copyright (c) Microsoft and contributors. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
//
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
// Code generated by Microsoft (R) AutoRest Code Generator.
|
||||||
|
// Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/Azure/go-autorest/autorest"
|
||||||
|
"github.com/Azure/go-autorest/autorest/azure"
|
||||||
|
"github.com/Azure/go-autorest/autorest/validation"
|
||||||
|
"github.com/Azure/go-autorest/tracing"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SnapshotsClient is the compute Client
|
||||||
|
type SnapshotsClient struct {
|
||||||
|
BaseClient
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSnapshotsClient creates an instance of the SnapshotsClient client.
|
||||||
|
func NewSnapshotsClient(subscriptionID string) SnapshotsClient {
|
||||||
|
return NewSnapshotsClientWithBaseURI(DefaultBaseURI, subscriptionID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSnapshotsClientWithBaseURI creates an instance of the SnapshotsClient client.
|
||||||
|
func NewSnapshotsClientWithBaseURI(baseURI string, subscriptionID string) SnapshotsClient {
|
||||||
|
return SnapshotsClient{NewWithBaseURI(baseURI, subscriptionID)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOrUpdate creates or updates a snapshot.
|
||||||
|
// Parameters:
|
||||||
|
// resourceGroupName - the name of the resource group.
|
||||||
|
// snapshotName - the name of the snapshot that is being created. The name can't be changed after the snapshot
|
||||||
|
// is created. Supported characters for the name are a-z, A-Z, 0-9 and _. The max name length is 80 characters.
|
||||||
|
// snapshot - snapshot object supplied in the body of the Put disk operation.
|
||||||
|
func (client SnapshotsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, snapshotName string, snapshot Snapshot) (result SnapshotsCreateOrUpdateFuture, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/SnapshotsClient.CreateOrUpdate")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response() != nil {
|
||||||
|
sc = result.Response().StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
if err := validation.Validate([]validation.Validation{
|
||||||
|
{TargetValue: snapshot,
|
||||||
|
Constraints: []validation.Constraint{{Target: "snapshot.DiskProperties", Name: validation.Null, Rule: false,
|
||||||
|
Chain: []validation.Constraint{{Target: "snapshot.DiskProperties.CreationData", Name: validation.Null, Rule: true,
|
||||||
|
Chain: []validation.Constraint{{Target: "snapshot.DiskProperties.CreationData.ImageReference", Name: validation.Null, Rule: false,
|
||||||
|
Chain: []validation.Constraint{{Target: "snapshot.DiskProperties.CreationData.ImageReference.ID", Name: validation.Null, Rule: true, Chain: nil}}},
|
||||||
|
}},
|
||||||
|
{Target: "snapshot.DiskProperties.EncryptionSettings", Name: validation.Null, Rule: false,
|
||||||
|
Chain: []validation.Constraint{{Target: "snapshot.DiskProperties.EncryptionSettings.DiskEncryptionKey", Name: validation.Null, Rule: false,
|
||||||
|
Chain: []validation.Constraint{{Target: "snapshot.DiskProperties.EncryptionSettings.DiskEncryptionKey.SourceVault", Name: validation.Null, Rule: true, Chain: nil},
|
||||||
|
{Target: "snapshot.DiskProperties.EncryptionSettings.DiskEncryptionKey.SecretURL", Name: validation.Null, Rule: true, Chain: nil},
|
||||||
|
}},
|
||||||
|
{Target: "snapshot.DiskProperties.EncryptionSettings.KeyEncryptionKey", Name: validation.Null, Rule: false,
|
||||||
|
Chain: []validation.Constraint{{Target: "snapshot.DiskProperties.EncryptionSettings.KeyEncryptionKey.SourceVault", Name: validation.Null, Rule: true, Chain: nil},
|
||||||
|
{Target: "snapshot.DiskProperties.EncryptionSettings.KeyEncryptionKey.KeyURL", Name: validation.Null, Rule: true, Chain: nil},
|
||||||
|
}},
|
||||||
|
}},
|
||||||
|
}}}}}); err != nil {
|
||||||
|
return result, validation.NewError("compute.SnapshotsClient", "CreateOrUpdate", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := client.CreateOrUpdatePreparer(ctx, resourceGroupName, snapshotName, snapshot)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "CreateOrUpdate", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err = client.CreateOrUpdateSender(req)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "CreateOrUpdate", result.Response(), "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOrUpdatePreparer prepares the CreateOrUpdate request.
|
||||||
|
func (client SnapshotsClient) CreateOrUpdatePreparer(ctx context.Context, resourceGroupName string, snapshotName string, snapshot Snapshot) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"resourceGroupName": autorest.Encode("path", resourceGroupName),
|
||||||
|
"snapshotName": autorest.Encode("path", snapshotName),
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-03-30"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
snapshot.ManagedBy = nil
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsContentType("application/json; charset=utf-8"),
|
||||||
|
autorest.AsPut(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/snapshots/{snapshotName}", pathParameters),
|
||||||
|
autorest.WithJSON(snapshot),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOrUpdateSender sends the CreateOrUpdate request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client SnapshotsClient) CreateOrUpdateSender(req *http.Request) (future SnapshotsCreateOrUpdateFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
var resp *http.Response
|
||||||
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
future.Future, err = azure.NewFutureFromResponse(resp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOrUpdateResponder handles the response to the CreateOrUpdate request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client SnapshotsClient) CreateOrUpdateResponder(resp *http.Response) (result Snapshot, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete deletes a snapshot.
|
||||||
|
// Parameters:
|
||||||
|
// resourceGroupName - the name of the resource group.
|
||||||
|
// snapshotName - the name of the snapshot that is being created. The name can't be changed after the snapshot
|
||||||
|
// is created. Supported characters for the name are a-z, A-Z, 0-9 and _. The max name length is 80 characters.
|
||||||
|
func (client SnapshotsClient) Delete(ctx context.Context, resourceGroupName string, snapshotName string) (result SnapshotsDeleteFuture, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/SnapshotsClient.Delete")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response() != nil {
|
||||||
|
sc = result.Response().StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
req, err := client.DeletePreparer(ctx, resourceGroupName, snapshotName)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "Delete", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err = client.DeleteSender(req)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "Delete", result.Response(), "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeletePreparer prepares the Delete request.
|
||||||
|
func (client SnapshotsClient) DeletePreparer(ctx context.Context, resourceGroupName string, snapshotName string) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"resourceGroupName": autorest.Encode("path", resourceGroupName),
|
||||||
|
"snapshotName": autorest.Encode("path", snapshotName),
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-03-30"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsDelete(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/snapshots/{snapshotName}", pathParameters),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteSender sends the Delete request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client SnapshotsClient) DeleteSender(req *http.Request) (future SnapshotsDeleteFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
var resp *http.Response
|
||||||
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
future.Future, err = azure.NewFutureFromResponse(resp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteResponder handles the response to the Delete request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client SnapshotsClient) DeleteResponder(resp *http.Response) (result OperationStatusResponse, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted, http.StatusNoContent),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get gets information about a snapshot.
|
||||||
|
// Parameters:
|
||||||
|
// resourceGroupName - the name of the resource group.
|
||||||
|
// snapshotName - the name of the snapshot that is being created. The name can't be changed after the snapshot
|
||||||
|
// is created. Supported characters for the name are a-z, A-Z, 0-9 and _. The max name length is 80 characters.
|
||||||
|
func (client SnapshotsClient) Get(ctx context.Context, resourceGroupName string, snapshotName string) (result Snapshot, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/SnapshotsClient.Get")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response.Response != nil {
|
||||||
|
sc = result.Response.Response.StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
req, err := client.GetPreparer(ctx, resourceGroupName, snapshotName)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "Get", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := client.GetSender(req)
|
||||||
|
if err != nil {
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "Get", resp, "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err = client.GetResponder(resp)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "Get", resp, "Failure responding to request")
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPreparer prepares the Get request.
|
||||||
|
func (client SnapshotsClient) GetPreparer(ctx context.Context, resourceGroupName string, snapshotName string) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"resourceGroupName": autorest.Encode("path", resourceGroupName),
|
||||||
|
"snapshotName": autorest.Encode("path", snapshotName),
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-03-30"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsGet(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/snapshots/{snapshotName}", pathParameters),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSender sends the Get request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client SnapshotsClient) GetSender(req *http.Request) (*http.Response, error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetResponder handles the response to the Get request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client SnapshotsClient) GetResponder(resp *http.Response) (result Snapshot, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// GrantAccess grants access to a snapshot.
|
||||||
|
// Parameters:
|
||||||
|
// resourceGroupName - the name of the resource group.
|
||||||
|
// snapshotName - the name of the snapshot that is being created. The name can't be changed after the snapshot
|
||||||
|
// is created. Supported characters for the name are a-z, A-Z, 0-9 and _. The max name length is 80 characters.
|
||||||
|
// grantAccessData - access data object supplied in the body of the get snapshot access operation.
|
||||||
|
func (client SnapshotsClient) GrantAccess(ctx context.Context, resourceGroupName string, snapshotName string, grantAccessData GrantAccessData) (result SnapshotsGrantAccessFuture, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/SnapshotsClient.GrantAccess")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response() != nil {
|
||||||
|
sc = result.Response().StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
if err := validation.Validate([]validation.Validation{
|
||||||
|
{TargetValue: grantAccessData,
|
||||||
|
Constraints: []validation.Constraint{{Target: "grantAccessData.DurationInSeconds", Name: validation.Null, Rule: true, Chain: nil}}}}); err != nil {
|
||||||
|
return result, validation.NewError("compute.SnapshotsClient", "GrantAccess", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := client.GrantAccessPreparer(ctx, resourceGroupName, snapshotName, grantAccessData)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "GrantAccess", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err = client.GrantAccessSender(req)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "GrantAccess", result.Response(), "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// GrantAccessPreparer prepares the GrantAccess request.
|
||||||
|
func (client SnapshotsClient) GrantAccessPreparer(ctx context.Context, resourceGroupName string, snapshotName string, grantAccessData GrantAccessData) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"resourceGroupName": autorest.Encode("path", resourceGroupName),
|
||||||
|
"snapshotName": autorest.Encode("path", snapshotName),
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-03-30"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsContentType("application/json; charset=utf-8"),
|
||||||
|
autorest.AsPost(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/snapshots/{snapshotName}/beginGetAccess", pathParameters),
|
||||||
|
autorest.WithJSON(grantAccessData),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// GrantAccessSender sends the GrantAccess request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client SnapshotsClient) GrantAccessSender(req *http.Request) (future SnapshotsGrantAccessFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
var resp *http.Response
|
||||||
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
future.Future, err = azure.NewFutureFromResponse(resp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// GrantAccessResponder handles the response to the GrantAccess request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client SnapshotsClient) GrantAccessResponder(resp *http.Response) (result AccessURI, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// List lists snapshots under a subscription.
|
||||||
|
func (client SnapshotsClient) List(ctx context.Context) (result SnapshotListPage, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/SnapshotsClient.List")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.sl.Response.Response != nil {
|
||||||
|
sc = result.sl.Response.Response.StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
result.fn = client.listNextResults
|
||||||
|
req, err := client.ListPreparer(ctx)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "List", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := client.ListSender(req)
|
||||||
|
if err != nil {
|
||||||
|
result.sl.Response = autorest.Response{Response: resp}
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "List", resp, "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result.sl, err = client.ListResponder(resp)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "List", resp, "Failure responding to request")
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListPreparer prepares the List request.
|
||||||
|
func (client SnapshotsClient) ListPreparer(ctx context.Context) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-03-30"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsGet(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/providers/Microsoft.Compute/snapshots", pathParameters),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListSender sends the List request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client SnapshotsClient) ListSender(req *http.Request) (*http.Response, error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListResponder handles the response to the List request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client SnapshotsClient) ListResponder(resp *http.Response) (result SnapshotList, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// listNextResults retrieves the next set of results, if any.
|
||||||
|
func (client SnapshotsClient) listNextResults(ctx context.Context, lastResults SnapshotList) (result SnapshotList, err error) {
|
||||||
|
req, err := lastResults.snapshotListPreparer(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return result, autorest.NewErrorWithError(err, "compute.SnapshotsClient", "listNextResults", nil, "Failure preparing next results request")
|
||||||
|
}
|
||||||
|
if req == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp, err := client.ListSender(req)
|
||||||
|
if err != nil {
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return result, autorest.NewErrorWithError(err, "compute.SnapshotsClient", "listNextResults", resp, "Failure sending next results request")
|
||||||
|
}
|
||||||
|
result, err = client.ListResponder(resp)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "listNextResults", resp, "Failure responding to next results request")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListComplete enumerates all values, automatically crossing page boundaries as required.
|
||||||
|
func (client SnapshotsClient) ListComplete(ctx context.Context) (result SnapshotListIterator, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/SnapshotsClient.List")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response().Response.Response != nil {
|
||||||
|
sc = result.page.Response().Response.Response.StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
result.page, err = client.List(ctx)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListByResourceGroup lists snapshots under a resource group.
|
||||||
|
// Parameters:
|
||||||
|
// resourceGroupName - the name of the resource group.
|
||||||
|
func (client SnapshotsClient) ListByResourceGroup(ctx context.Context, resourceGroupName string) (result SnapshotListPage, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/SnapshotsClient.ListByResourceGroup")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.sl.Response.Response != nil {
|
||||||
|
sc = result.sl.Response.Response.StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
result.fn = client.listByResourceGroupNextResults
|
||||||
|
req, err := client.ListByResourceGroupPreparer(ctx, resourceGroupName)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "ListByResourceGroup", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := client.ListByResourceGroupSender(req)
|
||||||
|
if err != nil {
|
||||||
|
result.sl.Response = autorest.Response{Response: resp}
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "ListByResourceGroup", resp, "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result.sl, err = client.ListByResourceGroupResponder(resp)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "ListByResourceGroup", resp, "Failure responding to request")
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListByResourceGroupPreparer prepares the ListByResourceGroup request.
|
||||||
|
func (client SnapshotsClient) ListByResourceGroupPreparer(ctx context.Context, resourceGroupName string) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"resourceGroupName": autorest.Encode("path", resourceGroupName),
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-03-30"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsGet(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/snapshots", pathParameters),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListByResourceGroupSender sends the ListByResourceGroup request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client SnapshotsClient) ListByResourceGroupSender(req *http.Request) (*http.Response, error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListByResourceGroupResponder handles the response to the ListByResourceGroup request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client SnapshotsClient) ListByResourceGroupResponder(resp *http.Response) (result SnapshotList, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// listByResourceGroupNextResults retrieves the next set of results, if any.
|
||||||
|
func (client SnapshotsClient) listByResourceGroupNextResults(ctx context.Context, lastResults SnapshotList) (result SnapshotList, err error) {
|
||||||
|
req, err := lastResults.snapshotListPreparer(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return result, autorest.NewErrorWithError(err, "compute.SnapshotsClient", "listByResourceGroupNextResults", nil, "Failure preparing next results request")
|
||||||
|
}
|
||||||
|
if req == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp, err := client.ListByResourceGroupSender(req)
|
||||||
|
if err != nil {
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return result, autorest.NewErrorWithError(err, "compute.SnapshotsClient", "listByResourceGroupNextResults", resp, "Failure sending next results request")
|
||||||
|
}
|
||||||
|
result, err = client.ListByResourceGroupResponder(resp)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "listByResourceGroupNextResults", resp, "Failure responding to next results request")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListByResourceGroupComplete enumerates all values, automatically crossing page boundaries as required.
|
||||||
|
func (client SnapshotsClient) ListByResourceGroupComplete(ctx context.Context, resourceGroupName string) (result SnapshotListIterator, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/SnapshotsClient.ListByResourceGroup")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response().Response.Response != nil {
|
||||||
|
sc = result.page.Response().Response.Response.StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
result.page, err = client.ListByResourceGroup(ctx, resourceGroupName)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// RevokeAccess revokes access to a snapshot.
|
||||||
|
// Parameters:
|
||||||
|
// resourceGroupName - the name of the resource group.
|
||||||
|
// snapshotName - the name of the snapshot that is being created. The name can't be changed after the snapshot
|
||||||
|
// is created. Supported characters for the name are a-z, A-Z, 0-9 and _. The max name length is 80 characters.
|
||||||
|
func (client SnapshotsClient) RevokeAccess(ctx context.Context, resourceGroupName string, snapshotName string) (result SnapshotsRevokeAccessFuture, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/SnapshotsClient.RevokeAccess")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response() != nil {
|
||||||
|
sc = result.Response().StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
req, err := client.RevokeAccessPreparer(ctx, resourceGroupName, snapshotName)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "RevokeAccess", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err = client.RevokeAccessSender(req)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "RevokeAccess", result.Response(), "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// RevokeAccessPreparer prepares the RevokeAccess request.
|
||||||
|
func (client SnapshotsClient) RevokeAccessPreparer(ctx context.Context, resourceGroupName string, snapshotName string) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"resourceGroupName": autorest.Encode("path", resourceGroupName),
|
||||||
|
"snapshotName": autorest.Encode("path", snapshotName),
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-03-30"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsPost(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/snapshots/{snapshotName}/endGetAccess", pathParameters),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// RevokeAccessSender sends the RevokeAccess request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client SnapshotsClient) RevokeAccessSender(req *http.Request) (future SnapshotsRevokeAccessFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
var resp *http.Response
|
||||||
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
future.Future, err = azure.NewFutureFromResponse(resp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// RevokeAccessResponder handles the response to the RevokeAccess request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client SnapshotsClient) RevokeAccessResponder(resp *http.Response) (result OperationStatusResponse, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update updates (patches) a snapshot.
|
||||||
|
// Parameters:
|
||||||
|
// resourceGroupName - the name of the resource group.
|
||||||
|
// snapshotName - the name of the snapshot that is being created. The name can't be changed after the snapshot
|
||||||
|
// is created. Supported characters for the name are a-z, A-Z, 0-9 and _. The max name length is 80 characters.
|
||||||
|
// snapshot - snapshot object supplied in the body of the Patch snapshot operation.
|
||||||
|
func (client SnapshotsClient) Update(ctx context.Context, resourceGroupName string, snapshotName string, snapshot SnapshotUpdate) (result SnapshotsUpdateFuture, err error) {
|
||||||
|
if tracing.IsEnabled() {
|
||||||
|
ctx = tracing.StartSpan(ctx, fqdn+"/SnapshotsClient.Update")
|
||||||
|
defer func() {
|
||||||
|
sc := -1
|
||||||
|
if result.Response() != nil {
|
||||||
|
sc = result.Response().StatusCode
|
||||||
|
}
|
||||||
|
tracing.EndSpan(ctx, sc, err)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
req, err := client.UpdatePreparer(ctx, resourceGroupName, snapshotName, snapshot)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "Update", nil, "Failure preparing request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err = client.UpdateSender(req)
|
||||||
|
if err != nil {
|
||||||
|
err = autorest.NewErrorWithError(err, "compute.SnapshotsClient", "Update", result.Response(), "Failure sending request")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdatePreparer prepares the Update request.
|
||||||
|
func (client SnapshotsClient) UpdatePreparer(ctx context.Context, resourceGroupName string, snapshotName string, snapshot SnapshotUpdate) (*http.Request, error) {
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"resourceGroupName": autorest.Encode("path", resourceGroupName),
|
||||||
|
"snapshotName": autorest.Encode("path", snapshotName),
|
||||||
|
"subscriptionId": autorest.Encode("path", client.SubscriptionID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2017-03-30"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsContentType("application/json; charset=utf-8"),
|
||||||
|
autorest.AsPatch(),
|
||||||
|
autorest.WithBaseURL(client.BaseURI),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/snapshots/{snapshotName}", pathParameters),
|
||||||
|
autorest.WithJSON(snapshot),
|
||||||
|
autorest.WithQueryParameters(queryParameters))
|
||||||
|
return preparer.Prepare((&http.Request{}).WithContext(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateSender sends the Update request. The method will close the
|
||||||
|
// http.Response Body if it receives an error.
|
||||||
|
func (client SnapshotsClient) UpdateSender(req *http.Request) (future SnapshotsUpdateFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
|
var resp *http.Response
|
||||||
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
future.Future, err = azure.NewFutureFromResponse(resp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateResponder handles the response to the Update request. The method always
|
||||||
|
// closes the http.Response Body.
|
||||||
|
func (client SnapshotsClient) UpdateResponder(resp *http.Response) (result Snapshot, err error) {
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
client.ByInspecting(),
|
||||||
|
azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted),
|
||||||
|
autorest.ByUnmarshallingJSON(&result),
|
||||||
|
autorest.ByClosing())
|
||||||
|
result.Response = autorest.Response{Response: resp}
|
||||||
|
return
|
||||||
|
}
|
||||||
@@ -107,8 +107,8 @@ func (client UsageClient) ListPreparer(ctx context.Context, location string) (*h
|
|||||||
// ListSender sends the List request. The method will close the
|
// ListSender sends the List request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client UsageClient) ListSender(req *http.Request) (*http.Response, error) {
|
func (client UsageClient) ListSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListResponder handles the response to the List request. The method always
|
// ListResponder handles the response to the List request. The method always
|
||||||
|
|||||||
@@ -102,8 +102,8 @@ func (client VirtualMachineExtensionImagesClient) GetPreparer(ctx context.Contex
|
|||||||
// GetSender sends the Get request. The method will close the
|
// GetSender sends the Get request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client VirtualMachineExtensionImagesClient) GetSender(req *http.Request) (*http.Response, error) {
|
func (client VirtualMachineExtensionImagesClient) GetSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetResponder handles the response to the Get request. The method always
|
// GetResponder handles the response to the Get request. The method always
|
||||||
@@ -178,8 +178,8 @@ func (client VirtualMachineExtensionImagesClient) ListTypesPreparer(ctx context.
|
|||||||
// ListTypesSender sends the ListTypes request. The method will close the
|
// ListTypesSender sends the ListTypes request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client VirtualMachineExtensionImagesClient) ListTypesSender(req *http.Request) (*http.Response, error) {
|
func (client VirtualMachineExtensionImagesClient) ListTypesSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListTypesResponder handles the response to the ListTypes request. The method always
|
// ListTypesResponder handles the response to the ListTypes request. The method always
|
||||||
@@ -265,8 +265,8 @@ func (client VirtualMachineExtensionImagesClient) ListVersionsPreparer(ctx conte
|
|||||||
// ListVersionsSender sends the ListVersions request. The method will close the
|
// ListVersionsSender sends the ListVersions request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client VirtualMachineExtensionImagesClient) ListVersionsSender(req *http.Request) (*http.Response, error) {
|
func (client VirtualMachineExtensionImagesClient) ListVersionsSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListVersionsResponder handles the response to the ListVersions request. The method always
|
// ListVersionsResponder handles the response to the ListVersions request. The method always
|
||||||
|
|||||||
@@ -99,9 +99,9 @@ func (client VirtualMachineExtensionsClient) CreateOrUpdatePreparer(ctx context.
|
|||||||
// CreateOrUpdateSender sends the CreateOrUpdate request. The method will close the
|
// CreateOrUpdateSender sends the CreateOrUpdate request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client VirtualMachineExtensionsClient) CreateOrUpdateSender(req *http.Request) (future VirtualMachineExtensionsCreateOrUpdateFuture, err error) {
|
func (client VirtualMachineExtensionsClient) CreateOrUpdateSender(req *http.Request) (future VirtualMachineExtensionsCreateOrUpdateFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
var resp *http.Response
|
var resp *http.Response
|
||||||
resp, err = autorest.SendWithSender(client, req,
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -178,9 +178,9 @@ func (client VirtualMachineExtensionsClient) DeletePreparer(ctx context.Context,
|
|||||||
// DeleteSender sends the Delete request. The method will close the
|
// DeleteSender sends the Delete request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client VirtualMachineExtensionsClient) DeleteSender(req *http.Request) (future VirtualMachineExtensionsDeleteFuture, err error) {
|
func (client VirtualMachineExtensionsClient) DeleteSender(req *http.Request) (future VirtualMachineExtensionsDeleteFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
var resp *http.Response
|
var resp *http.Response
|
||||||
resp, err = autorest.SendWithSender(client, req,
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -267,8 +267,8 @@ func (client VirtualMachineExtensionsClient) GetPreparer(ctx context.Context, re
|
|||||||
// GetSender sends the Get request. The method will close the
|
// GetSender sends the Get request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client VirtualMachineExtensionsClient) GetSender(req *http.Request) (*http.Response, error) {
|
func (client VirtualMachineExtensionsClient) GetSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetResponder handles the response to the Get request. The method always
|
// GetResponder handles the response to the Get request. The method always
|
||||||
@@ -343,9 +343,9 @@ func (client VirtualMachineExtensionsClient) UpdatePreparer(ctx context.Context,
|
|||||||
// UpdateSender sends the Update request. The method will close the
|
// UpdateSender sends the Update request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client VirtualMachineExtensionsClient) UpdateSender(req *http.Request) (future VirtualMachineExtensionsUpdateFuture, err error) {
|
func (client VirtualMachineExtensionsClient) UpdateSender(req *http.Request) (future VirtualMachineExtensionsUpdateFuture, err error) {
|
||||||
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
var resp *http.Response
|
var resp *http.Response
|
||||||
resp, err = autorest.SendWithSender(client, req,
|
resp, err = autorest.SendWithSender(client, req, sd...)
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,8 +106,8 @@ func (client VirtualMachineImagesClient) GetPreparer(ctx context.Context, locati
|
|||||||
// GetSender sends the Get request. The method will close the
|
// GetSender sends the Get request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client VirtualMachineImagesClient) GetSender(req *http.Request) (*http.Response, error) {
|
func (client VirtualMachineImagesClient) GetSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetResponder handles the response to the Get request. The method always
|
// GetResponder handles the response to the Get request. The method always
|
||||||
@@ -197,8 +197,8 @@ func (client VirtualMachineImagesClient) ListPreparer(ctx context.Context, locat
|
|||||||
// ListSender sends the List request. The method will close the
|
// ListSender sends the List request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client VirtualMachineImagesClient) ListSender(req *http.Request) (*http.Response, error) {
|
func (client VirtualMachineImagesClient) ListSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListResponder handles the response to the List request. The method always
|
// ListResponder handles the response to the List request. The method always
|
||||||
@@ -274,8 +274,8 @@ func (client VirtualMachineImagesClient) ListOffersPreparer(ctx context.Context,
|
|||||||
// ListOffersSender sends the ListOffers request. The method will close the
|
// ListOffersSender sends the ListOffers request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client VirtualMachineImagesClient) ListOffersSender(req *http.Request) (*http.Response, error) {
|
func (client VirtualMachineImagesClient) ListOffersSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListOffersResponder handles the response to the ListOffers request. The method always
|
// ListOffersResponder handles the response to the ListOffers request. The method always
|
||||||
@@ -349,8 +349,8 @@ func (client VirtualMachineImagesClient) ListPublishersPreparer(ctx context.Cont
|
|||||||
// ListPublishersSender sends the ListPublishers request. The method will close the
|
// ListPublishersSender sends the ListPublishers request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client VirtualMachineImagesClient) ListPublishersSender(req *http.Request) (*http.Response, error) {
|
func (client VirtualMachineImagesClient) ListPublishersSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListPublishersResponder handles the response to the ListPublishers request. The method always
|
// ListPublishersResponder handles the response to the ListPublishers request. The method always
|
||||||
@@ -428,8 +428,8 @@ func (client VirtualMachineImagesClient) ListSkusPreparer(ctx context.Context, l
|
|||||||
// ListSkusSender sends the ListSkus request. The method will close the
|
// ListSkusSender sends the ListSkus request. The method will close the
|
||||||
// http.Response Body if it receives an error.
|
// http.Response Body if it receives an error.
|
||||||
func (client VirtualMachineImagesClient) ListSkusSender(req *http.Request) (*http.Response, error) {
|
func (client VirtualMachineImagesClient) ListSkusSender(req *http.Request) (*http.Response, error) {
|
||||||
return autorest.SendWithSender(client, req,
|
sd := autorest.GetSendDecorators(req.Context(), azure.DoRetryWithRegistration(client.Client))
|
||||||
azure.DoRetryWithRegistration(client.Client))
|
return autorest.SendWithSender(client, req, sd...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListSkusResponder handles the response to the ListSkus request. The method always
|
// ListSkusResponder handles the response to the ListSkus request. The method always
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user