pulumi-gcp 8.40.0a1754721948__py3-none-any.whl → 8.41.0a1754981061__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. pulumi_gcp/__init__.py +128 -0
  2. pulumi_gcp/accesscontextmanager/_inputs.py +24 -4
  3. pulumi_gcp/accesscontextmanager/outputs.py +15 -3
  4. pulumi_gcp/apigee/__init__.py +2 -0
  5. pulumi_gcp/apigee/_inputs.py +1435 -0
  6. pulumi_gcp/apigee/api_product.py +1698 -0
  7. pulumi_gcp/apigee/outputs.py +1081 -0
  8. pulumi_gcp/apigee/security_action.py +1010 -0
  9. pulumi_gcp/artifactregistry/__init__.py +1 -0
  10. pulumi_gcp/artifactregistry/get_docker_images.py +164 -0
  11. pulumi_gcp/artifactregistry/outputs.py +109 -2
  12. pulumi_gcp/artifactregistry/repository.py +6 -6
  13. pulumi_gcp/backupdisasterrecovery/backup_vault.py +56 -0
  14. pulumi_gcp/backupdisasterrecovery/get_backup_vault.py +12 -1
  15. pulumi_gcp/bigquery/_inputs.py +6 -0
  16. pulumi_gcp/bigquery/get_table.py +23 -1
  17. pulumi_gcp/bigquery/outputs.py +4 -0
  18. pulumi_gcp/bigquery/table.py +62 -0
  19. pulumi_gcp/bigqueryanalyticshub/_inputs.py +180 -0
  20. pulumi_gcp/bigqueryanalyticshub/data_exchange.py +80 -0
  21. pulumi_gcp/bigqueryanalyticshub/listing.py +322 -2
  22. pulumi_gcp/bigqueryanalyticshub/listing_subscription.py +32 -0
  23. pulumi_gcp/bigqueryanalyticshub/outputs.py +159 -0
  24. pulumi_gcp/bigtable/__init__.py +1 -0
  25. pulumi_gcp/bigtable/_inputs.py +33 -0
  26. pulumi_gcp/bigtable/outputs.py +36 -0
  27. pulumi_gcp/bigtable/schema_bundle.py +568 -0
  28. pulumi_gcp/cloudfunctions/_inputs.py +48 -0
  29. pulumi_gcp/cloudfunctions/function.py +94 -0
  30. pulumi_gcp/cloudfunctions/get_function.py +23 -1
  31. pulumi_gcp/cloudfunctions/outputs.py +70 -0
  32. pulumi_gcp/cloudrunv2/_inputs.py +20 -0
  33. pulumi_gcp/cloudrunv2/job.py +2 -0
  34. pulumi_gcp/cloudrunv2/outputs.py +25 -0
  35. pulumi_gcp/cloudrunv2/worker_pool.py +2 -0
  36. pulumi_gcp/compute/__init__.py +1 -0
  37. pulumi_gcp/compute/_inputs.py +713 -22
  38. pulumi_gcp/compute/firewall_policy_with_rules.py +66 -0
  39. pulumi_gcp/compute/forwarding_rule.py +0 -21
  40. pulumi_gcp/compute/get_router.py +12 -1
  41. pulumi_gcp/compute/outputs.py +562 -22
  42. pulumi_gcp/compute/preview_feature.py +396 -0
  43. pulumi_gcp/compute/region_url_map.py +392 -0
  44. pulumi_gcp/compute/reservation.py +4 -4
  45. pulumi_gcp/compute/router.py +54 -0
  46. pulumi_gcp/compute/storage_pool.py +154 -0
  47. pulumi_gcp/compute/subnetwork.py +54 -0
  48. pulumi_gcp/config/__init__.pyi +2 -0
  49. pulumi_gcp/config/vars.py +4 -0
  50. pulumi_gcp/container/_inputs.py +278 -8
  51. pulumi_gcp/container/cluster.py +61 -21
  52. pulumi_gcp/container/get_cluster.py +12 -1
  53. pulumi_gcp/container/outputs.py +352 -8
  54. pulumi_gcp/dataproc/_inputs.py +249 -14
  55. pulumi_gcp/dataproc/batch.py +6 -0
  56. pulumi_gcp/dataproc/cluster.py +2 -0
  57. pulumi_gcp/dataproc/outputs.py +215 -12
  58. pulumi_gcp/dataproc/session_template.py +14 -2
  59. pulumi_gcp/developerconnect/__init__.py +1 -0
  60. pulumi_gcp/developerconnect/_inputs.py +583 -0
  61. pulumi_gcp/developerconnect/insights_config.py +895 -0
  62. pulumi_gcp/developerconnect/outputs.py +442 -0
  63. pulumi_gcp/diagflow/__init__.py +1 -0
  64. pulumi_gcp/diagflow/_inputs.py +1165 -58
  65. pulumi_gcp/diagflow/cx_generator.py +636 -0
  66. pulumi_gcp/diagflow/cx_tool.py +2 -2
  67. pulumi_gcp/diagflow/cx_webhook.py +380 -36
  68. pulumi_gcp/diagflow/outputs.py +848 -25
  69. pulumi_gcp/discoveryengine/__init__.py +2 -0
  70. pulumi_gcp/discoveryengine/_inputs.py +465 -0
  71. pulumi_gcp/discoveryengine/cmek_config.py +707 -0
  72. pulumi_gcp/discoveryengine/outputs.py +412 -0
  73. pulumi_gcp/discoveryengine/recommendation_engine.py +813 -0
  74. pulumi_gcp/firestore/field.py +6 -6
  75. pulumi_gcp/gemini/gemini_gcp_enablement_setting.py +107 -9
  76. pulumi_gcp/gemini/gemini_gcp_enablement_setting_binding.py +2 -2
  77. pulumi_gcp/gkehub/membership_binding.py +6 -6
  78. pulumi_gcp/gkehub/membership_rbac_role_binding.py +4 -4
  79. pulumi_gcp/gkehub/namespace.py +4 -4
  80. pulumi_gcp/gkehub/scope_rbac_role_binding.py +8 -8
  81. pulumi_gcp/iam/__init__.py +4 -0
  82. pulumi_gcp/iam/_inputs.py +98 -0
  83. pulumi_gcp/iam/get_workforce_pool_iam_policy.py +161 -0
  84. pulumi_gcp/iam/outputs.py +56 -0
  85. pulumi_gcp/iam/workforce_pool_iam_binding.py +761 -0
  86. pulumi_gcp/iam/workforce_pool_iam_member.py +761 -0
  87. pulumi_gcp/iam/workforce_pool_iam_policy.py +600 -0
  88. pulumi_gcp/iap/tunnel_dest_group.py +2 -2
  89. pulumi_gcp/integrationconnectors/managed_zone.py +8 -8
  90. pulumi_gcp/looker/instance.py +28 -7
  91. pulumi_gcp/managedkafka/_inputs.py +127 -0
  92. pulumi_gcp/managedkafka/cluster.py +131 -1
  93. pulumi_gcp/managedkafka/connect_cluster.py +4 -4
  94. pulumi_gcp/managedkafka/connector.py +4 -4
  95. pulumi_gcp/managedkafka/outputs.py +128 -0
  96. pulumi_gcp/memorystore/instance.py +8 -12
  97. pulumi_gcp/modelarmor/__init__.py +1 -0
  98. pulumi_gcp/modelarmor/_inputs.py +683 -0
  99. pulumi_gcp/modelarmor/floorsetting.py +736 -0
  100. pulumi_gcp/modelarmor/outputs.py +618 -0
  101. pulumi_gcp/networkconnectivity/_inputs.py +60 -0
  102. pulumi_gcp/networkconnectivity/internal_range.py +136 -0
  103. pulumi_gcp/networkconnectivity/outputs.py +55 -0
  104. pulumi_gcp/networkconnectivity/spoke.py +14 -14
  105. pulumi_gcp/oracledatabase/__init__.py +2 -0
  106. pulumi_gcp/oracledatabase/autonomous_database.py +262 -38
  107. pulumi_gcp/oracledatabase/cloud_vm_cluster.py +314 -50
  108. pulumi_gcp/oracledatabase/get_autonomous_database.py +23 -1
  109. pulumi_gcp/oracledatabase/get_cloud_vm_cluster.py +34 -1
  110. pulumi_gcp/oracledatabase/odb_network.py +721 -0
  111. pulumi_gcp/oracledatabase/odb_subnet.py +803 -0
  112. pulumi_gcp/oracledatabase/outputs.py +83 -0
  113. pulumi_gcp/orgpolicy/policy.py +2 -2
  114. pulumi_gcp/parametermanager/parameter_version.py +62 -0
  115. pulumi_gcp/parametermanager/regional_parameter_version.py +64 -0
  116. pulumi_gcp/provider.py +20 -0
  117. pulumi_gcp/pubsub/subscription.py +46 -6
  118. pulumi_gcp/pubsub/topic.py +36 -0
  119. pulumi_gcp/pulumi-plugin.json +1 -1
  120. pulumi_gcp/redis/cluster.py +70 -0
  121. pulumi_gcp/redis/get_cluster.py +12 -1
  122. pulumi_gcp/redis/instance.py +8 -12
  123. pulumi_gcp/secretmanager/get_regional_secret.py +12 -1
  124. pulumi_gcp/secretmanager/get_secret.py +12 -1
  125. pulumi_gcp/secretmanager/outputs.py +30 -0
  126. pulumi_gcp/secretmanager/regional_secret.py +61 -0
  127. pulumi_gcp/secretmanager/secret.py +61 -0
  128. pulumi_gcp/securesourcemanager/branch_rule.py +16 -8
  129. pulumi_gcp/securesourcemanager/instance.py +112 -4
  130. pulumi_gcp/securesourcemanager/repository.py +112 -8
  131. pulumi_gcp/serviceaccount/get_account_key.py +1 -0
  132. pulumi_gcp/sql/_inputs.py +6 -6
  133. pulumi_gcp/sql/database.py +0 -12
  134. pulumi_gcp/sql/outputs.py +4 -4
  135. pulumi_gcp/storage/__init__.py +2 -0
  136. pulumi_gcp/storage/_inputs.py +451 -0
  137. pulumi_gcp/storage/bucket.py +7 -7
  138. pulumi_gcp/storage/bucket_object.py +34 -0
  139. pulumi_gcp/storage/get_bucket_object.py +12 -1
  140. pulumi_gcp/storage/get_bucket_object_content.py +12 -1
  141. pulumi_gcp/storage/get_insights_dataset_config.py +363 -0
  142. pulumi_gcp/storage/insights_dataset_config.py +1280 -0
  143. pulumi_gcp/storage/outputs.py +619 -0
  144. pulumi_gcp/vertex/__init__.py +1 -0
  145. pulumi_gcp/vertex/_inputs.py +3646 -3
  146. pulumi_gcp/vertex/ai_endpoint.py +4 -4
  147. pulumi_gcp/vertex/ai_endpoint_with_model_garden_deployment.py +940 -0
  148. pulumi_gcp/vertex/ai_feature_online_store_featureview.py +4 -4
  149. pulumi_gcp/vertex/outputs.py +2609 -2
  150. pulumi_gcp/vmwareengine/network_peering.py +7 -7
  151. pulumi_gcp/workbench/_inputs.py +118 -0
  152. pulumi_gcp/workbench/instance.py +171 -2
  153. pulumi_gcp/workbench/outputs.py +91 -0
  154. {pulumi_gcp-8.40.0a1754721948.dist-info → pulumi_gcp-8.41.0a1754981061.dist-info}/METADATA +1 -1
  155. {pulumi_gcp-8.40.0a1754721948.dist-info → pulumi_gcp-8.41.0a1754981061.dist-info}/RECORD +157 -138
  156. {pulumi_gcp-8.40.0a1754721948.dist-info → pulumi_gcp-8.41.0a1754981061.dist-info}/WHEEL +0 -0
  157. {pulumi_gcp-8.40.0a1754721948.dist-info → pulumi_gcp-8.41.0a1754981061.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1698 @@
1
+ # coding=utf-8
2
+ # *** WARNING: this file was generated by pulumi-language-python. ***
3
+ # *** Do not edit by hand unless you're certain you know what you are doing! ***
4
+
5
+ import builtins as _builtins
6
+ import warnings
7
+ import sys
8
+ import pulumi
9
+ import pulumi.runtime
10
+ from typing import Any, Mapping, Optional, Sequence, Union, overload
11
+ if sys.version_info >= (3, 11):
12
+ from typing import NotRequired, TypedDict, TypeAlias
13
+ else:
14
+ from typing_extensions import NotRequired, TypedDict, TypeAlias
15
+ from .. import _utilities
16
+ from . import outputs
17
+ from ._inputs import *
18
+
19
+ __all__ = ['ApiProductArgs', 'ApiProduct']
20
+
21
+ @pulumi.input_type
22
+ class ApiProductArgs:
23
+ def __init__(__self__, *,
24
+ display_name: pulumi.Input[_builtins.str],
25
+ org_id: pulumi.Input[_builtins.str],
26
+ api_resources: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
27
+ approval_type: Optional[pulumi.Input[_builtins.str]] = None,
28
+ attributes: Optional[pulumi.Input[Sequence[pulumi.Input['ApiProductAttributeArgs']]]] = None,
29
+ description: Optional[pulumi.Input[_builtins.str]] = None,
30
+ environments: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
31
+ graphql_operation_group: Optional[pulumi.Input['ApiProductGraphqlOperationGroupArgs']] = None,
32
+ grpc_operation_group: Optional[pulumi.Input['ApiProductGrpcOperationGroupArgs']] = None,
33
+ name: Optional[pulumi.Input[_builtins.str]] = None,
34
+ operation_group: Optional[pulumi.Input['ApiProductOperationGroupArgs']] = None,
35
+ proxies: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
36
+ quota: Optional[pulumi.Input[_builtins.str]] = None,
37
+ quota_counter_scope: Optional[pulumi.Input[_builtins.str]] = None,
38
+ quota_interval: Optional[pulumi.Input[_builtins.str]] = None,
39
+ quota_time_unit: Optional[pulumi.Input[_builtins.str]] = None,
40
+ scopes: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
41
+ space: Optional[pulumi.Input[_builtins.str]] = None):
42
+ """
43
+ The set of arguments for constructing a ApiProduct resource.
44
+ :param pulumi.Input[_builtins.str] display_name: Name displayed in the UI or developer portal to developers registering for API access.
45
+ :param pulumi.Input[_builtins.str] org_id: The Apigee Organization associated with the Apigee API product,
46
+ in the format `organizations/{{org_name}}`.
47
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] api_resources: Comma-separated list of API resources to be bundled in the API product. By default, the resource paths are mapped from the proxy.pathsuffix variable.
48
+ The proxy path suffix is defined as the URI fragment following the ProxyEndpoint base path. For example, if the apiResources element is defined to be /forecastrss and the base path defined for the API proxy is /weather, then only requests to /weather/forecastrss are permitted by the API product.
49
+ :param pulumi.Input[_builtins.str] approval_type: Flag that specifies how API keys are approved to access the APIs defined by the API product.
50
+ Valid values are `auto` or `manual`.
51
+ Possible values are: `auto`, `manual`.
52
+ :param pulumi.Input[Sequence[pulumi.Input['ApiProductAttributeArgs']]] attributes: Array of attributes that may be used to extend the default API product profile with customer-specific metadata. You can specify a maximum of 18 attributes.
53
+ Use this property to specify the access level of the API product as either public, private, or internal.
54
+ Structure is documented below.
55
+ :param pulumi.Input[_builtins.str] description: Description of the API product. Include key information about the API product that is not captured by other fields.
56
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] environments: Comma-separated list of environment names to which the API product is bound. Requests to environments that are not listed are rejected.
57
+ By specifying one or more environments, you can bind the resources listed in the API product to a specific environment, preventing developers from accessing those resources through API proxies deployed in another environment.
58
+ :param pulumi.Input['ApiProductGraphqlOperationGroupArgs'] graphql_operation_group: Configuration used to group Apigee proxies or remote services with graphQL operation name, graphQL operation type and quotas. This grouping allows us to precisely set quota for a particular combination of graphQL name and operation type for a particular proxy request. If graphQL name is not set, this would imply quota will be applied on all graphQL requests matching the operation type.
59
+ Structure is documented below.
60
+ :param pulumi.Input['ApiProductGrpcOperationGroupArgs'] grpc_operation_group: Optional. Configuration used to group Apigee proxies with gRPC services and method names. This grouping allows us to set quota for a particular proxy with the gRPC service name and method. If a method name is not set, this implies quota and authorization are applied to all gRPC methods implemented by that proxy for that particular gRPC service.
61
+ Structure is documented below.
62
+ :param pulumi.Input[_builtins.str] name: Internal name of the API product.
63
+ :param pulumi.Input['ApiProductOperationGroupArgs'] operation_group: Configuration used to group Apigee proxies or remote services with resources, method types, and quotas. The resource refers to the resource URI (excluding the base path). With this grouping, the API product creator is able to fine-tune and give precise control over which REST methods have access to specific resources and how many calls can be made (using the quota setting).
64
+ Note: The apiResources setting cannot be specified for both the API product and operation group; otherwise the call will fail.
65
+ Structure is documented below.
66
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] proxies: Comma-separated list of API proxy names to which this API product is bound. By specifying API proxies, you can associate resources in the API product with specific API proxies, preventing developers from accessing those resources through other API proxies.
67
+ Apigee rejects requests to API proxies that are not listed.
68
+ :param pulumi.Input[_builtins.str] quota: Number of request messages permitted per app by this API product for the specified quotaInterval and quotaTimeUnit.
69
+ For example, a quota of 50, for a quotaInterval of 12 and a quotaTimeUnit of hours means 50 requests are allowed every 12 hours.
70
+ :param pulumi.Input[_builtins.str] quota_counter_scope: Scope of the quota decides how the quota counter gets applied and evaluate for quota violation. If the Scope is set as PROXY, then all the operations defined for the APIproduct that are associated with the same proxy will share the same quota counter set at the APIproduct level, making it a global counter at a proxy level. If the Scope is set as OPERATION, then each operations get the counter set at the API product dedicated, making it a local counter. Note that, the QuotaCounterScope applies only when an operation does not have dedicated quota set for itself.
71
+ Possible values are: `QUOTA_COUNTER_SCOPE_UNSPECIFIED`, `PROXY`, `OPERATION`.
72
+ :param pulumi.Input[_builtins.str] quota_interval: Time interval over which the number of request messages is calculated.
73
+ :param pulumi.Input[_builtins.str] quota_time_unit: Time unit defined for the quotaInterval. Valid values include second, minute, hour, day, month or year.
74
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] scopes: Comma-separated list of OAuth scopes that are validated at runtime. Apigee validates that the scopes in any access token presented match the scopes defined in the OAuth policy associated with the API product.
75
+ :param pulumi.Input[_builtins.str] space: Optional. The resource ID of the parent Space. If not set, the parent resource will be the Organization.
76
+ """
77
+ pulumi.set(__self__, "display_name", display_name)
78
+ pulumi.set(__self__, "org_id", org_id)
79
+ if api_resources is not None:
80
+ pulumi.set(__self__, "api_resources", api_resources)
81
+ if approval_type is not None:
82
+ pulumi.set(__self__, "approval_type", approval_type)
83
+ if attributes is not None:
84
+ pulumi.set(__self__, "attributes", attributes)
85
+ if description is not None:
86
+ pulumi.set(__self__, "description", description)
87
+ if environments is not None:
88
+ pulumi.set(__self__, "environments", environments)
89
+ if graphql_operation_group is not None:
90
+ pulumi.set(__self__, "graphql_operation_group", graphql_operation_group)
91
+ if grpc_operation_group is not None:
92
+ pulumi.set(__self__, "grpc_operation_group", grpc_operation_group)
93
+ if name is not None:
94
+ pulumi.set(__self__, "name", name)
95
+ if operation_group is not None:
96
+ pulumi.set(__self__, "operation_group", operation_group)
97
+ if proxies is not None:
98
+ pulumi.set(__self__, "proxies", proxies)
99
+ if quota is not None:
100
+ pulumi.set(__self__, "quota", quota)
101
+ if quota_counter_scope is not None:
102
+ pulumi.set(__self__, "quota_counter_scope", quota_counter_scope)
103
+ if quota_interval is not None:
104
+ pulumi.set(__self__, "quota_interval", quota_interval)
105
+ if quota_time_unit is not None:
106
+ pulumi.set(__self__, "quota_time_unit", quota_time_unit)
107
+ if scopes is not None:
108
+ pulumi.set(__self__, "scopes", scopes)
109
+ if space is not None:
110
+ pulumi.set(__self__, "space", space)
111
+
112
+ @_builtins.property
113
+ @pulumi.getter(name="displayName")
114
+ def display_name(self) -> pulumi.Input[_builtins.str]:
115
+ """
116
+ Name displayed in the UI or developer portal to developers registering for API access.
117
+ """
118
+ return pulumi.get(self, "display_name")
119
+
120
+ @display_name.setter
121
+ def display_name(self, value: pulumi.Input[_builtins.str]):
122
+ pulumi.set(self, "display_name", value)
123
+
124
+ @_builtins.property
125
+ @pulumi.getter(name="orgId")
126
+ def org_id(self) -> pulumi.Input[_builtins.str]:
127
+ """
128
+ The Apigee Organization associated with the Apigee API product,
129
+ in the format `organizations/{{org_name}}`.
130
+ """
131
+ return pulumi.get(self, "org_id")
132
+
133
+ @org_id.setter
134
+ def org_id(self, value: pulumi.Input[_builtins.str]):
135
+ pulumi.set(self, "org_id", value)
136
+
137
+ @_builtins.property
138
+ @pulumi.getter(name="apiResources")
139
+ def api_resources(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]:
140
+ """
141
+ Comma-separated list of API resources to be bundled in the API product. By default, the resource paths are mapped from the proxy.pathsuffix variable.
142
+ The proxy path suffix is defined as the URI fragment following the ProxyEndpoint base path. For example, if the apiResources element is defined to be /forecastrss and the base path defined for the API proxy is /weather, then only requests to /weather/forecastrss are permitted by the API product.
143
+ """
144
+ return pulumi.get(self, "api_resources")
145
+
146
+ @api_resources.setter
147
+ def api_resources(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]):
148
+ pulumi.set(self, "api_resources", value)
149
+
150
+ @_builtins.property
151
+ @pulumi.getter(name="approvalType")
152
+ def approval_type(self) -> Optional[pulumi.Input[_builtins.str]]:
153
+ """
154
+ Flag that specifies how API keys are approved to access the APIs defined by the API product.
155
+ Valid values are `auto` or `manual`.
156
+ Possible values are: `auto`, `manual`.
157
+ """
158
+ return pulumi.get(self, "approval_type")
159
+
160
+ @approval_type.setter
161
+ def approval_type(self, value: Optional[pulumi.Input[_builtins.str]]):
162
+ pulumi.set(self, "approval_type", value)
163
+
164
+ @_builtins.property
165
+ @pulumi.getter
166
+ def attributes(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['ApiProductAttributeArgs']]]]:
167
+ """
168
+ Array of attributes that may be used to extend the default API product profile with customer-specific metadata. You can specify a maximum of 18 attributes.
169
+ Use this property to specify the access level of the API product as either public, private, or internal.
170
+ Structure is documented below.
171
+ """
172
+ return pulumi.get(self, "attributes")
173
+
174
+ @attributes.setter
175
+ def attributes(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['ApiProductAttributeArgs']]]]):
176
+ pulumi.set(self, "attributes", value)
177
+
178
+ @_builtins.property
179
+ @pulumi.getter
180
+ def description(self) -> Optional[pulumi.Input[_builtins.str]]:
181
+ """
182
+ Description of the API product. Include key information about the API product that is not captured by other fields.
183
+ """
184
+ return pulumi.get(self, "description")
185
+
186
+ @description.setter
187
+ def description(self, value: Optional[pulumi.Input[_builtins.str]]):
188
+ pulumi.set(self, "description", value)
189
+
190
+ @_builtins.property
191
+ @pulumi.getter
192
+ def environments(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]:
193
+ """
194
+ Comma-separated list of environment names to which the API product is bound. Requests to environments that are not listed are rejected.
195
+ By specifying one or more environments, you can bind the resources listed in the API product to a specific environment, preventing developers from accessing those resources through API proxies deployed in another environment.
196
+ """
197
+ return pulumi.get(self, "environments")
198
+
199
+ @environments.setter
200
+ def environments(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]):
201
+ pulumi.set(self, "environments", value)
202
+
203
+ @_builtins.property
204
+ @pulumi.getter(name="graphqlOperationGroup")
205
+ def graphql_operation_group(self) -> Optional[pulumi.Input['ApiProductGraphqlOperationGroupArgs']]:
206
+ """
207
+ Configuration used to group Apigee proxies or remote services with graphQL operation name, graphQL operation type and quotas. This grouping allows us to precisely set quota for a particular combination of graphQL name and operation type for a particular proxy request. If graphQL name is not set, this would imply quota will be applied on all graphQL requests matching the operation type.
208
+ Structure is documented below.
209
+ """
210
+ return pulumi.get(self, "graphql_operation_group")
211
+
212
+ @graphql_operation_group.setter
213
+ def graphql_operation_group(self, value: Optional[pulumi.Input['ApiProductGraphqlOperationGroupArgs']]):
214
+ pulumi.set(self, "graphql_operation_group", value)
215
+
216
+ @_builtins.property
217
+ @pulumi.getter(name="grpcOperationGroup")
218
+ def grpc_operation_group(self) -> Optional[pulumi.Input['ApiProductGrpcOperationGroupArgs']]:
219
+ """
220
+ Optional. Configuration used to group Apigee proxies with gRPC services and method names. This grouping allows us to set quota for a particular proxy with the gRPC service name and method. If a method name is not set, this implies quota and authorization are applied to all gRPC methods implemented by that proxy for that particular gRPC service.
221
+ Structure is documented below.
222
+ """
223
+ return pulumi.get(self, "grpc_operation_group")
224
+
225
+ @grpc_operation_group.setter
226
+ def grpc_operation_group(self, value: Optional[pulumi.Input['ApiProductGrpcOperationGroupArgs']]):
227
+ pulumi.set(self, "grpc_operation_group", value)
228
+
229
+ @_builtins.property
230
+ @pulumi.getter
231
+ def name(self) -> Optional[pulumi.Input[_builtins.str]]:
232
+ """
233
+ Internal name of the API product.
234
+ """
235
+ return pulumi.get(self, "name")
236
+
237
+ @name.setter
238
+ def name(self, value: Optional[pulumi.Input[_builtins.str]]):
239
+ pulumi.set(self, "name", value)
240
+
241
+ @_builtins.property
242
+ @pulumi.getter(name="operationGroup")
243
+ def operation_group(self) -> Optional[pulumi.Input['ApiProductOperationGroupArgs']]:
244
+ """
245
+ Configuration used to group Apigee proxies or remote services with resources, method types, and quotas. The resource refers to the resource URI (excluding the base path). With this grouping, the API product creator is able to fine-tune and give precise control over which REST methods have access to specific resources and how many calls can be made (using the quota setting).
246
+ Note: The apiResources setting cannot be specified for both the API product and operation group; otherwise the call will fail.
247
+ Structure is documented below.
248
+ """
249
+ return pulumi.get(self, "operation_group")
250
+
251
+ @operation_group.setter
252
+ def operation_group(self, value: Optional[pulumi.Input['ApiProductOperationGroupArgs']]):
253
+ pulumi.set(self, "operation_group", value)
254
+
255
+ @_builtins.property
256
+ @pulumi.getter
257
+ def proxies(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]:
258
+ """
259
+ Comma-separated list of API proxy names to which this API product is bound. By specifying API proxies, you can associate resources in the API product with specific API proxies, preventing developers from accessing those resources through other API proxies.
260
+ Apigee rejects requests to API proxies that are not listed.
261
+ """
262
+ return pulumi.get(self, "proxies")
263
+
264
+ @proxies.setter
265
+ def proxies(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]):
266
+ pulumi.set(self, "proxies", value)
267
+
268
+ @_builtins.property
269
+ @pulumi.getter
270
+ def quota(self) -> Optional[pulumi.Input[_builtins.str]]:
271
+ """
272
+ Number of request messages permitted per app by this API product for the specified quotaInterval and quotaTimeUnit.
273
+ For example, a quota of 50, for a quotaInterval of 12 and a quotaTimeUnit of hours means 50 requests are allowed every 12 hours.
274
+ """
275
+ return pulumi.get(self, "quota")
276
+
277
+ @quota.setter
278
+ def quota(self, value: Optional[pulumi.Input[_builtins.str]]):
279
+ pulumi.set(self, "quota", value)
280
+
281
+ @_builtins.property
282
+ @pulumi.getter(name="quotaCounterScope")
283
+ def quota_counter_scope(self) -> Optional[pulumi.Input[_builtins.str]]:
284
+ """
285
+ Scope of the quota decides how the quota counter gets applied and evaluate for quota violation. If the Scope is set as PROXY, then all the operations defined for the APIproduct that are associated with the same proxy will share the same quota counter set at the APIproduct level, making it a global counter at a proxy level. If the Scope is set as OPERATION, then each operations get the counter set at the API product dedicated, making it a local counter. Note that, the QuotaCounterScope applies only when an operation does not have dedicated quota set for itself.
286
+ Possible values are: `QUOTA_COUNTER_SCOPE_UNSPECIFIED`, `PROXY`, `OPERATION`.
287
+ """
288
+ return pulumi.get(self, "quota_counter_scope")
289
+
290
+ @quota_counter_scope.setter
291
+ def quota_counter_scope(self, value: Optional[pulumi.Input[_builtins.str]]):
292
+ pulumi.set(self, "quota_counter_scope", value)
293
+
294
+ @_builtins.property
295
+ @pulumi.getter(name="quotaInterval")
296
+ def quota_interval(self) -> Optional[pulumi.Input[_builtins.str]]:
297
+ """
298
+ Time interval over which the number of request messages is calculated.
299
+ """
300
+ return pulumi.get(self, "quota_interval")
301
+
302
+ @quota_interval.setter
303
+ def quota_interval(self, value: Optional[pulumi.Input[_builtins.str]]):
304
+ pulumi.set(self, "quota_interval", value)
305
+
306
+ @_builtins.property
307
+ @pulumi.getter(name="quotaTimeUnit")
308
+ def quota_time_unit(self) -> Optional[pulumi.Input[_builtins.str]]:
309
+ """
310
+ Time unit defined for the quotaInterval. Valid values include second, minute, hour, day, month or year.
311
+ """
312
+ return pulumi.get(self, "quota_time_unit")
313
+
314
+ @quota_time_unit.setter
315
+ def quota_time_unit(self, value: Optional[pulumi.Input[_builtins.str]]):
316
+ pulumi.set(self, "quota_time_unit", value)
317
+
318
+ @_builtins.property
319
+ @pulumi.getter
320
+ def scopes(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]:
321
+ """
322
+ Comma-separated list of OAuth scopes that are validated at runtime. Apigee validates that the scopes in any access token presented match the scopes defined in the OAuth policy associated with the API product.
323
+ """
324
+ return pulumi.get(self, "scopes")
325
+
326
+ @scopes.setter
327
+ def scopes(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]):
328
+ pulumi.set(self, "scopes", value)
329
+
330
+ @_builtins.property
331
+ @pulumi.getter
332
+ def space(self) -> Optional[pulumi.Input[_builtins.str]]:
333
+ """
334
+ Optional. The resource ID of the parent Space. If not set, the parent resource will be the Organization.
335
+ """
336
+ return pulumi.get(self, "space")
337
+
338
+ @space.setter
339
+ def space(self, value: Optional[pulumi.Input[_builtins.str]]):
340
+ pulumi.set(self, "space", value)
341
+
342
+
343
+ @pulumi.input_type
344
+ class _ApiProductState:
345
+ def __init__(__self__, *,
346
+ api_resources: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
347
+ approval_type: Optional[pulumi.Input[_builtins.str]] = None,
348
+ attributes: Optional[pulumi.Input[Sequence[pulumi.Input['ApiProductAttributeArgs']]]] = None,
349
+ created_at: Optional[pulumi.Input[_builtins.str]] = None,
350
+ description: Optional[pulumi.Input[_builtins.str]] = None,
351
+ display_name: Optional[pulumi.Input[_builtins.str]] = None,
352
+ environments: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
353
+ graphql_operation_group: Optional[pulumi.Input['ApiProductGraphqlOperationGroupArgs']] = None,
354
+ grpc_operation_group: Optional[pulumi.Input['ApiProductGrpcOperationGroupArgs']] = None,
355
+ last_modified_at: Optional[pulumi.Input[_builtins.str]] = None,
356
+ name: Optional[pulumi.Input[_builtins.str]] = None,
357
+ operation_group: Optional[pulumi.Input['ApiProductOperationGroupArgs']] = None,
358
+ org_id: Optional[pulumi.Input[_builtins.str]] = None,
359
+ proxies: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
360
+ quota: Optional[pulumi.Input[_builtins.str]] = None,
361
+ quota_counter_scope: Optional[pulumi.Input[_builtins.str]] = None,
362
+ quota_interval: Optional[pulumi.Input[_builtins.str]] = None,
363
+ quota_time_unit: Optional[pulumi.Input[_builtins.str]] = None,
364
+ scopes: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
365
+ space: Optional[pulumi.Input[_builtins.str]] = None):
366
+ """
367
+ Input properties used for looking up and filtering ApiProduct resources.
368
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] api_resources: Comma-separated list of API resources to be bundled in the API product. By default, the resource paths are mapped from the proxy.pathsuffix variable.
369
+ The proxy path suffix is defined as the URI fragment following the ProxyEndpoint base path. For example, if the apiResources element is defined to be /forecastrss and the base path defined for the API proxy is /weather, then only requests to /weather/forecastrss are permitted by the API product.
370
+ :param pulumi.Input[_builtins.str] approval_type: Flag that specifies how API keys are approved to access the APIs defined by the API product.
371
+ Valid values are `auto` or `manual`.
372
+ Possible values are: `auto`, `manual`.
373
+ :param pulumi.Input[Sequence[pulumi.Input['ApiProductAttributeArgs']]] attributes: Array of attributes that may be used to extend the default API product profile with customer-specific metadata. You can specify a maximum of 18 attributes.
374
+ Use this property to specify the access level of the API product as either public, private, or internal.
375
+ Structure is documented below.
376
+ :param pulumi.Input[_builtins.str] created_at: Response only. Creation time of this environment as milliseconds since epoch.
377
+ :param pulumi.Input[_builtins.str] description: Description of the API product. Include key information about the API product that is not captured by other fields.
378
+ :param pulumi.Input[_builtins.str] display_name: Name displayed in the UI or developer portal to developers registering for API access.
379
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] environments: Comma-separated list of environment names to which the API product is bound. Requests to environments that are not listed are rejected.
380
+ By specifying one or more environments, you can bind the resources listed in the API product to a specific environment, preventing developers from accessing those resources through API proxies deployed in another environment.
381
+ :param pulumi.Input['ApiProductGraphqlOperationGroupArgs'] graphql_operation_group: Configuration used to group Apigee proxies or remote services with graphQL operation name, graphQL operation type and quotas. This grouping allows us to precisely set quota for a particular combination of graphQL name and operation type for a particular proxy request. If graphQL name is not set, this would imply quota will be applied on all graphQL requests matching the operation type.
382
+ Structure is documented below.
383
+ :param pulumi.Input['ApiProductGrpcOperationGroupArgs'] grpc_operation_group: Optional. Configuration used to group Apigee proxies with gRPC services and method names. This grouping allows us to set quota for a particular proxy with the gRPC service name and method. If a method name is not set, this implies quota and authorization are applied to all gRPC methods implemented by that proxy for that particular gRPC service.
384
+ Structure is documented below.
385
+ :param pulumi.Input[_builtins.str] last_modified_at: Response only. Modified time of this environment as milliseconds since epoch.
386
+ :param pulumi.Input[_builtins.str] name: Internal name of the API product.
387
+ :param pulumi.Input['ApiProductOperationGroupArgs'] operation_group: Configuration used to group Apigee proxies or remote services with resources, method types, and quotas. The resource refers to the resource URI (excluding the base path). With this grouping, the API product creator is able to fine-tune and give precise control over which REST methods have access to specific resources and how many calls can be made (using the quota setting).
388
+ Note: The apiResources setting cannot be specified for both the API product and operation group; otherwise the call will fail.
389
+ Structure is documented below.
390
+ :param pulumi.Input[_builtins.str] org_id: The Apigee Organization associated with the Apigee API product,
391
+ in the format `organizations/{{org_name}}`.
392
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] proxies: Comma-separated list of API proxy names to which this API product is bound. By specifying API proxies, you can associate resources in the API product with specific API proxies, preventing developers from accessing those resources through other API proxies.
393
+ Apigee rejects requests to API proxies that are not listed.
394
+ :param pulumi.Input[_builtins.str] quota: Number of request messages permitted per app by this API product for the specified quotaInterval and quotaTimeUnit.
395
+ For example, a quota of 50, for a quotaInterval of 12 and a quotaTimeUnit of hours means 50 requests are allowed every 12 hours.
396
+ :param pulumi.Input[_builtins.str] quota_counter_scope: Scope of the quota decides how the quota counter gets applied and evaluate for quota violation. If the Scope is set as PROXY, then all the operations defined for the APIproduct that are associated with the same proxy will share the same quota counter set at the APIproduct level, making it a global counter at a proxy level. If the Scope is set as OPERATION, then each operations get the counter set at the API product dedicated, making it a local counter. Note that, the QuotaCounterScope applies only when an operation does not have dedicated quota set for itself.
397
+ Possible values are: `QUOTA_COUNTER_SCOPE_UNSPECIFIED`, `PROXY`, `OPERATION`.
398
+ :param pulumi.Input[_builtins.str] quota_interval: Time interval over which the number of request messages is calculated.
399
+ :param pulumi.Input[_builtins.str] quota_time_unit: Time unit defined for the quotaInterval. Valid values include second, minute, hour, day, month or year.
400
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] scopes: Comma-separated list of OAuth scopes that are validated at runtime. Apigee validates that the scopes in any access token presented match the scopes defined in the OAuth policy associated with the API product.
401
+ :param pulumi.Input[_builtins.str] space: Optional. The resource ID of the parent Space. If not set, the parent resource will be the Organization.
402
+ """
403
+ if api_resources is not None:
404
+ pulumi.set(__self__, "api_resources", api_resources)
405
+ if approval_type is not None:
406
+ pulumi.set(__self__, "approval_type", approval_type)
407
+ if attributes is not None:
408
+ pulumi.set(__self__, "attributes", attributes)
409
+ if created_at is not None:
410
+ pulumi.set(__self__, "created_at", created_at)
411
+ if description is not None:
412
+ pulumi.set(__self__, "description", description)
413
+ if display_name is not None:
414
+ pulumi.set(__self__, "display_name", display_name)
415
+ if environments is not None:
416
+ pulumi.set(__self__, "environments", environments)
417
+ if graphql_operation_group is not None:
418
+ pulumi.set(__self__, "graphql_operation_group", graphql_operation_group)
419
+ if grpc_operation_group is not None:
420
+ pulumi.set(__self__, "grpc_operation_group", grpc_operation_group)
421
+ if last_modified_at is not None:
422
+ pulumi.set(__self__, "last_modified_at", last_modified_at)
423
+ if name is not None:
424
+ pulumi.set(__self__, "name", name)
425
+ if operation_group is not None:
426
+ pulumi.set(__self__, "operation_group", operation_group)
427
+ if org_id is not None:
428
+ pulumi.set(__self__, "org_id", org_id)
429
+ if proxies is not None:
430
+ pulumi.set(__self__, "proxies", proxies)
431
+ if quota is not None:
432
+ pulumi.set(__self__, "quota", quota)
433
+ if quota_counter_scope is not None:
434
+ pulumi.set(__self__, "quota_counter_scope", quota_counter_scope)
435
+ if quota_interval is not None:
436
+ pulumi.set(__self__, "quota_interval", quota_interval)
437
+ if quota_time_unit is not None:
438
+ pulumi.set(__self__, "quota_time_unit", quota_time_unit)
439
+ if scopes is not None:
440
+ pulumi.set(__self__, "scopes", scopes)
441
+ if space is not None:
442
+ pulumi.set(__self__, "space", space)
443
+
444
+ @_builtins.property
445
+ @pulumi.getter(name="apiResources")
446
+ def api_resources(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]:
447
+ """
448
+ Comma-separated list of API resources to be bundled in the API product. By default, the resource paths are mapped from the proxy.pathsuffix variable.
449
+ The proxy path suffix is defined as the URI fragment following the ProxyEndpoint base path. For example, if the apiResources element is defined to be /forecastrss and the base path defined for the API proxy is /weather, then only requests to /weather/forecastrss are permitted by the API product.
450
+ """
451
+ return pulumi.get(self, "api_resources")
452
+
453
+ @api_resources.setter
454
+ def api_resources(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]):
455
+ pulumi.set(self, "api_resources", value)
456
+
457
+ @_builtins.property
458
+ @pulumi.getter(name="approvalType")
459
+ def approval_type(self) -> Optional[pulumi.Input[_builtins.str]]:
460
+ """
461
+ Flag that specifies how API keys are approved to access the APIs defined by the API product.
462
+ Valid values are `auto` or `manual`.
463
+ Possible values are: `auto`, `manual`.
464
+ """
465
+ return pulumi.get(self, "approval_type")
466
+
467
+ @approval_type.setter
468
+ def approval_type(self, value: Optional[pulumi.Input[_builtins.str]]):
469
+ pulumi.set(self, "approval_type", value)
470
+
471
+ @_builtins.property
472
+ @pulumi.getter
473
+ def attributes(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['ApiProductAttributeArgs']]]]:
474
+ """
475
+ Array of attributes that may be used to extend the default API product profile with customer-specific metadata. You can specify a maximum of 18 attributes.
476
+ Use this property to specify the access level of the API product as either public, private, or internal.
477
+ Structure is documented below.
478
+ """
479
+ return pulumi.get(self, "attributes")
480
+
481
+ @attributes.setter
482
+ def attributes(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['ApiProductAttributeArgs']]]]):
483
+ pulumi.set(self, "attributes", value)
484
+
485
+ @_builtins.property
486
+ @pulumi.getter(name="createdAt")
487
+ def created_at(self) -> Optional[pulumi.Input[_builtins.str]]:
488
+ """
489
+ Response only. Creation time of this environment as milliseconds since epoch.
490
+ """
491
+ return pulumi.get(self, "created_at")
492
+
493
+ @created_at.setter
494
+ def created_at(self, value: Optional[pulumi.Input[_builtins.str]]):
495
+ pulumi.set(self, "created_at", value)
496
+
497
+ @_builtins.property
498
+ @pulumi.getter
499
+ def description(self) -> Optional[pulumi.Input[_builtins.str]]:
500
+ """
501
+ Description of the API product. Include key information about the API product that is not captured by other fields.
502
+ """
503
+ return pulumi.get(self, "description")
504
+
505
+ @description.setter
506
+ def description(self, value: Optional[pulumi.Input[_builtins.str]]):
507
+ pulumi.set(self, "description", value)
508
+
509
+ @_builtins.property
510
+ @pulumi.getter(name="displayName")
511
+ def display_name(self) -> Optional[pulumi.Input[_builtins.str]]:
512
+ """
513
+ Name displayed in the UI or developer portal to developers registering for API access.
514
+ """
515
+ return pulumi.get(self, "display_name")
516
+
517
+ @display_name.setter
518
+ def display_name(self, value: Optional[pulumi.Input[_builtins.str]]):
519
+ pulumi.set(self, "display_name", value)
520
+
521
+ @_builtins.property
522
+ @pulumi.getter
523
+ def environments(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]:
524
+ """
525
+ Comma-separated list of environment names to which the API product is bound. Requests to environments that are not listed are rejected.
526
+ By specifying one or more environments, you can bind the resources listed in the API product to a specific environment, preventing developers from accessing those resources through API proxies deployed in another environment.
527
+ """
528
+ return pulumi.get(self, "environments")
529
+
530
+ @environments.setter
531
+ def environments(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]):
532
+ pulumi.set(self, "environments", value)
533
+
534
+ @_builtins.property
535
+ @pulumi.getter(name="graphqlOperationGroup")
536
+ def graphql_operation_group(self) -> Optional[pulumi.Input['ApiProductGraphqlOperationGroupArgs']]:
537
+ """
538
+ Configuration used to group Apigee proxies or remote services with graphQL operation name, graphQL operation type and quotas. This grouping allows us to precisely set quota for a particular combination of graphQL name and operation type for a particular proxy request. If graphQL name is not set, this would imply quota will be applied on all graphQL requests matching the operation type.
539
+ Structure is documented below.
540
+ """
541
+ return pulumi.get(self, "graphql_operation_group")
542
+
543
+ @graphql_operation_group.setter
544
+ def graphql_operation_group(self, value: Optional[pulumi.Input['ApiProductGraphqlOperationGroupArgs']]):
545
+ pulumi.set(self, "graphql_operation_group", value)
546
+
547
+ @_builtins.property
548
+ @pulumi.getter(name="grpcOperationGroup")
549
+ def grpc_operation_group(self) -> Optional[pulumi.Input['ApiProductGrpcOperationGroupArgs']]:
550
+ """
551
+ Optional. Configuration used to group Apigee proxies with gRPC services and method names. This grouping allows us to set quota for a particular proxy with the gRPC service name and method. If a method name is not set, this implies quota and authorization are applied to all gRPC methods implemented by that proxy for that particular gRPC service.
552
+ Structure is documented below.
553
+ """
554
+ return pulumi.get(self, "grpc_operation_group")
555
+
556
+ @grpc_operation_group.setter
557
+ def grpc_operation_group(self, value: Optional[pulumi.Input['ApiProductGrpcOperationGroupArgs']]):
558
+ pulumi.set(self, "grpc_operation_group", value)
559
+
560
+ @_builtins.property
561
+ @pulumi.getter(name="lastModifiedAt")
562
+ def last_modified_at(self) -> Optional[pulumi.Input[_builtins.str]]:
563
+ """
564
+ Response only. Modified time of this environment as milliseconds since epoch.
565
+ """
566
+ return pulumi.get(self, "last_modified_at")
567
+
568
+ @last_modified_at.setter
569
+ def last_modified_at(self, value: Optional[pulumi.Input[_builtins.str]]):
570
+ pulumi.set(self, "last_modified_at", value)
571
+
572
+ @_builtins.property
573
+ @pulumi.getter
574
+ def name(self) -> Optional[pulumi.Input[_builtins.str]]:
575
+ """
576
+ Internal name of the API product.
577
+ """
578
+ return pulumi.get(self, "name")
579
+
580
+ @name.setter
581
+ def name(self, value: Optional[pulumi.Input[_builtins.str]]):
582
+ pulumi.set(self, "name", value)
583
+
584
+ @_builtins.property
585
+ @pulumi.getter(name="operationGroup")
586
+ def operation_group(self) -> Optional[pulumi.Input['ApiProductOperationGroupArgs']]:
587
+ """
588
+ Configuration used to group Apigee proxies or remote services with resources, method types, and quotas. The resource refers to the resource URI (excluding the base path). With this grouping, the API product creator is able to fine-tune and give precise control over which REST methods have access to specific resources and how many calls can be made (using the quota setting).
589
+ Note: The apiResources setting cannot be specified for both the API product and operation group; otherwise the call will fail.
590
+ Structure is documented below.
591
+ """
592
+ return pulumi.get(self, "operation_group")
593
+
594
+ @operation_group.setter
595
+ def operation_group(self, value: Optional[pulumi.Input['ApiProductOperationGroupArgs']]):
596
+ pulumi.set(self, "operation_group", value)
597
+
598
+ @_builtins.property
599
+ @pulumi.getter(name="orgId")
600
+ def org_id(self) -> Optional[pulumi.Input[_builtins.str]]:
601
+ """
602
+ The Apigee Organization associated with the Apigee API product,
603
+ in the format `organizations/{{org_name}}`.
604
+ """
605
+ return pulumi.get(self, "org_id")
606
+
607
+ @org_id.setter
608
+ def org_id(self, value: Optional[pulumi.Input[_builtins.str]]):
609
+ pulumi.set(self, "org_id", value)
610
+
611
+ @_builtins.property
612
+ @pulumi.getter
613
+ def proxies(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]:
614
+ """
615
+ Comma-separated list of API proxy names to which this API product is bound. By specifying API proxies, you can associate resources in the API product with specific API proxies, preventing developers from accessing those resources through other API proxies.
616
+ Apigee rejects requests to API proxies that are not listed.
617
+ """
618
+ return pulumi.get(self, "proxies")
619
+
620
+ @proxies.setter
621
+ def proxies(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]):
622
+ pulumi.set(self, "proxies", value)
623
+
624
+ @_builtins.property
625
+ @pulumi.getter
626
+ def quota(self) -> Optional[pulumi.Input[_builtins.str]]:
627
+ """
628
+ Number of request messages permitted per app by this API product for the specified quotaInterval and quotaTimeUnit.
629
+ For example, a quota of 50, for a quotaInterval of 12 and a quotaTimeUnit of hours means 50 requests are allowed every 12 hours.
630
+ """
631
+ return pulumi.get(self, "quota")
632
+
633
+ @quota.setter
634
+ def quota(self, value: Optional[pulumi.Input[_builtins.str]]):
635
+ pulumi.set(self, "quota", value)
636
+
637
+ @_builtins.property
638
+ @pulumi.getter(name="quotaCounterScope")
639
+ def quota_counter_scope(self) -> Optional[pulumi.Input[_builtins.str]]:
640
+ """
641
+ Scope of the quota decides how the quota counter gets applied and evaluate for quota violation. If the Scope is set as PROXY, then all the operations defined for the APIproduct that are associated with the same proxy will share the same quota counter set at the APIproduct level, making it a global counter at a proxy level. If the Scope is set as OPERATION, then each operations get the counter set at the API product dedicated, making it a local counter. Note that, the QuotaCounterScope applies only when an operation does not have dedicated quota set for itself.
642
+ Possible values are: `QUOTA_COUNTER_SCOPE_UNSPECIFIED`, `PROXY`, `OPERATION`.
643
+ """
644
+ return pulumi.get(self, "quota_counter_scope")
645
+
646
+ @quota_counter_scope.setter
647
+ def quota_counter_scope(self, value: Optional[pulumi.Input[_builtins.str]]):
648
+ pulumi.set(self, "quota_counter_scope", value)
649
+
650
+ @_builtins.property
651
+ @pulumi.getter(name="quotaInterval")
652
+ def quota_interval(self) -> Optional[pulumi.Input[_builtins.str]]:
653
+ """
654
+ Time interval over which the number of request messages is calculated.
655
+ """
656
+ return pulumi.get(self, "quota_interval")
657
+
658
+ @quota_interval.setter
659
+ def quota_interval(self, value: Optional[pulumi.Input[_builtins.str]]):
660
+ pulumi.set(self, "quota_interval", value)
661
+
662
+ @_builtins.property
663
+ @pulumi.getter(name="quotaTimeUnit")
664
+ def quota_time_unit(self) -> Optional[pulumi.Input[_builtins.str]]:
665
+ """
666
+ Time unit defined for the quotaInterval. Valid values include second, minute, hour, day, month or year.
667
+ """
668
+ return pulumi.get(self, "quota_time_unit")
669
+
670
+ @quota_time_unit.setter
671
+ def quota_time_unit(self, value: Optional[pulumi.Input[_builtins.str]]):
672
+ pulumi.set(self, "quota_time_unit", value)
673
+
674
+ @_builtins.property
675
+ @pulumi.getter
676
+ def scopes(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]:
677
+ """
678
+ Comma-separated list of OAuth scopes that are validated at runtime. Apigee validates that the scopes in any access token presented match the scopes defined in the OAuth policy associated with the API product.
679
+ """
680
+ return pulumi.get(self, "scopes")
681
+
682
+ @scopes.setter
683
+ def scopes(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]):
684
+ pulumi.set(self, "scopes", value)
685
+
686
+ @_builtins.property
687
+ @pulumi.getter
688
+ def space(self) -> Optional[pulumi.Input[_builtins.str]]:
689
+ """
690
+ Optional. The resource ID of the parent Space. If not set, the parent resource will be the Organization.
691
+ """
692
+ return pulumi.get(self, "space")
693
+
694
+ @space.setter
695
+ def space(self, value: Optional[pulumi.Input[_builtins.str]]):
696
+ pulumi.set(self, "space", value)
697
+
698
+
699
+ @pulumi.type_token("gcp:apigee/apiProduct:ApiProduct")
700
+ class ApiProduct(pulumi.CustomResource):
701
+ @overload
702
+ def __init__(__self__,
703
+ resource_name: str,
704
+ opts: Optional[pulumi.ResourceOptions] = None,
705
+ api_resources: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
706
+ approval_type: Optional[pulumi.Input[_builtins.str]] = None,
707
+ attributes: Optional[pulumi.Input[Sequence[pulumi.Input[Union['ApiProductAttributeArgs', 'ApiProductAttributeArgsDict']]]]] = None,
708
+ description: Optional[pulumi.Input[_builtins.str]] = None,
709
+ display_name: Optional[pulumi.Input[_builtins.str]] = None,
710
+ environments: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
711
+ graphql_operation_group: Optional[pulumi.Input[Union['ApiProductGraphqlOperationGroupArgs', 'ApiProductGraphqlOperationGroupArgsDict']]] = None,
712
+ grpc_operation_group: Optional[pulumi.Input[Union['ApiProductGrpcOperationGroupArgs', 'ApiProductGrpcOperationGroupArgsDict']]] = None,
713
+ name: Optional[pulumi.Input[_builtins.str]] = None,
714
+ operation_group: Optional[pulumi.Input[Union['ApiProductOperationGroupArgs', 'ApiProductOperationGroupArgsDict']]] = None,
715
+ org_id: Optional[pulumi.Input[_builtins.str]] = None,
716
+ proxies: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
717
+ quota: Optional[pulumi.Input[_builtins.str]] = None,
718
+ quota_counter_scope: Optional[pulumi.Input[_builtins.str]] = None,
719
+ quota_interval: Optional[pulumi.Input[_builtins.str]] = None,
720
+ quota_time_unit: Optional[pulumi.Input[_builtins.str]] = None,
721
+ scopes: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
722
+ space: Optional[pulumi.Input[_builtins.str]] = None,
723
+ __props__=None):
724
+ """
725
+ An `ApiProduct` in Apigee.
726
+
727
+ To get more information about ApiProduct, see:
728
+
729
+ * [API documentation](https://cloud.google.com/apigee/docs/reference/apis/apigee/rest/v1/organizations.apiproducts#ApiProduct)
730
+ * How-to Guides
731
+ * [Creating an API product](https://cloud.google.com/apigee/docs/api-platform/publish/what-api-product)
732
+
733
+ ## Example Usage
734
+
735
+ ### Apigee Api Product Basic
736
+
737
+ ```python
738
+ import pulumi
739
+ import pulumi_gcp as gcp
740
+
741
+ current = gcp.organizations.get_client_config()
742
+ apigee_network = gcp.compute.Network("apigee_network", name="apigee-network")
743
+ apigee_range = gcp.compute.GlobalAddress("apigee_range",
744
+ name="apigee-range",
745
+ purpose="VPC_PEERING",
746
+ address_type="INTERNAL",
747
+ prefix_length=16,
748
+ network=apigee_network.id)
749
+ apigee_vpc_connection = gcp.servicenetworking.Connection("apigee_vpc_connection",
750
+ network=apigee_network.id,
751
+ service="servicenetworking.googleapis.com",
752
+ reserved_peering_ranges=[apigee_range.name])
753
+ apigee_org = gcp.apigee.Organization("apigee_org",
754
+ analytics_region="us-central1",
755
+ project_id=current.project,
756
+ authorized_network=apigee_network.id,
757
+ opts = pulumi.ResourceOptions(depends_on=[apigee_vpc_connection]))
758
+ apigee_instance = gcp.apigee.Instance("apigee_instance",
759
+ name="my-instance",
760
+ location="us-central1",
761
+ org_id=apigee_org.id,
762
+ peering_cidr_range="SLASH_22")
763
+ basic_api_product = gcp.apigee.ApiProduct("basic_api_product",
764
+ org_id=apigee_org.id,
765
+ name="my-product",
766
+ display_name="My Basic API Product",
767
+ approval_type="auto",
768
+ opts = pulumi.ResourceOptions(depends_on=[apigee_instance]))
769
+ ```
770
+ ### Apigee Api Product With Legacy Operation
771
+
772
+ ```python
773
+ import pulumi
774
+ import pulumi_gcp as gcp
775
+
776
+ current = gcp.organizations.get_client_config()
777
+ apigee_network = gcp.compute.Network("apigee_network", name="apigee-network")
778
+ apigee_range = gcp.compute.GlobalAddress("apigee_range",
779
+ name="apigee-range",
780
+ purpose="VPC_PEERING",
781
+ address_type="INTERNAL",
782
+ prefix_length=16,
783
+ network=apigee_network.id)
784
+ apigee_vpc_connection = gcp.servicenetworking.Connection("apigee_vpc_connection",
785
+ network=apigee_network.id,
786
+ service="servicenetworking.googleapis.com",
787
+ reserved_peering_ranges=[apigee_range.name])
788
+ apigee_org = gcp.apigee.Organization("apigee_org",
789
+ analytics_region="us-central1",
790
+ project_id=current.project,
791
+ authorized_network=apigee_network.id,
792
+ opts = pulumi.ResourceOptions(depends_on=[apigee_vpc_connection]))
793
+ apigee_instance = gcp.apigee.Instance("apigee_instance",
794
+ name="my-instance",
795
+ location="us-central1",
796
+ org_id=apigee_org.id,
797
+ peering_cidr_range="SLASH_22")
798
+ full_api_product = gcp.apigee.ApiProduct("full_api_product",
799
+ org_id=apigee_org.id,
800
+ name="my-product",
801
+ display_name="My full API Product",
802
+ approval_type="auto",
803
+ description="This is a sample API Product created with Terraform.",
804
+ attributes=[{
805
+ "name": "access",
806
+ "value": "private",
807
+ }],
808
+ environments=[
809
+ "dev",
810
+ "hom",
811
+ ],
812
+ proxies=["hello-world"],
813
+ api_resources=[
814
+ "/",
815
+ "/weather/**",
816
+ ],
817
+ scopes=[
818
+ "read:weather",
819
+ "write:reports",
820
+ ],
821
+ quota="10000",
822
+ quota_interval="1",
823
+ quota_time_unit="day",
824
+ quota_counter_scope="PROXY",
825
+ opts = pulumi.ResourceOptions(depends_on=[apigee_instance]))
826
+ ```
827
+ ### Apigee Api Product With Attributes
828
+
829
+ ```python
830
+ import pulumi
831
+ import pulumi_gcp as gcp
832
+
833
+ current = gcp.organizations.get_client_config()
834
+ apigee_network = gcp.compute.Network("apigee_network", name="apigee-network")
835
+ apigee_range = gcp.compute.GlobalAddress("apigee_range",
836
+ name="apigee-range",
837
+ purpose="VPC_PEERING",
838
+ address_type="INTERNAL",
839
+ prefix_length=16,
840
+ network=apigee_network.id)
841
+ apigee_vpc_connection = gcp.servicenetworking.Connection("apigee_vpc_connection",
842
+ network=apigee_network.id,
843
+ service="servicenetworking.googleapis.com",
844
+ reserved_peering_ranges=[apigee_range.name])
845
+ apigee_org = gcp.apigee.Organization("apigee_org",
846
+ analytics_region="us-central1",
847
+ project_id=current.project,
848
+ authorized_network=apigee_network.id,
849
+ opts = pulumi.ResourceOptions(depends_on=[apigee_vpc_connection]))
850
+ apigee_instance = gcp.apigee.Instance("apigee_instance",
851
+ name="my-instance",
852
+ location="us-central1",
853
+ org_id=apigee_org.id,
854
+ peering_cidr_range="SLASH_22")
855
+ full_api_product = gcp.apigee.ApiProduct("full_api_product",
856
+ org_id=apigee_org.id,
857
+ name="my-product",
858
+ display_name="My full API Product",
859
+ approval_type="auto",
860
+ description="This is a sample API Product created with Terraform.",
861
+ quota="10000",
862
+ quota_interval="1",
863
+ quota_time_unit="day",
864
+ quota_counter_scope="PROXY",
865
+ environments=[
866
+ "dev",
867
+ "hom",
868
+ ],
869
+ scopes=[
870
+ "read:weather",
871
+ "write:reports",
872
+ ],
873
+ attributes=[
874
+ {
875
+ "name": "access",
876
+ "value": "private",
877
+ },
878
+ {
879
+ "name": "custom",
880
+ "value": "value",
881
+ },
882
+ ],
883
+ operation_group={
884
+ "operation_config_type": "proxy",
885
+ "operation_configs": [
886
+ {
887
+ "api_source": "anoter-proxy",
888
+ "operations": [{
889
+ "resource": "/",
890
+ "methods": [
891
+ "POST",
892
+ "GET",
893
+ ],
894
+ }],
895
+ "quota": {
896
+ "limit": "1000",
897
+ "interval": "5",
898
+ "time_unit": "minute",
899
+ },
900
+ "attributes": [{
901
+ "name": "custom",
902
+ "value": "value",
903
+ }],
904
+ },
905
+ {
906
+ "api_source": "hello-world",
907
+ "operations": [{
908
+ "resource": "/test",
909
+ "methods": [
910
+ "POST",
911
+ "GET",
912
+ ],
913
+ }],
914
+ "quota": {
915
+ "limit": "10",
916
+ "interval": "30",
917
+ "time_unit": "second",
918
+ },
919
+ "attributes": [{
920
+ "name": "custom",
921
+ "value": "value",
922
+ }],
923
+ },
924
+ ],
925
+ },
926
+ graphql_operation_group={
927
+ "operation_config_type": "proxy",
928
+ "operation_configs": [
929
+ {
930
+ "api_source": "hello-world",
931
+ "quota": {
932
+ "limit": "30",
933
+ "interval": "50",
934
+ "time_unit": "second",
935
+ },
936
+ "operations": [{
937
+ "operation_types": ["QUERY"],
938
+ "operation": "test",
939
+ }],
940
+ "attributes": [{
941
+ "name": "custom",
942
+ "value": "value",
943
+ }],
944
+ },
945
+ {
946
+ "api_source": "another-proxy",
947
+ "quota": {
948
+ "limit": "50000",
949
+ "interval": "12",
950
+ "time_unit": "hour",
951
+ },
952
+ "operations": [{
953
+ "operation_types": ["MUTATION"],
954
+ "operation": "test",
955
+ }],
956
+ "attributes": [{
957
+ "name": "custom",
958
+ "value": "value",
959
+ }],
960
+ },
961
+ ],
962
+ },
963
+ grpc_operation_group={
964
+ "operation_configs": [
965
+ {
966
+ "api_source": "another-proxy",
967
+ "service": "grpc another test",
968
+ "methods": [
969
+ "method3",
970
+ "method4",
971
+ ],
972
+ "quota": {
973
+ "limit": "1000000",
974
+ "interval": "1",
975
+ "time_unit": "month",
976
+ },
977
+ "attributes": [{
978
+ "name": "graph",
979
+ "value": "value",
980
+ }],
981
+ },
982
+ {
983
+ "api_source": "hello-world",
984
+ "service": "grpc test",
985
+ "methods": [
986
+ "method1",
987
+ "method2",
988
+ ],
989
+ "quota": {
990
+ "limit": "5",
991
+ "interval": "1",
992
+ "time_unit": "second",
993
+ },
994
+ "attributes": [{
995
+ "name": "graph",
996
+ "value": "value",
997
+ }],
998
+ },
999
+ ],
1000
+ },
1001
+ opts = pulumi.ResourceOptions(depends_on=[apigee_instance]))
1002
+ ```
1003
+
1004
+ ## Import
1005
+
1006
+ ApiProduct can be imported using any of these accepted formats:
1007
+
1008
+ * `{{org_id}}/apiproducts/{{name}}`
1009
+
1010
+ * `{{org_id}}/{{name}}`
1011
+
1012
+ When using the `pulumi import` command, ApiProduct can be imported using one of the formats above. For example:
1013
+
1014
+ ```sh
1015
+ $ pulumi import gcp:apigee/apiProduct:ApiProduct default {{org_id}}/apiproducts/{{name}}
1016
+ ```
1017
+
1018
+ ```sh
1019
+ $ pulumi import gcp:apigee/apiProduct:ApiProduct default {{org_id}}/{{name}}
1020
+ ```
1021
+
1022
+ :param str resource_name: The name of the resource.
1023
+ :param pulumi.ResourceOptions opts: Options for the resource.
1024
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] api_resources: Comma-separated list of API resources to be bundled in the API product. By default, the resource paths are mapped from the proxy.pathsuffix variable.
1025
+ The proxy path suffix is defined as the URI fragment following the ProxyEndpoint base path. For example, if the apiResources element is defined to be /forecastrss and the base path defined for the API proxy is /weather, then only requests to /weather/forecastrss are permitted by the API product.
1026
+ :param pulumi.Input[_builtins.str] approval_type: Flag that specifies how API keys are approved to access the APIs defined by the API product.
1027
+ Valid values are `auto` or `manual`.
1028
+ Possible values are: `auto`, `manual`.
1029
+ :param pulumi.Input[Sequence[pulumi.Input[Union['ApiProductAttributeArgs', 'ApiProductAttributeArgsDict']]]] attributes: Array of attributes that may be used to extend the default API product profile with customer-specific metadata. You can specify a maximum of 18 attributes.
1030
+ Use this property to specify the access level of the API product as either public, private, or internal.
1031
+ Structure is documented below.
1032
+ :param pulumi.Input[_builtins.str] description: Description of the API product. Include key information about the API product that is not captured by other fields.
1033
+ :param pulumi.Input[_builtins.str] display_name: Name displayed in the UI or developer portal to developers registering for API access.
1034
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] environments: Comma-separated list of environment names to which the API product is bound. Requests to environments that are not listed are rejected.
1035
+ By specifying one or more environments, you can bind the resources listed in the API product to a specific environment, preventing developers from accessing those resources through API proxies deployed in another environment.
1036
+ :param pulumi.Input[Union['ApiProductGraphqlOperationGroupArgs', 'ApiProductGraphqlOperationGroupArgsDict']] graphql_operation_group: Configuration used to group Apigee proxies or remote services with graphQL operation name, graphQL operation type and quotas. This grouping allows us to precisely set quota for a particular combination of graphQL name and operation type for a particular proxy request. If graphQL name is not set, this would imply quota will be applied on all graphQL requests matching the operation type.
1037
+ Structure is documented below.
1038
+ :param pulumi.Input[Union['ApiProductGrpcOperationGroupArgs', 'ApiProductGrpcOperationGroupArgsDict']] grpc_operation_group: Optional. Configuration used to group Apigee proxies with gRPC services and method names. This grouping allows us to set quota for a particular proxy with the gRPC service name and method. If a method name is not set, this implies quota and authorization are applied to all gRPC methods implemented by that proxy for that particular gRPC service.
1039
+ Structure is documented below.
1040
+ :param pulumi.Input[_builtins.str] name: Internal name of the API product.
1041
+ :param pulumi.Input[Union['ApiProductOperationGroupArgs', 'ApiProductOperationGroupArgsDict']] operation_group: Configuration used to group Apigee proxies or remote services with resources, method types, and quotas. The resource refers to the resource URI (excluding the base path). With this grouping, the API product creator is able to fine-tune and give precise control over which REST methods have access to specific resources and how many calls can be made (using the quota setting).
1042
+ Note: The apiResources setting cannot be specified for both the API product and operation group; otherwise the call will fail.
1043
+ Structure is documented below.
1044
+ :param pulumi.Input[_builtins.str] org_id: The Apigee Organization associated with the Apigee API product,
1045
+ in the format `organizations/{{org_name}}`.
1046
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] proxies: Comma-separated list of API proxy names to which this API product is bound. By specifying API proxies, you can associate resources in the API product with specific API proxies, preventing developers from accessing those resources through other API proxies.
1047
+ Apigee rejects requests to API proxies that are not listed.
1048
+ :param pulumi.Input[_builtins.str] quota: Number of request messages permitted per app by this API product for the specified quotaInterval and quotaTimeUnit.
1049
+ For example, a quota of 50, for a quotaInterval of 12 and a quotaTimeUnit of hours means 50 requests are allowed every 12 hours.
1050
+ :param pulumi.Input[_builtins.str] quota_counter_scope: Scope of the quota decides how the quota counter gets applied and evaluate for quota violation. If the Scope is set as PROXY, then all the operations defined for the APIproduct that are associated with the same proxy will share the same quota counter set at the APIproduct level, making it a global counter at a proxy level. If the Scope is set as OPERATION, then each operations get the counter set at the API product dedicated, making it a local counter. Note that, the QuotaCounterScope applies only when an operation does not have dedicated quota set for itself.
1051
+ Possible values are: `QUOTA_COUNTER_SCOPE_UNSPECIFIED`, `PROXY`, `OPERATION`.
1052
+ :param pulumi.Input[_builtins.str] quota_interval: Time interval over which the number of request messages is calculated.
1053
+ :param pulumi.Input[_builtins.str] quota_time_unit: Time unit defined for the quotaInterval. Valid values include second, minute, hour, day, month or year.
1054
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] scopes: Comma-separated list of OAuth scopes that are validated at runtime. Apigee validates that the scopes in any access token presented match the scopes defined in the OAuth policy associated with the API product.
1055
+ :param pulumi.Input[_builtins.str] space: Optional. The resource ID of the parent Space. If not set, the parent resource will be the Organization.
1056
+ """
1057
+ ...
1058
+ @overload
1059
+ def __init__(__self__,
1060
+ resource_name: str,
1061
+ args: ApiProductArgs,
1062
+ opts: Optional[pulumi.ResourceOptions] = None):
1063
+ """
1064
+ An `ApiProduct` in Apigee.
1065
+
1066
+ To get more information about ApiProduct, see:
1067
+
1068
+ * [API documentation](https://cloud.google.com/apigee/docs/reference/apis/apigee/rest/v1/organizations.apiproducts#ApiProduct)
1069
+ * How-to Guides
1070
+ * [Creating an API product](https://cloud.google.com/apigee/docs/api-platform/publish/what-api-product)
1071
+
1072
+ ## Example Usage
1073
+
1074
+ ### Apigee Api Product Basic
1075
+
1076
+ ```python
1077
+ import pulumi
1078
+ import pulumi_gcp as gcp
1079
+
1080
+ current = gcp.organizations.get_client_config()
1081
+ apigee_network = gcp.compute.Network("apigee_network", name="apigee-network")
1082
+ apigee_range = gcp.compute.GlobalAddress("apigee_range",
1083
+ name="apigee-range",
1084
+ purpose="VPC_PEERING",
1085
+ address_type="INTERNAL",
1086
+ prefix_length=16,
1087
+ network=apigee_network.id)
1088
+ apigee_vpc_connection = gcp.servicenetworking.Connection("apigee_vpc_connection",
1089
+ network=apigee_network.id,
1090
+ service="servicenetworking.googleapis.com",
1091
+ reserved_peering_ranges=[apigee_range.name])
1092
+ apigee_org = gcp.apigee.Organization("apigee_org",
1093
+ analytics_region="us-central1",
1094
+ project_id=current.project,
1095
+ authorized_network=apigee_network.id,
1096
+ opts = pulumi.ResourceOptions(depends_on=[apigee_vpc_connection]))
1097
+ apigee_instance = gcp.apigee.Instance("apigee_instance",
1098
+ name="my-instance",
1099
+ location="us-central1",
1100
+ org_id=apigee_org.id,
1101
+ peering_cidr_range="SLASH_22")
1102
+ basic_api_product = gcp.apigee.ApiProduct("basic_api_product",
1103
+ org_id=apigee_org.id,
1104
+ name="my-product",
1105
+ display_name="My Basic API Product",
1106
+ approval_type="auto",
1107
+ opts = pulumi.ResourceOptions(depends_on=[apigee_instance]))
1108
+ ```
1109
+ ### Apigee Api Product With Legacy Operation
1110
+
1111
+ ```python
1112
+ import pulumi
1113
+ import pulumi_gcp as gcp
1114
+
1115
+ current = gcp.organizations.get_client_config()
1116
+ apigee_network = gcp.compute.Network("apigee_network", name="apigee-network")
1117
+ apigee_range = gcp.compute.GlobalAddress("apigee_range",
1118
+ name="apigee-range",
1119
+ purpose="VPC_PEERING",
1120
+ address_type="INTERNAL",
1121
+ prefix_length=16,
1122
+ network=apigee_network.id)
1123
+ apigee_vpc_connection = gcp.servicenetworking.Connection("apigee_vpc_connection",
1124
+ network=apigee_network.id,
1125
+ service="servicenetworking.googleapis.com",
1126
+ reserved_peering_ranges=[apigee_range.name])
1127
+ apigee_org = gcp.apigee.Organization("apigee_org",
1128
+ analytics_region="us-central1",
1129
+ project_id=current.project,
1130
+ authorized_network=apigee_network.id,
1131
+ opts = pulumi.ResourceOptions(depends_on=[apigee_vpc_connection]))
1132
+ apigee_instance = gcp.apigee.Instance("apigee_instance",
1133
+ name="my-instance",
1134
+ location="us-central1",
1135
+ org_id=apigee_org.id,
1136
+ peering_cidr_range="SLASH_22")
1137
+ full_api_product = gcp.apigee.ApiProduct("full_api_product",
1138
+ org_id=apigee_org.id,
1139
+ name="my-product",
1140
+ display_name="My full API Product",
1141
+ approval_type="auto",
1142
+ description="This is a sample API Product created with Terraform.",
1143
+ attributes=[{
1144
+ "name": "access",
1145
+ "value": "private",
1146
+ }],
1147
+ environments=[
1148
+ "dev",
1149
+ "hom",
1150
+ ],
1151
+ proxies=["hello-world"],
1152
+ api_resources=[
1153
+ "/",
1154
+ "/weather/**",
1155
+ ],
1156
+ scopes=[
1157
+ "read:weather",
1158
+ "write:reports",
1159
+ ],
1160
+ quota="10000",
1161
+ quota_interval="1",
1162
+ quota_time_unit="day",
1163
+ quota_counter_scope="PROXY",
1164
+ opts = pulumi.ResourceOptions(depends_on=[apigee_instance]))
1165
+ ```
1166
+ ### Apigee Api Product With Attributes
1167
+
1168
+ ```python
1169
+ import pulumi
1170
+ import pulumi_gcp as gcp
1171
+
1172
+ current = gcp.organizations.get_client_config()
1173
+ apigee_network = gcp.compute.Network("apigee_network", name="apigee-network")
1174
+ apigee_range = gcp.compute.GlobalAddress("apigee_range",
1175
+ name="apigee-range",
1176
+ purpose="VPC_PEERING",
1177
+ address_type="INTERNAL",
1178
+ prefix_length=16,
1179
+ network=apigee_network.id)
1180
+ apigee_vpc_connection = gcp.servicenetworking.Connection("apigee_vpc_connection",
1181
+ network=apigee_network.id,
1182
+ service="servicenetworking.googleapis.com",
1183
+ reserved_peering_ranges=[apigee_range.name])
1184
+ apigee_org = gcp.apigee.Organization("apigee_org",
1185
+ analytics_region="us-central1",
1186
+ project_id=current.project,
1187
+ authorized_network=apigee_network.id,
1188
+ opts = pulumi.ResourceOptions(depends_on=[apigee_vpc_connection]))
1189
+ apigee_instance = gcp.apigee.Instance("apigee_instance",
1190
+ name="my-instance",
1191
+ location="us-central1",
1192
+ org_id=apigee_org.id,
1193
+ peering_cidr_range="SLASH_22")
1194
+ full_api_product = gcp.apigee.ApiProduct("full_api_product",
1195
+ org_id=apigee_org.id,
1196
+ name="my-product",
1197
+ display_name="My full API Product",
1198
+ approval_type="auto",
1199
+ description="This is a sample API Product created with Terraform.",
1200
+ quota="10000",
1201
+ quota_interval="1",
1202
+ quota_time_unit="day",
1203
+ quota_counter_scope="PROXY",
1204
+ environments=[
1205
+ "dev",
1206
+ "hom",
1207
+ ],
1208
+ scopes=[
1209
+ "read:weather",
1210
+ "write:reports",
1211
+ ],
1212
+ attributes=[
1213
+ {
1214
+ "name": "access",
1215
+ "value": "private",
1216
+ },
1217
+ {
1218
+ "name": "custom",
1219
+ "value": "value",
1220
+ },
1221
+ ],
1222
+ operation_group={
1223
+ "operation_config_type": "proxy",
1224
+ "operation_configs": [
1225
+ {
1226
+ "api_source": "anoter-proxy",
1227
+ "operations": [{
1228
+ "resource": "/",
1229
+ "methods": [
1230
+ "POST",
1231
+ "GET",
1232
+ ],
1233
+ }],
1234
+ "quota": {
1235
+ "limit": "1000",
1236
+ "interval": "5",
1237
+ "time_unit": "minute",
1238
+ },
1239
+ "attributes": [{
1240
+ "name": "custom",
1241
+ "value": "value",
1242
+ }],
1243
+ },
1244
+ {
1245
+ "api_source": "hello-world",
1246
+ "operations": [{
1247
+ "resource": "/test",
1248
+ "methods": [
1249
+ "POST",
1250
+ "GET",
1251
+ ],
1252
+ }],
1253
+ "quota": {
1254
+ "limit": "10",
1255
+ "interval": "30",
1256
+ "time_unit": "second",
1257
+ },
1258
+ "attributes": [{
1259
+ "name": "custom",
1260
+ "value": "value",
1261
+ }],
1262
+ },
1263
+ ],
1264
+ },
1265
+ graphql_operation_group={
1266
+ "operation_config_type": "proxy",
1267
+ "operation_configs": [
1268
+ {
1269
+ "api_source": "hello-world",
1270
+ "quota": {
1271
+ "limit": "30",
1272
+ "interval": "50",
1273
+ "time_unit": "second",
1274
+ },
1275
+ "operations": [{
1276
+ "operation_types": ["QUERY"],
1277
+ "operation": "test",
1278
+ }],
1279
+ "attributes": [{
1280
+ "name": "custom",
1281
+ "value": "value",
1282
+ }],
1283
+ },
1284
+ {
1285
+ "api_source": "another-proxy",
1286
+ "quota": {
1287
+ "limit": "50000",
1288
+ "interval": "12",
1289
+ "time_unit": "hour",
1290
+ },
1291
+ "operations": [{
1292
+ "operation_types": ["MUTATION"],
1293
+ "operation": "test",
1294
+ }],
1295
+ "attributes": [{
1296
+ "name": "custom",
1297
+ "value": "value",
1298
+ }],
1299
+ },
1300
+ ],
1301
+ },
1302
+ grpc_operation_group={
1303
+ "operation_configs": [
1304
+ {
1305
+ "api_source": "another-proxy",
1306
+ "service": "grpc another test",
1307
+ "methods": [
1308
+ "method3",
1309
+ "method4",
1310
+ ],
1311
+ "quota": {
1312
+ "limit": "1000000",
1313
+ "interval": "1",
1314
+ "time_unit": "month",
1315
+ },
1316
+ "attributes": [{
1317
+ "name": "graph",
1318
+ "value": "value",
1319
+ }],
1320
+ },
1321
+ {
1322
+ "api_source": "hello-world",
1323
+ "service": "grpc test",
1324
+ "methods": [
1325
+ "method1",
1326
+ "method2",
1327
+ ],
1328
+ "quota": {
1329
+ "limit": "5",
1330
+ "interval": "1",
1331
+ "time_unit": "second",
1332
+ },
1333
+ "attributes": [{
1334
+ "name": "graph",
1335
+ "value": "value",
1336
+ }],
1337
+ },
1338
+ ],
1339
+ },
1340
+ opts = pulumi.ResourceOptions(depends_on=[apigee_instance]))
1341
+ ```
1342
+
1343
+ ## Import
1344
+
1345
+ ApiProduct can be imported using any of these accepted formats:
1346
+
1347
+ * `{{org_id}}/apiproducts/{{name}}`
1348
+
1349
+ * `{{org_id}}/{{name}}`
1350
+
1351
+ When using the `pulumi import` command, ApiProduct can be imported using one of the formats above. For example:
1352
+
1353
+ ```sh
1354
+ $ pulumi import gcp:apigee/apiProduct:ApiProduct default {{org_id}}/apiproducts/{{name}}
1355
+ ```
1356
+
1357
+ ```sh
1358
+ $ pulumi import gcp:apigee/apiProduct:ApiProduct default {{org_id}}/{{name}}
1359
+ ```
1360
+
1361
+ :param str resource_name: The name of the resource.
1362
+ :param ApiProductArgs args: The arguments to use to populate this resource's properties.
1363
+ :param pulumi.ResourceOptions opts: Options for the resource.
1364
+ """
1365
+ ...
1366
+ def __init__(__self__, resource_name: str, *args, **kwargs):
1367
+ resource_args, opts = _utilities.get_resource_args_opts(ApiProductArgs, pulumi.ResourceOptions, *args, **kwargs)
1368
+ if resource_args is not None:
1369
+ __self__._internal_init(resource_name, opts, **resource_args.__dict__)
1370
+ else:
1371
+ __self__._internal_init(resource_name, *args, **kwargs)
1372
+
1373
+ def _internal_init(__self__,
1374
+ resource_name: str,
1375
+ opts: Optional[pulumi.ResourceOptions] = None,
1376
+ api_resources: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
1377
+ approval_type: Optional[pulumi.Input[_builtins.str]] = None,
1378
+ attributes: Optional[pulumi.Input[Sequence[pulumi.Input[Union['ApiProductAttributeArgs', 'ApiProductAttributeArgsDict']]]]] = None,
1379
+ description: Optional[pulumi.Input[_builtins.str]] = None,
1380
+ display_name: Optional[pulumi.Input[_builtins.str]] = None,
1381
+ environments: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
1382
+ graphql_operation_group: Optional[pulumi.Input[Union['ApiProductGraphqlOperationGroupArgs', 'ApiProductGraphqlOperationGroupArgsDict']]] = None,
1383
+ grpc_operation_group: Optional[pulumi.Input[Union['ApiProductGrpcOperationGroupArgs', 'ApiProductGrpcOperationGroupArgsDict']]] = None,
1384
+ name: Optional[pulumi.Input[_builtins.str]] = None,
1385
+ operation_group: Optional[pulumi.Input[Union['ApiProductOperationGroupArgs', 'ApiProductOperationGroupArgsDict']]] = None,
1386
+ org_id: Optional[pulumi.Input[_builtins.str]] = None,
1387
+ proxies: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
1388
+ quota: Optional[pulumi.Input[_builtins.str]] = None,
1389
+ quota_counter_scope: Optional[pulumi.Input[_builtins.str]] = None,
1390
+ quota_interval: Optional[pulumi.Input[_builtins.str]] = None,
1391
+ quota_time_unit: Optional[pulumi.Input[_builtins.str]] = None,
1392
+ scopes: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
1393
+ space: Optional[pulumi.Input[_builtins.str]] = None,
1394
+ __props__=None):
1395
+ opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts)
1396
+ if not isinstance(opts, pulumi.ResourceOptions):
1397
+ raise TypeError('Expected resource options to be a ResourceOptions instance')
1398
+ if opts.id is None:
1399
+ if __props__ is not None:
1400
+ raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource')
1401
+ __props__ = ApiProductArgs.__new__(ApiProductArgs)
1402
+
1403
+ __props__.__dict__["api_resources"] = api_resources
1404
+ __props__.__dict__["approval_type"] = approval_type
1405
+ __props__.__dict__["attributes"] = attributes
1406
+ __props__.__dict__["description"] = description
1407
+ if display_name is None and not opts.urn:
1408
+ raise TypeError("Missing required property 'display_name'")
1409
+ __props__.__dict__["display_name"] = display_name
1410
+ __props__.__dict__["environments"] = environments
1411
+ __props__.__dict__["graphql_operation_group"] = graphql_operation_group
1412
+ __props__.__dict__["grpc_operation_group"] = grpc_operation_group
1413
+ __props__.__dict__["name"] = name
1414
+ __props__.__dict__["operation_group"] = operation_group
1415
+ if org_id is None and not opts.urn:
1416
+ raise TypeError("Missing required property 'org_id'")
1417
+ __props__.__dict__["org_id"] = org_id
1418
+ __props__.__dict__["proxies"] = proxies
1419
+ __props__.__dict__["quota"] = quota
1420
+ __props__.__dict__["quota_counter_scope"] = quota_counter_scope
1421
+ __props__.__dict__["quota_interval"] = quota_interval
1422
+ __props__.__dict__["quota_time_unit"] = quota_time_unit
1423
+ __props__.__dict__["scopes"] = scopes
1424
+ __props__.__dict__["space"] = space
1425
+ __props__.__dict__["created_at"] = None
1426
+ __props__.__dict__["last_modified_at"] = None
1427
+ super(ApiProduct, __self__).__init__(
1428
+ 'gcp:apigee/apiProduct:ApiProduct',
1429
+ resource_name,
1430
+ __props__,
1431
+ opts)
1432
+
1433
+ @staticmethod
1434
+ def get(resource_name: str,
1435
+ id: pulumi.Input[str],
1436
+ opts: Optional[pulumi.ResourceOptions] = None,
1437
+ api_resources: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
1438
+ approval_type: Optional[pulumi.Input[_builtins.str]] = None,
1439
+ attributes: Optional[pulumi.Input[Sequence[pulumi.Input[Union['ApiProductAttributeArgs', 'ApiProductAttributeArgsDict']]]]] = None,
1440
+ created_at: Optional[pulumi.Input[_builtins.str]] = None,
1441
+ description: Optional[pulumi.Input[_builtins.str]] = None,
1442
+ display_name: Optional[pulumi.Input[_builtins.str]] = None,
1443
+ environments: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
1444
+ graphql_operation_group: Optional[pulumi.Input[Union['ApiProductGraphqlOperationGroupArgs', 'ApiProductGraphqlOperationGroupArgsDict']]] = None,
1445
+ grpc_operation_group: Optional[pulumi.Input[Union['ApiProductGrpcOperationGroupArgs', 'ApiProductGrpcOperationGroupArgsDict']]] = None,
1446
+ last_modified_at: Optional[pulumi.Input[_builtins.str]] = None,
1447
+ name: Optional[pulumi.Input[_builtins.str]] = None,
1448
+ operation_group: Optional[pulumi.Input[Union['ApiProductOperationGroupArgs', 'ApiProductOperationGroupArgsDict']]] = None,
1449
+ org_id: Optional[pulumi.Input[_builtins.str]] = None,
1450
+ proxies: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
1451
+ quota: Optional[pulumi.Input[_builtins.str]] = None,
1452
+ quota_counter_scope: Optional[pulumi.Input[_builtins.str]] = None,
1453
+ quota_interval: Optional[pulumi.Input[_builtins.str]] = None,
1454
+ quota_time_unit: Optional[pulumi.Input[_builtins.str]] = None,
1455
+ scopes: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None,
1456
+ space: Optional[pulumi.Input[_builtins.str]] = None) -> 'ApiProduct':
1457
+ """
1458
+ Get an existing ApiProduct resource's state with the given name, id, and optional extra
1459
+ properties used to qualify the lookup.
1460
+
1461
+ :param str resource_name: The unique name of the resulting resource.
1462
+ :param pulumi.Input[str] id: The unique provider ID of the resource to lookup.
1463
+ :param pulumi.ResourceOptions opts: Options for the resource.
1464
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] api_resources: Comma-separated list of API resources to be bundled in the API product. By default, the resource paths are mapped from the proxy.pathsuffix variable.
1465
+ The proxy path suffix is defined as the URI fragment following the ProxyEndpoint base path. For example, if the apiResources element is defined to be /forecastrss and the base path defined for the API proxy is /weather, then only requests to /weather/forecastrss are permitted by the API product.
1466
+ :param pulumi.Input[_builtins.str] approval_type: Flag that specifies how API keys are approved to access the APIs defined by the API product.
1467
+ Valid values are `auto` or `manual`.
1468
+ Possible values are: `auto`, `manual`.
1469
+ :param pulumi.Input[Sequence[pulumi.Input[Union['ApiProductAttributeArgs', 'ApiProductAttributeArgsDict']]]] attributes: Array of attributes that may be used to extend the default API product profile with customer-specific metadata. You can specify a maximum of 18 attributes.
1470
+ Use this property to specify the access level of the API product as either public, private, or internal.
1471
+ Structure is documented below.
1472
+ :param pulumi.Input[_builtins.str] created_at: Response only. Creation time of this environment as milliseconds since epoch.
1473
+ :param pulumi.Input[_builtins.str] description: Description of the API product. Include key information about the API product that is not captured by other fields.
1474
+ :param pulumi.Input[_builtins.str] display_name: Name displayed in the UI or developer portal to developers registering for API access.
1475
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] environments: Comma-separated list of environment names to which the API product is bound. Requests to environments that are not listed are rejected.
1476
+ By specifying one or more environments, you can bind the resources listed in the API product to a specific environment, preventing developers from accessing those resources through API proxies deployed in another environment.
1477
+ :param pulumi.Input[Union['ApiProductGraphqlOperationGroupArgs', 'ApiProductGraphqlOperationGroupArgsDict']] graphql_operation_group: Configuration used to group Apigee proxies or remote services with graphQL operation name, graphQL operation type and quotas. This grouping allows us to precisely set quota for a particular combination of graphQL name and operation type for a particular proxy request. If graphQL name is not set, this would imply quota will be applied on all graphQL requests matching the operation type.
1478
+ Structure is documented below.
1479
+ :param pulumi.Input[Union['ApiProductGrpcOperationGroupArgs', 'ApiProductGrpcOperationGroupArgsDict']] grpc_operation_group: Optional. Configuration used to group Apigee proxies with gRPC services and method names. This grouping allows us to set quota for a particular proxy with the gRPC service name and method. If a method name is not set, this implies quota and authorization are applied to all gRPC methods implemented by that proxy for that particular gRPC service.
1480
+ Structure is documented below.
1481
+ :param pulumi.Input[_builtins.str] last_modified_at: Response only. Modified time of this environment as milliseconds since epoch.
1482
+ :param pulumi.Input[_builtins.str] name: Internal name of the API product.
1483
+ :param pulumi.Input[Union['ApiProductOperationGroupArgs', 'ApiProductOperationGroupArgsDict']] operation_group: Configuration used to group Apigee proxies or remote services with resources, method types, and quotas. The resource refers to the resource URI (excluding the base path). With this grouping, the API product creator is able to fine-tune and give precise control over which REST methods have access to specific resources and how many calls can be made (using the quota setting).
1484
+ Note: The apiResources setting cannot be specified for both the API product and operation group; otherwise the call will fail.
1485
+ Structure is documented below.
1486
+ :param pulumi.Input[_builtins.str] org_id: The Apigee Organization associated with the Apigee API product,
1487
+ in the format `organizations/{{org_name}}`.
1488
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] proxies: Comma-separated list of API proxy names to which this API product is bound. By specifying API proxies, you can associate resources in the API product with specific API proxies, preventing developers from accessing those resources through other API proxies.
1489
+ Apigee rejects requests to API proxies that are not listed.
1490
+ :param pulumi.Input[_builtins.str] quota: Number of request messages permitted per app by this API product for the specified quotaInterval and quotaTimeUnit.
1491
+ For example, a quota of 50, for a quotaInterval of 12 and a quotaTimeUnit of hours means 50 requests are allowed every 12 hours.
1492
+ :param pulumi.Input[_builtins.str] quota_counter_scope: Scope of the quota decides how the quota counter gets applied and evaluate for quota violation. If the Scope is set as PROXY, then all the operations defined for the APIproduct that are associated with the same proxy will share the same quota counter set at the APIproduct level, making it a global counter at a proxy level. If the Scope is set as OPERATION, then each operations get the counter set at the API product dedicated, making it a local counter. Note that, the QuotaCounterScope applies only when an operation does not have dedicated quota set for itself.
1493
+ Possible values are: `QUOTA_COUNTER_SCOPE_UNSPECIFIED`, `PROXY`, `OPERATION`.
1494
+ :param pulumi.Input[_builtins.str] quota_interval: Time interval over which the number of request messages is calculated.
1495
+ :param pulumi.Input[_builtins.str] quota_time_unit: Time unit defined for the quotaInterval. Valid values include second, minute, hour, day, month or year.
1496
+ :param pulumi.Input[Sequence[pulumi.Input[_builtins.str]]] scopes: Comma-separated list of OAuth scopes that are validated at runtime. Apigee validates that the scopes in any access token presented match the scopes defined in the OAuth policy associated with the API product.
1497
+ :param pulumi.Input[_builtins.str] space: Optional. The resource ID of the parent Space. If not set, the parent resource will be the Organization.
1498
+ """
1499
+ opts = pulumi.ResourceOptions.merge(opts, pulumi.ResourceOptions(id=id))
1500
+
1501
+ __props__ = _ApiProductState.__new__(_ApiProductState)
1502
+
1503
+ __props__.__dict__["api_resources"] = api_resources
1504
+ __props__.__dict__["approval_type"] = approval_type
1505
+ __props__.__dict__["attributes"] = attributes
1506
+ __props__.__dict__["created_at"] = created_at
1507
+ __props__.__dict__["description"] = description
1508
+ __props__.__dict__["display_name"] = display_name
1509
+ __props__.__dict__["environments"] = environments
1510
+ __props__.__dict__["graphql_operation_group"] = graphql_operation_group
1511
+ __props__.__dict__["grpc_operation_group"] = grpc_operation_group
1512
+ __props__.__dict__["last_modified_at"] = last_modified_at
1513
+ __props__.__dict__["name"] = name
1514
+ __props__.__dict__["operation_group"] = operation_group
1515
+ __props__.__dict__["org_id"] = org_id
1516
+ __props__.__dict__["proxies"] = proxies
1517
+ __props__.__dict__["quota"] = quota
1518
+ __props__.__dict__["quota_counter_scope"] = quota_counter_scope
1519
+ __props__.__dict__["quota_interval"] = quota_interval
1520
+ __props__.__dict__["quota_time_unit"] = quota_time_unit
1521
+ __props__.__dict__["scopes"] = scopes
1522
+ __props__.__dict__["space"] = space
1523
+ return ApiProduct(resource_name, opts=opts, __props__=__props__)
1524
+
1525
+ @_builtins.property
1526
+ @pulumi.getter(name="apiResources")
1527
+ def api_resources(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]:
1528
+ """
1529
+ Comma-separated list of API resources to be bundled in the API product. By default, the resource paths are mapped from the proxy.pathsuffix variable.
1530
+ The proxy path suffix is defined as the URI fragment following the ProxyEndpoint base path. For example, if the apiResources element is defined to be /forecastrss and the base path defined for the API proxy is /weather, then only requests to /weather/forecastrss are permitted by the API product.
1531
+ """
1532
+ return pulumi.get(self, "api_resources")
1533
+
1534
+ @_builtins.property
1535
+ @pulumi.getter(name="approvalType")
1536
+ def approval_type(self) -> pulumi.Output[Optional[_builtins.str]]:
1537
+ """
1538
+ Flag that specifies how API keys are approved to access the APIs defined by the API product.
1539
+ Valid values are `auto` or `manual`.
1540
+ Possible values are: `auto`, `manual`.
1541
+ """
1542
+ return pulumi.get(self, "approval_type")
1543
+
1544
+ @_builtins.property
1545
+ @pulumi.getter
1546
+ def attributes(self) -> pulumi.Output[Optional[Sequence['outputs.ApiProductAttribute']]]:
1547
+ """
1548
+ Array of attributes that may be used to extend the default API product profile with customer-specific metadata. You can specify a maximum of 18 attributes.
1549
+ Use this property to specify the access level of the API product as either public, private, or internal.
1550
+ Structure is documented below.
1551
+ """
1552
+ return pulumi.get(self, "attributes")
1553
+
1554
+ @_builtins.property
1555
+ @pulumi.getter(name="createdAt")
1556
+ def created_at(self) -> pulumi.Output[_builtins.str]:
1557
+ """
1558
+ Response only. Creation time of this environment as milliseconds since epoch.
1559
+ """
1560
+ return pulumi.get(self, "created_at")
1561
+
1562
+ @_builtins.property
1563
+ @pulumi.getter
1564
+ def description(self) -> pulumi.Output[Optional[_builtins.str]]:
1565
+ """
1566
+ Description of the API product. Include key information about the API product that is not captured by other fields.
1567
+ """
1568
+ return pulumi.get(self, "description")
1569
+
1570
+ @_builtins.property
1571
+ @pulumi.getter(name="displayName")
1572
+ def display_name(self) -> pulumi.Output[_builtins.str]:
1573
+ """
1574
+ Name displayed in the UI or developer portal to developers registering for API access.
1575
+ """
1576
+ return pulumi.get(self, "display_name")
1577
+
1578
+ @_builtins.property
1579
+ @pulumi.getter
1580
+ def environments(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]:
1581
+ """
1582
+ Comma-separated list of environment names to which the API product is bound. Requests to environments that are not listed are rejected.
1583
+ By specifying one or more environments, you can bind the resources listed in the API product to a specific environment, preventing developers from accessing those resources through API proxies deployed in another environment.
1584
+ """
1585
+ return pulumi.get(self, "environments")
1586
+
1587
+ @_builtins.property
1588
+ @pulumi.getter(name="graphqlOperationGroup")
1589
+ def graphql_operation_group(self) -> pulumi.Output[Optional['outputs.ApiProductGraphqlOperationGroup']]:
1590
+ """
1591
+ Configuration used to group Apigee proxies or remote services with graphQL operation name, graphQL operation type and quotas. This grouping allows us to precisely set quota for a particular combination of graphQL name and operation type for a particular proxy request. If graphQL name is not set, this would imply quota will be applied on all graphQL requests matching the operation type.
1592
+ Structure is documented below.
1593
+ """
1594
+ return pulumi.get(self, "graphql_operation_group")
1595
+
1596
+ @_builtins.property
1597
+ @pulumi.getter(name="grpcOperationGroup")
1598
+ def grpc_operation_group(self) -> pulumi.Output[Optional['outputs.ApiProductGrpcOperationGroup']]:
1599
+ """
1600
+ Optional. Configuration used to group Apigee proxies with gRPC services and method names. This grouping allows us to set quota for a particular proxy with the gRPC service name and method. If a method name is not set, this implies quota and authorization are applied to all gRPC methods implemented by that proxy for that particular gRPC service.
1601
+ Structure is documented below.
1602
+ """
1603
+ return pulumi.get(self, "grpc_operation_group")
1604
+
1605
+ @_builtins.property
1606
+ @pulumi.getter(name="lastModifiedAt")
1607
+ def last_modified_at(self) -> pulumi.Output[_builtins.str]:
1608
+ """
1609
+ Response only. Modified time of this environment as milliseconds since epoch.
1610
+ """
1611
+ return pulumi.get(self, "last_modified_at")
1612
+
1613
+ @_builtins.property
1614
+ @pulumi.getter
1615
+ def name(self) -> pulumi.Output[_builtins.str]:
1616
+ """
1617
+ Internal name of the API product.
1618
+ """
1619
+ return pulumi.get(self, "name")
1620
+
1621
+ @_builtins.property
1622
+ @pulumi.getter(name="operationGroup")
1623
+ def operation_group(self) -> pulumi.Output[Optional['outputs.ApiProductOperationGroup']]:
1624
+ """
1625
+ Configuration used to group Apigee proxies or remote services with resources, method types, and quotas. The resource refers to the resource URI (excluding the base path). With this grouping, the API product creator is able to fine-tune and give precise control over which REST methods have access to specific resources and how many calls can be made (using the quota setting).
1626
+ Note: The apiResources setting cannot be specified for both the API product and operation group; otherwise the call will fail.
1627
+ Structure is documented below.
1628
+ """
1629
+ return pulumi.get(self, "operation_group")
1630
+
1631
+ @_builtins.property
1632
+ @pulumi.getter(name="orgId")
1633
+ def org_id(self) -> pulumi.Output[_builtins.str]:
1634
+ """
1635
+ The Apigee Organization associated with the Apigee API product,
1636
+ in the format `organizations/{{org_name}}`.
1637
+ """
1638
+ return pulumi.get(self, "org_id")
1639
+
1640
+ @_builtins.property
1641
+ @pulumi.getter
1642
+ def proxies(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]:
1643
+ """
1644
+ Comma-separated list of API proxy names to which this API product is bound. By specifying API proxies, you can associate resources in the API product with specific API proxies, preventing developers from accessing those resources through other API proxies.
1645
+ Apigee rejects requests to API proxies that are not listed.
1646
+ """
1647
+ return pulumi.get(self, "proxies")
1648
+
1649
+ @_builtins.property
1650
+ @pulumi.getter
1651
+ def quota(self) -> pulumi.Output[Optional[_builtins.str]]:
1652
+ """
1653
+ Number of request messages permitted per app by this API product for the specified quotaInterval and quotaTimeUnit.
1654
+ For example, a quota of 50, for a quotaInterval of 12 and a quotaTimeUnit of hours means 50 requests are allowed every 12 hours.
1655
+ """
1656
+ return pulumi.get(self, "quota")
1657
+
1658
+ @_builtins.property
1659
+ @pulumi.getter(name="quotaCounterScope")
1660
+ def quota_counter_scope(self) -> pulumi.Output[Optional[_builtins.str]]:
1661
+ """
1662
+ Scope of the quota decides how the quota counter gets applied and evaluate for quota violation. If the Scope is set as PROXY, then all the operations defined for the APIproduct that are associated with the same proxy will share the same quota counter set at the APIproduct level, making it a global counter at a proxy level. If the Scope is set as OPERATION, then each operations get the counter set at the API product dedicated, making it a local counter. Note that, the QuotaCounterScope applies only when an operation does not have dedicated quota set for itself.
1663
+ Possible values are: `QUOTA_COUNTER_SCOPE_UNSPECIFIED`, `PROXY`, `OPERATION`.
1664
+ """
1665
+ return pulumi.get(self, "quota_counter_scope")
1666
+
1667
+ @_builtins.property
1668
+ @pulumi.getter(name="quotaInterval")
1669
+ def quota_interval(self) -> pulumi.Output[Optional[_builtins.str]]:
1670
+ """
1671
+ Time interval over which the number of request messages is calculated.
1672
+ """
1673
+ return pulumi.get(self, "quota_interval")
1674
+
1675
+ @_builtins.property
1676
+ @pulumi.getter(name="quotaTimeUnit")
1677
+ def quota_time_unit(self) -> pulumi.Output[Optional[_builtins.str]]:
1678
+ """
1679
+ Time unit defined for the quotaInterval. Valid values include second, minute, hour, day, month or year.
1680
+ """
1681
+ return pulumi.get(self, "quota_time_unit")
1682
+
1683
+ @_builtins.property
1684
+ @pulumi.getter
1685
+ def scopes(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]:
1686
+ """
1687
+ Comma-separated list of OAuth scopes that are validated at runtime. Apigee validates that the scopes in any access token presented match the scopes defined in the OAuth policy associated with the API product.
1688
+ """
1689
+ return pulumi.get(self, "scopes")
1690
+
1691
+ @_builtins.property
1692
+ @pulumi.getter
1693
+ def space(self) -> pulumi.Output[Optional[_builtins.str]]:
1694
+ """
1695
+ Optional. The resource ID of the parent Space. If not set, the parent resource will be the Organization.
1696
+ """
1697
+ return pulumi.get(self, "space")
1698
+