Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/c7n_gcp/resources/spanner.py: 87%
104 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-08 06:51 +0000
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-08 06:51 +0000
1# Copyright The Cloud Custodian Authors.
2# SPDX-License-Identifier: Apache-2.0
3from c7n.utils import type_schema, local_session
4from c7n_gcp.actions import MethodAction, SetIamPolicy
5from c7n_gcp.filters import IamPolicyFilter, TimeRangeFilter
6from c7n_gcp.provider import resources
7from c7n_gcp.query import QueryResourceManager, TypeInfo, ChildTypeInfo, ChildResourceManager
10@resources.register('spanner-instance')
11class SpannerInstance(QueryResourceManager):
12 """
13 https://cloud.google.com/spanner/docs/reference/rest/v1/projects.instances
14 """
15 class resource_type(TypeInfo):
16 service = 'spanner'
17 version = 'v1'
18 component = 'projects.instances'
19 enum_spec = ('list', 'instances[]', None)
20 scope_key = 'parent'
21 scope_template = 'projects/{}'
22 name = id = 'name'
23 default_report_fields = [
24 "name", "displayName", "nodeCount", "state", "config"]
25 labels = True
26 labels_op = 'patch'
27 asset_type = "spanner.googleapis.com/Instance"
28 metric_key = "resource.labels.instance_id"
29 urn_component = "instance"
30 urn_id_segments = (-1,) # Just use the last segment of the id in the URN
32 @staticmethod
33 def get(client, resource_info):
34 return client.execute_command(
35 'get', {'name': resource_info['resourceName']}
36 )
38 @staticmethod
39 def get_label_params(resource, all_labels):
40 return {'name': resource['name'],
41 'body': {
42 'instance': {
43 'labels': all_labels
44 },
45 'field_mask': ', '.join(['labels'])}}
48@resources.register('spanner-backup')
49class SpannerInstanceBackup(ChildResourceManager):
50 """GC resource: https://cloud.google.com/spanner/docs/reference/rest/v1/projects.instances.backups"""
51 class resource_type(ChildTypeInfo):
52 service = 'spanner'
53 version = 'v1'
54 component = 'projects.instances.backups'
55 enum_spec = ('list', 'backups[]', None)
56 scope = 'parent'
57 name = id = 'name'
58 parent_spec = {
59 'resource': 'spanner-instance',
60 'child_enum_params': {
61 ('instances', 'parent')},
62 'use_child_query': True,
63 }
64 default_report_fields = ['name', 'expireTime']
65 permissions = ('spanner.backups.list',)
66 asset_type = 'spanner.googleapis.com/Backup'
68 def _get_child_enum_args(self, parent_instance):
69 return {
70 'parent': 'projects/{}/instances/{}'.format(
71 local_session(self.session_factory).get_default_project(),
72 parent_instance['displayName'],
73 )
74 }
77@SpannerInstanceBackup.filter_registry.register('time-range')
78class SpannerInstanceBackupTimeRangeFilter(TimeRangeFilter):
79 """Filters spanner instance backups based on a time range
81 .. code-block:: yaml
83 policies:
84 - name: spanner_backup_expiration_time_30_days_or_more
85 description: |
86 Cloud Spanner backup is created with an expiration date of 29 days or less
87 resource: gcp.spanner-backup
88 filters:
89 - type: time-range
90 value: 29
91 """
92 permissions = ('spanner.backups.list',)
93 create_time_field_name = 'createTime'
94 expire_time_field_name = 'expireTime'
97@SpannerInstanceBackup.filter_registry.register('iam-policy')
98class SpannerInstanceBackupIamPolicyFilter(IamPolicyFilter):
99 """
100 Overrides the base implementation to process spanner instance backup resources correctly.
101 """
102 permissions = ('spanner.backups.getIamPolicy',)
105@SpannerInstance.filter_registry.register('iam-policy')
106class SpannerInstanceIamPolicyFilter(IamPolicyFilter):
107 """
108 Overrides the base implementation to process spanner instance resources correctly.
109 """
110 permissions = ('spanner.instances.getIamPolicy',)
113@SpannerInstance.action_registry.register('delete')
114class SpannerInstanceDelete(MethodAction):
115 """The action is used for spanner instances delete.
117 GCP action is https://cloud.google.com/spanner/docs/reference/rest/v1/projects.instances/delete
119 :Example:
121 .. code-block:: yaml
123 policies:
124 - name: gcp-spanner-instances-delete
125 resource: gcp.spanner-instance
126 filters:
127 - type: value
128 key: nodeCount
129 op: gte
130 value: 2
131 actions:
132 - type: delete
133 """
134 schema = type_schema('delete')
135 method_spec = {'op': 'delete'}
137 def get_resource_params(self, model, resource):
138 return {'name': resource['name']}
141@SpannerInstance.action_registry.register('set')
142class SpannerInstancePatch(MethodAction):
143 """The action is used for spanner instances nodeCount patch.
145 GCP action is https://cloud.google.com/spanner/docs/reference/rest/v1/projects.instances/patch
147 :Example:
149 .. code-block:: yaml
151 policies:
152 - name: gcp-spanner-instances-change-node-count
153 resource: gcp.spanner-instance
154 filters:
155 - type: value
156 key: nodeCount
157 op: gte
158 value: 2
159 actions:
160 - type: set
161 nodeCount: 1
162 """
163 schema = type_schema('set', required=['nodeCount'],
164 **{'nodeCount': {'type': 'number'}})
165 method_spec = {'op': 'patch'}
166 method_perm = 'update'
168 def get_resource_params(self, model, resource):
169 result = {'name': resource['name'],
170 'body': {
171 'instance': {
172 'nodeCount': self.data['nodeCount']
173 },
174 'field_mask': ', '.join(['nodeCount'])}
175 }
176 return result
179SpannerInstance.action_registry.register('set-iam-policy', SetIamPolicy)
182@resources.register('spanner-database-instance')
183class SpannerDatabaseInstance(ChildResourceManager):
184 """GCP resource:
185 https://cloud.google.com/spanner/docs/reference/rest/v1/projects.instances.databases
186 """
187 def _get_parent_resource_info(self, child_instance):
188 resource_name = None
189 if child_instance['name'] is not None:
190 resource_names = child_instance['name'].split('/databases')
191 if len(resource_names) > 0:
192 resource_name = resource_names[0]
193 return {
194 'resourceName': resource_name
195 }
197 class resource_type(ChildTypeInfo):
198 service = 'spanner'
199 version = 'v1'
200 component = 'projects.instances.databases'
201 enum_spec = ('list', 'databases[]', None)
202 name = id = 'name'
203 scope = None
204 parent_spec = {
205 'resource': 'spanner-instance',
206 'child_enum_params': [
207 ('name', 'parent')
208 ]
209 }
210 default_report_fields = ["name", "state", "createTime"]
211 asset_type = "spanner.googleapis.com/Database"
212 urn_component = "database"
213 urn_id_segments = (3, 5)
215 @staticmethod
216 def get(client, resource_info):
217 return client.execute_command(
218 'get', {
219 'name': resource_info['resourceName']}
220 )
223@SpannerDatabaseInstance.filter_registry.register('iam-policy')
224class SpannerDatabaseInstanceIamPolicyFilter(IamPolicyFilter):
225 """
226 Overrides the base implementation to process spanner database resources correctly.
227 """
228 permissions = ('spanner.databases.getIamPolicy',)
231SpannerDatabaseInstance.action_registry.register('set-iam-policy', SetIamPolicy)
234@SpannerDatabaseInstance.action_registry.register('delete')
235class SpannerDatabaseInstanceDropDatabase(MethodAction):
236 """The action is used for databases deleting.
238 GCP action is https://cloud.google.com/spanner/docs
239 /reference/rest/v1/projects.instances.databases/dropDatabase.
241 :Example:
243 .. code-block:: yaml
245 policies:
246 - name: gcp-spanner-instance-databases-delete
247 resource: gcp.spanner-database-instance
248 filters:
249 - type: value
250 key: name
251 op: contains
252 value: dev
253 actions:
254 - type: delete
255 """
256 schema = type_schema('dropDatabase', **{'type': {'enum': ['delete']}})
257 method_spec = {'op': 'dropDatabase'}
258 method_perm = 'drop'
260 def get_resource_params(self, model, resource):
261 return {'database': resource['name']}