diff --git a/.env.sample b/.env.sample index d86154f..6cf4578 100644 --- a/.env.sample +++ b/.env.sample @@ -1,6 +1,6 @@ export DG_API_KEY="" -export DG_USER_NAME="" export TF_VAR_app_id="" export TF_VAR_owner="" export TF_VAR_platform="" export TF_VAR_add_user_name="" +export TF_VAR_organization="" diff --git a/.gitignore b/.gitignore index c6739c6..a3515f3 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,6 @@ crash.log .terraform *.tfstate *.tfstate.* + +# Go module +vendor diff --git a/deploygate/data_source_app_collaborator.go b/deploygate/data_source_app_collaborator.go index 7cc2ac8..c4b0587 100644 --- a/deploygate/data_source_app_collaborator.go +++ b/deploygate/data_source_app_collaborator.go @@ -41,27 +41,6 @@ func dataSourceAppCollaborator() *schema.Resource { }, }, }, - "teams": { - Type: schema.TypeSet, - Computed: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Optional: true, - }, - "role": { - Type: schema.TypeInt, - Optional: true, - }, - }, - }, - }, - "usage": { - Type: schema.TypeMap, - Computed: true, - Elem: schema.TypeInt, - }, }, } } @@ -91,11 +70,6 @@ func dataSourceAppCollaboratorRead(d *schema.ResourceData, meta interface{}) err d.SetId(fmt.Sprintf("%s/%s/%s", owner, platform, appID)) d.Set("users", rs.Users) - d.Set("teams", rs.Teams) - d.Set("usage", map[string]interface{}{ - "max": rs.Usage.Max, - "used": rs.Usage.Used, - }) return nil } diff --git a/deploygate/data_source_app_collaborator_test.go b/deploygate/data_source_app_collaborator_test.go index 856b4cb..81550a4 100644 --- a/deploygate/data_source_app_collaborator_test.go +++ b/deploygate/data_source_app_collaborator_test.go @@ -27,7 +27,7 @@ func testDataSourceAppCollaborator(n string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] if !ok { - return fmt.Errorf("Can't find app users resource: %s", n) + return fmt.Errorf("Can't find resource: %s", n) } if rs.Primary.ID == "" { diff --git a/deploygate/data_source_organization_member.go b/deploygate/data_source_organization_member.go new file mode 100644 index 0000000..f4722a2 --- /dev/null +++ b/deploygate/data_source_organization_member.go @@ -0,0 +1,75 @@ +package deploygate + +import ( + "fmt" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + go_deploygate "github.com/recruit-mp/go-deploygate" +) + +func dataSourceOrganizationMember() *schema.Resource { + return &schema.Resource{ + Read: dataSourceOrganizationMemberRead, + + Schema: map[string]*schema.Schema{ + "organization": { + Type: schema.TypeString, + Required: true, + }, + "members": { + Type: schema.TypeSet, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "type": { + Type: schema.TypeString, + Optional: true, + }, + "name": { + Type: schema.TypeString, + Optional: true, + }, + "url": { + Type: schema.TypeString, + Optional: true, + }, + "icon_url": { + Type: schema.TypeString, + Optional: true, + }, + "inviting": { + Type: schema.TypeBool, + Optional: true, + }, + }, + }, + }, + }, + } +} + +func dataSourceOrganizationMemberRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*Client).client + + organization := d.Get("organization").(string) + + log.Printf("[DEBUG] dataSourceOrganizationMemberRead: %s", organization) + + g := &go_deploygate.GetOrganizationMemberInput{ + OrganizationName: organization, + } + + om, err := client.GetOrganizationMember(g) + + if err != nil { + return err + } + + rs := om + + d.SetId(fmt.Sprintf("%s", organization)) + d.Set("members", rs.Members) + + return nil +} diff --git a/deploygate/data_source_organization_member_test.go b/deploygate/data_source_organization_member_test.go new file mode 100644 index 0000000..0335b2d --- /dev/null +++ b/deploygate/data_source_organization_member_test.go @@ -0,0 +1,53 @@ +package deploygate + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" +) + +func Test_DataSourceOrganizationMember_basic(t *testing.T) { + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { Test_DGPreCheck(t) }, + Providers: testDGProviders, + Steps: []resource.TestStep{ + { + Config: testDataSourceOrganizationMemberConfig, + Check: resource.ComposeTestCheckFunc( + testDataSourceOrganizationMember("data.deploygate_organization_member.current"), + ), + }, + }, + }) +} + +func testDataSourceOrganizationMember(n string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Can't find resource: %s", n) + } + + if rs.Primary.ID == "" { + return fmt.Errorf("Resource ID not set") + } + + if rs.Primary.Attributes["organization"] == "" { + return fmt.Errorf("organization expected to not be nil") + } + + return nil + } +} + +const testDataSourceOrganizationMemberConfig = ` +data "deploygate_organization_member" "current" { + organization = var.organization +} + +variable "organization" { + type = string +} +` diff --git a/deploygate/provider.go b/deploygate/provider.go index 21822fa..33e798c 100644 --- a/deploygate/provider.go +++ b/deploygate/provider.go @@ -15,20 +15,10 @@ func Provider() *schema.Provider { Sensitive: true, DefaultFunc: schema.EnvDefaultFunc("DG_API_KEY", nil), }, - "user_name": { - Type: schema.TypeString, - Optional: true, - DefaultFunc: schema.EnvDefaultFunc("DG_USER_NAME", nil), - }, - "organization_name": { - Type: schema.TypeString, - Optional: true, - Sensitive: true, - DefaultFunc: schema.EnvDefaultFunc("DG_ORGANIZATION_NAME", nil), - }, }, DataSourcesMap: map[string]*schema.Resource{ - "deploygate_app_collaborator": dataSourceAppCollaborator(), + "deploygate_app_collaborator": dataSourceAppCollaborator(), + "deploygate_organization_member": dataSourceOrganizationMember(), }, ResourcesMap: map[string]*schema.Resource{ "deploygate_app_collaborator": resourceAppCollaborator(), diff --git a/deploygate/provider_test.go b/deploygate/provider_test.go index 9483acf..f3dd44f 100644 --- a/deploygate/provider_test.go +++ b/deploygate/provider_test.go @@ -26,10 +26,6 @@ func Test_DGPreCheck(t *testing.T) { t.Fatal("DG_API_KEY must be set for acceptance tests") } - if os.Getenv("DG_USER_NAME") == "" && os.Getenv("DG_ORGANIZATION_NAME") == "" { - t.Fatal("DG_USER_NAME or DG_ORGANIZATION_NAME must be set for acceptance tests") - } - err := testDGProvider.Configure(context.Background(), terraform.NewResourceConfigRaw(nil)) if err != nil { t.Fatal(err) diff --git a/deploygate/resource_app_collaborator.go b/deploygate/resource_app_collaborator.go index a258e42..4031438 100644 --- a/deploygate/resource_app_collaborator.go +++ b/deploygate/resource_app_collaborator.go @@ -44,31 +44,11 @@ func resourceAppCollaborator() *schema.Resource { "role": { Type: schema.TypeInt, Optional: true, + Default: 1, }, }, }, }, - "teams": { - Type: schema.TypeSet, - Optional: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Optional: true, - }, - "role": { - Type: schema.TypeInt, - Optional: true, - }, - }, - }, - }, - "usage": { - Type: schema.TypeMap, - Optional: true, - Elem: schema.TypeInt, - }, }, } } @@ -78,24 +58,25 @@ type AppCollaboratorConfig struct { owner string platform string appID string - users string + users []AppCollaboratorUsers +} + +// AppCollaboratorUsers has users name and role +type AppCollaboratorUsers struct { + name string + role int } func resourceAppCollaboratorRead(d *schema.ResourceData, meta interface{}) error { acc := setAppCollaboratorConfig(d) - log.Printf("[DEBUG] resourceAppCollaboratorRead: %s", acc) + log.Printf("[DEBUG] resourceAppCollaboratorRead") rs, _ := meta.(*Client).getAppCollaborator(acc) d.SetId(fmt.Sprintf("%s/%s/%s", acc.owner, acc.platform, acc.appID)) d.Set("users", rs.Users) - d.Set("teams", rs.Teams) - d.Set("usage", map[string]interface{}{ - "max": rs.Usage.Max, - "used": rs.Usage.Used, - }) return nil } @@ -103,16 +84,18 @@ func resourceAppCollaboratorRead(d *schema.ResourceData, meta interface{}) error func resourceAppCollaboratorCreate(d *schema.ResourceData, meta interface{}) error { acc := setAppCollaboratorConfig(d) - log.Printf("[DEBUG] resourceAppCollaboratorCreate: %s", acc) + log.Printf("[DEBUG] resourceAppCollaboratorCreate") - rs, err := meta.(*Client).addAppCollaborator(acc) + err := meta.(*Client).addAppCollaborator(acc) if err != nil { return err } + rs, _ := meta.(*Client).getAppCollaborator(acc) + d.SetId(fmt.Sprintf("%s/%s/%s", acc.owner, acc.platform, acc.appID)) - d.Set("users", rs.Added) + d.Set("users", rs.Users) return nil } @@ -120,18 +103,24 @@ func resourceAppCollaboratorCreate(d *schema.ResourceData, meta interface{}) err func resourceAppCollaboratorUpdate(d *schema.ResourceData, meta interface{}) error { acc := setAppCollaboratorConfig(d) - log.Printf("[DEBUG] resourceAppCollaboratorUpdate: %s", acc) + log.Printf("[DEBUG] resourceAppCollaboratorUpdate") - _, err := meta.(*Client).deleteAppCollaborator(acc) + derr := meta.(*Client).deleteAppCollaborator(acc) - if err != nil { - return err + if derr != nil { + return derr + } + + aerr := meta.(*Client).addAppCollaborator(acc) + + if aerr != nil { + return aerr } - rs, _ := meta.(*Client).addAppCollaborator(acc) + rs, _ := meta.(*Client).getAppCollaborator(acc) d.SetId(fmt.Sprintf("%s/%s/%s", acc.owner, acc.platform, acc.appID)) - d.Set("users", rs.Added) + d.Set("users", rs.Users) return nil } @@ -139,9 +128,9 @@ func resourceAppCollaboratorUpdate(d *schema.ResourceData, meta interface{}) err func resourceAppCollaboratorDelete(d *schema.ResourceData, meta interface{}) error { acc := setAppCollaboratorConfig(d) - log.Printf("[DEBUG] resourceAppCollaboratorDelete: %s", acc) + log.Printf("[DEBUG] resourceAppCollaboratorDelete") - _, err := meta.(*Client).deleteAppCollaborator(acc) + err := meta.(*Client).deleteAppCollaborator(acc) if err != nil { return err @@ -169,48 +158,57 @@ func (clt *Client) getAppCollaborator(cfg *AppCollaboratorConfig) (*go_deploygat return collaborator.Results, nil } -func (clt *Client) addAppCollaborator(cfg *AppCollaboratorConfig) (*go_deploygate.AddAppCollaboratorResponseResult, error) { - g := &go_deploygate.AddAppCollaboratorInput{ - Owner: cfg.owner, - Platform: cfg.platform, - AppId: cfg.appID, - Users: cfg.users, - Role: 1, - } +func (clt *Client) addAppCollaborator(cfg *AppCollaboratorConfig) error { + for _, user := range cfg.users { + g := &go_deploygate.AddAppCollaboratorInput{ + Owner: cfg.owner, + Platform: cfg.platform, + AppId: cfg.appID, + Users: user.name, + Role: user.role, + } - collaborator, err := clt.client.AddAppCollaborator(g) + _, err := clt.client.AddAppCollaborator(g) + + if err != nil { + return err + } - if err != nil { - return nil, err } - return collaborator.Results, nil + return nil } -func (clt *Client) deleteAppCollaborator(cfg *AppCollaboratorConfig) (*go_deploygate.DeleteAppCollaboratorResponse, error) { - g := &go_deploygate.DeleteAppCollaboratorInput{ - Owner: cfg.owner, - Platform: cfg.platform, - AppId: cfg.appID, - Users: cfg.users, - } +func (clt *Client) deleteAppCollaborator(cfg *AppCollaboratorConfig) error { + for _, user := range cfg.users { - collaborator, err := clt.client.DeleteAppCollaborator(g) + g := &go_deploygate.DeleteAppCollaboratorInput{ + Owner: cfg.owner, + Platform: cfg.platform, + AppId: cfg.appID, + Users: user.name, + } - if err != nil { - return nil, err + _, err := clt.client.DeleteAppCollaborator(g) + + if err != nil { + return err + } } - return collaborator, nil + return nil } func setAppCollaboratorConfig(d *schema.ResourceData) *AppCollaboratorConfig { - var usersList string + var users []AppCollaboratorUsers if v, ok := d.GetOk("users"); ok { for _, element := range v.(*schema.Set).List() { elem := element.(map[string]interface{}) - usersList += elem["name"].(string) + "," + users = append(users, AppCollaboratorUsers{ + name: elem["name"].(string), + role: elem["role"].(int), + }) } } @@ -218,7 +216,7 @@ func setAppCollaboratorConfig(d *schema.ResourceData) *AppCollaboratorConfig { owner: d.Get("owner").(string), platform: d.Get("platform").(string), appID: d.Get("app_id").(string), - users: usersList, + users: users, } return acc diff --git a/deploygate/resource_app_collaborator_test.go b/deploygate/resource_app_collaborator_test.go index cbd51df..ea0f829 100644 --- a/deploygate/resource_app_collaborator_test.go +++ b/deploygate/resource_app_collaborator_test.go @@ -16,7 +16,7 @@ func Test_ResourceAppCollaborator_basic(t *testing.T) { { Config: resourceTestAppCollaboratorConfig, Check: resource.ComposeTestCheckFunc( - resourceTestAppCollaborator("resource.deploygate_app_collaborator.current"), + resourceTestAppCollaborator("deploygate_app_collaborator.current"), ), }, }, @@ -27,7 +27,7 @@ func resourceTestAppCollaborator(n string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] if !ok { - return fmt.Errorf("Can't find app users resource: %s", n) + return fmt.Errorf("Can't find resource: %s", n) } if rs.Primary.ID == "" { @@ -46,10 +46,6 @@ func resourceTestAppCollaborator(n string) resource.TestCheckFunc { return fmt.Errorf("app_id expected to not be nil") } - if rs.Primary.Attributes["users"] == "" { - return fmt.Errorf("users expected to not be nil") - } - return nil } } diff --git a/examples/main.tf b/examples/main.tf index 6c85f5a..e504891 100644 --- a/examples/main.tf +++ b/examples/main.tf @@ -1,11 +1,21 @@ provider "deploygate" {} +# For data app_collaborator + data "deploygate_app_collaborator" "current" { platform = var.platform app_id = var.app_id owner = var.owner } +# For data organization_member + +data "deploygate_organization_member" "current" { + organization = var.organization +} + +# For resource app_collaborator + resource "deploygate_app_collaborator" "current" { platform = var.platform app_id = var.app_id diff --git a/examples/output.tf b/examples/output.tf index 8d81765..b37b8fc 100644 --- a/examples/output.tf +++ b/examples/output.tf @@ -8,12 +8,14 @@ output "data_app_collaborator_users" { value = data.deploygate_app_collaborator.current.users } -output "data_app_collaborator_teams" { - value = data.deploygate_app_collaborator.current.teams +# For data deploygate_organization_member + +output "data_organization_member_id" { + value = data.deploygate_organization_member.current.id } -output "data_app_collaborator_usage" { - value = data.deploygate_app_collaborator.current.usage +output "data_organization_member_members" { + value = data.deploygate_organization_member.current.members } # For resource app_collaborator @@ -25,11 +27,3 @@ output "resource_app_collaborator_id" { output "resource_app_collaborator_users" { value = deploygate_app_collaborator.current.users } - -output "resource_app_collaborator_teams" { - value = deploygate_app_collaborator.current.teams -} - -output "resource_app_collaborator_usage" { - value = deploygate_app_collaborator.current.usage -} diff --git a/examples/variables.tf b/examples/variables.tf index 39a13ba..75f2b7c 100644 --- a/examples/variables.tf +++ b/examples/variables.tf @@ -13,3 +13,7 @@ variable "owner" { variable "add_user_name" { type = string } + +variable "organization" { + type = string +} diff --git a/go.mod b/go.mod index 131906b..63be68e 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,11 @@ go 1.15 require ( github.com/ajg/form v1.5.1 // indirect - github.com/aws/aws-sdk-go v1.25.3 + github.com/aws/aws-sdk-go v1.25.3 // indirect github.com/dnaeon/go-vcr v1.1.0 // indirect github.com/hashicorp/terraform-plugin-sdk/v2 v2.3.0 - github.com/mitchellh/mapstructure v1.1.2 + github.com/mitchellh/mapstructure v1.1.2 // indirect github.com/recruit-mp/go-deploygate v0.0.0-20161124091054-af415c893ce8 ) + +replace github.com/recruit-mp/go-deploygate => ../go-deploygate //FIXME: update when PR has merged : https://github.com/recruit-mp/go-deploygate diff --git a/go.sum b/go.sum index 106208e..66a2daa 100644 --- a/go.sum +++ b/go.sum @@ -38,6 +38,7 @@ github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki 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/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0= +github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= @@ -67,6 +68,7 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 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/dnaeon/go-vcr v0.0.0-20161028051908-82c8877b5545/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= @@ -145,6 +147,7 @@ github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/U github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 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.0.0-20160407174126-ad28ea4487f0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -198,6 +201,7 @@ github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht 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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= @@ -226,6 +230,7 @@ github.com/mitchellh/go-testing-interface v1.0.4/go.mod h1:kRemZodwjscx+RGhAo8eI 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/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/mapstructure v0.0.0-20161020161836-f3009df150da/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= @@ -302,6 +307,7 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -310,6 +316,7 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -427,6 +434,7 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200713011307-fd294ab11aed h1:+qzWo37K31KxduIYaBeMqJ8MUOyTayOQKpH9aDPLMSY= golang.org/x/tools v0.0.0-20200713011307-fd294ab11aed/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -453,6 +461,7 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -516,6 +525,7 @@ gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20160928153709-a5b47d31c556/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=