Skip to content

Commit 1fc013e

Browse files
Add plural data source for retrieving Artifact Registry repositories (#14633) (#23906)
[upstream:40021785a0472c31586adb01eac63cc483e8d7b7] Signed-off-by: Modular Magician <[email protected]>
1 parent 59d4572 commit 1fc013e

File tree

5 files changed

+398
-0
lines changed

5 files changed

+398
-0
lines changed

.changelog/14633.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-datasource
2+
`google_artifact_registry_repositories`
3+
```

google/provider/provider_mmv1_resources.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ var handwrittenDatasources = map[string]*schema.Resource{
186186
"google_artifact_registry_docker_image": artifactregistry.DataSourceArtifactRegistryDockerImage(),
187187
"google_artifact_registry_docker_images": artifactregistry.DataSourceArtifactRegistryDockerImages(),
188188
"google_artifact_registry_locations": artifactregistry.DataSourceGoogleArtifactRegistryLocations(),
189+
"google_artifact_registry_repositories": artifactregistry.DataSourceArtifactRegistryRepositories(),
189190
"google_artifact_registry_repository": artifactregistry.DataSourceArtifactRegistryRepository(),
190191
"google_artifact_registry_package": artifactregistry.DataSourceArtifactRegistryPackage(),
191192
"google_artifact_registry_version": artifactregistry.DataSourceArtifactRegistryVersion(),
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
// ----------------------------------------------------------------------------
4+
//
5+
// *** AUTO GENERATED CODE *** Type: Handwritten ***
6+
//
7+
// ----------------------------------------------------------------------------
8+
//
9+
// This code is generated by Magic Modules using the following:
10+
//
11+
// Source file: https://github.com/GoogleCloudPlatform/magic-modules/tree/main/mmv1/third_party/terraform/services/artifactregistry/data_source_artifact_registry_repositories.go
12+
//
13+
// DO NOT EDIT this file directly. Any changes made to this file will be
14+
// overwritten during the next generation cycle.
15+
//
16+
// ----------------------------------------------------------------------------
17+
package artifactregistry
18+
19+
import (
20+
"fmt"
21+
"net/http"
22+
"net/url"
23+
24+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
25+
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
26+
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
27+
)
28+
29+
func DataSourceArtifactRegistryRepositories() *schema.Resource {
30+
return &schema.Resource{
31+
Read: dataSourceArtifactRegistryRepositoriesRead,
32+
Schema: map[string]*schema.Schema{
33+
"location": {
34+
Type: schema.TypeString,
35+
Required: true,
36+
},
37+
"name_filter": {
38+
Type: schema.TypeString,
39+
Optional: true,
40+
},
41+
"project": {
42+
Type: schema.TypeString,
43+
Optional: true,
44+
},
45+
"repositories": {
46+
Type: schema.TypeList,
47+
Computed: true,
48+
Elem: &schema.Resource{
49+
Schema: map[string]*schema.Schema{
50+
"id": {
51+
Type: schema.TypeString,
52+
Computed: true,
53+
},
54+
"repository_id": {
55+
Type: schema.TypeString,
56+
Computed: true,
57+
},
58+
"format": {
59+
Type: schema.TypeString,
60+
Computed: true,
61+
},
62+
"description": {
63+
Type: schema.TypeString,
64+
Computed: true,
65+
},
66+
"create_time": {
67+
Type: schema.TypeString,
68+
Computed: true,
69+
},
70+
"update_time": {
71+
Type: schema.TypeString,
72+
Computed: true,
73+
},
74+
},
75+
},
76+
},
77+
},
78+
}
79+
}
80+
81+
func dataSourceArtifactRegistryRepositoriesRead(d *schema.ResourceData, meta interface{}) error {
82+
config := meta.(*transport_tpg.Config)
83+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
84+
if err != nil {
85+
return err
86+
}
87+
88+
project, err := tpgresource.GetProject(d, config)
89+
if err != nil {
90+
return err
91+
}
92+
93+
basePath, err := tpgresource.ReplaceVars(d, config, "{{ArtifactRegistryBasePath}}")
94+
if err != nil {
95+
return fmt.Errorf("Error setting Artifact Registry base path: %s", err)
96+
}
97+
98+
resourcePath, err := tpgresource.ReplaceVars(d, config, fmt.Sprintf("projects/{{project}}/locations/{{location}}/repositories"))
99+
if err != nil {
100+
return fmt.Errorf("Error setting resource path: %s", err)
101+
}
102+
103+
urlRequest := basePath + resourcePath
104+
105+
nameFilter := ""
106+
if v, ok := d.GetOk("name_filter"); ok {
107+
nameFilter = fmt.Sprintf("name=\"%s/%s\"", resourcePath, v.(string))
108+
109+
u, err := url.Parse(urlRequest)
110+
if err != nil {
111+
return fmt.Errorf("Error parsing URL: %s", err)
112+
}
113+
114+
q := u.Query()
115+
q.Set("filter", nameFilter)
116+
u.RawQuery = q.Encode()
117+
urlRequest = u.String()
118+
}
119+
120+
headers := make(http.Header)
121+
repos := make([]map[string]interface{}, 0)
122+
pageToken := ""
123+
124+
for {
125+
u, err := url.Parse(urlRequest)
126+
if err != nil {
127+
return fmt.Errorf("Error parsing URL: %s", err)
128+
}
129+
130+
q := u.Query()
131+
if nameFilter != "" {
132+
q.Set("filter", nameFilter)
133+
}
134+
if pageToken != "" {
135+
q.Set("pageToken", pageToken)
136+
}
137+
u.RawQuery = q.Encode()
138+
139+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
140+
Config: config,
141+
Method: "GET",
142+
RawURL: u.String(),
143+
UserAgent: userAgent,
144+
Headers: headers,
145+
})
146+
147+
if err != nil {
148+
return fmt.Errorf("Error listing Artifact Registry repositories: %s", err)
149+
}
150+
151+
if items, ok := res["repositories"].([]interface{}); ok {
152+
for _, item := range items {
153+
repo := item.(map[string]interface{})
154+
repos = append(repos, map[string]interface{}{
155+
"id": repo["name"],
156+
"repository_id": tpgresource.GetResourceNameFromSelfLink(repo["name"].(string)),
157+
"format": repo["format"],
158+
"description": repo["description"],
159+
"create_time": repo["createTime"],
160+
"update_time": repo["updateTime"],
161+
})
162+
}
163+
}
164+
165+
if nextToken, ok := res["nextPageToken"].(string); ok && nextToken != "" {
166+
pageToken = nextToken
167+
} else {
168+
break
169+
}
170+
}
171+
172+
if err := d.Set("project", project); err != nil {
173+
return fmt.Errorf("Error setting project: %s", err)
174+
}
175+
176+
if err := d.Set("repositories", repos); err != nil {
177+
return fmt.Errorf("Error setting Artifact Registry repositories: %s", err)
178+
}
179+
180+
setId := resourcePath
181+
182+
if nameFilter != "" {
183+
setId += "/" + nameFilter
184+
}
185+
186+
d.SetId(setId)
187+
188+
return nil
189+
}
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
// ----------------------------------------------------------------------------
4+
//
5+
// *** AUTO GENERATED CODE *** Type: Handwritten ***
6+
//
7+
// ----------------------------------------------------------------------------
8+
//
9+
// This code is generated by Magic Modules using the following:
10+
//
11+
// Source file: https://github.com/GoogleCloudPlatform/magic-modules/tree/main/mmv1/third_party/terraform/services/artifactregistry/data_source_artifact_registry_repositories_test.go
12+
//
13+
// DO NOT EDIT this file directly. Any changes made to this file will be
14+
// overwritten during the next generation cycle.
15+
//
16+
// ----------------------------------------------------------------------------
17+
package artifactregistry_test
18+
19+
import (
20+
"testing"
21+
22+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
23+
"github.com/hashicorp/terraform-provider-google/google/acctest"
24+
"github.com/hashicorp/terraform-provider-google/google/envvar"
25+
)
26+
27+
func TestAccDataSourceArtifactRegistryRepositories_basic(t *testing.T) {
28+
t.Parallel()
29+
30+
context := map[string]interface{}{
31+
"location": envvar.GetTestRegionFromEnv(),
32+
"random_suffix": acctest.RandString(t, 8),
33+
}
34+
35+
acctest.VcrTest(t, resource.TestCase{
36+
PreCheck: func() { acctest.AccTestPreCheck(t) },
37+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
38+
Steps: []resource.TestStep{
39+
{
40+
Config: testAccDataSourceArtifactRegistryRepositoriesConfig(context),
41+
Check: resource.ComposeTestCheckFunc(
42+
resource.TestCheckResourceAttrSet("data.google_artifact_registry_repositories.all", "project"),
43+
resource.TestCheckResourceAttrSet("data.google_artifact_registry_repositories.all", "repositories.0.id"),
44+
resource.TestCheckResourceAttrSet("data.google_artifact_registry_repositories.all", "repositories.1.id"),
45+
resource.TestCheckResourceAttrSet("data.google_artifact_registry_repositories.all", "repositories.2.id"),
46+
resource.TestCheckResourceAttrSet("data.google_artifact_registry_repositories.all", "repositories.0.repository_id"),
47+
resource.TestCheckResourceAttrSet("data.google_artifact_registry_repositories.all", "repositories.0.format"),
48+
resource.TestCheckResourceAttrSet("data.google_artifact_registry_repositories.all", "repositories.0.create_time"),
49+
resource.TestCheckResourceAttrSet("data.google_artifact_registry_repositories.all", "repositories.0.update_time"),
50+
),
51+
},
52+
{
53+
Config: testAccDataSourceArtifactRegistryRepositoriesConfigWithFilter(context),
54+
Check: resource.ComposeTestCheckFunc(
55+
resource.TestCheckResourceAttrSet("data.google_artifact_registry_repositories.filtered", "repositories.0.id"),
56+
resource.TestCheckResourceAttrSet("data.google_artifact_registry_repositories.filtered", "repositories.0.repository_id"),
57+
resource.TestCheckResourceAttrSet("data.google_artifact_registry_repositories.filtered", "repositories.0.format"),
58+
resource.TestCheckResourceAttrSet("data.google_artifact_registry_repositories.filtered", "repositories.0.create_time"),
59+
resource.TestCheckResourceAttrSet("data.google_artifact_registry_repositories.filtered", "repositories.0.update_time"),
60+
),
61+
},
62+
},
63+
})
64+
}
65+
66+
func testAccDataSourceArtifactRegistryRepositoriesConfig(context map[string]interface{}) string {
67+
return acctest.Nprintf(`
68+
resource "google_artifact_registry_repository" "repo1" {
69+
location = "%{location}"
70+
repository_id = "tf-test-repo1%{random_suffix}"
71+
format = "DOCKER"
72+
description = "repo1 desc"
73+
}
74+
75+
resource "google_artifact_registry_repository" "repo2" {
76+
location = "%{location}"
77+
repository_id = "tf-test-repo2%{random_suffix}"
78+
format = "DOCKER"
79+
description = "repo2 desc"
80+
}
81+
82+
resource "google_artifact_registry_repository" "repo3" {
83+
location = "%{location}"
84+
repository_id = "tf-test-repo3%{random_suffix}"
85+
format = "DOCKER"
86+
description = "repo3 desc"
87+
}
88+
89+
data "google_artifact_registry_repositories" "all" {
90+
location = "%{location}"
91+
92+
depends_on = [
93+
google_artifact_registry_repository.repo1,
94+
google_artifact_registry_repository.repo2,
95+
google_artifact_registry_repository.repo3,
96+
]
97+
}
98+
`, context)
99+
}
100+
101+
func testAccDataSourceArtifactRegistryRepositoriesConfigWithFilter(context map[string]interface{}) string {
102+
return acctest.Nprintf(`
103+
resource "google_artifact_registry_repository" "repo1" {
104+
location = "%{location}"
105+
repository_id = "tf-test-repo1%{random_suffix}"
106+
format = "DOCKER"
107+
description = "repo1 desc"
108+
}
109+
110+
resource "google_artifact_registry_repository" "repo2" {
111+
location = "%{location}"
112+
repository_id = "tf-test-repo2%{random_suffix}"
113+
format = "DOCKER"
114+
description = "repo2 desc"
115+
}
116+
117+
resource "google_artifact_registry_repository" "repo3" {
118+
location = "%{location}"
119+
repository_id = "tf-test-repo3%{random_suffix}"
120+
format = "DOCKER"
121+
description = "repo3 desc"
122+
}
123+
124+
resource "google_artifact_registry_repository" "repo4" {
125+
location = "%{location}"
126+
repository_id = "tf-acc-repo4%{random_suffix}"
127+
format = "DOCKER"
128+
description = "acc desc"
129+
}
130+
131+
data "google_artifact_registry_repositories" "filtered" {
132+
location = "%{location}"
133+
name_filter = "*acc*"
134+
135+
depends_on = [
136+
google_artifact_registry_repository.repo1,
137+
google_artifact_registry_repository.repo2,
138+
google_artifact_registry_repository.repo3,
139+
google_artifact_registry_repository.repo4,
140+
]
141+
}
142+
`, context)
143+
}

0 commit comments

Comments
 (0)