Skip to content

Commit a18bf1a

Browse files
authored
[feat][gcp] Add cloudfunctions service collection (#2276)
1 parent 6a68104 commit a18bf1a

5 files changed

Lines changed: 494 additions & 2 deletions

File tree

plugins/gcp/fix_plugin_gcp/collector.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,17 @@
44

55
from fix_plugin_gcp.config import GcpConfig
66
from fix_plugin_gcp.gcp_client import GcpApiSpec
7-
from fix_plugin_gcp.resources import compute, container, billing, sqladmin, storage, aiplatform, firestore, filestore
7+
from fix_plugin_gcp.resources import (
8+
compute,
9+
container,
10+
billing,
11+
sqladmin,
12+
storage,
13+
aiplatform,
14+
firestore,
15+
filestore,
16+
cloudfunctions,
17+
)
818
from fix_plugin_gcp.resources.base import GcpResource, GcpProject, ExecutorQueue, GraphBuilder, GcpRegion, GcpZone
919
from fix_plugin_gcp.utils import Credentials
1020
from fixlib.baseresources import Cloud
@@ -21,6 +31,7 @@
2131
+ aiplatform.resources
2232
+ firestore.resources
2333
+ filestore.resources
34+
+ cloudfunctions.resources
2435
)
2536

2637

