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

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 

8 

9 

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 

31 

32 @staticmethod 

33 def get(client, resource_info): 

34 return client.execute_command( 

35 'get', {'name': resource_info['resourceName']} 

36 ) 

37 

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'])}} 

46 

47 

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' 

67 

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 } 

75 

76 

77@SpannerInstanceBackup.filter_registry.register('time-range') 

78class SpannerInstanceBackupTimeRangeFilter(TimeRangeFilter): 

79 """Filters spanner instance backups based on a time range 

80 

81 .. code-block:: yaml 

82 

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' 

95 

96 

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',) 

103 

104 

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',) 

111 

112 

113@SpannerInstance.action_registry.register('delete') 

114class SpannerInstanceDelete(MethodAction): 

115 """The action is used for spanner instances delete. 

116 

117 GCP action is https://cloud.google.com/spanner/docs/reference/rest/v1/projects.instances/delete 

118 

119 :Example: 

120 

121 .. code-block:: yaml 

122 

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'} 

136 

137 def get_resource_params(self, model, resource): 

138 return {'name': resource['name']} 

139 

140 

141@SpannerInstance.action_registry.register('set') 

142class SpannerInstancePatch(MethodAction): 

143 """The action is used for spanner instances nodeCount patch. 

144 

145 GCP action is https://cloud.google.com/spanner/docs/reference/rest/v1/projects.instances/patch 

146 

147 :Example: 

148 

149 .. code-block:: yaml 

150 

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' 

167 

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 

177 

178 

179SpannerInstance.action_registry.register('set-iam-policy', SetIamPolicy) 

180 

181 

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 } 

196 

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) 

214 

215 @staticmethod 

216 def get(client, resource_info): 

217 return client.execute_command( 

218 'get', { 

219 'name': resource_info['resourceName']} 

220 ) 

221 

222 

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',) 

229 

230 

231SpannerDatabaseInstance.action_registry.register('set-iam-policy', SetIamPolicy) 

232 

233 

234@SpannerDatabaseInstance.action_registry.register('delete') 

235class SpannerDatabaseInstanceDropDatabase(MethodAction): 

236 """The action is used for databases deleting. 

237 

238 GCP action is https://cloud.google.com/spanner/docs 

239 /reference/rest/v1/projects.instances.databases/dropDatabase. 

240 

241 :Example: 

242 

243 .. code-block:: yaml 

244 

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' 

259 

260 def get_resource_params(self, model, resource): 

261 return {'database': resource['name']}