Skip to content

Commit f885138

Browse files
committed
2 parents 479fbfc + 9276451 commit f885138

15 files changed

Lines changed: 277 additions & 15 deletions
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

mmv1/products/compute/RegionInstantSnapshot.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ sweeper:
5252
url_substitutions:
5353
- region: "us-central1"
5454
include_in_tgc_next: true
55+
cai_resource_kind: InstantSnapshot
5556
examples:
5657
- name: 'region_instant_snapshot_basic'
5758
primary_resource_id: 'default'

mmv1/products/vertexai/Index.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ async:
3737
resource_inside_response: true
3838
custom_code:
3939
custom_update: 'templates/terraform/custom_update/vertex_ai_index.go.tmpl'
40+
sweeper:
41+
identifier_field: 'displayName'
4042
examples:
4143
- name: 'vertex_ai_index'
4244
min_version: beta

mmv1/products/vertexai/IndexEndpoint.yaml

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ async:
3535
base_url: '{{op_id}}'
3636
result:
3737
resource_inside_response: true
38-
custom_code:
39-
test_constants: 'templates/terraform/test_constants/import_tpgcompute.go.tmpl'
38+
sweeper:
39+
identifier_field: 'displayName'
4040
examples:
4141
- name: 'vertex_ai_index_endpoint'
4242
primary_resource_id: 'index_endpoint'
@@ -49,22 +49,27 @@ examples:
4949
vars:
5050
network_name: 'network-name'
5151
kms_key_name: 'kms-name'
52+
index_endpoint_display_name: 'sample-endpoint'
5253
test_vars_overrides:
5354
'network_name': 'acctest.BootstrapSharedServiceNetworkingConnection(t, "vpc-network-1")'
5455
'kms_key_name': 'acctest.BootstrapKMSKeyInLocation(t, "us-central1").CryptoKey.Name'
5556
exclude_docs: true
5657
min_version: beta
5758
- name: 'vertex_ai_index_endpoint_with_psc'
5859
primary_resource_id: 'index_endpoint'
60+
vars:
61+
index_endpoint_display_name: 'sample-endpoint'
5962
- name: 'vertex_ai_index_endpoint_with_false_psc'
6063
primary_resource_id: 'index_endpoint'
6164
# It's not distinguishable if the psc is false or not set, so we need to skip the test.
6265
exclude_import_test: true
6366
exclude_docs: true
67+
vars:
68+
index_endpoint_display_name: 'sample-endpoint'
6469
- name: 'vertex_ai_index_endpoint_with_public_endpoint'
6570
primary_resource_id: 'index_endpoint'
66-
test_vars_overrides:
67-
'network_name': 'tpgcompute.BootstrapSharedTestNetwork(t, "vertex-ai-index-endpoint")'
71+
vars:
72+
index_endpoint_display_name: 'sample-endpoint'
6873
parameters:
6974
- name: 'region'
7075
type: String

mmv1/templates/terraform/custom_check_destroy/billing_project_info.go.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
config := acctest.GoogleProviderConfig(t)
77

8-
url, err := tpgresource.ReplaceVarsForTest(config, rs, "{{"{{"}}CoreBillingBasePath{{"}}"}}projects/{{"{{"}}project{{"}}"}}/billingInfo")
8+
url, err := tpgresource.ReplaceVarsForTest(config, rs, transport_tpg.BaseUrl(cloudbilling.Product, config)+"projects/{{"{{"}}project{{"}}"}}/billingInfo")
99
if err != nil {
1010
return err
1111
}
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+
}

mmv1/templates/terraform/examples/vertex_ai_index_endpoint_test.tf.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ resource "google_kms_crypto_key_iam_member" "vertexai_encrypterdecrypter" {
1212

1313
resource "google_vertex_ai_index_endpoint" "{{$.PrimaryResourceId}}" {
1414
provider = google-beta
15-
display_name = "sample-endpoint"
15+
display_name = "{{index $.Vars "index_endpoint_display_name"}}"
1616
description = "A sample vertex endpoint"
1717
region = "us-central1"
1818
labels = {

mmv1/templates/terraform/examples/vertex_ai_index_endpoint_with_false_psc.tf.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
resource "google_vertex_ai_index_endpoint" "{{$.PrimaryResourceId}}" {
2-
display_name = "sample-endpoint"
2+
display_name = "{{index $.Vars "index_endpoint_display_name"}}"
33
description = "A sample vertex endpoint"
44
region = "us-central1"
55
labels = {

0 commit comments

Comments
 (0)