mirror of
https://github.com/kreuzwerker/terraform-provider-docker.git
synced 2025-12-20 22:59:42 -05:00
Move to standalone plugin SDK (#200)
Closes #197 Signed-off-by: dubo-dubon-duponey <dubodubonduponey+github@pm.me>
This commit is contained in:
parent
437ec59829
commit
27a9f37c69
825 changed files with 20296 additions and 34884 deletions
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func dataSourceDockerNetwork() *schema.Resource {
|
func dataSourceDockerNetwork() *schema.Resource {
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ package docker
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/helper/resource"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAccDockerNetworkDataSource_basic(t *testing.T) {
|
func TestAccDockerNetworkDataSource_basic(t *testing.T) {
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func dataSourceDockerRegistryImage() *schema.Resource {
|
func dataSourceDockerRegistryImage() *schema.Resource {
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ import (
|
||||||
"regexp"
|
"regexp"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/helper/resource"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
|
||||||
)
|
)
|
||||||
|
|
||||||
var registryDigestRegexp = regexp.MustCompile(`\A[A-Za-z0-9_\+\.-]+:[A-Fa-f0-9]+\z`)
|
var registryDigestRegexp = regexp.MustCompile(`\A[A-Za-z0-9_\+\.-]+:[A-Fa-f0-9]+\z`)
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@ import (
|
||||||
|
|
||||||
credhelper "github.com/docker/docker-credential-helpers/client"
|
credhelper "github.com/docker/docker-credential-helpers/client"
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
"github.com/hashicorp/terraform/terraform"
|
"github.com/hashicorp/terraform-plugin-sdk/terraform"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Provider creates the Docker provider
|
// Provider creates the Docker provider
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@ import (
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
"github.com/hashicorp/terraform/terraform"
|
"github.com/hashicorp/terraform-plugin-sdk/terraform"
|
||||||
)
|
)
|
||||||
|
|
||||||
var testAccProviders map[string]terraform.ResourceProvider
|
var testAccProviders map[string]terraform.ResourceProvider
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func resourceDockerConfig() *schema.Resource {
|
func resourceDockerConfig() *schema.Resource {
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"context"
|
"context"
|
||||||
"github.com/hashicorp/terraform/helper/resource"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
|
||||||
"github.com/hashicorp/terraform/terraform"
|
"github.com/hashicorp/terraform-plugin-sdk/terraform"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAccDockerConfig_basic(t *testing.T) {
|
func TestAccDockerConfig_basic(t *testing.T) {
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ package docker
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func resourceDockerContainer() *schema.Resource {
|
func resourceDockerContainer() *schema.Resource {
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ import (
|
||||||
"github.com/docker/docker/client"
|
"github.com/docker/docker/client"
|
||||||
"github.com/docker/go-connections/nat"
|
"github.com/docker/go-connections/nat"
|
||||||
"github.com/docker/go-units"
|
"github.com/docker/go-units"
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
"github.com/hashicorp/terraform/terraform"
|
"github.com/hashicorp/terraform-plugin-sdk/terraform"
|
||||||
)
|
)
|
||||||
|
|
||||||
func resourceDockerContainerMigrateState(
|
func resourceDockerContainerMigrateState(
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,8 @@ import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/hashicorp/terraform/helper/resource"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
|
||||||
"github.com/hashicorp/terraform/terraform"
|
"github.com/hashicorp/terraform-plugin-sdk/terraform"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMapTypeMapValsToStringSlice(t *testing.T) {
|
func TestMapTypeMapValsToStringSlice(t *testing.T) {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package docker
|
package docker
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func resourceDockerImage() *schema.Resource {
|
func resourceDockerImage() *schema.Resource {
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ import (
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/client"
|
"github.com/docker/docker/client"
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func resourceDockerImageCreate(d *schema.ResourceData, meta interface{}) error {
|
func resourceDockerImageCreate(d *schema.ResourceData, meta interface{}) error {
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ import (
|
||||||
"regexp"
|
"regexp"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/helper/resource"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
|
||||||
"github.com/hashicorp/terraform/terraform"
|
"github.com/hashicorp/terraform-plugin-sdk/terraform"
|
||||||
)
|
)
|
||||||
|
|
||||||
var contentDigestRegexp = regexp.MustCompile(`\A[A-Za-z0-9_\+\.-]+:[A-Fa-f0-9]+\z`)
|
var contentDigestRegexp = regexp.MustCompile(`\A[A-Za-z0-9_\+\.-]+:[A-Fa-f0-9]+\z`)
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/helper/hashcode"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/hashcode"
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func resourceDockerNetwork() *schema.Resource {
|
func resourceDockerNetwork() *schema.Resource {
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,8 @@ import (
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/api/types/network"
|
"github.com/docker/docker/api/types/network"
|
||||||
"github.com/hashicorp/terraform/helper/resource"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func resourceDockerNetworkCreate(d *schema.ResourceData, meta interface{}) error {
|
func resourceDockerNetworkCreate(d *schema.ResourceData, meta interface{}) error {
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ import (
|
||||||
|
|
||||||
"context"
|
"context"
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/hashicorp/terraform/helper/resource"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
|
||||||
"github.com/hashicorp/terraform/terraform"
|
"github.com/hashicorp/terraform-plugin-sdk/terraform"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAccDockerNetwork_basic(t *testing.T) {
|
func TestAccDockerNetwork_basic(t *testing.T) {
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ import (
|
||||||
|
|
||||||
"context"
|
"context"
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func resourceDockerSecret() *schema.Resource {
|
func resourceDockerSecret() *schema.Resource {
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"context"
|
"context"
|
||||||
"github.com/hashicorp/terraform/helper/resource"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
|
||||||
"github.com/hashicorp/terraform/terraform"
|
"github.com/hashicorp/terraform-plugin-sdk/terraform"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAccDockerSecret_basic(t *testing.T) {
|
func TestAccDockerSecret_basic(t *testing.T) {
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
// resourceDockerService create a docker service
|
// resourceDockerService create a docker service
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ import (
|
||||||
"github.com/docker/docker/api/types/mount"
|
"github.com/docker/docker/api/types/mount"
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/client"
|
"github.com/docker/docker/client"
|
||||||
"github.com/hashicorp/terraform/helper/resource"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
type convergeConfig struct {
|
type convergeConfig struct {
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,8 @@ import (
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/api/types/filters"
|
"github.com/docker/docker/api/types/filters"
|
||||||
"github.com/hashicorp/terraform/helper/resource"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
|
||||||
"github.com/hashicorp/terraform/terraform"
|
"github.com/hashicorp/terraform-plugin-sdk/terraform"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ----------------------------------------
|
// ----------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/api/types/volume"
|
"github.com/docker/docker/api/types/volume"
|
||||||
"github.com/hashicorp/terraform/helper/resource"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
"log"
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/hashicorp/terraform/helper/resource"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
|
||||||
"github.com/hashicorp/terraform/terraform"
|
"github.com/hashicorp/terraform-plugin-sdk/terraform"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ import (
|
||||||
"github.com/docker/docker/api/types/container"
|
"github.com/docker/docker/api/types/container"
|
||||||
"github.com/docker/docker/api/types/mount"
|
"github.com/docker/docker/api/types/mount"
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func flattenTaskSpec(in swarm.TaskSpec) []interface{} {
|
func flattenTaskSpec(in swarm.TaskSpec) []interface{} {
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func validateIntegerInRange(min, max int) schema.SchemaValidateFunc {
|
func validateIntegerInRange(min, max int) schema.SchemaValidateFunc {
|
||||||
|
|
|
||||||
7
go.mod
7
go.mod
|
|
@ -9,12 +9,15 @@ require (
|
||||||
github.com/docker/docker-credential-helpers v0.6.2
|
github.com/docker/docker-credential-helpers v0.6.2
|
||||||
github.com/docker/go-connections v0.4.0
|
github.com/docker/go-connections v0.4.0
|
||||||
github.com/docker/go-units v0.0.0-20171221200356-d59758554a3d
|
github.com/docker/go-units v0.0.0-20171221200356-d59758554a3d
|
||||||
|
github.com/gogo/protobuf v1.3.0 // indirect
|
||||||
github.com/gorilla/mux v1.7.2 // indirect
|
github.com/gorilla/mux v1.7.2 // indirect
|
||||||
github.com/hashicorp/terraform v0.12.8
|
github.com/hashicorp/terraform-plugin-sdk v1.0.0
|
||||||
github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c // indirect
|
github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c // indirect
|
||||||
github.com/opencontainers/go-digest v1.0.0-rc1 // indirect
|
github.com/opencontainers/go-digest v1.0.0-rc1 // indirect
|
||||||
github.com/opencontainers/image-spec v0.0.0-20171125024018-577479e4dc27 // indirect
|
github.com/opencontainers/image-spec v0.0.0-20171125024018-577479e4dc27 // indirect
|
||||||
|
github.com/pkg/errors v0.8.1 // indirect
|
||||||
github.com/sirupsen/logrus v1.4.2 // indirect
|
github.com/sirupsen/logrus v1.4.2 // indirect
|
||||||
google.golang.org/grpc v1.21.0 // indirect
|
|
||||||
gotest.tools v2.2.0+incompatible // indirect
|
gotest.tools v2.2.0+incompatible // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
|
go 1.13
|
||||||
|
|
|
||||||
434
go.sum
434
go.sum
|
|
@ -1,101 +1,46 @@
|
||||||
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.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.36.0 h1:+aCSj7tOo2LODWVEuZDZeGCckdt6MlSF+X/rB3wUiS8=
|
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||||
cloud.google.com/go v0.36.0/go.mod h1:RUoy9p/M4ge0HzT8L+SDZ8jg+Q6fth0CiBuhFJpSV40=
|
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
|
||||||
dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU=
|
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
||||||
dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU=
|
cloud.google.com/go v0.45.1 h1:lRi0CHyU+ytlvylOlFKKq0af6JncuyoRh1J+QJBqQx0=
|
||||||
dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4=
|
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
|
||||||
dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU=
|
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||||
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
|
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||||
github.com/Azure/azure-sdk-for-go v21.3.0+incompatible h1:YFvAka2WKAl2xnJkYV1e1b7E2z88AgFszDzWU18ejMY=
|
|
||||||
github.com/Azure/azure-sdk-for-go v21.3.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 v10.15.4+incompatible h1:q+DRrRdbCnkY7f2WxQBx58TwCGkEdMAK/hkZ10g0Pzk=
|
|
||||||
github.com/Azure/go-autorest v10.15.4+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
|
|
||||||
github.com/Azure/go-ntlmssp v0.0.0-20180810175552-4a21cbd618b4 h1:pSm8mp0T2OH2CPmPDPtwHPr3VAQaOwVF/JbllOPP4xA=
|
|
||||||
github.com/Azure/go-ntlmssp v0.0.0-20180810175552-4a21cbd618b4/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
|
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/ChrisTrenkamp/goxpath v0.0.0-20170922090931-c385f95c6022 h1:y8Gs8CzNfDF5AZvjr+5UyGQvQEBL7pwo+v+wX6q9JI8=
|
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||||
github.com/ChrisTrenkamp/goxpath v0.0.0-20170922090931-c385f95c6022/go.mod h1:nuWgzSkT5PnyOd+272uUmV0dnAnAn42Mk7PiQC5VzN4=
|
|
||||||
github.com/Microsoft/go-winio v0.4.11 h1:zoIOcVf0xPN1tnMVbTtEdI+P8OofVk3NObnwOQ6nK2Q=
|
github.com/Microsoft/go-winio v0.4.11 h1:zoIOcVf0xPN1tnMVbTtEdI+P8OofVk3NObnwOQ6nK2Q=
|
||||||
github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
|
github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
|
||||||
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/Unknwon/com v0.0.0-20151008135407-28b053d5a292 h1:tuQ7w+my8a8mkwN7x2TSd7OzTjkZ7rAeSyH4xncuAMI=
|
|
||||||
github.com/Unknwon/com v0.0.0-20151008135407-28b053d5a292/go.mod h1:KYCjqMOeHpNuTOiFQU6WEcTG7poCJrUs0YgyHNtn1no=
|
|
||||||
github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw=
|
|
||||||
github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8=
|
github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8=
|
||||||
github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
|
github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
|
||||||
github.com/agext/levenshtein v1.2.2 h1:0S/Yg6LYmFJ5stwQeRp6EeOcCbj7xiqQSdNelsXvaqE=
|
github.com/agext/levenshtein v1.2.2 h1:0S/Yg6LYmFJ5stwQeRp6EeOcCbj7xiqQSdNelsXvaqE=
|
||||||
github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
|
github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
|
||||||
github.com/agl/ed25519 v0.0.0-20150830182803-278e1ec8e8a6 h1:LoeFxdq5zUCBQPhbQKE6zvoGwHMxCBlqwbH9+9kHoHA=
|
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0=
|
||||||
github.com/agl/ed25519 v0.0.0-20150830182803-278e1ec8e8a6/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0=
|
github.com/apparentlymart/go-cidr v1.0.1 h1:NmIwLZ/KdsjIUlhf+/Np40atNXm/+lZ5txfTJ/SpF+U=
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/apparentlymart/go-cidr v1.0.1/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc=
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3 h1:ZSTrOEhiM5J5RFxEaFvMZVEAM1KvT1YzbEOwB2EAGjA=
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190329064014-6e358769c32a h1:APorzFpCcv6wtD5vmRWYqNm4N55kbepL7c7kTq9XI6A=
|
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190329064014-6e358769c32a/go.mod h1:T9M45xf79ahXVelWoOBmH0y4aC1t5kXO5BxwyakgIGA=
|
|
||||||
github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190103054945-8205d1f41e70 h1:FrF4uxA24DF3ARNXVbUin3wa5fDLaB1Cy8mKks/LRz4=
|
|
||||||
github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190103054945-8205d1f41e70/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
|
|
||||||
github.com/aliyun/aliyun-tablestore-go-sdk v4.1.2+incompatible h1:ABQ7FF+IxSFHDMOTtjCfmMDMHiCq6EsAoCV/9sFinaM=
|
|
||||||
github.com/aliyun/aliyun-tablestore-go-sdk v4.1.2+incompatible/go.mod h1:LDQHRZylxvcg8H7wBIDfvO5g/cy4/sz1iucBlc2l3Jw=
|
|
||||||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
|
|
||||||
github.com/antchfx/xpath v0.0.0-20190129040759-c8489ed3251e/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
|
|
||||||
github.com/antchfx/xquery v0.0.0-20180515051857-ad5b8c7a47b0/go.mod h1:LzD22aAzDP8/dyiCKFp31He4m2GPjl0AFyzDtZzUu9M=
|
|
||||||
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
|
||||||
github.com/apparentlymart/go-cidr v1.0.0 h1:lGDvXx8Lv9QHjrAVP7jyzleG4F9+FkRhJcEsDFxeb8w=
|
|
||||||
github.com/apparentlymart/go-cidr v1.0.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc=
|
|
||||||
github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
|
github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
|
||||||
github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0 h1:MzVXffFUye+ZcSR6opIgz9Co7WcDx6ZcY+RjfFHoA0I=
|
|
||||||
github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
|
|
||||||
github.com/apparentlymart/go-textseg v1.0.0 h1:rRmlIsPEEhUTIKQb7T++Nz/A5Q6C9IuX2wFoYVvnCs0=
|
github.com/apparentlymart/go-textseg v1.0.0 h1:rRmlIsPEEhUTIKQb7T++Nz/A5Q6C9IuX2wFoYVvnCs0=
|
||||||
github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk=
|
github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk=
|
||||||
github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2 h1:7Ip0wMmLHLRJdrloDxZfhMm0xrLXZS8+COSu2bXmEQs=
|
|
||||||
github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
|
||||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
|
||||||
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/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI=
|
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/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM=
|
github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM=
|
||||||
github.com/aws/aws-sdk-go v1.16.36/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
github.com/aws/aws-sdk-go v1.19.39 h1:pIez14zQWSd/TER2Scohm7aCEG2TgoyXSOX6srOKt6o=
|
||||||
github.com/aws/aws-sdk-go v1.22.0 h1:e88V6+dSEyBibUy0ekOydtTfNWzqG3hrtCR8SF6UqqY=
|
github.com/aws/aws-sdk-go v1.19.39/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||||
github.com/aws/aws-sdk-go v1.22.0/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/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas=
|
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas=
|
||||||
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4=
|
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4=
|
||||||
github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=
|
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/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
|
|
||||||
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
|
||||||
github.com/bmatcuk/doublestar v1.1.5 h1:2bNwBOmhyFEFcoB3tGvTD5xanq+4kyOZlB8wFYbMjkk=
|
|
||||||
github.com/bmatcuk/doublestar v1.1.5/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE=
|
|
||||||
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
|
|
||||||
github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
|
|
||||||
github.com/bsm/go-vlq v0.0.0-20150828105119-ec6e8d4f5f4e/go.mod h1:N+BjUcTjSxc2mtRGSCPsat1kze3CUtvJN3/jTXlp29k=
|
github.com/bsm/go-vlq v0.0.0-20150828105119-ec6e8d4f5f4e/go.mod h1:N+BjUcTjSxc2mtRGSCPsat1kze3CUtvJN3/jTXlp29k=
|
||||||
github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=
|
github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=
|
||||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
|
||||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8=
|
|
||||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
|
||||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/coreos/bbolt v1.3.0/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
|
||||||
github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04=
|
|
||||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
|
||||||
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-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
|
||||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
|
||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
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 h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
|
|
||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
|
||||||
github.com/dimchansky/utfbom v1.0.0 h1:fGC2kkf4qOoKqZ4q7iIh+Vef4ubC1c38UDsEyZynZPc=
|
|
||||||
github.com/dimchansky/utfbom v1.0.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
|
|
||||||
github.com/dnaeon/go-vcr v0.0.0-20180920040454-5637cf3d8a31/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
|
|
||||||
github.com/docker/cli v0.0.0-20190524120722-0f337f1dfe57 h1:HU6k9AiXylvZ9yb9VPaUS07CZioy7AjobJH7iaOHC2c=
|
github.com/docker/cli v0.0.0-20190524120722-0f337f1dfe57 h1:HU6k9AiXylvZ9yb9VPaUS07CZioy7AjobJH7iaOHC2c=
|
||||||
github.com/docker/cli v0.0.0-20190524120722-0f337f1dfe57/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
github.com/docker/cli v0.0.0-20190524120722-0f337f1dfe57/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||||
github.com/docker/distribution v0.0.0-20180522175653-f0cc92778478 h1:yCzgNaIN+6iGPBy5h8LVw9ULFerVIiCdPMKiH2A6I/g=
|
github.com/docker/distribution v0.0.0-20180522175653-f0cc92778478 h1:yCzgNaIN+6iGPBy5h8LVw9ULFerVIiCdPMKiH2A6I/g=
|
||||||
|
|
@ -108,31 +53,15 @@ github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKoh
|
||||||
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.0.0-20171221200356-d59758554a3d h1:QEYTOUa4JROW5CSAHU8qc0rD8uhx1tsUkBsSDk8P5eM=
|
github.com/docker/go-units v0.0.0-20171221200356-d59758554a3d h1:QEYTOUa4JROW5CSAHU8qc0rD8uhx1tsUkBsSDk8P5eM=
|
||||||
github.com/docker/go-units v0.0.0-20171221200356-d59758554a3d/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
github.com/docker/go-units v0.0.0-20171221200356-d59758554a3d/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
|
||||||
github.com/dylanmei/iso8601 v0.1.0 h1:812NGQDBcqquTfH5Yeo7lwR0nzx/cKdsmf3qMjPURUI=
|
|
||||||
github.com/dylanmei/iso8601 v0.1.0/go.mod h1:w9KhXSgIyROl1DefbMYIE7UVSIvELTbMrCfx+QkYnoQ=
|
|
||||||
github.com/dylanmei/winrmtest v0.0.0-20190225150635-99b7fe2fddf1/go.mod h1:lcy9/2gH1jn/VCLouHA6tOEwLoNVd4GW6zhuKLmHC2Y=
|
|
||||||
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/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/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
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/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
|
||||||
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/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
|
github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
|
||||||
github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
|
github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.3.0 h1:G8O7TerXerS4F6sx9OV7/nRfJdnXgHZu/S/7F2SN+UE=
|
||||||
github.com/gogo/protobuf v1.2.0 h1:xU6/SpYbvkNYiptHJYEDRseDLvYE7wSqhYYNy0QSUzI=
|
github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||||
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 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/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
|
||||||
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 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk=
|
github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk=
|
||||||
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=
|
||||||
|
|
@ -143,84 +72,55 @@ 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 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/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
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/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
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/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
|
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 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-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
|
|
||||||
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
|
|
||||||
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
|
||||||
github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
|
github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
|
||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
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/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
|
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.1/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 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||||
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
|
github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.3 h1:siORttZ36U2R/WjiJuDz8znElWBiAlO9rVt+mqJt0Cc=
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
|
|
||||||
github.com/gophercloud/gophercloud v0.0.0-20190208042652-bc37892e1968 h1:Pu+HW4kcQozw0QyrTTgLE+3RXNqFhQNNzhbnoLFL83c=
|
|
||||||
github.com/gophercloud/gophercloud v0.0.0-20190208042652-bc37892e1968/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4=
|
|
||||||
github.com/gophercloud/utils v0.0.0-20190128072930-fbb6ab446f01 h1:OgCNGSnEalfkRpn//WGJHhpo7fkP+LhTpvEITZ7CkK4=
|
|
||||||
github.com/gophercloud/utils v0.0.0-20190128072930-fbb6ab446f01/go.mod h1:wjDF8z83zTeg5eMLml5EBSlAhbF7G8DobyI1YsMuyzw=
|
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
|
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
|
||||||
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/gorilla/mux v1.7.2 h1:zoNxOV7WjqXptQOVngLmcSQgXmgk4NMz1HibBchjl/I=
|
github.com/gorilla/mux v1.7.2 h1:zoNxOV7WjqXptQOVngLmcSQgXmgk4NMz1HibBchjl/I=
|
||||||
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
|
||||||
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
|
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
|
||||||
github.com/hashicorp/aws-sdk-go-base v0.3.0 h1:CPWKWCuOwpIFNsy8FUI9IT2QI7mGwgVPc4hrXW9I4L4=
|
|
||||||
github.com/hashicorp/aws-sdk-go-base v0.3.0/go.mod h1:ZIWACGGi0N7a4DZbf15yuE1JQORmWLtBcVM6F5SXNFU=
|
|
||||||
github.com/hashicorp/consul v0.0.0-20171026175957-610f3c86a089 h1:1eDpXAxTh0iPv+1kc9/gfSI2pxRERDsTk/lNGolwHn8=
|
|
||||||
github.com/hashicorp/consul v0.0.0-20171026175957-610f3c86a089/go.mod h1:mFrjN1mfidgJfYP1xrJCF+AfRhr6Eaqhb2+sfyn/OOI=
|
|
||||||
github.com/hashicorp/errwrap v0.0.0-20180715044906-d6c0cd880357/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
github.com/hashicorp/errwrap v0.0.0-20180715044906-d6c0cd880357/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
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-azure-helpers v0.0.0-20190129193224-166dfd221bb2 h1:VBRx+yPYUZaobnn5ANBcOUf4hhWpTHSQgftG4TcDkhI=
|
|
||||||
github.com/hashicorp/go-azure-helpers v0.0.0-20190129193224-166dfd221bb2/go.mod h1:lu62V//auUow6k0IykxLK2DCNW8qTmpm8KqhYVWattA=
|
|
||||||
github.com/hashicorp/go-checkpoint v0.5.0 h1:MFYpPZCnQqQTE18jFwSII6eUQrD/oxMFp3mlgcqk5mU=
|
|
||||||
github.com/hashicorp/go-checkpoint v0.5.0/go.mod h1:7nfLNL10NsxqO4iWuW6tWW0HjZuDrwkBuEQsVcpCOgg=
|
|
||||||
github.com/hashicorp/go-cleanhttp v0.5.0 h1:wvCrVc9TjDls6+YGAF2hAifE1E5U1+b4tH6KdvN3Gig=
|
github.com/hashicorp/go-cleanhttp v0.5.0 h1:wvCrVc9TjDls6+YGAF2hAifE1E5U1+b4tH6KdvN3Gig=
|
||||||
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-getter v1.3.1-0.20190627223108-da0323b9545e h1:6krcdHPiS+aIP9XKzJzSahfjD7jG7Z+4+opm0z39V1M=
|
github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
|
||||||
github.com/hashicorp/go-getter v1.3.1-0.20190627223108-da0323b9545e/go.mod h1:/O1k/AizTN0QmfEKknCYGvICeyKUDqCYA8vvWtGWDeQ=
|
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||||
|
github.com/hashicorp/go-getter v1.4.0 h1:ENHNi8494porjD0ZhIrjlAHnveSFhY7hvOJrV/fsKkw=
|
||||||
|
github.com/hashicorp/go-getter v1.4.0/go.mod h1:7qxyCd8rBfcShwsvxgIguu4KbS3l8bUCwg2Umn7RjeY=
|
||||||
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.0.0-20181001195459-61d530d6c27f h1:Yv9YzBlAETjy6AOX9eLBZ3nshNVRREgerT/3nvxlGho=
|
github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI=
|
||||||
github.com/hashicorp/go-hclog v0.0.0-20181001195459-61d530d6c27f/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
|
github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
|
||||||
github.com/hashicorp/go-immutable-radix v0.0.0-20180129170900-7f3cd4390caa/go.mod h1:6ij3Z20p+OhOkCSrA0gImAWoHYQRGbnlcuk6XYTiaRw=
|
|
||||||
github.com/hashicorp/go-msgpack v0.5.4/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
|
||||||
github.com/hashicorp/go-multierror v0.0.0-20180717150148-3d5d8f294aa0/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
|
github.com/hashicorp/go-multierror v0.0.0-20180717150148-3d5d8f294aa0/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
|
||||||
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-0.20190610192547-a1bc61569a26 h1:hRho44SAoNu1CBtn5r8Q9J3rCs4ZverWZ4R+UeeNuWM=
|
github.com/hashicorp/go-plugin v1.0.1 h1:4OtAfUGbnKC6yS48p0CtMX2oFYtzFZVv6rok3cRWgnE=
|
||||||
github.com/hashicorp/go-plugin v1.0.1-0.20190610192547-a1bc61569a26/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.2 h1:AoISa4P4IsW0/m4T6St8Yw38gTl5GtBAgfkhYh1xAz4=
|
|
||||||
github.com/hashicorp/go-retryablehttp v0.5.2/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
|
|
||||||
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-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo=
|
github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo=
|
||||||
github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I=
|
github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I=
|
||||||
github.com/hashicorp/go-slug v0.3.0 h1:L0c+AvH/J64iMNF4VqRaRku2DMTEuHioPVS7kMjWIU8=
|
|
||||||
github.com/hashicorp/go-slug v0.3.0/go.mod h1:I5tq5Lv0E2xcNXNkmx7BSfzi1PsJ2cNjs3cC3LwyhK8=
|
|
||||||
github.com/hashicorp/go-sockaddr v0.0.0-20180320115054-6d291a969b86/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
|
||||||
github.com/hashicorp/go-tfe v0.3.16 h1:GS2yv580p0co4j3FBVaC6Zahd9mxdCGehhJ0qqzFMH0=
|
|
||||||
github.com/hashicorp/go-tfe v0.3.16/go.mod h1:SuPHR+OcxvzBZNye7nGPfwZTEyd3rWPfLVbCgyZPezM=
|
|
||||||
github.com/hashicorp/go-uuid v1.0.0 h1:RS8zrF7PhGwyNPOtxSClXXj9HA8feRnJzgnI1RJCSnM=
|
|
||||||
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 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-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0=
|
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/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
||||||
github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=
|
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/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/hcl v0.0.0-20170504190234-a4b07c25de5f h1:UdxlrJz4JOnY8W+DbLISwf2B8WXEolNRA8BGCwI9jws=
|
github.com/hashicorp/hcl v0.0.0-20170504190234-a4b07c25de5f h1:UdxlrJz4JOnY8W+DbLISwf2B8WXEolNRA8BGCwI9jws=
|
||||||
github.com/hashicorp/hcl v0.0.0-20170504190234-a4b07c25de5f/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
|
github.com/hashicorp/hcl v0.0.0-20170504190234-a4b07c25de5f/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
|
||||||
github.com/hashicorp/hcl2 v0.0.0-20190821123243-0c888d1241f6 h1:JImQpEeUQ+0DPFMaWzLA0GdUNPaUlCXLpfiqkSZBUfc=
|
github.com/hashicorp/hcl2 v0.0.0-20190821123243-0c888d1241f6 h1:JImQpEeUQ+0DPFMaWzLA0GdUNPaUlCXLpfiqkSZBUfc=
|
||||||
|
|
@ -229,72 +129,41 @@ github.com/hashicorp/hil v0.0.0-20190212112733-ab17b08d6590 h1:2yzhWGdgQUWZUCNK+
|
||||||
github.com/hashicorp/hil v0.0.0-20190212112733-ab17b08d6590/go.mod h1:n2TSygSNwsLJ76m8qFXTSc7beTb+auJxYdqrnoqwZWE=
|
github.com/hashicorp/hil v0.0.0-20190212112733-ab17b08d6590/go.mod h1:n2TSygSNwsLJ76m8qFXTSc7beTb+auJxYdqrnoqwZWE=
|
||||||
github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y=
|
github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y=
|
||||||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
||||||
github.com/hashicorp/memberlist v0.1.0/go.mod h1:ncdBp14cuox2iFOq3kDiquKU6fqsTBc3W6JvZwjxxsE=
|
|
||||||
github.com/hashicorp/serf v0.0.0-20160124182025-e4ec8cc423bb h1:ZbgmOQt8DOg796figP87/EFCVx2v2h9yRvwHF/zceX4=
|
|
||||||
github.com/hashicorp/serf v0.0.0-20160124182025-e4ec8cc423bb/go.mod h1:h/Ru6tmZazX7WO/GDmwdpS975F019L4t5ng5IgwbNrE=
|
|
||||||
github.com/hashicorp/terraform v0.12.8 h1:51Z5K8oj42KZi0IiTf99wMTujDpvsTd3eaF1k5z1URk=
|
|
||||||
github.com/hashicorp/terraform v0.12.8/go.mod h1:8rXMj8q+hRsR/28WWWyiHu1GEDSjWaHPoV14E66X5VU=
|
|
||||||
github.com/hashicorp/terraform-config-inspect v0.0.0-20190821133035-82a99dc22ef4 h1:fTkL0YwjohGyN7AqsDhz6bwcGBpT+xBqi3Qhpw58Juw=
|
github.com/hashicorp/terraform-config-inspect v0.0.0-20190821133035-82a99dc22ef4 h1:fTkL0YwjohGyN7AqsDhz6bwcGBpT+xBqi3Qhpw58Juw=
|
||||||
github.com/hashicorp/terraform-config-inspect v0.0.0-20190821133035-82a99dc22ef4/go.mod h1:JDmizlhaP5P0rYTTZB0reDMefAiJyfWPEtugV4in1oI=
|
github.com/hashicorp/terraform-config-inspect v0.0.0-20190821133035-82a99dc22ef4/go.mod h1:JDmizlhaP5P0rYTTZB0reDMefAiJyfWPEtugV4in1oI=
|
||||||
github.com/hashicorp/vault v0.10.4/go.mod h1:KfSyffbKxoVyspOdlaGVjIuwLobi07qD1bAbosPMpP0=
|
github.com/hashicorp/terraform-plugin-sdk v1.0.0 h1:3AjuuV1LJKs1NlG+heUgqWN6/QCSx2kDhyS6K7F0fTw=
|
||||||
|
github.com/hashicorp/terraform-plugin-sdk v1.0.0/go.mod h1:NuwtLpEpPsFaKJPJNGtMcn9vlhe6Ofe+Y6NqXhJgV2M=
|
||||||
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/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
|
|
||||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||||
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
|
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/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||||
github.com/joyent/triton-go v0.0.0-20180313100802-d8f9c0314926 h1:kie3qOosvRKqwij2HGzXWffwpXvcqfPPXRUw8I4F/mg=
|
|
||||||
github.com/joyent/triton-go v0.0.0-20180313100802-d8f9c0314926/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA=
|
|
||||||
github.com/json-iterator/go v1.1.5 h1:gL2yXlmiIo4+t+y32d4WGwOjKGYcGOuyrg46vadswDE=
|
|
||||||
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
|
||||||
github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE=
|
|
||||||
github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
|
||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
|
||||||
github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
|
|
||||||
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA=
|
|
||||||
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
|
|
||||||
github.com/keybase/go-crypto v0.0.0-20161004153544-93f5b35093ba h1:NARVGAAgEXvoMeNPHhPFt1SBt1VMznA3Gnz9d0qj+co=
|
github.com/keybase/go-crypto v0.0.0-20161004153544-93f5b35093ba h1:NARVGAAgEXvoMeNPHhPFt1SBt1VMznA3Gnz9d0qj+co=
|
||||||
github.com/keybase/go-crypto v0.0.0-20161004153544-93f5b35093ba/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M=
|
github.com/keybase/go-crypto v0.0.0-20161004153544-93f5b35093ba/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M=
|
||||||
|
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
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 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
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/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3vkb4ax0b5D2DHbNAUsen0Gx5wZoq3lV4=
|
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3vkb4ax0b5D2DHbNAUsen0Gx5wZoq3lV4=
|
||||||
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
|
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
|
||||||
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
|
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
|
||||||
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||||
github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
|
github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4=
|
||||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
|
||||||
github.com/lusis/go-artifactory v0.0.0-20160115162124-7e4ce345df82 h1:wnfcqULT+N2seWf6y4yHzmi7GD2kNx4Ute0qArktD48=
|
|
||||||
github.com/lusis/go-artifactory v0.0.0-20160115162124-7e4ce345df82/go.mod h1:y54tfGmO3NKssKveTEFFzH8C/akrSOy/iW9qEAUDV84=
|
|
||||||
github.com/marstr/guid v1.1.0 h1:/M4H/1G4avsieL6BbUwCOBzulmoeKVP5ux/3mQNnbyI=
|
|
||||||
github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
|
|
||||||
github.com/masterzen/simplexml v0.0.0-20160608183007-4572e39b1ab9 h1:SmVbOZFWAlyQshuMfOkiAx1f5oUTsOGG5IXplAEYeeM=
|
|
||||||
github.com/masterzen/simplexml v0.0.0-20160608183007-4572e39b1ab9/go.mod h1:kCEbxUJlNDEBNbdQMkPSp6yaKcRXVI6f4ddk8Riv4bc=
|
|
||||||
github.com/masterzen/winrm v0.0.0-20190223112901-5e5c9a7fe54b h1:/1RFh2SLCJ+tEnT73+Fh5R2AO89sQqs8ba7o+hx1G0Y=
|
|
||||||
github.com/masterzen/winrm v0.0.0-20190223112901-5e5c9a7fe54b/go.mod h1:wr1VqkwW0AB5JS0QLy5GpVMS9E3VtRoSYXUYyVk46KY=
|
|
||||||
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.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
|
|
||||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
|
||||||
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.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw=
|
|
||||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
|
||||||
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
github.com/mattn/go-shellwords v1.0.4 h1:xmZZyxuP+bYKAKkA9ABYXVNJ+G/Wf3R8d8vAP3LDJJk=
|
|
||||||
github.com/mattn/go-shellwords v1.0.4/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
|
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
|
||||||
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
|
|
||||||
github.com/miekg/dns v1.0.8/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
|
||||||
github.com/mitchellh/cli v1.0.0 h1:iGBIsUe3+HZ/AD/Vd7DErOt5sU9fa8Uj7A2s1aggv1Y=
|
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/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
|
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
|
||||||
|
|
@ -305,8 +174,6 @@ github.com/mitchellh/go-homedir v1.0.0 h1:vKb8ShqSby24Yrqr/yDYkuFz8d0WUjys40rvnG
|
||||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
github.com/mitchellh/go-linereader v0.0.0-20190213213312-1b945b3263eb h1:GRiLv4rgyqjqzxbhJke65IYUf4NCOOvrPOJbV/sPxkM=
|
|
||||||
github.com/mitchellh/go-linereader v0.0.0-20190213213312-1b945b3263eb/go.mod h1:OaY7UOoTkkrX3wRwjpYRKafIkkyeD0UtweSHAWWiqQM=
|
|
||||||
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=
|
||||||
|
|
@ -314,27 +181,14 @@ github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzC
|
||||||
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
||||||
github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4=
|
github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4=
|
||||||
github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
||||||
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/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/panicwrap v0.0.0-20190213213626-17011010aaa4 h1:jw9tsdJ1FQmUkyTXdIF/nByTX+mMnnp16glnvGZMsC4=
|
|
||||||
github.com/mitchellh/panicwrap v0.0.0-20190213213626-17011010aaa4/go.mod h1:YYMf4xtQnR8LRC0vKi3afvQ5QwRPQ17zjcpkBCufb+I=
|
|
||||||
github.com/mitchellh/prefixedio v0.0.0-20190213213902-5733675afd51 h1:eD92Am0Qf3rqhsOeA1zwBHSfRkoHrt4o6uORamdmJP8=
|
|
||||||
github.com/mitchellh/prefixedio v0.0.0-20190213213902-5733675afd51/go.mod h1:kB1naBgV9ORnkiTVeyJOI1DavaJkG4oNIq0Af6ZVKUo=
|
|
||||||
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 h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
||||||
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
|
|
||||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
|
||||||
github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c h1:nXxl5PrvVm2L/wCy8dQu6DMTwH4oIuGN8GJDAlqDdVE=
|
github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c h1:nXxl5PrvVm2L/wCy8dQu6DMTwH4oIuGN8GJDAlqDdVE=
|
||||||
github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
|
github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
|
||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
|
||||||
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
|
|
||||||
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
|
|
||||||
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ=
|
|
||||||
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U=
|
|
||||||
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/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
|
@ -344,70 +198,20 @@ github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2i
|
||||||
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||||
github.com/opencontainers/image-spec v0.0.0-20171125024018-577479e4dc27 h1:eNXDpuTnIrrQmG7HYGA2YljYjhFPQF10c1vV3iutuyY=
|
github.com/opencontainers/image-spec v0.0.0-20171125024018-577479e4dc27 h1:eNXDpuTnIrrQmG7HYGA2YljYjhFPQF10c1vV3iutuyY=
|
||||||
github.com/opencontainers/image-spec v0.0.0-20171125024018-577479e4dc27/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
|
github.com/opencontainers/image-spec v0.0.0-20171125024018-577479e4dc27/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
|
||||||
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
|
|
||||||
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
|
|
||||||
github.com/packer-community/winrmcp v0.0.0-20180102160824-81144009af58 h1:m3CEgv3ah1Rhy82L+c0QG/U3VyY1UsvsIdkh0/rU97Y=
|
|
||||||
github.com/packer-community/winrmcp v0.0.0-20180102160824-81144009af58/go.mod h1:f6Izs6JvFTdnRbziASagjZ2vmf55NSIkC/weStxCHqk=
|
|
||||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
|
||||||
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/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
|
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
github.com/pkg/errors v0.8.0/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/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||||
github.com/posener/complete v1.2.1 h1:LrvDIY//XNo65Lq84G/akBuMGlawHvGBABv8f/ZN6DI=
|
github.com/posener/complete v1.2.1 h1:LrvDIY//XNo65Lq84G/akBuMGlawHvGBABv8f/ZN6DI=
|
||||||
github.com/posener/complete v1.2.1/go.mod h1:6gapUrK/U1TAN7ciCoNRIdVC5sbdBTUh1DKN0g6uH7E=
|
github.com/posener/complete v1.2.1/go.mod h1:6gapUrK/U1TAN7ciCoNRIdVC5sbdBTUh1DKN0g6uH7E=
|
||||||
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.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.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
|
||||||
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
|
||||||
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-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/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
|
||||||
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
|
|
||||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
|
||||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
|
||||||
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
|
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
|
||||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
||||||
github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY=
|
|
||||||
github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM=
|
|
||||||
github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0=
|
|
||||||
github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
|
|
||||||
github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
|
|
||||||
github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw=
|
|
||||||
github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI=
|
|
||||||
github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU=
|
|
||||||
github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag=
|
|
||||||
github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg=
|
|
||||||
github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw=
|
|
||||||
github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y=
|
|
||||||
github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
|
|
||||||
github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q=
|
|
||||||
github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ=
|
|
||||||
github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I=
|
|
||||||
github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0=
|
|
||||||
github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ=
|
|
||||||
github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk=
|
|
||||||
github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
|
||||||
github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4=
|
|
||||||
github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw=
|
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
|
||||||
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
|
github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc=
|
||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
||||||
github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
|
|
||||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
|
||||||
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
|
|
||||||
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
|
|
||||||
github.com/spf13/afero v1.2.1 h1:qgMbHoJbPbw579P+1zVY+6n4nIFuIchaIjzZ/I/Yq8M=
|
|
||||||
github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
|
||||||
github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
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=
|
||||||
|
|
@ -415,78 +219,56 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
|
||||||
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/svanharmelen/jsonapi v0.0.0-20180618144545-0c0828c3f16d h1:Z4EH+5EffvBEhh37F0C0DnpklTMh00JOkjW5zK3ofBI=
|
|
||||||
github.com/svanharmelen/jsonapi v0.0.0-20180618144545-0c0828c3f16d/go.mod h1:BSTlc8jOjh0niykqEGVXOLXdi9o0r0kR8tCYiMvjFgw=
|
|
||||||
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
|
|
||||||
github.com/terraform-providers/terraform-provider-openstack v1.15.0 h1:adpjqej+F8BAX9dHmuPF47sUIkgifeqBu6p7iCsyj0Y=
|
|
||||||
github.com/terraform-providers/terraform-provider-openstack v1.15.0/go.mod h1:2aQ6n/BtChAl1y2S60vebhyJyZXBsuAI5G4+lHrT1Ew=
|
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
|
||||||
github.com/ugorji/go v0.0.0-20180813092308-00b869d2f4a5 h1:cMjKdf4PxEBN9K5HaD9UMW8gkTbM0kMzkTa9SJe0WNQ=
|
|
||||||
github.com/ugorji/go v0.0.0-20180813092308-00b869d2f4a5/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
|
|
||||||
github.com/ulikunitz/xz v0.5.5 h1:pFrO0lVpTBXLpYw+pnLj6TbvHuyjXMfjGeCwSqCVwok=
|
github.com/ulikunitz/xz v0.5.5 h1:pFrO0lVpTBXLpYw+pnLj6TbvHuyjXMfjGeCwSqCVwok=
|
||||||
github.com/ulikunitz/xz v0.5.5/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
|
github.com/ulikunitz/xz v0.5.5/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
|
||||||
|
github.com/vmihailenco/msgpack v3.3.3+incompatible h1:wapg9xDUZDzGCNFlwc5SqI1rvcciqcxEHac4CYj89xI=
|
||||||
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
|
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
|
||||||
github.com/vmihailenco/msgpack v4.0.1+incompatible h1:RMF1enSPeKTlXrXdOcqjFUElywVZjjC6pqse21bKbEU=
|
|
||||||
github.com/vmihailenco/msgpack v4.0.1+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
|
|
||||||
github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70=
|
|
||||||
github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=
|
|
||||||
github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
|
||||||
github.com/xlab/treeprint v0.0.0-20161029104018-1d6e34225557 h1:Jpn2j6wHkC9wJv5iMfJhKqrZJx3TahFx+7sbZ7zQdxs=
|
|
||||||
github.com/xlab/treeprint v0.0.0-20161029104018-1d6e34225557/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
|
|
||||||
github.com/zclconf/go-cty v1.0.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s=
|
github.com/zclconf/go-cty v1.0.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s=
|
||||||
github.com/zclconf/go-cty v1.0.1-0.20190708163926-19588f92a98f h1:sq2p8SN6ji66CFEQFIWLlD/gFmGtr5hBrOzv5nLlGfA=
|
github.com/zclconf/go-cty v1.1.0 h1:uJwc9HiBOCpoKIObTQaLR+tsEXx1HBHnOsOOpcdhZgw=
|
||||||
github.com/zclconf/go-cty v1.0.1-0.20190708163926-19588f92a98f/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s=
|
github.com/zclconf/go-cty v1.1.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s=
|
||||||
github.com/zclconf/go-cty-yaml v1.0.1 h1:up11wlgAaDvlAGENcFDnZgkn0qUJurso7k6EpURKNF8=
|
github.com/zclconf/go-cty-yaml v1.0.1 h1:up11wlgAaDvlAGENcFDnZgkn0qUJurso7k6EpURKNF8=
|
||||||
github.com/zclconf/go-cty-yaml v1.0.1/go.mod h1:IP3Ylp0wQpYm50IHK8OZWKMu6sPJIUgKa8XhiVHura0=
|
github.com/zclconf/go-cty-yaml v1.0.1/go.mod h1:IP3Ylp0wQpYm50IHK8OZWKMu6sPJIUgKa8XhiVHura0=
|
||||||
go.opencensus.io v0.18.0 h1:Mk5rgZcggtbvtAun5aJzAtjKKN/t0R3jJPlWILlv938=
|
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||||
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
|
go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4=
|
||||||
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||||
go.opencensus.io v0.20.2 h1:NAfh7zF0/3/HqtMvJNZ/RFrSlCE6ZTlHmKfhL/Dm1Jk=
|
|
||||||
go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
|
||||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
|
||||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
|
||||||
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
|
||||||
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
|
|
||||||
golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=
|
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
|
||||||
golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
|
||||||
golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
|
||||||
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
|
||||||
golang.org/x/crypto v0.0.0-20190222235706-ffb98f73852f/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
|
||||||
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-20190426145343-a29dc8fdc734 h1:p/H982KKEjUnLJkM3tt/LemDnOc1GiZL5FCVlORJ5zo=
|
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734 h1:p/H982KKEjUnLJkM3tt/LemDnOc1GiZL5FCVlORJ5zo=
|
||||||
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc=
|
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 h1:7KByu05hhLed2MO29w7p1XfZvZ13m8mub3shuVftRs0=
|
||||||
|
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
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-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||||
|
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||||
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-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/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||||
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-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180811021610-c39426892332/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/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-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181106065722-10aee1819953/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-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-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 h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
|
||||||
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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190502183928-7f726cade0ab h1:9RfW3ktsOZxgo9YNbBAjq1FWzc/igwEcUzZz8IXgSbk=
|
golang.org/x/net v0.0.0-20190502183928-7f726cade0ab h1:9RfW3ktsOZxgo9YNbBAjq1FWzc/igwEcUzZz8IXgSbk=
|
||||||
golang.org/x/net v0.0.0-20190502183928-7f726cade0ab/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190502183928-7f726cade0ab/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
|
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-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI=
|
||||||
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/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
|
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/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 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw=
|
||||||
|
|
@ -496,90 +278,82 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEha
|
||||||
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-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-20181029174526-d69651ed3497/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-20181213200352-4d1cda033e06/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-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-20190221075227-b4e8571b14e0/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
|
||||||
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-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82 h1:vsphBvatvfbhlb4PO1BYSr9dzugGxJ/SQHoNufZJq1w=
|
golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82 h1:vsphBvatvfbhlb4PO1BYSr9dzugGxJ/SQHoNufZJq1w=
|
||||||
golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa h1:KIDDMLT1O0Nr7TSxp8xM5tJcdn8tgyAONntO829og1M=
|
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0 h1:HyfiK1WMnHj5FXFXatD+Qs1A/xC2Run6RzeW1SyHxpc=
|
||||||
|
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
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.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/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg=
|
||||||
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=
|
||||||
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-20180828015842-6cd1fcedba52/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-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/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-20190312151545-0bb0c0a6e846/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-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
google.golang.org/api v0.1.0 h1:K6z2u68e86TPdSdefXdzvXgR1zEMa+459vBSfWYAZkI=
|
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
|
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
google.golang.org/api v0.3.1 h1:oJra/lMfmtm13/rgY/8i3MzjFWYXvQIAKjQ3HqofMk8=
|
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||||
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
|
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
||||||
|
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||||
|
google.golang.org/api v0.9.0 h1:jbyannxz0XFD3zdjgrSUsaJbgpH4eTrkdhRChkHPfO8=
|
||||||
|
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||||
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.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 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.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I=
|
||||||
|
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
|
||||||
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-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
|
||||||
google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
|
|
||||||
google.golang.org/genproto v0.0.0-20190201180003-4b09977fb922 h1:mBVYJnbrXLA/ZCBTCe7PtEgAUP+1bg92qTaFoPHdz+8=
|
|
||||||
google.golang.org/genproto v0.0.0-20190201180003-4b09977fb922/go.mod h1:L3J43x8/uS+qIUoksaLKe6OS3nUKxOKuIFz1sl2/jx4=
|
|
||||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19 h1:Lj2SnHtxkRGJDqnGaSjo+CCdIieEnwVazbOXILwQemk=
|
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/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-20190425155659-357c62f0e4bb/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-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
|
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/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.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.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.21.0 h1:G+97AoqBnmZIT91cLG/EkCoK9NSelj64P8bOHHNmGn0=
|
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||||
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A=
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
|
||||||
gopkg.in/ini.v1 v1.42.0 h1:7N3gPTt50s8GuLortA00n8AqRTk75qOP98+mTPpgzRk=
|
|
||||||
gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
|
||||||
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/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=
|
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
|
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
|
||||||
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
|
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
|
||||||
grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
|
|
||||||
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=
|
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=
|
||||||
howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0=
|
howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0=
|
||||||
sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck=
|
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||||
sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0=
|
|
||||||
|
|
|
||||||
2
main.go
2
main.go
|
|
@ -1,7 +1,7 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/hashicorp/terraform/plugin"
|
"github.com/hashicorp/terraform-plugin-sdk/plugin"
|
||||||
"github.com/terraform-providers/terraform-provider-docker/docker"
|
"github.com/terraform-providers/terraform-provider-docker/docker"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
15
vendor/cloud.google.com/go/AUTHORS
generated
vendored
15
vendor/cloud.google.com/go/AUTHORS
generated
vendored
|
|
@ -1,15 +0,0 @@
|
||||||
# This is the official list of cloud authors for copyright purposes.
|
|
||||||
# This file is distinct from the CONTRIBUTORS files.
|
|
||||||
# See the latter for an explanation.
|
|
||||||
|
|
||||||
# Names should be added to this file as:
|
|
||||||
# Name or Organization <email address>
|
|
||||||
# The email address is not required for organizations.
|
|
||||||
|
|
||||||
Filippo Valsorda <hi@filippo.io>
|
|
||||||
Google Inc.
|
|
||||||
Ingo Oeser <nightlyone@googlemail.com>
|
|
||||||
Palm Stone Games, Inc.
|
|
||||||
Paweł Knap <pawelknap88@gmail.com>
|
|
||||||
Péter Szilágyi <peterke@gmail.com>
|
|
||||||
Tyler Treat <ttreat31@gmail.com>
|
|
||||||
40
vendor/cloud.google.com/go/CONTRIBUTORS
generated
vendored
40
vendor/cloud.google.com/go/CONTRIBUTORS
generated
vendored
|
|
@ -1,40 +0,0 @@
|
||||||
# People who have agreed to one of the CLAs and can contribute patches.
|
|
||||||
# The AUTHORS file lists the copyright holders; this file
|
|
||||||
# lists people. For example, Google employees are listed here
|
|
||||||
# but not in AUTHORS, because Google holds the copyright.
|
|
||||||
#
|
|
||||||
# https://developers.google.com/open-source/cla/individual
|
|
||||||
# https://developers.google.com/open-source/cla/corporate
|
|
||||||
#
|
|
||||||
# Names should be added to this file as:
|
|
||||||
# Name <email address>
|
|
||||||
|
|
||||||
# Keep the list alphabetically sorted.
|
|
||||||
|
|
||||||
Alexis Hunt <lexer@google.com>
|
|
||||||
Andreas Litt <andreas.litt@gmail.com>
|
|
||||||
Andrew Gerrand <adg@golang.org>
|
|
||||||
Brad Fitzpatrick <bradfitz@golang.org>
|
|
||||||
Burcu Dogan <jbd@google.com>
|
|
||||||
Dave Day <djd@golang.org>
|
|
||||||
David Sansome <me@davidsansome.com>
|
|
||||||
David Symonds <dsymonds@golang.org>
|
|
||||||
Filippo Valsorda <hi@filippo.io>
|
|
||||||
Glenn Lewis <gmlewis@google.com>
|
|
||||||
Ingo Oeser <nightlyone@googlemail.com>
|
|
||||||
James Hall <james.hall@shopify.com>
|
|
||||||
Johan Euphrosine <proppy@google.com>
|
|
||||||
Jonathan Amsterdam <jba@google.com>
|
|
||||||
Kunpei Sakai <namusyaka@gmail.com>
|
|
||||||
Luna Duclos <luna.duclos@palmstonegames.com>
|
|
||||||
Magnus Hiie <magnus.hiie@gmail.com>
|
|
||||||
Mario Castro <mariocaster@gmail.com>
|
|
||||||
Michael McGreevy <mcgreevy@golang.org>
|
|
||||||
Omar Jarjur <ojarjur@google.com>
|
|
||||||
Paweł Knap <pawelknap88@gmail.com>
|
|
||||||
Péter Szilágyi <peterke@gmail.com>
|
|
||||||
Sarah Adams <shadams@google.com>
|
|
||||||
Thanatat Tamtan <acoshift@gmail.com>
|
|
||||||
Toby Burress <kurin@google.com>
|
|
||||||
Tuo Shan <shantuo@google.com>
|
|
||||||
Tyler Treat <ttreat31@gmail.com>
|
|
||||||
13
vendor/cloud.google.com/go/compute/metadata/metadata.go
generated
vendored
13
vendor/cloud.google.com/go/compute/metadata/metadata.go
generated
vendored
|
|
@ -227,6 +227,9 @@ func InternalIP() (string, error) { return defaultClient.InternalIP() }
|
||||||
// ExternalIP returns the instance's primary external (public) IP address.
|
// ExternalIP returns the instance's primary external (public) IP address.
|
||||||
func ExternalIP() (string, error) { return defaultClient.ExternalIP() }
|
func ExternalIP() (string, error) { return defaultClient.ExternalIP() }
|
||||||
|
|
||||||
|
// Email calls Client.Email on the default client.
|
||||||
|
func Email(serviceAccount string) (string, error) { return defaultClient.Email(serviceAccount) }
|
||||||
|
|
||||||
// Hostname returns the instance's hostname. This will be of the form
|
// Hostname returns the instance's hostname. This will be of the form
|
||||||
// "<instanceID>.c.<projID>.internal".
|
// "<instanceID>.c.<projID>.internal".
|
||||||
func Hostname() (string, error) { return defaultClient.Hostname() }
|
func Hostname() (string, error) { return defaultClient.Hostname() }
|
||||||
|
|
@ -367,6 +370,16 @@ func (c *Client) InternalIP() (string, error) {
|
||||||
return c.getTrimmed("instance/network-interfaces/0/ip")
|
return c.getTrimmed("instance/network-interfaces/0/ip")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Email returns the email address associated with the service account.
|
||||||
|
// The account may be empty or the string "default" to use the instance's
|
||||||
|
// main account.
|
||||||
|
func (c *Client) Email(serviceAccount string) (string, error) {
|
||||||
|
if serviceAccount == "" {
|
||||||
|
serviceAccount = "default"
|
||||||
|
}
|
||||||
|
return c.getTrimmed("instance/service-accounts/" + serviceAccount + "/email")
|
||||||
|
}
|
||||||
|
|
||||||
// ExternalIP returns the instance's primary external (public) IP address.
|
// ExternalIP returns the instance's primary external (public) IP address.
|
||||||
func (c *Client) ExternalIP() (string, error) {
|
func (c *Client) ExternalIP() (string, error) {
|
||||||
return c.getTrimmed("instance/network-interfaces/0/access-configs/0/external-ip")
|
return c.getTrimmed("instance/network-interfaces/0/access-configs/0/external-ip")
|
||||||
|
|
|
||||||
29
vendor/cloud.google.com/go/internal/trace/trace.go
generated
vendored
29
vendor/cloud.google.com/go/internal/trace/trace.go
generated
vendored
|
|
@ -16,6 +16,7 @@ package trace
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"go.opencensus.io/trace"
|
"go.opencensus.io/trace"
|
||||||
"google.golang.org/api/googleapi"
|
"google.golang.org/api/googleapi"
|
||||||
|
|
@ -38,7 +39,7 @@ func EndSpan(ctx context.Context, err error) {
|
||||||
span.End()
|
span.End()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToStatus interrogates an error and converts it to an appropriate
|
// toStatus interrogates an error and converts it to an appropriate
|
||||||
// OpenCensus status.
|
// OpenCensus status.
|
||||||
func toStatus(err error) trace.Status {
|
func toStatus(err error) trace.Status {
|
||||||
if err2, ok := err.(*googleapi.Error); ok {
|
if err2, ok := err.(*googleapi.Error); ok {
|
||||||
|
|
@ -50,7 +51,7 @@ func toStatus(err error) trace.Status {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO (deklerk): switch to using OpenCensus function when it becomes available.
|
// TODO(deklerk): switch to using OpenCensus function when it becomes available.
|
||||||
// Reference: https://github.com/googleapis/googleapis/blob/26b634d2724ac5dd30ae0b0cbfb01f07f2e4050e/google/rpc/code.proto
|
// Reference: https://github.com/googleapis/googleapis/blob/26b634d2724ac5dd30ae0b0cbfb01f07f2e4050e/google/rpc/code.proto
|
||||||
func httpStatusCodeToOCCode(httpStatusCode int) int32 {
|
func httpStatusCodeToOCCode(httpStatusCode int) int32 {
|
||||||
switch httpStatusCode {
|
switch httpStatusCode {
|
||||||
|
|
@ -82,3 +83,27 @@ func httpStatusCodeToOCCode(httpStatusCode int) int32 {
|
||||||
return int32(code.Code_UNKNOWN)
|
return int32(code.Code_UNKNOWN)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: (odeke-em): perhaps just pass around spans due to the cost
|
||||||
|
// incurred from using trace.FromContext(ctx) yet we could avoid
|
||||||
|
// throwing away the work done by ctx, span := trace.StartSpan.
|
||||||
|
func TracePrintf(ctx context.Context, attrMap map[string]interface{}, format string, args ...interface{}) {
|
||||||
|
var attrs []trace.Attribute
|
||||||
|
for k, v := range attrMap {
|
||||||
|
var a trace.Attribute
|
||||||
|
switch v := v.(type) {
|
||||||
|
case string:
|
||||||
|
a = trace.StringAttribute(k, v)
|
||||||
|
case bool:
|
||||||
|
a = trace.BoolAttribute(k, v)
|
||||||
|
case int:
|
||||||
|
a = trace.Int64Attribute(k, int64(v))
|
||||||
|
case int64:
|
||||||
|
a = trace.Int64Attribute(k, v)
|
||||||
|
default:
|
||||||
|
a = trace.StringAttribute(k, fmt.Sprintf("%#v", v))
|
||||||
|
}
|
||||||
|
attrs = append(attrs, a)
|
||||||
|
}
|
||||||
|
trace.FromContext(ctx).Annotatef(attrs, format, args...)
|
||||||
|
}
|
||||||
|
|
|
||||||
13
vendor/cloud.google.com/go/internal/version/update_version.sh
generated
vendored
13
vendor/cloud.google.com/go/internal/version/update_version.sh
generated
vendored
|
|
@ -1,4 +1,17 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
# Copyright 2019 Google LLC
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
today=$(date +%Y%m%d)
|
today=$(date +%Y%m%d)
|
||||||
|
|
||||||
|
|
|
||||||
2
vendor/cloud.google.com/go/internal/version/version.go
generated
vendored
2
vendor/cloud.google.com/go/internal/version/version.go
generated
vendored
|
|
@ -26,7 +26,7 @@ import (
|
||||||
|
|
||||||
// Repo is the current version of the client libraries in this
|
// Repo is the current version of the client libraries in this
|
||||||
// repo. It should be a date in YYYYMMDD format.
|
// repo. It should be a date in YYYYMMDD format.
|
||||||
const Repo = "20180226"
|
const Repo = "20190802"
|
||||||
|
|
||||||
// Go returns the Go runtime version. The returned string
|
// Go returns the Go runtime version. The returned string
|
||||||
// has no whitespace.
|
// has no whitespace.
|
||||||
|
|
|
||||||
32
vendor/cloud.google.com/go/storage/README.md
generated
vendored
Normal file
32
vendor/cloud.google.com/go/storage/README.md
generated
vendored
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
## Cloud Storage [](https://godoc.org/cloud.google.com/go/storage)
|
||||||
|
|
||||||
|
- [About Cloud Storage](https://cloud.google.com/storage/)
|
||||||
|
- [API documentation](https://cloud.google.com/storage/docs)
|
||||||
|
- [Go client documentation](https://godoc.org/cloud.google.com/go/storage)
|
||||||
|
- [Complete sample programs](https://github.com/GoogleCloudPlatform/golang-samples/tree/master/storage)
|
||||||
|
|
||||||
|
### Example Usage
|
||||||
|
|
||||||
|
First create a `storage.Client` to use throughout your application:
|
||||||
|
|
||||||
|
[snip]:# (storage-1)
|
||||||
|
```go
|
||||||
|
client, err := storage.NewClient(ctx)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
[snip]:# (storage-2)
|
||||||
|
```go
|
||||||
|
// Read the object1 from bucket.
|
||||||
|
rc, err := client.Bucket("bucket").Object("object1").NewReader(ctx)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
defer rc.Close()
|
||||||
|
body, err := ioutil.ReadAll(rc)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
```
|
||||||
14
vendor/cloud.google.com/go/storage/bucket.go
generated
vendored
14
vendor/cloud.google.com/go/storage/bucket.go
generated
vendored
|
|
@ -272,6 +272,9 @@ type BucketAttrs struct {
|
||||||
// "DURABLE_REDUCED_AVAILABILITY". Defaults to "STANDARD", which
|
// "DURABLE_REDUCED_AVAILABILITY". Defaults to "STANDARD", which
|
||||||
// is equivalent to "MULTI_REGIONAL" or "REGIONAL" depending on
|
// is equivalent to "MULTI_REGIONAL" or "REGIONAL" depending on
|
||||||
// the bucket's location settings.
|
// the bucket's location settings.
|
||||||
|
//
|
||||||
|
// "DURABLE_REDUCED_AVAILABILITY", "MULTI_REGIONAL" and "REGIONAL"
|
||||||
|
// are considered legacy storage classes.
|
||||||
StorageClass string
|
StorageClass string
|
||||||
|
|
||||||
// Created is the creation time of the bucket.
|
// Created is the creation time of the bucket.
|
||||||
|
|
@ -313,6 +316,15 @@ type BucketAttrs struct {
|
||||||
|
|
||||||
// The website configuration.
|
// The website configuration.
|
||||||
Website *BucketWebsite
|
Website *BucketWebsite
|
||||||
|
|
||||||
|
// Etag is the HTTP/1.1 Entity tag for the bucket.
|
||||||
|
// This field is read-only.
|
||||||
|
Etag string
|
||||||
|
|
||||||
|
// LocationType describes how data is stored and replicated.
|
||||||
|
// Typical values are "multi-region", "region" and "dual-region".
|
||||||
|
// This field is read-only.
|
||||||
|
LocationType string
|
||||||
}
|
}
|
||||||
|
|
||||||
// BucketPolicyOnly configures access checks to use only bucket-level IAM
|
// BucketPolicyOnly configures access checks to use only bucket-level IAM
|
||||||
|
|
@ -501,6 +513,8 @@ func newBucket(b *raw.Bucket) (*BucketAttrs, error) {
|
||||||
Logging: toBucketLogging(b.Logging),
|
Logging: toBucketLogging(b.Logging),
|
||||||
Website: toBucketWebsite(b.Website),
|
Website: toBucketWebsite(b.Website),
|
||||||
BucketPolicyOnly: toBucketPolicyOnly(b.IamConfiguration),
|
BucketPolicyOnly: toBucketPolicyOnly(b.IamConfiguration),
|
||||||
|
Etag: b.Etag,
|
||||||
|
LocationType: b.LocationType,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
330
vendor/cloud.google.com/go/storage/hmac.go
generated
vendored
Normal file
330
vendor/cloud.google.com/go/storage/hmac.go
generated
vendored
Normal file
|
|
@ -0,0 +1,330 @@
|
||||||
|
// Copyright 2019 Google LLC
|
||||||
|
//
|
||||||
|
// 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 storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"google.golang.org/api/iterator"
|
||||||
|
raw "google.golang.org/api/storage/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HMACState is the state of the HMAC key.
|
||||||
|
type HMACState string
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Active is the status for an active key that can be used to sign
|
||||||
|
// requests.
|
||||||
|
Active HMACState = "ACTIVE"
|
||||||
|
|
||||||
|
// Inactive is the status for an inactive key thus requests signed by
|
||||||
|
// this key will be denied.
|
||||||
|
Inactive HMACState = "INACTIVE"
|
||||||
|
|
||||||
|
// Deleted is the status for a key that is deleted.
|
||||||
|
// Once in this state the key cannot key cannot be recovered
|
||||||
|
// and does not count towards key limits. Deleted keys will be cleaned
|
||||||
|
// up later.
|
||||||
|
Deleted HMACState = "DELETED"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HMACKey is the representation of a Google Cloud Storage HMAC key.
|
||||||
|
//
|
||||||
|
// HMAC keys are used to authenticate signed access to objects. To enable HMAC key
|
||||||
|
// authentication, please visit https://cloud.google.com/storage/docs/migrating.
|
||||||
|
//
|
||||||
|
// This type is EXPERIMENTAL and subject to change or removal without notice.
|
||||||
|
type HMACKey struct {
|
||||||
|
// The HMAC's secret key.
|
||||||
|
Secret string
|
||||||
|
|
||||||
|
// AccessID is the ID of the HMAC key.
|
||||||
|
AccessID string
|
||||||
|
|
||||||
|
// Etag is the HTTP/1.1 Entity tag.
|
||||||
|
Etag string
|
||||||
|
|
||||||
|
// ID is the ID of the HMAC key, including the ProjectID and AccessID.
|
||||||
|
ID string
|
||||||
|
|
||||||
|
// ProjectID is the ID of the project that owns the
|
||||||
|
// service account to which the key authenticates.
|
||||||
|
ProjectID string
|
||||||
|
|
||||||
|
// ServiceAccountEmail is the email address
|
||||||
|
// of the key's associated service account.
|
||||||
|
ServiceAccountEmail string
|
||||||
|
|
||||||
|
// CreatedTime is the creation time of the HMAC key.
|
||||||
|
CreatedTime time.Time
|
||||||
|
|
||||||
|
// UpdatedTime is the last modification time of the HMAC key metadata.
|
||||||
|
UpdatedTime time.Time
|
||||||
|
|
||||||
|
// State is the state of the HMAC key.
|
||||||
|
// It can be one of StateActive, StateInactive or StateDeleted.
|
||||||
|
State HMACState
|
||||||
|
}
|
||||||
|
|
||||||
|
// HMACKeyHandle helps provide access and management for HMAC keys.
|
||||||
|
//
|
||||||
|
// This type is EXPERIMENTAL and subject to change or removal without notice.
|
||||||
|
type HMACKeyHandle struct {
|
||||||
|
projectID string
|
||||||
|
accessID string
|
||||||
|
|
||||||
|
raw *raw.ProjectsHmacKeysService
|
||||||
|
}
|
||||||
|
|
||||||
|
// HMACKeyHandle creates a handle that will be used for HMACKey operations.
|
||||||
|
//
|
||||||
|
// This method is EXPERIMENTAL and subject to change or removal without notice.
|
||||||
|
func (c *Client) HMACKeyHandle(projectID, accessID string) *HMACKeyHandle {
|
||||||
|
return &HMACKeyHandle{
|
||||||
|
projectID: projectID,
|
||||||
|
accessID: accessID,
|
||||||
|
raw: raw.NewProjectsHmacKeysService(c.raw),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get invokes an RPC to retrieve the HMAC key referenced by the
|
||||||
|
// HMACKeyHandle's accessID.
|
||||||
|
//
|
||||||
|
// This method is EXPERIMENTAL and subject to change or removal without notice.
|
||||||
|
func (hkh *HMACKeyHandle) Get(ctx context.Context) (*HMACKey, error) {
|
||||||
|
call := hkh.raw.Get(hkh.projectID, hkh.accessID)
|
||||||
|
setClientHeader(call.Header())
|
||||||
|
|
||||||
|
var metadata *raw.HmacKeyMetadata
|
||||||
|
var err error
|
||||||
|
err = runWithRetry(ctx, func() error {
|
||||||
|
metadata, err = call.Context(ctx).Do()
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
hkPb := &raw.HmacKey{
|
||||||
|
Metadata: metadata,
|
||||||
|
}
|
||||||
|
return pbHmacKeyToHMACKey(hkPb, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete invokes an RPC to delete the key referenced by accessID, on Google Cloud Storage.
|
||||||
|
// Only inactive HMAC keys can be deleted.
|
||||||
|
// After deletion, a key cannot be used to authenticate requests.
|
||||||
|
//
|
||||||
|
// This method is EXPERIMENTAL and subject to change or removal without notice.
|
||||||
|
func (hkh *HMACKeyHandle) Delete(ctx context.Context) error {
|
||||||
|
delCall := hkh.raw.Delete(hkh.projectID, hkh.accessID)
|
||||||
|
setClientHeader(delCall.Header())
|
||||||
|
|
||||||
|
return runWithRetry(ctx, func() error {
|
||||||
|
return delCall.Context(ctx).Do()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func pbHmacKeyToHMACKey(pb *raw.HmacKey, updatedTimeCanBeNil bool) (*HMACKey, error) {
|
||||||
|
pbmd := pb.Metadata
|
||||||
|
if pbmd == nil {
|
||||||
|
return nil, errors.New("field Metadata cannot be nil")
|
||||||
|
}
|
||||||
|
createdTime, err := time.Parse(time.RFC3339, pbmd.TimeCreated)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("field CreatedTime: %v", err)
|
||||||
|
}
|
||||||
|
updatedTime, err := time.Parse(time.RFC3339, pbmd.Updated)
|
||||||
|
if err != nil && !updatedTimeCanBeNil {
|
||||||
|
return nil, fmt.Errorf("field UpdatedTime: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
hmk := &HMACKey{
|
||||||
|
AccessID: pbmd.AccessId,
|
||||||
|
Secret: pb.Secret,
|
||||||
|
Etag: pbmd.Etag,
|
||||||
|
ID: pbmd.Id,
|
||||||
|
State: HMACState(pbmd.State),
|
||||||
|
ProjectID: pbmd.ProjectId,
|
||||||
|
CreatedTime: createdTime,
|
||||||
|
UpdatedTime: updatedTime,
|
||||||
|
|
||||||
|
ServiceAccountEmail: pbmd.ServiceAccountEmail,
|
||||||
|
}
|
||||||
|
|
||||||
|
return hmk, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateHMACKey invokes an RPC for Google Cloud Storage to create a new HMACKey.
|
||||||
|
//
|
||||||
|
// This method is EXPERIMENTAL and subject to change or removal without notice.
|
||||||
|
func (c *Client) CreateHMACKey(ctx context.Context, projectID, serviceAccountEmail string) (*HMACKey, error) {
|
||||||
|
if projectID == "" {
|
||||||
|
return nil, errors.New("storage: expecting a non-blank projectID")
|
||||||
|
}
|
||||||
|
if serviceAccountEmail == "" {
|
||||||
|
return nil, errors.New("storage: expecting a non-blank service account email")
|
||||||
|
}
|
||||||
|
|
||||||
|
svc := raw.NewProjectsHmacKeysService(c.raw)
|
||||||
|
call := svc.Create(projectID, serviceAccountEmail)
|
||||||
|
setClientHeader(call.Header())
|
||||||
|
|
||||||
|
var hkPb *raw.HmacKey
|
||||||
|
var err error
|
||||||
|
err = runWithRetry(ctx, func() error {
|
||||||
|
hkPb, err = call.Context(ctx).Do()
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return pbHmacKeyToHMACKey(hkPb, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HMACKeyAttrsToUpdate defines the attributes of an HMACKey that will be updated.
|
||||||
|
//
|
||||||
|
// This type is EXPERIMENTAL and subject to change or removal without notice.
|
||||||
|
type HMACKeyAttrsToUpdate struct {
|
||||||
|
// State is required and must be either StateActive or StateInactive.
|
||||||
|
State HMACState
|
||||||
|
|
||||||
|
// Etag is an optional field and it is the HTTP/1.1 Entity tag.
|
||||||
|
Etag string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update mutates the HMACKey referred to by accessID.
|
||||||
|
//
|
||||||
|
// This method is EXPERIMENTAL and subject to change or removal without notice.
|
||||||
|
func (h *HMACKeyHandle) Update(ctx context.Context, au HMACKeyAttrsToUpdate) (*HMACKey, error) {
|
||||||
|
if au.State != Active && au.State != Inactive {
|
||||||
|
return nil, fmt.Errorf("storage: invalid state %q for update, must be either %q or %q", au.State, Active, Inactive)
|
||||||
|
}
|
||||||
|
|
||||||
|
call := h.raw.Update(h.projectID, h.accessID, &raw.HmacKeyMetadata{
|
||||||
|
Etag: au.Etag,
|
||||||
|
State: string(au.State),
|
||||||
|
})
|
||||||
|
setClientHeader(call.Header())
|
||||||
|
|
||||||
|
var metadata *raw.HmacKeyMetadata
|
||||||
|
var err error
|
||||||
|
err = runWithRetry(ctx, func() error {
|
||||||
|
metadata, err = call.Context(ctx).Do()
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
hkPb := &raw.HmacKey{
|
||||||
|
Metadata: metadata,
|
||||||
|
}
|
||||||
|
return pbHmacKeyToHMACKey(hkPb, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// An HMACKeysIterator is an iterator over HMACKeys.
|
||||||
|
//
|
||||||
|
// This type is EXPERIMENTAL and subject to change or removal without notice.
|
||||||
|
type HMACKeysIterator struct {
|
||||||
|
ctx context.Context
|
||||||
|
raw *raw.ProjectsHmacKeysService
|
||||||
|
projectID string
|
||||||
|
hmacKeys []*HMACKey
|
||||||
|
pageInfo *iterator.PageInfo
|
||||||
|
nextFunc func() error
|
||||||
|
index int
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListHMACKeys returns an iterator for listing HMACKeys.
|
||||||
|
//
|
||||||
|
// This method is EXPERIMENTAL and subject to change or removal without notice.
|
||||||
|
func (c *Client) ListHMACKeys(ctx context.Context, projectID string) *HMACKeysIterator {
|
||||||
|
it := &HMACKeysIterator{
|
||||||
|
ctx: ctx,
|
||||||
|
raw: raw.NewProjectsHmacKeysService(c.raw),
|
||||||
|
projectID: projectID,
|
||||||
|
}
|
||||||
|
|
||||||
|
it.pageInfo, it.nextFunc = iterator.NewPageInfo(
|
||||||
|
it.fetch,
|
||||||
|
func() int { return len(it.hmacKeys) - it.index },
|
||||||
|
func() interface{} {
|
||||||
|
prev := it.hmacKeys
|
||||||
|
it.hmacKeys = it.hmacKeys[:0]
|
||||||
|
it.index = 0
|
||||||
|
return prev
|
||||||
|
})
|
||||||
|
return it
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next returns the next result. Its second return value is iterator.Done if
|
||||||
|
// there are no more results. Once Next returns iterator.Done, all subsequent
|
||||||
|
// calls will return iterator.Done.
|
||||||
|
//
|
||||||
|
// This method is EXPERIMENTAL and subject to change or removal without notice.
|
||||||
|
func (it *HMACKeysIterator) Next() (*HMACKey, error) {
|
||||||
|
if err := it.nextFunc(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
key := it.hmacKeys[it.index]
|
||||||
|
it.index++
|
||||||
|
|
||||||
|
return key, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// PageInfo supports pagination. See the google.golang.org/api/iterator package for details.
|
||||||
|
//
|
||||||
|
// This method is EXPERIMENTAL and subject to change or removal without notice.
|
||||||
|
func (it *HMACKeysIterator) PageInfo() *iterator.PageInfo { return it.pageInfo }
|
||||||
|
|
||||||
|
func (it *HMACKeysIterator) fetch(pageSize int, pageToken string) (token string, err error) {
|
||||||
|
call := it.raw.List(it.projectID)
|
||||||
|
setClientHeader(call.Header())
|
||||||
|
call = call.PageToken(pageToken)
|
||||||
|
// By default we'll also show deleted keys and then
|
||||||
|
// let users filter on their own.
|
||||||
|
call = call.ShowDeletedKeys(true)
|
||||||
|
if pageSize > 0 {
|
||||||
|
call = call.MaxResults(int64(pageSize))
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := it.ctx
|
||||||
|
var resp *raw.HmacKeysMetadata
|
||||||
|
err = runWithRetry(it.ctx, func() error {
|
||||||
|
resp, err = call.Context(ctx).Do()
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, metadata := range resp.Items {
|
||||||
|
hkPb := &raw.HmacKey{
|
||||||
|
Metadata: metadata,
|
||||||
|
}
|
||||||
|
hkey, err := pbHmacKeyToHMACKey(hkPb, true)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
it.hmacKeys = append(it.hmacKeys, hkey)
|
||||||
|
}
|
||||||
|
return resp.NextPageToken, nil
|
||||||
|
}
|
||||||
38
vendor/cloud.google.com/go/storage/reader.go
generated
vendored
38
vendor/cloud.google.com/go/storage/reader.go
generated
vendored
|
|
@ -43,6 +43,11 @@ type ReaderObjectAttrs struct {
|
||||||
// Size is the length of the object's content.
|
// Size is the length of the object's content.
|
||||||
Size int64
|
Size int64
|
||||||
|
|
||||||
|
// StartOffset is the byte offset within the object
|
||||||
|
// from which reading begins.
|
||||||
|
// This value is only non-zero for range requests.
|
||||||
|
StartOffset int64
|
||||||
|
|
||||||
// ContentType is the MIME type of the object's content.
|
// ContentType is the MIME type of the object's content.
|
||||||
ContentType string
|
ContentType string
|
||||||
|
|
||||||
|
|
@ -78,7 +83,9 @@ func (o *ObjectHandle) NewReader(ctx context.Context) (*Reader, error) {
|
||||||
|
|
||||||
// NewRangeReader reads part of an object, reading at most length bytes
|
// NewRangeReader reads part of an object, reading at most length bytes
|
||||||
// starting at the given offset. If length is negative, the object is read
|
// starting at the given offset. If length is negative, the object is read
|
||||||
// until the end.
|
// until the end. If offset is negative, the object is read abs(offset) bytes
|
||||||
|
// from the end, and length must also be negative to indicate all remaining
|
||||||
|
// bytes will be read.
|
||||||
func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64) (r *Reader, err error) {
|
func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64) (r *Reader, err error) {
|
||||||
ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Object.NewRangeReader")
|
ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Object.NewRangeReader")
|
||||||
defer func() { trace.EndSpan(ctx, err) }()
|
defer func() { trace.EndSpan(ctx, err) }()
|
||||||
|
|
@ -86,8 +93,8 @@ func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64)
|
||||||
if err := o.validate(); err != nil {
|
if err := o.validate(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if offset < 0 {
|
if offset < 0 && length >= 0 {
|
||||||
return nil, fmt.Errorf("storage: invalid offset %d < 0", offset)
|
return nil, fmt.Errorf("storage: invalid offset %d < 0 requires negative length", offset)
|
||||||
}
|
}
|
||||||
if o.conds != nil {
|
if o.conds != nil {
|
||||||
if err := o.conds.validate("NewRangeReader"); err != nil {
|
if err := o.conds.validate("NewRangeReader"); err != nil {
|
||||||
|
|
@ -95,8 +102,8 @@ func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
u := &url.URL{
|
u := &url.URL{
|
||||||
Scheme: "https",
|
Scheme: o.c.scheme,
|
||||||
Host: "storage.googleapis.com",
|
Host: o.c.readHost,
|
||||||
Path: fmt.Sprintf("/%s/%s", o.bucket, o.object),
|
Path: fmt.Sprintf("/%s/%s", o.bucket, o.object),
|
||||||
}
|
}
|
||||||
verb := "GET"
|
verb := "GET"
|
||||||
|
|
@ -124,7 +131,9 @@ func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64)
|
||||||
// have already read seen bytes.
|
// have already read seen bytes.
|
||||||
reopen := func(seen int64) (*http.Response, error) {
|
reopen := func(seen int64) (*http.Response, error) {
|
||||||
start := offset + seen
|
start := offset + seen
|
||||||
if length < 0 && start > 0 {
|
if length < 0 && start < 0 {
|
||||||
|
req.Header.Set("Range", fmt.Sprintf("bytes=%d", start))
|
||||||
|
} else if length < 0 && start > 0 {
|
||||||
req.Header.Set("Range", fmt.Sprintf("bytes=%d-", start))
|
req.Header.Set("Range", fmt.Sprintf("bytes=%d-", start))
|
||||||
} else if length > 0 {
|
} else if length > 0 {
|
||||||
// The end character isn't affected by how many bytes we've seen.
|
// The end character isn't affected by how many bytes we've seen.
|
||||||
|
|
@ -177,20 +186,28 @@ func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var (
|
var (
|
||||||
size int64 // total size of object, even if a range was requested.
|
size int64 // total size of object, even if a range was requested.
|
||||||
checkCRC bool
|
checkCRC bool
|
||||||
crc uint32
|
crc uint32
|
||||||
|
startOffset int64 // non-zero if range request.
|
||||||
)
|
)
|
||||||
if res.StatusCode == http.StatusPartialContent {
|
if res.StatusCode == http.StatusPartialContent {
|
||||||
cr := strings.TrimSpace(res.Header.Get("Content-Range"))
|
cr := strings.TrimSpace(res.Header.Get("Content-Range"))
|
||||||
if !strings.HasPrefix(cr, "bytes ") || !strings.Contains(cr, "/") {
|
if !strings.HasPrefix(cr, "bytes ") || !strings.Contains(cr, "/") {
|
||||||
|
|
||||||
return nil, fmt.Errorf("storage: invalid Content-Range %q", cr)
|
return nil, fmt.Errorf("storage: invalid Content-Range %q", cr)
|
||||||
}
|
}
|
||||||
size, err = strconv.ParseInt(cr[strings.LastIndex(cr, "/")+1:], 10, 64)
|
size, err = strconv.ParseInt(cr[strings.LastIndex(cr, "/")+1:], 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("storage: invalid Content-Range %q", cr)
|
return nil, fmt.Errorf("storage: invalid Content-Range %q", cr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dashIndex := strings.Index(cr, "-")
|
||||||
|
if dashIndex >= 0 {
|
||||||
|
startOffset, err = strconv.ParseInt(cr[len("bytes="):dashIndex], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("storage: invalid Content-Range %q: %v", cr, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
size = res.ContentLength
|
size = res.ContentLength
|
||||||
// Check the CRC iff all of the following hold:
|
// Check the CRC iff all of the following hold:
|
||||||
|
|
@ -236,6 +253,7 @@ func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64)
|
||||||
ContentEncoding: res.Header.Get("Content-Encoding"),
|
ContentEncoding: res.Header.Get("Content-Encoding"),
|
||||||
CacheControl: res.Header.Get("Cache-Control"),
|
CacheControl: res.Header.Get("Cache-Control"),
|
||||||
LastModified: lm,
|
LastModified: lm,
|
||||||
|
StartOffset: startOffset,
|
||||||
Generation: gen,
|
Generation: gen,
|
||||||
Metageneration: metaGen,
|
Metageneration: metaGen,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
314
vendor/cloud.google.com/go/storage/storage.go
generated
vendored
314
vendor/cloud.google.com/go/storage/storage.go
generated
vendored
|
|
@ -23,11 +23,13 @@ import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
"encoding/hex"
|
||||||
"encoding/pem"
|
"encoding/pem"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
"sort"
|
"sort"
|
||||||
|
|
@ -81,6 +83,12 @@ func setClientHeader(headers http.Header) {
|
||||||
type Client struct {
|
type Client struct {
|
||||||
hc *http.Client
|
hc *http.Client
|
||||||
raw *raw.Service
|
raw *raw.Service
|
||||||
|
// Scheme describes the scheme under the current host.
|
||||||
|
scheme string
|
||||||
|
// EnvHost is the host set on the STORAGE_EMULATOR_HOST variable.
|
||||||
|
envHost string
|
||||||
|
// ReadHost is the default host used on the reader.
|
||||||
|
readHost string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewClient creates a new Google Cloud Storage client.
|
// NewClient creates a new Google Cloud Storage client.
|
||||||
|
|
@ -102,9 +110,20 @@ func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error
|
||||||
if ep != "" {
|
if ep != "" {
|
||||||
rawService.BasePath = ep
|
rawService.BasePath = ep
|
||||||
}
|
}
|
||||||
|
scheme := "https"
|
||||||
|
var host, readHost string
|
||||||
|
if host = os.Getenv("STORAGE_EMULATOR_HOST"); host != "" {
|
||||||
|
scheme = "http"
|
||||||
|
readHost = host
|
||||||
|
} else {
|
||||||
|
readHost = "storage.googleapis.com"
|
||||||
|
}
|
||||||
return &Client{
|
return &Client{
|
||||||
hc: hc,
|
hc: hc,
|
||||||
raw: rawService,
|
raw: rawService,
|
||||||
|
scheme: scheme,
|
||||||
|
envHost: host,
|
||||||
|
readHost: readHost,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -118,6 +137,20 @@ func (c *Client) Close() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SigningScheme determines the API version to use when signing URLs.
|
||||||
|
type SigningScheme int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// SigningSchemeDefault is presently V2 and will change to V4 in the future.
|
||||||
|
SigningSchemeDefault SigningScheme = iota
|
||||||
|
|
||||||
|
// SigningSchemeV2 uses the V2 scheme to sign URLs.
|
||||||
|
SigningSchemeV2
|
||||||
|
|
||||||
|
// SigningSchemeV4 uses the V4 scheme to sign URLs.
|
||||||
|
SigningSchemeV4
|
||||||
|
)
|
||||||
|
|
||||||
// SignedURLOptions allows you to restrict the access to the signed URL.
|
// SignedURLOptions allows you to restrict the access to the signed URL.
|
||||||
type SignedURLOptions struct {
|
type SignedURLOptions struct {
|
||||||
// GoogleAccessID represents the authorizer of the signed URL generation.
|
// GoogleAccessID represents the authorizer of the signed URL generation.
|
||||||
|
|
@ -140,8 +173,9 @@ type SignedURLOptions struct {
|
||||||
// Exactly one of PrivateKey or SignBytes must be non-nil.
|
// Exactly one of PrivateKey or SignBytes must be non-nil.
|
||||||
PrivateKey []byte
|
PrivateKey []byte
|
||||||
|
|
||||||
// SignBytes is a function for implementing custom signing.
|
// SignBytes is a function for implementing custom signing. For example, if
|
||||||
// If your application is running on Google App Engine, you can use appengine's internal signing function:
|
// your application is running on Google App Engine, you can use
|
||||||
|
// appengine's internal signing function:
|
||||||
// ctx := appengine.NewContext(request)
|
// ctx := appengine.NewContext(request)
|
||||||
// acc, _ := appengine.ServiceAccount(ctx)
|
// acc, _ := appengine.ServiceAccount(ctx)
|
||||||
// url, err := SignedURL("bucket", "object", &SignedURLOptions{
|
// url, err := SignedURL("bucket", "object", &SignedURLOptions{
|
||||||
|
|
@ -162,7 +196,8 @@ type SignedURLOptions struct {
|
||||||
Method string
|
Method string
|
||||||
|
|
||||||
// Expires is the expiration time on the signed URL. It must be
|
// Expires is the expiration time on the signed URL. It must be
|
||||||
// a datetime in the future.
|
// a datetime in the future. For SigningSchemeV4, the expiration may be no
|
||||||
|
// more than seven days in the future.
|
||||||
// Required.
|
// Required.
|
||||||
Expires time.Time
|
Expires time.Time
|
||||||
|
|
||||||
|
|
@ -181,9 +216,17 @@ type SignedURLOptions struct {
|
||||||
// header in order to use the signed URL.
|
// header in order to use the signed URL.
|
||||||
// Optional.
|
// Optional.
|
||||||
MD5 string
|
MD5 string
|
||||||
|
|
||||||
|
// Scheme determines the version of URL signing to use. Default is
|
||||||
|
// SigningSchemeV2.
|
||||||
|
Scheme SigningScheme
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
tabRegex = regexp.MustCompile(`[\t]+`)
|
||||||
|
// I was tempted to call this spacex. :)
|
||||||
|
spaceRegex = regexp.MustCompile(` +`)
|
||||||
|
|
||||||
canonicalHeaderRegexp = regexp.MustCompile(`(?i)^(x-goog-[^:]+):(.*)?$`)
|
canonicalHeaderRegexp = regexp.MustCompile(`(?i)^(x-goog-[^:]+):(.*)?$`)
|
||||||
excludedCanonicalHeaders = map[string]bool{
|
excludedCanonicalHeaders = map[string]bool{
|
||||||
"x-goog-encryption-key": true,
|
"x-goog-encryption-key": true,
|
||||||
|
|
@ -191,26 +234,31 @@ var (
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// sanitizeHeaders applies the specifications for canonical extension headers at
|
// v2SanitizeHeaders applies the specifications for canonical extension headers at
|
||||||
// https://cloud.google.com/storage/docs/access-control/signed-urls#about-canonical-extension-headers.
|
// https://cloud.google.com/storage/docs/access-control/signed-urls#about-canonical-extension-headers.
|
||||||
func sanitizeHeaders(hdrs []string) []string {
|
func v2SanitizeHeaders(hdrs []string) []string {
|
||||||
headerMap := map[string][]string{}
|
headerMap := map[string][]string{}
|
||||||
for _, hdr := range hdrs {
|
for _, hdr := range hdrs {
|
||||||
// No leading or trailing whitespaces.
|
// No leading or trailing whitespaces.
|
||||||
sanitizedHeader := strings.TrimSpace(hdr)
|
sanitizedHeader := strings.TrimSpace(hdr)
|
||||||
|
|
||||||
|
var header, value string
|
||||||
// Only keep canonical headers, discard any others.
|
// Only keep canonical headers, discard any others.
|
||||||
headerMatches := canonicalHeaderRegexp.FindStringSubmatch(sanitizedHeader)
|
headerMatches := canonicalHeaderRegexp.FindStringSubmatch(sanitizedHeader)
|
||||||
if len(headerMatches) == 0 {
|
if len(headerMatches) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
header = headerMatches[1]
|
||||||
|
value = headerMatches[2]
|
||||||
|
|
||||||
header := strings.ToLower(strings.TrimSpace(headerMatches[1]))
|
header = strings.ToLower(strings.TrimSpace(header))
|
||||||
if excludedCanonicalHeaders[headerMatches[1]] {
|
value = strings.TrimSpace(value)
|
||||||
|
|
||||||
|
if excludedCanonicalHeaders[header] {
|
||||||
// Do not keep any deliberately excluded canonical headers when signing.
|
// Do not keep any deliberately excluded canonical headers when signing.
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
value := strings.TrimSpace(headerMatches[2])
|
|
||||||
if len(value) > 0 {
|
if len(value) > 0 {
|
||||||
// Remove duplicate headers by appending the values of duplicates
|
// Remove duplicate headers by appending the values of duplicates
|
||||||
// in their order of appearance.
|
// in their order of appearance.
|
||||||
|
|
@ -220,51 +268,256 @@ func sanitizeHeaders(hdrs []string) []string {
|
||||||
|
|
||||||
var sanitizedHeaders []string
|
var sanitizedHeaders []string
|
||||||
for header, values := range headerMap {
|
for header, values := range headerMap {
|
||||||
// There should be no spaces around the colon separating the
|
// There should be no spaces around the colon separating the header name
|
||||||
// header name from the header value or around the values
|
// from the header value or around the values themselves. The values
|
||||||
// themselves. The values should be separated by commas.
|
// should be separated by commas.
|
||||||
|
//
|
||||||
// NOTE: The semantics for headers without a value are not clear.
|
// NOTE: The semantics for headers without a value are not clear.
|
||||||
// However from specifications these should be edge-cases
|
// However from specifications these should be edge-cases anyway and we
|
||||||
// anyway and we should assume that there will be no
|
// should assume that there will be no canonical headers using empty
|
||||||
// canonical headers using empty values. Any such headers
|
// values. Any such headers are discarded at the regexp stage above.
|
||||||
// are discarded at the regexp stage above.
|
sanitizedHeaders = append(sanitizedHeaders, fmt.Sprintf("%s:%s", header, strings.Join(values, ",")))
|
||||||
sanitizedHeaders = append(
|
|
||||||
sanitizedHeaders,
|
|
||||||
fmt.Sprintf("%s:%s", header, strings.Join(values, ",")),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
sort.Strings(sanitizedHeaders)
|
sort.Strings(sanitizedHeaders)
|
||||||
return sanitizedHeaders
|
return sanitizedHeaders
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// v4SanitizeHeaders applies the specifications for canonical extension headers
|
||||||
|
// at https://cloud.google.com/storage/docs/access-control/signed-urls#about-canonical-extension-headers.
|
||||||
|
//
|
||||||
|
// V4 does a couple things differently from V2:
|
||||||
|
// - Headers get sorted by key, instead of by key:value. We do this in
|
||||||
|
// signedURLV4.
|
||||||
|
// - There's no canonical regexp: we simply split headers on :.
|
||||||
|
// - We don't exclude canonical headers.
|
||||||
|
// - We replace leading and trailing spaces in header values, like v2, but also
|
||||||
|
// all intermediate space duplicates get stripped. That is, there's only ever
|
||||||
|
// a single consecutive space.
|
||||||
|
func v4SanitizeHeaders(hdrs []string) []string {
|
||||||
|
headerMap := map[string][]string{}
|
||||||
|
for _, hdr := range hdrs {
|
||||||
|
// No leading or trailing whitespaces.
|
||||||
|
sanitizedHeader := strings.TrimSpace(hdr)
|
||||||
|
|
||||||
|
var key, value string
|
||||||
|
headerMatches := strings.Split(sanitizedHeader, ":")
|
||||||
|
if len(headerMatches) < 2 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
key = headerMatches[0]
|
||||||
|
value = headerMatches[1]
|
||||||
|
|
||||||
|
key = strings.ToLower(strings.TrimSpace(key))
|
||||||
|
value = strings.TrimSpace(value)
|
||||||
|
value = string(spaceRegex.ReplaceAll([]byte(value), []byte(" ")))
|
||||||
|
value = string(tabRegex.ReplaceAll([]byte(value), []byte("\t")))
|
||||||
|
|
||||||
|
if len(value) > 0 {
|
||||||
|
// Remove duplicate headers by appending the values of duplicates
|
||||||
|
// in their order of appearance.
|
||||||
|
headerMap[key] = append(headerMap[key], value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var sanitizedHeaders []string
|
||||||
|
for header, values := range headerMap {
|
||||||
|
// There should be no spaces around the colon separating the header name
|
||||||
|
// from the header value or around the values themselves. The values
|
||||||
|
// should be separated by commas.
|
||||||
|
//
|
||||||
|
// NOTE: The semantics for headers without a value are not clear.
|
||||||
|
// However from specifications these should be edge-cases anyway and we
|
||||||
|
// should assume that there will be no canonical headers using empty
|
||||||
|
// values. Any such headers are discarded at the regexp stage above.
|
||||||
|
sanitizedHeaders = append(sanitizedHeaders, fmt.Sprintf("%s:%s", header, strings.Join(values, ",")))
|
||||||
|
}
|
||||||
|
return sanitizedHeaders
|
||||||
|
}
|
||||||
|
|
||||||
// SignedURL returns a URL for the specified object. Signed URLs allow
|
// SignedURL returns a URL for the specified object. Signed URLs allow
|
||||||
// the users access to a restricted resource for a limited time without having a
|
// the users access to a restricted resource for a limited time without having a
|
||||||
// Google account or signing in. For more information about the signed
|
// Google account or signing in. For more information about the signed
|
||||||
// URLs, see https://cloud.google.com/storage/docs/accesscontrol#Signed-URLs.
|
// URLs, see https://cloud.google.com/storage/docs/accesscontrol#Signed-URLs.
|
||||||
func SignedURL(bucket, name string, opts *SignedURLOptions) (string, error) {
|
func SignedURL(bucket, name string, opts *SignedURLOptions) (string, error) {
|
||||||
|
now := utcNow()
|
||||||
|
if err := validateOptions(opts, now); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch opts.Scheme {
|
||||||
|
case SigningSchemeV2:
|
||||||
|
opts.Headers = v2SanitizeHeaders(opts.Headers)
|
||||||
|
return signedURLV2(bucket, name, opts)
|
||||||
|
case SigningSchemeV4:
|
||||||
|
opts.Headers = v4SanitizeHeaders(opts.Headers)
|
||||||
|
return signedURLV4(bucket, name, opts, now)
|
||||||
|
default: // SigningSchemeDefault
|
||||||
|
opts.Headers = v2SanitizeHeaders(opts.Headers)
|
||||||
|
return signedURLV2(bucket, name, opts)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateOptions(opts *SignedURLOptions, now time.Time) error {
|
||||||
if opts == nil {
|
if opts == nil {
|
||||||
return "", errors.New("storage: missing required SignedURLOptions")
|
return errors.New("storage: missing required SignedURLOptions")
|
||||||
}
|
}
|
||||||
if opts.GoogleAccessID == "" {
|
if opts.GoogleAccessID == "" {
|
||||||
return "", errors.New("storage: missing required GoogleAccessID")
|
return errors.New("storage: missing required GoogleAccessID")
|
||||||
}
|
}
|
||||||
if (opts.PrivateKey == nil) == (opts.SignBytes == nil) {
|
if (opts.PrivateKey == nil) == (opts.SignBytes == nil) {
|
||||||
return "", errors.New("storage: exactly one of PrivateKey or SignedBytes must be set")
|
return errors.New("storage: exactly one of PrivateKey or SignedBytes must be set")
|
||||||
}
|
}
|
||||||
if opts.Method == "" {
|
if opts.Method == "" {
|
||||||
return "", errors.New("storage: missing required method option")
|
return errors.New("storage: missing required method option")
|
||||||
}
|
}
|
||||||
if opts.Expires.IsZero() {
|
if opts.Expires.IsZero() {
|
||||||
return "", errors.New("storage: missing required expires option")
|
return errors.New("storage: missing required expires option")
|
||||||
}
|
}
|
||||||
if opts.MD5 != "" {
|
if opts.MD5 != "" {
|
||||||
md5, err := base64.StdEncoding.DecodeString(opts.MD5)
|
md5, err := base64.StdEncoding.DecodeString(opts.MD5)
|
||||||
if err != nil || len(md5) != 16 {
|
if err != nil || len(md5) != 16 {
|
||||||
return "", errors.New("storage: invalid MD5 checksum")
|
return errors.New("storage: invalid MD5 checksum")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
opts.Headers = sanitizeHeaders(opts.Headers)
|
if opts.Scheme == SigningSchemeV4 {
|
||||||
|
cutoff := now.Add(604801 * time.Second) // 7 days + 1 second
|
||||||
|
if !opts.Expires.Before(cutoff) {
|
||||||
|
return errors.New("storage: expires must be within seven days from now")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
iso8601 = "20060102T150405Z"
|
||||||
|
yearMonthDay = "20060102"
|
||||||
|
)
|
||||||
|
|
||||||
|
// utcNow returns the current time in UTC and is a variable to allow for
|
||||||
|
// reassignment in tests to provide deterministic signed URL values.
|
||||||
|
var utcNow = func() time.Time {
|
||||||
|
return time.Now().UTC()
|
||||||
|
}
|
||||||
|
|
||||||
|
// extractHeaderNames takes in a series of key:value headers and returns the
|
||||||
|
// header names only.
|
||||||
|
func extractHeaderNames(kvs []string) []string {
|
||||||
|
var res []string
|
||||||
|
for _, header := range kvs {
|
||||||
|
nameValue := strings.Split(header, ":")
|
||||||
|
res = append(res, nameValue[0])
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// signedURLV4 creates a signed URL using the sigV4 algorithm.
|
||||||
|
func signedURLV4(bucket, name string, opts *SignedURLOptions, now time.Time) (string, error) {
|
||||||
|
buf := &bytes.Buffer{}
|
||||||
|
fmt.Fprintf(buf, "%s\n", opts.Method)
|
||||||
|
u := &url.URL{Path: bucket}
|
||||||
|
if name != "" {
|
||||||
|
u.Path += "/" + name
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: we have to add a / here because GCS does so auto-magically, despite
|
||||||
|
// Go's EscapedPath not doing so (and we have to exactly match their
|
||||||
|
// canonical query).
|
||||||
|
fmt.Fprintf(buf, "/%s\n", u.EscapedPath())
|
||||||
|
|
||||||
|
headerNames := append(extractHeaderNames(opts.Headers), "host")
|
||||||
|
if opts.ContentType != "" {
|
||||||
|
headerNames = append(headerNames, "content-type")
|
||||||
|
}
|
||||||
|
if opts.MD5 != "" {
|
||||||
|
headerNames = append(headerNames, "content-md5")
|
||||||
|
}
|
||||||
|
sort.Strings(headerNames)
|
||||||
|
signedHeaders := strings.Join(headerNames, ";")
|
||||||
|
timestamp := now.Format(iso8601)
|
||||||
|
credentialScope := fmt.Sprintf("%s/auto/storage/goog4_request", now.Format(yearMonthDay))
|
||||||
|
canonicalQueryString := url.Values{
|
||||||
|
"X-Goog-Algorithm": {"GOOG4-RSA-SHA256"},
|
||||||
|
"X-Goog-Credential": {fmt.Sprintf("%s/%s", opts.GoogleAccessID, credentialScope)},
|
||||||
|
"X-Goog-Date": {timestamp},
|
||||||
|
"X-Goog-Expires": {fmt.Sprintf("%d", int(opts.Expires.Sub(now).Seconds()))},
|
||||||
|
"X-Goog-SignedHeaders": {signedHeaders},
|
||||||
|
}
|
||||||
|
fmt.Fprintf(buf, "%s\n", canonicalQueryString.Encode())
|
||||||
|
|
||||||
|
u.Host = "storage.googleapis.com"
|
||||||
|
|
||||||
|
var headersWithValue []string
|
||||||
|
headersWithValue = append(headersWithValue, "host:"+u.Host)
|
||||||
|
headersWithValue = append(headersWithValue, opts.Headers...)
|
||||||
|
if opts.ContentType != "" {
|
||||||
|
headersWithValue = append(headersWithValue, "content-type:"+strings.TrimSpace(opts.ContentType))
|
||||||
|
}
|
||||||
|
if opts.MD5 != "" {
|
||||||
|
headersWithValue = append(headersWithValue, "content-md5:"+strings.TrimSpace(opts.MD5))
|
||||||
|
}
|
||||||
|
canonicalHeaders := strings.Join(sortHeadersByKey(headersWithValue), "\n")
|
||||||
|
fmt.Fprintf(buf, "%s\n\n", canonicalHeaders)
|
||||||
|
fmt.Fprintf(buf, "%s\n", signedHeaders)
|
||||||
|
fmt.Fprint(buf, "UNSIGNED-PAYLOAD")
|
||||||
|
|
||||||
|
sum := sha256.Sum256(buf.Bytes())
|
||||||
|
hexDigest := hex.EncodeToString(sum[:])
|
||||||
|
signBuf := &bytes.Buffer{}
|
||||||
|
fmt.Fprint(signBuf, "GOOG4-RSA-SHA256\n")
|
||||||
|
fmt.Fprintf(signBuf, "%s\n", timestamp)
|
||||||
|
fmt.Fprintf(signBuf, "%s\n", credentialScope)
|
||||||
|
fmt.Fprintf(signBuf, "%s", hexDigest)
|
||||||
|
|
||||||
|
signBytes := opts.SignBytes
|
||||||
|
if opts.PrivateKey != nil {
|
||||||
|
key, err := parseKey(opts.PrivateKey)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
signBytes = func(b []byte) ([]byte, error) {
|
||||||
|
sum := sha256.Sum256(b)
|
||||||
|
return rsa.SignPKCS1v15(
|
||||||
|
rand.Reader,
|
||||||
|
key,
|
||||||
|
crypto.SHA256,
|
||||||
|
sum[:],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b, err := signBytes(signBuf.Bytes())
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
signature := hex.EncodeToString(b)
|
||||||
|
canonicalQueryString.Set("X-Goog-Signature", string(signature))
|
||||||
|
u.Scheme = "https"
|
||||||
|
u.RawQuery = canonicalQueryString.Encode()
|
||||||
|
return u.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// takes a list of headerKey:headervalue1,headervalue2,etc and sorts by header
|
||||||
|
// key.
|
||||||
|
func sortHeadersByKey(hdrs []string) []string {
|
||||||
|
headersMap := map[string]string{}
|
||||||
|
var headersKeys []string
|
||||||
|
for _, h := range hdrs {
|
||||||
|
parts := strings.Split(h, ":")
|
||||||
|
k := parts[0]
|
||||||
|
v := parts[1]
|
||||||
|
headersMap[k] = v
|
||||||
|
headersKeys = append(headersKeys, k)
|
||||||
|
}
|
||||||
|
sort.Strings(headersKeys)
|
||||||
|
var sorted []string
|
||||||
|
for _, k := range headersKeys {
|
||||||
|
v := headersMap[k]
|
||||||
|
sorted = append(sorted, fmt.Sprintf("%s:%s", k, v))
|
||||||
|
}
|
||||||
|
return sorted
|
||||||
|
}
|
||||||
|
|
||||||
|
func signedURLV2(bucket, name string, opts *SignedURLOptions) (string, error) {
|
||||||
signBytes := opts.SignBytes
|
signBytes := opts.SignBytes
|
||||||
if opts.PrivateKey != nil {
|
if opts.PrivateKey != nil {
|
||||||
key, err := parseKey(opts.PrivateKey)
|
key, err := parseKey(opts.PrivateKey)
|
||||||
|
|
@ -777,6 +1030,10 @@ type ObjectAttrs struct {
|
||||||
// ObjectIterator.Next. When set, no other fields in ObjectAttrs will be
|
// ObjectIterator.Next. When set, no other fields in ObjectAttrs will be
|
||||||
// populated.
|
// populated.
|
||||||
Prefix string
|
Prefix string
|
||||||
|
|
||||||
|
// Etag is the HTTP/1.1 Entity tag for the object.
|
||||||
|
// This field is read-only.
|
||||||
|
Etag string
|
||||||
}
|
}
|
||||||
|
|
||||||
// convertTime converts a time in RFC3339 format to time.Time.
|
// convertTime converts a time in RFC3339 format to time.Time.
|
||||||
|
|
@ -829,6 +1086,7 @@ func newObject(o *raw.Object) *ObjectAttrs {
|
||||||
Created: convertTime(o.TimeCreated),
|
Created: convertTime(o.TimeCreated),
|
||||||
Deleted: convertTime(o.TimeDeleted),
|
Deleted: convertTime(o.TimeDeleted),
|
||||||
Updated: convertTime(o.Updated),
|
Updated: convertTime(o.Updated),
|
||||||
|
Etag: o.Etag,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
16406
vendor/cloud.google.com/go/storage/storage.replay
generated
vendored
16406
vendor/cloud.google.com/go/storage/storage.replay
generated
vendored
File diff suppressed because one or more lines are too long
31
vendor/cloud.google.com/go/storage/writer.go
generated
vendored
31
vendor/cloud.google.com/go/storage/writer.go
generated
vendored
|
|
@ -117,10 +117,14 @@ func (w *Writer) open() error {
|
||||||
if w.MD5 != nil {
|
if w.MD5 != nil {
|
||||||
rawObj.Md5Hash = base64.StdEncoding.EncodeToString(w.MD5)
|
rawObj.Md5Hash = base64.StdEncoding.EncodeToString(w.MD5)
|
||||||
}
|
}
|
||||||
|
if w.o.c.envHost != "" {
|
||||||
|
w.o.c.raw.BasePath = fmt.Sprintf("%s://%s", w.o.c.scheme, w.o.c.envHost)
|
||||||
|
}
|
||||||
call := w.o.c.raw.Objects.Insert(w.o.bucket, rawObj).
|
call := w.o.c.raw.Objects.Insert(w.o.bucket, rawObj).
|
||||||
Media(pr, mediaOpts...).
|
Media(pr, mediaOpts...).
|
||||||
Projection("full").
|
Projection("full").
|
||||||
Context(w.ctx)
|
Context(w.ctx)
|
||||||
|
|
||||||
if w.ProgressFunc != nil {
|
if w.ProgressFunc != nil {
|
||||||
call.ProgressUpdater(func(n, _ int64) { w.ProgressFunc(n) })
|
call.ProgressUpdater(func(n, _ int64) { w.ProgressFunc(n) })
|
||||||
}
|
}
|
||||||
|
|
@ -144,21 +148,16 @@ func (w *Writer) open() error {
|
||||||
call.UserProject(w.o.userProject)
|
call.UserProject(w.o.userProject)
|
||||||
}
|
}
|
||||||
setClientHeader(call.Header())
|
setClientHeader(call.Header())
|
||||||
// If the chunk size is zero, then no chunking is done on the Reader,
|
|
||||||
// which means we cannot retry: the first call will read the data, and if
|
// The internals that perform call.Do automatically retry
|
||||||
// it fails, there is no way to re-read.
|
// uploading chunks, hence no need to add retries here.
|
||||||
if w.ChunkSize == 0 {
|
// See issue https://github.com/googleapis/google-cloud-go/issues/1507.
|
||||||
resp, err = call.Do()
|
//
|
||||||
} else {
|
// However, since this whole call's internals involve making the initial
|
||||||
// We will only retry here if the initial POST, which obtains a URI for
|
// resumable upload session, the first HTTP request is not retried.
|
||||||
// the resumable upload, fails with a retryable error. The upload itself
|
// TODO: Follow-up with google.golang.org/gensupport to solve
|
||||||
// has its own retry logic.
|
// https://github.com/googleapis/google-api-go-client/issues/392.
|
||||||
err = runWithRetry(w.ctx, func() error {
|
resp, err = call.Do()
|
||||||
var err2 error
|
|
||||||
resp, err2 = call.Do()
|
|
||||||
return err2
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.mu.Lock()
|
w.mu.Lock()
|
||||||
|
|
@ -227,7 +226,7 @@ func (w *Writer) Close() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// monitorCancel is intended to be used as a background goroutine. It monitors the
|
// monitorCancel is intended to be used as a background goroutine. It monitors the
|
||||||
// the context, and when it observes that the context has been canceled, it manually
|
// context, and when it observes that the context has been canceled, it manually
|
||||||
// closes things that do not take a context.
|
// closes things that do not take a context.
|
||||||
func (w *Writer) monitorCancel() {
|
func (w *Writer) monitorCancel() {
|
||||||
select {
|
select {
|
||||||
|
|
|
||||||
26
vendor/github.com/apparentlymart/go-cidr/cidr/cidr.go
generated
vendored
26
vendor/github.com/apparentlymart/go-cidr/cidr/cidr.go
generated
vendored
|
|
@ -44,7 +44,7 @@ func Subnet(base *net.IPNet, newBits int, num int) (*net.IPNet, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return &net.IPNet{
|
return &net.IPNet{
|
||||||
IP: insertNumIntoIP(ip, num, newPrefixLen),
|
IP: insertNumIntoIP(ip, big.NewInt(int64(num)), newPrefixLen),
|
||||||
Mask: net.CIDRMask(newPrefixLen, addrLen),
|
Mask: net.CIDRMask(newPrefixLen, addrLen),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
@ -56,19 +56,23 @@ func Subnet(base *net.IPNet, newBits int, num int) (*net.IPNet, error) {
|
||||||
func Host(base *net.IPNet, num int) (net.IP, error) {
|
func Host(base *net.IPNet, num int) (net.IP, error) {
|
||||||
ip := base.IP
|
ip := base.IP
|
||||||
mask := base.Mask
|
mask := base.Mask
|
||||||
|
bigNum := big.NewInt(int64(num))
|
||||||
|
|
||||||
parentLen, addrLen := mask.Size()
|
parentLen, addrLen := mask.Size()
|
||||||
hostLen := addrLen - parentLen
|
hostLen := addrLen - parentLen
|
||||||
|
|
||||||
maxHostNum := uint64(1<<uint64(hostLen)) - 1
|
maxHostNum := big.NewInt(int64(1))
|
||||||
|
maxHostNum.Lsh(maxHostNum, uint(hostLen))
|
||||||
|
maxHostNum.Sub(maxHostNum, big.NewInt(1))
|
||||||
|
|
||||||
numUint64 := uint64(num)
|
numUint64 := big.NewInt(int64(bigNum.Uint64()))
|
||||||
if num < 0 {
|
if bigNum.Cmp(big.NewInt(0)) == -1 {
|
||||||
numUint64 = uint64(-num) - 1
|
numUint64.Neg(bigNum)
|
||||||
num = int(maxHostNum - numUint64)
|
numUint64.Sub(numUint64, big.NewInt(int64(1)))
|
||||||
|
bigNum.Sub(maxHostNum, numUint64)
|
||||||
}
|
}
|
||||||
|
|
||||||
if numUint64 > maxHostNum {
|
if numUint64.Cmp(maxHostNum) == 1 {
|
||||||
return nil, fmt.Errorf("prefix of %d does not accommodate a host numbered %d", parentLen, num)
|
return nil, fmt.Errorf("prefix of %d does not accommodate a host numbered %d", parentLen, num)
|
||||||
}
|
}
|
||||||
var bitlength int
|
var bitlength int
|
||||||
|
|
@ -77,7 +81,7 @@ func Host(base *net.IPNet, num int) (net.IP, error) {
|
||||||
} else {
|
} else {
|
||||||
bitlength = 128
|
bitlength = 128
|
||||||
}
|
}
|
||||||
return insertNumIntoIP(ip, num, bitlength), nil
|
return insertNumIntoIP(ip, bigNum, bitlength), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddressRange returns the first and last addresses in the given CIDR range.
|
// AddressRange returns the first and last addresses in the given CIDR range.
|
||||||
|
|
@ -129,7 +133,11 @@ func VerifyNoOverlap(subnets []*net.IPNet, CIDRBlock *net.IPNet) error {
|
||||||
if !CIDRBlock.Contains(firstLastIP[i][0]) || !CIDRBlock.Contains(firstLastIP[i][1]) {
|
if !CIDRBlock.Contains(firstLastIP[i][0]) || !CIDRBlock.Contains(firstLastIP[i][1]) {
|
||||||
return fmt.Errorf("%s does not fully contain %s", CIDRBlock.String(), s.String())
|
return fmt.Errorf("%s does not fully contain %s", CIDRBlock.String(), s.String())
|
||||||
}
|
}
|
||||||
for j := i + 1; j < len(subnets); j++ {
|
for j := 0; j < len(subnets); j++ {
|
||||||
|
if i == j {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
first := firstLastIP[j][0]
|
first := firstLastIP[j][0]
|
||||||
last := firstLastIP[j][1]
|
last := firstLastIP[j][1]
|
||||||
if s.Contains(first) || s.Contains(last) {
|
if s.Contains(first) || s.Contains(last) {
|
||||||
|
|
|
||||||
3
vendor/github.com/apparentlymart/go-cidr/cidr/wrangling.go
generated
vendored
3
vendor/github.com/apparentlymart/go-cidr/cidr/wrangling.go
generated
vendored
|
|
@ -29,9 +29,8 @@ func intToIP(ipInt *big.Int, bits int) net.IP {
|
||||||
return net.IP(ret)
|
return net.IP(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
func insertNumIntoIP(ip net.IP, num int, prefixLen int) net.IP {
|
func insertNumIntoIP(ip net.IP, bigNum *big.Int, prefixLen int) net.IP {
|
||||||
ipInt, totalBits := ipToInt(ip)
|
ipInt, totalBits := ipToInt(ip)
|
||||||
bigNum := big.NewInt(int64(num))
|
|
||||||
bigNum.Lsh(bigNum, uint(totalBits-prefixLen))
|
bigNum.Lsh(bigNum, uint(totalBits-prefixLen))
|
||||||
ipInt.Or(ipInt, bigNum)
|
ipInt.Or(ipInt, bigNum)
|
||||||
return intToIP(ipInt, totalBits)
|
return intToIP(ipInt, totalBits)
|
||||||
|
|
|
||||||
307
vendor/github.com/apparentlymart/go-textseg/textseg/make_tables.go
generated
vendored
307
vendor/github.com/apparentlymart/go-textseg/textseg/make_tables.go
generated
vendored
|
|
@ -1,307 +0,0 @@
|
||||||
// Copyright (c) 2014 Couchbase, Inc.
|
|
||||||
// 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.
|
|
||||||
|
|
||||||
// Modified by Martin Atkins to serve the needs of package textseg.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"sort"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"unicode"
|
|
||||||
)
|
|
||||||
|
|
||||||
var url = flag.String("url",
|
|
||||||
"http://www.unicode.org/Public/"+unicode.Version+"/ucd/auxiliary/",
|
|
||||||
"URL of Unicode database directory")
|
|
||||||
var verbose = flag.Bool("verbose",
|
|
||||||
false,
|
|
||||||
"write data to stdout as it is parsed")
|
|
||||||
var localFiles = flag.Bool("local",
|
|
||||||
false,
|
|
||||||
"data files have been copied to the current directory; for debugging only")
|
|
||||||
var outputFile = flag.String("output",
|
|
||||||
"",
|
|
||||||
"output file for generated tables; default stdout")
|
|
||||||
|
|
||||||
var output *bufio.Writer
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
flag.Parse()
|
|
||||||
setupOutput()
|
|
||||||
|
|
||||||
graphemePropertyRanges := make(map[string]*unicode.RangeTable)
|
|
||||||
loadUnicodeData("GraphemeBreakProperty.txt", graphemePropertyRanges)
|
|
||||||
wordPropertyRanges := make(map[string]*unicode.RangeTable)
|
|
||||||
loadUnicodeData("WordBreakProperty.txt", wordPropertyRanges)
|
|
||||||
sentencePropertyRanges := make(map[string]*unicode.RangeTable)
|
|
||||||
loadUnicodeData("SentenceBreakProperty.txt", sentencePropertyRanges)
|
|
||||||
|
|
||||||
fmt.Fprintf(output, fileHeader, *url)
|
|
||||||
generateTables("Grapheme", graphemePropertyRanges)
|
|
||||||
generateTables("Word", wordPropertyRanges)
|
|
||||||
generateTables("Sentence", sentencePropertyRanges)
|
|
||||||
|
|
||||||
flushOutput()
|
|
||||||
}
|
|
||||||
|
|
||||||
// WordBreakProperty.txt has the form:
|
|
||||||
// 05F0..05F2 ; Hebrew_Letter # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
|
|
||||||
// FB1D ; Hebrew_Letter # Lo HEBREW LETTER YOD WITH HIRIQ
|
|
||||||
func openReader(file string) (input io.ReadCloser) {
|
|
||||||
if *localFiles {
|
|
||||||
f, err := os.Open(file)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
input = f
|
|
||||||
} else {
|
|
||||||
path := *url + file
|
|
||||||
resp, err := http.Get(path)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
if resp.StatusCode != 200 {
|
|
||||||
log.Fatal("bad GET status for "+file, resp.Status)
|
|
||||||
}
|
|
||||||
input = resp.Body
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func loadUnicodeData(filename string, propertyRanges map[string]*unicode.RangeTable) {
|
|
||||||
f := openReader(filename)
|
|
||||||
defer f.Close()
|
|
||||||
bufioReader := bufio.NewReader(f)
|
|
||||||
line, err := bufioReader.ReadString('\n')
|
|
||||||
for err == nil {
|
|
||||||
parseLine(line, propertyRanges)
|
|
||||||
line, err = bufioReader.ReadString('\n')
|
|
||||||
}
|
|
||||||
// if the err was EOF still need to process last value
|
|
||||||
if err == io.EOF {
|
|
||||||
parseLine(line, propertyRanges)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const comment = "#"
|
|
||||||
const sep = ";"
|
|
||||||
const rnge = ".."
|
|
||||||
|
|
||||||
func parseLine(line string, propertyRanges map[string]*unicode.RangeTable) {
|
|
||||||
if strings.HasPrefix(line, comment) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
line = strings.TrimSpace(line)
|
|
||||||
if len(line) == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
commentStart := strings.Index(line, comment)
|
|
||||||
if commentStart > 0 {
|
|
||||||
line = line[0:commentStart]
|
|
||||||
}
|
|
||||||
pieces := strings.Split(line, sep)
|
|
||||||
if len(pieces) != 2 {
|
|
||||||
log.Printf("unexpected %d pieces in %s", len(pieces), line)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
propertyName := strings.TrimSpace(pieces[1])
|
|
||||||
|
|
||||||
rangeTable, ok := propertyRanges[propertyName]
|
|
||||||
if !ok {
|
|
||||||
rangeTable = &unicode.RangeTable{
|
|
||||||
LatinOffset: 0,
|
|
||||||
}
|
|
||||||
propertyRanges[propertyName] = rangeTable
|
|
||||||
}
|
|
||||||
|
|
||||||
codepointRange := strings.TrimSpace(pieces[0])
|
|
||||||
rngeIndex := strings.Index(codepointRange, rnge)
|
|
||||||
|
|
||||||
if rngeIndex < 0 {
|
|
||||||
// single codepoint, not range
|
|
||||||
codepointInt, err := strconv.ParseUint(codepointRange, 16, 64)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("error parsing int: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if codepointInt < 0x10000 {
|
|
||||||
r16 := unicode.Range16{
|
|
||||||
Lo: uint16(codepointInt),
|
|
||||||
Hi: uint16(codepointInt),
|
|
||||||
Stride: 1,
|
|
||||||
}
|
|
||||||
addR16ToTable(rangeTable, r16)
|
|
||||||
} else {
|
|
||||||
r32 := unicode.Range32{
|
|
||||||
Lo: uint32(codepointInt),
|
|
||||||
Hi: uint32(codepointInt),
|
|
||||||
Stride: 1,
|
|
||||||
}
|
|
||||||
addR32ToTable(rangeTable, r32)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
rngeStart := codepointRange[0:rngeIndex]
|
|
||||||
rngeEnd := codepointRange[rngeIndex+2:]
|
|
||||||
rngeStartInt, err := strconv.ParseUint(rngeStart, 16, 64)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("error parsing int: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
rngeEndInt, err := strconv.ParseUint(rngeEnd, 16, 64)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("error parsing int: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if rngeStartInt < 0x10000 && rngeEndInt < 0x10000 {
|
|
||||||
r16 := unicode.Range16{
|
|
||||||
Lo: uint16(rngeStartInt),
|
|
||||||
Hi: uint16(rngeEndInt),
|
|
||||||
Stride: 1,
|
|
||||||
}
|
|
||||||
addR16ToTable(rangeTable, r16)
|
|
||||||
} else if rngeStartInt >= 0x10000 && rngeEndInt >= 0x10000 {
|
|
||||||
r32 := unicode.Range32{
|
|
||||||
Lo: uint32(rngeStartInt),
|
|
||||||
Hi: uint32(rngeEndInt),
|
|
||||||
Stride: 1,
|
|
||||||
}
|
|
||||||
addR32ToTable(rangeTable, r32)
|
|
||||||
} else {
|
|
||||||
log.Printf("unexpected range")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func addR16ToTable(r *unicode.RangeTable, r16 unicode.Range16) {
|
|
||||||
if r.R16 == nil {
|
|
||||||
r.R16 = make([]unicode.Range16, 0, 1)
|
|
||||||
}
|
|
||||||
r.R16 = append(r.R16, r16)
|
|
||||||
if r16.Hi <= unicode.MaxLatin1 {
|
|
||||||
r.LatinOffset++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func addR32ToTable(r *unicode.RangeTable, r32 unicode.Range32) {
|
|
||||||
if r.R32 == nil {
|
|
||||||
r.R32 = make([]unicode.Range32, 0, 1)
|
|
||||||
}
|
|
||||||
r.R32 = append(r.R32, r32)
|
|
||||||
}
|
|
||||||
|
|
||||||
func generateTables(prefix string, propertyRanges map[string]*unicode.RangeTable) {
|
|
||||||
prNames := make([]string, 0, len(propertyRanges))
|
|
||||||
for k := range propertyRanges {
|
|
||||||
prNames = append(prNames, k)
|
|
||||||
}
|
|
||||||
sort.Strings(prNames)
|
|
||||||
for _, key := range prNames {
|
|
||||||
rt := propertyRanges[key]
|
|
||||||
fmt.Fprintf(output, "var _%s%s = %s\n", prefix, key, generateRangeTable(rt))
|
|
||||||
}
|
|
||||||
fmt.Fprintf(output, "type _%sRuneRange unicode.RangeTable\n", prefix)
|
|
||||||
|
|
||||||
fmt.Fprintf(output, "func _%sRuneType(r rune) *_%sRuneRange {\n", prefix, prefix)
|
|
||||||
fmt.Fprintf(output, "\tswitch {\n")
|
|
||||||
for _, key := range prNames {
|
|
||||||
fmt.Fprintf(output, "\tcase unicode.Is(_%s%s, r):\n\t\treturn (*_%sRuneRange)(_%s%s)\n", prefix, key, prefix, prefix, key)
|
|
||||||
}
|
|
||||||
fmt.Fprintf(output, "\tdefault:\n\t\treturn nil\n")
|
|
||||||
fmt.Fprintf(output, "\t}\n")
|
|
||||||
fmt.Fprintf(output, "}\n")
|
|
||||||
|
|
||||||
fmt.Fprintf(output, "func (rng *_%sRuneRange) String() string {\n", prefix)
|
|
||||||
fmt.Fprintf(output, "\tswitch (*unicode.RangeTable)(rng) {\n")
|
|
||||||
for _, key := range prNames {
|
|
||||||
fmt.Fprintf(output, "\tcase _%s%s:\n\t\treturn %q\n", prefix, key, key)
|
|
||||||
}
|
|
||||||
fmt.Fprintf(output, "\tdefault:\n\t\treturn \"Other\"\n")
|
|
||||||
fmt.Fprintf(output, "\t}\n")
|
|
||||||
fmt.Fprintf(output, "}\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
func generateRangeTable(rt *unicode.RangeTable) string {
|
|
||||||
rv := "&unicode.RangeTable{\n"
|
|
||||||
if rt.R16 != nil {
|
|
||||||
rv += "\tR16: []unicode.Range16{\n"
|
|
||||||
for _, r16 := range rt.R16 {
|
|
||||||
rv += fmt.Sprintf("\t\t%#v,\n", r16)
|
|
||||||
}
|
|
||||||
rv += "\t},\n"
|
|
||||||
}
|
|
||||||
if rt.R32 != nil {
|
|
||||||
rv += "\tR32: []unicode.Range32{\n"
|
|
||||||
for _, r32 := range rt.R32 {
|
|
||||||
rv += fmt.Sprintf("\t\t%#v,\n", r32)
|
|
||||||
}
|
|
||||||
rv += "\t},\n"
|
|
||||||
}
|
|
||||||
rv += fmt.Sprintf("\t\tLatinOffset: %d,\n", rt.LatinOffset)
|
|
||||||
rv += "}\n"
|
|
||||||
return rv
|
|
||||||
}
|
|
||||||
|
|
||||||
const fileHeader = `// Generated by running
|
|
||||||
// maketables --url=%s
|
|
||||||
// DO NOT EDIT
|
|
||||||
|
|
||||||
package textseg
|
|
||||||
|
|
||||||
import(
|
|
||||||
"unicode"
|
|
||||||
)
|
|
||||||
`
|
|
||||||
|
|
||||||
func setupOutput() {
|
|
||||||
output = bufio.NewWriter(startGofmt())
|
|
||||||
}
|
|
||||||
|
|
||||||
// startGofmt connects output to a gofmt process if -output is set.
|
|
||||||
func startGofmt() io.Writer {
|
|
||||||
if *outputFile == "" {
|
|
||||||
return os.Stdout
|
|
||||||
}
|
|
||||||
stdout, err := os.Create(*outputFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
// Pipe output to gofmt.
|
|
||||||
gofmt := exec.Command("gofmt")
|
|
||||||
fd, err := gofmt.StdinPipe()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
gofmt.Stdout = stdout
|
|
||||||
gofmt.Stderr = os.Stderr
|
|
||||||
err = gofmt.Start()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
return fd
|
|
||||||
}
|
|
||||||
|
|
||||||
func flushOutput() {
|
|
||||||
err := output.Flush()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
212
vendor/github.com/apparentlymart/go-textseg/textseg/make_test_tables.go
generated
vendored
212
vendor/github.com/apparentlymart/go-textseg/textseg/make_test_tables.go
generated
vendored
|
|
@ -1,212 +0,0 @@
|
||||||
// Copyright (c) 2014 Couchbase, Inc.
|
|
||||||
// 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.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"bytes"
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"unicode"
|
|
||||||
)
|
|
||||||
|
|
||||||
var url = flag.String("url",
|
|
||||||
"http://www.unicode.org/Public/"+unicode.Version+"/ucd/auxiliary/",
|
|
||||||
"URL of Unicode database directory")
|
|
||||||
var verbose = flag.Bool("verbose",
|
|
||||||
false,
|
|
||||||
"write data to stdout as it is parsed")
|
|
||||||
var localFiles = flag.Bool("local",
|
|
||||||
false,
|
|
||||||
"data files have been copied to the current directory; for debugging only")
|
|
||||||
|
|
||||||
var outputFile = flag.String("output",
|
|
||||||
"",
|
|
||||||
"output file for generated tables; default stdout")
|
|
||||||
|
|
||||||
var output *bufio.Writer
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
flag.Parse()
|
|
||||||
setupOutput()
|
|
||||||
|
|
||||||
graphemeTests := make([]test, 0)
|
|
||||||
graphemeTests = loadUnicodeData("GraphemeBreakTest.txt", graphemeTests)
|
|
||||||
wordTests := make([]test, 0)
|
|
||||||
wordTests = loadUnicodeData("WordBreakTest.txt", wordTests)
|
|
||||||
sentenceTests := make([]test, 0)
|
|
||||||
sentenceTests = loadUnicodeData("SentenceBreakTest.txt", sentenceTests)
|
|
||||||
|
|
||||||
fmt.Fprintf(output, fileHeader, *url)
|
|
||||||
generateTestTables("Grapheme", graphemeTests)
|
|
||||||
generateTestTables("Word", wordTests)
|
|
||||||
generateTestTables("Sentence", sentenceTests)
|
|
||||||
|
|
||||||
flushOutput()
|
|
||||||
}
|
|
||||||
|
|
||||||
// WordBreakProperty.txt has the form:
|
|
||||||
// 05F0..05F2 ; Hebrew_Letter # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
|
|
||||||
// FB1D ; Hebrew_Letter # Lo HEBREW LETTER YOD WITH HIRIQ
|
|
||||||
func openReader(file string) (input io.ReadCloser) {
|
|
||||||
if *localFiles {
|
|
||||||
f, err := os.Open(file)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
input = f
|
|
||||||
} else {
|
|
||||||
path := *url + file
|
|
||||||
resp, err := http.Get(path)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
if resp.StatusCode != 200 {
|
|
||||||
log.Fatal("bad GET status for "+file, resp.Status)
|
|
||||||
}
|
|
||||||
input = resp.Body
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func loadUnicodeData(filename string, tests []test) []test {
|
|
||||||
f := openReader(filename)
|
|
||||||
defer f.Close()
|
|
||||||
bufioReader := bufio.NewReader(f)
|
|
||||||
line, err := bufioReader.ReadString('\n')
|
|
||||||
for err == nil {
|
|
||||||
tests = parseLine(line, tests)
|
|
||||||
line, err = bufioReader.ReadString('\n')
|
|
||||||
}
|
|
||||||
// if the err was EOF still need to process last value
|
|
||||||
if err == io.EOF {
|
|
||||||
tests = parseLine(line, tests)
|
|
||||||
}
|
|
||||||
return tests
|
|
||||||
}
|
|
||||||
|
|
||||||
const comment = "#"
|
|
||||||
const brk = "÷"
|
|
||||||
const nbrk = "×"
|
|
||||||
|
|
||||||
type test [][]byte
|
|
||||||
|
|
||||||
func parseLine(line string, tests []test) []test {
|
|
||||||
if strings.HasPrefix(line, comment) {
|
|
||||||
return tests
|
|
||||||
}
|
|
||||||
line = strings.TrimSpace(line)
|
|
||||||
if len(line) == 0 {
|
|
||||||
return tests
|
|
||||||
}
|
|
||||||
commentStart := strings.Index(line, comment)
|
|
||||||
if commentStart > 0 {
|
|
||||||
line = line[0:commentStart]
|
|
||||||
}
|
|
||||||
pieces := strings.Split(line, brk)
|
|
||||||
t := make(test, 0)
|
|
||||||
for _, piece := range pieces {
|
|
||||||
piece = strings.TrimSpace(piece)
|
|
||||||
if len(piece) > 0 {
|
|
||||||
codePoints := strings.Split(piece, nbrk)
|
|
||||||
word := ""
|
|
||||||
for _, codePoint := range codePoints {
|
|
||||||
codePoint = strings.TrimSpace(codePoint)
|
|
||||||
r, err := strconv.ParseInt(codePoint, 16, 64)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("err: %v for '%s'", err, string(r))
|
|
||||||
return tests
|
|
||||||
}
|
|
||||||
|
|
||||||
word += string(r)
|
|
||||||
}
|
|
||||||
t = append(t, []byte(word))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tests = append(tests, t)
|
|
||||||
return tests
|
|
||||||
}
|
|
||||||
|
|
||||||
func generateTestTables(prefix string, tests []test) {
|
|
||||||
fmt.Fprintf(output, testHeader, prefix)
|
|
||||||
for _, t := range tests {
|
|
||||||
fmt.Fprintf(output, "\t\t{\n")
|
|
||||||
fmt.Fprintf(output, "\t\t\tinput: %#v,\n", bytes.Join(t, []byte{}))
|
|
||||||
fmt.Fprintf(output, "\t\t\toutput: %s,\n", generateTest(t))
|
|
||||||
fmt.Fprintf(output, "\t\t},\n")
|
|
||||||
}
|
|
||||||
fmt.Fprintf(output, "}\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
func generateTest(t test) string {
|
|
||||||
rv := "[][]byte{"
|
|
||||||
for _, te := range t {
|
|
||||||
rv += fmt.Sprintf("%#v,", te)
|
|
||||||
}
|
|
||||||
rv += "}"
|
|
||||||
return rv
|
|
||||||
}
|
|
||||||
|
|
||||||
const fileHeader = `// Generated by running
|
|
||||||
// maketesttables --url=%s
|
|
||||||
// DO NOT EDIT
|
|
||||||
|
|
||||||
package textseg
|
|
||||||
`
|
|
||||||
|
|
||||||
const testHeader = `var unicode%sTests = []struct {
|
|
||||||
input []byte
|
|
||||||
output [][]byte
|
|
||||||
}{
|
|
||||||
`
|
|
||||||
|
|
||||||
func setupOutput() {
|
|
||||||
output = bufio.NewWriter(startGofmt())
|
|
||||||
}
|
|
||||||
|
|
||||||
// startGofmt connects output to a gofmt process if -output is set.
|
|
||||||
func startGofmt() io.Writer {
|
|
||||||
if *outputFile == "" {
|
|
||||||
return os.Stdout
|
|
||||||
}
|
|
||||||
stdout, err := os.Create(*outputFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
// Pipe output to gofmt.
|
|
||||||
gofmt := exec.Command("gofmt")
|
|
||||||
fd, err := gofmt.StdinPipe()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
gofmt.Stdout = stdout
|
|
||||||
gofmt.Stderr = os.Stderr
|
|
||||||
err = gofmt.Start()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
return fd
|
|
||||||
}
|
|
||||||
|
|
||||||
func flushOutput() {
|
|
||||||
err := output.Flush()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
2
vendor/github.com/aws/aws-sdk-go/aws/awserr/types.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go/aws/awserr/types.go
generated
vendored
|
|
@ -208,7 +208,7 @@ func (e errorList) Error() string {
|
||||||
// How do we want to handle the array size being zero
|
// How do we want to handle the array size being zero
|
||||||
if size := len(e); size > 0 {
|
if size := len(e); size > 0 {
|
||||||
for i := 0; i < size; i++ {
|
for i := 0; i < size; i++ {
|
||||||
msg += e[i].Error()
|
msg += fmt.Sprintf("%s", e[i].Error())
|
||||||
// We check the next index to see if it is within the slice.
|
// We check the next index to see if it is within the slice.
|
||||||
// If it is, then we append a newline. We do this, because unit tests
|
// If it is, then we append a newline. We do this, because unit tests
|
||||||
// could be broken with the additional '\n'
|
// could be broken with the additional '\n'
|
||||||
|
|
|
||||||
11
vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go
generated
vendored
11
vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go
generated
vendored
|
|
@ -185,12 +185,13 @@ func ValuesAtPath(i interface{}, path string) ([]interface{}, error) {
|
||||||
// SetValueAtPath sets a value at the case insensitive lexical path inside
|
// SetValueAtPath sets a value at the case insensitive lexical path inside
|
||||||
// of a structure.
|
// of a structure.
|
||||||
func SetValueAtPath(i interface{}, path string, v interface{}) {
|
func SetValueAtPath(i interface{}, path string, v interface{}) {
|
||||||
rvals := rValuesAtPath(i, path, true, false, v == nil)
|
if rvals := rValuesAtPath(i, path, true, false, v == nil); rvals != nil {
|
||||||
for _, rval := range rvals {
|
for _, rval := range rvals {
|
||||||
if rval.Kind() == reflect.Ptr && rval.IsNil() {
|
if rval.Kind() == reflect.Ptr && rval.IsNil() {
|
||||||
continue
|
continue
|
||||||
|
}
|
||||||
|
setValue(rval, v)
|
||||||
}
|
}
|
||||||
setValue(rval, v)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
12
vendor/github.com/aws/aws-sdk-go/aws/client/logger.go
generated
vendored
12
vendor/github.com/aws/aws-sdk-go/aws/client/logger.go
generated
vendored
|
|
@ -67,14 +67,10 @@ func logRequest(r *request.Request) {
|
||||||
if !bodySeekable {
|
if !bodySeekable {
|
||||||
r.SetReaderBody(aws.ReadSeekCloser(r.HTTPRequest.Body))
|
r.SetReaderBody(aws.ReadSeekCloser(r.HTTPRequest.Body))
|
||||||
}
|
}
|
||||||
// Reset the request body because dumpRequest will re-wrap the
|
// Reset the request body because dumpRequest will re-wrap the r.HTTPRequest's
|
||||||
// r.HTTPRequest's Body as a NoOpCloser and will not be reset after
|
// Body as a NoOpCloser and will not be reset after read by the HTTP
|
||||||
// read by the HTTP client reader.
|
// client reader.
|
||||||
if err := r.Error; err != nil {
|
r.ResetBody()
|
||||||
r.Config.Logger.Log(fmt.Sprintf(logReqErrMsg,
|
|
||||||
r.ClientInfo.ServiceName, r.Operation.Name, err))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
r.Config.Logger.Log(fmt.Sprintf(logReqMsg,
|
r.Config.Logger.Log(fmt.Sprintf(logReqMsg,
|
||||||
|
|
|
||||||
9
vendor/github.com/aws/aws-sdk-go/aws/credentials/credentials.go
generated
vendored
9
vendor/github.com/aws/aws-sdk-go/aws/credentials/credentials.go
generated
vendored
|
|
@ -50,10 +50,9 @@ package credentials
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// AnonymousCredentials is an empty Credential object that can be used as
|
// AnonymousCredentials is an empty Credential object that can be used as
|
||||||
|
|
@ -84,12 +83,6 @@ type Value struct {
|
||||||
ProviderName string
|
ProviderName string
|
||||||
}
|
}
|
||||||
|
|
||||||
// HasKeys returns if the credentials Value has both AccessKeyID and
|
|
||||||
// SecretAccessKey value set.
|
|
||||||
func (v Value) HasKeys() bool {
|
|
||||||
return len(v.AccessKeyID) != 0 && len(v.SecretAccessKey) != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// A Provider is the interface for any component which will provide credentials
|
// A Provider is the interface for any component which will provide credentials
|
||||||
// Value. A provider is required to manage its own Expired state, and what to
|
// Value. A provider is required to manage its own Expired state, and what to
|
||||||
// be expired means.
|
// be expired means.
|
||||||
|
|
|
||||||
3
vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go
generated
vendored
3
vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go
generated
vendored
|
|
@ -200,7 +200,7 @@ type AssumeRoleProvider struct {
|
||||||
// by a random percentage between 0 and MaxJitterFraction. MaxJitterFrac must
|
// by a random percentage between 0 and MaxJitterFraction. MaxJitterFrac must
|
||||||
// have a value between 0 and 1. Any other value may lead to expected behavior.
|
// have a value between 0 and 1. Any other value may lead to expected behavior.
|
||||||
// With a MaxJitterFrac value of 0, default) will no jitter will be used.
|
// With a MaxJitterFrac value of 0, default) will no jitter will be used.
|
||||||
//
|
//
|
||||||
// For example, with a Duration of 30m and a MaxJitterFrac of 0.1, the
|
// For example, with a Duration of 30m and a MaxJitterFrac of 0.1, the
|
||||||
// AssumeRole call will be made with an arbitrary Duration between 27m and
|
// AssumeRole call will be made with an arbitrary Duration between 27m and
|
||||||
// 30m.
|
// 30m.
|
||||||
|
|
@ -258,6 +258,7 @@ func NewCredentialsWithClient(svc AssumeRoler, roleARN string, options ...func(*
|
||||||
|
|
||||||
// Retrieve generates a new set of temporary credentials using STS.
|
// Retrieve generates a new set of temporary credentials using STS.
|
||||||
func (p *AssumeRoleProvider) Retrieve() (credentials.Value, error) {
|
func (p *AssumeRoleProvider) Retrieve() (credentials.Value, error) {
|
||||||
|
|
||||||
// Apply defaults where parameters are not set.
|
// Apply defaults where parameters are not set.
|
||||||
if p.RoleSessionName == "" {
|
if p.RoleSessionName == "" {
|
||||||
// Try to work out a role name that will hopefully end up unique.
|
// Try to work out a role name that will hopefully end up unique.
|
||||||
|
|
|
||||||
97
vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/web_identity_provider.go
generated
vendored
97
vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/web_identity_provider.go
generated
vendored
|
|
@ -1,97 +0,0 @@
|
||||||
package stscreds
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/client"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/credentials"
|
|
||||||
"github.com/aws/aws-sdk-go/service/sts"
|
|
||||||
"github.com/aws/aws-sdk-go/service/sts/stsiface"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// ErrCodeWebIdentity will be used as an error code when constructing
|
|
||||||
// a new error to be returned during session creation or retrieval.
|
|
||||||
ErrCodeWebIdentity = "WebIdentityErr"
|
|
||||||
|
|
||||||
// WebIdentityProviderName is the web identity provider name
|
|
||||||
WebIdentityProviderName = "WebIdentityCredentials"
|
|
||||||
)
|
|
||||||
|
|
||||||
// now is used to return a time.Time object representing
|
|
||||||
// the current time. This can be used to easily test and
|
|
||||||
// compare test values.
|
|
||||||
var now = time.Now
|
|
||||||
|
|
||||||
// WebIdentityRoleProvider is used to retrieve credentials using
|
|
||||||
// an OIDC token.
|
|
||||||
type WebIdentityRoleProvider struct {
|
|
||||||
credentials.Expiry
|
|
||||||
|
|
||||||
client stsiface.STSAPI
|
|
||||||
ExpiryWindow time.Duration
|
|
||||||
|
|
||||||
tokenFilePath string
|
|
||||||
roleARN string
|
|
||||||
roleSessionName string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewWebIdentityCredentials will return a new set of credentials with a given
|
|
||||||
// configuration, role arn, and token file path.
|
|
||||||
func NewWebIdentityCredentials(c client.ConfigProvider, roleARN, roleSessionName, path string) *credentials.Credentials {
|
|
||||||
svc := sts.New(c)
|
|
||||||
p := NewWebIdentityRoleProvider(svc, roleARN, roleSessionName, path)
|
|
||||||
return credentials.NewCredentials(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewWebIdentityRoleProvider will return a new WebIdentityRoleProvider with the
|
|
||||||
// provided stsiface.STSAPI
|
|
||||||
func NewWebIdentityRoleProvider(svc stsiface.STSAPI, roleARN, roleSessionName, path string) *WebIdentityRoleProvider {
|
|
||||||
return &WebIdentityRoleProvider{
|
|
||||||
client: svc,
|
|
||||||
tokenFilePath: path,
|
|
||||||
roleARN: roleARN,
|
|
||||||
roleSessionName: roleSessionName,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retrieve will attempt to assume a role from a token which is located at
|
|
||||||
// 'WebIdentityTokenFilePath' specified destination and if that is empty an
|
|
||||||
// error will be returned.
|
|
||||||
func (p *WebIdentityRoleProvider) Retrieve() (credentials.Value, error) {
|
|
||||||
b, err := ioutil.ReadFile(p.tokenFilePath)
|
|
||||||
if err != nil {
|
|
||||||
errMsg := fmt.Sprintf("unable to read file at %s", p.tokenFilePath)
|
|
||||||
return credentials.Value{}, awserr.New(ErrCodeWebIdentity, errMsg, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
sessionName := p.roleSessionName
|
|
||||||
if len(sessionName) == 0 {
|
|
||||||
// session name is used to uniquely identify a session. This simply
|
|
||||||
// uses unix time in nanoseconds to uniquely identify sessions.
|
|
||||||
sessionName = strconv.FormatInt(now().UnixNano(), 10)
|
|
||||||
}
|
|
||||||
resp, err := p.client.AssumeRoleWithWebIdentity(&sts.AssumeRoleWithWebIdentityInput{
|
|
||||||
RoleArn: &p.roleARN,
|
|
||||||
RoleSessionName: &sessionName,
|
|
||||||
WebIdentityToken: aws.String(string(b)),
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return credentials.Value{}, awserr.New(ErrCodeWebIdentity, "failed to retrieve credentials", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
p.SetExpiration(aws.TimeValue(resp.Credentials.Expiration), p.ExpiryWindow)
|
|
||||||
|
|
||||||
value := credentials.Value{
|
|
||||||
AccessKeyID: aws.StringValue(resp.Credentials.AccessKeyId),
|
|
||||||
SecretAccessKey: aws.StringValue(resp.Credentials.SecretAccessKey),
|
|
||||||
SessionToken: aws.StringValue(resp.Credentials.SessionToken),
|
|
||||||
ProviderName: WebIdentityProviderName,
|
|
||||||
}
|
|
||||||
return value, nil
|
|
||||||
}
|
|
||||||
65
vendor/github.com/aws/aws-sdk-go/aws/csm/doc.go
generated
vendored
65
vendor/github.com/aws/aws-sdk-go/aws/csm/doc.go
generated
vendored
|
|
@ -1,61 +1,30 @@
|
||||||
// Package csm provides the Client Side Monitoring (CSM) client which enables
|
// Package csm provides Client Side Monitoring (CSM) which enables sending metrics
|
||||||
// sending metrics via UDP connection to the CSM agent. This package provides
|
// via UDP connection. Using the Start function will enable the reporting of
|
||||||
// control options, and configuration for the CSM client. The client can be
|
// metrics on a given port. If Start is called, with different parameters, again,
|
||||||
// controlled manually, or automatically via the SDK's Session configuration.
|
// a panic will occur.
|
||||||
//
|
//
|
||||||
// Enabling CSM client via SDK's Session configuration
|
// Pause can be called to pause any metrics publishing on a given port. Sessions
|
||||||
//
|
// that have had their handlers modified via InjectHandlers may still be used.
|
||||||
// The CSM client can be enabled automatically via SDK's Session configuration.
|
// However, the handlers will act as a no-op meaning no metrics will be published.
|
||||||
// The SDK's session configuration enables the CSM client if the AWS_CSM_PORT
|
|
||||||
// environment variable is set to a non-empty value.
|
|
||||||
//
|
|
||||||
// The configuration options for the CSM client via the SDK's session
|
|
||||||
// configuration are:
|
|
||||||
//
|
|
||||||
// * AWS_CSM_PORT=<port number>
|
|
||||||
// The port number the CSM agent will receive metrics on.
|
|
||||||
//
|
|
||||||
// * AWS_CSM_HOST=<hostname or ip>
|
|
||||||
// The hostname, or IP address the CSM agent will receive metrics on.
|
|
||||||
// Without port number.
|
|
||||||
//
|
|
||||||
// Manually enabling the CSM client
|
|
||||||
//
|
|
||||||
// The CSM client can be started, paused, and resumed manually. The Start
|
|
||||||
// function will enable the CSM client to publish metrics to the CSM agent. It
|
|
||||||
// is safe to call Start concurrently, but if Start is called additional times
|
|
||||||
// with different ClientID or address it will panic.
|
|
||||||
//
|
//
|
||||||
|
// Example:
|
||||||
// r, err := csm.Start("clientID", ":31000")
|
// r, err := csm.Start("clientID", ":31000")
|
||||||
// if err != nil {
|
// if err != nil {
|
||||||
// panic(fmt.Errorf("failed starting CSM: %v", err))
|
// panic(fmt.Errorf("failed starting CSM: %v", err))
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// When controlling the CSM client manually, you must also inject its request
|
|
||||||
// handlers into the SDK's Session configuration for the SDK's API clients to
|
|
||||||
// publish metrics.
|
|
||||||
//
|
|
||||||
// sess, err := session.NewSession(&aws.Config{})
|
// sess, err := session.NewSession(&aws.Config{})
|
||||||
// if err != nil {
|
// if err != nil {
|
||||||
// panic(fmt.Errorf("failed loading session: %v", err))
|
// panic(fmt.Errorf("failed loading session: %v", err))
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// // Add CSM client's metric publishing request handlers to the SDK's
|
|
||||||
// // Session Configuration.
|
|
||||||
// r.InjectHandlers(&sess.Handlers)
|
// r.InjectHandlers(&sess.Handlers)
|
||||||
//
|
//
|
||||||
// Controlling CSM client
|
// client := s3.New(sess)
|
||||||
//
|
// resp, err := client.GetObject(&s3.GetObjectInput{
|
||||||
// Once the CSM client has been enabled the Get function will return a Reporter
|
// Bucket: aws.String("bucket"),
|
||||||
// value that you can use to pause and resume the metrics published to the CSM
|
// Key: aws.String("key"),
|
||||||
// agent. If Get function is called before the reporter is enabled with the
|
// })
|
||||||
// Start function or via SDK's Session configuration nil will be returned.
|
|
||||||
//
|
|
||||||
// The Pause method can be called to stop the CSM client publishing metrics to
|
|
||||||
// the CSM agent. The Continue method will resume metric publishing.
|
|
||||||
//
|
|
||||||
// // Get the CSM client Reporter.
|
|
||||||
// r := csm.Get()
|
|
||||||
//
|
//
|
||||||
// // Will pause monitoring
|
// // Will pause monitoring
|
||||||
// r.Pause()
|
// r.Pause()
|
||||||
|
|
@ -66,4 +35,12 @@
|
||||||
//
|
//
|
||||||
// // Resume monitoring
|
// // Resume monitoring
|
||||||
// r.Continue()
|
// r.Continue()
|
||||||
|
//
|
||||||
|
// Start returns a Reporter that is used to enable or disable monitoring. If
|
||||||
|
// access to the Reporter is required later, calling Get will return the Reporter
|
||||||
|
// singleton.
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
// r := csm.Get()
|
||||||
|
// r.Continue()
|
||||||
package csm
|
package csm
|
||||||
|
|
|
||||||
34
vendor/github.com/aws/aws-sdk-go/aws/csm/enable.go
generated
vendored
34
vendor/github.com/aws/aws-sdk-go/aws/csm/enable.go
generated
vendored
|
|
@ -2,7 +2,6 @@ package csm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -10,40 +9,19 @@ var (
|
||||||
lock sync.Mutex
|
lock sync.Mutex
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Client side metric handler names
|
||||||
const (
|
const (
|
||||||
// DefaultPort is used when no port is specified.
|
APICallMetricHandlerName = "awscsm.SendAPICallMetric"
|
||||||
DefaultPort = "31000"
|
APICallAttemptMetricHandlerName = "awscsm.SendAPICallAttemptMetric"
|
||||||
|
|
||||||
// DefaultHost is the host that will be used when none is specified.
|
|
||||||
DefaultHost = "127.0.0.1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// AddressWithDefaults returns a CSM address built from the host and port
|
// Start will start the a long running go routine to capture
|
||||||
// values. If the host or port is not set, default values will be used
|
|
||||||
// instead. If host is "localhost" it will be replaced with "127.0.0.1".
|
|
||||||
func AddressWithDefaults(host, port string) string {
|
|
||||||
if len(host) == 0 || strings.EqualFold(host, "localhost") {
|
|
||||||
host = DefaultHost
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(port) == 0 {
|
|
||||||
port = DefaultPort
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only IP6 host can contain a colon
|
|
||||||
if strings.Contains(host, ":") {
|
|
||||||
return "[" + host + "]:" + port
|
|
||||||
}
|
|
||||||
|
|
||||||
return host + ":" + port
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start will start a long running go routine to capture
|
|
||||||
// client side metrics. Calling start multiple time will only
|
// client side metrics. Calling start multiple time will only
|
||||||
// start the metric listener once and will panic if a different
|
// start the metric listener once and will panic if a different
|
||||||
// client ID or port is passed in.
|
// client ID or port is passed in.
|
||||||
//
|
//
|
||||||
// r, err := csm.Start("clientID", "127.0.0.1:31000")
|
// Example:
|
||||||
|
// r, err := csm.Start("clientID", "127.0.0.1:8094")
|
||||||
// if err != nil {
|
// if err != nil {
|
||||||
// panic(fmt.Errorf("expected no error, but received %v", err))
|
// panic(fmt.Errorf("expected no error, but received %v", err))
|
||||||
// }
|
// }
|
||||||
|
|
|
||||||
27
vendor/github.com/aws/aws-sdk-go/aws/csm/reporter.go
generated
vendored
27
vendor/github.com/aws/aws-sdk-go/aws/csm/reporter.go
generated
vendored
|
|
@ -10,6 +10,11 @@ import (
|
||||||
"github.com/aws/aws-sdk-go/aws/request"
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// DefaultPort is used when no port is specified
|
||||||
|
DefaultPort = "31000"
|
||||||
|
)
|
||||||
|
|
||||||
// Reporter will gather metrics of API requests made and
|
// Reporter will gather metrics of API requests made and
|
||||||
// send those metrics to the CSM endpoint.
|
// send those metrics to the CSM endpoint.
|
||||||
type Reporter struct {
|
type Reporter struct {
|
||||||
|
|
@ -118,7 +123,7 @@ func (rep *Reporter) sendAPICallMetric(r *request.Request) {
|
||||||
Type: aws.String("ApiCall"),
|
Type: aws.String("ApiCall"),
|
||||||
AttemptCount: aws.Int(r.RetryCount + 1),
|
AttemptCount: aws.Int(r.RetryCount + 1),
|
||||||
Region: r.Config.Region,
|
Region: r.Config.Region,
|
||||||
Latency: aws.Int(int(time.Since(r.Time) / time.Millisecond)),
|
Latency: aws.Int(int(time.Now().Sub(r.Time) / time.Millisecond)),
|
||||||
XAmzRequestID: aws.String(r.RequestID),
|
XAmzRequestID: aws.String(r.RequestID),
|
||||||
MaxRetriesExceeded: aws.Int(boolIntValue(r.RetryCount >= r.MaxRetries())),
|
MaxRetriesExceeded: aws.Int(boolIntValue(r.RetryCount >= r.MaxRetries())),
|
||||||
}
|
}
|
||||||
|
|
@ -185,9 +190,8 @@ func (rep *Reporter) start() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pause will pause the metric channel preventing any new metrics from being
|
// Pause will pause the metric channel preventing any new metrics from
|
||||||
// added. It is safe to call concurrently with other calls to Pause, but if
|
// being added.
|
||||||
// called concurently with Continue can lead to unexpected state.
|
|
||||||
func (rep *Reporter) Pause() {
|
func (rep *Reporter) Pause() {
|
||||||
lock.Lock()
|
lock.Lock()
|
||||||
defer lock.Unlock()
|
defer lock.Unlock()
|
||||||
|
|
@ -199,9 +203,8 @@ func (rep *Reporter) Pause() {
|
||||||
rep.close()
|
rep.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Continue will reopen the metric channel and allow for monitoring to be
|
// Continue will reopen the metric channel and allow for monitoring
|
||||||
// resumed. It is safe to call concurrently with other calls to Continue, but
|
// to be resumed.
|
||||||
// if called concurently with Pause can lead to unexpected state.
|
|
||||||
func (rep *Reporter) Continue() {
|
func (rep *Reporter) Continue() {
|
||||||
lock.Lock()
|
lock.Lock()
|
||||||
defer lock.Unlock()
|
defer lock.Unlock()
|
||||||
|
|
@ -216,18 +219,10 @@ func (rep *Reporter) Continue() {
|
||||||
rep.metricsCh.Continue()
|
rep.metricsCh.Continue()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Client side metric handler names
|
|
||||||
const (
|
|
||||||
APICallMetricHandlerName = "awscsm.SendAPICallMetric"
|
|
||||||
APICallAttemptMetricHandlerName = "awscsm.SendAPICallAttemptMetric"
|
|
||||||
)
|
|
||||||
|
|
||||||
// InjectHandlers will will enable client side metrics and inject the proper
|
// InjectHandlers will will enable client side metrics and inject the proper
|
||||||
// handlers to handle how metrics are sent.
|
// handlers to handle how metrics are sent.
|
||||||
//
|
//
|
||||||
// InjectHandlers is NOT safe to call concurrently. Calling InjectHandlers
|
// Example:
|
||||||
// multiple times may lead to unexpected behavior, (e.g. duplicate metrics).
|
|
||||||
//
|
|
||||||
// // Start must be called in order to inject the correct handlers
|
// // Start must be called in order to inject the correct handlers
|
||||||
// r, err := csm.Start("clientID", "127.0.0.1:8094")
|
// r, err := csm.Start("clientID", "127.0.0.1:8094")
|
||||||
// if err != nil {
|
// if err != nil {
|
||||||
|
|
|
||||||
491
vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
generated
vendored
491
vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
generated
vendored
File diff suppressed because it is too large
Load diff
7
vendor/github.com/aws/aws-sdk-go/aws/endpoints/endpoints.go
generated
vendored
7
vendor/github.com/aws/aws-sdk-go/aws/endpoints/endpoints.go
generated
vendored
|
|
@ -170,13 +170,10 @@ func PartitionForRegion(ps []Partition, regionID string) (Partition, bool) {
|
||||||
// A Partition provides the ability to enumerate the partition's regions
|
// A Partition provides the ability to enumerate the partition's regions
|
||||||
// and services.
|
// and services.
|
||||||
type Partition struct {
|
type Partition struct {
|
||||||
id, dnsSuffix string
|
id string
|
||||||
p *partition
|
p *partition
|
||||||
}
|
}
|
||||||
|
|
||||||
// DNSSuffix returns the base domain name of the partition.
|
|
||||||
func (p Partition) DNSSuffix() string { return p.dnsSuffix }
|
|
||||||
|
|
||||||
// ID returns the identifier of the partition.
|
// ID returns the identifier of the partition.
|
||||||
func (p Partition) ID() string { return p.id }
|
func (p Partition) ID() string { return p.id }
|
||||||
|
|
||||||
|
|
|
||||||
5
vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model.go
generated
vendored
5
vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model.go
generated
vendored
|
|
@ -54,9 +54,8 @@ type partition struct {
|
||||||
|
|
||||||
func (p partition) Partition() Partition {
|
func (p partition) Partition() Partition {
|
||||||
return Partition{
|
return Partition{
|
||||||
dnsSuffix: p.DNSSuffix,
|
id: p.ID,
|
||||||
id: p.ID,
|
p: &p,
|
||||||
p: &p,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
17
vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error.go
generated
vendored
17
vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error.go
generated
vendored
|
|
@ -1,17 +1,18 @@
|
||||||
|
// +build !appengine,!plan9
|
||||||
|
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"net"
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
)
|
)
|
||||||
|
|
||||||
func isErrConnectionReset(err error) bool {
|
func isErrConnectionReset(err error) bool {
|
||||||
if strings.Contains(err.Error(), "read: connection reset") {
|
if opErr, ok := err.(*net.OpError); ok {
|
||||||
return false
|
if sysErr, ok := opErr.Err.(*os.SyscallError); ok {
|
||||||
}
|
return sysErr.Err == syscall.ECONNRESET
|
||||||
|
}
|
||||||
if strings.Contains(err.Error(), "connection reset") ||
|
|
||||||
strings.Contains(err.Error(), "broken pipe") {
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
|
|
|
||||||
11
vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error_other.go
generated
vendored
Normal file
11
vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error_other.go
generated
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
// +build appengine plan9
|
||||||
|
|
||||||
|
package request
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func isErrConnectionReset(err error) bool {
|
||||||
|
return strings.Contains(err.Error(), "connection reset")
|
||||||
|
}
|
||||||
45
vendor/github.com/aws/aws-sdk-go/aws/request/handlers.go
generated
vendored
45
vendor/github.com/aws/aws-sdk-go/aws/request/handlers.go
generated
vendored
|
|
@ -59,51 +59,6 @@ func (h *Handlers) Clear() {
|
||||||
h.Complete.Clear()
|
h.Complete.Clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsEmpty returns if there are no handlers in any of the handlerlists.
|
|
||||||
func (h *Handlers) IsEmpty() bool {
|
|
||||||
if h.Validate.Len() != 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if h.Build.Len() != 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if h.Send.Len() != 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if h.Sign.Len() != 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if h.Unmarshal.Len() != 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if h.UnmarshalStream.Len() != 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if h.UnmarshalMeta.Len() != 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if h.UnmarshalError.Len() != 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if h.ValidateResponse.Len() != 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if h.Retry.Len() != 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if h.AfterRetry.Len() != 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if h.CompleteAttempt.Len() != 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if h.Complete.Len() != 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// A HandlerListRunItem represents an entry in the HandlerList which
|
// A HandlerListRunItem represents an entry in the HandlerList which
|
||||||
// is being run.
|
// is being run.
|
||||||
type HandlerListRunItem struct {
|
type HandlerListRunItem struct {
|
||||||
|
|
|
||||||
15
vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go
generated
vendored
15
vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go
generated
vendored
|
|
@ -15,15 +15,12 @@ type offsetReader struct {
|
||||||
closed bool
|
closed bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func newOffsetReader(buf io.ReadSeeker, offset int64) (*offsetReader, error) {
|
func newOffsetReader(buf io.ReadSeeker, offset int64) *offsetReader {
|
||||||
reader := &offsetReader{}
|
reader := &offsetReader{}
|
||||||
_, err := buf.Seek(offset, sdkio.SeekStart)
|
buf.Seek(offset, sdkio.SeekStart)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
reader.buf = buf
|
reader.buf = buf
|
||||||
return reader, nil
|
return reader
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close will close the instance of the offset reader's access to
|
// Close will close the instance of the offset reader's access to
|
||||||
|
|
@ -57,9 +54,7 @@ func (o *offsetReader) Seek(offset int64, whence int) (int64, error) {
|
||||||
|
|
||||||
// CloseAndCopy will return a new offsetReader with a copy of the old buffer
|
// CloseAndCopy will return a new offsetReader with a copy of the old buffer
|
||||||
// and close the old buffer.
|
// and close the old buffer.
|
||||||
func (o *offsetReader) CloseAndCopy(offset int64) (*offsetReader, error) {
|
func (o *offsetReader) CloseAndCopy(offset int64) *offsetReader {
|
||||||
if err := o.Close(); err != nil {
|
o.Close()
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return newOffsetReader(o.buf, offset)
|
return newOffsetReader(o.buf, offset)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
90
vendor/github.com/aws/aws-sdk-go/aws/request/request.go
generated
vendored
90
vendor/github.com/aws/aws-sdk-go/aws/request/request.go
generated
vendored
|
|
@ -4,7 +4,6 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
@ -232,10 +231,6 @@ func (r *Request) WillRetry() bool {
|
||||||
return r.Error != nil && aws.BoolValue(r.Retryable) && r.RetryCount < r.MaxRetries()
|
return r.Error != nil && aws.BoolValue(r.Retryable) && r.RetryCount < r.MaxRetries()
|
||||||
}
|
}
|
||||||
|
|
||||||
func fmtAttemptCount(retryCount, maxRetries int) string {
|
|
||||||
return fmt.Sprintf("attempt %v/%v", retryCount, maxRetries)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParamsFilled returns if the request's parameters have been populated
|
// ParamsFilled returns if the request's parameters have been populated
|
||||||
// and the parameters are valid. False is returned if no parameters are
|
// and the parameters are valid. False is returned if no parameters are
|
||||||
// provided or invalid.
|
// provided or invalid.
|
||||||
|
|
@ -264,18 +259,7 @@ func (r *Request) SetStringBody(s string) {
|
||||||
// SetReaderBody will set the request's body reader.
|
// SetReaderBody will set the request's body reader.
|
||||||
func (r *Request) SetReaderBody(reader io.ReadSeeker) {
|
func (r *Request) SetReaderBody(reader io.ReadSeeker) {
|
||||||
r.Body = reader
|
r.Body = reader
|
||||||
|
r.BodyStart, _ = reader.Seek(0, sdkio.SeekCurrent) // Get the Bodies current offset.
|
||||||
if aws.IsReaderSeekable(reader) {
|
|
||||||
var err error
|
|
||||||
// Get the Bodies current offset so retries will start from the same
|
|
||||||
// initial position.
|
|
||||||
r.BodyStart, err = reader.Seek(0, sdkio.SeekCurrent)
|
|
||||||
if err != nil {
|
|
||||||
r.Error = awserr.New(ErrCodeSerialization,
|
|
||||||
"failed to determine start of request body", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
r.ResetBody()
|
r.ResetBody()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -346,15 +330,16 @@ func getPresignedURL(r *Request, expire time.Duration) (string, http.Header, err
|
||||||
return r.HTTPRequest.URL.String(), r.SignedHeaderVals, nil
|
return r.HTTPRequest.URL.String(), r.SignedHeaderVals, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
func debugLogReqError(r *Request, stage string, retrying bool, err error) {
|
||||||
notRetrying = "not retrying"
|
|
||||||
)
|
|
||||||
|
|
||||||
func debugLogReqError(r *Request, stage, retryStr string, err error) {
|
|
||||||
if !r.Config.LogLevel.Matches(aws.LogDebugWithRequestErrors) {
|
if !r.Config.LogLevel.Matches(aws.LogDebugWithRequestErrors) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
retryStr := "not retrying"
|
||||||
|
if retrying {
|
||||||
|
retryStr = "will retry"
|
||||||
|
}
|
||||||
|
|
||||||
r.Config.Logger.Log(fmt.Sprintf("DEBUG: %s %s/%s failed, %s, error %v",
|
r.Config.Logger.Log(fmt.Sprintf("DEBUG: %s %s/%s failed, %s, error %v",
|
||||||
stage, r.ClientInfo.ServiceName, r.Operation.Name, retryStr, err))
|
stage, r.ClientInfo.ServiceName, r.Operation.Name, retryStr, err))
|
||||||
}
|
}
|
||||||
|
|
@ -373,12 +358,12 @@ func (r *Request) Build() error {
|
||||||
if !r.built {
|
if !r.built {
|
||||||
r.Handlers.Validate.Run(r)
|
r.Handlers.Validate.Run(r)
|
||||||
if r.Error != nil {
|
if r.Error != nil {
|
||||||
debugLogReqError(r, "Validate Request", notRetrying, r.Error)
|
debugLogReqError(r, "Validate Request", false, r.Error)
|
||||||
return r.Error
|
return r.Error
|
||||||
}
|
}
|
||||||
r.Handlers.Build.Run(r)
|
r.Handlers.Build.Run(r)
|
||||||
if r.Error != nil {
|
if r.Error != nil {
|
||||||
debugLogReqError(r, "Build Request", notRetrying, r.Error)
|
debugLogReqError(r, "Build Request", false, r.Error)
|
||||||
return r.Error
|
return r.Error
|
||||||
}
|
}
|
||||||
r.built = true
|
r.built = true
|
||||||
|
|
@ -394,7 +379,7 @@ func (r *Request) Build() error {
|
||||||
func (r *Request) Sign() error {
|
func (r *Request) Sign() error {
|
||||||
r.Build()
|
r.Build()
|
||||||
if r.Error != nil {
|
if r.Error != nil {
|
||||||
debugLogReqError(r, "Build Request", notRetrying, r.Error)
|
debugLogReqError(r, "Build Request", false, r.Error)
|
||||||
return r.Error
|
return r.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -402,16 +387,12 @@ func (r *Request) Sign() error {
|
||||||
return r.Error
|
return r.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Request) getNextRequestBody() (body io.ReadCloser, err error) {
|
func (r *Request) getNextRequestBody() (io.ReadCloser, error) {
|
||||||
if r.safeBody != nil {
|
if r.safeBody != nil {
|
||||||
r.safeBody.Close()
|
r.safeBody.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
r.safeBody, err = newOffsetReader(r.Body, r.BodyStart)
|
r.safeBody = newOffsetReader(r.Body, r.BodyStart)
|
||||||
if err != nil {
|
|
||||||
return nil, awserr.New(ErrCodeSerialization,
|
|
||||||
"failed to get next request body reader", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Go 1.8 tightened and clarified the rules code needs to use when building
|
// Go 1.8 tightened and clarified the rules code needs to use when building
|
||||||
// requests with the http package. Go 1.8 removed the automatic detection
|
// requests with the http package. Go 1.8 removed the automatic detection
|
||||||
|
|
@ -428,10 +409,10 @@ func (r *Request) getNextRequestBody() (body io.ReadCloser, err error) {
|
||||||
// Related golang/go#18257
|
// Related golang/go#18257
|
||||||
l, err := aws.SeekerLen(r.Body)
|
l, err := aws.SeekerLen(r.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, awserr.New(ErrCodeSerialization,
|
return nil, awserr.New(ErrCodeSerialization, "failed to compute request body size", err)
|
||||||
"failed to compute request body size", err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var body io.ReadCloser
|
||||||
if l == 0 {
|
if l == 0 {
|
||||||
body = NoBody
|
body = NoBody
|
||||||
} else if l > 0 {
|
} else if l > 0 {
|
||||||
|
|
@ -492,13 +473,13 @@ func (r *Request) Send() error {
|
||||||
r.AttemptTime = time.Now()
|
r.AttemptTime = time.Now()
|
||||||
|
|
||||||
if err := r.Sign(); err != nil {
|
if err := r.Sign(); err != nil {
|
||||||
debugLogReqError(r, "Sign Request", notRetrying, err)
|
debugLogReqError(r, "Sign Request", false, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := r.sendRequest(); err == nil {
|
if err := r.sendRequest(); err == nil {
|
||||||
return nil
|
return nil
|
||||||
} else if !shouldRetryError(r.Error) {
|
} else if !shouldRetryCancel(r.Error) {
|
||||||
return err
|
return err
|
||||||
} else {
|
} else {
|
||||||
r.Handlers.Retry.Run(r)
|
r.Handlers.Retry.Run(r)
|
||||||
|
|
@ -508,16 +489,13 @@ func (r *Request) Send() error {
|
||||||
return r.Error
|
return r.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := r.prepareRetry(); err != nil {
|
r.prepareRetry()
|
||||||
r.Error = err
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Request) prepareRetry() error {
|
func (r *Request) prepareRetry() {
|
||||||
if r.Config.LogLevel.Matches(aws.LogDebugWithRequestRetries) {
|
if r.Config.LogLevel.Matches(aws.LogDebugWithRequestRetries) {
|
||||||
r.Config.Logger.Log(fmt.Sprintf("DEBUG: Retrying Request %s/%s, attempt %d",
|
r.Config.Logger.Log(fmt.Sprintf("DEBUG: Retrying Request %s/%s, attempt %d",
|
||||||
r.ClientInfo.ServiceName, r.Operation.Name, r.RetryCount))
|
r.ClientInfo.ServiceName, r.Operation.Name, r.RetryCount))
|
||||||
|
|
@ -528,19 +506,12 @@ func (r *Request) prepareRetry() error {
|
||||||
// the request's body even though the Client's Do returned.
|
// the request's body even though the Client's Do returned.
|
||||||
r.HTTPRequest = copyHTTPRequest(r.HTTPRequest, nil)
|
r.HTTPRequest = copyHTTPRequest(r.HTTPRequest, nil)
|
||||||
r.ResetBody()
|
r.ResetBody()
|
||||||
if err := r.Error; err != nil {
|
|
||||||
return awserr.New(ErrCodeSerialization,
|
|
||||||
"failed to prepare body for retry", err)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Closing response body to ensure that no response body is leaked
|
// Closing response body to ensure that no response body is leaked
|
||||||
// between retry attempts.
|
// between retry attempts.
|
||||||
if r.HTTPResponse != nil && r.HTTPResponse.Body != nil {
|
if r.HTTPResponse != nil && r.HTTPResponse.Body != nil {
|
||||||
r.HTTPResponse.Body.Close()
|
r.HTTPResponse.Body.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Request) sendRequest() (sendErr error) {
|
func (r *Request) sendRequest() (sendErr error) {
|
||||||
|
|
@ -549,9 +520,7 @@ func (r *Request) sendRequest() (sendErr error) {
|
||||||
r.Retryable = nil
|
r.Retryable = nil
|
||||||
r.Handlers.Send.Run(r)
|
r.Handlers.Send.Run(r)
|
||||||
if r.Error != nil {
|
if r.Error != nil {
|
||||||
debugLogReqError(r, "Send Request",
|
debugLogReqError(r, "Send Request", r.WillRetry(), r.Error)
|
||||||
fmtAttemptCount(r.RetryCount, r.MaxRetries()),
|
|
||||||
r.Error)
|
|
||||||
return r.Error
|
return r.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -559,17 +528,13 @@ func (r *Request) sendRequest() (sendErr error) {
|
||||||
r.Handlers.ValidateResponse.Run(r)
|
r.Handlers.ValidateResponse.Run(r)
|
||||||
if r.Error != nil {
|
if r.Error != nil {
|
||||||
r.Handlers.UnmarshalError.Run(r)
|
r.Handlers.UnmarshalError.Run(r)
|
||||||
debugLogReqError(r, "Validate Response",
|
debugLogReqError(r, "Validate Response", r.WillRetry(), r.Error)
|
||||||
fmtAttemptCount(r.RetryCount, r.MaxRetries()),
|
|
||||||
r.Error)
|
|
||||||
return r.Error
|
return r.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
r.Handlers.Unmarshal.Run(r)
|
r.Handlers.Unmarshal.Run(r)
|
||||||
if r.Error != nil {
|
if r.Error != nil {
|
||||||
debugLogReqError(r, "Unmarshal Response",
|
debugLogReqError(r, "Unmarshal Response", r.WillRetry(), r.Error)
|
||||||
fmtAttemptCount(r.RetryCount, r.MaxRetries()),
|
|
||||||
r.Error)
|
|
||||||
return r.Error
|
return r.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -600,13 +565,13 @@ type temporary interface {
|
||||||
Temporary() bool
|
Temporary() bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func shouldRetryError(origErr error) bool {
|
func shouldRetryCancel(err error) bool {
|
||||||
switch err := origErr.(type) {
|
switch err := err.(type) {
|
||||||
case awserr.Error:
|
case awserr.Error:
|
||||||
if err.Code() == CanceledErrorCode {
|
if err.Code() == CanceledErrorCode {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return shouldRetryError(err.OrigErr())
|
return shouldRetryCancel(err.OrigErr())
|
||||||
case *url.Error:
|
case *url.Error:
|
||||||
if strings.Contains(err.Error(), "connection refused") {
|
if strings.Contains(err.Error(), "connection refused") {
|
||||||
// Refused connections should be retried as the service may not yet
|
// Refused connections should be retried as the service may not yet
|
||||||
|
|
@ -616,14 +581,11 @@ func shouldRetryError(origErr error) bool {
|
||||||
}
|
}
|
||||||
// *url.Error only implements Temporary after golang 1.6 but since
|
// *url.Error only implements Temporary after golang 1.6 but since
|
||||||
// url.Error only wraps the error:
|
// url.Error only wraps the error:
|
||||||
return shouldRetryError(err.Err)
|
return shouldRetryCancel(err.Err)
|
||||||
case temporary:
|
case temporary:
|
||||||
if netErr, ok := err.(*net.OpError); ok && netErr.Op == "dial" {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
// If the error is temporary, we want to allow continuation of the
|
// If the error is temporary, we want to allow continuation of the
|
||||||
// retry process
|
// retry process
|
||||||
return err.Temporary() || isErrConnectionReset(origErr)
|
return err.Temporary()
|
||||||
case nil:
|
case nil:
|
||||||
// `awserr.Error.OrigErr()` can be nil, meaning there was an error but
|
// `awserr.Error.OrigErr()` can be nil, meaning there was an error but
|
||||||
// because we don't know the cause, it is marked as retryable. See
|
// because we don't know the cause, it is marked as retryable. See
|
||||||
|
|
|
||||||
5
vendor/github.com/aws/aws-sdk-go/aws/request/request_1_8.go
generated
vendored
5
vendor/github.com/aws/aws-sdk-go/aws/request/request_1_8.go
generated
vendored
|
|
@ -4,8 +4,6 @@ package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// NoBody is a http.NoBody reader instructing Go HTTP client to not include
|
// NoBody is a http.NoBody reader instructing Go HTTP client to not include
|
||||||
|
|
@ -26,8 +24,7 @@ var NoBody = http.NoBody
|
||||||
func (r *Request) ResetBody() {
|
func (r *Request) ResetBody() {
|
||||||
body, err := r.getNextRequestBody()
|
body, err := r.getNextRequestBody()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
r.Error = awserr.New(ErrCodeSerialization,
|
r.Error = err
|
||||||
"failed to reset request body", err)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
2
vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go
generated
vendored
|
|
@ -146,7 +146,7 @@ func (r *Request) nextPageTokens() []interface{} {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
case bool:
|
case bool:
|
||||||
if !v {
|
if v == false {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
259
vendor/github.com/aws/aws-sdk-go/aws/session/credentials.go
generated
vendored
259
vendor/github.com/aws/aws-sdk-go/aws/session/credentials.go
generated
vendored
|
|
@ -1,259 +0,0 @@
|
||||||
package session
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/credentials"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/credentials/processcreds"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/credentials/stscreds"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/defaults"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/request"
|
|
||||||
"github.com/aws/aws-sdk-go/internal/shareddefaults"
|
|
||||||
)
|
|
||||||
|
|
||||||
func resolveCredentials(cfg *aws.Config,
|
|
||||||
envCfg envConfig, sharedCfg sharedConfig,
|
|
||||||
handlers request.Handlers,
|
|
||||||
sessOpts Options,
|
|
||||||
) (*credentials.Credentials, error) {
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case len(sessOpts.Profile) != 0:
|
|
||||||
// User explicitly provided an Profile in the session's configuration
|
|
||||||
// so load that profile from shared config first.
|
|
||||||
// Github(aws/aws-sdk-go#2727)
|
|
||||||
return resolveCredsFromProfile(cfg, envCfg, sharedCfg, handlers, sessOpts)
|
|
||||||
|
|
||||||
case envCfg.Creds.HasKeys():
|
|
||||||
// Environment credentials
|
|
||||||
return credentials.NewStaticCredentialsFromCreds(envCfg.Creds), nil
|
|
||||||
|
|
||||||
case len(envCfg.WebIdentityTokenFilePath) != 0:
|
|
||||||
// Web identity token from environment, RoleARN required to also be
|
|
||||||
// set.
|
|
||||||
return assumeWebIdentity(cfg, handlers,
|
|
||||||
envCfg.WebIdentityTokenFilePath,
|
|
||||||
envCfg.RoleARN,
|
|
||||||
envCfg.RoleSessionName,
|
|
||||||
)
|
|
||||||
|
|
||||||
default:
|
|
||||||
// Fallback to the "default" credential resolution chain.
|
|
||||||
return resolveCredsFromProfile(cfg, envCfg, sharedCfg, handlers, sessOpts)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WebIdentityEmptyRoleARNErr will occur if 'AWS_WEB_IDENTITY_TOKEN_FILE' was set but
|
|
||||||
// 'AWS_IAM_ROLE_ARN' was not set.
|
|
||||||
var WebIdentityEmptyRoleARNErr = awserr.New(stscreds.ErrCodeWebIdentity, "role ARN is not set", nil)
|
|
||||||
|
|
||||||
// WebIdentityEmptyTokenFilePathErr will occur if 'AWS_IAM_ROLE_ARN' was set but
|
|
||||||
// 'AWS_WEB_IDENTITY_TOKEN_FILE' was not set.
|
|
||||||
var WebIdentityEmptyTokenFilePathErr = awserr.New(stscreds.ErrCodeWebIdentity, "token file path is not set", nil)
|
|
||||||
|
|
||||||
func assumeWebIdentity(cfg *aws.Config, handlers request.Handlers,
|
|
||||||
filepath string,
|
|
||||||
roleARN, sessionName string,
|
|
||||||
) (*credentials.Credentials, error) {
|
|
||||||
|
|
||||||
if len(filepath) == 0 {
|
|
||||||
return nil, WebIdentityEmptyTokenFilePathErr
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(roleARN) == 0 {
|
|
||||||
return nil, WebIdentityEmptyRoleARNErr
|
|
||||||
}
|
|
||||||
|
|
||||||
creds := stscreds.NewWebIdentityCredentials(
|
|
||||||
&Session{
|
|
||||||
Config: cfg,
|
|
||||||
Handlers: handlers.Copy(),
|
|
||||||
},
|
|
||||||
roleARN,
|
|
||||||
sessionName,
|
|
||||||
filepath,
|
|
||||||
)
|
|
||||||
|
|
||||||
return creds, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resolveCredsFromProfile(cfg *aws.Config,
|
|
||||||
envCfg envConfig, sharedCfg sharedConfig,
|
|
||||||
handlers request.Handlers,
|
|
||||||
sessOpts Options,
|
|
||||||
) (creds *credentials.Credentials, err error) {
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case sharedCfg.SourceProfile != nil:
|
|
||||||
// Assume IAM role with credentials source from a different profile.
|
|
||||||
creds, err = resolveCredsFromProfile(cfg, envCfg,
|
|
||||||
*sharedCfg.SourceProfile, handlers, sessOpts,
|
|
||||||
)
|
|
||||||
|
|
||||||
case sharedCfg.Creds.HasKeys():
|
|
||||||
// Static Credentials from Shared Config/Credentials file.
|
|
||||||
creds = credentials.NewStaticCredentialsFromCreds(
|
|
||||||
sharedCfg.Creds,
|
|
||||||
)
|
|
||||||
|
|
||||||
case len(sharedCfg.CredentialProcess) != 0:
|
|
||||||
// Get credentials from CredentialProcess
|
|
||||||
creds = processcreds.NewCredentials(sharedCfg.CredentialProcess)
|
|
||||||
|
|
||||||
case len(sharedCfg.CredentialSource) != 0:
|
|
||||||
creds, err = resolveCredsFromSource(cfg, envCfg,
|
|
||||||
sharedCfg, handlers, sessOpts,
|
|
||||||
)
|
|
||||||
|
|
||||||
case len(sharedCfg.WebIdentityTokenFile) != 0:
|
|
||||||
// Credentials from Assume Web Identity token require an IAM Role, and
|
|
||||||
// that roll will be assumed. May be wrapped with another assume role
|
|
||||||
// via SourceProfile.
|
|
||||||
return assumeWebIdentity(cfg, handlers,
|
|
||||||
sharedCfg.WebIdentityTokenFile,
|
|
||||||
sharedCfg.RoleARN,
|
|
||||||
sharedCfg.RoleSessionName,
|
|
||||||
)
|
|
||||||
|
|
||||||
default:
|
|
||||||
// Fallback to default credentials provider, include mock errors for
|
|
||||||
// the credential chain so user can identify why credentials failed to
|
|
||||||
// be retrieved.
|
|
||||||
creds = credentials.NewCredentials(&credentials.ChainProvider{
|
|
||||||
VerboseErrors: aws.BoolValue(cfg.CredentialsChainVerboseErrors),
|
|
||||||
Providers: []credentials.Provider{
|
|
||||||
&credProviderError{
|
|
||||||
Err: awserr.New("EnvAccessKeyNotFound",
|
|
||||||
"failed to find credentials in the environment.", nil),
|
|
||||||
},
|
|
||||||
&credProviderError{
|
|
||||||
Err: awserr.New("SharedCredsLoad",
|
|
||||||
fmt.Sprintf("failed to load profile, %s.", envCfg.Profile), nil),
|
|
||||||
},
|
|
||||||
defaults.RemoteCredProvider(*cfg, handlers),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(sharedCfg.RoleARN) > 0 {
|
|
||||||
cfgCp := *cfg
|
|
||||||
cfgCp.Credentials = creds
|
|
||||||
return credsFromAssumeRole(cfgCp, handlers, sharedCfg, sessOpts)
|
|
||||||
}
|
|
||||||
|
|
||||||
return creds, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// valid credential source values
|
|
||||||
const (
|
|
||||||
credSourceEc2Metadata = "Ec2InstanceMetadata"
|
|
||||||
credSourceEnvironment = "Environment"
|
|
||||||
credSourceECSContainer = "EcsContainer"
|
|
||||||
)
|
|
||||||
|
|
||||||
func resolveCredsFromSource(cfg *aws.Config,
|
|
||||||
envCfg envConfig, sharedCfg sharedConfig,
|
|
||||||
handlers request.Handlers,
|
|
||||||
sessOpts Options,
|
|
||||||
) (creds *credentials.Credentials, err error) {
|
|
||||||
|
|
||||||
switch sharedCfg.CredentialSource {
|
|
||||||
case credSourceEc2Metadata:
|
|
||||||
p := defaults.RemoteCredProvider(*cfg, handlers)
|
|
||||||
creds = credentials.NewCredentials(p)
|
|
||||||
|
|
||||||
case credSourceEnvironment:
|
|
||||||
creds = credentials.NewStaticCredentialsFromCreds(envCfg.Creds)
|
|
||||||
|
|
||||||
case credSourceECSContainer:
|
|
||||||
if len(os.Getenv(shareddefaults.ECSCredsProviderEnvVar)) == 0 {
|
|
||||||
return nil, ErrSharedConfigECSContainerEnvVarEmpty
|
|
||||||
}
|
|
||||||
|
|
||||||
p := defaults.RemoteCredProvider(*cfg, handlers)
|
|
||||||
creds = credentials.NewCredentials(p)
|
|
||||||
|
|
||||||
default:
|
|
||||||
return nil, ErrSharedConfigInvalidCredSource
|
|
||||||
}
|
|
||||||
|
|
||||||
return creds, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func credsFromAssumeRole(cfg aws.Config,
|
|
||||||
handlers request.Handlers,
|
|
||||||
sharedCfg sharedConfig,
|
|
||||||
sessOpts Options,
|
|
||||||
) (*credentials.Credentials, error) {
|
|
||||||
|
|
||||||
if len(sharedCfg.MFASerial) != 0 && sessOpts.AssumeRoleTokenProvider == nil {
|
|
||||||
// AssumeRole Token provider is required if doing Assume Role
|
|
||||||
// with MFA.
|
|
||||||
return nil, AssumeRoleTokenProviderNotSetError{}
|
|
||||||
}
|
|
||||||
|
|
||||||
return stscreds.NewCredentials(
|
|
||||||
&Session{
|
|
||||||
Config: &cfg,
|
|
||||||
Handlers: handlers.Copy(),
|
|
||||||
},
|
|
||||||
sharedCfg.RoleARN,
|
|
||||||
func(opt *stscreds.AssumeRoleProvider) {
|
|
||||||
opt.RoleSessionName = sharedCfg.RoleSessionName
|
|
||||||
opt.Duration = sessOpts.AssumeRoleDuration
|
|
||||||
|
|
||||||
// Assume role with external ID
|
|
||||||
if len(sharedCfg.ExternalID) > 0 {
|
|
||||||
opt.ExternalID = aws.String(sharedCfg.ExternalID)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assume role with MFA
|
|
||||||
if len(sharedCfg.MFASerial) > 0 {
|
|
||||||
opt.SerialNumber = aws.String(sharedCfg.MFASerial)
|
|
||||||
opt.TokenProvider = sessOpts.AssumeRoleTokenProvider
|
|
||||||
}
|
|
||||||
},
|
|
||||||
), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// AssumeRoleTokenProviderNotSetError is an error returned when creating a
|
|
||||||
// session when the MFAToken option is not set when shared config is configured
|
|
||||||
// load assume a role with an MFA token.
|
|
||||||
type AssumeRoleTokenProviderNotSetError struct{}
|
|
||||||
|
|
||||||
// Code is the short id of the error.
|
|
||||||
func (e AssumeRoleTokenProviderNotSetError) Code() string {
|
|
||||||
return "AssumeRoleTokenProviderNotSetError"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Message is the description of the error
|
|
||||||
func (e AssumeRoleTokenProviderNotSetError) Message() string {
|
|
||||||
return fmt.Sprintf("assume role with MFA enabled, but AssumeRoleTokenProvider session option not set.")
|
|
||||||
}
|
|
||||||
|
|
||||||
// OrigErr is the underlying error that caused the failure.
|
|
||||||
func (e AssumeRoleTokenProviderNotSetError) OrigErr() error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error satisfies the error interface.
|
|
||||||
func (e AssumeRoleTokenProviderNotSetError) Error() string {
|
|
||||||
return awserr.SprintError(e.Code(), e.Message(), "", nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
type credProviderError struct {
|
|
||||||
Err error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c credProviderError) Retrieve() (credentials.Value, error) {
|
|
||||||
return credentials.Value{}, c.Err
|
|
||||||
}
|
|
||||||
func (c credProviderError) IsExpired() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
212
vendor/github.com/aws/aws-sdk-go/aws/session/doc.go
generated
vendored
212
vendor/github.com/aws/aws-sdk-go/aws/session/doc.go
generated
vendored
|
|
@ -1,93 +1,97 @@
|
||||||
/*
|
/*
|
||||||
Package session provides configuration for the SDK's service clients. Sessions
|
Package session provides configuration for the SDK's service clients.
|
||||||
can be shared across service clients that share the same base configuration.
|
|
||||||
|
Sessions can be shared across all service clients that share the same base
|
||||||
|
configuration. The Session is built from the SDK's default configuration and
|
||||||
|
request handlers.
|
||||||
|
|
||||||
|
Sessions should be cached when possible, because creating a new Session will
|
||||||
|
load all configuration values from the environment, and config files each time
|
||||||
|
the Session is created. Sharing the Session value across all of your service
|
||||||
|
clients will ensure the configuration is loaded the fewest number of times possible.
|
||||||
|
|
||||||
|
Concurrency
|
||||||
|
|
||||||
Sessions are safe to use concurrently as long as the Session is not being
|
Sessions are safe to use concurrently as long as the Session is not being
|
||||||
modified. Sessions should be cached when possible, because creating a new
|
modified. The SDK will not modify the Session once the Session has been created.
|
||||||
Session will load all configuration values from the environment, and config
|
Creating service clients concurrently from a shared Session is safe.
|
||||||
files each time the Session is created. Sharing the Session value across all of
|
|
||||||
your service clients will ensure the configuration is loaded the fewest number
|
|
||||||
of times possible.
|
|
||||||
|
|
||||||
Sessions options from Shared Config
|
Sessions from Shared Config
|
||||||
|
|
||||||
|
Sessions can be created using the method above that will only load the
|
||||||
|
additional config if the AWS_SDK_LOAD_CONFIG environment variable is set.
|
||||||
|
Alternatively you can explicitly create a Session with shared config enabled.
|
||||||
|
To do this you can use NewSessionWithOptions to configure how the Session will
|
||||||
|
be created. Using the NewSessionWithOptions with SharedConfigState set to
|
||||||
|
SharedConfigEnable will create the session as if the AWS_SDK_LOAD_CONFIG
|
||||||
|
environment variable was set.
|
||||||
|
|
||||||
|
Creating Sessions
|
||||||
|
|
||||||
|
When creating Sessions optional aws.Config values can be passed in that will
|
||||||
|
override the default, or loaded config values the Session is being created
|
||||||
|
with. This allows you to provide additional, or case based, configuration
|
||||||
|
as needed.
|
||||||
|
|
||||||
By default NewSession will only load credentials from the shared credentials
|
By default NewSession will only load credentials from the shared credentials
|
||||||
file (~/.aws/credentials). If the AWS_SDK_LOAD_CONFIG environment variable is
|
file (~/.aws/credentials). If the AWS_SDK_LOAD_CONFIG environment variable is
|
||||||
set to a truthy value the Session will be created from the configuration
|
set to a truthy value the Session will be created from the configuration
|
||||||
values from the shared config (~/.aws/config) and shared credentials
|
values from the shared config (~/.aws/config) and shared credentials
|
||||||
(~/.aws/credentials) files. Using the NewSessionWithOptions with
|
(~/.aws/credentials) files. See the section Sessions from Shared Config for
|
||||||
SharedConfigState set to SharedConfigEnable will create the session as if the
|
more information.
|
||||||
AWS_SDK_LOAD_CONFIG environment variable was set.
|
|
||||||
|
|
||||||
Credential and config loading order
|
Create a Session with the default config and request handlers. With credentials
|
||||||
|
region, and profile loaded from the environment and shared config automatically.
|
||||||
The Session will attempt to load configuration and credentials from the
|
Requires the AWS_PROFILE to be set, or "default" is used.
|
||||||
environment, configuration files, and other credential sources. The order
|
|
||||||
configuration is loaded in is:
|
|
||||||
|
|
||||||
* Environment Variables
|
|
||||||
* Shared Credentials file
|
|
||||||
* Shared Configuration file (if SharedConfig is enabled)
|
|
||||||
* EC2 Instance Metadata (credentials only)
|
|
||||||
|
|
||||||
The Environment variables for credentials will have precedence over shared
|
|
||||||
config even if SharedConfig is enabled. To override this behavior, and use
|
|
||||||
shared config credentials instead specify the session.Options.Profile, (e.g.
|
|
||||||
when using credential_source=Environment to assume a role).
|
|
||||||
|
|
||||||
sess, err := session.NewSessionWithOptions(session.Options{
|
|
||||||
Profile: "myProfile",
|
|
||||||
})
|
|
||||||
|
|
||||||
Creating Sessions
|
|
||||||
|
|
||||||
Creating a Session without additional options will load credentials region, and
|
|
||||||
profile loaded from the environment and shared config automatically. See,
|
|
||||||
"Environment Variables" section for information on environment variables used
|
|
||||||
by Session.
|
|
||||||
|
|
||||||
// Create Session
|
// Create Session
|
||||||
sess, err := session.NewSession()
|
sess := session.Must(session.NewSession())
|
||||||
|
|
||||||
|
|
||||||
When creating Sessions optional aws.Config values can be passed in that will
|
|
||||||
override the default, or loaded, config values the Session is being created
|
|
||||||
with. This allows you to provide additional, or case based, configuration
|
|
||||||
as needed.
|
|
||||||
|
|
||||||
// Create a Session with a custom region
|
// Create a Session with a custom region
|
||||||
sess, err := session.NewSession(&aws.Config{
|
sess := session.Must(session.NewSession(&aws.Config{
|
||||||
Region: aws.String("us-west-2"),
|
Region: aws.String("us-east-1"),
|
||||||
})
|
}))
|
||||||
|
|
||||||
Use NewSessionWithOptions to provide additional configuration driving how the
|
// Create a S3 client instance from a session
|
||||||
Session's configuration will be loaded. Such as, specifying shared config
|
sess := session.Must(session.NewSession())
|
||||||
profile, or override the shared config state, (AWS_SDK_LOAD_CONFIG).
|
|
||||||
|
svc := s3.New(sess)
|
||||||
|
|
||||||
|
Create Session With Option Overrides
|
||||||
|
|
||||||
|
In addition to NewSession, Sessions can be created using NewSessionWithOptions.
|
||||||
|
This func allows you to control and override how the Session will be created
|
||||||
|
through code instead of being driven by environment variables only.
|
||||||
|
|
||||||
|
Use NewSessionWithOptions when you want to provide the config profile, or
|
||||||
|
override the shared config state (AWS_SDK_LOAD_CONFIG).
|
||||||
|
|
||||||
// Equivalent to session.NewSession()
|
// Equivalent to session.NewSession()
|
||||||
sess, err := session.NewSessionWithOptions(session.Options{
|
sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
// Options
|
// Options
|
||||||
})
|
}))
|
||||||
|
|
||||||
sess, err := session.NewSessionWithOptions(session.Options{
|
// Specify profile to load for the session's config
|
||||||
// Specify profile to load for the session's config
|
sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
Profile: "profile_name",
|
Profile: "profile_name",
|
||||||
|
}))
|
||||||
|
|
||||||
// Provide SDK Config options, such as Region.
|
// Specify profile for config and region for requests
|
||||||
Config: aws.Config{
|
sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
Region: aws.String("us-west-2"),
|
Config: aws.Config{Region: aws.String("us-east-1")},
|
||||||
},
|
Profile: "profile_name",
|
||||||
|
}))
|
||||||
|
|
||||||
// Force enable Shared Config support
|
// Force enable Shared Config support
|
||||||
|
sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
SharedConfigState: session.SharedConfigEnable,
|
SharedConfigState: session.SharedConfigEnable,
|
||||||
})
|
}))
|
||||||
|
|
||||||
Adding Handlers
|
Adding Handlers
|
||||||
|
|
||||||
You can add handlers to a session to decorate API operation, (e.g. adding HTTP
|
You can add handlers to a session for processing HTTP requests. All service
|
||||||
headers). All clients that use the Session receive a copy of the Session's
|
clients that use the session inherit the handlers. For example, the following
|
||||||
handlers. For example, the following request handler added to the Session logs
|
handler logs every request and its payload made by a service client:
|
||||||
every requests made.
|
|
||||||
|
|
||||||
// Create a session, and add additional handlers for all service
|
// Create a session, and add additional handlers for all service
|
||||||
// clients created with the Session to inherit. Adds logging handler.
|
// clients created with the Session to inherit. Adds logging handler.
|
||||||
|
|
@ -95,15 +99,22 @@ every requests made.
|
||||||
|
|
||||||
sess.Handlers.Send.PushFront(func(r *request.Request) {
|
sess.Handlers.Send.PushFront(func(r *request.Request) {
|
||||||
// Log every request made and its payload
|
// Log every request made and its payload
|
||||||
logger.Printf("Request: %s/%s, Params: %s",
|
logger.Printf("Request: %s/%s, Payload: %s",
|
||||||
r.ClientInfo.ServiceName, r.Operation, r.Params)
|
r.ClientInfo.ServiceName, r.Operation, r.Params)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Deprecated "New" function
|
||||||
|
|
||||||
|
The New session function has been deprecated because it does not provide good
|
||||||
|
way to return errors that occur when loading the configuration files and values.
|
||||||
|
Because of this, NewSession was created so errors can be retrieved when
|
||||||
|
creating a session fails.
|
||||||
|
|
||||||
Shared Config Fields
|
Shared Config Fields
|
||||||
|
|
||||||
By default the SDK will only load the shared credentials file's
|
By default the SDK will only load the shared credentials file's (~/.aws/credentials)
|
||||||
(~/.aws/credentials) credentials values, and all other config is provided by
|
credentials values, and all other config is provided by the environment variables,
|
||||||
the environment variables, SDK defaults, and user provided aws.Config values.
|
SDK defaults, and user provided aws.Config values.
|
||||||
|
|
||||||
If the AWS_SDK_LOAD_CONFIG environment variable is set, or SharedConfigEnable
|
If the AWS_SDK_LOAD_CONFIG environment variable is set, or SharedConfigEnable
|
||||||
option is used to create the Session the full shared config values will be
|
option is used to create the Session the full shared config values will be
|
||||||
|
|
@ -114,31 +125,24 @@ files have the same format.
|
||||||
|
|
||||||
If both config files are present the configuration from both files will be
|
If both config files are present the configuration from both files will be
|
||||||
read. The Session will be created from configuration values from the shared
|
read. The Session will be created from configuration values from the shared
|
||||||
credentials file (~/.aws/credentials) over those in the shared config file
|
credentials file (~/.aws/credentials) over those in the shared config file (~/.aws/config).
|
||||||
(~/.aws/config).
|
|
||||||
|
|
||||||
Credentials are the values the SDK uses to authenticating requests with AWS
|
Credentials are the values the SDK should use for authenticating requests with
|
||||||
Services. When specified in a file, both aws_access_key_id and
|
AWS Services. They are from a configuration file will need to include both
|
||||||
aws_secret_access_key must be provided together in the same file to be
|
aws_access_key_id and aws_secret_access_key must be provided together in the
|
||||||
considered valid. They will be ignored if both are not present.
|
same file to be considered valid. The values will be ignored if not a complete
|
||||||
aws_session_token is an optional field that can be provided in addition to the
|
group. aws_session_token is an optional field that can be provided if both of
|
||||||
other two fields.
|
the other two fields are also provided.
|
||||||
|
|
||||||
aws_access_key_id = AKID
|
aws_access_key_id = AKID
|
||||||
aws_secret_access_key = SECRET
|
aws_secret_access_key = SECRET
|
||||||
aws_session_token = TOKEN
|
aws_session_token = TOKEN
|
||||||
|
|
||||||
; region only supported if SharedConfigEnabled.
|
Assume Role values allow you to configure the SDK to assume an IAM role using
|
||||||
region = us-east-1
|
a set of credentials provided in a config file via the source_profile field.
|
||||||
|
Both "role_arn" and "source_profile" are required. The SDK supports assuming
|
||||||
Assume Role configuration
|
a role with MFA token if the session option AssumeRoleTokenProvider
|
||||||
|
is set.
|
||||||
The role_arn field allows you to configure the SDK to assume an IAM role using
|
|
||||||
a set of credentials from another source. Such as when paired with static
|
|
||||||
credentials, "profile_source", "credential_process", or "credential_source"
|
|
||||||
fields. If "role_arn" is provided, a source of credentials must also be
|
|
||||||
specified, such as "source_profile", "credential_source", or
|
|
||||||
"credential_process".
|
|
||||||
|
|
||||||
role_arn = arn:aws:iam::<account_number>:role/<role_name>
|
role_arn = arn:aws:iam::<account_number>:role/<role_name>
|
||||||
source_profile = profile_with_creds
|
source_profile = profile_with_creds
|
||||||
|
|
@ -146,16 +150,40 @@ specified, such as "source_profile", "credential_source", or
|
||||||
mfa_serial = <serial or mfa arn>
|
mfa_serial = <serial or mfa arn>
|
||||||
role_session_name = session_name
|
role_session_name = session_name
|
||||||
|
|
||||||
|
Region is the region the SDK should use for looking up AWS service endpoints
|
||||||
|
and signing requests.
|
||||||
|
|
||||||
The SDK supports assuming a role with MFA token. If "mfa_serial" is set, you
|
region = us-east-1
|
||||||
must also set the Session Option.AssumeRoleTokenProvider. The Session will fail
|
|
||||||
to load if the AssumeRoleTokenProvider is not specified.
|
Assume Role with MFA token
|
||||||
|
|
||||||
|
To create a session with support for assuming an IAM role with MFA set the
|
||||||
|
session option AssumeRoleTokenProvider to a function that will prompt for the
|
||||||
|
MFA token code when the SDK assumes the role and refreshes the role's credentials.
|
||||||
|
This allows you to configure the SDK via the shared config to assumea role
|
||||||
|
with MFA tokens.
|
||||||
|
|
||||||
|
In order for the SDK to assume a role with MFA the SharedConfigState
|
||||||
|
session option must be set to SharedConfigEnable, or AWS_SDK_LOAD_CONFIG
|
||||||
|
environment variable set.
|
||||||
|
|
||||||
|
The shared configuration instructs the SDK to assume an IAM role with MFA
|
||||||
|
when the mfa_serial configuration field is set in the shared config
|
||||||
|
(~/.aws/config) or shared credentials (~/.aws/credentials) file.
|
||||||
|
|
||||||
|
If mfa_serial is set in the configuration, the SDK will assume the role, and
|
||||||
|
the AssumeRoleTokenProvider session option is not set an an error will
|
||||||
|
be returned when creating the session.
|
||||||
|
|
||||||
sess := session.Must(session.NewSessionWithOptions(session.Options{
|
sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
AssumeRoleTokenProvider: stscreds.StdinTokenProvider,
|
AssumeRoleTokenProvider: stscreds.StdinTokenProvider,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
To setup Assume Role outside of a session see the stscreds.AssumeRoleProvider
|
// Create service client value configured for credentials
|
||||||
|
// from assumed role.
|
||||||
|
svc := s3.New(sess)
|
||||||
|
|
||||||
|
To setup assume role outside of a session see the stscreds.AssumeRoleProvider
|
||||||
documentation.
|
documentation.
|
||||||
|
|
||||||
Environment Variables
|
Environment Variables
|
||||||
|
|
|
||||||
59
vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go
generated
vendored
59
vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go
generated
vendored
|
|
@ -102,38 +102,18 @@ type envConfig struct {
|
||||||
CSMEnabled bool
|
CSMEnabled bool
|
||||||
CSMPort string
|
CSMPort string
|
||||||
CSMClientID string
|
CSMClientID string
|
||||||
CSMHost string
|
|
||||||
|
|
||||||
|
enableEndpointDiscovery string
|
||||||
// Enables endpoint discovery via environment variables.
|
// Enables endpoint discovery via environment variables.
|
||||||
//
|
//
|
||||||
// AWS_ENABLE_ENDPOINT_DISCOVERY=true
|
// AWS_ENABLE_ENDPOINT_DISCOVERY=true
|
||||||
EnableEndpointDiscovery *bool
|
EnableEndpointDiscovery *bool
|
||||||
enableEndpointDiscovery string
|
|
||||||
|
|
||||||
// Specifies the WebIdentity token the SDK should use to assume a role
|
|
||||||
// with.
|
|
||||||
//
|
|
||||||
// AWS_WEB_IDENTITY_TOKEN_FILE=file_path
|
|
||||||
WebIdentityTokenFilePath string
|
|
||||||
|
|
||||||
// Specifies the IAM role arn to use when assuming an role.
|
|
||||||
//
|
|
||||||
// AWS_ROLE_ARN=role_arn
|
|
||||||
RoleARN string
|
|
||||||
|
|
||||||
// Specifies the IAM role session name to use when assuming a role.
|
|
||||||
//
|
|
||||||
// AWS_ROLE_SESSION_NAME=session_name
|
|
||||||
RoleSessionName string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
csmEnabledEnvKey = []string{
|
csmEnabledEnvKey = []string{
|
||||||
"AWS_CSM_ENABLED",
|
"AWS_CSM_ENABLED",
|
||||||
}
|
}
|
||||||
csmHostEnvKey = []string{
|
|
||||||
"AWS_CSM_HOST",
|
|
||||||
}
|
|
||||||
csmPortEnvKey = []string{
|
csmPortEnvKey = []string{
|
||||||
"AWS_CSM_PORT",
|
"AWS_CSM_PORT",
|
||||||
}
|
}
|
||||||
|
|
@ -170,15 +150,6 @@ var (
|
||||||
sharedConfigFileEnvKey = []string{
|
sharedConfigFileEnvKey = []string{
|
||||||
"AWS_CONFIG_FILE",
|
"AWS_CONFIG_FILE",
|
||||||
}
|
}
|
||||||
webIdentityTokenFilePathEnvKey = []string{
|
|
||||||
"AWS_WEB_IDENTITY_TOKEN_FILE",
|
|
||||||
}
|
|
||||||
roleARNEnvKey = []string{
|
|
||||||
"AWS_ROLE_ARN",
|
|
||||||
}
|
|
||||||
roleSessionNameEnvKey = []string{
|
|
||||||
"AWS_ROLE_SESSION_NAME",
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// loadEnvConfig retrieves the SDK's environment configuration.
|
// loadEnvConfig retrieves the SDK's environment configuration.
|
||||||
|
|
@ -207,31 +178,23 @@ func envConfigLoad(enableSharedConfig bool) envConfig {
|
||||||
|
|
||||||
cfg.EnableSharedConfig = enableSharedConfig
|
cfg.EnableSharedConfig = enableSharedConfig
|
||||||
|
|
||||||
// Static environment credentials
|
setFromEnvVal(&cfg.Creds.AccessKeyID, credAccessEnvKey)
|
||||||
var creds credentials.Value
|
setFromEnvVal(&cfg.Creds.SecretAccessKey, credSecretEnvKey)
|
||||||
setFromEnvVal(&creds.AccessKeyID, credAccessEnvKey)
|
setFromEnvVal(&cfg.Creds.SessionToken, credSessionEnvKey)
|
||||||
setFromEnvVal(&creds.SecretAccessKey, credSecretEnvKey)
|
|
||||||
setFromEnvVal(&creds.SessionToken, credSessionEnvKey)
|
|
||||||
if creds.HasKeys() {
|
|
||||||
// Require logical grouping of credentials
|
|
||||||
creds.ProviderName = EnvProviderName
|
|
||||||
cfg.Creds = creds
|
|
||||||
}
|
|
||||||
|
|
||||||
// Role Metadata
|
|
||||||
setFromEnvVal(&cfg.RoleARN, roleARNEnvKey)
|
|
||||||
setFromEnvVal(&cfg.RoleSessionName, roleSessionNameEnvKey)
|
|
||||||
|
|
||||||
// Web identity environment variables
|
|
||||||
setFromEnvVal(&cfg.WebIdentityTokenFilePath, webIdentityTokenFilePathEnvKey)
|
|
||||||
|
|
||||||
// CSM environment variables
|
// CSM environment variables
|
||||||
setFromEnvVal(&cfg.csmEnabled, csmEnabledEnvKey)
|
setFromEnvVal(&cfg.csmEnabled, csmEnabledEnvKey)
|
||||||
setFromEnvVal(&cfg.CSMHost, csmHostEnvKey)
|
|
||||||
setFromEnvVal(&cfg.CSMPort, csmPortEnvKey)
|
setFromEnvVal(&cfg.CSMPort, csmPortEnvKey)
|
||||||
setFromEnvVal(&cfg.CSMClientID, csmClientIDEnvKey)
|
setFromEnvVal(&cfg.CSMClientID, csmClientIDEnvKey)
|
||||||
cfg.CSMEnabled = len(cfg.csmEnabled) > 0
|
cfg.CSMEnabled = len(cfg.csmEnabled) > 0
|
||||||
|
|
||||||
|
// Require logical grouping of credentials
|
||||||
|
if len(cfg.Creds.AccessKeyID) == 0 || len(cfg.Creds.SecretAccessKey) == 0 {
|
||||||
|
cfg.Creds = credentials.Value{}
|
||||||
|
} else {
|
||||||
|
cfg.Creds.ProviderName = EnvProviderName
|
||||||
|
}
|
||||||
|
|
||||||
regionKeys := regionEnvKeys
|
regionKeys := regionEnvKeys
|
||||||
profileKeys := profileEnvKeys
|
profileKeys := profileEnvKeys
|
||||||
if !cfg.EnableSharedConfig {
|
if !cfg.EnableSharedConfig {
|
||||||
|
|
|
||||||
228
vendor/github.com/aws/aws-sdk-go/aws/session/session.go
generated
vendored
228
vendor/github.com/aws/aws-sdk-go/aws/session/session.go
generated
vendored
|
|
@ -8,17 +8,19 @@ import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
"github.com/aws/aws-sdk-go/aws/client"
|
"github.com/aws/aws-sdk-go/aws/client"
|
||||||
"github.com/aws/aws-sdk-go/aws/corehandlers"
|
"github.com/aws/aws-sdk-go/aws/corehandlers"
|
||||||
"github.com/aws/aws-sdk-go/aws/credentials"
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials/processcreds"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials/stscreds"
|
||||||
"github.com/aws/aws-sdk-go/aws/csm"
|
"github.com/aws/aws-sdk-go/aws/csm"
|
||||||
"github.com/aws/aws-sdk-go/aws/defaults"
|
"github.com/aws/aws-sdk-go/aws/defaults"
|
||||||
"github.com/aws/aws-sdk-go/aws/endpoints"
|
"github.com/aws/aws-sdk-go/aws/endpoints"
|
||||||
"github.com/aws/aws-sdk-go/aws/request"
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/internal/shareddefaults"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
@ -105,15 +107,7 @@ func New(cfgs ...*aws.Config) *Session {
|
||||||
|
|
||||||
s := deprecatedNewSession(cfgs...)
|
s := deprecatedNewSession(cfgs...)
|
||||||
if envCfg.CSMEnabled {
|
if envCfg.CSMEnabled {
|
||||||
err := enableCSM(&s.Handlers, envCfg.CSMClientID,
|
enableCSM(&s.Handlers, envCfg.CSMClientID, envCfg.CSMPort, s.Config.Logger)
|
||||||
envCfg.CSMHost, envCfg.CSMPort, s.Config.Logger)
|
|
||||||
if err != nil {
|
|
||||||
err = fmt.Errorf("failed to enable CSM, %v", err)
|
|
||||||
s.Config.Logger.Log("ERROR:", err.Error())
|
|
||||||
s.Handlers.Validate.PushBack(func(r *request.Request) {
|
|
||||||
r.Error = err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return s
|
return s
|
||||||
|
|
@ -216,12 +210,6 @@ type Options struct {
|
||||||
// the config enables assume role wit MFA via the mfa_serial field.
|
// the config enables assume role wit MFA via the mfa_serial field.
|
||||||
AssumeRoleTokenProvider func() (string, error)
|
AssumeRoleTokenProvider func() (string, error)
|
||||||
|
|
||||||
// When the SDK's shared config is configured to assume a role this option
|
|
||||||
// may be provided to set the expiry duration of the STS credentials.
|
|
||||||
// Defaults to 15 minutes if not set as documented in the
|
|
||||||
// stscreds.AssumeRoleProvider.
|
|
||||||
AssumeRoleDuration time.Duration
|
|
||||||
|
|
||||||
// Reader for a custom Credentials Authority (CA) bundle in PEM format that
|
// Reader for a custom Credentials Authority (CA) bundle in PEM format that
|
||||||
// the SDK will use instead of the default system's root CA bundle. Use this
|
// the SDK will use instead of the default system's root CA bundle. Use this
|
||||||
// only if you want to replace the CA bundle the SDK uses for TLS requests.
|
// only if you want to replace the CA bundle the SDK uses for TLS requests.
|
||||||
|
|
@ -236,12 +224,6 @@ type Options struct {
|
||||||
// to also enable this feature. CustomCABundle session option field has priority
|
// to also enable this feature. CustomCABundle session option field has priority
|
||||||
// over the AWS_CA_BUNDLE environment variable, and will be used if both are set.
|
// over the AWS_CA_BUNDLE environment variable, and will be used if both are set.
|
||||||
CustomCABundle io.Reader
|
CustomCABundle io.Reader
|
||||||
|
|
||||||
// The handlers that the session and all API clients will be created with.
|
|
||||||
// This must be a complete set of handlers. Use the defaults.Handlers()
|
|
||||||
// function to initialize this value before changing the handlers to be
|
|
||||||
// used by the SDK.
|
|
||||||
Handlers request.Handlers
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSessionWithOptions returns a new Session created from SDK defaults, config files,
|
// NewSessionWithOptions returns a new Session created from SDK defaults, config files,
|
||||||
|
|
@ -281,7 +263,7 @@ func NewSessionWithOptions(opts Options) (*Session, error) {
|
||||||
envCfg = loadEnvConfig()
|
envCfg = loadEnvConfig()
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(opts.Profile) != 0 {
|
if len(opts.Profile) > 0 {
|
||||||
envCfg.Profile = opts.Profile
|
envCfg.Profile = opts.Profile
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -347,36 +329,27 @@ func deprecatedNewSession(cfgs ...*aws.Config) *Session {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func enableCSM(handlers *request.Handlers,
|
func enableCSM(handlers *request.Handlers, clientID string, port string, logger aws.Logger) {
|
||||||
clientID, host, port string,
|
logger.Log("Enabling CSM")
|
||||||
logger aws.Logger,
|
if len(port) == 0 {
|
||||||
) error {
|
port = csm.DefaultPort
|
||||||
if logger != nil {
|
|
||||||
logger.Log("Enabling CSM")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
r, err := csm.Start(clientID, csm.AddressWithDefaults(host, port))
|
r, err := csm.Start(clientID, "127.0.0.1:"+port)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return
|
||||||
}
|
}
|
||||||
r.InjectHandlers(handlers)
|
r.InjectHandlers(handlers)
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSession(opts Options, envCfg envConfig, cfgs ...*aws.Config) (*Session, error) {
|
func newSession(opts Options, envCfg envConfig, cfgs ...*aws.Config) (*Session, error) {
|
||||||
cfg := defaults.Config()
|
cfg := defaults.Config()
|
||||||
|
handlers := defaults.Handlers()
|
||||||
handlers := opts.Handlers
|
|
||||||
if handlers.IsEmpty() {
|
|
||||||
handlers = defaults.Handlers()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get a merged version of the user provided config to determine if
|
// Get a merged version of the user provided config to determine if
|
||||||
// credentials were.
|
// credentials were.
|
||||||
userCfg := &aws.Config{}
|
userCfg := &aws.Config{}
|
||||||
userCfg.MergeIn(cfgs...)
|
userCfg.MergeIn(cfgs...)
|
||||||
cfg.MergeIn(userCfg)
|
|
||||||
|
|
||||||
// Ordered config files will be loaded in with later files overwriting
|
// Ordered config files will be loaded in with later files overwriting
|
||||||
// previous config file values.
|
// previous config file values.
|
||||||
|
|
@ -393,11 +366,9 @@ func newSession(opts Options, envCfg envConfig, cfgs ...*aws.Config) (*Session,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load additional config from file(s)
|
// Load additional config from file(s)
|
||||||
sharedCfg, err := loadSharedConfig(envCfg.Profile, cfgFiles, envCfg.EnableSharedConfig)
|
sharedCfg, err := loadSharedConfig(envCfg.Profile, cfgFiles)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if _, ok := err.(SharedConfigProfileNotExistsError); !ok {
|
return nil, err
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := mergeConfigSrcs(cfg, userCfg, envCfg, sharedCfg, handlers, opts); err != nil {
|
if err := mergeConfigSrcs(cfg, userCfg, envCfg, sharedCfg, handlers, opts); err != nil {
|
||||||
|
|
@ -411,11 +382,7 @@ func newSession(opts Options, envCfg envConfig, cfgs ...*aws.Config) (*Session,
|
||||||
|
|
||||||
initHandlers(s)
|
initHandlers(s)
|
||||||
if envCfg.CSMEnabled {
|
if envCfg.CSMEnabled {
|
||||||
err := enableCSM(&s.Handlers, envCfg.CSMClientID,
|
enableCSM(&s.Handlers, envCfg.CSMClientID, envCfg.CSMPort, s.Config.Logger)
|
||||||
envCfg.CSMHost, envCfg.CSMPort, s.Config.Logger)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup HTTP client with custom cert bundle if enabled
|
// Setup HTTP client with custom cert bundle if enabled
|
||||||
|
|
@ -476,11 +443,9 @@ func loadCertPool(r io.Reader) (*x509.CertPool, error) {
|
||||||
return p, nil
|
return p, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeConfigSrcs(cfg, userCfg *aws.Config,
|
func mergeConfigSrcs(cfg, userCfg *aws.Config, envCfg envConfig, sharedCfg sharedConfig, handlers request.Handlers, sessOpts Options) error {
|
||||||
envCfg envConfig, sharedCfg sharedConfig,
|
// Merge in user provided configuration
|
||||||
handlers request.Handlers,
|
cfg.MergeIn(userCfg)
|
||||||
sessOpts Options,
|
|
||||||
) error {
|
|
||||||
|
|
||||||
// Region if not already set by user
|
// Region if not already set by user
|
||||||
if len(aws.StringValue(cfg.Region)) == 0 {
|
if len(aws.StringValue(cfg.Region)) == 0 {
|
||||||
|
|
@ -499,19 +464,164 @@ func mergeConfigSrcs(cfg, userCfg *aws.Config,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure credentials if not already set by the user when creating the
|
// Configure credentials if not already set
|
||||||
// Session.
|
|
||||||
if cfg.Credentials == credentials.AnonymousCredentials && userCfg.Credentials == nil {
|
if cfg.Credentials == credentials.AnonymousCredentials && userCfg.Credentials == nil {
|
||||||
creds, err := resolveCredentials(cfg, envCfg, sharedCfg, handlers, sessOpts)
|
|
||||||
if err != nil {
|
// inspect the profile to see if a credential source has been specified.
|
||||||
return err
|
if envCfg.EnableSharedConfig && len(sharedCfg.AssumeRole.CredentialSource) > 0 {
|
||||||
|
|
||||||
|
// if both credential_source and source_profile have been set, return an error
|
||||||
|
// as this is undefined behavior.
|
||||||
|
if len(sharedCfg.AssumeRole.SourceProfile) > 0 {
|
||||||
|
return ErrSharedConfigSourceCollision
|
||||||
|
}
|
||||||
|
|
||||||
|
// valid credential source values
|
||||||
|
const (
|
||||||
|
credSourceEc2Metadata = "Ec2InstanceMetadata"
|
||||||
|
credSourceEnvironment = "Environment"
|
||||||
|
credSourceECSContainer = "EcsContainer"
|
||||||
|
)
|
||||||
|
|
||||||
|
switch sharedCfg.AssumeRole.CredentialSource {
|
||||||
|
case credSourceEc2Metadata:
|
||||||
|
cfgCp := *cfg
|
||||||
|
p := defaults.RemoteCredProvider(cfgCp, handlers)
|
||||||
|
cfgCp.Credentials = credentials.NewCredentials(p)
|
||||||
|
|
||||||
|
if len(sharedCfg.AssumeRole.MFASerial) > 0 && sessOpts.AssumeRoleTokenProvider == nil {
|
||||||
|
// AssumeRole Token provider is required if doing Assume Role
|
||||||
|
// with MFA.
|
||||||
|
return AssumeRoleTokenProviderNotSetError{}
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg.Credentials = assumeRoleCredentials(cfgCp, handlers, sharedCfg, sessOpts)
|
||||||
|
case credSourceEnvironment:
|
||||||
|
cfg.Credentials = credentials.NewStaticCredentialsFromCreds(
|
||||||
|
envCfg.Creds,
|
||||||
|
)
|
||||||
|
case credSourceECSContainer:
|
||||||
|
if len(os.Getenv(shareddefaults.ECSCredsProviderEnvVar)) == 0 {
|
||||||
|
return ErrSharedConfigECSContainerEnvVarEmpty
|
||||||
|
}
|
||||||
|
|
||||||
|
cfgCp := *cfg
|
||||||
|
p := defaults.RemoteCredProvider(cfgCp, handlers)
|
||||||
|
creds := credentials.NewCredentials(p)
|
||||||
|
|
||||||
|
cfg.Credentials = creds
|
||||||
|
default:
|
||||||
|
return ErrSharedConfigInvalidCredSource
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(envCfg.Creds.AccessKeyID) > 0 {
|
||||||
|
cfg.Credentials = credentials.NewStaticCredentialsFromCreds(
|
||||||
|
envCfg.Creds,
|
||||||
|
)
|
||||||
|
} else if envCfg.EnableSharedConfig && len(sharedCfg.AssumeRole.RoleARN) > 0 && sharedCfg.AssumeRoleSource != nil {
|
||||||
|
cfgCp := *cfg
|
||||||
|
cfgCp.Credentials = credentials.NewStaticCredentialsFromCreds(
|
||||||
|
sharedCfg.AssumeRoleSource.Creds,
|
||||||
|
)
|
||||||
|
|
||||||
|
if len(sharedCfg.AssumeRole.MFASerial) > 0 && sessOpts.AssumeRoleTokenProvider == nil {
|
||||||
|
// AssumeRole Token provider is required if doing Assume Role
|
||||||
|
// with MFA.
|
||||||
|
return AssumeRoleTokenProviderNotSetError{}
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg.Credentials = assumeRoleCredentials(cfgCp, handlers, sharedCfg, sessOpts)
|
||||||
|
} else if len(sharedCfg.Creds.AccessKeyID) > 0 {
|
||||||
|
cfg.Credentials = credentials.NewStaticCredentialsFromCreds(
|
||||||
|
sharedCfg.Creds,
|
||||||
|
)
|
||||||
|
} else if len(sharedCfg.CredentialProcess) > 0 {
|
||||||
|
cfg.Credentials = processcreds.NewCredentials(
|
||||||
|
sharedCfg.CredentialProcess,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
// Fallback to default credentials provider, include mock errors
|
||||||
|
// for the credential chain so user can identify why credentials
|
||||||
|
// failed to be retrieved.
|
||||||
|
cfg.Credentials = credentials.NewCredentials(&credentials.ChainProvider{
|
||||||
|
VerboseErrors: aws.BoolValue(cfg.CredentialsChainVerboseErrors),
|
||||||
|
Providers: []credentials.Provider{
|
||||||
|
&credProviderError{Err: awserr.New("EnvAccessKeyNotFound", "failed to find credentials in the environment.", nil)},
|
||||||
|
&credProviderError{Err: awserr.New("SharedCredsLoad", fmt.Sprintf("failed to load profile, %s.", envCfg.Profile), nil)},
|
||||||
|
defaults.RemoteCredProvider(*cfg, handlers),
|
||||||
|
},
|
||||||
|
})
|
||||||
}
|
}
|
||||||
cfg.Credentials = creds
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func assumeRoleCredentials(cfg aws.Config, handlers request.Handlers, sharedCfg sharedConfig, sessOpts Options) *credentials.Credentials {
|
||||||
|
return stscreds.NewCredentials(
|
||||||
|
&Session{
|
||||||
|
Config: &cfg,
|
||||||
|
Handlers: handlers.Copy(),
|
||||||
|
},
|
||||||
|
sharedCfg.AssumeRole.RoleARN,
|
||||||
|
func(opt *stscreds.AssumeRoleProvider) {
|
||||||
|
opt.RoleSessionName = sharedCfg.AssumeRole.RoleSessionName
|
||||||
|
|
||||||
|
// Assume role with external ID
|
||||||
|
if len(sharedCfg.AssumeRole.ExternalID) > 0 {
|
||||||
|
opt.ExternalID = aws.String(sharedCfg.AssumeRole.ExternalID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assume role with MFA
|
||||||
|
if len(sharedCfg.AssumeRole.MFASerial) > 0 {
|
||||||
|
opt.SerialNumber = aws.String(sharedCfg.AssumeRole.MFASerial)
|
||||||
|
opt.TokenProvider = sessOpts.AssumeRoleTokenProvider
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AssumeRoleTokenProviderNotSetError is an error returned when creating a session when the
|
||||||
|
// MFAToken option is not set when shared config is configured load assume a
|
||||||
|
// role with an MFA token.
|
||||||
|
type AssumeRoleTokenProviderNotSetError struct{}
|
||||||
|
|
||||||
|
// Code is the short id of the error.
|
||||||
|
func (e AssumeRoleTokenProviderNotSetError) Code() string {
|
||||||
|
return "AssumeRoleTokenProviderNotSetError"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Message is the description of the error
|
||||||
|
func (e AssumeRoleTokenProviderNotSetError) Message() string {
|
||||||
|
return fmt.Sprintf("assume role with MFA enabled, but AssumeRoleTokenProvider session option not set.")
|
||||||
|
}
|
||||||
|
|
||||||
|
// OrigErr is the underlying error that caused the failure.
|
||||||
|
func (e AssumeRoleTokenProviderNotSetError) OrigErr() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error satisfies the error interface.
|
||||||
|
func (e AssumeRoleTokenProviderNotSetError) Error() string {
|
||||||
|
return awserr.SprintError(e.Code(), e.Message(), "", nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
type credProviderError struct {
|
||||||
|
Err error
|
||||||
|
}
|
||||||
|
|
||||||
|
var emptyCreds = credentials.Value{}
|
||||||
|
|
||||||
|
func (c credProviderError) Retrieve() (credentials.Value, error) {
|
||||||
|
return credentials.Value{}, c.Err
|
||||||
|
}
|
||||||
|
func (c credProviderError) IsExpired() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func initHandlers(s *Session) {
|
func initHandlers(s *Session) {
|
||||||
// Add the Validate parameter handler if it is not disabled.
|
// Add the Validate parameter handler if it is not disabled.
|
||||||
s.Handlers.Validate.Remove(corehandlers.ValidateParametersHandler)
|
s.Handlers.Validate.Remove(corehandlers.ValidateParametersHandler)
|
||||||
|
|
|
||||||
357
vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go
generated
vendored
357
vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go
generated
vendored
|
|
@ -5,6 +5,7 @@ import (
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
"github.com/aws/aws-sdk-go/aws/credentials"
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/internal/ini"
|
"github.com/aws/aws-sdk-go/internal/ini"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -27,12 +28,8 @@ const (
|
||||||
|
|
||||||
// endpoint discovery group
|
// endpoint discovery group
|
||||||
enableEndpointDiscoveryKey = `endpoint_discovery_enabled` // optional
|
enableEndpointDiscoveryKey = `endpoint_discovery_enabled` // optional
|
||||||
|
|
||||||
// External Credential Process
|
// External Credential Process
|
||||||
credentialProcessKey = `credential_process` // optional
|
credentialProcessKey = `credential_process`
|
||||||
|
|
||||||
// Web Identity Token File
|
|
||||||
webIdentityTokenFileKey = `web_identity_token_file` // optional
|
|
||||||
|
|
||||||
// DefaultSharedConfigProfile is the default profile to be used when
|
// DefaultSharedConfigProfile is the default profile to be used when
|
||||||
// loading configuration from the config files if another profile name
|
// loading configuration from the config files if another profile name
|
||||||
|
|
@ -40,33 +37,36 @@ const (
|
||||||
DefaultSharedConfigProfile = `default`
|
DefaultSharedConfigProfile = `default`
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type assumeRoleConfig struct {
|
||||||
|
RoleARN string
|
||||||
|
SourceProfile string
|
||||||
|
CredentialSource string
|
||||||
|
ExternalID string
|
||||||
|
MFASerial string
|
||||||
|
RoleSessionName string
|
||||||
|
}
|
||||||
|
|
||||||
// sharedConfig represents the configuration fields of the SDK config files.
|
// sharedConfig represents the configuration fields of the SDK config files.
|
||||||
type sharedConfig struct {
|
type sharedConfig struct {
|
||||||
// Credentials values from the config file. Both aws_access_key_id and
|
// Credentials values from the config file. Both aws_access_key_id
|
||||||
// aws_secret_access_key must be provided together in the same file to be
|
// and aws_secret_access_key must be provided together in the same file
|
||||||
// considered valid. The values will be ignored if not a complete group.
|
// to be considered valid. The values will be ignored if not a complete group.
|
||||||
// aws_session_token is an optional field that can be provided if both of
|
// aws_session_token is an optional field that can be provided if both of the
|
||||||
// the other two fields are also provided.
|
// other two fields are also provided.
|
||||||
//
|
//
|
||||||
// aws_access_key_id
|
// aws_access_key_id
|
||||||
// aws_secret_access_key
|
// aws_secret_access_key
|
||||||
// aws_session_token
|
// aws_session_token
|
||||||
Creds credentials.Value
|
Creds credentials.Value
|
||||||
|
|
||||||
CredentialSource string
|
AssumeRole assumeRoleConfig
|
||||||
CredentialProcess string
|
AssumeRoleSource *sharedConfig
|
||||||
WebIdentityTokenFile string
|
|
||||||
|
|
||||||
RoleARN string
|
// An external process to request credentials
|
||||||
RoleSessionName string
|
CredentialProcess string
|
||||||
ExternalID string
|
|
||||||
MFASerial string
|
|
||||||
|
|
||||||
SourceProfileName string
|
// Region is the region the SDK should use for looking up AWS service endpoints
|
||||||
SourceProfile *sharedConfig
|
// and signing requests.
|
||||||
|
|
||||||
// Region is the region the SDK should use for looking up AWS service
|
|
||||||
// endpoints and signing requests.
|
|
||||||
//
|
//
|
||||||
// region
|
// region
|
||||||
Region string
|
Region string
|
||||||
|
|
@ -83,18 +83,17 @@ type sharedConfigFile struct {
|
||||||
IniData ini.Sections
|
IniData ini.Sections
|
||||||
}
|
}
|
||||||
|
|
||||||
// loadSharedConfig retrieves the configuration from the list of files using
|
// loadSharedConfig retrieves the configuration from the list of files
|
||||||
// the profile provided. The order the files are listed will determine
|
// using the profile provided. The order the files are listed will determine
|
||||||
// precedence. Values in subsequent files will overwrite values defined in
|
// precedence. Values in subsequent files will overwrite values defined in
|
||||||
// earlier files.
|
// earlier files.
|
||||||
//
|
//
|
||||||
// For example, given two files A and B. Both define credentials. If the order
|
// For example, given two files A and B. Both define credentials. If the order
|
||||||
// of the files are A then B, B's credential values will be used instead of
|
// of the files are A then B, B's credential values will be used instead of A's.
|
||||||
// A's.
|
|
||||||
//
|
//
|
||||||
// See sharedConfig.setFromFile for information how the config files
|
// See sharedConfig.setFromFile for information how the config files
|
||||||
// will be loaded.
|
// will be loaded.
|
||||||
func loadSharedConfig(profile string, filenames []string, exOpts bool) (sharedConfig, error) {
|
func loadSharedConfig(profile string, filenames []string) (sharedConfig, error) {
|
||||||
if len(profile) == 0 {
|
if len(profile) == 0 {
|
||||||
profile = DefaultSharedConfigProfile
|
profile = DefaultSharedConfigProfile
|
||||||
}
|
}
|
||||||
|
|
@ -105,11 +104,16 @@ func loadSharedConfig(profile string, filenames []string, exOpts bool) (sharedCo
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg := sharedConfig{}
|
cfg := sharedConfig{}
|
||||||
profiles := map[string]struct{}{}
|
if err = cfg.setFromIniFiles(profile, files); err != nil {
|
||||||
if err = cfg.setFromIniFiles(profiles, profile, files, exOpts); err != nil {
|
|
||||||
return sharedConfig{}, err
|
return sharedConfig{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(cfg.AssumeRole.SourceProfile) > 0 {
|
||||||
|
if err := cfg.setAssumeRoleSource(profile, files); err != nil {
|
||||||
|
return sharedConfig{}, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return cfg, nil
|
return cfg, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -133,88 +137,60 @@ func loadSharedConfigIniFiles(filenames []string) ([]sharedConfigFile, error) {
|
||||||
return files, nil
|
return files, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cfg *sharedConfig) setFromIniFiles(profiles map[string]struct{}, profile string, files []sharedConfigFile, exOpts bool) error {
|
func (cfg *sharedConfig) setAssumeRoleSource(origProfile string, files []sharedConfigFile) error {
|
||||||
|
var assumeRoleSrc sharedConfig
|
||||||
|
|
||||||
|
if len(cfg.AssumeRole.CredentialSource) > 0 {
|
||||||
|
// setAssumeRoleSource is only called when source_profile is found.
|
||||||
|
// If both source_profile and credential_source are set, then
|
||||||
|
// ErrSharedConfigSourceCollision will be returned
|
||||||
|
return ErrSharedConfigSourceCollision
|
||||||
|
}
|
||||||
|
|
||||||
|
// Multiple level assume role chains are not support
|
||||||
|
if cfg.AssumeRole.SourceProfile == origProfile {
|
||||||
|
assumeRoleSrc = *cfg
|
||||||
|
assumeRoleSrc.AssumeRole = assumeRoleConfig{}
|
||||||
|
} else {
|
||||||
|
err := assumeRoleSrc.setFromIniFiles(cfg.AssumeRole.SourceProfile, files)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(assumeRoleSrc.Creds.AccessKeyID) == 0 {
|
||||||
|
return SharedConfigAssumeRoleError{RoleARN: cfg.AssumeRole.RoleARN}
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg.AssumeRoleSource = &assumeRoleSrc
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cfg *sharedConfig) setFromIniFiles(profile string, files []sharedConfigFile) error {
|
||||||
// Trim files from the list that don't exist.
|
// Trim files from the list that don't exist.
|
||||||
var skippedFiles int
|
|
||||||
var profileNotFoundErr error
|
|
||||||
for _, f := range files {
|
for _, f := range files {
|
||||||
if err := cfg.setFromIniFile(profile, f, exOpts); err != nil {
|
if err := cfg.setFromIniFile(profile, f); err != nil {
|
||||||
if _, ok := err.(SharedConfigProfileNotExistsError); ok {
|
if _, ok := err.(SharedConfigProfileNotExistsError); ok {
|
||||||
// Ignore profiles not defined in individual files.
|
// Ignore proviles missings
|
||||||
profileNotFoundErr = err
|
|
||||||
skippedFiles++
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if skippedFiles == len(files) {
|
|
||||||
// If all files were skipped because the profile is not found, return
|
|
||||||
// the original profile not found error.
|
|
||||||
return profileNotFoundErr
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, ok := profiles[profile]; ok {
|
|
||||||
// if this is the second instance of the profile the Assume Role
|
|
||||||
// options must be cleared because they are only valid for the
|
|
||||||
// first reference of a profile. The self linked instance of the
|
|
||||||
// profile only have credential provider options.
|
|
||||||
cfg.clearAssumeRoleOptions()
|
|
||||||
} else {
|
|
||||||
// First time a profile has been seen, It must either be a assume role
|
|
||||||
// or credentials. Assert if the credential type requires a role ARN,
|
|
||||||
// the ARN is also set.
|
|
||||||
if err := cfg.validateCredentialsRequireARN(profile); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
profiles[profile] = struct{}{}
|
|
||||||
|
|
||||||
if err := cfg.validateCredentialType(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Link source profiles for assume roles
|
|
||||||
if len(cfg.SourceProfileName) != 0 {
|
|
||||||
// Linked profile via source_profile ignore credential provider
|
|
||||||
// options, the source profile must provide the credentials.
|
|
||||||
cfg.clearCredentialOptions()
|
|
||||||
|
|
||||||
srcCfg := &sharedConfig{}
|
|
||||||
err := srcCfg.setFromIniFiles(profiles, cfg.SourceProfileName, files, exOpts)
|
|
||||||
if err != nil {
|
|
||||||
// SourceProfile that doesn't exist is an error in configuration.
|
|
||||||
if _, ok := err.(SharedConfigProfileNotExistsError); ok {
|
|
||||||
err = SharedConfigAssumeRoleError{
|
|
||||||
RoleARN: cfg.RoleARN,
|
|
||||||
SourceProfile: cfg.SourceProfileName,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if !srcCfg.hasCredentials() {
|
|
||||||
return SharedConfigAssumeRoleError{
|
|
||||||
RoleARN: cfg.RoleARN,
|
|
||||||
SourceProfile: cfg.SourceProfileName,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg.SourceProfile = srcCfg
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// setFromFile loads the configuration from the file using the profile
|
// setFromFile loads the configuration from the file using
|
||||||
// provided. A sharedConfig pointer type value is used so that multiple config
|
// the profile provided. A sharedConfig pointer type value is used so that
|
||||||
// file loadings can be chained.
|
// multiple config file loadings can be chained.
|
||||||
//
|
//
|
||||||
// Only loads complete logically grouped values, and will not set fields in cfg
|
// Only loads complete logically grouped values, and will not set fields in cfg
|
||||||
// for incomplete grouped values in the config. Such as credentials. For
|
// for incomplete grouped values in the config. Such as credentials. For example
|
||||||
// example if a config file only includes aws_access_key_id but no
|
// if a config file only includes aws_access_key_id but no aws_secret_access_key
|
||||||
// aws_secret_access_key the aws_access_key_id will be ignored.
|
// the aws_access_key_id will be ignored.
|
||||||
func (cfg *sharedConfig) setFromIniFile(profile string, file sharedConfigFile, exOpts bool) error {
|
func (cfg *sharedConfig) setFromIniFile(profile string, file sharedConfigFile) error {
|
||||||
section, ok := file.IniData.GetSection(profile)
|
section, ok := file.IniData.GetSection(profile)
|
||||||
if !ok {
|
if !ok {
|
||||||
// Fallback to to alternate profile name: profile <name>
|
// Fallback to to alternate profile name: profile <name>
|
||||||
|
|
@ -224,30 +200,42 @@ func (cfg *sharedConfig) setFromIniFile(profile string, file sharedConfigFile, e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if exOpts {
|
|
||||||
// Assume Role Parameters
|
|
||||||
updateString(&cfg.RoleARN, section, roleArnKey)
|
|
||||||
updateString(&cfg.ExternalID, section, externalIDKey)
|
|
||||||
updateString(&cfg.MFASerial, section, mfaSerialKey)
|
|
||||||
updateString(&cfg.RoleSessionName, section, roleSessionNameKey)
|
|
||||||
updateString(&cfg.SourceProfileName, section, sourceProfileKey)
|
|
||||||
updateString(&cfg.CredentialSource, section, credentialSourceKey)
|
|
||||||
|
|
||||||
updateString(&cfg.Region, section, regionKey)
|
|
||||||
}
|
|
||||||
|
|
||||||
updateString(&cfg.CredentialProcess, section, credentialProcessKey)
|
|
||||||
updateString(&cfg.WebIdentityTokenFile, section, webIdentityTokenFileKey)
|
|
||||||
|
|
||||||
// Shared Credentials
|
// Shared Credentials
|
||||||
creds := credentials.Value{
|
akid := section.String(accessKeyIDKey)
|
||||||
AccessKeyID: section.String(accessKeyIDKey),
|
secret := section.String(secretAccessKey)
|
||||||
SecretAccessKey: section.String(secretAccessKey),
|
if len(akid) > 0 && len(secret) > 0 {
|
||||||
SessionToken: section.String(sessionTokenKey),
|
cfg.Creds = credentials.Value{
|
||||||
ProviderName: fmt.Sprintf("SharedConfigCredentials: %s", file.Filename),
|
AccessKeyID: akid,
|
||||||
|
SecretAccessKey: secret,
|
||||||
|
SessionToken: section.String(sessionTokenKey),
|
||||||
|
ProviderName: fmt.Sprintf("SharedConfigCredentials: %s", file.Filename),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if creds.HasKeys() {
|
|
||||||
cfg.Creds = creds
|
// Assume Role
|
||||||
|
roleArn := section.String(roleArnKey)
|
||||||
|
srcProfile := section.String(sourceProfileKey)
|
||||||
|
credentialSource := section.String(credentialSourceKey)
|
||||||
|
hasSource := len(srcProfile) > 0 || len(credentialSource) > 0
|
||||||
|
if len(roleArn) > 0 && hasSource {
|
||||||
|
cfg.AssumeRole = assumeRoleConfig{
|
||||||
|
RoleARN: roleArn,
|
||||||
|
SourceProfile: srcProfile,
|
||||||
|
CredentialSource: credentialSource,
|
||||||
|
ExternalID: section.String(externalIDKey),
|
||||||
|
MFASerial: section.String(mfaSerialKey),
|
||||||
|
RoleSessionName: section.String(roleSessionNameKey),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// `credential_process`
|
||||||
|
if credProc := section.String(credentialProcessKey); len(credProc) > 0 {
|
||||||
|
cfg.CredentialProcess = credProc
|
||||||
|
}
|
||||||
|
|
||||||
|
// Region
|
||||||
|
if v := section.String(regionKey); len(v) > 0 {
|
||||||
|
cfg.Region = v
|
||||||
}
|
}
|
||||||
|
|
||||||
// Endpoint discovery
|
// Endpoint discovery
|
||||||
|
|
@ -259,95 +247,6 @@ func (cfg *sharedConfig) setFromIniFile(profile string, file sharedConfigFile, e
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cfg *sharedConfig) validateCredentialsRequireARN(profile string) error {
|
|
||||||
var credSource string
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case len(cfg.SourceProfileName) != 0:
|
|
||||||
credSource = sourceProfileKey
|
|
||||||
case len(cfg.CredentialSource) != 0:
|
|
||||||
credSource = credentialSourceKey
|
|
||||||
case len(cfg.WebIdentityTokenFile) != 0:
|
|
||||||
credSource = webIdentityTokenFileKey
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(credSource) != 0 && len(cfg.RoleARN) == 0 {
|
|
||||||
return CredentialRequiresARNError{
|
|
||||||
Type: credSource,
|
|
||||||
Profile: profile,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cfg *sharedConfig) validateCredentialType() error {
|
|
||||||
// Only one or no credential type can be defined.
|
|
||||||
if !oneOrNone(
|
|
||||||
len(cfg.SourceProfileName) != 0,
|
|
||||||
len(cfg.CredentialSource) != 0,
|
|
||||||
len(cfg.CredentialProcess) != 0,
|
|
||||||
len(cfg.WebIdentityTokenFile) != 0,
|
|
||||||
) {
|
|
||||||
return ErrSharedConfigSourceCollision
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cfg *sharedConfig) hasCredentials() bool {
|
|
||||||
switch {
|
|
||||||
case len(cfg.SourceProfileName) != 0:
|
|
||||||
case len(cfg.CredentialSource) != 0:
|
|
||||||
case len(cfg.CredentialProcess) != 0:
|
|
||||||
case len(cfg.WebIdentityTokenFile) != 0:
|
|
||||||
case cfg.Creds.HasKeys():
|
|
||||||
default:
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cfg *sharedConfig) clearCredentialOptions() {
|
|
||||||
cfg.CredentialSource = ""
|
|
||||||
cfg.CredentialProcess = ""
|
|
||||||
cfg.WebIdentityTokenFile = ""
|
|
||||||
cfg.Creds = credentials.Value{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cfg *sharedConfig) clearAssumeRoleOptions() {
|
|
||||||
cfg.RoleARN = ""
|
|
||||||
cfg.ExternalID = ""
|
|
||||||
cfg.MFASerial = ""
|
|
||||||
cfg.RoleSessionName = ""
|
|
||||||
cfg.SourceProfileName = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func oneOrNone(bs ...bool) bool {
|
|
||||||
var count int
|
|
||||||
|
|
||||||
for _, b := range bs {
|
|
||||||
if b {
|
|
||||||
count++
|
|
||||||
if count > 1 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// updateString will only update the dst with the value in the section key, key
|
|
||||||
// is present in the section.
|
|
||||||
func updateString(dst *string, section ini.Section, key string) {
|
|
||||||
if !section.Has(key) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
*dst = section.String(key)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SharedConfigLoadError is an error for the shared config file failed to load.
|
// SharedConfigLoadError is an error for the shared config file failed to load.
|
||||||
type SharedConfigLoadError struct {
|
type SharedConfigLoadError struct {
|
||||||
Filename string
|
Filename string
|
||||||
|
|
@ -405,8 +304,7 @@ func (e SharedConfigProfileNotExistsError) Error() string {
|
||||||
// profile contains assume role information, but that information is invalid
|
// profile contains assume role information, but that information is invalid
|
||||||
// or not complete.
|
// or not complete.
|
||||||
type SharedConfigAssumeRoleError struct {
|
type SharedConfigAssumeRoleError struct {
|
||||||
RoleARN string
|
RoleARN string
|
||||||
SourceProfile string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Code is the short id of the error.
|
// Code is the short id of the error.
|
||||||
|
|
@ -416,10 +314,8 @@ func (e SharedConfigAssumeRoleError) Code() string {
|
||||||
|
|
||||||
// Message is the description of the error
|
// Message is the description of the error
|
||||||
func (e SharedConfigAssumeRoleError) Message() string {
|
func (e SharedConfigAssumeRoleError) Message() string {
|
||||||
return fmt.Sprintf(
|
return fmt.Sprintf("failed to load assume role for %s, source profile has no shared credentials",
|
||||||
"failed to load assume role for %s, source profile %s has no shared credentials",
|
e.RoleARN)
|
||||||
e.RoleARN, e.SourceProfile,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// OrigErr is the underlying error that caused the failure.
|
// OrigErr is the underlying error that caused the failure.
|
||||||
|
|
@ -431,36 +327,3 @@ func (e SharedConfigAssumeRoleError) OrigErr() error {
|
||||||
func (e SharedConfigAssumeRoleError) Error() string {
|
func (e SharedConfigAssumeRoleError) Error() string {
|
||||||
return awserr.SprintError(e.Code(), e.Message(), "", nil)
|
return awserr.SprintError(e.Code(), e.Message(), "", nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CredentialRequiresARNError provides the error for shared config credentials
|
|
||||||
// that are incorrectly configured in the shared config or credentials file.
|
|
||||||
type CredentialRequiresARNError struct {
|
|
||||||
// type of credentials that were configured.
|
|
||||||
Type string
|
|
||||||
|
|
||||||
// Profile name the credentials were in.
|
|
||||||
Profile string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Code is the short id of the error.
|
|
||||||
func (e CredentialRequiresARNError) Code() string {
|
|
||||||
return "CredentialRequiresARNError"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Message is the description of the error
|
|
||||||
func (e CredentialRequiresARNError) Message() string {
|
|
||||||
return fmt.Sprintf(
|
|
||||||
"credential type %s requires role_arn, profile %s",
|
|
||||||
e.Type, e.Profile,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// OrigErr is the underlying error that caused the failure.
|
|
||||||
func (e CredentialRequiresARNError) OrigErr() error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error satisfies the error interface.
|
|
||||||
func (e CredentialRequiresARNError) Error() string {
|
|
||||||
return awserr.SprintError(e.Code(), e.Message(), "", nil)
|
|
||||||
}
|
|
||||||
|
|
|
||||||
20
vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go
generated
vendored
20
vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go
generated
vendored
|
|
@ -687,11 +687,7 @@ func (ctx *signingCtx) buildBodyDigest() error {
|
||||||
if !aws.IsReaderSeekable(ctx.Body) {
|
if !aws.IsReaderSeekable(ctx.Body) {
|
||||||
return fmt.Errorf("cannot use unseekable request body %T, for signed request with body", ctx.Body)
|
return fmt.Errorf("cannot use unseekable request body %T, for signed request with body", ctx.Body)
|
||||||
}
|
}
|
||||||
hashBytes, err := makeSha256Reader(ctx.Body)
|
hash = hex.EncodeToString(makeSha256Reader(ctx.Body))
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
hash = hex.EncodeToString(hashBytes)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if includeSHA256Header {
|
if includeSHA256Header {
|
||||||
|
|
@ -738,16 +734,10 @@ func makeSha256(data []byte) []byte {
|
||||||
return hash.Sum(nil)
|
return hash.Sum(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeSha256Reader(reader io.ReadSeeker) (hashBytes []byte, err error) {
|
func makeSha256Reader(reader io.ReadSeeker) []byte {
|
||||||
hash := sha256.New()
|
hash := sha256.New()
|
||||||
start, err := reader.Seek(0, sdkio.SeekCurrent)
|
start, _ := reader.Seek(0, sdkio.SeekCurrent)
|
||||||
if err != nil {
|
defer reader.Seek(start, sdkio.SeekStart)
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
// ensure error is return if unable to seek back to start of payload.
|
|
||||||
_, err = reader.Seek(start, sdkio.SeekStart)
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Use CopyN to avoid allocating the 32KB buffer in io.Copy for bodies
|
// Use CopyN to avoid allocating the 32KB buffer in io.Copy for bodies
|
||||||
// smaller than 32KB. Fall back to io.Copy if we fail to determine the size.
|
// smaller than 32KB. Fall back to io.Copy if we fail to determine the size.
|
||||||
|
|
@ -758,7 +748,7 @@ func makeSha256Reader(reader io.ReadSeeker) (hashBytes []byte, err error) {
|
||||||
io.CopyN(hash, reader, size)
|
io.CopyN(hash, reader, size)
|
||||||
}
|
}
|
||||||
|
|
||||||
return hash.Sum(nil), nil
|
return hash.Sum(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
const doubleSpace = " "
|
const doubleSpace = " "
|
||||||
|
|
|
||||||
20
vendor/github.com/aws/aws-sdk-go/aws/types.go
generated
vendored
20
vendor/github.com/aws/aws-sdk-go/aws/types.go
generated
vendored
|
|
@ -7,18 +7,13 @@ import (
|
||||||
"github.com/aws/aws-sdk-go/internal/sdkio"
|
"github.com/aws/aws-sdk-go/internal/sdkio"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ReadSeekCloser wraps a io.Reader returning a ReaderSeekerCloser. Allows the
|
// ReadSeekCloser wraps a io.Reader returning a ReaderSeekerCloser. Should
|
||||||
// SDK to accept an io.Reader that is not also an io.Seeker for unsigned
|
// only be used with an io.Reader that is also an io.Seeker. Doing so may
|
||||||
// streaming payload API operations.
|
// cause request signature errors, or request body's not sent for GET, HEAD
|
||||||
|
// and DELETE HTTP methods.
|
||||||
//
|
//
|
||||||
// A ReadSeekCloser wrapping an nonseekable io.Reader used in an API
|
// Deprecated: Should only be used with io.ReadSeeker. If using for
|
||||||
// operation's input will prevent that operation being retried in the case of
|
// S3 PutObject to stream content use s3manager.Uploader instead.
|
||||||
// network errors, and cause operation requests to fail if the operation
|
|
||||||
// requires payload signing.
|
|
||||||
//
|
|
||||||
// Note: If using With S3 PutObject to stream an object upload The SDK's S3
|
|
||||||
// Upload manager (s3manager.Uploader) provides support for streaming with the
|
|
||||||
// ability to retry network errors.
|
|
||||||
func ReadSeekCloser(r io.Reader) ReaderSeekerCloser {
|
func ReadSeekCloser(r io.Reader) ReaderSeekerCloser {
|
||||||
return ReaderSeekerCloser{r}
|
return ReaderSeekerCloser{r}
|
||||||
}
|
}
|
||||||
|
|
@ -48,8 +43,7 @@ func IsReaderSeekable(r io.Reader) bool {
|
||||||
// Read reads from the reader up to size of p. The number of bytes read, and
|
// Read reads from the reader up to size of p. The number of bytes read, and
|
||||||
// error if it occurred will be returned.
|
// error if it occurred will be returned.
|
||||||
//
|
//
|
||||||
// If the reader is not an io.Reader zero bytes read, and nil error will be
|
// If the reader is not an io.Reader zero bytes read, and nil error will be returned.
|
||||||
// returned.
|
|
||||||
//
|
//
|
||||||
// Performs the same functionality as io.Reader Read
|
// Performs the same functionality as io.Reader Read
|
||||||
func (r ReaderSeekerCloser) Read(p []byte) (int, error) {
|
func (r ReaderSeekerCloser) Read(p []byte) (int, error) {
|
||||||
|
|
|
||||||
2
vendor/github.com/aws/aws-sdk-go/aws/version.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go/aws/version.go
generated
vendored
|
|
@ -5,4 +5,4 @@ package aws
|
||||||
const SDKName = "aws-sdk-go"
|
const SDKName = "aws-sdk-go"
|
||||||
|
|
||||||
// SDKVersion is the version of this SDK
|
// SDKVersion is the version of this SDK
|
||||||
const SDKVersion = "1.22.0"
|
const SDKVersion = "1.19.39"
|
||||||
|
|
|
||||||
6
vendor/github.com/aws/aws-sdk-go/internal/ini/ini_parser.go
generated
vendored
6
vendor/github.com/aws/aws-sdk-go/internal/ini/ini_parser.go
generated
vendored
|
|
@ -304,9 +304,7 @@ loop:
|
||||||
stmt := newCommentStatement(tok)
|
stmt := newCommentStatement(tok)
|
||||||
stack.Push(stmt)
|
stack.Push(stmt)
|
||||||
default:
|
default:
|
||||||
return nil, NewParseError(
|
return nil, NewParseError(fmt.Sprintf("invalid state with ASTKind %v and TokenType %v", k, tok))
|
||||||
fmt.Sprintf("invalid state with ASTKind %v and TokenType %v",
|
|
||||||
k, tok.Type()))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(tokens) > 0 {
|
if len(tokens) > 0 {
|
||||||
|
|
@ -316,7 +314,7 @@ loop:
|
||||||
|
|
||||||
// this occurs when a statement has not been completed
|
// this occurs when a statement has not been completed
|
||||||
if stack.top > 1 {
|
if stack.top > 1 {
|
||||||
return nil, NewParseError(fmt.Sprintf("incomplete ini expression"))
|
return nil, NewParseError(fmt.Sprintf("incomplete expression: %v", stack.container))
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns a sublist which excludes the start symbol
|
// returns a sublist which excludes the start symbol
|
||||||
|
|
|
||||||
536
vendor/github.com/aws/aws-sdk-go/service/s3/api.go
generated
vendored
536
vendor/github.com/aws/aws-sdk-go/service/s3/api.go
generated
vendored
File diff suppressed because it is too large
Load diff
184
vendor/github.com/aws/aws-sdk-go/service/sts/api.go
generated
vendored
184
vendor/github.com/aws/aws-sdk-go/service/sts/api.go
generated
vendored
|
|
@ -702,102 +702,6 @@ func (c *STS) DecodeAuthorizationMessageWithContext(ctx aws.Context, input *Deco
|
||||||
return out, req.Send()
|
return out, req.Send()
|
||||||
}
|
}
|
||||||
|
|
||||||
const opGetAccessKeyInfo = "GetAccessKeyInfo"
|
|
||||||
|
|
||||||
// GetAccessKeyInfoRequest generates a "aws/request.Request" representing the
|
|
||||||
// client's request for the GetAccessKeyInfo operation. The "output" return
|
|
||||||
// value will be populated with the request's response once the request completes
|
|
||||||
// successfully.
|
|
||||||
//
|
|
||||||
// Use "Send" method on the returned Request to send the API call to the service.
|
|
||||||
// the "output" return value is not valid until after Send returns without error.
|
|
||||||
//
|
|
||||||
// See GetAccessKeyInfo for more information on using the GetAccessKeyInfo
|
|
||||||
// API call, and error handling.
|
|
||||||
//
|
|
||||||
// This method is useful when you want to inject custom logic or configuration
|
|
||||||
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// // Example sending a request using the GetAccessKeyInfoRequest method.
|
|
||||||
// req, resp := client.GetAccessKeyInfoRequest(params)
|
|
||||||
//
|
|
||||||
// err := req.Send()
|
|
||||||
// if err == nil { // resp is now filled
|
|
||||||
// fmt.Println(resp)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetAccessKeyInfo
|
|
||||||
func (c *STS) GetAccessKeyInfoRequest(input *GetAccessKeyInfoInput) (req *request.Request, output *GetAccessKeyInfoOutput) {
|
|
||||||
op := &request.Operation{
|
|
||||||
Name: opGetAccessKeyInfo,
|
|
||||||
HTTPMethod: "POST",
|
|
||||||
HTTPPath: "/",
|
|
||||||
}
|
|
||||||
|
|
||||||
if input == nil {
|
|
||||||
input = &GetAccessKeyInfoInput{}
|
|
||||||
}
|
|
||||||
|
|
||||||
output = &GetAccessKeyInfoOutput{}
|
|
||||||
req = c.newRequest(op, input, output)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetAccessKeyInfo API operation for AWS Security Token Service.
|
|
||||||
//
|
|
||||||
// Returns the account identifier for the specified access key ID.
|
|
||||||
//
|
|
||||||
// Access keys consist of two parts: an access key ID (for example, AKIAIOSFODNN7EXAMPLE)
|
|
||||||
// and a secret access key (for example, wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY).
|
|
||||||
// For more information about access keys, see Managing Access Keys for IAM
|
|
||||||
// Users (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)
|
|
||||||
// in the IAM User Guide.
|
|
||||||
//
|
|
||||||
// When you pass an access key ID to this operation, it returns the ID of the
|
|
||||||
// AWS account to which the keys belong. Access key IDs beginning with AKIA
|
|
||||||
// are long-term credentials for an IAM user or the AWS account root user. Access
|
|
||||||
// key IDs beginning with ASIA are temporary credentials that are created using
|
|
||||||
// STS operations. If the account in the response belongs to you, you can sign
|
|
||||||
// in as the root user and review your root user access keys. Then, you can
|
|
||||||
// pull a credentials report (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_getting-report.html)
|
|
||||||
// to learn which IAM user owns the keys. To learn who requested the temporary
|
|
||||||
// credentials for an ASIA access key, view the STS events in your CloudTrail
|
|
||||||
// logs (https://docs.aws.amazon.com/IAM/latest/UserGuide/cloudtrail-integration.html).
|
|
||||||
//
|
|
||||||
// This operation does not indicate the state of the access key. The key might
|
|
||||||
// be active, inactive, or deleted. Active keys might not have permissions to
|
|
||||||
// perform an operation. Providing a deleted access key might return an error
|
|
||||||
// that the key doesn't exist.
|
|
||||||
//
|
|
||||||
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
|
|
||||||
// with awserr.Error's Code and Message methods to get detailed information about
|
|
||||||
// the error.
|
|
||||||
//
|
|
||||||
// See the AWS API reference guide for AWS Security Token Service's
|
|
||||||
// API operation GetAccessKeyInfo for usage and error information.
|
|
||||||
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetAccessKeyInfo
|
|
||||||
func (c *STS) GetAccessKeyInfo(input *GetAccessKeyInfoInput) (*GetAccessKeyInfoOutput, error) {
|
|
||||||
req, out := c.GetAccessKeyInfoRequest(input)
|
|
||||||
return out, req.Send()
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetAccessKeyInfoWithContext is the same as GetAccessKeyInfo with the addition of
|
|
||||||
// the ability to pass a context and additional request options.
|
|
||||||
//
|
|
||||||
// See GetAccessKeyInfo for details on how to use this API operation.
|
|
||||||
//
|
|
||||||
// The context must be non-nil and will be used for request cancellation. If
|
|
||||||
// the context is nil a panic will occur. In the future the SDK may create
|
|
||||||
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
|
||||||
// for more information on using Contexts.
|
|
||||||
func (c *STS) GetAccessKeyInfoWithContext(ctx aws.Context, input *GetAccessKeyInfoInput, opts ...request.Option) (*GetAccessKeyInfoOutput, error) {
|
|
||||||
req, out := c.GetAccessKeyInfoRequest(input)
|
|
||||||
req.SetContext(ctx)
|
|
||||||
req.ApplyOptions(opts...)
|
|
||||||
return out, req.Send()
|
|
||||||
}
|
|
||||||
|
|
||||||
const opGetCallerIdentity = "GetCallerIdentity"
|
const opGetCallerIdentity = "GetCallerIdentity"
|
||||||
|
|
||||||
// GetCallerIdentityRequest generates a "aws/request.Request" representing the
|
// GetCallerIdentityRequest generates a "aws/request.Request" representing the
|
||||||
|
|
@ -842,15 +746,8 @@ func (c *STS) GetCallerIdentityRequest(input *GetCallerIdentityInput) (req *requ
|
||||||
|
|
||||||
// GetCallerIdentity API operation for AWS Security Token Service.
|
// GetCallerIdentity API operation for AWS Security Token Service.
|
||||||
//
|
//
|
||||||
// Returns details about the IAM user or role whose credentials are used to
|
// Returns details about the IAM identity whose credentials are used to call
|
||||||
// call the operation.
|
// the API.
|
||||||
//
|
|
||||||
// No permissions are required to perform this operation. If an administrator
|
|
||||||
// adds a policy to your IAM user or role that explicitly denies access to the
|
|
||||||
// sts:GetCallerIdentity action, you can still perform this operation. Permissions
|
|
||||||
// are not required because the same information is returned when an IAM user
|
|
||||||
// or role is denied access. To view an example response, see I Am Not Authorized
|
|
||||||
// to Perform: iam:DeleteVirtualMFADevice (https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_access-denied-delete-mfa).
|
|
||||||
//
|
//
|
||||||
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
|
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
|
||||||
// with awserr.Error's Code and Message methods to get detailed information about
|
// with awserr.Error's Code and Message methods to get detailed information about
|
||||||
|
|
@ -1232,7 +1129,7 @@ type AssumeRoleInput struct {
|
||||||
// This parameter is optional. You can provide up to 10 managed policy ARNs.
|
// This parameter is optional. You can provide up to 10 managed policy ARNs.
|
||||||
// However, the plain text that you use for both inline and managed session
|
// However, the plain text that you use for both inline and managed session
|
||||||
// policies shouldn't exceed 2048 characters. For more information about ARNs,
|
// policies shouldn't exceed 2048 characters. For more information about ARNs,
|
||||||
// see Amazon Resource Names (ARNs) and AWS Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)
|
// see Amazon Resource Names (ARNs) and AWS Service Namespaces (general/latest/gr/aws-arns-and-namespaces.html)
|
||||||
// in the AWS General Reference.
|
// in the AWS General Reference.
|
||||||
//
|
//
|
||||||
// The characters in this parameter count towards the 2048 character session
|
// The characters in this parameter count towards the 2048 character session
|
||||||
|
|
@ -1510,7 +1407,7 @@ type AssumeRoleWithSAMLInput struct {
|
||||||
// This parameter is optional. You can provide up to 10 managed policy ARNs.
|
// This parameter is optional. You can provide up to 10 managed policy ARNs.
|
||||||
// However, the plain text that you use for both inline and managed session
|
// However, the plain text that you use for both inline and managed session
|
||||||
// policies shouldn't exceed 2048 characters. For more information about ARNs,
|
// policies shouldn't exceed 2048 characters. For more information about ARNs,
|
||||||
// see Amazon Resource Names (ARNs) and AWS Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)
|
// see Amazon Resource Names (ARNs) and AWS Service Namespaces (general/latest/gr/aws-arns-and-namespaces.html)
|
||||||
// in the AWS General Reference.
|
// in the AWS General Reference.
|
||||||
//
|
//
|
||||||
// The characters in this parameter count towards the 2048 character session
|
// The characters in this parameter count towards the 2048 character session
|
||||||
|
|
@ -1805,7 +1702,7 @@ type AssumeRoleWithWebIdentityInput struct {
|
||||||
// This parameter is optional. You can provide up to 10 managed policy ARNs.
|
// This parameter is optional. You can provide up to 10 managed policy ARNs.
|
||||||
// However, the plain text that you use for both inline and managed session
|
// However, the plain text that you use for both inline and managed session
|
||||||
// policies shouldn't exceed 2048 characters. For more information about ARNs,
|
// policies shouldn't exceed 2048 characters. For more information about ARNs,
|
||||||
// see Amazon Resource Names (ARNs) and AWS Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)
|
// see Amazon Resource Names (ARNs) and AWS Service Namespaces (general/latest/gr/aws-arns-and-namespaces.html)
|
||||||
// in the AWS General Reference.
|
// in the AWS General Reference.
|
||||||
//
|
//
|
||||||
// The characters in this parameter count towards the 2048 character session
|
// The characters in this parameter count towards the 2048 character session
|
||||||
|
|
@ -2259,73 +2156,6 @@ func (s *FederatedUser) SetFederatedUserId(v string) *FederatedUser {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
type GetAccessKeyInfoInput struct {
|
|
||||||
_ struct{} `type:"structure"`
|
|
||||||
|
|
||||||
// The identifier of an access key.
|
|
||||||
//
|
|
||||||
// This parameter allows (through its regex pattern) a string of characters
|
|
||||||
// that can consist of any upper- or lowercased letter or digit.
|
|
||||||
//
|
|
||||||
// AccessKeyId is a required field
|
|
||||||
AccessKeyId *string `min:"16" type:"string" required:"true"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns the string representation
|
|
||||||
func (s GetAccessKeyInfoInput) String() string {
|
|
||||||
return awsutil.Prettify(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GoString returns the string representation
|
|
||||||
func (s GetAccessKeyInfoInput) GoString() string {
|
|
||||||
return s.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate inspects the fields of the type to determine if they are valid.
|
|
||||||
func (s *GetAccessKeyInfoInput) Validate() error {
|
|
||||||
invalidParams := request.ErrInvalidParams{Context: "GetAccessKeyInfoInput"}
|
|
||||||
if s.AccessKeyId == nil {
|
|
||||||
invalidParams.Add(request.NewErrParamRequired("AccessKeyId"))
|
|
||||||
}
|
|
||||||
if s.AccessKeyId != nil && len(*s.AccessKeyId) < 16 {
|
|
||||||
invalidParams.Add(request.NewErrParamMinLen("AccessKeyId", 16))
|
|
||||||
}
|
|
||||||
|
|
||||||
if invalidParams.Len() > 0 {
|
|
||||||
return invalidParams
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetAccessKeyId sets the AccessKeyId field's value.
|
|
||||||
func (s *GetAccessKeyInfoInput) SetAccessKeyId(v string) *GetAccessKeyInfoInput {
|
|
||||||
s.AccessKeyId = &v
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetAccessKeyInfoOutput struct {
|
|
||||||
_ struct{} `type:"structure"`
|
|
||||||
|
|
||||||
// The number used to identify the AWS account.
|
|
||||||
Account *string `type:"string"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns the string representation
|
|
||||||
func (s GetAccessKeyInfoOutput) String() string {
|
|
||||||
return awsutil.Prettify(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GoString returns the string representation
|
|
||||||
func (s GetAccessKeyInfoOutput) GoString() string {
|
|
||||||
return s.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetAccount sets the Account field's value.
|
|
||||||
func (s *GetAccessKeyInfoOutput) SetAccount(v string) *GetAccessKeyInfoOutput {
|
|
||||||
s.Account = &v
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetCallerIdentityInput struct {
|
type GetCallerIdentityInput struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
}
|
}
|
||||||
|
|
@ -2454,7 +2284,7 @@ type GetFederationTokenInput struct {
|
||||||
// use as managed session policies. The plain text that you use for both inline
|
// use as managed session policies. The plain text that you use for both inline
|
||||||
// and managed session policies shouldn't exceed 2048 characters. You can provide
|
// and managed session policies shouldn't exceed 2048 characters. You can provide
|
||||||
// up to 10 managed policy ARNs. For more information about ARNs, see Amazon
|
// up to 10 managed policy ARNs. For more information about ARNs, see Amazon
|
||||||
// Resource Names (ARNs) and AWS Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)
|
// Resource Names (ARNs) and AWS Service Namespaces (general/latest/gr/aws-arns-and-namespaces.html)
|
||||||
// in the AWS General Reference.
|
// in the AWS General Reference.
|
||||||
//
|
//
|
||||||
// This parameter is optional. However, if you do not pass any session policies,
|
// This parameter is optional. However, if you do not pass any session policies,
|
||||||
|
|
@ -2715,7 +2545,7 @@ type PolicyDescriptorType struct {
|
||||||
|
|
||||||
// The Amazon Resource Name (ARN) of the IAM managed policy to use as a session
|
// The Amazon Resource Name (ARN) of the IAM managed policy to use as a session
|
||||||
// policy for the role. For more information about ARNs, see Amazon Resource
|
// policy for the role. For more information about ARNs, see Amazon Resource
|
||||||
// Names (ARNs) and AWS Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)
|
// Names (ARNs) and AWS Service Namespaces (general/latest/gr/aws-arns-and-namespaces.html)
|
||||||
// in the AWS General Reference.
|
// in the AWS General Reference.
|
||||||
Arn *string `locationName:"arn" min:"20" type:"string"`
|
Arn *string `locationName:"arn" min:"20" type:"string"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
96
vendor/github.com/aws/aws-sdk-go/service/sts/stsiface/interface.go
generated
vendored
96
vendor/github.com/aws/aws-sdk-go/service/sts/stsiface/interface.go
generated
vendored
|
|
@ -1,96 +0,0 @@
|
||||||
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
|
||||||
|
|
||||||
// Package stsiface provides an interface to enable mocking the AWS Security Token Service service client
|
|
||||||
// for testing your code.
|
|
||||||
//
|
|
||||||
// It is important to note that this interface will have breaking changes
|
|
||||||
// when the service model is updated and adds new API operations, paginators,
|
|
||||||
// and waiters.
|
|
||||||
package stsiface
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/request"
|
|
||||||
"github.com/aws/aws-sdk-go/service/sts"
|
|
||||||
)
|
|
||||||
|
|
||||||
// STSAPI provides an interface to enable mocking the
|
|
||||||
// sts.STS service client's API operation,
|
|
||||||
// paginators, and waiters. This make unit testing your code that calls out
|
|
||||||
// to the SDK's service client's calls easier.
|
|
||||||
//
|
|
||||||
// The best way to use this interface is so the SDK's service client's calls
|
|
||||||
// can be stubbed out for unit testing your code with the SDK without needing
|
|
||||||
// to inject custom request handlers into the SDK's request pipeline.
|
|
||||||
//
|
|
||||||
// // myFunc uses an SDK service client to make a request to
|
|
||||||
// // AWS Security Token Service.
|
|
||||||
// func myFunc(svc stsiface.STSAPI) bool {
|
|
||||||
// // Make svc.AssumeRole request
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func main() {
|
|
||||||
// sess := session.New()
|
|
||||||
// svc := sts.New(sess)
|
|
||||||
//
|
|
||||||
// myFunc(svc)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// In your _test.go file:
|
|
||||||
//
|
|
||||||
// // Define a mock struct to be used in your unit tests of myFunc.
|
|
||||||
// type mockSTSClient struct {
|
|
||||||
// stsiface.STSAPI
|
|
||||||
// }
|
|
||||||
// func (m *mockSTSClient) AssumeRole(input *sts.AssumeRoleInput) (*sts.AssumeRoleOutput, error) {
|
|
||||||
// // mock response/functionality
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func TestMyFunc(t *testing.T) {
|
|
||||||
// // Setup Test
|
|
||||||
// mockSvc := &mockSTSClient{}
|
|
||||||
//
|
|
||||||
// myfunc(mockSvc)
|
|
||||||
//
|
|
||||||
// // Verify myFunc's functionality
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// It is important to note that this interface will have breaking changes
|
|
||||||
// when the service model is updated and adds new API operations, paginators,
|
|
||||||
// and waiters. Its suggested to use the pattern above for testing, or using
|
|
||||||
// tooling to generate mocks to satisfy the interfaces.
|
|
||||||
type STSAPI interface {
|
|
||||||
AssumeRole(*sts.AssumeRoleInput) (*sts.AssumeRoleOutput, error)
|
|
||||||
AssumeRoleWithContext(aws.Context, *sts.AssumeRoleInput, ...request.Option) (*sts.AssumeRoleOutput, error)
|
|
||||||
AssumeRoleRequest(*sts.AssumeRoleInput) (*request.Request, *sts.AssumeRoleOutput)
|
|
||||||
|
|
||||||
AssumeRoleWithSAML(*sts.AssumeRoleWithSAMLInput) (*sts.AssumeRoleWithSAMLOutput, error)
|
|
||||||
AssumeRoleWithSAMLWithContext(aws.Context, *sts.AssumeRoleWithSAMLInput, ...request.Option) (*sts.AssumeRoleWithSAMLOutput, error)
|
|
||||||
AssumeRoleWithSAMLRequest(*sts.AssumeRoleWithSAMLInput) (*request.Request, *sts.AssumeRoleWithSAMLOutput)
|
|
||||||
|
|
||||||
AssumeRoleWithWebIdentity(*sts.AssumeRoleWithWebIdentityInput) (*sts.AssumeRoleWithWebIdentityOutput, error)
|
|
||||||
AssumeRoleWithWebIdentityWithContext(aws.Context, *sts.AssumeRoleWithWebIdentityInput, ...request.Option) (*sts.AssumeRoleWithWebIdentityOutput, error)
|
|
||||||
AssumeRoleWithWebIdentityRequest(*sts.AssumeRoleWithWebIdentityInput) (*request.Request, *sts.AssumeRoleWithWebIdentityOutput)
|
|
||||||
|
|
||||||
DecodeAuthorizationMessage(*sts.DecodeAuthorizationMessageInput) (*sts.DecodeAuthorizationMessageOutput, error)
|
|
||||||
DecodeAuthorizationMessageWithContext(aws.Context, *sts.DecodeAuthorizationMessageInput, ...request.Option) (*sts.DecodeAuthorizationMessageOutput, error)
|
|
||||||
DecodeAuthorizationMessageRequest(*sts.DecodeAuthorizationMessageInput) (*request.Request, *sts.DecodeAuthorizationMessageOutput)
|
|
||||||
|
|
||||||
GetAccessKeyInfo(*sts.GetAccessKeyInfoInput) (*sts.GetAccessKeyInfoOutput, error)
|
|
||||||
GetAccessKeyInfoWithContext(aws.Context, *sts.GetAccessKeyInfoInput, ...request.Option) (*sts.GetAccessKeyInfoOutput, error)
|
|
||||||
GetAccessKeyInfoRequest(*sts.GetAccessKeyInfoInput) (*request.Request, *sts.GetAccessKeyInfoOutput)
|
|
||||||
|
|
||||||
GetCallerIdentity(*sts.GetCallerIdentityInput) (*sts.GetCallerIdentityOutput, error)
|
|
||||||
GetCallerIdentityWithContext(aws.Context, *sts.GetCallerIdentityInput, ...request.Option) (*sts.GetCallerIdentityOutput, error)
|
|
||||||
GetCallerIdentityRequest(*sts.GetCallerIdentityInput) (*request.Request, *sts.GetCallerIdentityOutput)
|
|
||||||
|
|
||||||
GetFederationToken(*sts.GetFederationTokenInput) (*sts.GetFederationTokenOutput, error)
|
|
||||||
GetFederationTokenWithContext(aws.Context, *sts.GetFederationTokenInput, ...request.Option) (*sts.GetFederationTokenOutput, error)
|
|
||||||
GetFederationTokenRequest(*sts.GetFederationTokenInput) (*request.Request, *sts.GetFederationTokenOutput)
|
|
||||||
|
|
||||||
GetSessionToken(*sts.GetSessionTokenInput) (*sts.GetSessionTokenOutput, error)
|
|
||||||
GetSessionTokenWithContext(aws.Context, *sts.GetSessionTokenInput, ...request.Option) (*sts.GetSessionTokenOutput, error)
|
|
||||||
GetSessionTokenRequest(*sts.GetSessionTokenInput) (*request.Request, *sts.GetSessionTokenOutput)
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ STSAPI = (*sts.STS)(nil)
|
|
||||||
21
vendor/github.com/blang/semver/.travis.yml
generated
vendored
21
vendor/github.com/blang/semver/.travis.yml
generated
vendored
|
|
@ -1,21 +0,0 @@
|
||||||
language: go
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- go: 1.4.3
|
|
||||||
- go: 1.5.4
|
|
||||||
- go: 1.6.3
|
|
||||||
- go: 1.7
|
|
||||||
- go: tip
|
|
||||||
allow_failures:
|
|
||||||
- go: tip
|
|
||||||
install:
|
|
||||||
- go get golang.org/x/tools/cmd/cover
|
|
||||||
- go get github.com/mattn/goveralls
|
|
||||||
script:
|
|
||||||
- echo "Test and track coverage" ; $HOME/gopath/bin/goveralls -package "." -service=travis-ci
|
|
||||||
-repotoken $COVERALLS_TOKEN
|
|
||||||
- echo "Build examples" ; cd examples && go build
|
|
||||||
- echo "Check if gofmt'd" ; diff -u <(echo -n) <(gofmt -d -s .)
|
|
||||||
env:
|
|
||||||
global:
|
|
||||||
secure: HroGEAUQpVq9zX1b1VIkraLiywhGbzvNnTZq2TMxgK7JHP8xqNplAeF1izrR2i4QLL9nsY+9WtYss4QuPvEtZcVHUobw6XnL6radF7jS1LgfYZ9Y7oF+zogZ2I5QUMRLGA7rcxQ05s7mKq3XZQfeqaNts4bms/eZRefWuaFZbkw=
|
|
||||||
22
vendor/github.com/blang/semver/LICENSE
generated
vendored
22
vendor/github.com/blang/semver/LICENSE
generated
vendored
|
|
@ -1,22 +0,0 @@
|
||||||
The MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2014 Benedikt Lang <github at benediktlang.de>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
194
vendor/github.com/blang/semver/README.md
generated
vendored
194
vendor/github.com/blang/semver/README.md
generated
vendored
|
|
@ -1,194 +0,0 @@
|
||||||
semver for golang [](https://travis-ci.org/blang/semver) [](https://godoc.org/github.com/blang/semver) [](https://coveralls.io/r/blang/semver?branch=master)
|
|
||||||
======
|
|
||||||
|
|
||||||
semver is a [Semantic Versioning](http://semver.org/) library written in golang. It fully covers spec version `2.0.0`.
|
|
||||||
|
|
||||||
Usage
|
|
||||||
-----
|
|
||||||
```bash
|
|
||||||
$ go get github.com/blang/semver
|
|
||||||
```
|
|
||||||
Note: Always vendor your dependencies or fix on a specific version tag.
|
|
||||||
|
|
||||||
```go
|
|
||||||
import github.com/blang/semver
|
|
||||||
v1, err := semver.Make("1.0.0-beta")
|
|
||||||
v2, err := semver.Make("2.0.0-beta")
|
|
||||||
v1.Compare(v2)
|
|
||||||
```
|
|
||||||
|
|
||||||
Also check the [GoDocs](http://godoc.org/github.com/blang/semver).
|
|
||||||
|
|
||||||
Why should I use this lib?
|
|
||||||
-----
|
|
||||||
|
|
||||||
- Fully spec compatible
|
|
||||||
- No reflection
|
|
||||||
- No regex
|
|
||||||
- Fully tested (Coverage >99%)
|
|
||||||
- Readable parsing/validation errors
|
|
||||||
- Fast (See [Benchmarks](#benchmarks))
|
|
||||||
- Only Stdlib
|
|
||||||
- Uses values instead of pointers
|
|
||||||
- Many features, see below
|
|
||||||
|
|
||||||
|
|
||||||
Features
|
|
||||||
-----
|
|
||||||
|
|
||||||
- Parsing and validation at all levels
|
|
||||||
- Comparator-like comparisons
|
|
||||||
- Compare Helper Methods
|
|
||||||
- InPlace manipulation
|
|
||||||
- Ranges `>=1.0.0 <2.0.0 || >=3.0.0 !3.0.1-beta.1`
|
|
||||||
- Wildcards `>=1.x`, `<=2.5.x`
|
|
||||||
- Sortable (implements sort.Interface)
|
|
||||||
- database/sql compatible (sql.Scanner/Valuer)
|
|
||||||
- encoding/json compatible (json.Marshaler/Unmarshaler)
|
|
||||||
|
|
||||||
Ranges
|
|
||||||
------
|
|
||||||
|
|
||||||
A `Range` is a set of conditions which specify which versions satisfy the range.
|
|
||||||
|
|
||||||
A condition is composed of an operator and a version. The supported operators are:
|
|
||||||
|
|
||||||
- `<1.0.0` Less than `1.0.0`
|
|
||||||
- `<=1.0.0` Less than or equal to `1.0.0`
|
|
||||||
- `>1.0.0` Greater than `1.0.0`
|
|
||||||
- `>=1.0.0` Greater than or equal to `1.0.0`
|
|
||||||
- `1.0.0`, `=1.0.0`, `==1.0.0` Equal to `1.0.0`
|
|
||||||
- `!1.0.0`, `!=1.0.0` Not equal to `1.0.0`. Excludes version `1.0.0`.
|
|
||||||
|
|
||||||
Note that spaces between the operator and the version will be gracefully tolerated.
|
|
||||||
|
|
||||||
A `Range` can link multiple `Ranges` separated by space:
|
|
||||||
|
|
||||||
Ranges can be linked by logical AND:
|
|
||||||
|
|
||||||
- `>1.0.0 <2.0.0` would match between both ranges, so `1.1.1` and `1.8.7` but not `1.0.0` or `2.0.0`
|
|
||||||
- `>1.0.0 <3.0.0 !2.0.3-beta.2` would match every version between `1.0.0` and `3.0.0` except `2.0.3-beta.2`
|
|
||||||
|
|
||||||
Ranges can also be linked by logical OR:
|
|
||||||
|
|
||||||
- `<2.0.0 || >=3.0.0` would match `1.x.x` and `3.x.x` but not `2.x.x`
|
|
||||||
|
|
||||||
AND has a higher precedence than OR. It's not possible to use brackets.
|
|
||||||
|
|
||||||
Ranges can be combined by both AND and OR
|
|
||||||
|
|
||||||
- `>1.0.0 <2.0.0 || >3.0.0 !4.2.1` would match `1.2.3`, `1.9.9`, `3.1.1`, but not `4.2.1`, `2.1.1`
|
|
||||||
|
|
||||||
Range usage:
|
|
||||||
|
|
||||||
```
|
|
||||||
v, err := semver.Parse("1.2.3")
|
|
||||||
range, err := semver.ParseRange(">1.0.0 <2.0.0 || >=3.0.0")
|
|
||||||
if range(v) {
|
|
||||||
//valid
|
|
||||||
}
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Example
|
|
||||||
-----
|
|
||||||
|
|
||||||
Have a look at full examples in [examples/main.go](examples/main.go)
|
|
||||||
|
|
||||||
```go
|
|
||||||
import github.com/blang/semver
|
|
||||||
|
|
||||||
v, err := semver.Make("0.0.1-alpha.preview+123.github")
|
|
||||||
fmt.Printf("Major: %d\n", v.Major)
|
|
||||||
fmt.Printf("Minor: %d\n", v.Minor)
|
|
||||||
fmt.Printf("Patch: %d\n", v.Patch)
|
|
||||||
fmt.Printf("Pre: %s\n", v.Pre)
|
|
||||||
fmt.Printf("Build: %s\n", v.Build)
|
|
||||||
|
|
||||||
// Prerelease versions array
|
|
||||||
if len(v.Pre) > 0 {
|
|
||||||
fmt.Println("Prerelease versions:")
|
|
||||||
for i, pre := range v.Pre {
|
|
||||||
fmt.Printf("%d: %q\n", i, pre)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Build meta data array
|
|
||||||
if len(v.Build) > 0 {
|
|
||||||
fmt.Println("Build meta data:")
|
|
||||||
for i, build := range v.Build {
|
|
||||||
fmt.Printf("%d: %q\n", i, build)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
v001, err := semver.Make("0.0.1")
|
|
||||||
// Compare using helpers: v.GT(v2), v.LT, v.GTE, v.LTE
|
|
||||||
v001.GT(v) == true
|
|
||||||
v.LT(v001) == true
|
|
||||||
v.GTE(v) == true
|
|
||||||
v.LTE(v) == true
|
|
||||||
|
|
||||||
// Or use v.Compare(v2) for comparisons (-1, 0, 1):
|
|
||||||
v001.Compare(v) == 1
|
|
||||||
v.Compare(v001) == -1
|
|
||||||
v.Compare(v) == 0
|
|
||||||
|
|
||||||
// Manipulate Version in place:
|
|
||||||
v.Pre[0], err = semver.NewPRVersion("beta")
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("Error parsing pre release version: %q", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println("\nValidate versions:")
|
|
||||||
v.Build[0] = "?"
|
|
||||||
|
|
||||||
err = v.Validate()
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("Validation failed: %s\n", err)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
Benchmarks
|
|
||||||
-----
|
|
||||||
|
|
||||||
BenchmarkParseSimple-4 5000000 390 ns/op 48 B/op 1 allocs/op
|
|
||||||
BenchmarkParseComplex-4 1000000 1813 ns/op 256 B/op 7 allocs/op
|
|
||||||
BenchmarkParseAverage-4 1000000 1171 ns/op 163 B/op 4 allocs/op
|
|
||||||
BenchmarkStringSimple-4 20000000 119 ns/op 16 B/op 1 allocs/op
|
|
||||||
BenchmarkStringLarger-4 10000000 206 ns/op 32 B/op 2 allocs/op
|
|
||||||
BenchmarkStringComplex-4 5000000 324 ns/op 80 B/op 3 allocs/op
|
|
||||||
BenchmarkStringAverage-4 5000000 273 ns/op 53 B/op 2 allocs/op
|
|
||||||
BenchmarkValidateSimple-4 200000000 9.33 ns/op 0 B/op 0 allocs/op
|
|
||||||
BenchmarkValidateComplex-4 3000000 469 ns/op 0 B/op 0 allocs/op
|
|
||||||
BenchmarkValidateAverage-4 5000000 256 ns/op 0 B/op 0 allocs/op
|
|
||||||
BenchmarkCompareSimple-4 100000000 11.8 ns/op 0 B/op 0 allocs/op
|
|
||||||
BenchmarkCompareComplex-4 50000000 30.8 ns/op 0 B/op 0 allocs/op
|
|
||||||
BenchmarkCompareAverage-4 30000000 41.5 ns/op 0 B/op 0 allocs/op
|
|
||||||
BenchmarkSort-4 3000000 419 ns/op 256 B/op 2 allocs/op
|
|
||||||
BenchmarkRangeParseSimple-4 2000000 850 ns/op 192 B/op 5 allocs/op
|
|
||||||
BenchmarkRangeParseAverage-4 1000000 1677 ns/op 400 B/op 10 allocs/op
|
|
||||||
BenchmarkRangeParseComplex-4 300000 5214 ns/op 1440 B/op 30 allocs/op
|
|
||||||
BenchmarkRangeMatchSimple-4 50000000 25.6 ns/op 0 B/op 0 allocs/op
|
|
||||||
BenchmarkRangeMatchAverage-4 30000000 56.4 ns/op 0 B/op 0 allocs/op
|
|
||||||
BenchmarkRangeMatchComplex-4 10000000 153 ns/op 0 B/op 0 allocs/op
|
|
||||||
|
|
||||||
See benchmark cases at [semver_test.go](semver_test.go)
|
|
||||||
|
|
||||||
|
|
||||||
Motivation
|
|
||||||
-----
|
|
||||||
|
|
||||||
I simply couldn't find any lib supporting the full spec. Others were just wrong or used reflection and regex which i don't like.
|
|
||||||
|
|
||||||
|
|
||||||
Contribution
|
|
||||||
-----
|
|
||||||
|
|
||||||
Feel free to make a pull request. For bigger changes create a issue first to discuss about it.
|
|
||||||
|
|
||||||
|
|
||||||
License
|
|
||||||
-----
|
|
||||||
|
|
||||||
See [LICENSE](LICENSE) file.
|
|
||||||
23
vendor/github.com/blang/semver/json.go
generated
vendored
23
vendor/github.com/blang/semver/json.go
generated
vendored
|
|
@ -1,23 +0,0 @@
|
||||||
package semver
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
)
|
|
||||||
|
|
||||||
// MarshalJSON implements the encoding/json.Marshaler interface.
|
|
||||||
func (v Version) MarshalJSON() ([]byte, error) {
|
|
||||||
return json.Marshal(v.String())
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON implements the encoding/json.Unmarshaler interface.
|
|
||||||
func (v *Version) UnmarshalJSON(data []byte) (err error) {
|
|
||||||
var versionString string
|
|
||||||
|
|
||||||
if err = json.Unmarshal(data, &versionString); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
*v, err = Parse(versionString)
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
17
vendor/github.com/blang/semver/package.json
generated
vendored
17
vendor/github.com/blang/semver/package.json
generated
vendored
|
|
@ -1,17 +0,0 @@
|
||||||
{
|
|
||||||
"author": "blang",
|
|
||||||
"bugs": {
|
|
||||||
"URL": "https://github.com/blang/semver/issues",
|
|
||||||
"url": "https://github.com/blang/semver/issues"
|
|
||||||
},
|
|
||||||
"gx": {
|
|
||||||
"dvcsimport": "github.com/blang/semver"
|
|
||||||
},
|
|
||||||
"gxVersion": "0.10.0",
|
|
||||||
"language": "go",
|
|
||||||
"license": "MIT",
|
|
||||||
"name": "semver",
|
|
||||||
"releaseCmd": "git commit -a -m \"gx publish $VERSION\"",
|
|
||||||
"version": "3.5.1"
|
|
||||||
}
|
|
||||||
|
|
||||||
416
vendor/github.com/blang/semver/range.go
generated
vendored
416
vendor/github.com/blang/semver/range.go
generated
vendored
|
|
@ -1,416 +0,0 @@
|
||||||
package semver
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"unicode"
|
|
||||||
)
|
|
||||||
|
|
||||||
type wildcardType int
|
|
||||||
|
|
||||||
const (
|
|
||||||
noneWildcard wildcardType = iota
|
|
||||||
majorWildcard wildcardType = 1
|
|
||||||
minorWildcard wildcardType = 2
|
|
||||||
patchWildcard wildcardType = 3
|
|
||||||
)
|
|
||||||
|
|
||||||
func wildcardTypefromInt(i int) wildcardType {
|
|
||||||
switch i {
|
|
||||||
case 1:
|
|
||||||
return majorWildcard
|
|
||||||
case 2:
|
|
||||||
return minorWildcard
|
|
||||||
case 3:
|
|
||||||
return patchWildcard
|
|
||||||
default:
|
|
||||||
return noneWildcard
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type comparator func(Version, Version) bool
|
|
||||||
|
|
||||||
var (
|
|
||||||
compEQ comparator = func(v1 Version, v2 Version) bool {
|
|
||||||
return v1.Compare(v2) == 0
|
|
||||||
}
|
|
||||||
compNE = func(v1 Version, v2 Version) bool {
|
|
||||||
return v1.Compare(v2) != 0
|
|
||||||
}
|
|
||||||
compGT = func(v1 Version, v2 Version) bool {
|
|
||||||
return v1.Compare(v2) == 1
|
|
||||||
}
|
|
||||||
compGE = func(v1 Version, v2 Version) bool {
|
|
||||||
return v1.Compare(v2) >= 0
|
|
||||||
}
|
|
||||||
compLT = func(v1 Version, v2 Version) bool {
|
|
||||||
return v1.Compare(v2) == -1
|
|
||||||
}
|
|
||||||
compLE = func(v1 Version, v2 Version) bool {
|
|
||||||
return v1.Compare(v2) <= 0
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
type versionRange struct {
|
|
||||||
v Version
|
|
||||||
c comparator
|
|
||||||
}
|
|
||||||
|
|
||||||
// rangeFunc creates a Range from the given versionRange.
|
|
||||||
func (vr *versionRange) rangeFunc() Range {
|
|
||||||
return Range(func(v Version) bool {
|
|
||||||
return vr.c(v, vr.v)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Range represents a range of versions.
|
|
||||||
// A Range can be used to check if a Version satisfies it:
|
|
||||||
//
|
|
||||||
// range, err := semver.ParseRange(">1.0.0 <2.0.0")
|
|
||||||
// range(semver.MustParse("1.1.1") // returns true
|
|
||||||
type Range func(Version) bool
|
|
||||||
|
|
||||||
// OR combines the existing Range with another Range using logical OR.
|
|
||||||
func (rf Range) OR(f Range) Range {
|
|
||||||
return Range(func(v Version) bool {
|
|
||||||
return rf(v) || f(v)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// AND combines the existing Range with another Range using logical AND.
|
|
||||||
func (rf Range) AND(f Range) Range {
|
|
||||||
return Range(func(v Version) bool {
|
|
||||||
return rf(v) && f(v)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseRange parses a range and returns a Range.
|
|
||||||
// If the range could not be parsed an error is returned.
|
|
||||||
//
|
|
||||||
// Valid ranges are:
|
|
||||||
// - "<1.0.0"
|
|
||||||
// - "<=1.0.0"
|
|
||||||
// - ">1.0.0"
|
|
||||||
// - ">=1.0.0"
|
|
||||||
// - "1.0.0", "=1.0.0", "==1.0.0"
|
|
||||||
// - "!1.0.0", "!=1.0.0"
|
|
||||||
//
|
|
||||||
// A Range can consist of multiple ranges separated by space:
|
|
||||||
// Ranges can be linked by logical AND:
|
|
||||||
// - ">1.0.0 <2.0.0" would match between both ranges, so "1.1.1" and "1.8.7" but not "1.0.0" or "2.0.0"
|
|
||||||
// - ">1.0.0 <3.0.0 !2.0.3-beta.2" would match every version between 1.0.0 and 3.0.0 except 2.0.3-beta.2
|
|
||||||
//
|
|
||||||
// Ranges can also be linked by logical OR:
|
|
||||||
// - "<2.0.0 || >=3.0.0" would match "1.x.x" and "3.x.x" but not "2.x.x"
|
|
||||||
//
|
|
||||||
// AND has a higher precedence than OR. It's not possible to use brackets.
|
|
||||||
//
|
|
||||||
// Ranges can be combined by both AND and OR
|
|
||||||
//
|
|
||||||
// - `>1.0.0 <2.0.0 || >3.0.0 !4.2.1` would match `1.2.3`, `1.9.9`, `3.1.1`, but not `4.2.1`, `2.1.1`
|
|
||||||
func ParseRange(s string) (Range, error) {
|
|
||||||
parts := splitAndTrim(s)
|
|
||||||
orParts, err := splitORParts(parts)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
expandedParts, err := expandWildcardVersion(orParts)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var orFn Range
|
|
||||||
for _, p := range expandedParts {
|
|
||||||
var andFn Range
|
|
||||||
for _, ap := range p {
|
|
||||||
opStr, vStr, err := splitComparatorVersion(ap)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
vr, err := buildVersionRange(opStr, vStr)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("Could not parse Range %q: %s", ap, err)
|
|
||||||
}
|
|
||||||
rf := vr.rangeFunc()
|
|
||||||
|
|
||||||
// Set function
|
|
||||||
if andFn == nil {
|
|
||||||
andFn = rf
|
|
||||||
} else { // Combine with existing function
|
|
||||||
andFn = andFn.AND(rf)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if orFn == nil {
|
|
||||||
orFn = andFn
|
|
||||||
} else {
|
|
||||||
orFn = orFn.OR(andFn)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return orFn, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// splitORParts splits the already cleaned parts by '||'.
|
|
||||||
// Checks for invalid positions of the operator and returns an
|
|
||||||
// error if found.
|
|
||||||
func splitORParts(parts []string) ([][]string, error) {
|
|
||||||
var ORparts [][]string
|
|
||||||
last := 0
|
|
||||||
for i, p := range parts {
|
|
||||||
if p == "||" {
|
|
||||||
if i == 0 {
|
|
||||||
return nil, fmt.Errorf("First element in range is '||'")
|
|
||||||
}
|
|
||||||
ORparts = append(ORparts, parts[last:i])
|
|
||||||
last = i + 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if last == len(parts) {
|
|
||||||
return nil, fmt.Errorf("Last element in range is '||'")
|
|
||||||
}
|
|
||||||
ORparts = append(ORparts, parts[last:])
|
|
||||||
return ORparts, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// buildVersionRange takes a slice of 2: operator and version
|
|
||||||
// and builds a versionRange, otherwise an error.
|
|
||||||
func buildVersionRange(opStr, vStr string) (*versionRange, error) {
|
|
||||||
c := parseComparator(opStr)
|
|
||||||
if c == nil {
|
|
||||||
return nil, fmt.Errorf("Could not parse comparator %q in %q", opStr, strings.Join([]string{opStr, vStr}, ""))
|
|
||||||
}
|
|
||||||
v, err := Parse(vStr)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("Could not parse version %q in %q: %s", vStr, strings.Join([]string{opStr, vStr}, ""), err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return &versionRange{
|
|
||||||
v: v,
|
|
||||||
c: c,
|
|
||||||
}, nil
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// inArray checks if a byte is contained in an array of bytes
|
|
||||||
func inArray(s byte, list []byte) bool {
|
|
||||||
for _, el := range list {
|
|
||||||
if el == s {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// splitAndTrim splits a range string by spaces and cleans whitespaces
|
|
||||||
func splitAndTrim(s string) (result []string) {
|
|
||||||
last := 0
|
|
||||||
var lastChar byte
|
|
||||||
excludeFromSplit := []byte{'>', '<', '='}
|
|
||||||
for i := 0; i < len(s); i++ {
|
|
||||||
if s[i] == ' ' && !inArray(lastChar, excludeFromSplit) {
|
|
||||||
if last < i-1 {
|
|
||||||
result = append(result, s[last:i])
|
|
||||||
}
|
|
||||||
last = i + 1
|
|
||||||
} else if s[i] != ' ' {
|
|
||||||
lastChar = s[i]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if last < len(s)-1 {
|
|
||||||
result = append(result, s[last:])
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, v := range result {
|
|
||||||
result[i] = strings.Replace(v, " ", "", -1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// parts := strings.Split(s, " ")
|
|
||||||
// for _, x := range parts {
|
|
||||||
// if s := strings.TrimSpace(x); len(s) != 0 {
|
|
||||||
// result = append(result, s)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// splitComparatorVersion splits the comparator from the version.
|
|
||||||
// Input must be free of leading or trailing spaces.
|
|
||||||
func splitComparatorVersion(s string) (string, string, error) {
|
|
||||||
i := strings.IndexFunc(s, unicode.IsDigit)
|
|
||||||
if i == -1 {
|
|
||||||
return "", "", fmt.Errorf("Could not get version from string: %q", s)
|
|
||||||
}
|
|
||||||
return strings.TrimSpace(s[0:i]), s[i:], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// getWildcardType will return the type of wildcard that the
|
|
||||||
// passed version contains
|
|
||||||
func getWildcardType(vStr string) wildcardType {
|
|
||||||
parts := strings.Split(vStr, ".")
|
|
||||||
nparts := len(parts)
|
|
||||||
wildcard := parts[nparts-1]
|
|
||||||
|
|
||||||
possibleWildcardType := wildcardTypefromInt(nparts)
|
|
||||||
if wildcard == "x" {
|
|
||||||
return possibleWildcardType
|
|
||||||
}
|
|
||||||
|
|
||||||
return noneWildcard
|
|
||||||
}
|
|
||||||
|
|
||||||
// createVersionFromWildcard will convert a wildcard version
|
|
||||||
// into a regular version, replacing 'x's with '0's, handling
|
|
||||||
// special cases like '1.x.x' and '1.x'
|
|
||||||
func createVersionFromWildcard(vStr string) string {
|
|
||||||
// handle 1.x.x
|
|
||||||
vStr2 := strings.Replace(vStr, ".x.x", ".x", 1)
|
|
||||||
vStr2 = strings.Replace(vStr2, ".x", ".0", 1)
|
|
||||||
parts := strings.Split(vStr2, ".")
|
|
||||||
|
|
||||||
// handle 1.x
|
|
||||||
if len(parts) == 2 {
|
|
||||||
return vStr2 + ".0"
|
|
||||||
}
|
|
||||||
|
|
||||||
return vStr2
|
|
||||||
}
|
|
||||||
|
|
||||||
// incrementMajorVersion will increment the major version
|
|
||||||
// of the passed version
|
|
||||||
func incrementMajorVersion(vStr string) (string, error) {
|
|
||||||
parts := strings.Split(vStr, ".")
|
|
||||||
i, err := strconv.Atoi(parts[0])
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
parts[0] = strconv.Itoa(i + 1)
|
|
||||||
|
|
||||||
return strings.Join(parts, "."), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// incrementMajorVersion will increment the minor version
|
|
||||||
// of the passed version
|
|
||||||
func incrementMinorVersion(vStr string) (string, error) {
|
|
||||||
parts := strings.Split(vStr, ".")
|
|
||||||
i, err := strconv.Atoi(parts[1])
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
parts[1] = strconv.Itoa(i + 1)
|
|
||||||
|
|
||||||
return strings.Join(parts, "."), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// expandWildcardVersion will expand wildcards inside versions
|
|
||||||
// following these rules:
|
|
||||||
//
|
|
||||||
// * when dealing with patch wildcards:
|
|
||||||
// >= 1.2.x will become >= 1.2.0
|
|
||||||
// <= 1.2.x will become < 1.3.0
|
|
||||||
// > 1.2.x will become >= 1.3.0
|
|
||||||
// < 1.2.x will become < 1.2.0
|
|
||||||
// != 1.2.x will become < 1.2.0 >= 1.3.0
|
|
||||||
//
|
|
||||||
// * when dealing with minor wildcards:
|
|
||||||
// >= 1.x will become >= 1.0.0
|
|
||||||
// <= 1.x will become < 2.0.0
|
|
||||||
// > 1.x will become >= 2.0.0
|
|
||||||
// < 1.0 will become < 1.0.0
|
|
||||||
// != 1.x will become < 1.0.0 >= 2.0.0
|
|
||||||
//
|
|
||||||
// * when dealing with wildcards without
|
|
||||||
// version operator:
|
|
||||||
// 1.2.x will become >= 1.2.0 < 1.3.0
|
|
||||||
// 1.x will become >= 1.0.0 < 2.0.0
|
|
||||||
func expandWildcardVersion(parts [][]string) ([][]string, error) {
|
|
||||||
var expandedParts [][]string
|
|
||||||
for _, p := range parts {
|
|
||||||
var newParts []string
|
|
||||||
for _, ap := range p {
|
|
||||||
if strings.Index(ap, "x") != -1 {
|
|
||||||
opStr, vStr, err := splitComparatorVersion(ap)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
versionWildcardType := getWildcardType(vStr)
|
|
||||||
flatVersion := createVersionFromWildcard(vStr)
|
|
||||||
|
|
||||||
var resultOperator string
|
|
||||||
var shouldIncrementVersion bool
|
|
||||||
switch opStr {
|
|
||||||
case ">":
|
|
||||||
resultOperator = ">="
|
|
||||||
shouldIncrementVersion = true
|
|
||||||
case ">=":
|
|
||||||
resultOperator = ">="
|
|
||||||
case "<":
|
|
||||||
resultOperator = "<"
|
|
||||||
case "<=":
|
|
||||||
resultOperator = "<"
|
|
||||||
shouldIncrementVersion = true
|
|
||||||
case "", "=", "==":
|
|
||||||
newParts = append(newParts, ">="+flatVersion)
|
|
||||||
resultOperator = "<"
|
|
||||||
shouldIncrementVersion = true
|
|
||||||
case "!=", "!":
|
|
||||||
newParts = append(newParts, "<"+flatVersion)
|
|
||||||
resultOperator = ">="
|
|
||||||
shouldIncrementVersion = true
|
|
||||||
}
|
|
||||||
|
|
||||||
var resultVersion string
|
|
||||||
if shouldIncrementVersion {
|
|
||||||
switch versionWildcardType {
|
|
||||||
case patchWildcard:
|
|
||||||
resultVersion, _ = incrementMinorVersion(flatVersion)
|
|
||||||
case minorWildcard:
|
|
||||||
resultVersion, _ = incrementMajorVersion(flatVersion)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
resultVersion = flatVersion
|
|
||||||
}
|
|
||||||
|
|
||||||
ap = resultOperator + resultVersion
|
|
||||||
}
|
|
||||||
newParts = append(newParts, ap)
|
|
||||||
}
|
|
||||||
expandedParts = append(expandedParts, newParts)
|
|
||||||
}
|
|
||||||
|
|
||||||
return expandedParts, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseComparator(s string) comparator {
|
|
||||||
switch s {
|
|
||||||
case "==":
|
|
||||||
fallthrough
|
|
||||||
case "":
|
|
||||||
fallthrough
|
|
||||||
case "=":
|
|
||||||
return compEQ
|
|
||||||
case ">":
|
|
||||||
return compGT
|
|
||||||
case ">=":
|
|
||||||
return compGE
|
|
||||||
case "<":
|
|
||||||
return compLT
|
|
||||||
case "<=":
|
|
||||||
return compLE
|
|
||||||
case "!":
|
|
||||||
fallthrough
|
|
||||||
case "!=":
|
|
||||||
return compNE
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MustParseRange is like ParseRange but panics if the range cannot be parsed.
|
|
||||||
func MustParseRange(s string) Range {
|
|
||||||
r, err := ParseRange(s)
|
|
||||||
if err != nil {
|
|
||||||
panic(`semver: ParseRange(` + s + `): ` + err.Error())
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
418
vendor/github.com/blang/semver/semver.go
generated
vendored
418
vendor/github.com/blang/semver/semver.go
generated
vendored
|
|
@ -1,418 +0,0 @@
|
||||||
package semver
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
numbers string = "0123456789"
|
|
||||||
alphas = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-"
|
|
||||||
alphanum = alphas + numbers
|
|
||||||
)
|
|
||||||
|
|
||||||
// SpecVersion is the latest fully supported spec version of semver
|
|
||||||
var SpecVersion = Version{
|
|
||||||
Major: 2,
|
|
||||||
Minor: 0,
|
|
||||||
Patch: 0,
|
|
||||||
}
|
|
||||||
|
|
||||||
// Version represents a semver compatible version
|
|
||||||
type Version struct {
|
|
||||||
Major uint64
|
|
||||||
Minor uint64
|
|
||||||
Patch uint64
|
|
||||||
Pre []PRVersion
|
|
||||||
Build []string //No Precendence
|
|
||||||
}
|
|
||||||
|
|
||||||
// Version to string
|
|
||||||
func (v Version) String() string {
|
|
||||||
b := make([]byte, 0, 5)
|
|
||||||
b = strconv.AppendUint(b, v.Major, 10)
|
|
||||||
b = append(b, '.')
|
|
||||||
b = strconv.AppendUint(b, v.Minor, 10)
|
|
||||||
b = append(b, '.')
|
|
||||||
b = strconv.AppendUint(b, v.Patch, 10)
|
|
||||||
|
|
||||||
if len(v.Pre) > 0 {
|
|
||||||
b = append(b, '-')
|
|
||||||
b = append(b, v.Pre[0].String()...)
|
|
||||||
|
|
||||||
for _, pre := range v.Pre[1:] {
|
|
||||||
b = append(b, '.')
|
|
||||||
b = append(b, pre.String()...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(v.Build) > 0 {
|
|
||||||
b = append(b, '+')
|
|
||||||
b = append(b, v.Build[0]...)
|
|
||||||
|
|
||||||
for _, build := range v.Build[1:] {
|
|
||||||
b = append(b, '.')
|
|
||||||
b = append(b, build...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return string(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Equals checks if v is equal to o.
|
|
||||||
func (v Version) Equals(o Version) bool {
|
|
||||||
return (v.Compare(o) == 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// EQ checks if v is equal to o.
|
|
||||||
func (v Version) EQ(o Version) bool {
|
|
||||||
return (v.Compare(o) == 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NE checks if v is not equal to o.
|
|
||||||
func (v Version) NE(o Version) bool {
|
|
||||||
return (v.Compare(o) != 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GT checks if v is greater than o.
|
|
||||||
func (v Version) GT(o Version) bool {
|
|
||||||
return (v.Compare(o) == 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GTE checks if v is greater than or equal to o.
|
|
||||||
func (v Version) GTE(o Version) bool {
|
|
||||||
return (v.Compare(o) >= 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GE checks if v is greater than or equal to o.
|
|
||||||
func (v Version) GE(o Version) bool {
|
|
||||||
return (v.Compare(o) >= 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// LT checks if v is less than o.
|
|
||||||
func (v Version) LT(o Version) bool {
|
|
||||||
return (v.Compare(o) == -1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// LTE checks if v is less than or equal to o.
|
|
||||||
func (v Version) LTE(o Version) bool {
|
|
||||||
return (v.Compare(o) <= 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// LE checks if v is less than or equal to o.
|
|
||||||
func (v Version) LE(o Version) bool {
|
|
||||||
return (v.Compare(o) <= 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare compares Versions v to o:
|
|
||||||
// -1 == v is less than o
|
|
||||||
// 0 == v is equal to o
|
|
||||||
// 1 == v is greater than o
|
|
||||||
func (v Version) Compare(o Version) int {
|
|
||||||
if v.Major != o.Major {
|
|
||||||
if v.Major > o.Major {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
if v.Minor != o.Minor {
|
|
||||||
if v.Minor > o.Minor {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
if v.Patch != o.Patch {
|
|
||||||
if v.Patch > o.Patch {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
|
|
||||||
// Quick comparison if a version has no prerelease versions
|
|
||||||
if len(v.Pre) == 0 && len(o.Pre) == 0 {
|
|
||||||
return 0
|
|
||||||
} else if len(v.Pre) == 0 && len(o.Pre) > 0 {
|
|
||||||
return 1
|
|
||||||
} else if len(v.Pre) > 0 && len(o.Pre) == 0 {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
|
|
||||||
i := 0
|
|
||||||
for ; i < len(v.Pre) && i < len(o.Pre); i++ {
|
|
||||||
if comp := v.Pre[i].Compare(o.Pre[i]); comp == 0 {
|
|
||||||
continue
|
|
||||||
} else if comp == 1 {
|
|
||||||
return 1
|
|
||||||
} else {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If all pr versions are the equal but one has further prversion, this one greater
|
|
||||||
if i == len(v.Pre) && i == len(o.Pre) {
|
|
||||||
return 0
|
|
||||||
} else if i == len(v.Pre) && i < len(o.Pre) {
|
|
||||||
return -1
|
|
||||||
} else {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate validates v and returns error in case
|
|
||||||
func (v Version) Validate() error {
|
|
||||||
// Major, Minor, Patch already validated using uint64
|
|
||||||
|
|
||||||
for _, pre := range v.Pre {
|
|
||||||
if !pre.IsNum { //Numeric prerelease versions already uint64
|
|
||||||
if len(pre.VersionStr) == 0 {
|
|
||||||
return fmt.Errorf("Prerelease can not be empty %q", pre.VersionStr)
|
|
||||||
}
|
|
||||||
if !containsOnly(pre.VersionStr, alphanum) {
|
|
||||||
return fmt.Errorf("Invalid character(s) found in prerelease %q", pre.VersionStr)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, build := range v.Build {
|
|
||||||
if len(build) == 0 {
|
|
||||||
return fmt.Errorf("Build meta data can not be empty %q", build)
|
|
||||||
}
|
|
||||||
if !containsOnly(build, alphanum) {
|
|
||||||
return fmt.Errorf("Invalid character(s) found in build meta data %q", build)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// New is an alias for Parse and returns a pointer, parses version string and returns a validated Version or error
|
|
||||||
func New(s string) (vp *Version, err error) {
|
|
||||||
v, err := Parse(s)
|
|
||||||
vp = &v
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make is an alias for Parse, parses version string and returns a validated Version or error
|
|
||||||
func Make(s string) (Version, error) {
|
|
||||||
return Parse(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseTolerant allows for certain version specifications that do not strictly adhere to semver
|
|
||||||
// specs to be parsed by this library. It does so by normalizing versions before passing them to
|
|
||||||
// Parse(). It currently trims spaces, removes a "v" prefix, and adds a 0 patch number to versions
|
|
||||||
// with only major and minor components specified
|
|
||||||
func ParseTolerant(s string) (Version, error) {
|
|
||||||
s = strings.TrimSpace(s)
|
|
||||||
s = strings.TrimPrefix(s, "v")
|
|
||||||
|
|
||||||
// Split into major.minor.(patch+pr+meta)
|
|
||||||
parts := strings.SplitN(s, ".", 3)
|
|
||||||
if len(parts) < 3 {
|
|
||||||
if strings.ContainsAny(parts[len(parts)-1], "+-") {
|
|
||||||
return Version{}, errors.New("Short version cannot contain PreRelease/Build meta data")
|
|
||||||
}
|
|
||||||
for len(parts) < 3 {
|
|
||||||
parts = append(parts, "0")
|
|
||||||
}
|
|
||||||
s = strings.Join(parts, ".")
|
|
||||||
}
|
|
||||||
|
|
||||||
return Parse(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse parses version string and returns a validated Version or error
|
|
||||||
func Parse(s string) (Version, error) {
|
|
||||||
if len(s) == 0 {
|
|
||||||
return Version{}, errors.New("Version string empty")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Split into major.minor.(patch+pr+meta)
|
|
||||||
parts := strings.SplitN(s, ".", 3)
|
|
||||||
if len(parts) != 3 {
|
|
||||||
return Version{}, errors.New("No Major.Minor.Patch elements found")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Major
|
|
||||||
if !containsOnly(parts[0], numbers) {
|
|
||||||
return Version{}, fmt.Errorf("Invalid character(s) found in major number %q", parts[0])
|
|
||||||
}
|
|
||||||
if hasLeadingZeroes(parts[0]) {
|
|
||||||
return Version{}, fmt.Errorf("Major number must not contain leading zeroes %q", parts[0])
|
|
||||||
}
|
|
||||||
major, err := strconv.ParseUint(parts[0], 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return Version{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Minor
|
|
||||||
if !containsOnly(parts[1], numbers) {
|
|
||||||
return Version{}, fmt.Errorf("Invalid character(s) found in minor number %q", parts[1])
|
|
||||||
}
|
|
||||||
if hasLeadingZeroes(parts[1]) {
|
|
||||||
return Version{}, fmt.Errorf("Minor number must not contain leading zeroes %q", parts[1])
|
|
||||||
}
|
|
||||||
minor, err := strconv.ParseUint(parts[1], 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return Version{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
v := Version{}
|
|
||||||
v.Major = major
|
|
||||||
v.Minor = minor
|
|
||||||
|
|
||||||
var build, prerelease []string
|
|
||||||
patchStr := parts[2]
|
|
||||||
|
|
||||||
if buildIndex := strings.IndexRune(patchStr, '+'); buildIndex != -1 {
|
|
||||||
build = strings.Split(patchStr[buildIndex+1:], ".")
|
|
||||||
patchStr = patchStr[:buildIndex]
|
|
||||||
}
|
|
||||||
|
|
||||||
if preIndex := strings.IndexRune(patchStr, '-'); preIndex != -1 {
|
|
||||||
prerelease = strings.Split(patchStr[preIndex+1:], ".")
|
|
||||||
patchStr = patchStr[:preIndex]
|
|
||||||
}
|
|
||||||
|
|
||||||
if !containsOnly(patchStr, numbers) {
|
|
||||||
return Version{}, fmt.Errorf("Invalid character(s) found in patch number %q", patchStr)
|
|
||||||
}
|
|
||||||
if hasLeadingZeroes(patchStr) {
|
|
||||||
return Version{}, fmt.Errorf("Patch number must not contain leading zeroes %q", patchStr)
|
|
||||||
}
|
|
||||||
patch, err := strconv.ParseUint(patchStr, 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return Version{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
v.Patch = patch
|
|
||||||
|
|
||||||
// Prerelease
|
|
||||||
for _, prstr := range prerelease {
|
|
||||||
parsedPR, err := NewPRVersion(prstr)
|
|
||||||
if err != nil {
|
|
||||||
return Version{}, err
|
|
||||||
}
|
|
||||||
v.Pre = append(v.Pre, parsedPR)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Build meta data
|
|
||||||
for _, str := range build {
|
|
||||||
if len(str) == 0 {
|
|
||||||
return Version{}, errors.New("Build meta data is empty")
|
|
||||||
}
|
|
||||||
if !containsOnly(str, alphanum) {
|
|
||||||
return Version{}, fmt.Errorf("Invalid character(s) found in build meta data %q", str)
|
|
||||||
}
|
|
||||||
v.Build = append(v.Build, str)
|
|
||||||
}
|
|
||||||
|
|
||||||
return v, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MustParse is like Parse but panics if the version cannot be parsed.
|
|
||||||
func MustParse(s string) Version {
|
|
||||||
v, err := Parse(s)
|
|
||||||
if err != nil {
|
|
||||||
panic(`semver: Parse(` + s + `): ` + err.Error())
|
|
||||||
}
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
|
|
||||||
// PRVersion represents a PreRelease Version
|
|
||||||
type PRVersion struct {
|
|
||||||
VersionStr string
|
|
||||||
VersionNum uint64
|
|
||||||
IsNum bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewPRVersion creates a new valid prerelease version
|
|
||||||
func NewPRVersion(s string) (PRVersion, error) {
|
|
||||||
if len(s) == 0 {
|
|
||||||
return PRVersion{}, errors.New("Prerelease is empty")
|
|
||||||
}
|
|
||||||
v := PRVersion{}
|
|
||||||
if containsOnly(s, numbers) {
|
|
||||||
if hasLeadingZeroes(s) {
|
|
||||||
return PRVersion{}, fmt.Errorf("Numeric PreRelease version must not contain leading zeroes %q", s)
|
|
||||||
}
|
|
||||||
num, err := strconv.ParseUint(s, 10, 64)
|
|
||||||
|
|
||||||
// Might never be hit, but just in case
|
|
||||||
if err != nil {
|
|
||||||
return PRVersion{}, err
|
|
||||||
}
|
|
||||||
v.VersionNum = num
|
|
||||||
v.IsNum = true
|
|
||||||
} else if containsOnly(s, alphanum) {
|
|
||||||
v.VersionStr = s
|
|
||||||
v.IsNum = false
|
|
||||||
} else {
|
|
||||||
return PRVersion{}, fmt.Errorf("Invalid character(s) found in prerelease %q", s)
|
|
||||||
}
|
|
||||||
return v, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsNumeric checks if prerelease-version is numeric
|
|
||||||
func (v PRVersion) IsNumeric() bool {
|
|
||||||
return v.IsNum
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare compares two PreRelease Versions v and o:
|
|
||||||
// -1 == v is less than o
|
|
||||||
// 0 == v is equal to o
|
|
||||||
// 1 == v is greater than o
|
|
||||||
func (v PRVersion) Compare(o PRVersion) int {
|
|
||||||
if v.IsNum && !o.IsNum {
|
|
||||||
return -1
|
|
||||||
} else if !v.IsNum && o.IsNum {
|
|
||||||
return 1
|
|
||||||
} else if v.IsNum && o.IsNum {
|
|
||||||
if v.VersionNum == o.VersionNum {
|
|
||||||
return 0
|
|
||||||
} else if v.VersionNum > o.VersionNum {
|
|
||||||
return 1
|
|
||||||
} else {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
} else { // both are Alphas
|
|
||||||
if v.VersionStr == o.VersionStr {
|
|
||||||
return 0
|
|
||||||
} else if v.VersionStr > o.VersionStr {
|
|
||||||
return 1
|
|
||||||
} else {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PreRelease version to string
|
|
||||||
func (v PRVersion) String() string {
|
|
||||||
if v.IsNum {
|
|
||||||
return strconv.FormatUint(v.VersionNum, 10)
|
|
||||||
}
|
|
||||||
return v.VersionStr
|
|
||||||
}
|
|
||||||
|
|
||||||
func containsOnly(s string, set string) bool {
|
|
||||||
return strings.IndexFunc(s, func(r rune) bool {
|
|
||||||
return !strings.ContainsRune(set, r)
|
|
||||||
}) == -1
|
|
||||||
}
|
|
||||||
|
|
||||||
func hasLeadingZeroes(s string) bool {
|
|
||||||
return len(s) > 1 && s[0] == '0'
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewBuildVersion creates a new valid build version
|
|
||||||
func NewBuildVersion(s string) (string, error) {
|
|
||||||
if len(s) == 0 {
|
|
||||||
return "", errors.New("Buildversion is empty")
|
|
||||||
}
|
|
||||||
if !containsOnly(s, alphanum) {
|
|
||||||
return "", fmt.Errorf("Invalid character(s) found in build meta data %q", s)
|
|
||||||
}
|
|
||||||
return s, nil
|
|
||||||
}
|
|
||||||
28
vendor/github.com/blang/semver/sort.go
generated
vendored
28
vendor/github.com/blang/semver/sort.go
generated
vendored
|
|
@ -1,28 +0,0 @@
|
||||||
package semver
|
|
||||||
|
|
||||||
import (
|
|
||||||
"sort"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Versions represents multiple versions.
|
|
||||||
type Versions []Version
|
|
||||||
|
|
||||||
// Len returns length of version collection
|
|
||||||
func (s Versions) Len() int {
|
|
||||||
return len(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap swaps two versions inside the collection by its indices
|
|
||||||
func (s Versions) Swap(i, j int) {
|
|
||||||
s[i], s[j] = s[j], s[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Less checks if version at index i is less than version at index j
|
|
||||||
func (s Versions) Less(i, j int) bool {
|
|
||||||
return s[i].LT(s[j])
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sort sorts a slice of versions
|
|
||||||
func Sort(versions []Version) {
|
|
||||||
sort.Sort(Versions(versions))
|
|
||||||
}
|
|
||||||
30
vendor/github.com/blang/semver/sql.go
generated
vendored
30
vendor/github.com/blang/semver/sql.go
generated
vendored
|
|
@ -1,30 +0,0 @@
|
||||||
package semver
|
|
||||||
|
|
||||||
import (
|
|
||||||
"database/sql/driver"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Scan implements the database/sql.Scanner interface.
|
|
||||||
func (v *Version) Scan(src interface{}) (err error) {
|
|
||||||
var str string
|
|
||||||
switch src := src.(type) {
|
|
||||||
case string:
|
|
||||||
str = src
|
|
||||||
case []byte:
|
|
||||||
str = string(src)
|
|
||||||
default:
|
|
||||||
return fmt.Errorf("Version.Scan: cannot convert %T to string.", src)
|
|
||||||
}
|
|
||||||
|
|
||||||
if t, err := Parse(str); err == nil {
|
|
||||||
*v = t
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Value implements the database/sql/driver.Valuer interface.
|
|
||||||
func (v Version) Value() (driver.Value, error) {
|
|
||||||
return v.String(), nil
|
|
||||||
}
|
|
||||||
32
vendor/github.com/bmatcuk/doublestar/.gitignore
generated
vendored
32
vendor/github.com/bmatcuk/doublestar/.gitignore
generated
vendored
|
|
@ -1,32 +0,0 @@
|
||||||
# vi
|
|
||||||
*~
|
|
||||||
*.swp
|
|
||||||
*.swo
|
|
||||||
|
|
||||||
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
|
||||||
*.o
|
|
||||||
*.a
|
|
||||||
*.so
|
|
||||||
|
|
||||||
# Folders
|
|
||||||
_obj
|
|
||||||
_test
|
|
||||||
|
|
||||||
# Architecture specific extensions/prefixes
|
|
||||||
*.[568vq]
|
|
||||||
[568vq].out
|
|
||||||
|
|
||||||
*.cgo1.go
|
|
||||||
*.cgo2.c
|
|
||||||
_cgo_defun.c
|
|
||||||
_cgo_gotypes.go
|
|
||||||
_cgo_export.*
|
|
||||||
|
|
||||||
_testmain.go
|
|
||||||
|
|
||||||
*.exe
|
|
||||||
*.test
|
|
||||||
*.prof
|
|
||||||
|
|
||||||
# test directory
|
|
||||||
test/
|
|
||||||
15
vendor/github.com/bmatcuk/doublestar/.travis.yml
generated
vendored
15
vendor/github.com/bmatcuk/doublestar/.travis.yml
generated
vendored
|
|
@ -1,15 +0,0 @@
|
||||||
language: go
|
|
||||||
|
|
||||||
go:
|
|
||||||
- 1.11
|
|
||||||
- 1.12
|
|
||||||
|
|
||||||
before_install:
|
|
||||||
- go get -t -v ./...
|
|
||||||
|
|
||||||
script:
|
|
||||||
- go test -race -coverprofile=coverage.txt -covermode=atomic
|
|
||||||
|
|
||||||
after_success:
|
|
||||||
- bash <(curl -s https://codecov.io/bash)
|
|
||||||
|
|
||||||
22
vendor/github.com/bmatcuk/doublestar/LICENSE
generated
vendored
22
vendor/github.com/bmatcuk/doublestar/LICENSE
generated
vendored
|
|
@ -1,22 +0,0 @@
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2014 Bob Matcuk
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
109
vendor/github.com/bmatcuk/doublestar/README.md
generated
vendored
109
vendor/github.com/bmatcuk/doublestar/README.md
generated
vendored
|
|
@ -1,109 +0,0 @@
|
||||||

|
|
||||||
[](https://travis-ci.org/bmatcuk/doublestar)
|
|
||||||
[](https://codecov.io/github/bmatcuk/doublestar?branch=master)
|
|
||||||
|
|
||||||
# doublestar
|
|
||||||
|
|
||||||
**doublestar** is a [golang](http://golang.org/) implementation of path pattern
|
|
||||||
matching and globbing with support for "doublestar" (aka globstar: `**`)
|
|
||||||
patterns.
|
|
||||||
|
|
||||||
doublestar patterns match files and directories recursively. For example, if
|
|
||||||
you had the following directory structure:
|
|
||||||
|
|
||||||
```
|
|
||||||
grandparent
|
|
||||||
`-- parent
|
|
||||||
|-- child1
|
|
||||||
`-- child2
|
|
||||||
```
|
|
||||||
|
|
||||||
You could find the children with patterns such as: `**/child*`,
|
|
||||||
`grandparent/**/child?`, `**/parent/*`, or even just `**` by itself (which will
|
|
||||||
return all files and directories recursively).
|
|
||||||
|
|
||||||
Bash's globstar is doublestar's inspiration and, as such, works similarly.
|
|
||||||
Note that the doublestar must appear as a path component by itself. A pattern
|
|
||||||
such as `/path**` is invalid and will be treated the same as `/path*`, but
|
|
||||||
`/path*/**` should achieve the desired result. Additionally, `/path/**` will
|
|
||||||
match all directories and files under the path directory, but `/path/**/` will
|
|
||||||
only match directories.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
**doublestar** can be installed via `go get`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
go get github.com/bmatcuk/doublestar
|
|
||||||
```
|
|
||||||
|
|
||||||
To use it in your code, you must import it:
|
|
||||||
|
|
||||||
```go
|
|
||||||
import "github.com/bmatcuk/doublestar"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Functions
|
|
||||||
|
|
||||||
### Match
|
|
||||||
```go
|
|
||||||
func Match(pattern, name string) (bool, error)
|
|
||||||
```
|
|
||||||
|
|
||||||
Match returns true if `name` matches the file name `pattern`
|
|
||||||
([see below](#patterns)). `name` and `pattern` are split on forward slash (`/`)
|
|
||||||
characters and may be relative or absolute.
|
|
||||||
|
|
||||||
Note: `Match()` is meant to be a drop-in replacement for `path.Match()`. As
|
|
||||||
such, it always uses `/` as the path separator. If you are writing code that
|
|
||||||
will run on systems where `/` is not the path separator (such as Windows), you
|
|
||||||
want to use `PathMatch()` (below) instead.
|
|
||||||
|
|
||||||
|
|
||||||
### PathMatch
|
|
||||||
```go
|
|
||||||
func PathMatch(pattern, name string) (bool, error)
|
|
||||||
```
|
|
||||||
|
|
||||||
PathMatch returns true if `name` matches the file name `pattern`
|
|
||||||
([see below](#patterns)). The difference between Match and PathMatch is that
|
|
||||||
PathMatch will automatically use your system's path separator to split `name`
|
|
||||||
and `pattern`.
|
|
||||||
|
|
||||||
`PathMatch()` is meant to be a drop-in replacement for `filepath.Match()`.
|
|
||||||
|
|
||||||
### Glob
|
|
||||||
```go
|
|
||||||
func Glob(pattern string) ([]string, error)
|
|
||||||
```
|
|
||||||
|
|
||||||
Glob finds all files and directories in the filesystem that match `pattern`
|
|
||||||
([see below](#patterns)). `pattern` may be relative (to the current working
|
|
||||||
directory), or absolute.
|
|
||||||
|
|
||||||
`Glob()` is meant to be a drop-in replacement for `filepath.Glob()`.
|
|
||||||
|
|
||||||
## Patterns
|
|
||||||
|
|
||||||
**doublestar** supports the following special terms in the patterns:
|
|
||||||
|
|
||||||
Special Terms | Meaning
|
|
||||||
------------- | -------
|
|
||||||
`*` | matches any sequence of non-path-separators
|
|
||||||
`**` | matches any sequence of characters, including path separators
|
|
||||||
`?` | matches any single non-path-separator character
|
|
||||||
`[class]` | matches any single non-path-separator character against a class of characters ([see below](#character-classes))
|
|
||||||
`{alt1,...}` | matches a sequence of characters if one of the comma-separated alternatives matches
|
|
||||||
|
|
||||||
Any character with a special meaning can be escaped with a backslash (`\`).
|
|
||||||
|
|
||||||
### Character Classes
|
|
||||||
|
|
||||||
Character classes support the following:
|
|
||||||
|
|
||||||
Class | Meaning
|
|
||||||
---------- | -------
|
|
||||||
`[abc]` | matches any single character within the set
|
|
||||||
`[a-z]` | matches any single character in the range
|
|
||||||
`[^class]` | matches any single character which does *not* match the class
|
|
||||||
|
|
||||||
476
vendor/github.com/bmatcuk/doublestar/doublestar.go
generated
vendored
476
vendor/github.com/bmatcuk/doublestar/doublestar.go
generated
vendored
|
|
@ -1,476 +0,0 @@
|
||||||
package doublestar
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"path"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
"unicode/utf8"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ErrBadPattern indicates a pattern was malformed.
|
|
||||||
var ErrBadPattern = path.ErrBadPattern
|
|
||||||
|
|
||||||
// Split a path on the given separator, respecting escaping.
|
|
||||||
func splitPathOnSeparator(path string, separator rune) (ret []string) {
|
|
||||||
idx := 0
|
|
||||||
if separator == '\\' {
|
|
||||||
// if the separator is '\\', then we can just split...
|
|
||||||
ret = strings.Split(path, string(separator))
|
|
||||||
idx = len(ret)
|
|
||||||
} else {
|
|
||||||
// otherwise, we need to be careful of situations where the separator was escaped
|
|
||||||
cnt := strings.Count(path, string(separator))
|
|
||||||
if cnt == 0 {
|
|
||||||
return []string{path}
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = make([]string, cnt+1)
|
|
||||||
pathlen := len(path)
|
|
||||||
separatorLen := utf8.RuneLen(separator)
|
|
||||||
emptyEnd := false
|
|
||||||
for start := 0; start < pathlen; {
|
|
||||||
end := indexRuneWithEscaping(path[start:], separator)
|
|
||||||
if end == -1 {
|
|
||||||
emptyEnd = false
|
|
||||||
end = pathlen
|
|
||||||
} else {
|
|
||||||
emptyEnd = true
|
|
||||||
end += start
|
|
||||||
}
|
|
||||||
ret[idx] = path[start:end]
|
|
||||||
start = end + separatorLen
|
|
||||||
idx++
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the last rune is a path separator, we need to append an empty string to
|
|
||||||
// represent the last, empty path component. By default, the strings from
|
|
||||||
// make([]string, ...) will be empty, so we just need to icrement the count
|
|
||||||
if emptyEnd {
|
|
||||||
idx++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret[:idx]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find the first index of a rune in a string,
|
|
||||||
// ignoring any times the rune is escaped using "\".
|
|
||||||
func indexRuneWithEscaping(s string, r rune) int {
|
|
||||||
end := strings.IndexRune(s, r)
|
|
||||||
if end == -1 {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
if end > 0 && s[end-1] == '\\' {
|
|
||||||
start := end + utf8.RuneLen(r)
|
|
||||||
end = indexRuneWithEscaping(s[start:], r)
|
|
||||||
if end != -1 {
|
|
||||||
end += start
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return end
|
|
||||||
}
|
|
||||||
|
|
||||||
// Match returns true if name matches the shell file name pattern.
|
|
||||||
// The pattern syntax is:
|
|
||||||
//
|
|
||||||
// pattern:
|
|
||||||
// { term }
|
|
||||||
// term:
|
|
||||||
// '*' matches any sequence of non-path-separators
|
|
||||||
// '**' matches any sequence of characters, including
|
|
||||||
// path separators.
|
|
||||||
// '?' matches any single non-path-separator character
|
|
||||||
// '[' [ '^' ] { character-range } ']'
|
|
||||||
// character class (must be non-empty)
|
|
||||||
// '{' { term } [ ',' { term } ... ] '}'
|
|
||||||
// c matches character c (c != '*', '?', '\\', '[')
|
|
||||||
// '\\' c matches character c
|
|
||||||
//
|
|
||||||
// character-range:
|
|
||||||
// c matches character c (c != '\\', '-', ']')
|
|
||||||
// '\\' c matches character c
|
|
||||||
// lo '-' hi matches character c for lo <= c <= hi
|
|
||||||
//
|
|
||||||
// Match requires pattern to match all of name, not just a substring.
|
|
||||||
// The path-separator defaults to the '/' character. The only possible
|
|
||||||
// returned error is ErrBadPattern, when pattern is malformed.
|
|
||||||
//
|
|
||||||
// Note: this is meant as a drop-in replacement for path.Match() which
|
|
||||||
// always uses '/' as the path separator. If you want to support systems
|
|
||||||
// which use a different path separator (such as Windows), what you want
|
|
||||||
// is the PathMatch() function below.
|
|
||||||
//
|
|
||||||
func Match(pattern, name string) (bool, error) {
|
|
||||||
return matchWithSeparator(pattern, name, '/')
|
|
||||||
}
|
|
||||||
|
|
||||||
// PathMatch is like Match except that it uses your system's path separator.
|
|
||||||
// For most systems, this will be '/'. However, for Windows, it would be '\\'.
|
|
||||||
// Note that for systems where the path separator is '\\', escaping is
|
|
||||||
// disabled.
|
|
||||||
//
|
|
||||||
// Note: this is meant as a drop-in replacement for filepath.Match().
|
|
||||||
//
|
|
||||||
func PathMatch(pattern, name string) (bool, error) {
|
|
||||||
return matchWithSeparator(pattern, name, os.PathSeparator)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Match returns true if name matches the shell file name pattern.
|
|
||||||
// The pattern syntax is:
|
|
||||||
//
|
|
||||||
// pattern:
|
|
||||||
// { term }
|
|
||||||
// term:
|
|
||||||
// '*' matches any sequence of non-path-separators
|
|
||||||
// '**' matches any sequence of characters, including
|
|
||||||
// path separators.
|
|
||||||
// '?' matches any single non-path-separator character
|
|
||||||
// '[' [ '^' ] { character-range } ']'
|
|
||||||
// character class (must be non-empty)
|
|
||||||
// '{' { term } [ ',' { term } ... ] '}'
|
|
||||||
// c matches character c (c != '*', '?', '\\', '[')
|
|
||||||
// '\\' c matches character c
|
|
||||||
//
|
|
||||||
// character-range:
|
|
||||||
// c matches character c (c != '\\', '-', ']')
|
|
||||||
// '\\' c matches character c, unless separator is '\\'
|
|
||||||
// lo '-' hi matches character c for lo <= c <= hi
|
|
||||||
//
|
|
||||||
// Match requires pattern to match all of name, not just a substring.
|
|
||||||
// The only possible returned error is ErrBadPattern, when pattern
|
|
||||||
// is malformed.
|
|
||||||
//
|
|
||||||
func matchWithSeparator(pattern, name string, separator rune) (bool, error) {
|
|
||||||
patternComponents := splitPathOnSeparator(pattern, separator)
|
|
||||||
nameComponents := splitPathOnSeparator(name, separator)
|
|
||||||
return doMatching(patternComponents, nameComponents)
|
|
||||||
}
|
|
||||||
|
|
||||||
func doMatching(patternComponents, nameComponents []string) (matched bool, err error) {
|
|
||||||
// check for some base-cases
|
|
||||||
patternLen, nameLen := len(patternComponents), len(nameComponents)
|
|
||||||
if patternLen == 0 && nameLen == 0 {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
if patternLen == 0 || nameLen == 0 {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
patIdx, nameIdx := 0, 0
|
|
||||||
for patIdx < patternLen && nameIdx < nameLen {
|
|
||||||
if patternComponents[patIdx] == "**" {
|
|
||||||
// if our last pattern component is a doublestar, we're done -
|
|
||||||
// doublestar will match any remaining name components, if any.
|
|
||||||
if patIdx++; patIdx >= patternLen {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise, try matching remaining components
|
|
||||||
for ; nameIdx < nameLen; nameIdx++ {
|
|
||||||
if m, _ := doMatching(patternComponents[patIdx:], nameComponents[nameIdx:]); m {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// try matching components
|
|
||||||
matched, err = matchComponent(patternComponents[patIdx], nameComponents[nameIdx])
|
|
||||||
if !matched || err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
patIdx++
|
|
||||||
nameIdx++
|
|
||||||
}
|
|
||||||
return patIdx >= patternLen && nameIdx >= nameLen, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Glob returns the names of all files matching pattern or nil
|
|
||||||
// if there is no matching file. The syntax of pattern is the same
|
|
||||||
// as in Match. The pattern may describe hierarchical names such as
|
|
||||||
// /usr/*/bin/ed (assuming the Separator is '/').
|
|
||||||
//
|
|
||||||
// Glob ignores file system errors such as I/O errors reading directories.
|
|
||||||
// The only possible returned error is ErrBadPattern, when pattern
|
|
||||||
// is malformed.
|
|
||||||
//
|
|
||||||
// Your system path separator is automatically used. This means on
|
|
||||||
// systems where the separator is '\\' (Windows), escaping will be
|
|
||||||
// disabled.
|
|
||||||
//
|
|
||||||
// Note: this is meant as a drop-in replacement for filepath.Glob().
|
|
||||||
//
|
|
||||||
func Glob(pattern string) (matches []string, err error) {
|
|
||||||
patternComponents := splitPathOnSeparator(filepath.ToSlash(pattern), '/')
|
|
||||||
if len(patternComponents) == 0 {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// On Windows systems, this will return the drive name ('C:') for filesystem
|
|
||||||
// paths, or \\<server>\<share> for UNC paths. On other systems, it will
|
|
||||||
// return an empty string. Since absolute paths on non-Windows systems start
|
|
||||||
// with a slash, patternComponent[0] == volumeName will return true for both
|
|
||||||
// absolute Windows paths and absolute non-Windows paths, but we need a
|
|
||||||
// separate check for UNC paths.
|
|
||||||
volumeName := filepath.VolumeName(pattern)
|
|
||||||
isWindowsUNC := strings.HasPrefix(pattern, `\\`)
|
|
||||||
if isWindowsUNC || patternComponents[0] == volumeName {
|
|
||||||
startComponentIndex := 1
|
|
||||||
if isWindowsUNC {
|
|
||||||
startComponentIndex = 4
|
|
||||||
}
|
|
||||||
return doGlob(fmt.Sprintf("%s%s", volumeName, string(os.PathSeparator)), patternComponents[startComponentIndex:], matches)
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise, it's a relative pattern
|
|
||||||
return doGlob(".", patternComponents, matches)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform a glob
|
|
||||||
func doGlob(basedir string, components, matches []string) (m []string, e error) {
|
|
||||||
m = matches
|
|
||||||
e = nil
|
|
||||||
|
|
||||||
// figure out how many components we don't need to glob because they're
|
|
||||||
// just names without patterns - we'll use os.Lstat below to check if that
|
|
||||||
// path actually exists
|
|
||||||
patLen := len(components)
|
|
||||||
patIdx := 0
|
|
||||||
for ; patIdx < patLen; patIdx++ {
|
|
||||||
if strings.IndexAny(components[patIdx], "*?[{\\") >= 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if patIdx > 0 {
|
|
||||||
basedir = filepath.Join(basedir, filepath.Join(components[0:patIdx]...))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lstat will return an error if the file/directory doesn't exist
|
|
||||||
fi, err := os.Lstat(basedir)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// if there are no more components, we've found a match
|
|
||||||
if patIdx >= patLen {
|
|
||||||
m = append(m, basedir)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise, we need to check each item in the directory...
|
|
||||||
// first, if basedir is a symlink, follow it...
|
|
||||||
if (fi.Mode() & os.ModeSymlink) != 0 {
|
|
||||||
fi, err = os.Stat(basedir)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// confirm it's a directory...
|
|
||||||
if !fi.IsDir() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// read directory
|
|
||||||
dir, err := os.Open(basedir)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer dir.Close()
|
|
||||||
|
|
||||||
files, _ := dir.Readdir(-1)
|
|
||||||
lastComponent := (patIdx + 1) >= patLen
|
|
||||||
if components[patIdx] == "**" {
|
|
||||||
// if the current component is a doublestar, we'll try depth-first
|
|
||||||
for _, file := range files {
|
|
||||||
// if symlink, we may want to follow
|
|
||||||
if (file.Mode() & os.ModeSymlink) != 0 {
|
|
||||||
file, err = os.Stat(filepath.Join(basedir, file.Name()))
|
|
||||||
if err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if file.IsDir() {
|
|
||||||
// recurse into directories
|
|
||||||
if lastComponent {
|
|
||||||
m = append(m, filepath.Join(basedir, file.Name()))
|
|
||||||
}
|
|
||||||
m, e = doGlob(filepath.Join(basedir, file.Name()), components[patIdx:], m)
|
|
||||||
} else if lastComponent {
|
|
||||||
// if the pattern's last component is a doublestar, we match filenames, too
|
|
||||||
m = append(m, filepath.Join(basedir, file.Name()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if lastComponent {
|
|
||||||
return // we're done
|
|
||||||
}
|
|
||||||
patIdx++
|
|
||||||
lastComponent = (patIdx + 1) >= patLen
|
|
||||||
}
|
|
||||||
|
|
||||||
// check items in current directory and recurse
|
|
||||||
var match bool
|
|
||||||
for _, file := range files {
|
|
||||||
match, e = matchComponent(components[patIdx], file.Name())
|
|
||||||
if e != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if match {
|
|
||||||
if lastComponent {
|
|
||||||
m = append(m, filepath.Join(basedir, file.Name()))
|
|
||||||
} else {
|
|
||||||
m, e = doGlob(filepath.Join(basedir, file.Name()), components[patIdx+1:], m)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Attempt to match a single pattern component with a path component
|
|
||||||
func matchComponent(pattern, name string) (bool, error) {
|
|
||||||
// check some base cases
|
|
||||||
patternLen, nameLen := len(pattern), len(name)
|
|
||||||
if patternLen == 0 && nameLen == 0 {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
if patternLen == 0 {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
if nameLen == 0 && pattern != "*" {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// check for matches one rune at a time
|
|
||||||
patIdx, nameIdx := 0, 0
|
|
||||||
for patIdx < patternLen && nameIdx < nameLen {
|
|
||||||
patRune, patAdj := utf8.DecodeRuneInString(pattern[patIdx:])
|
|
||||||
nameRune, nameAdj := utf8.DecodeRuneInString(name[nameIdx:])
|
|
||||||
if patRune == '\\' {
|
|
||||||
// handle escaped runes
|
|
||||||
patIdx += patAdj
|
|
||||||
patRune, patAdj = utf8.DecodeRuneInString(pattern[patIdx:])
|
|
||||||
if patRune == utf8.RuneError {
|
|
||||||
return false, ErrBadPattern
|
|
||||||
} else if patRune == nameRune {
|
|
||||||
patIdx += patAdj
|
|
||||||
nameIdx += nameAdj
|
|
||||||
} else {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
} else if patRune == '*' {
|
|
||||||
// handle stars
|
|
||||||
if patIdx += patAdj; patIdx >= patternLen {
|
|
||||||
// a star at the end of a pattern will always
|
|
||||||
// match the rest of the path
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if we can make any matches
|
|
||||||
for ; nameIdx < nameLen; nameIdx += nameAdj {
|
|
||||||
if m, _ := matchComponent(pattern[patIdx:], name[nameIdx:]); m {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
} else if patRune == '[' {
|
|
||||||
// handle character sets
|
|
||||||
patIdx += patAdj
|
|
||||||
endClass := indexRuneWithEscaping(pattern[patIdx:], ']')
|
|
||||||
if endClass == -1 {
|
|
||||||
return false, ErrBadPattern
|
|
||||||
}
|
|
||||||
endClass += patIdx
|
|
||||||
classRunes := []rune(pattern[patIdx:endClass])
|
|
||||||
classRunesLen := len(classRunes)
|
|
||||||
if classRunesLen > 0 {
|
|
||||||
classIdx := 0
|
|
||||||
matchClass := false
|
|
||||||
if classRunes[0] == '^' {
|
|
||||||
classIdx++
|
|
||||||
}
|
|
||||||
for classIdx < classRunesLen {
|
|
||||||
low := classRunes[classIdx]
|
|
||||||
if low == '-' {
|
|
||||||
return false, ErrBadPattern
|
|
||||||
}
|
|
||||||
classIdx++
|
|
||||||
if low == '\\' {
|
|
||||||
if classIdx < classRunesLen {
|
|
||||||
low = classRunes[classIdx]
|
|
||||||
classIdx++
|
|
||||||
} else {
|
|
||||||
return false, ErrBadPattern
|
|
||||||
}
|
|
||||||
}
|
|
||||||
high := low
|
|
||||||
if classIdx < classRunesLen && classRunes[classIdx] == '-' {
|
|
||||||
// we have a range of runes
|
|
||||||
if classIdx++; classIdx >= classRunesLen {
|
|
||||||
return false, ErrBadPattern
|
|
||||||
}
|
|
||||||
high = classRunes[classIdx]
|
|
||||||
if high == '-' {
|
|
||||||
return false, ErrBadPattern
|
|
||||||
}
|
|
||||||
classIdx++
|
|
||||||
if high == '\\' {
|
|
||||||
if classIdx < classRunesLen {
|
|
||||||
high = classRunes[classIdx]
|
|
||||||
classIdx++
|
|
||||||
} else {
|
|
||||||
return false, ErrBadPattern
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if low <= nameRune && nameRune <= high {
|
|
||||||
matchClass = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if matchClass == (classRunes[0] == '^') {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return false, ErrBadPattern
|
|
||||||
}
|
|
||||||
patIdx = endClass + 1
|
|
||||||
nameIdx += nameAdj
|
|
||||||
} else if patRune == '{' {
|
|
||||||
// handle alternatives such as {alt1,alt2,...}
|
|
||||||
patIdx += patAdj
|
|
||||||
endOptions := indexRuneWithEscaping(pattern[patIdx:], '}')
|
|
||||||
if endOptions == -1 {
|
|
||||||
return false, ErrBadPattern
|
|
||||||
}
|
|
||||||
endOptions += patIdx
|
|
||||||
options := splitPathOnSeparator(pattern[patIdx:endOptions], ',')
|
|
||||||
patIdx = endOptions + 1
|
|
||||||
for _, o := range options {
|
|
||||||
m, e := matchComponent(o+pattern[patIdx:], name[nameIdx:])
|
|
||||||
if e != nil {
|
|
||||||
return false, e
|
|
||||||
}
|
|
||||||
if m {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
} else if patRune == '?' || patRune == nameRune {
|
|
||||||
// handle single-rune wildcard
|
|
||||||
patIdx += patAdj
|
|
||||||
nameIdx += nameAdj
|
|
||||||
} else {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if patIdx >= patternLen && nameIdx >= nameLen {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
if nameIdx >= nameLen && pattern[patIdx:] == "*" || pattern[patIdx:] == "**" {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
3
vendor/github.com/bmatcuk/doublestar/go.mod
generated
vendored
3
vendor/github.com/bmatcuk/doublestar/go.mod
generated
vendored
|
|
@ -1,3 +0,0 @@
|
||||||
module github.com/bmatcuk/doublestar
|
|
||||||
|
|
||||||
go 1.12
|
|
||||||
1
vendor/github.com/gogo/protobuf/proto/decode.go
generated
vendored
1
vendor/github.com/gogo/protobuf/proto/decode.go
generated
vendored
|
|
@ -186,7 +186,6 @@ func (p *Buffer) DecodeVarint() (x uint64, err error) {
|
||||||
if b&0x80 == 0 {
|
if b&0x80 == 0 {
|
||||||
goto done
|
goto done
|
||||||
}
|
}
|
||||||
// x -= 0x80 << 63 // Always zero.
|
|
||||||
|
|
||||||
return 0, errOverflow
|
return 0, errOverflow
|
||||||
|
|
||||||
|
|
|
||||||
63
vendor/github.com/gogo/protobuf/proto/deprecated.go
generated
vendored
Normal file
63
vendor/github.com/gogo/protobuf/proto/deprecated.go
generated
vendored
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
// Go support for Protocol Buffers - Google's data interchange format
|
||||||
|
//
|
||||||
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
|
// https://github.com/golang/protobuf
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package proto
|
||||||
|
|
||||||
|
import "errors"
|
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
type Stats struct{ Emalloc, Dmalloc, Encode, Decode, Chit, Cmiss, Size uint64 }
|
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func GetStats() Stats { return Stats{} }
|
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func MarshalMessageSet(interface{}) ([]byte, error) {
|
||||||
|
return nil, errors.New("proto: not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func UnmarshalMessageSet([]byte, interface{}) error {
|
||||||
|
return errors.New("proto: not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func MarshalMessageSetJSON(interface{}) ([]byte, error) {
|
||||||
|
return nil, errors.New("proto: not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func UnmarshalMessageSetJSON([]byte, interface{}) error {
|
||||||
|
return errors.New("proto: not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func RegisterMessageSetType(Message, int32, string) {}
|
||||||
3
vendor/github.com/gogo/protobuf/proto/extensions.go
generated
vendored
3
vendor/github.com/gogo/protobuf/proto/extensions.go
generated
vendored
|
|
@ -527,6 +527,7 @@ func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) {
|
||||||
// SetExtension sets the specified extension of pb to the specified value.
|
// SetExtension sets the specified extension of pb to the specified value.
|
||||||
func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error {
|
func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error {
|
||||||
if epb, ok := pb.(extensionsBytes); ok {
|
if epb, ok := pb.(extensionsBytes); ok {
|
||||||
|
ClearExtension(pb, extension)
|
||||||
newb, err := encodeExtension(extension, value)
|
newb, err := encodeExtension(extension, value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -544,7 +545,7 @@ func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error
|
||||||
}
|
}
|
||||||
typ := reflect.TypeOf(extension.ExtensionType)
|
typ := reflect.TypeOf(extension.ExtensionType)
|
||||||
if typ != reflect.TypeOf(value) {
|
if typ != reflect.TypeOf(value) {
|
||||||
return errors.New("proto: bad extension value type")
|
return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", value, extension.ExtensionType)
|
||||||
}
|
}
|
||||||
// nil extension values need to be caught early, because the
|
// nil extension values need to be caught early, because the
|
||||||
// encoder can't distinguish an ErrNil due to a nil extension
|
// encoder can't distinguish an ErrNil due to a nil extension
|
||||||
|
|
|
||||||
21
vendor/github.com/gogo/protobuf/proto/extensions_gogo.go
generated
vendored
21
vendor/github.com/gogo/protobuf/proto/extensions_gogo.go
generated
vendored
|
|
@ -154,6 +154,10 @@ func EncodeInternalExtension(m extendableProto, data []byte) (n int, err error)
|
||||||
return EncodeExtensionMap(m.extensionsWrite(), data)
|
return EncodeExtensionMap(m.extensionsWrite(), data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func EncodeInternalExtensionBackwards(m extendableProto, data []byte) (n int, err error) {
|
||||||
|
return EncodeExtensionMapBackwards(m.extensionsWrite(), data)
|
||||||
|
}
|
||||||
|
|
||||||
func EncodeExtensionMap(m map[int32]Extension, data []byte) (n int, err error) {
|
func EncodeExtensionMap(m map[int32]Extension, data []byte) (n int, err error) {
|
||||||
o := 0
|
o := 0
|
||||||
for _, e := range m {
|
for _, e := range m {
|
||||||
|
|
@ -169,6 +173,23 @@ func EncodeExtensionMap(m map[int32]Extension, data []byte) (n int, err error) {
|
||||||
return o, nil
|
return o, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func EncodeExtensionMapBackwards(m map[int32]Extension, data []byte) (n int, err error) {
|
||||||
|
o := 0
|
||||||
|
end := len(data)
|
||||||
|
for _, e := range m {
|
||||||
|
if err := e.Encode(); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
n := copy(data[end-len(e.enc):], e.enc)
|
||||||
|
if n != len(e.enc) {
|
||||||
|
return 0, io.ErrShortBuffer
|
||||||
|
}
|
||||||
|
end -= n
|
||||||
|
o += n
|
||||||
|
}
|
||||||
|
return o, nil
|
||||||
|
}
|
||||||
|
|
||||||
func GetRawExtension(m map[int32]Extension, id int32) ([]byte, error) {
|
func GetRawExtension(m map[int32]Extension, id int32) ([]byte, error) {
|
||||||
e := m[id]
|
e := m[id]
|
||||||
if err := e.Encode(); err != nil {
|
if err := e.Encode(); err != nil {
|
||||||
|
|
|
||||||
38
vendor/github.com/gogo/protobuf/proto/lib.go
generated
vendored
38
vendor/github.com/gogo/protobuf/proto/lib.go
generated
vendored
|
|
@ -341,26 +341,6 @@ type Message interface {
|
||||||
ProtoMessage()
|
ProtoMessage()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stats records allocation details about the protocol buffer encoders
|
|
||||||
// and decoders. Useful for tuning the library itself.
|
|
||||||
type Stats struct {
|
|
||||||
Emalloc uint64 // mallocs in encode
|
|
||||||
Dmalloc uint64 // mallocs in decode
|
|
||||||
Encode uint64 // number of encodes
|
|
||||||
Decode uint64 // number of decodes
|
|
||||||
Chit uint64 // number of cache hits
|
|
||||||
Cmiss uint64 // number of cache misses
|
|
||||||
Size uint64 // number of sizes
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set to true to enable stats collection.
|
|
||||||
const collectStats = false
|
|
||||||
|
|
||||||
var stats Stats
|
|
||||||
|
|
||||||
// GetStats returns a copy of the global Stats structure.
|
|
||||||
func GetStats() Stats { return stats }
|
|
||||||
|
|
||||||
// A Buffer is a buffer manager for marshaling and unmarshaling
|
// A Buffer is a buffer manager for marshaling and unmarshaling
|
||||||
// protocol buffers. It may be reused between invocations to
|
// protocol buffers. It may be reused between invocations to
|
||||||
// reduce memory usage. It is not necessary to use a Buffer;
|
// reduce memory usage. It is not necessary to use a Buffer;
|
||||||
|
|
@ -968,13 +948,19 @@ func isProto3Zero(v reflect.Value) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// ProtoPackageIsVersion2 is referenced from generated protocol buffer files
|
const (
|
||||||
// to assert that that code is compatible with this version of the proto package.
|
// ProtoPackageIsVersion3 is referenced from generated protocol buffer files
|
||||||
const GoGoProtoPackageIsVersion2 = true
|
// to assert that that code is compatible with this version of the proto package.
|
||||||
|
GoGoProtoPackageIsVersion3 = true
|
||||||
|
|
||||||
// ProtoPackageIsVersion1 is referenced from generated protocol buffer files
|
// ProtoPackageIsVersion2 is referenced from generated protocol buffer files
|
||||||
// to assert that that code is compatible with this version of the proto package.
|
// to assert that that code is compatible with this version of the proto package.
|
||||||
const GoGoProtoPackageIsVersion1 = true
|
GoGoProtoPackageIsVersion2 = true
|
||||||
|
|
||||||
|
// ProtoPackageIsVersion1 is referenced from generated protocol buffer files
|
||||||
|
// to assert that that code is compatible with this version of the proto package.
|
||||||
|
GoGoProtoPackageIsVersion1 = true
|
||||||
|
)
|
||||||
|
|
||||||
// InternalMessageInfo is a type used internally by generated .pb.go files.
|
// InternalMessageInfo is a type used internally by generated .pb.go files.
|
||||||
// This type is not intended to be used by non-generated code.
|
// This type is not intended to be used by non-generated code.
|
||||||
|
|
|
||||||
137
vendor/github.com/gogo/protobuf/proto/message_set.go
generated
vendored
137
vendor/github.com/gogo/protobuf/proto/message_set.go
generated
vendored
|
|
@ -36,13 +36,7 @@ package proto
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"sort"
|
|
||||||
"sync"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID.
|
// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID.
|
||||||
|
|
@ -145,46 +139,9 @@ func skipVarint(buf []byte) []byte {
|
||||||
return buf[i+1:]
|
return buf[i+1:]
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalMessageSet encodes the extension map represented by m in the message set wire format.
|
// unmarshalMessageSet decodes the extension map encoded in buf in the message set wire format.
|
||||||
// It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option.
|
|
||||||
func MarshalMessageSet(exts interface{}) ([]byte, error) {
|
|
||||||
return marshalMessageSet(exts, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
// marshaMessageSet implements above function, with the opt to turn on / off deterministic during Marshal.
|
|
||||||
func marshalMessageSet(exts interface{}, deterministic bool) ([]byte, error) {
|
|
||||||
switch exts := exts.(type) {
|
|
||||||
case *XXX_InternalExtensions:
|
|
||||||
var u marshalInfo
|
|
||||||
siz := u.sizeMessageSet(exts)
|
|
||||||
b := make([]byte, 0, siz)
|
|
||||||
return u.appendMessageSet(b, exts, deterministic)
|
|
||||||
|
|
||||||
case map[int32]Extension:
|
|
||||||
// This is an old-style extension map.
|
|
||||||
// Wrap it in a new-style XXX_InternalExtensions.
|
|
||||||
ie := XXX_InternalExtensions{
|
|
||||||
p: &struct {
|
|
||||||
mu sync.Mutex
|
|
||||||
extensionMap map[int32]Extension
|
|
||||||
}{
|
|
||||||
extensionMap: exts,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
var u marshalInfo
|
|
||||||
siz := u.sizeMessageSet(&ie)
|
|
||||||
b := make([]byte, 0, siz)
|
|
||||||
return u.appendMessageSet(b, &ie, deterministic)
|
|
||||||
|
|
||||||
default:
|
|
||||||
return nil, errors.New("proto: not an extension map")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format.
|
|
||||||
// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option.
|
// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option.
|
||||||
func UnmarshalMessageSet(buf []byte, exts interface{}) error {
|
func unmarshalMessageSet(buf []byte, exts interface{}) error {
|
||||||
var m map[int32]Extension
|
var m map[int32]Extension
|
||||||
switch exts := exts.(type) {
|
switch exts := exts.(type) {
|
||||||
case *XXX_InternalExtensions:
|
case *XXX_InternalExtensions:
|
||||||
|
|
@ -222,93 +179,3 @@ func UnmarshalMessageSet(buf []byte, exts interface{}) error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalMessageSetJSON encodes the extension map represented by m in JSON format.
|
|
||||||
// It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option.
|
|
||||||
func MarshalMessageSetJSON(exts interface{}) ([]byte, error) {
|
|
||||||
var m map[int32]Extension
|
|
||||||
switch exts := exts.(type) {
|
|
||||||
case *XXX_InternalExtensions:
|
|
||||||
var mu sync.Locker
|
|
||||||
m, mu = exts.extensionsRead()
|
|
||||||
if m != nil {
|
|
||||||
// Keep the extensions map locked until we're done marshaling to prevent
|
|
||||||
// races between marshaling and unmarshaling the lazily-{en,de}coded
|
|
||||||
// values.
|
|
||||||
mu.Lock()
|
|
||||||
defer mu.Unlock()
|
|
||||||
}
|
|
||||||
case map[int32]Extension:
|
|
||||||
m = exts
|
|
||||||
default:
|
|
||||||
return nil, errors.New("proto: not an extension map")
|
|
||||||
}
|
|
||||||
var b bytes.Buffer
|
|
||||||
b.WriteByte('{')
|
|
||||||
|
|
||||||
// Process the map in key order for deterministic output.
|
|
||||||
ids := make([]int32, 0, len(m))
|
|
||||||
for id := range m {
|
|
||||||
ids = append(ids, id)
|
|
||||||
}
|
|
||||||
sort.Sort(int32Slice(ids)) // int32Slice defined in text.go
|
|
||||||
|
|
||||||
for i, id := range ids {
|
|
||||||
ext := m[id]
|
|
||||||
msd, ok := messageSetMap[id]
|
|
||||||
if !ok {
|
|
||||||
// Unknown type; we can't render it, so skip it.
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if i > 0 && b.Len() > 1 {
|
|
||||||
b.WriteByte(',')
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Fprintf(&b, `"[%s]":`, msd.name)
|
|
||||||
|
|
||||||
x := ext.value
|
|
||||||
if x == nil {
|
|
||||||
x = reflect.New(msd.t.Elem()).Interface()
|
|
||||||
if err := Unmarshal(ext.enc, x.(Message)); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
d, err := json.Marshal(x)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b.Write(d)
|
|
||||||
}
|
|
||||||
b.WriteByte('}')
|
|
||||||
return b.Bytes(), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format.
|
|
||||||
// It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option.
|
|
||||||
func UnmarshalMessageSetJSON(buf []byte, exts interface{}) error {
|
|
||||||
// Common-case fast path.
|
|
||||||
if len(buf) == 0 || bytes.Equal(buf, []byte("{}")) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is fairly tricky, and it's not clear that it is needed.
|
|
||||||
return errors.New("TODO: UnmarshalMessageSetJSON not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
// A global registry of types that can be used in a MessageSet.
|
|
||||||
|
|
||||||
var messageSetMap = make(map[int32]messageSetDesc)
|
|
||||||
|
|
||||||
type messageSetDesc struct {
|
|
||||||
t reflect.Type // pointer to struct
|
|
||||||
name string
|
|
||||||
}
|
|
||||||
|
|
||||||
// RegisterMessageSetType is called from the generated code.
|
|
||||||
func RegisterMessageSetType(m Message, fieldNum int32, name string) {
|
|
||||||
messageSetMap[fieldNum] = messageSetDesc{
|
|
||||||
t: reflect.TypeOf(m),
|
|
||||||
name: name,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
75
vendor/github.com/gogo/protobuf/proto/properties.go
generated
vendored
75
vendor/github.com/gogo/protobuf/proto/properties.go
generated
vendored
|
|
@ -391,9 +391,6 @@ func GetProperties(t reflect.Type) *StructProperties {
|
||||||
sprop, ok := propertiesMap[t]
|
sprop, ok := propertiesMap[t]
|
||||||
propertiesMu.RUnlock()
|
propertiesMu.RUnlock()
|
||||||
if ok {
|
if ok {
|
||||||
if collectStats {
|
|
||||||
stats.Chit++
|
|
||||||
}
|
|
||||||
return sprop
|
return sprop
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -403,17 +400,20 @@ func GetProperties(t reflect.Type) *StructProperties {
|
||||||
return sprop
|
return sprop
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type (
|
||||||
|
oneofFuncsIface interface {
|
||||||
|
XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{})
|
||||||
|
}
|
||||||
|
oneofWrappersIface interface {
|
||||||
|
XXX_OneofWrappers() []interface{}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
// getPropertiesLocked requires that propertiesMu is held.
|
// getPropertiesLocked requires that propertiesMu is held.
|
||||||
func getPropertiesLocked(t reflect.Type) *StructProperties {
|
func getPropertiesLocked(t reflect.Type) *StructProperties {
|
||||||
if prop, ok := propertiesMap[t]; ok {
|
if prop, ok := propertiesMap[t]; ok {
|
||||||
if collectStats {
|
|
||||||
stats.Chit++
|
|
||||||
}
|
|
||||||
return prop
|
return prop
|
||||||
}
|
}
|
||||||
if collectStats {
|
|
||||||
stats.Cmiss++
|
|
||||||
}
|
|
||||||
|
|
||||||
prop := new(StructProperties)
|
prop := new(StructProperties)
|
||||||
// in case of recursive protos, fill this in now.
|
// in case of recursive protos, fill this in now.
|
||||||
|
|
@ -450,37 +450,40 @@ func getPropertiesLocked(t reflect.Type) *StructProperties {
|
||||||
// Re-order prop.order.
|
// Re-order prop.order.
|
||||||
sort.Sort(prop)
|
sort.Sort(prop)
|
||||||
|
|
||||||
type oneofMessage interface {
|
if isOneofMessage {
|
||||||
XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{})
|
|
||||||
}
|
|
||||||
if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); isOneofMessage && ok {
|
|
||||||
var oots []interface{}
|
var oots []interface{}
|
||||||
_, _, _, oots = om.XXX_OneofFuncs()
|
switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) {
|
||||||
|
case oneofFuncsIface:
|
||||||
// Interpret oneof metadata.
|
_, _, _, oots = m.XXX_OneofFuncs()
|
||||||
prop.OneofTypes = make(map[string]*OneofProperties)
|
case oneofWrappersIface:
|
||||||
for _, oot := range oots {
|
oots = m.XXX_OneofWrappers()
|
||||||
oop := &OneofProperties{
|
}
|
||||||
Type: reflect.ValueOf(oot).Type(), // *T
|
if len(oots) > 0 {
|
||||||
Prop: new(Properties),
|
// Interpret oneof metadata.
|
||||||
}
|
prop.OneofTypes = make(map[string]*OneofProperties)
|
||||||
sft := oop.Type.Elem().Field(0)
|
for _, oot := range oots {
|
||||||
oop.Prop.Name = sft.Name
|
oop := &OneofProperties{
|
||||||
oop.Prop.Parse(sft.Tag.Get("protobuf"))
|
Type: reflect.ValueOf(oot).Type(), // *T
|
||||||
// There will be exactly one interface field that
|
Prop: new(Properties),
|
||||||
// this new value is assignable to.
|
|
||||||
for i := 0; i < t.NumField(); i++ {
|
|
||||||
f := t.Field(i)
|
|
||||||
if f.Type.Kind() != reflect.Interface {
|
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
if !oop.Type.AssignableTo(f.Type) {
|
sft := oop.Type.Elem().Field(0)
|
||||||
continue
|
oop.Prop.Name = sft.Name
|
||||||
|
oop.Prop.Parse(sft.Tag.Get("protobuf"))
|
||||||
|
// There will be exactly one interface field that
|
||||||
|
// this new value is assignable to.
|
||||||
|
for i := 0; i < t.NumField(); i++ {
|
||||||
|
f := t.Field(i)
|
||||||
|
if f.Type.Kind() != reflect.Interface {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if !oop.Type.AssignableTo(f.Type) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
oop.Field = i
|
||||||
|
break
|
||||||
}
|
}
|
||||||
oop.Field = i
|
prop.OneofTypes[oop.Prop.OrigName] = oop
|
||||||
break
|
|
||||||
}
|
}
|
||||||
prop.OneofTypes[oop.Prop.OrigName] = oop
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue