Skip to content

Commit f750cd2

Browse files
authored
feat: Add resource_record_sets to GCP plugin (#10917)
#### Summary This PR adds the `gcp_dns_resource_record_sets` table to the GCP plugin. These are the columns for the new table: ```csv _cq_source_name,_cq_sync_time,_cq_id,_cq_parent_id,project_id,kind,name,routing_policy,rrdatas,signature_rrdatas,ttl,type ``` Tested this on my GCP project and seems to be working ok. Let me know if there's something I'm missing. <!--
1 parent 2b88550 commit f750cd2

File tree

10 files changed

+142
-5
lines changed

10 files changed

+142
-5
lines changed

plugins/source/gcp/CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Thanks for contributing to CloudQuery! You are awesome. This document serves as
55
There are two main steps to adding a new GCP resource:
66

77
1. [Add a code generation recipe](#1-add-a-code-generation-recipe)
8-
2. [Writing the resolver function to fetch the resource using the AWS SDK](#2-setting-up-the-resource)
8+
2. [Writing the resolver function to fetch the resource using the GCP SDK](#2-setting-up-the-resource)
99

1010
## 1. Add a Code Generation Recipe
1111

plugins/source/gcp/client/services.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

plugins/source/gcp/docs/tables/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@
121121
- [gcp_container_clusters](../../../../../website/tables/gcp/gcp_container_clusters.md)
122122
- [gcp_containeranalysis_occurrences](../../../../../website/tables/gcp/gcp_containeranalysis_occurrences.md)
123123
- [gcp_dns_managed_zones](../../../../../website/tables/gcp/gcp_dns_managed_zones.md)
124+
- [gcp_dns_resource_record_sets](../../../../../website/tables/gcp/gcp_dns_resource_record_sets.md)
124125
- [gcp_dns_policies](../../../../../website/tables/gcp/gcp_dns_policies.md)
125126
- [gcp_domains_registrations](../../../../../website/tables/gcp/gcp_domains_registrations.md)
126127
- [gcp_functions_functions](../../../../../website/tables/gcp/gcp_functions_functions.md)

plugins/source/gcp/resources/services/dns/managed_zones.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,8 @@ func ManagedZones() *schema.Table {
2222
Resolver: client.ResolveProject,
2323
},
2424
},
25+
Relations: []*schema.Table{
26+
resourceRecordSets(),
27+
},
2528
}
2629
}

plugins/source/gcp/resources/services/dns/managed_zones_mock_test.go

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,39 @@ type MockManagedZonesResult struct {
1616
ManagedZones []*dns.ManagedZone `json:"managedzones,omitempty"`
1717
}
1818

19+
type MockResourceRecordSetsResult struct {
20+
Rrsets []*dns.ResourceRecordSet `json:"rrsets,omitempty"`
21+
}
22+
1923
func createManagedZones(mux *httprouter.Router) error {
20-
var item dns.ManagedZone
21-
if err := faker.FakeObject(&item); err != nil {
24+
var managedZoneItem dns.ManagedZone
25+
if err := faker.FakeObject(&managedZoneItem); err != nil {
2226
return err
2327
}
2428

25-
mux.GET("/*filepath", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
29+
mux.GET("/dns/v1/projects/testProject/managedZones", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
2630
resp := &MockManagedZonesResult{
27-
ManagedZones: []*dns.ManagedZone{&item},
31+
ManagedZones: []*dns.ManagedZone{&managedZoneItem},
32+
}
33+
b, err := json.Marshal(resp)
34+
if err != nil {
35+
http.Error(w, "unable to marshal request: "+err.Error(), http.StatusBadRequest)
36+
return
37+
}
38+
if _, err := w.Write(b); err != nil {
39+
http.Error(w, "failed to write", http.StatusBadRequest)
40+
return
41+
}
42+
})
43+
44+
var recordSetItem dns.ResourceRecordSet
45+
if err := faker.FakeObject(&recordSetItem); err != nil {
46+
return err
47+
}
48+
49+
mux.GET("/dns/v1/projects/testProject/managedZones/test string/rrsets", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
50+
resp := &MockResourceRecordSetsResult{
51+
Rrsets: []*dns.ResourceRecordSet{&recordSetItem},
2852
}
2953
b, err := json.Marshal(resp)
3054
if err != nil {
@@ -36,6 +60,7 @@ func createManagedZones(mux *httprouter.Router) error {
3660
return
3761
}
3862
})
63+
3964
return nil
4065
}
4166

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package dns
2+
3+
import (
4+
"github.com/apache/arrow/go/v13/arrow"
5+
"github.com/cloudquery/plugin-sdk/v3/schema"
6+
"github.com/cloudquery/plugin-sdk/v3/transformers"
7+
"github.com/cloudquery/plugins/source/gcp/client"
8+
"google.golang.org/api/dns/v1"
9+
)
10+
11+
func resourceRecordSets() *schema.Table {
12+
return &schema.Table{
13+
Name: "gcp_dns_resource_record_sets",
14+
Description: `https://cloud.google.com/dns/docs/reference/v1/resourceRecordSets`,
15+
Resolver: fetchResourceRecordSets,
16+
Multiplex: client.ProjectMultiplexEnabledServices("dns.googleapis.com"),
17+
Transform: client.TransformWithStruct(&dns.ResourceRecordSet{}, transformers.WithPrimaryKeys("Name", "Type")),
18+
Columns: []schema.Column{
19+
{
20+
Name: "project_id",
21+
Type: arrow.BinaryTypes.String,
22+
Resolver: client.ResolveProject,
23+
PrimaryKey: true,
24+
}, {
25+
Name: "managed_zone_name",
26+
Type: arrow.BinaryTypes.String,
27+
Resolver: schema.ParentColumnResolver("name"),
28+
PrimaryKey: true,
29+
},
30+
},
31+
}
32+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package dns
2+
3+
import (
4+
"context"
5+
6+
"github.com/cloudquery/plugin-sdk/v3/schema"
7+
"github.com/cloudquery/plugins/source/gcp/client"
8+
"google.golang.org/api/dns/v1"
9+
)
10+
11+
func fetchResourceRecordSets(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error {
12+
c := meta.(*client.Client)
13+
nextPageToken := ""
14+
dnsClient, err := dns.NewService(ctx, c.ClientOptions...)
15+
if err != nil {
16+
return err
17+
}
18+
19+
for {
20+
managedZone := parent.Item.(*dns.ManagedZone)
21+
call := dnsClient.ResourceRecordSets.List(c.ProjectId, managedZone.Name)
22+
23+
if nextPageToken != "" {
24+
call = call.PageToken(nextPageToken)
25+
}
26+
27+
output, err := call.Do()
28+
29+
if err != nil {
30+
return err
31+
}
32+
res <- output.Rrsets
33+
34+
if output.NextPageToken == "" {
35+
break
36+
}
37+
nextPageToken = output.NextPageToken
38+
}
39+
return nil
40+
}

website/pages/docs/plugins/sources/gcp/tables.md

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

website/tables/gcp/gcp_dns_managed_zones.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ https://cloud.google.com/dns/docs/reference/v1/managedZones#resource
66

77
The primary key for this table is **id**.
88

9+
## Relations
10+
11+
The following tables depend on gcp_dns_managed_zones:
12+
- [gcp_dns_resource_record_sets](gcp_dns_resource_record_sets)
13+
914
## Columns
1015

1116
| Name | Type |
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Table: gcp_dns_resource_record_sets
2+
3+
This table shows data for GCP DNS Resource Record Sets.
4+
5+
https://cloud.google.com/dns/docs/reference/v1/resourceRecordSets
6+
7+
The composite primary key for this table is (**project_id**, **managed_zone_name**, **name**, **type**).
8+
9+
## Relations
10+
11+
This table depends on [gcp_dns_managed_zones](gcp_dns_managed_zones).
12+
13+
## Columns
14+
15+
| Name | Type |
16+
| ------------- | ------------- |
17+
|_cq_source_name|utf8|
18+
|_cq_sync_time|timestamp[us, tz=UTC]|
19+
|_cq_id|uuid|
20+
|_cq_parent_id|uuid|
21+
|project_id (PK)|utf8|
22+
|managed_zone_name (PK)|utf8|
23+
|kind|utf8|
24+
|name (PK)|utf8|
25+
|routing_policy|json|
26+
|rrdatas|list<item: utf8, nullable>|
27+
|signature_rrdatas|list<item: utf8, nullable>|
28+
|ttl|int64|
29+
|type (PK)|utf8|

0 commit comments

Comments
 (0)