Skip to content

Commit e1b97d6

Browse files
Add google_apigee_data_collector resource (GoogleCloudPlatform#16954)
1 parent 6c5ed49 commit e1b97d6

4 files changed

Lines changed: 254 additions & 0 deletions

File tree

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# Copyright 2024 Google Inc.
2+
# Licensed under the Apache License, Version 2.0 (the "License");
3+
# you may not use this file except in compliance with the License.
4+
# You may obtain a copy of the License at
5+
#
6+
# http://www.apache.org/licenses/LICENSE-2.0
7+
#
8+
# Unless required by applicable law or agreed to in writing, software
9+
# distributed under the License is distributed on an "AS IS" BASIS,
10+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
# See the License for the specific language governing permissions and
12+
# limitations under the License.
13+
14+
---
15+
name: 'DataCollector'
16+
description: |
17+
A `DataCollector` collects and stores data from the runtime for use in
18+
Analytics custom reports or API monetization. Data collectors are scoped
19+
to an Apigee organization.
20+
references:
21+
guides:
22+
'Creating a data collector': 'https://cloud.google.com/apigee/docs/api-platform/analytics/custom-reports'
23+
api: 'https://cloud.google.com/apigee/docs/reference/apis/apigee/rest/v1/organizations.datacollectors'
24+
docs:
25+
base_url: '{{org_id}}/datacollectors'
26+
self_link: '{{org_id}}/datacollectors/{{data_collector_id}}'
27+
create_url: '{{org_id}}/datacollectors?dataCollectorId={{data_collector_id}}'
28+
update_url: '{{org_id}}/datacollectors/{{data_collector_id}}'
29+
update_verb: 'PATCH'
30+
update_mask: true
31+
delete_url: '{{org_id}}/datacollectors/{{data_collector_id}}'
32+
import_format:
33+
- '{{org_id}}/datacollectors/{{data_collector_id}}'
34+
- '{{org_id}}/{{data_collector_id}}'
35+
timeouts:
36+
insert_minutes: 1
37+
update_minutes: 1
38+
delete_minutes: 1
39+
custom_code:
40+
custom_import: 'templates/terraform/custom_import/apigee_data_collector.go.tmpl'
41+
examples:
42+
- name: 'apigee_data_collector_basic'
43+
vars:
44+
network_name: 'apigee-network'
45+
range_name: 'apigee-range'
46+
data_collector_id: 'dc_my_data_collector'
47+
exclude_test: true
48+
- name: 'apigee_data_collector_basic_test'
49+
primary_resource_id: 'apigee_data_collector'
50+
test_env_vars:
51+
org_id: 'ORG_ID'
52+
billing_account: 'BILLING_ACCT'
53+
exclude_docs: true
54+
external_providers: ["time"]
55+
parameters:
56+
- name: 'orgId'
57+
type: String
58+
description: |
59+
The Apigee Organization associated with the Apigee data collector,
60+
in the format `organizations/{{org_name}}`.
61+
url_param_only: true
62+
required: true
63+
immutable: true
64+
- name: 'dataCollectorId'
65+
type: String
66+
description: |
67+
The ID for the data collector. Must begin with `dc_`.
68+
url_param_only: true
69+
required: true
70+
immutable: true
71+
validation:
72+
regex: '^dc_[a-zA-Z0-9_]+$'
73+
properties:
74+
- name: 'name'
75+
type: String
76+
description: |
77+
The resource name of the data collector, in the format
78+
`organizations/{{org_name}}/datacollectors/{{data_collector_id}}`.
79+
output: true
80+
- name: 'description'
81+
type: String
82+
description: |
83+
A description of the data collector.
84+
- name: 'type'
85+
type: Enum
86+
description: |
87+
The type of data this data collector will collect.
88+
required: true
89+
immutable: true
90+
enum_values:
91+
- 'BOOLEAN'
92+
- 'DATETIME'
93+
- 'FLOAT'
94+
- 'INTEGER'
95+
- 'STRING'
96+
- name: 'createdAt'
97+
type: String
98+
description: |
99+
The time at which the data collector was created in milliseconds since the epoch.
100+
output: true
101+
- name: 'lastModifiedAt'
102+
type: String
103+
description: |
104+
The time at which the data collector was last modified in milliseconds since the epoch.
105+
output: true
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
config := meta.(*transport_tpg.Config)
2+
3+
// current import_formats cannot import fields with forward slashes in their value
4+
if err := tpgresource.ParseImportId([]string{"(?P<data_collector_id>.+)"}, d, config); err != nil {
5+
return nil, err
6+
}
7+
8+
nameParts := strings.Split(d.Get("data_collector_id").(string), "/")
9+
if len(nameParts) == 4 {
10+
// `organizations/{{"{{"}}org_name{{"}}"}}/datacollectors/{{"{{"}}data_collector_id{{"}}"}}`
11+
orgId := fmt.Sprintf("organizations/%s", nameParts[1])
12+
if err := d.Set("org_id", orgId); err != nil {
13+
return nil, fmt.Errorf("Error setting org_id: %s", err)
14+
}
15+
if err := d.Set("data_collector_id", nameParts[3]); err != nil {
16+
return nil, fmt.Errorf("Error setting data_collector_id: %s", err)
17+
}
18+
} else if len(nameParts) == 3 {
19+
// `organizations/{{"{{"}}org_name{{"}}"}}/{{"{{"}}data_collector_id{{"}}"}}`
20+
orgId := fmt.Sprintf("organizations/%s", nameParts[1])
21+
if err := d.Set("org_id", orgId); err != nil {
22+
return nil, fmt.Errorf("Error setting org_id: %s", err)
23+
}
24+
if err := d.Set("data_collector_id", nameParts[2]); err != nil {
25+
return nil, fmt.Errorf("Error setting data_collector_id: %s", err)
26+
}
27+
} else {
28+
return nil, fmt.Errorf(
29+
"Saw %s when the name is expected to have shape %s or %s",
30+
d.Get("data_collector_id"),
31+
"organizations/{{"{{"}}org_name{{"}}"}}/datacollectors/{{"{{"}}data_collector_id{{"}}"}}",
32+
"organizations/{{"{{"}}org_name{{"}}"}}/{{"{{"}}data_collector_id{{"}}"}}")
33+
}
34+
35+
// Replace import id for the resource id
36+
id, err := tpgresource.ReplaceVars(d, config, "{{"{{"}}org_id{{"}}"}}/datacollectors/{{"{{"}}data_collector_id{{"}}"}}")
37+
if err != nil {
38+
return nil, fmt.Errorf("Error constructing id: %s", err)
39+
}
40+
d.SetId(id)
41+
42+
return []*schema.ResourceData{d}, nil
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
data "google_client_config" "current" {}
2+
3+
resource "google_compute_network" "apigee_network" {
4+
name = "{{index $.Vars "network_name"}}"
5+
}
6+
7+
resource "google_compute_global_address" "apigee_range" {
8+
name = "{{index $.Vars "range_name"}}"
9+
purpose = "VPC_PEERING"
10+
address_type = "INTERNAL"
11+
prefix_length = 16
12+
network = google_compute_network.apigee_network.id
13+
}
14+
15+
resource "google_service_networking_connection" "apigee_vpc_connection" {
16+
network = google_compute_network.apigee_network.id
17+
service = "servicenetworking.googleapis.com"
18+
reserved_peering_ranges = [google_compute_global_address.apigee_range.name]
19+
}
20+
21+
resource "google_apigee_organization" "apigee_org" {
22+
analytics_region = "us-central1"
23+
project_id = data.google_client_config.current.project
24+
authorized_network = google_compute_network.apigee_network.id
25+
depends_on = [google_service_networking_connection.apigee_vpc_connection]
26+
}
27+
28+
resource "google_apigee_data_collector" "apigee_data_collector" {
29+
org_id = google_apigee_organization.apigee_org.id
30+
data_collector_id = "{{index $.Vars "data_collector_id"}}"
31+
description = "A data collector for custom analytics"
32+
type = "INTEGER"
33+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
resource "google_project" "project" {
2+
project_id = "tf-test%{random_suffix}"
3+
name = "tf-test%{random_suffix}"
4+
org_id = "{{index $.TestEnvVars "org_id"}}"
5+
billing_account = "{{index $.TestEnvVars "billing_account"}}"
6+
deletion_policy = "DELETE"
7+
}
8+
9+
resource "time_sleep" "wait_60_seconds" {
10+
create_duration = "60s"
11+
depends_on = [google_project.project]
12+
}
13+
14+
resource "google_project_service" "apigee" {
15+
project = google_project.project.project_id
16+
service = "apigee.googleapis.com"
17+
depends_on = [time_sleep.wait_60_seconds]
18+
}
19+
20+
resource "google_project_service" "compute" {
21+
project = google_project.project.project_id
22+
service = "compute.googleapis.com"
23+
depends_on = [google_project_service.apigee]
24+
}
25+
26+
resource "google_project_service" "servicenetworking" {
27+
project = google_project.project.project_id
28+
service = "servicenetworking.googleapis.com"
29+
depends_on = [google_project_service.compute]
30+
}
31+
32+
resource "time_sleep" "wait_300_seconds" {
33+
create_duration = "300s"
34+
depends_on = [google_project_service.servicenetworking]
35+
}
36+
37+
resource "google_compute_network" "apigee_network" {
38+
name = "apigee-network"
39+
project = google_project.project.project_id
40+
depends_on = [time_sleep.wait_300_seconds]
41+
}
42+
43+
resource "google_compute_global_address" "apigee_range" {
44+
name = "apigee-range"
45+
purpose = "VPC_PEERING"
46+
address_type = "INTERNAL"
47+
prefix_length = 16
48+
network = google_compute_network.apigee_network.id
49+
project = google_project.project.project_id
50+
}
51+
52+
resource "google_service_networking_connection" "apigee_vpc_connection" {
53+
network = google_compute_network.apigee_network.id
54+
service = "servicenetworking.googleapis.com"
55+
reserved_peering_ranges = [google_compute_global_address.apigee_range.name]
56+
depends_on = [google_project_service.servicenetworking]
57+
}
58+
59+
resource "google_apigee_organization" "apigee_org" {
60+
analytics_region = "us-central1"
61+
project_id = google_project.project.project_id
62+
authorized_network = google_compute_network.apigee_network.id
63+
depends_on = [
64+
google_service_networking_connection.apigee_vpc_connection,
65+
google_project_service.apigee,
66+
]
67+
}
68+
69+
resource "google_apigee_data_collector" "{{$.PrimaryResourceId}}" {
70+
org_id = google_apigee_organization.apigee_org.id
71+
data_collector_id = "dc_tf_test%{random_suffix}"
72+
description = "A test data collector"
73+
type = "INTEGER"
74+
}

0 commit comments

Comments
 (0)