1# Copyright The Cloud Custodian Authors.
2# SPDX-License-Identifier: Apache-2.0
3from c7n_gcp.provider import resources
4from c7n_gcp.query import QueryResourceManager, TypeInfo
5from c7n_gcp.filters import IamPolicyFilter
6from c7n_gcp.filters.iampolicy import IamPolicyValueFilter
7from c7n.utils import local_session
8
9
10@resources.register("cloud-run-service")
11class CloudRunService(QueryResourceManager):
12 """GCP resource: https://cloud.google.com/run/docs/reference/rest/v1/namespaces.services"""
13
14 class resource_type(TypeInfo):
15 service = "run"
16 version = "v1"
17 component = "projects.locations.services"
18 enum_spec = ("list", "items[]", None)
19 scope = "project"
20 scope_key = "parent"
21 scope_template = "projects/{}/locations/-"
22 name = "metadata.name"
23 id = "metadata.selfLink"
24 default_report_fields = ["metadata.name", "metadata.creationTimestamp"]
25 asset_type = "run.googleapis.com/Service"
26
27
28@CloudRunService.filter_registry.register("iam-policy")
29class CloudRunServiceIamPolicyFilter(IamPolicyFilter):
30 """
31 Overrides the base implementation to process cloudrun resources correctly.
32 """
33 permissions = ("run.services.getIamPolicy",)
34
35 def _verb_arguments(self, resource):
36 session = local_session(self.manager.session_factory)
37 project = session.get_default_project()
38 location = resource["metadata"]["labels"]["cloud.googleapis.com/location"]
39 verb_arguments = {
40 "resource": f'projects/{project}/locations/{location}/services/' +
41 f'{resource["metadata"]["name"]}'
42 }
43 return verb_arguments
44
45 def process_resources(self, resources):
46 value_filter = IamPolicyValueFilter(self.data["doc"], self.manager)
47 value_filter._verb_arguments = self._verb_arguments
48 return value_filter.process(resources)
49
50
51@resources.register("cloud-run-job")
52class CloudRunJob(QueryResourceManager):
53 """GCP resource: https://cloud.google.com/run/docs/reference/rest/v2/projects.locations.jobs"""
54
55 class resource_type(TypeInfo):
56 service = "run"
57 version = "v1"
58 component = "namespaces.jobs"
59 enum_spec = ("list", "items[]", None)
60 scope = "project"
61 scope_key = "parent"
62 scope_template = "namespaces/{}"
63 name = "metadata.name"
64 id = "metadata.selfLink"
65 default_report_fields = ["metadata.name", "metadata.creationTimestamp"]
66 asset_type = "run.googleapis.com/Job"
67
68
69@resources.register("cloud-run-revision")
70class CloudRunRevision(QueryResourceManager):
71 """GCP resource: https://cloud.google.com/run/docs/reference/rest/v2/projects.locations.services.revisions"""
72
73 class resource_type(TypeInfo):
74 service = "run"
75 version = "v1"
76 component = "namespaces.revisions"
77 enum_spec = ("list", "items[]", None)
78 scope_key = "parent"
79 scope_template = "namespaces/{}"
80 name = "metadata.name"
81 id = "metadata.selfLink"
82 default_report_fields = ["metadata.name", "metadata.creationTimestamp"]
83 asset_type = "run.googleapis.com/Revision"
84 urn_component = "revision"
85 urn_id_segments = (-1,)