1# Copyright The Cloud Custodian Authors.
2# SPDX-License-Identifier: Apache-2.0
3from c7n_gcp.filters.iampolicy import IamPolicyFilter
4from c7n_gcp.provider import resources
5from c7n_gcp.query import (
6 QueryResourceManager, TypeInfo, ChildResourceManager, ChildTypeInfo
7)
8from c7n.utils import local_session
9from c7n_gcp.filters.timerange import TimeRangeFilter
10
11
12@resources.register('bigtable-instance')
13class BigTableInstance(QueryResourceManager):
14 """GC resource:
15 https://cloud.google.com/bigtable/docs/reference/admin/rest/v2/projects.instances"""
16 class resource_type(TypeInfo):
17 service = 'bigtableadmin'
18 version = 'v2'
19 component = 'projects.instances'
20 enum_spec = ('list', 'instances[]', None)
21 scope_key = 'parent'
22 name = id = 'id'
23 scope_template = "projects/{}"
24 permissions = ('bigtable.instances.list',)
25 perm_service = 'bigtable'
26 asset_type = "bigtableadmin.googleapis.com/Instance"
27 default_report_fields = ['displayName', 'expireTime']
28 labels = True
29 labels_op = 'partialUpdateInstance'
30
31 @staticmethod
32 def get_label_params(resource, all_labels):
33 return {
34 'name': resource['name'],
35 'updateMask': 'labels',
36 'body': {'labels': all_labels},
37 }
38
39
40@resources.register('bigtable-instance-cluster')
41class BigTableInstanceCluster(ChildResourceManager):
42 """GC resource:
43 https://cloud.google.com/bigtable/docs/reference/admin/rest/v2/projects.instances.clusters"""
44 class resource_type(ChildTypeInfo):
45 service = 'bigtableadmin'
46 version = 'v2'
47 component = 'projects.instances.clusters'
48 enum_spec = ('list', 'clusters[]', None)
49 scope = 'parent'
50 name = id = 'clusters'
51 parent_spec = {
52 'resource': 'bigtable-instance',
53 'child_enum_params': {
54 ('displayName', 'parent')},
55 'use_child_query': True,
56 }
57 default_report_fields = ['name', 'expireTime']
58 permissions = ('bigtable.clusters.list',)
59 asset_type = "bigtableadmin.googleapis.com/Cluster"
60
61 def _get_child_enum_args(self, parent_instance):
62 return {
63 'parent': 'projects/{}/instances/{}'.format(
64 local_session(self.session_factory).get_default_project(),
65 parent_instance['displayName'],
66 )
67 }
68
69
70@resources.register('bigtable-instance-cluster-backup')
71class BigTableInstanceClusterBackup(ChildResourceManager):
72 """GC resource:
73 https://cloud.google.com/bigtable/docs/reference/admin/rest/v2/projects.instances.clusters.backups
74 """
75 class resource_type(ChildTypeInfo):
76 service = 'bigtableadmin'
77 version = 'v2'
78 component = 'projects.instances.clusters.backups'
79 enum_spec = ('list', 'backups[]', None)
80 scope = 'parent'
81 name = id = 'backups'
82 parent_spec = {
83 'resource': 'bigtable-instance-cluster',
84 'child_enum_params': {
85 ('name', 'parent')},
86 'use_child_query': True,
87 }
88 default_report_fields = ['name', 'expireTime']
89 permissions = ('bigtable.backups.list',)
90 asset_type = "bigtableadmin.googleapis.com/Backup"
91
92 def _get_child_enum_args(self, parent_instance):
93 return {
94 'parent': '{}'.format(
95 parent_instance['name'],
96 )
97 }
98
99
100@BigTableInstanceClusterBackup.filter_registry.register('time-range')
101class TimeRange(TimeRangeFilter):
102 """Filters bigtable instance clusters backups based on a time range
103
104 .. code-block:: yaml
105
106 policies:
107 - name: bigtable_backup_expiration_time_30_days
108 description: |
109 Cloud Bigtable backup expiration time is 29 days or less
110 resource: gcp.bigtable-instance-cluster-backup
111 filters:
112 - type: time-range
113 value: 29
114 """
115 create_time_field_name = 'startTime'
116 expire_time_field_name = 'expireTime'
117 permissions = ('bigtable.backups.list',)
118
119
120@resources.register('bigtable-instance-table')
121class BigTableInstanceTable(ChildResourceManager):
122 """ GC resource:
123 https://cloud.google.com/bigtable/docs/reference/admin/rest/v2/projects.instances.tables"""
124 class resource_type(ChildTypeInfo):
125 service = 'bigtableadmin'
126 version = 'v2'
127 component = 'projects.instances.tables'
128 enum_spec = ('list', 'tables[]', None)
129 scope = 'parent'
130 name = id = 'name'
131 parent_spec = {
132 'resource': 'bigtable-instance',
133 'child_enum_params': {
134 ('name', 'parent')},
135 'use_child_query': True,
136 }
137 default_report_fields = ['name']
138 permissions = ('bigtable.tables.list',)
139 asset_type = "bigtableadmin.googleapis.com/Table"
140
141 def _get_child_enum_args(self, parent_instance):
142 return {
143 'parent': 'projects/{}/instances/{}'.format(
144 local_session(self.session_factory).get_default_project(),
145 parent_instance['displayName'],
146 )
147 }
148
149
150@BigTableInstanceTable.filter_registry.register('iam-policy')
151class BigTableInstanceTableIamPolicyFilter(IamPolicyFilter):
152 permissions = ('resourcemanager.projects.getIamPolicy',)