1# Copyright The Cloud Custodian Authors.
2# SPDX-License-Identifier: Apache-2.0
3
4import re
5
6from c7n_gcp.provider import resources
7from c7n_gcp.query import QueryResourceManager, TypeInfo, ChildResourceManager, ChildTypeInfo
8from c7n.utils import local_session
9
10
11@resources.register('app-engine')
12class AppEngineApp(QueryResourceManager):
13 """GCP resource: https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps
14 """
15 class resource_type(TypeInfo):
16 service = 'appengine'
17 version = 'v1'
18 component = 'apps'
19 enum_spec = ('get', '[@]', None)
20 scope = None
21 id = 'id'
22 name = 'name'
23 default_report_fields = [
24 'id', 'locationId', 'servingStatus', 'authDomain', 'defaultHostname']
25 asset_type = "appengine.googleapis.com/Application"
26 permissions = ('appengine.applications.get',)
27 metric_key = 'resource.labels.module_id'
28 urn_component = "app"
29 urn_region_key = "locationId"
30
31 @staticmethod
32 def get(client, resource_info):
33 return client.execute_query(
34 'get', {'appsId': re.match('apps/(.*)',
35 resource_info['resourceName']).group(1)})
36
37 def get_resource_query(self):
38 return {'appsId': local_session(self.session_factory).get_default_project()}
39
40
41class AppEngineChildTypeInfo(ChildTypeInfo):
42 service = 'appengine'
43 version = 'v1'
44 scope = None
45 parent_spec = {
46 'resource': 'app-engine',
47 'child_enum_params': {
48 ('id', 'appsId')
49 }
50 }
51 permissions = ('appengine.applications.get',)
52
53 @classmethod
54 def _get_location(cls, resource):
55 "Get the region from the parent."
56 return cls.get_parent(resource)["locationId"]
57
58
59@resources.register('app-engine-certificate')
60class AppEngineCertificate(ChildResourceManager):
61 """GCP resource:
62 https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.authorizedCertificates
63 """
64 def _get_parent_resource_info(self, child_instance):
65 return {'resourceName': re.match(
66 '(apps/.*?)/authorizedCertificates/.*', child_instance['name']).group(1)}
67
68 class resource_type(AppEngineChildTypeInfo):
69 component = 'apps.authorizedCertificates'
70 enum_spec = ('list', 'certificates[]', None)
71 name = 'displayName'
72 id = 'id'
73 default_report_fields = ['displayName', 'expireTime']
74 urn_component = "certificate"
75
76 @staticmethod
77 def get(client, resource_info):
78 apps_id, cert_id = re.match('apps/(.*?)/authorizedCertificates/(.*)',
79 resource_info['resourceName']).groups()
80 return client.execute_query('get', {'appsId': apps_id,
81 'authorizedCertificatesId': cert_id})
82
83
84@resources.register('app-engine-domain')
85class AppEngineDomain(ChildResourceManager):
86 """GCP resource:
87 https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.authorizedDomains/list#AuthorizedDomain
88 """
89 class resource_type(AppEngineChildTypeInfo):
90 component = 'apps.authorizedDomains'
91 enum_spec = ('list', 'domains[]', None)
92 id = 'id'
93 name = "name"
94 default_report_fields = [id, name]
95 urn_component = "domain"
96
97
98@resources.register('app-engine-domain-mapping')
99class AppEngineDomainMapping(ChildResourceManager):
100 """GCP resource:
101 https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.domainMappings
102 """
103 def _get_parent_resource_info(self, child_instance):
104 return {'resourceName': re.match(
105 '(apps/.*?)/domainMappings/.*', child_instance['name']).group(1)}
106
107 class resource_type(AppEngineChildTypeInfo):
108 component = 'apps.domainMappings'
109 enum_spec = ('list', 'domainMappings[]', None)
110 name = "name"
111 id = 'id'
112 default_report_fields = [id, name]
113 urn_component = "domain-mapping"
114
115 @staticmethod
116 def get(client, resource_info):
117 apps_id, mapping_id = re.match('apps/(.*?)/domainMappings/(.*)',
118 resource_info['resourceName']).groups()
119 return client.execute_query('get', {'appsId': apps_id,
120 'domainMappingsId': mapping_id})
121
122
123@resources.register('app-engine-firewall-ingress-rule')
124class AppEngineFirewallIngressRule(ChildResourceManager):
125 """GCP resource:
126 https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.firewall.ingressRules
127 """
128 def _get_parent_resource_info(self, child_instance):
129 return {'resourceName': 'apps/%s' %
130 local_session(self.session_factory).get_default_project()}
131
132 class resource_type(AppEngineChildTypeInfo):
133 component = 'apps.firewall.ingressRules'
134 enum_spec = ('list', 'ingressRules[]', None)
135 name = id = 'priority'
136 default_report_fields = ['priority', 'action', 'sourceRange', 'description']
137 urn_component = "firewall-ingress-rule"
138
139 @staticmethod
140 def get(client, resource_info):
141 apps_id, ingress_rules_id = re.match('apps/(.*?)/firewall/ingressRules/(.*)',
142 resource_info['resourceName']).groups()
143 return client.execute_query(
144 'get', {'appsId': apps_id,
145 'ingressRulesId': ingress_rules_id})
146
147
148@resources.register('app-engine-service')
149class AppEngineService(ChildResourceManager):
150 """GCP resource:
151 https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services
152 """
153 def _get_parent_resource_info(self, child_instance):
154 return {'resourceName': re.match(
155 '(apps/.*?)/services/.*', child_instance['name']).group(1)}
156
157 class resource_type(AppEngineChildTypeInfo):
158 component = 'apps.services'
159 enum_spec = ('list', 'services[]', None)
160 name = 'name'
161 id = 'id'
162 default_report_fields = ['name', 'networkSettings']
163 urn_component = "service"
164 asset_type = "appengine.googleapis.com/Service"
165
166 @staticmethod
167 def get(client, resource_info):
168 apps_id, service_id = re.match('apps/(.*?)/services/(.*)',
169 resource_info['resourceName']).groups()
170 return client.execute_query('get', {'appsId': apps_id,
171 'servicesId': service_id})
172
173
174@resources.register('app-engine-service-version')
175class AppEngineServiceVersion(ChildResourceManager):
176 """GCP Resource
177 https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services.versions
178 """
179
180 class resource_type(AppEngineChildTypeInfo):
181 component = 'apps.services.versions'
182 name = 'name'
183 id = 'id'
184 enum_spec = ('list', 'versions[]', None)
185 default_report_fields = ['name', 'instanceClass', 'runtime', 'runtimeChannel', 'vm']
186 urn_component = "versions"
187 asset_type = "appengine.googleapis.com/Version"
188 parent_spec = {
189 'resource': 'app-engine-service',
190 'child_enum_params': [
191 ('id', 'servicesId'),
192 ('name', 'appsId', 'regex', r'/(.*?)/')
193 ]
194 }