From 0097bdde11f760a6a7685aaaba94304dac7b75c5 Mon Sep 17 00:00:00 2001
From: Julien Duchesne <julien.duchesne@grafana.com>
Date: Tue, 22 Nov 2022 07:29:47 -0500
Subject: [PATCH] Allow creating an organization with many users (#724)

* Allow creating an organization with many users
Currently, we're limited by the pagination (1000 by default)

* Fix loop

* 1024 max

* oops

* Fix the test

* oops

* Replace the library

* New version

* Update client version

* update client again

* go mod update
---
 go.mod                                |  2 +-
 go.sum                                |  4 +-
 grafana/resource_organization_test.go | 55 +++++++++++++++++++++++++++
 3 files changed, 58 insertions(+), 3 deletions(-)

diff --git a/go.mod b/go.mod
index 0449cc2aa..3d2776541 100644
--- a/go.mod
+++ b/go.mod
@@ -5,7 +5,7 @@ go 1.18
 require (
 	github.com/Masterminds/semver/v3 v3.1.1
 	github.com/grafana/amixr-api-go-client v0.0.5
-	github.com/grafana/grafana-api-golang-client v0.13.1
+	github.com/grafana/grafana-api-golang-client v0.14.0
 	github.com/grafana/machine-learning-go-client v0.2.0
 	github.com/grafana/synthetic-monitoring-agent v0.11.0
 	github.com/grafana/synthetic-monitoring-api-go-client v0.6.3
diff --git a/go.sum b/go.sum
index 1351d32a2..942ab13e0 100644
--- a/go.sum
+++ b/go.sum
@@ -76,8 +76,8 @@ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
 github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/grafana/amixr-api-go-client v0.0.5 h1:jqmljnd5FozuOsCNuyhZVpooxmj0BW9MmeLA7PaLK6U=
 github.com/grafana/amixr-api-go-client v0.0.5/go.mod h1:N6x26XUrM5zGtK5zL5vNJnAn2JFMxLFPPLTw/6pDkFE=
-github.com/grafana/grafana-api-golang-client v0.13.1 h1:a5R8bIwL98xd79zFTQnYgpva3ns7Nm5/DnVAWYBdWVk=
-github.com/grafana/grafana-api-golang-client v0.13.1/go.mod h1:24W29gPe9yl0/3A9X624TPkAOR8DpHno490cPwnkv8E=
+github.com/grafana/grafana-api-golang-client v0.14.0 h1:Jo2oZ85Y58zM7cOzQFxDfKopE3E6oyujU2KCeu7iSFA=
+github.com/grafana/grafana-api-golang-client v0.14.0/go.mod h1:24W29gPe9yl0/3A9X624TPkAOR8DpHno490cPwnkv8E=
 github.com/grafana/machine-learning-go-client v0.2.0 h1:5JgfJn5Q72D0jZlXnM0gZ9lV4Q4zzq9X0GVfPu8Vxis=
 github.com/grafana/machine-learning-go-client v0.2.0/go.mod h1:QFfZz8NkqVF8++skjkKQXJEZfpCYd8S0yTWJUpsLLTA=
 github.com/grafana/synthetic-monitoring-agent v0.11.0 h1:B+JAiBqsKx8074A2cVdXG2+pmn5mCkr/Z55E7A+4XTc=
diff --git a/grafana/resource_organization_test.go b/grafana/resource_organization_test.go
index b1e71a571..ae2fbfef4 100644
--- a/grafana/resource_organization_test.go
+++ b/grafana/resource_organization_test.go
@@ -130,6 +130,32 @@ func TestAccOrganization_users(t *testing.T) {
 	})
 }
 
+func TestAccOrganization_createManyUsers(t *testing.T) {
+	CheckOSSTestsEnabled(t)
+
+	var org gapi.Org
+
+	resource.Test(t, resource.TestCase{
+		ProviderFactories: testAccProviderFactories,
+		CheckDestroy:      testAccOrganizationCheckDestroy(&org),
+		Steps: []resource.TestStep{
+			{Config: testAccOrganizationConfig_usersCreateMany_1},
+			{
+				Config: testAccOrganizationConfig_usersCreateMany_2,
+				Check: resource.ComposeTestCheckFunc(
+					testAccOrganizationCheckExists("grafana_organization.test", &org),
+					resource.TestCheckResourceAttr(
+						"grafana_organization.test", "name", "terraform-acc-test",
+					),
+					resource.TestCheckResourceAttr(
+						"grafana_organization.test", "admins.#", "1500",
+					),
+				),
+			},
+		},
+	})
+}
+
 func TestAccOrganization_defaultAdmin(t *testing.T) {
 	CheckOSSTestsEnabled(t)
 
@@ -353,3 +379,32 @@ resource "grafana_organization" "test" {
     admins = []
 }
 `
+
+const testAccOrganizationConfig_usersCreateMany_1 = `
+resource "grafana_user" "users" {
+	count = 1500
+
+	name     = "user-${count.index}"
+	email    = "user-${count.index}@example.com"
+	login    = "user-${count.index}@example.com"
+	password = "password"
+}
+`
+
+const testAccOrganizationConfig_usersCreateMany_2 = `
+resource "grafana_user" "users" {
+	count = 1500
+
+	name     = "user-${count.index}"
+	email    = "user-${count.index}@example.com"
+	login    = "user-${count.index}@example.com"
+	password = "password"
+}
+
+resource "grafana_organization" "test" {
+    name         = "terraform-acc-test"
+    admin_user   = "admin"
+    create_users = false
+    admins       = [ for user in grafana_user.users : user.email ]
+}
+`