cartography 0.102.0rc2__py3-none-any.whl → 0.103.0rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of cartography might be problematic. Click here for more details.

Files changed (251) hide show
  1. cartography/__main__.py +1 -2
  2. cartography/_version.py +2 -2
  3. cartography/cli.py +302 -253
  4. cartography/client/core/tx.py +39 -18
  5. cartography/config.py +4 -0
  6. cartography/driftdetect/__main__.py +1 -2
  7. cartography/driftdetect/add_shortcut.py +10 -2
  8. cartography/driftdetect/cli.py +71 -75
  9. cartography/driftdetect/detect_deviations.py +7 -3
  10. cartography/driftdetect/get_states.py +20 -8
  11. cartography/driftdetect/model.py +5 -5
  12. cartography/driftdetect/serializers.py +8 -6
  13. cartography/driftdetect/storage.py +2 -2
  14. cartography/graph/cleanupbuilder.py +35 -15
  15. cartography/graph/job.py +46 -17
  16. cartography/graph/querybuilder.py +165 -80
  17. cartography/graph/statement.py +35 -26
  18. cartography/intel/analysis.py +4 -1
  19. cartography/intel/aws/__init__.py +114 -55
  20. cartography/intel/aws/apigateway.py +134 -63
  21. cartography/intel/aws/cloudtrail.py +127 -0
  22. cartography/intel/aws/config.py +56 -20
  23. cartography/intel/aws/dynamodb.py +108 -40
  24. cartography/intel/aws/ec2/__init__.py +2 -2
  25. cartography/intel/aws/ec2/auto_scaling_groups.py +181 -78
  26. cartography/intel/aws/ec2/elastic_ip_addresses.py +41 -13
  27. cartography/intel/aws/ec2/images.py +49 -20
  28. cartography/intel/aws/ec2/instances.py +234 -136
  29. cartography/intel/aws/ec2/internet_gateways.py +40 -11
  30. cartography/intel/aws/ec2/key_pairs.py +44 -20
  31. cartography/intel/aws/ec2/launch_templates.py +101 -59
  32. cartography/intel/aws/ec2/load_balancer_v2s.py +104 -39
  33. cartography/intel/aws/ec2/load_balancers.py +82 -42
  34. cartography/intel/aws/ec2/network_acls.py +89 -65
  35. cartography/intel/aws/ec2/network_interfaces.py +146 -87
  36. cartography/intel/aws/ec2/reserved_instances.py +45 -16
  37. cartography/intel/aws/ec2/route_tables.py +138 -98
  38. cartography/intel/aws/ec2/security_groups.py +71 -21
  39. cartography/intel/aws/ec2/snapshots.py +61 -22
  40. cartography/intel/aws/ec2/subnets.py +54 -18
  41. cartography/intel/aws/ec2/tgw.py +100 -34
  42. cartography/intel/aws/ec2/util.py +1 -1
  43. cartography/intel/aws/ec2/volumes.py +69 -41
  44. cartography/intel/aws/ec2/vpc.py +37 -12
  45. cartography/intel/aws/ec2/vpc_peerings.py +83 -24
  46. cartography/intel/aws/ecr.py +88 -32
  47. cartography/intel/aws/ecs.py +83 -47
  48. cartography/intel/aws/eks.py +55 -29
  49. cartography/intel/aws/elasticache.py +42 -18
  50. cartography/intel/aws/elasticsearch.py +57 -20
  51. cartography/intel/aws/emr.py +61 -23
  52. cartography/intel/aws/iam.py +401 -145
  53. cartography/intel/aws/iam_instance_profiles.py +22 -22
  54. cartography/intel/aws/identitycenter.py +71 -37
  55. cartography/intel/aws/inspector.py +159 -89
  56. cartography/intel/aws/kms.py +92 -38
  57. cartography/intel/aws/lambda_function.py +103 -34
  58. cartography/intel/aws/organizations.py +30 -10
  59. cartography/intel/aws/permission_relationships.py +133 -51
  60. cartography/intel/aws/rds.py +249 -85
  61. cartography/intel/aws/redshift.py +107 -46
  62. cartography/intel/aws/resourcegroupstaggingapi.py +120 -66
  63. cartography/intel/aws/resources.py +53 -46
  64. cartography/intel/aws/route53.py +108 -61
  65. cartography/intel/aws/s3.py +168 -83
  66. cartography/intel/aws/s3accountpublicaccessblock.py +157 -0
  67. cartography/intel/aws/secretsmanager.py +24 -12
  68. cartography/intel/aws/securityhub.py +20 -9
  69. cartography/intel/aws/sns.py +166 -0
  70. cartography/intel/aws/sqs.py +60 -28
  71. cartography/intel/aws/ssm.py +70 -30
  72. cartography/intel/aws/util/arns.py +7 -7
  73. cartography/intel/aws/util/common.py +31 -4
  74. cartography/intel/azure/__init__.py +78 -19
  75. cartography/intel/azure/compute.py +101 -27
  76. cartography/intel/azure/cosmosdb.py +496 -170
  77. cartography/intel/azure/sql.py +296 -105
  78. cartography/intel/azure/storage.py +322 -113
  79. cartography/intel/azure/subscription.py +39 -23
  80. cartography/intel/azure/tenant.py +13 -4
  81. cartography/intel/azure/util/credentials.py +95 -55
  82. cartography/intel/bigfix/__init__.py +2 -2
  83. cartography/intel/bigfix/computers.py +93 -65
  84. cartography/intel/create_indexes.py +3 -2
  85. cartography/intel/crowdstrike/__init__.py +11 -9
  86. cartography/intel/crowdstrike/endpoints.py +5 -1
  87. cartography/intel/crowdstrike/spotlight.py +8 -3
  88. cartography/intel/cve/__init__.py +46 -13
  89. cartography/intel/cve/feed.py +48 -12
  90. cartography/intel/digitalocean/__init__.py +22 -13
  91. cartography/intel/digitalocean/compute.py +75 -108
  92. cartography/intel/digitalocean/management.py +44 -80
  93. cartography/intel/digitalocean/platform.py +48 -43
  94. cartography/intel/dns.py +36 -10
  95. cartography/intel/duo/__init__.py +21 -16
  96. cartography/intel/duo/api_host.py +14 -9
  97. cartography/intel/duo/endpoints.py +50 -45
  98. cartography/intel/duo/groups.py +18 -14
  99. cartography/intel/duo/phones.py +37 -34
  100. cartography/intel/duo/tokens.py +26 -23
  101. cartography/intel/duo/users.py +54 -50
  102. cartography/intel/duo/web_authn_credentials.py +30 -25
  103. cartography/intel/entra/__init__.py +25 -7
  104. cartography/intel/entra/ou.py +112 -0
  105. cartography/intel/entra/users.py +69 -63
  106. cartography/intel/gcp/__init__.py +185 -49
  107. cartography/intel/gcp/compute.py +418 -231
  108. cartography/intel/gcp/crm.py +96 -43
  109. cartography/intel/gcp/dns.py +60 -19
  110. cartography/intel/gcp/gke.py +72 -38
  111. cartography/intel/gcp/iam.py +61 -41
  112. cartography/intel/gcp/storage.py +84 -55
  113. cartography/intel/github/__init__.py +13 -11
  114. cartography/intel/github/repos.py +270 -137
  115. cartography/intel/github/teams.py +170 -88
  116. cartography/intel/github/users.py +70 -39
  117. cartography/intel/github/util.py +36 -34
  118. cartography/intel/gsuite/__init__.py +47 -26
  119. cartography/intel/gsuite/api.py +73 -30
  120. cartography/intel/jamf/__init__.py +19 -1
  121. cartography/intel/jamf/computers.py +30 -7
  122. cartography/intel/jamf/util.py +7 -2
  123. cartography/intel/kandji/__init__.py +6 -3
  124. cartography/intel/kandji/devices.py +14 -8
  125. cartography/intel/kubernetes/namespaces.py +7 -4
  126. cartography/intel/kubernetes/pods.py +7 -4
  127. cartography/intel/kubernetes/services.py +8 -4
  128. cartography/intel/lastpass/__init__.py +2 -2
  129. cartography/intel/lastpass/users.py +23 -12
  130. cartography/intel/oci/__init__.py +44 -11
  131. cartography/intel/oci/iam.py +134 -38
  132. cartography/intel/oci/organizations.py +13 -6
  133. cartography/intel/oci/utils.py +43 -20
  134. cartography/intel/okta/__init__.py +66 -15
  135. cartography/intel/okta/applications.py +42 -20
  136. cartography/intel/okta/awssaml.py +93 -33
  137. cartography/intel/okta/factors.py +16 -4
  138. cartography/intel/okta/groups.py +56 -29
  139. cartography/intel/okta/organization.py +5 -1
  140. cartography/intel/okta/origins.py +6 -2
  141. cartography/intel/okta/roles.py +15 -5
  142. cartography/intel/okta/users.py +20 -8
  143. cartography/intel/okta/utils.py +6 -4
  144. cartography/intel/pagerduty/__init__.py +8 -7
  145. cartography/intel/pagerduty/escalation_policies.py +18 -6
  146. cartography/intel/pagerduty/schedules.py +12 -4
  147. cartography/intel/pagerduty/services.py +11 -4
  148. cartography/intel/pagerduty/teams.py +8 -3
  149. cartography/intel/pagerduty/users.py +3 -1
  150. cartography/intel/pagerduty/vendors.py +3 -1
  151. cartography/intel/semgrep/__init__.py +24 -6
  152. cartography/intel/semgrep/dependencies.py +50 -28
  153. cartography/intel/semgrep/deployment.py +3 -1
  154. cartography/intel/semgrep/findings.py +42 -18
  155. cartography/intel/snipeit/__init__.py +17 -3
  156. cartography/intel/snipeit/asset.py +12 -6
  157. cartography/intel/snipeit/user.py +8 -5
  158. cartography/intel/snipeit/util.py +9 -4
  159. cartography/models/aws/apigateway.py +21 -17
  160. cartography/models/aws/apigatewaycertificate.py +28 -22
  161. cartography/models/aws/apigatewayresource.py +28 -20
  162. cartography/models/aws/apigatewaystage.py +33 -25
  163. cartography/models/aws/cloudtrail/__init__.py +0 -0
  164. cartography/models/aws/cloudtrail/trail.py +61 -0
  165. cartography/models/aws/dynamodb/gsi.py +30 -22
  166. cartography/models/aws/dynamodb/tables.py +25 -17
  167. cartography/models/aws/ec2/auto_scaling_groups.py +102 -82
  168. cartography/models/aws/ec2/images.py +36 -34
  169. cartography/models/aws/ec2/instances.py +51 -45
  170. cartography/models/aws/ec2/keypair.py +21 -16
  171. cartography/models/aws/ec2/keypair_instance.py +28 -21
  172. cartography/models/aws/ec2/launch_configurations.py +30 -26
  173. cartography/models/aws/ec2/launch_template_versions.py +48 -38
  174. cartography/models/aws/ec2/launch_templates.py +21 -17
  175. cartography/models/aws/ec2/load_balancer_listeners.py +27 -23
  176. cartography/models/aws/ec2/load_balancers.py +47 -37
  177. cartography/models/aws/ec2/network_acl_rules.py +38 -30
  178. cartography/models/aws/ec2/network_acls.py +38 -29
  179. cartography/models/aws/ec2/networkinterface_instance.py +52 -39
  180. cartography/models/aws/ec2/networkinterfaces.py +53 -37
  181. cartography/models/aws/ec2/privateip_networkinterface.py +32 -22
  182. cartography/models/aws/ec2/reservations.py +18 -14
  183. cartography/models/aws/ec2/route_table_associations.py +44 -34
  184. cartography/models/aws/ec2/route_tables.py +50 -43
  185. cartography/models/aws/ec2/routes.py +45 -37
  186. cartography/models/aws/ec2/securitygroup_instance.py +29 -20
  187. cartography/models/aws/ec2/securitygroup_networkinterface.py +24 -15
  188. cartography/models/aws/ec2/subnet_instance.py +24 -19
  189. cartography/models/aws/ec2/subnet_networkinterface.py +40 -31
  190. cartography/models/aws/ec2/volumes.py +47 -40
  191. cartography/models/aws/eks/clusters.py +23 -21
  192. cartography/models/aws/emr.py +32 -30
  193. cartography/models/aws/iam/instanceprofile.py +33 -24
  194. cartography/models/aws/identitycenter/awsidentitycenter.py +18 -14
  195. cartography/models/aws/identitycenter/awspermissionset.py +37 -29
  196. cartography/models/aws/identitycenter/awsssouser.py +23 -21
  197. cartography/models/aws/inspector/findings.py +77 -65
  198. cartography/models/aws/inspector/packages.py +35 -29
  199. cartography/models/aws/s3/__init__.py +0 -0
  200. cartography/models/aws/s3/account_public_access_block.py +51 -0
  201. cartography/models/aws/sns/__init__.py +0 -0
  202. cartography/models/aws/sns/topic.py +50 -0
  203. cartography/models/aws/ssm/instance_information.py +51 -39
  204. cartography/models/aws/ssm/instance_patch.py +32 -26
  205. cartography/models/bigfix/bigfix_computer.py +42 -38
  206. cartography/models/bigfix/bigfix_root.py +3 -3
  207. cartography/models/core/common.py +12 -10
  208. cartography/models/core/nodes.py +5 -2
  209. cartography/models/core/relationships.py +14 -6
  210. cartography/models/crowdstrike/hosts.py +37 -35
  211. cartography/models/cve/cve.py +34 -32
  212. cartography/models/cve/cve_feed.py +6 -6
  213. cartography/models/digitalocean/__init__.py +0 -0
  214. cartography/models/digitalocean/account.py +21 -0
  215. cartography/models/digitalocean/droplet.py +56 -0
  216. cartography/models/digitalocean/project.py +48 -0
  217. cartography/models/duo/api_host.py +3 -3
  218. cartography/models/duo/endpoint.py +43 -41
  219. cartography/models/duo/group.py +14 -14
  220. cartography/models/duo/phone.py +27 -27
  221. cartography/models/duo/token.py +16 -16
  222. cartography/models/duo/user.py +46 -44
  223. cartography/models/duo/web_authn_credential.py +27 -19
  224. cartography/models/entra/ou.py +48 -0
  225. cartography/models/entra/tenant.py +24 -18
  226. cartography/models/entra/user.py +64 -48
  227. cartography/models/gcp/iam.py +23 -23
  228. cartography/models/github/orgs.py +5 -4
  229. cartography/models/github/teams.py +37 -31
  230. cartography/models/github/users.py +34 -23
  231. cartography/models/kandji/device.py +22 -16
  232. cartography/models/kandji/tenant.py +6 -4
  233. cartography/models/lastpass/tenant.py +3 -3
  234. cartography/models/lastpass/user.py +32 -28
  235. cartography/models/semgrep/dependencies.py +36 -24
  236. cartography/models/semgrep/deployment.py +5 -5
  237. cartography/models/semgrep/findings.py +58 -42
  238. cartography/models/semgrep/locations.py +27 -21
  239. cartography/models/snipeit/asset.py +30 -21
  240. cartography/models/snipeit/tenant.py +6 -4
  241. cartography/models/snipeit/user.py +19 -12
  242. cartography/stats.py +3 -3
  243. cartography/sync.py +107 -31
  244. cartography/util.py +84 -62
  245. {cartography-0.102.0rc2.dist-info → cartography-0.103.0rc1.dist-info}/METADATA +3 -14
  246. cartography-0.103.0rc1.dist-info/RECORD +396 -0
  247. {cartography-0.102.0rc2.dist-info → cartography-0.103.0rc1.dist-info}/WHEEL +1 -1
  248. cartography-0.102.0rc2.dist-info/RECORD +0 -381
  249. {cartography-0.102.0rc2.dist-info → cartography-0.103.0rc1.dist-info}/entry_points.txt +0 -0
  250. {cartography-0.102.0rc2.dist-info → cartography-0.103.0rc1.dist-info}/licenses/LICENSE +0 -0
  251. {cartography-0.102.0rc2.dist-info → cartography-0.103.0rc1.dist-info}/top_level.txt +0 -0
