From 8a430113f637f6bbf254c7fe126ac09218bbe219 Mon Sep 17 00:00:00 2001 From: Sander van Harmelen Date: Mon, 8 Apr 2019 11:13:14 +0200 Subject: [PATCH] gomod: update `go-tfe` --- go.mod | 8 +- go.sum | 22 +- .../hashicorp/go-retryablehttp/client.go | 24 +- vendor/github.com/hashicorp/go-slug/go.mod | 2 + vendor/github.com/hashicorp/go-slug/slug.go | 19 +- vendor/github.com/hashicorp/go-tfe/go.mod | 9 +- vendor/github.com/hashicorp/go-tfe/go.sum | 18 +- .../go-tfe/notification_configuration.go | 294 ++++++++++++++++++ .../hashicorp/go-tfe/state_version.go | 4 + vendor/github.com/hashicorp/go-tfe/tfe.go | 43 +-- .../hashicorp/go-tfe/type_helpers.go | 5 + .../github.com/hashicorp/go-tfe/variable.go | 5 +- vendor/github.com/hashicorp/go-uuid/uuid.go | 24 +- vendor/modules.txt | 10 +- 14 files changed, 417 insertions(+), 70 deletions(-) create mode 100644 vendor/github.com/hashicorp/go-tfe/notification_configuration.go diff --git a/go.mod b/go.mod index 01e199be4..4970ed1c4 100644 --- a/go.mod +++ b/go.mod @@ -52,11 +52,11 @@ require ( github.com/hashicorp/go-msgpack v0.0.0-20150518234257-fa3f63826f7c // indirect github.com/hashicorp/go-multierror v1.0.0 github.com/hashicorp/go-plugin v0.0.0-20190322172744-52e1c4730856 - github.com/hashicorp/go-retryablehttp v0.5.1 + github.com/hashicorp/go-retryablehttp v0.5.2 github.com/hashicorp/go-rootcerts v1.0.0 github.com/hashicorp/go-sockaddr v0.0.0-20180320115054-6d291a969b86 // indirect - github.com/hashicorp/go-tfe v0.3.11 - github.com/hashicorp/go-uuid v1.0.0 + github.com/hashicorp/go-tfe v0.3.14 + github.com/hashicorp/go-uuid v1.0.1 github.com/hashicorp/go-version v1.1.0 github.com/hashicorp/golang-lru v0.5.0 // indirect github.com/hashicorp/hcl v0.0.0-20170504190234-a4b07c25de5f @@ -117,4 +117,6 @@ require ( google.golang.org/api v0.1.0 google.golang.org/grpc v1.18.0 gopkg.in/vmihailenco/msgpack.v2 v2.9.1 // indirect + labix.org/v2/mgo v0.0.0-20140701140051-000000000287 // indirect + launchpad.net/gocheck v0.0.0-20140225173054-000000000087 // indirect ) diff --git a/go.sum b/go.sum index a3d613e85..1aa5c9667 100644 --- a/go.sum +++ b/go.sum @@ -179,20 +179,22 @@ github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uP github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-plugin v0.0.0-20190322172744-52e1c4730856 h1:FHiCaU46W1WoqApsaGGIKbNkhQ6v71hJrOf2INQMLUo= github.com/hashicorp/go-plugin v0.0.0-20190322172744-52e1c4730856/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= -github.com/hashicorp/go-retryablehttp v0.5.1 h1:Vsx5XKPqPs3M6sM4U4GWyUqFS8aBiL9U5gkgvpkg4SE= -github.com/hashicorp/go-retryablehttp v0.5.1/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +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/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= -github.com/hashicorp/go-slug v0.2.0 h1:MVdZAkTmDsUi1AT+3NQDsn8n3ssnVSIHwiM6RcUHvE8= -github.com/hashicorp/go-slug v0.2.0/go.mod h1:+zDycQOzGqOqMW7Kn2fp9vz/NtqpMLQlgb9JUF+0km4= +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 h1:7YOlAIO2YWnJZkQp7B5eFykaIY7C9JndqAFQyVV5BhM= github.com/hashicorp/go-sockaddr v0.0.0-20180320115054-6d291a969b86/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-tfe v0.3.11 h1:PHw0f1XeriVkqBikhXgZm/t65GR/fEH1iUl/d/9qKbU= -github.com/hashicorp/go-tfe v0.3.11/go.mod h1:LHLchj07PCYgQqcyE5Sz+g4zrMNW+nALKbiSNTZedEs= +github.com/hashicorp/go-tfe v0.3.14 h1:1eWmq4RAICGufydNUWu7ahb0gtq24pN9jatD2FkdxdE= +github.com/hashicorp/go-tfe v0.3.14/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/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= @@ -200,8 +202,6 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ 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/hcl2 v0.0.0-20181208003705-670926858200/go.mod h1:ShfpTh661oAaxo7VcNxg0zcZW6jvMa7Moy2oFx7e5dE= -github.com/hashicorp/hcl2 v0.0.0-20190327223817-3fb4ed0d9260 h1:C3vhYEXk8ihs+Xvq093axRyYhfLERrZ6Uv5tfRw9yvw= -github.com/hashicorp/hcl2 v0.0.0-20190327223817-3fb4ed0d9260/go.mod h1:HtEzazM5AZ9fviNEof8QZB4T1Vz9UhHrGhnMPzl//Ek= github.com/hashicorp/hcl2 v0.0.0-20190402200843-8b450a7d58f9 h1:zCITwiA0cog6aYr/a/McDHKtgsEpYxXvTIgugv5iu8o= github.com/hashicorp/hcl2 v0.0.0-20190402200843-8b450a7d58f9/go.mod h1:HtEzazM5AZ9fviNEof8QZB4T1Vz9UhHrGhnMPzl//Ek= github.com/hashicorp/hil v0.0.0-20190212112733-ab17b08d6590 h1:2yzhWGdgQUWZUCNK+AoO35V+HTsgEmcM4J9IkArh7PI= @@ -471,6 +471,8 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 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/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/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-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= @@ -512,5 +514,9 @@ grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJd honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= +labix.org/v2/mgo v0.0.0-20140701140051-000000000287 h1:L0cnkNl4TfAXzvdrqsYEmxOHOCv2p5I3taaReO8BWFs= +labix.org/v2/mgo v0.0.0-20140701140051-000000000287/go.mod h1:Lg7AYkt1uXJoR9oeSZ3W/8IXLdvOfIITgZnommstyz4= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/vendor/github.com/hashicorp/go-retryablehttp/client.go b/vendor/github.com/hashicorp/go-retryablehttp/client.go index e54c3cec1..15f1e8850 100644 --- a/vendor/github.com/hashicorp/go-retryablehttp/client.go +++ b/vendor/github.com/hashicorp/go-retryablehttp/client.go @@ -36,7 +36,7 @@ import ( "strings" "time" - "github.com/hashicorp/go-cleanhttp" + cleanhttp "github.com/hashicorp/go-cleanhttp" ) var ( @@ -81,6 +81,28 @@ func (r *Request) WithContext(ctx context.Context) *Request { return r } +// BodyBytes allows accessing the request body. It is an analogue to +// http.Request's Body variable, but it returns a copy of the underlying data +// rather than consuming it. +// +// This function is not thread-safe; do not call it at the same time as another +// call, or at the same time this request is being used with Client.Do. +func (r *Request) BodyBytes() ([]byte, error) { + if r.body == nil { + return nil, nil + } + body, err := r.body() + if err != nil { + return nil, err + } + buf := new(bytes.Buffer) + _, err = buf.ReadFrom(body) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + // NewRequest creates a new wrapped request. func NewRequest(method, url string, rawBody interface{}) (*Request, error) { var err error diff --git a/vendor/github.com/hashicorp/go-slug/go.mod b/vendor/github.com/hashicorp/go-slug/go.mod index 4b3ec723b..49ed430a4 100644 --- a/vendor/github.com/hashicorp/go-slug/go.mod +++ b/vendor/github.com/hashicorp/go-slug/go.mod @@ -1 +1,3 @@ module github.com/hashicorp/go-slug + +go 1.12 diff --git a/vendor/github.com/hashicorp/go-slug/slug.go b/vendor/github.com/hashicorp/go-slug/slug.go index 5f8631ea6..8dd407863 100644 --- a/vendor/github.com/hashicorp/go-slug/slug.go +++ b/vendor/github.com/hashicorp/go-slug/slug.go @@ -75,11 +75,20 @@ func packWalkFn(root, src, dst string, tarW *tar.Writer, meta *Meta, dereference return nil } - // Skip the .terraform directory, except for the modules subdirectory. - if strings.Contains(subpath, ".terraform") && info.Name() != ".terraform" { - if !strings.Contains(subpath, filepath.Clean(".terraform/modules")) { - return filepath.SkipDir - } + // Ignore the .terraform directory itself. + if info.IsDir() && info.Name() == ".terraform" { + return nil + } + + // Ignore any files in the .terraform directory. + if !info.IsDir() && filepath.Dir(subpath) == ".terraform" { + return nil + } + + // Skip .terraform subdirectories, except for the modules subdirectory. + if strings.HasPrefix(subpath, ".terraform"+string(filepath.Separator)) && + !strings.HasPrefix(subpath, filepath.Clean(".terraform/modules")) { + return filepath.SkipDir } // Get the relative path from the initial root directory. diff --git a/vendor/github.com/hashicorp/go-tfe/go.mod b/vendor/github.com/hashicorp/go-tfe/go.mod index 2036923fb..f428ce27c 100644 --- a/vendor/github.com/hashicorp/go-tfe/go.mod +++ b/vendor/github.com/hashicorp/go-tfe/go.mod @@ -1,12 +1,13 @@ module github.com/hashicorp/go-tfe require ( + github.com/davecgh/go-spew v1.1.1 // indirect github.com/google/go-querystring v1.0.0 github.com/hashicorp/go-cleanhttp v0.5.0 - github.com/hashicorp/go-retryablehttp v0.5.1 - github.com/hashicorp/go-slug v0.2.0 - github.com/hashicorp/go-uuid v1.0.0 + github.com/hashicorp/go-retryablehttp v0.5.2 + github.com/hashicorp/go-slug v0.3.0 + github.com/hashicorp/go-uuid v1.0.1 github.com/stretchr/testify v1.3.0 github.com/svanharmelen/jsonapi v0.0.0-20180618144545-0c0828c3f16d - golang.org/x/time v0.0.0-20181108054448-85acf8d2951c + golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 ) diff --git a/vendor/github.com/hashicorp/go-tfe/go.sum b/vendor/github.com/hashicorp/go-tfe/go.sum index c9b8da2f8..cc8c7bbbb 100644 --- a/vendor/github.com/hashicorp/go-tfe/go.sum +++ b/vendor/github.com/hashicorp/go-tfe/go.sum @@ -1,15 +1,17 @@ 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.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/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-retryablehttp v0.5.1 h1:Vsx5XKPqPs3M6sM4U4GWyUqFS8aBiL9U5gkgvpkg4SE= -github.com/hashicorp/go-retryablehttp v0.5.1/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-slug v0.2.0 h1:MVdZAkTmDsUi1AT+3NQDsn8n3ssnVSIHwiM6RcUHvE8= -github.com/hashicorp/go-slug v0.2.0/go.mod h1:+zDycQOzGqOqMW7Kn2fp9vz/NtqpMLQlgb9JUF+0km4= -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-retryablehttp v0.5.2 h1:AoISa4P4IsW0/m4T6St8Yw38gTl5GtBAgfkhYh1xAz4= +github.com/hashicorp/go-retryablehttp v0.5.2/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +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-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -17,5 +19,5 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0 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= -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-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/vendor/github.com/hashicorp/go-tfe/notification_configuration.go b/vendor/github.com/hashicorp/go-tfe/notification_configuration.go new file mode 100644 index 000000000..fe269e2b0 --- /dev/null +++ b/vendor/github.com/hashicorp/go-tfe/notification_configuration.go @@ -0,0 +1,294 @@ +package tfe + +import ( + "context" + "errors" + "fmt" + "net/http" + "net/url" + "time" +) + +// Compile-time proof of interface implementation. +var _ NotificationConfigurations = (*notificationConfigurations)(nil) + +// NotificationConfigurations describes all the Notification Configuration +// related methods that the Terraform Enterprise API supports. +// +// TFE API docs: +// https://www.terraform.io/docs/enterprise/api/notification-configurations.html +type NotificationConfigurations interface { + // List all the notification configurations within a workspace. + List(ctx context.Context, workspaceID string, options NotificationConfigurationListOptions) (*NotificationConfigurationList, error) + + // Create a new notification configuration with the given options. + Create(ctx context.Context, workspaceID string, options NotificationConfigurationCreateOptions) (*NotificationConfiguration, error) + + // Read a notification configuration by its ID. + Read(ctx context.Context, notificationConfigurationID string) (*NotificationConfiguration, error) + + // Update an existing notification configuration. + Update(ctx context.Context, notificationConfigurationID string, options NotificationConfigurationUpdateOptions) (*NotificationConfiguration, error) + + // Delete a notification configuration by its ID. + Delete(ctx context.Context, notificationConfigurationID string) error + + // Verify a notification configuration by its ID. + Verify(ctx context.Context, notificationConfigurationID string) (*NotificationConfiguration, error) +} + +// notificationConfigurations implements NotificationConfigurations. +type notificationConfigurations struct { + client *Client +} + +// List of available notification triggers. +const ( + NotificationTriggerCreated string = "run:created" + NotificationTriggerPlanning string = "run:planning" + NotificationTriggerNeedsAttention string = "run:needs_attention" + NotificationTriggerApplying string = "run:applying" + NotificationTriggerCompleted string = "run:completed" + NotificationTriggerErrored string = "run:errored" +) + +// NotificationDestinationType represents the destination type of the +// notification configuration. +type NotificationDestinationType string + +// List of available notification destination types. +const ( + NotificationDestinationTypeSlack NotificationDestinationType = "slack" + NotificationDestinationTypeGeneric NotificationDestinationType = "generic" +) + +// NotificationConfigurationList represents a list of Notification +// Configurations. +type NotificationConfigurationList struct { + *Pagination + Items []*NotificationConfiguration +} + +// NotificationConfiguration represents a Notification Configuration. +type NotificationConfiguration struct { + ID string `jsonapi:"primary,notification-configurations"` + CreatedAt time.Time `jsonapi:"attr,created-at,iso8601"` + DeliveryResponses []*DeliveryResponse `jsonapi:"attr,delivery-responses"` + DestinationType NotificationDestinationType `jsonapi:"attr,destination-type"` + Enabled bool `jsonapi:"attr,enabled"` + Name string `jsonapi:"attr,name"` + Token string `jsonapi:"attr,token"` + Triggers []string `jsonapi:"attr,triggers"` + UpdatedAt time.Time `jsonapi:"attr,updated-at,iso8601"` + URL string `jsonapi:"attr,url"` +} + +// DeliveryResponse represents a notification configuration delivery response. +type DeliveryResponse struct { + Body string `json:"body"` + Code int `json:"code"` + Headers http.Header `json:"headers"` + SentAt time.Time `json:"sent-at,iso8601"` + Successful bool `json:"successful"` + URL string `json:"url"` +} + +// NotificationConfigurationListOptions represents the options for listing +// notification configurations. +type NotificationConfigurationListOptions struct { + ListOptions +} + +// List all the notification configurations associated with a workspace. +func (s *notificationConfigurations) List(ctx context.Context, workspaceID string, options NotificationConfigurationListOptions) (*NotificationConfigurationList, error) { + if !validStringID(&workspaceID) { + return nil, errors.New("invalid value for workspace ID") + } + + u := fmt.Sprintf("workspaces/%s/notification-configurations", url.QueryEscape(workspaceID)) + req, err := s.client.newRequest("GET", u, options) + if err != nil { + return nil, err + } + + ncl := &NotificationConfigurationList{} + err = s.client.do(ctx, req, ncl) + if err != nil { + return nil, err + } + + return ncl, nil +} + +// NotificationConfigurationCreateOptions represents the options for +// creating a new notification configuration. +type NotificationConfigurationCreateOptions struct { + // For internal use only! + ID string `jsonapi:"primary,notification-configurations"` + + // The destination type of the notification configuration + DestinationType *NotificationDestinationType `jsonapi:"attr,destination-type"` + + // Whether the notification configuration should be enabled or not + Enabled *bool `jsonapi:"attr,enabled"` + + // The name of the notification configuration + Name *string `jsonapi:"attr,name"` + + // The token of the notification configuration + Token *string `jsonapi:"attr,token,omitempty"` + + // The destination type of the notification configuration + Triggers []string `jsonapi:"attr,triggers,omitempty"` + + // The url of the notification configuration + URL *string `jsonapi:"attr,url"` +} + +func (o NotificationConfigurationCreateOptions) valid() error { + if o.DestinationType == nil { + return errors.New("destination type is required") + } + if o.Enabled == nil { + return errors.New("enabled is required") + } + if !validString(o.Name) { + return errors.New("name is required") + } + if !validString(o.URL) { + return errors.New("url is required") + } + return nil +} + +// Creates a notification configuration with the given options. +func (s *notificationConfigurations) Create(ctx context.Context, workspaceID string, options NotificationConfigurationCreateOptions) (*NotificationConfiguration, error) { + if !validStringID(&workspaceID) { + return nil, errors.New("invalid value for workspace ID") + } + if err := options.valid(); err != nil { + return nil, err + } + + // Make sure we don't send a user provided ID. + options.ID = "" + + u := fmt.Sprintf("workspaces/%s/notification-configurations", url.QueryEscape(workspaceID)) + req, err := s.client.newRequest("POST", u, &options) + if err != nil { + return nil, err + } + + nc := &NotificationConfiguration{} + err = s.client.do(ctx, req, nc) + if err != nil { + return nil, err + } + + return nc, nil +} + +// Read a notitification configuration by its ID. +func (s *notificationConfigurations) Read(ctx context.Context, notificationConfigurationID string) (*NotificationConfiguration, error) { + if !validStringID(¬ificationConfigurationID) { + return nil, errors.New("invalid value for notification configuration ID") + } + + u := fmt.Sprintf("notification-configurations/%s", url.QueryEscape(notificationConfigurationID)) + req, err := s.client.newRequest("GET", u, nil) + if err != nil { + return nil, err + } + + nc := &NotificationConfiguration{} + err = s.client.do(ctx, req, nc) + if err != nil { + return nil, err + } + + return nc, nil +} + +// NotificationConfigurationUpdateOptions represents the options for +// updating a existing notification configuration. +type NotificationConfigurationUpdateOptions struct { + // For internal use only! + ID string `jsonapi:"primary,notification-configurations"` + + // Whether the notification configuration should be enabled or not + Enabled *bool `jsonapi:"attr,enabled,omitempty"` + + // The name of the notification configuration + Name *string `jsonapi:"attr,name,omitempty"` + + // The token of the notification configuration + Token *string `jsonapi:"attr,token,omitempty"` + + // The destination type of the notification configuration + Triggers []string `jsonapi:"attr,triggers,omitempty"` + + // The url of the notification configuration + URL *string `jsonapi:"attr,url,omitempty"` +} + +// Updates a notification configuration with the given options. +func (s *notificationConfigurations) Update(ctx context.Context, notificationConfigurationID string, options NotificationConfigurationUpdateOptions) (*NotificationConfiguration, error) { + if !validStringID(¬ificationConfigurationID) { + return nil, errors.New("invalid value for notification configuration ID") + } + + // Make sure we don't send a user provided ID. + options.ID = "" + + u := fmt.Sprintf("notification-configurations/%s", url.QueryEscape(notificationConfigurationID)) + req, err := s.client.newRequest("PATCH", u, &options) + if err != nil { + return nil, err + } + + nc := &NotificationConfiguration{} + err = s.client.do(ctx, req, nc) + if err != nil { + return nil, err + } + + return nc, nil +} + +// Delete a notifications configuration by its ID. +func (s *notificationConfigurations) Delete(ctx context.Context, notificationConfigurationID string) error { + if !validStringID(¬ificationConfigurationID) { + return errors.New("invalid value for notification configuration ID") + } + + u := fmt.Sprintf("notification-configurations/%s", url.QueryEscape(notificationConfigurationID)) + req, err := s.client.newRequest("DELETE", u, nil) + if err != nil { + return err + } + + return s.client.do(ctx, req, nil) +} + +// Verifies a notification configuration by delivering a verification +// payload to the configured url. +func (s *notificationConfigurations) Verify(ctx context.Context, notificationConfigurationID string) (*NotificationConfiguration, error) { + if !validStringID(¬ificationConfigurationID) { + return nil, errors.New("invalid value for notification configuration ID") + } + + u := fmt.Sprintf( + "notification-configurations/%s/actions/verify", url.QueryEscape(notificationConfigurationID)) + req, err := s.client.newRequest("POST", u, nil) + if err != nil { + return nil, err + } + + nc := &NotificationConfiguration{} + err = s.client.do(ctx, req, nc) + if err != nil { + return nil, err + } + + return nc, nil +} diff --git a/vendor/github.com/hashicorp/go-tfe/state_version.go b/vendor/github.com/hashicorp/go-tfe/state_version.go index 768bd5125..36c493ac5 100644 --- a/vendor/github.com/hashicorp/go-tfe/state_version.go +++ b/vendor/github.com/hashicorp/go-tfe/state_version.go @@ -112,6 +112,10 @@ type StateVersionCreateOptions struct { // The base64 encoded state. State *string `jsonapi:"attr,state"` + // Force can be set to skip certain validations. Wrong use + // of this flag can cause data loss, so USE WITH CAUTION! + Force *bool `jsonapi:"attr,force"` + // Specifies the run to associate the state with. Run *Run `jsonapi:"relation,run,omitempty"` } diff --git a/vendor/github.com/hashicorp/go-tfe/tfe.go b/vendor/github.com/hashicorp/go-tfe/tfe.go index 79188bd97..00cda2ea2 100644 --- a/vendor/github.com/hashicorp/go-tfe/tfe.go +++ b/vendor/github.com/hashicorp/go-tfe/tfe.go @@ -104,26 +104,27 @@ type Client struct { retryLogHook RetryLogHook retryServerErrors bool - Applies Applies - ConfigurationVersions ConfigurationVersions - OAuthClients OAuthClients - OAuthTokens OAuthTokens - Organizations Organizations - OrganizationTokens OrganizationTokens - Plans Plans - Policies Policies - PolicyChecks PolicyChecks - PolicySets PolicySets - Runs Runs - SSHKeys SSHKeys - StateVersions StateVersions - Teams Teams - TeamAccess TeamAccesses - TeamMembers TeamMembers - TeamTokens TeamTokens - Users Users - Variables Variables - Workspaces Workspaces + Applies Applies + ConfigurationVersions ConfigurationVersions + NotificationConfigurations NotificationConfigurations + OAuthClients OAuthClients + OAuthTokens OAuthTokens + Organizations Organizations + OrganizationTokens OrganizationTokens + Plans Plans + Policies Policies + PolicyChecks PolicyChecks + PolicySets PolicySets + Runs Runs + SSHKeys SSHKeys + StateVersions StateVersions + Teams Teams + TeamAccess TeamAccesses + TeamMembers TeamMembers + TeamTokens TeamTokens + Users Users + Variables Variables + Workspaces Workspaces } // NewClient creates a new Terraform Enterprise API client. @@ -194,6 +195,7 @@ func NewClient(cfg *Config) (*Client, error) { // Create the services. client.Applies = &applies{client: client} client.ConfigurationVersions = &configurationVersions{client: client} + client.NotificationConfigurations = ¬ificationConfigurations{client: client} client.OAuthClients = &oAuthClients{client: client} client.OAuthTokens = &oAuthTokens{client: client} client.Organizations = &organizations{client: client} @@ -297,6 +299,7 @@ func (c *Client) configureLimiter() error { req.Header[k] = v } req.Header.Set("Accept", "application/vnd.api+json") + req.Header.Set("Authorization", "Bearer "+c.token) // Make a single request to retrieve the rate limit headers. resp, err := c.http.HTTPClient.Do(req) diff --git a/vendor/github.com/hashicorp/go-tfe/type_helpers.go b/vendor/github.com/hashicorp/go-tfe/type_helpers.go index 30df01e49..87f497dd2 100644 --- a/vendor/github.com/hashicorp/go-tfe/type_helpers.go +++ b/vendor/github.com/hashicorp/go-tfe/type_helpers.go @@ -35,6 +35,11 @@ func Int64(v int64) *int64 { return &v } +// NotificationDestination returns a pointer to the given notification configuration destination type +func NotificationDestination(v NotificationDestinationType) *NotificationDestinationType { + return &v +} + // ServiceProvider returns a pointer to the given service provider type. func ServiceProvider(v ServiceProviderType) *ServiceProviderType { return &v diff --git a/vendor/github.com/hashicorp/go-tfe/variable.go b/vendor/github.com/hashicorp/go-tfe/variable.go index 9434cd413..eb3dbc6e5 100644 --- a/vendor/github.com/hashicorp/go-tfe/variable.go +++ b/vendor/github.com/hashicorp/go-tfe/variable.go @@ -110,7 +110,7 @@ type VariableCreateOptions struct { Key *string `jsonapi:"attr,key"` // The value of the variable. - Value *string `jsonapi:"attr,value"` + Value *string `jsonapi:"attr,value,omitempty"` // Whether this is a Terraform or environment variable. Category *CategoryType `jsonapi:"attr,category"` @@ -129,9 +129,6 @@ func (o VariableCreateOptions) valid() error { if !validString(o.Key) { return errors.New("key is required") } - if !validString(o.Value) { - return errors.New("value is required") - } if o.Category == nil { return errors.New("category is required") } diff --git a/vendor/github.com/hashicorp/go-uuid/uuid.go b/vendor/github.com/hashicorp/go-uuid/uuid.go index ff9364c40..911227f61 100644 --- a/vendor/github.com/hashicorp/go-uuid/uuid.go +++ b/vendor/github.com/hashicorp/go-uuid/uuid.go @@ -15,9 +15,11 @@ func GenerateRandomBytes(size int) ([]byte, error) { return buf, nil } +const uuidLen = 16 + // GenerateUUID is used to generate a random UUID func GenerateUUID() (string, error) { - buf, err := GenerateRandomBytes(16) + buf, err := GenerateRandomBytes(uuidLen) if err != nil { return "", err } @@ -25,11 +27,11 @@ func GenerateUUID() (string, error) { } func FormatUUID(buf []byte) (string, error) { - if len(buf) != 16 { - return "", fmt.Errorf("wrong length byte slice (%d)", len(buf)) + if buflen := len(buf); buflen != uuidLen { + return "", fmt.Errorf("wrong length byte slice (%d)", buflen) } - return fmt.Sprintf("%08x-%04x-%04x-%04x-%12x", + return fmt.Sprintf("%x-%x-%x-%x-%x", buf[0:4], buf[4:6], buf[6:8], @@ -38,16 +40,14 @@ func FormatUUID(buf []byte) (string, error) { } func ParseUUID(uuid string) ([]byte, error) { - if len(uuid) != 36 { + if len(uuid) != 2 * uuidLen + 4 { return nil, fmt.Errorf("uuid string is wrong length") } - hyph := []byte("-") - - if uuid[8] != hyph[0] || - uuid[13] != hyph[0] || - uuid[18] != hyph[0] || - uuid[23] != hyph[0] { + if uuid[8] != '-' || + uuid[13] != '-' || + uuid[18] != '-' || + uuid[23] != '-' { return nil, fmt.Errorf("uuid is improperly formatted") } @@ -57,7 +57,7 @@ func ParseUUID(uuid string) ([]byte, error) { if err != nil { return nil, err } - if len(ret) != 16 { + if len(ret) != uuidLen { return nil, fmt.Errorf("decoded hex is the wrong length") } diff --git a/vendor/modules.txt b/vendor/modules.txt index 19c619954..372433280 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -282,17 +282,17 @@ github.com/hashicorp/go-multierror # github.com/hashicorp/go-plugin v0.0.0-20190322172744-52e1c4730856 github.com/hashicorp/go-plugin github.com/hashicorp/go-plugin/internal/plugin -# github.com/hashicorp/go-retryablehttp v0.5.1 +# github.com/hashicorp/go-retryablehttp v0.5.2 github.com/hashicorp/go-retryablehttp # github.com/hashicorp/go-rootcerts v1.0.0 github.com/hashicorp/go-rootcerts # github.com/hashicorp/go-safetemp v1.0.0 github.com/hashicorp/go-safetemp -# github.com/hashicorp/go-slug v0.2.0 +# github.com/hashicorp/go-slug v0.3.0 github.com/hashicorp/go-slug -# github.com/hashicorp/go-tfe v0.3.11 +# github.com/hashicorp/go-tfe v0.3.14 github.com/hashicorp/go-tfe -# github.com/hashicorp/go-uuid v1.0.0 +# github.com/hashicorp/go-uuid v1.0.1 github.com/hashicorp/go-uuid # github.com/hashicorp/go-version v1.1.0 github.com/hashicorp/go-version @@ -522,7 +522,7 @@ golang.org/x/text/internal/language/compact golang.org/x/text/internal/utf8internal golang.org/x/text/runes golang.org/x/text/internal/tag -# golang.org/x/time v0.0.0-20181108054448-85acf8d2951c +# golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 golang.org/x/time/rate # google.golang.org/api v0.1.0 google.golang.org/api/iterator