Lines changed: 304 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,304 @@
1+
from datetime import datetime
2+
from typing import ClassVar, Dict, Optional, List, Type, Any
3+
4+
from attr import define, field
5+
6+
from fix_plugin_gcp.gcp_client import GcpApiSpec
7+
from fix_plugin_gcp.resources.base import GcpResource, GcpDeprecationStatus
8+
from fixlib.baseresources import BaseServerlessFunction
9+
from fixlib.json_bender import Bender, S, Bend, ForallBend
10+
11+
12+
@define(eq=False, slots=False)
13+
class GcpRepoSource:
14+
kind: ClassVar[str] = "gcp_repo_source"
15+
mapping: ClassVar[Dict[str, Bender]] = {
16+
"branch_name": S("branchName"),
17+
"commit_sha": S("commitSha"),
18+
"dir": S("dir"),
19+
"project_id": S("projectId"),
20+
"repo_name": S("repoName"),
21+
"tag_name": S("tagName"),
22+
}
23+
branch_name: Optional[str] = field(default=None)
24+
commit_sha: Optional[str] = field(default=None)
25+
dir: Optional[str] = field(default=None)
26+
project_id: Optional[str] = field(default=None)
27+
repo_name: Optional[str] = field(default=None)
28+
tag_name: Optional[str] = field(default=None)
29+
30+
31+
@define(eq=False, slots=False)
32+
class GcpStorageSource:
33+
kind: ClassVar[str] = "gcp_storage_source"
34+
mapping: ClassVar[Dict[str, Bender]] = {
35+
"bucket": S("bucket"),
36+
"generation": S("generation"),
37+
"object": S("object"),
38+
"source_upload_url": S("sourceUploadUrl"),
39+
}
40+
bucket: Optional[str] = field(default=None)
41+
generation: Optional[str] = field(default=None)
42+
object: Optional[str] = field(default=None)
43+
source_upload_url: Optional[str] = field(default=None)
44+
45+
46+
@define(eq=False, slots=False)
47+
class GcpSource:
48+
kind: ClassVar[str] = "gcp_source"
49+
mapping: ClassVar[Dict[str, Bender]] = {
50+
"git_uri": S("gitUri"),
51+
"repo_source": S("repoSource", default={}) >> Bend(GcpRepoSource.mapping),
52+
"storage_source": S("storageSource", default={}) >> Bend(GcpStorageSource.mapping),
53+
}
54+
git_uri: Optional[str] = field(default=None)
55+
repo_source: Optional[GcpRepoSource] = field(default=None)
56+
storage_source: Optional[GcpStorageSource] = field(default=None)
57+
58+
59+
@define(eq=False, slots=False)
60+
class GcpSourceProvenance:
61+
kind: ClassVar[str] = "gcp_source_provenance"
62+
mapping: ClassVar[Dict[str, Bender]] = {
63+
"git_uri": S("gitUri"),
64+
"resolved_repo_source": S("resolvedRepoSource", default={}) >> Bend(GcpRepoSource.mapping),
65+
"resolved_storage_source": S("resolvedStorageSource", default={}) >> Bend(GcpStorageSource.mapping),
66+
}
67+
git_uri: Optional[str] = field(default=None)
68+
resolved_repo_source: Optional[GcpRepoSource] = field(default=None)
69+
resolved_storage_source: Optional[GcpStorageSource] = field(default=None)
70+
71+
72+
@define(eq=False, slots=False)
73+
class GcpBuildConfig:
74+
kind: ClassVar[str] = "gcp_build_config"
75+
mapping: ClassVar[Dict[str, Bender]] = {
76+
"automatic_update_policy": S("automaticUpdatePolicy", default={}),
77+
"build": S("build"),
78+
"docker_registry": S("dockerRegistry"),
79+
"docker_repository": S("dockerRepository"),
80+
"entry_point": S("entryPoint"),
81+
"environment_variables": S("environmentVariables"),
82+
"on_deploy_update_policy": S("onDeployUpdatePolicy", "runtimeVersion"),
83+
"runtime": S("runtime"),
84+
"service_account": S("serviceAccount"),
85+
"source": S("source", default={}) >> Bend(GcpSource.mapping),
86+
"source_provenance": S("sourceProvenance", default={}) >> Bend(GcpSourceProvenance.mapping),
87+
"source_token": S("sourceToken"),
88+
"worker_pool": S("workerPool"),
89+
}
90+
automatic_update_policy: Optional[Dict[str, Any]] = field(default=None)
91+
build: Optional[str] = field(default=None)
92+
docker_registry: Optional[str] = field(default=None)
93+
docker_repository: Optional[str] = field(default=None)
94+
entry_point: Optional[str] = field(default=None)
95+
environment_variables: Optional[Dict[str, str]] = field(default=None)
96+
on_deploy_update_policy: Optional[str] = field(default=None)
97+
runtime: Optional[str] = field(default=None)
98+
service_account: Optional[str] = field(default=None)
99+
source: Optional[GcpSource] = field(default=None)
100+
source_provenance: Optional[GcpSourceProvenance] = field(default=None)
101+
source_token: Optional[str] = field(default=None)
102+
worker_pool: Optional[str] = field(default=None)
103+
104+
105+
@define(eq=False, slots=False)
106+
class GcpEventFilter:
107+
kind: ClassVar[str] = "gcp_event_filter"
108+
mapping: ClassVar[Dict[str, Bender]] = {"attribute": S("attribute"), "operator": S("operator"), "value": S("value")}
109+
attribute: Optional[str] = field(default=None)
110+
operator: Optional[str] = field(default=None)
111+
value: Optional[str] = field(default=None)
112+
113+
114+
@define(eq=False, slots=False)
115+
class GcpEventTrigger:
116+
kind: ClassVar[str] = "gcp_event_trigger"
117+
mapping: ClassVar[Dict[str, Bender]] = {
118+
"channel": S("channel"),
119+
"event_filters": S("eventFilters", default=[]) >> ForallBend(GcpEventFilter.mapping),
120+
"event_type": S("eventType"),
121+
"pubsub_topic": S("pubsubTopic"),
122+
"retry_policy": S("retryPolicy"),
123+
"service": S("service"),
124+
"service_account_email": S("serviceAccountEmail"),
125+
"trigger": S("trigger"),
126+
"trigger_region": S("triggerRegion"),
127+
}
128+
channel: Optional[str] = field(default=None)
129+
event_filters: Optional[List[GcpEventFilter]] = field(default=None)
130+
event_type: Optional[str] = field(default=None)
131+
pubsub_topic: Optional[str] = field(default=None)
132+
retry_policy: Optional[str] = field(default=None)
133+
service: Optional[str] = field(default=None)
134+
service_account_email: Optional[str] = field(default=None)
135+
trigger: Optional[str] = field(default=None)
136+
trigger_region: Optional[str] = field(default=None)
137+
138+
139+
@define(eq=False, slots=False)
140+
class GcpSecretEnvVar:
141+
kind: ClassVar[str] = "gcp_secret_env_var"
142+
mapping: ClassVar[Dict[str, Bender]] = {
143+
"key": S("key"),
144+
"project_id": S("projectId"),
145+
"secret": S("secret"),
146+
"version": S("version"),
147+
}
148+
key: Optional[str] = field(default=None)
149+
project_id: Optional[str] = field(default=None)
150+
secret: Optional[str] = field(default=None)
151+
version: Optional[str] = field(default=None)
152+
153+
154+
@define(eq=False, slots=False)
155+
class GcpSecretVersion:
156+
kind: ClassVar[str] = "gcp_secret_version"
157+
mapping: ClassVar[Dict[str, Bender]] = {"path": S("path"), "version": S("version")}
158+
path: Optional[str] = field(default=None)
159+
version: Optional[str] = field(default=None)
160+
161+
162+
@define(eq=False, slots=False)
163+
class GcpSecretVolume:
164+
kind: ClassVar[str] = "gcp_secret_volume"
165+
mapping: ClassVar[Dict[str, Bender]] = {
166+
"mount_path": S("mountPath"),
167+
"project_id": S("projectId"),
168+
"secret": S("secret"),
169+
"versions": S("versions", default=[]) >> ForallBend(GcpSecretVersion.mapping),
170+
}
171+
mount_path: Optional[str] = field(default=None)
172+
project_id: Optional[str] = field(default=None)
173+
secret: Optional[str] = field(default=None)
174+
versions: Optional[List[GcpSecretVersion]] = field(default=None)
175+
176+
177+
@define(eq=False, slots=False)
178+
class GcpServiceConfig:
179+
kind: ClassVar[str] = "gcp_service_config"
180+
mapping: ClassVar[Dict[str, Bender]] = {
181+
"all_traffic_on_latest_revision": S("allTrafficOnLatestRevision"),
182+
"available_cpu": S("availableCpu"),
183+
"available_memory": S("availableMemory"),
184+
"binary_authorization_policy": S("binaryAuthorizationPolicy"),
185+
"environment_variables": S("environmentVariables"),
186+
"ingress_settings": S("ingressSettings"),
187+
"max_instance_count": S("maxInstanceCount"),
188+
"max_instance_request_concurrency": S("maxInstanceRequestConcurrency"),
189+
"min_instance_count": S("minInstanceCount"),
190+
"revision": S("revision"),
191+
"secret_environment_variables": S("secretEnvironmentVariables", default=[])
192+
>> ForallBend(GcpSecretEnvVar.mapping),
193+
"secret_volumes": S("secretVolumes", default=[]) >> ForallBend(GcpSecretVolume.mapping),
194+
"security_level": S("securityLevel"),
195+
"service": S("service"),
196+
"service_account_email": S("serviceAccountEmail"),
197+
"timeout_seconds": S("timeoutSeconds"),
198+
"uri": S("uri"),
199+
"vpc_connector": S("vpcConnector"),
200+
"vpc_connector_egress_settings": S("vpcConnectorEgressSettings"),
201+
}
202+
all_traffic_on_latest_revision: Optional[bool] = field(default=None)
203+
available_cpu: Optional[str] = field(default=None)
204+
available_memory: Optional[str] = field(default=None)
205+
binary_authorization_policy: Optional[str] = field(default=None)
206+
environment_variables: Optional[Dict[str, str]] = field(default=None)
207+
ingress_settings: Optional[str] = field(default=None)
208+
max_instance_count: Optional[int] = field(default=None)
209+
max_instance_request_concurrency: Optional[int] = field(default=None)
210+
min_instance_count: Optional[int] = field(default=None)
211+
revision: Optional[str] = field(default=None)
212+
secret_environment_variables: Optional[List[GcpSecretEnvVar]] = field(default=None)
213+
secret_volumes: Optional[List[GcpSecretVolume]] = field(default=None)
214+
security_level: Optional[str] = field(default=None)
215+
service: Optional[str] = field(default=None)
216+
service_account_email: Optional[str] = field(default=None)
217+
timeout_seconds: Optional[int] = field(default=None)
218+
uri: Optional[str] = field(default=None)
219+
vpc_connector: Optional[str] = field(default=None)
220+
vpc_connector_egress_settings: Optional[str] = field(default=None)
221+
222+
223+
@define(eq=False, slots=False)
224+
class GcpCloudFunctionsStateMessage:
225+
kind: ClassVar[str] = "gcp_cloud_functions_state_message"
226+
mapping: ClassVar[Dict[str, Bender]] = {"message": S("message"), "severity": S("severity"), "type": S("type")}
227+
message: Optional[str] = field(default=None)
228+
severity: Optional[str] = field(default=None)
229+
type: Optional[str] = field(default=None)
230+
231+
232+
@define(eq=False, slots=False)
233+
class GcpUpgradeInfo:
234+
kind: ClassVar[str] = "gcp_upgrade_info"
235+
mapping: ClassVar[Dict[str, Bender]] = {
236+
"build_config": S("buildConfig", default={}) >> Bend(GcpBuildConfig.mapping),
237+
"event_trigger": S("eventTrigger", default={}) >> Bend(GcpEventTrigger.mapping),
238+
"service_config": S("serviceConfig", default={}) >> Bend(GcpServiceConfig.mapping),
239+
"upgrade_state": S("upgradeState"),
240+
}
241+
build_config: Optional[GcpBuildConfig] = field(default=None)
242+
event_trigger: Optional[GcpEventTrigger] = field(default=None)
243+
service_config: Optional[GcpServiceConfig] = field(default=None)
244+
upgrade_state: Optional[str] = field(default=None)
245+
246+
247+
@define(eq=False, slots=False)
248+
class GcpCloudFunction(GcpResource, BaseServerlessFunction):
249+
kind: ClassVar[str] = "gcp_cloud_function"
250+
_kind_display: ClassVar[str] = "GCP Cloud Function"
251+
_kind_description: ClassVar[str] = (
252+
"GCP Cloud Function is a serverless execution environment for building and connecting cloud services."
253+
" It allows you to run your code in response to events without provisioning or managing servers."
254+
)
255+
_docs_url: ClassVar[str] = "https://cloud.google.com/functions/docs"
256+
_kind_service: ClassVar[Optional[str]] = "cloudfunctions"
257+
_metadata: ClassVar[Dict[str, Any]] = {"icon": "function", "group": "compute"}
258+
api_spec: ClassVar[GcpApiSpec] = GcpApiSpec(
259+
service="cloudfunctions",
260+
version="v2",
261+
accessors=["projects", "locations", "functions"],
262+
action="list",
263+
request_parameter={"parent": "projects/{project}/locations/-"},
264+
request_parameter_in={"project"},
265+
response_path="functions",
266+
response_regional_sub_path=None,
267+
)
268+
mapping: ClassVar[Dict[str, Bender]] = {
269+
"id": S("name").or_else(S("id")).or_else(S("selfLink")),
270+
"tags": S("labels", default={}),
271+
"name": S("name"),
272+
"ctime": S("creationTimestamp"),
273+
"description": S("description"),
274+
"link": S("selfLink"),
275+
"label_fingerprint": S("labelFingerprint"),
276+
"deprecation_status": S("deprecated", default={}) >> Bend(GcpDeprecationStatus.mapping),
277+
"build_config": S("buildConfig", default={}) >> Bend(GcpBuildConfig.mapping),
278+
"create_time": S("createTime"),
279+
"environment": S("environment"),
280+
"event_trigger": S("eventTrigger", default={}) >> Bend(GcpEventTrigger.mapping),
281+
"kms_key_name": S("kmsKeyName"),
282+
"satisfies_pzs": S("satisfiesPzs"),
283+
"service_config": S("serviceConfig", default={}) >> Bend(GcpServiceConfig.mapping),
284+
"state": S("state"),
285+
"state_messages": S("stateMessages", default=[]) >> ForallBend(GcpCloudFunctionsStateMessage.mapping),
286+
"update_time": S("updateTime"),
287+
"upgrade_info": S("upgradeInfo", default={}) >> Bend(GcpUpgradeInfo.mapping),
288+
"url": S("url"),
289+
}
290+
build_config: Optional[GcpBuildConfig] = field(default=None)
291+
create_time: Optional[datetime] = field(default=None)
292+
environment: Optional[str] = field(default=None)
293+
event_trigger: Optional[GcpEventTrigger] = field(default=None)
294+
kms_key_name: Optional[str] = field(default=None)
295+
satisfies_pzs: Optional[bool] = field(default=None)
296+
service_config: Optional[GcpServiceConfig] = field(default=None)
297+
state: Optional[str] = field(default=None)
298+
state_messages: Optional[List[GcpCloudFunctionsStateMessage]] = field(default=None)
299+
update_time: Optional[datetime] = field(default=None)
300+
upgrade_info: Optional[GcpUpgradeInfo] = field(default=None)
301+
url: Optional[str] = field(default=None)
302+
303+
304+
resources: List[Type[GcpResource]] = [GcpCloudFunction]

0 commit comments

Comments
 (0)