@@ -55,7 +55,11 @@ def link_aws_resources(neo4j_session: neo4j.Session, update_tag: int) -> None:
55
55
 
56
56
 
57
57
  @timeit
58
- def load_a_records(neo4j_session: neo4j.Session, records: List[Dict], update_tag: int) -> None:
58
+ def load_a_records(
59
+ neo4j_session: neo4j.Session,
60
+ records: List[Dict],
61
+ update_tag: int,
62
+ ) -> None:
59
63
  ingest_records = """
60
64
  UNWIND $records as record
61
65
  MERGE (a:DNSRecord:AWSDNSRecord{id: record.id})
@@ -80,7 +84,11 @@ def load_a_records(neo4j_session: neo4j.Session, records: List[Dict], update_tag
80
84
 
81
85
 
82
86
  @timeit
83
- def load_alias_records(neo4j_session: neo4j.Session, records: List[Dict], update_tag: int) -> None:
87
+ def load_alias_records(
88
+ neo4j_session: neo4j.Session,
89
+ records: List[Dict],
90
+ update_tag: int,
91
+ ) -> None:
84
92
  # create the DNSRecord nodes and link them to matching DNSZone and S3Bucket nodes
85
93
  ingest_records = """
86
94
  UNWIND $records as record
@@ -106,7 +114,11 @@ def load_alias_records(neo4j_session: neo4j.Session, records: List[Dict], update
106
114
 
107
115
 
108
116
  @timeit
109
- def load_cname_records(neo4j_session: neo4j.Session, records: List[Dict], update_tag: int) -> None:
117
+ def load_cname_records(
118
+ neo4j_session: neo4j.Session,
119
+ records: List[Dict],
120
+ update_tag: int,
121
+ ) -> None:
110
122
  ingest_records = """
111
123
  UNWIND $records as record
112
124
  MERGE (a:DNSRecord:AWSDNSRecord{id: record.id})
@@ -131,7 +143,12 @@ def load_cname_records(neo4j_session: neo4j.Session, records: List[Dict], update
131
143
 
132
144
 
133
145
  @timeit
134
- def load_zone(neo4j_session: neo4j.Session, zone: Dict, current_aws_id: str, update_tag: int) -> None:
146
+ def load_zone(
147
+ neo4j_session: neo4j.Session,
148
+ zone: Dict,
149
+ current_aws_id: str,
150
+ update_tag: int,
151
+ ) -> None:
135
152
  ingest_z = """
136
153
  MERGE (zone:DNSZone:AWSDNSZone{zoneid:$ZoneId})
137
154
  ON CREATE SET
@@ -149,17 +166,22 @@ def load_zone(neo4j_session: neo4j.Session, zone: Dict, current_aws_id: str, upd
149
166
  """
150
167
  neo4j_session.run(
151
168
  ingest_z,
152
- ZoneName=zone['name'][:-1],
153
- ZoneId=zone['zoneid'],
154
- Comment=zone['comment'],
155
- PrivateZone=zone['privatezone'],
169
+ ZoneName=zone["name"][:-1],
170
+ ZoneId=zone["zoneid"],
171
+ Comment=zone["comment"],
172
+ PrivateZone=zone["privatezone"],
156
173
  AWS_ACCOUNT_ID=current_aws_id,
157
174
  update_tag=update_tag,
158
175
  )
159
176
 
160
177
 
161
178
  @timeit
162
- def load_ns_records(neo4j_session: neo4j.Session, records: List[Dict], zone_name: str, update_tag: int) -> None:
179
+ def load_ns_records(
180
+ neo4j_session: neo4j.Session,
181
+ records: List[Dict],
182
+ zone_name: str,
183
+ update_tag: int,
184
+ ) -> None:
163
185
  ingest_records = """
164
186
  UNWIND $records as record
165
187
  MERGE (a:DNSRecord:AWSDNSRecord{id: record.id})
@@ -233,58 +255,58 @@ def link_sub_zones(neo4j_session: neo4j.Session, update_tag: int) -> None:
233
255
  @timeit
234
256
  def transform_record_set(record_set: Dict, zone_id: str, name: str) -> Optional[Dict]:
235
257
  # process CNAME, ALIAS and A records
236
- if record_set['Type'] == 'CNAME':
237
- if 'AliasTarget' in record_set:
258
+ if record_set["Type"] == "CNAME":
259
+ if "AliasTarget" in record_set:
238
260
  # this is a weighted CNAME record
239
- value = record_set['AliasTarget']['DNSName']
240
- if value.endswith('.'):
261
+ value = record_set["AliasTarget"]["DNSName"]
262
+ if value.endswith("."):
241
263
  value = value[:-1]
242
264
  return {
243
265
  "name": name,
244
- "type": 'CNAME',
266
+ "type": "CNAME",
245
267
  "zoneid": zone_id,
246
268
  "value": value,
247
- "id": _create_dns_record_id(zone_id, name, 'WEIGHTED_CNAME'),
269
+ "id": _create_dns_record_id(zone_id, name, "WEIGHTED_CNAME"),
248
270
  }
249
271
  else:
250
272
  # This is a normal CNAME record
251
- value = record_set['ResourceRecords'][0]['Value']
252
- if value.endswith('.'):
273
+ value = record_set["ResourceRecords"][0]["Value"]
274
+ if value.endswith("."):
253
275
  value = value[:-1]
254
276
  return {
255
277
  "name": name,
256
- "type": 'CNAME',
278
+ "type": "CNAME",
257
279
  "zoneid": zone_id,
258
280
  "value": value,
259
- "id": _create_dns_record_id(zone_id, name, 'CNAME'),
281
+ "id": _create_dns_record_id(zone_id, name, "CNAME"),
260
282
  }
261
283
 
262
- elif record_set['Type'] == 'A':
263
- if 'AliasTarget' in record_set:
284
+ elif record_set["Type"] == "A":
285
+ if "AliasTarget" in record_set:
264
286
  # this is an ALIAS record
265
287
  # ALIAS records are a special AWS-only type of A record
266
288
  return {
267
289
  "name": name,
268
- "type": 'ALIAS',
290
+ "type": "ALIAS",
269
291
  "zoneid": zone_id,
270
- "value": record_set['AliasTarget']['DNSName'][:-1],
271
- "id": _create_dns_record_id(zone_id, name, 'ALIAS'),
292
+ "value": record_set["AliasTarget"]["DNSName"][:-1],
293
+ "id": _create_dns_record_id(zone_id, name, "ALIAS"),
272
294
  }
273
295
  else:
274
296
  # this is a real A record
275
297
  # loop and add each value (IP address) to a comma separated string
276
298
  # don't forget to trim that trailing comma!
277
299
  # TODO can this be replaced with a string join?
278
- value = ''
279
- for a_value in record_set['ResourceRecords']:
280
- value = value + a_value['Value'] + ','
300
+ value = ""
301
+ for a_value in record_set["ResourceRecords"]:
302
+ value = value + a_value["Value"] + ","
281
303
 
282
304
  return {
283
305
  "name": name,
284
- "type": 'A',
306
+ "type": "A",
285
307
  "zoneid": zone_id,
286
308
  "value": value[:-1],
287
- "id": _create_dns_record_id(zone_id, name, 'A'),
309
+ "id": _create_dns_record_id(zone_id, name, "A"),
288
310
  }
289
311
 
290
312
  else:
@@ -296,14 +318,17 @@ def transform_ns_record_set(record_set: Dict, zone_id: str) -> Optional[Dict]:
296
318
 
297
319
  if "ResourceRecords" in record_set:
298
320
  # Sometimes the value records have a trailing period, sometimes they dont.
299
- servers = [_normalize_dns_address(record["Value"]) for record in record_set["ResourceRecords"]]
321
+ servers = [
322
+ _normalize_dns_address(record["Value"])
323
+ for record in record_set["ResourceRecords"]
324
+ ]
300
325
  return {
301
326
  "zoneid": zone_id,
302
327
  "type": "NS",
303
328
  # looks like "name.some.fqdn.net.", so this removes the trailing comma.
304
329
  "name": _normalize_dns_address(record_set["Name"]),
305
330
  "servers": servers,
306
- "id": _create_dns_record_id(zone_id, record_set['Name'][:-1], 'NS'),
331
+ "id": _create_dns_record_id(zone_id, record_set["Name"][:-1], "NS"),
307
332
  }
308
333
  else:
309
334
  return None
@@ -312,23 +337,25 @@ def transform_ns_record_set(record_set: Dict, zone_id: str) -> Optional[Dict]:
312
337
  @timeit
313
338
  def transform_zone(zone: Dict) -> Dict:
314
339
  # TODO simplify this
315
- if 'Comment' in zone['Config']:
316
- comment = zone['Config']['Comment']
340
+ if "Comment" in zone["Config"]:
341
+ comment = zone["Config"]["Comment"]
317
342
  else:
318
- comment = ''
343
+ comment = ""
319
344
 
320
345
  return {
321
- "zoneid": zone['Id'],
322
- "name": zone['Name'],
323
- "privatezone": zone['Config']['PrivateZone'],
346
+ "zoneid": zone["Id"],
347
+ "name": zone["Name"],
348
+ "privatezone": zone["Config"]["PrivateZone"],
324
349
  "comment": comment,
325
- "count": zone['ResourceRecordSetCount'],
350
+ "count": zone["ResourceRecordSetCount"],
326
351
  }
327
352
 
328
353
 
329
354
  @timeit
330
355
  def load_dns_details(
331
- neo4j_session: neo4j.Session, dns_details: List[Tuple[Dict, List[Dict]]], current_aws_id: str,
356
+ neo4j_session: neo4j.Session,
357
+ dns_details: List[Tuple[Dict, List[Dict]]],
358
+ current_aws_id: str,
332
359
  update_tag: int,
333
360
  ) -> None:
334
361
  """
@@ -348,18 +375,22 @@ def load_dns_details(
348
375
  load_zone(neo4j_session, parsed_zone, current_aws_id, update_tag)
349
376
 
350
377
  for record_set in zone_record_sets:
351
- if record_set['Type'] == 'A' or record_set['Type'] == 'CNAME':
352
- record = transform_record_set(record_set, zone['Id'], record_set['Name'][:-1])
353
-
354
- if record['type'] == 'A':
378
+ if record_set["Type"] == "A" or record_set["Type"] == "CNAME":
379
+ record = transform_record_set(
380
+ record_set,
381
+ zone["Id"],
382
+ record_set["Name"][:-1],
383
+ )
384
+
385
+ if record["type"] == "A":
355
386
  zone_a_records.append(record)
356
- elif record['type'] == 'ALIAS':
387
+ elif record["type"] == "ALIAS":
357
388
  zone_alias_records.append(record)
358
- elif record['type'] == 'CNAME':
389
+ elif record["type"] == "CNAME":
359
390
  zone_cname_records.append(record)
360
391
 
361
- if record_set['Type'] == 'NS':
362
- record = transform_ns_record_set(record_set, zone['Id'])
392
+ if record_set["Type"] == "NS":
393
+ record = transform_ns_record_set(record_set, zone["Id"])
363
394
  zone_ns_records.append(record)
364
395
  if zone_a_records:
365
396
  load_a_records(neo4j_session, zone_a_records, update_tag)
@@ -370,30 +401,38 @@ def load_dns_details(
370
401
  if zone_cname_records:
371
402
  load_cname_records(neo4j_session, zone_cname_records, update_tag)
372
403
  if zone_ns_records:
373
- load_ns_records(neo4j_session, zone_ns_records, parsed_zone['name'][:-1], update_tag)
404
+ load_ns_records(
405
+ neo4j_session,
406
+ zone_ns_records,
407
+ parsed_zone["name"][:-1],
408
+ update_tag,
409
+ )
374
410
  link_aws_resources(neo4j_session, update_tag)
375
411
 
376
412
 
377
413
  @timeit
378
- def get_zone_record_sets(client: botocore.client.BaseClient, zone_id: str) -> List[Dict]:
414
+ def get_zone_record_sets(
415
+ client: botocore.client.BaseClient,
416
+ zone_id: str,
417
+ ) -> List[Dict]:
379
418
  resource_record_sets: List[Dict] = []
380
- paginator = client.get_paginator('list_resource_record_sets')
419
+ paginator = client.get_paginator("list_resource_record_sets")
381
420
  pages = paginator.paginate(HostedZoneId=zone_id)
382
421
  for page in pages:
383
- resource_record_sets.extend(page['ResourceRecordSets'])
422
+ resource_record_sets.extend(page["ResourceRecordSets"])
384
423
  return resource_record_sets
385
424
 
386
425
 
387
426
  @timeit
388
427
  def get_zones(client: botocore.client.BaseClient) -> List[Tuple[Dict, List[Dict]]]:
389
- paginator = client.get_paginator('list_hosted_zones')
428
+ paginator = client.get_paginator("list_hosted_zones")
390
429
  hosted_zones: List[Dict] = []
391
430
  for page in paginator.paginate():
392
- hosted_zones.extend(page['HostedZones'])
431
+ hosted_zones.extend(page["HostedZones"])
393
432
 
394
433
  results: List[Tuple[Dict, List[Dict]]] = []
395
434
  for hosted_zone in hosted_zones:
396
- record_sets = get_zone_record_sets(client, hosted_zone['Id'])
435
+ record_sets = get_zone_record_sets(client, hosted_zone["Id"])
397
436
  results.append((hosted_zone, record_sets))
398
437
  return results
399
438
 
@@ -403,25 +442,33 @@ def _create_dns_record_id(zoneid: str, name: str, record_type: str) -> str:
403
442
 
404
443
 
405
444
  def _normalize_dns_address(address: str) -> str:
406
- return address.rstrip('.')
445
+ return address.rstrip(".")
407
446
 
408
447
 
409
448
  @timeit
410
- def cleanup_route53(neo4j_session: neo4j.Session, current_aws_id: str, update_tag: int) -> None:
449
+ def cleanup_route53(
450
+ neo4j_session: neo4j.Session,
451
+ current_aws_id: str,
452
+ update_tag: int,
453
+ ) -> None:
411
454
  run_cleanup_job(
412
- 'aws_dns_cleanup.json',
455
+ "aws_dns_cleanup.json",
413
456
  neo4j_session,
414
- {'UPDATE_TAG': update_tag, 'AWS_ID': current_aws_id},
457
+ {"UPDATE_TAG": update_tag, "AWS_ID": current_aws_id},
415
458
  )
416
459
 
417
460
 
418
461
  @timeit
419
462
  def sync(
420
- neo4j_session: neo4j.Session, boto3_session: boto3.session.Session, regions: List[str], current_aws_account_id: str,
421
- update_tag: int, common_job_parameters: Dict,
463
+ neo4j_session: neo4j.Session,
464
+ boto3_session: boto3.session.Session,
465
+ regions: List[str],
466
+ current_aws_account_id: str,
467
+ update_tag: int,
468
+ common_job_parameters: Dict,
422
469
  ) -> None:
423
470
  logger.info("Syncing Route53 for account '%s'.", current_aws_account_id)
424
- client = boto3_session.client('route53')
471
+ client = boto3_session.client("route53")
425
472
  zones = get_zones(client)
426
473
  load_dns_details(neo4j_session, zones, current_aws_account_id, update_tag)
427
474
  link_sub_zones(neo4j_session, update_tag)