cartography 0.104.0rc2__py3-none-any.whl → 0.123.0__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.
Files changed (642) hide show
  1. cartography/_version.py +16 -3
  2. cartography/cli.py +466 -5
  3. cartography/client/aws/__init__.py +19 -0
  4. cartography/client/aws/ecr.py +51 -0
  5. cartography/client/core/tx.py +357 -8
  6. cartography/config.py +153 -0
  7. cartography/data/azure_permission_relationships.yaml +20 -0
  8. cartography/data/gcp_permission_relationships.yaml +21 -0
  9. cartography/data/indexes.cypher +0 -186
  10. cartography/data/jobs/analysis/aws_ec2_keypair_analysis.json +2 -2
  11. cartography/data/jobs/analysis/keycloak_inheritance.json +30 -0
  12. cartography/data/jobs/cleanup/gcp_compute_vpc_cleanup.json +0 -12
  13. cartography/data/jobs/cleanup/github_repos_cleanup.json +2 -0
  14. cartography/driftdetect/cli.py +3 -2
  15. cartography/graph/cleanupbuilder.py +198 -41
  16. cartography/graph/job.py +54 -6
  17. cartography/graph/querybuilder.py +528 -27
  18. cartography/graph/statement.py +5 -1
  19. cartography/intel/airbyte/__init__.py +105 -0
  20. cartography/intel/airbyte/connections.py +120 -0
  21. cartography/intel/airbyte/destinations.py +81 -0
  22. cartography/intel/airbyte/organizations.py +59 -0
  23. cartography/intel/airbyte/sources.py +78 -0
  24. cartography/intel/airbyte/tags.py +64 -0
  25. cartography/intel/airbyte/users.py +106 -0
  26. cartography/intel/airbyte/util.py +122 -0
  27. cartography/intel/airbyte/workspaces.py +63 -0
  28. cartography/intel/aws/__init__.py +24 -9
  29. cartography/intel/aws/acm.py +124 -0
  30. cartography/intel/aws/apigateway.py +253 -22
  31. cartography/intel/aws/apigatewayv2.py +116 -0
  32. cartography/intel/aws/cloudtrail.py +17 -39
  33. cartography/intel/aws/cloudtrail_management_events.py +962 -0
  34. cartography/intel/aws/cloudwatch.py +150 -4
  35. cartography/intel/aws/codebuild.py +132 -0
  36. cartography/intel/aws/cognito.py +201 -0
  37. cartography/intel/aws/config.py +7 -3
  38. cartography/intel/aws/ec2/elastic_ip_addresses.py +3 -1
  39. cartography/intel/aws/ec2/instances.py +25 -1
  40. cartography/intel/aws/ec2/internet_gateways.py +4 -2
  41. cartography/intel/aws/ec2/load_balancer_v2s.py +11 -5
  42. cartography/intel/aws/ec2/network_interfaces.py +5 -1
  43. cartography/intel/aws/ec2/reserved_instances.py +3 -1
  44. cartography/intel/aws/ec2/security_groups.py +140 -122
  45. cartography/intel/aws/ec2/snapshots.py +47 -84
  46. cartography/intel/aws/ec2/subnets.py +37 -63
  47. cartography/intel/aws/ec2/tgw.py +11 -5
  48. cartography/intel/aws/ec2/volumes.py +1 -1
  49. cartography/intel/aws/ec2/vpc.py +140 -124
  50. cartography/intel/aws/ec2/vpc_peerings.py +262 -125
  51. cartography/intel/aws/ecr.py +269 -98
  52. cartography/intel/aws/ecr_image_layers.py +923 -0
  53. cartography/intel/aws/ecs.py +251 -380
  54. cartography/intel/aws/efs.py +179 -11
  55. cartography/intel/aws/elasticache.py +102 -79
  56. cartography/intel/aws/elasticsearch.py +13 -4
  57. cartography/intel/aws/eventbridge.py +164 -0
  58. cartography/intel/aws/glue.py +181 -0
  59. cartography/intel/aws/guardduty.py +443 -0
  60. cartography/intel/aws/iam.py +750 -493
  61. cartography/intel/aws/identitycenter.py +605 -83
  62. cartography/intel/aws/inspector.py +221 -105
  63. cartography/intel/aws/kms.py +173 -201
  64. cartography/intel/aws/lambda_function.py +272 -189
  65. cartography/intel/aws/organizations.py +10 -9
  66. cartography/intel/aws/permission_relationships.py +10 -20
  67. cartography/intel/aws/rds.py +337 -446
  68. cartography/intel/aws/redshift.py +9 -4
  69. cartography/intel/aws/resourcegroupstaggingapi.py +78 -19
  70. cartography/intel/aws/resources.py +18 -0
  71. cartography/intel/aws/route53.py +386 -332
  72. cartography/intel/aws/s3.py +322 -14
  73. cartography/intel/aws/secretsmanager.py +81 -49
  74. cartography/intel/aws/securityhub.py +3 -1
  75. cartography/intel/aws/sns.py +62 -2
  76. cartography/intel/aws/sqs.py +36 -90
  77. cartography/intel/aws/ssm.py +3 -5
  78. cartography/intel/azure/__init__.py +202 -48
  79. cartography/intel/azure/aks.py +175 -0
  80. cartography/intel/azure/app_service.py +105 -0
  81. cartography/intel/azure/compute.py +59 -112
  82. cartography/intel/azure/container_instances.py +95 -0
  83. cartography/intel/azure/cosmosdb.py +222 -361
  84. cartography/intel/azure/data_factory.py +85 -0
  85. cartography/intel/azure/data_factory_dataset.py +128 -0
  86. cartography/intel/azure/data_factory_linked_service.py +119 -0
  87. cartography/intel/azure/data_factory_pipeline.py +142 -0
  88. cartography/intel/azure/data_lake.py +124 -0
  89. cartography/intel/azure/event_grid.py +94 -0
  90. cartography/intel/azure/functions.py +124 -0
  91. cartography/intel/azure/load_balancers.py +263 -0
  92. cartography/intel/azure/logic_apps.py +101 -0
  93. cartography/intel/azure/monitor.py +105 -0
  94. cartography/intel/azure/network.py +467 -0
  95. cartography/intel/azure/permission_relationships.py +466 -0
  96. cartography/intel/azure/rbac.py +309 -0
  97. cartography/intel/azure/resource_groups.py +82 -0
  98. cartography/intel/azure/security_center.py +106 -0
  99. cartography/intel/azure/sql.py +145 -292
  100. cartography/intel/azure/storage.py +185 -262
  101. cartography/intel/azure/subscription.py +21 -43
  102. cartography/intel/azure/tenant.py +39 -30
  103. cartography/intel/azure/util/common.py +13 -0
  104. cartography/intel/azure/util/credentials.py +49 -174
  105. cartography/intel/azure/util/tag.py +41 -0
  106. cartography/intel/create_indexes.py +2 -1
  107. cartography/intel/crowdstrike/spotlight.py +5 -2
  108. cartography/intel/dns.py +5 -2
  109. cartography/intel/entra/__init__.py +100 -1
  110. cartography/intel/entra/app_role_assignments.py +284 -0
  111. cartography/intel/entra/applications.py +182 -0
  112. cartography/intel/entra/federation/__init__.py +0 -0
  113. cartography/intel/entra/federation/aws_identity_center.py +77 -0
  114. cartography/intel/entra/groups.py +198 -0
  115. cartography/intel/entra/ou.py +48 -24
  116. cartography/intel/entra/service_principals.py +217 -0
  117. cartography/intel/entra/users.py +105 -57
  118. cartography/intel/gcp/__init__.py +334 -396
  119. cartography/intel/gcp/bigtable_app_profile.py +101 -0
  120. cartography/intel/gcp/bigtable_backup.py +91 -0
  121. cartography/intel/gcp/bigtable_cluster.py +93 -0
  122. cartography/intel/gcp/bigtable_instance.py +86 -0
  123. cartography/intel/gcp/bigtable_table.py +87 -0
  124. cartography/intel/gcp/cai.py +292 -0
  125. cartography/intel/gcp/clients.py +112 -0
  126. cartography/intel/gcp/compute.py +128 -119
  127. cartography/intel/gcp/crm/__init__.py +0 -0
  128. cartography/intel/gcp/crm/folders.py +114 -0
  129. cartography/intel/gcp/crm/orgs.py +70 -0
  130. cartography/intel/gcp/crm/projects.py +120 -0
  131. cartography/intel/gcp/dns.py +83 -169
  132. cartography/intel/gcp/gke.py +72 -113
  133. cartography/intel/gcp/iam.py +111 -91
  134. cartography/intel/gcp/permission_relationships.py +394 -0
  135. cartography/intel/gcp/policy_bindings.py +225 -0
  136. cartography/intel/gcp/storage.py +75 -159
  137. cartography/intel/github/__init__.py +62 -25
  138. cartography/intel/github/commits.py +423 -0
  139. cartography/intel/github/repos.py +463 -85
  140. cartography/intel/github/teams.py +3 -3
  141. cartography/intel/github/users.py +5 -0
  142. cartography/intel/github/util.py +12 -0
  143. cartography/intel/googleworkspace/__init__.py +193 -0
  144. cartography/intel/googleworkspace/devices.py +254 -0
  145. cartography/intel/googleworkspace/groups.py +568 -0
  146. cartography/intel/googleworkspace/oauth_apps.py +259 -0
  147. cartography/intel/googleworkspace/tenant.py +85 -0
  148. cartography/intel/googleworkspace/users.py +138 -0
  149. cartography/intel/gsuite/__init__.py +17 -9
  150. cartography/intel/gsuite/groups.py +291 -0
  151. cartography/intel/gsuite/users.py +142 -0
  152. cartography/intel/jamf/computers.py +7 -1
  153. cartography/intel/keycloak/__init__.py +153 -0
  154. cartography/intel/keycloak/authenticationexecutions.py +322 -0
  155. cartography/intel/keycloak/authenticationflows.py +77 -0
  156. cartography/intel/keycloak/clients.py +187 -0
  157. cartography/intel/keycloak/groups.py +126 -0
  158. cartography/intel/keycloak/identityproviders.py +94 -0
  159. cartography/intel/keycloak/organizations.py +163 -0
  160. cartography/intel/keycloak/realms.py +61 -0
  161. cartography/intel/keycloak/roles.py +202 -0
  162. cartography/intel/keycloak/scopes.py +73 -0
  163. cartography/intel/keycloak/users.py +70 -0
  164. cartography/intel/keycloak/util.py +47 -0
  165. cartography/intel/kubernetes/__init__.py +60 -14
  166. cartography/intel/kubernetes/clusters.py +86 -0
  167. cartography/intel/kubernetes/eks.py +402 -0
  168. cartography/intel/kubernetes/namespaces.py +59 -57
  169. cartography/intel/kubernetes/pods.py +168 -75
  170. cartography/intel/kubernetes/rbac.py +597 -0
  171. cartography/intel/kubernetes/secrets.py +95 -45
  172. cartography/intel/kubernetes/services.py +131 -67
  173. cartography/intel/kubernetes/util.py +142 -14
  174. cartography/intel/oci/iam.py +23 -9
  175. cartography/intel/oci/organizations.py +3 -1
  176. cartography/intel/oci/utils.py +28 -5
  177. cartography/intel/okta/applications.py +15 -5
  178. cartography/intel/okta/awssaml.py +14 -10
  179. cartography/intel/okta/factors.py +3 -1
  180. cartography/intel/okta/groups.py +5 -2
  181. cartography/intel/okta/organization.py +3 -1
  182. cartography/intel/okta/origins.py +3 -1
  183. cartography/intel/okta/roles.py +5 -2
  184. cartography/intel/okta/users.py +10 -2
  185. cartography/intel/ontology/__init__.py +44 -0
  186. cartography/intel/ontology/devices.py +54 -0
  187. cartography/intel/ontology/users.py +54 -0
  188. cartography/intel/ontology/utils.py +176 -0
  189. cartography/intel/pagerduty/escalation_policies.py +13 -6
  190. cartography/intel/pagerduty/schedules.py +9 -4
  191. cartography/intel/pagerduty/services.py +7 -3
  192. cartography/intel/pagerduty/teams.py +5 -2
  193. cartography/intel/pagerduty/users.py +3 -1
  194. cartography/intel/pagerduty/vendors.py +3 -1
  195. cartography/intel/scaleway/__init__.py +127 -0
  196. cartography/intel/scaleway/iam/__init__.py +0 -0
  197. cartography/intel/scaleway/iam/apikeys.py +71 -0
  198. cartography/intel/scaleway/iam/applications.py +71 -0
  199. cartography/intel/scaleway/iam/groups.py +71 -0
  200. cartography/intel/scaleway/iam/users.py +71 -0
  201. cartography/intel/scaleway/instances/__init__.py +0 -0
  202. cartography/intel/scaleway/instances/flexibleips.py +86 -0
  203. cartography/intel/scaleway/instances/instances.py +92 -0
  204. cartography/intel/scaleway/projects.py +79 -0
  205. cartography/intel/scaleway/storage/__init__.py +0 -0
  206. cartography/intel/scaleway/storage/snapshots.py +86 -0
  207. cartography/intel/scaleway/storage/volumes.py +84 -0
  208. cartography/intel/scaleway/utils.py +37 -0
  209. cartography/intel/sentinelone/__init__.py +75 -0
  210. cartography/intel/sentinelone/account.py +140 -0
  211. cartography/intel/sentinelone/agent.py +139 -0
  212. cartography/intel/sentinelone/api.py +124 -0
  213. cartography/intel/sentinelone/application.py +248 -0
  214. cartography/intel/sentinelone/cve.py +119 -0
  215. cartography/intel/sentinelone/utils.py +28 -0
  216. cartography/intel/slack/__init__.py +78 -0
  217. cartography/intel/slack/channels.py +80 -0
  218. cartography/intel/slack/groups.py +90 -0
  219. cartography/intel/slack/teams.py +65 -0
  220. cartography/intel/slack/users.py +57 -0
  221. cartography/intel/slack/utils.py +29 -0
  222. cartography/intel/spacelift/__init__.py +161 -0
  223. cartography/intel/spacelift/account.py +73 -0
  224. cartography/intel/spacelift/ec2_ownership.py +280 -0
  225. cartography/intel/spacelift/runs.py +463 -0
  226. cartography/intel/spacelift/spaces.py +112 -0
  227. cartography/intel/spacelift/stacks.py +119 -0
  228. cartography/intel/spacelift/util.py +122 -0
  229. cartography/intel/spacelift/workerpools.py +131 -0
  230. cartography/intel/spacelift/workers.py +128 -0
  231. cartography/intel/trivy/__init__.py +272 -0
  232. cartography/intel/trivy/scanner.py +386 -0
  233. cartography/models/airbyte/__init__.py +0 -0
  234. cartography/models/airbyte/connection.py +138 -0
  235. cartography/models/airbyte/destination.py +75 -0
  236. cartography/models/airbyte/organization.py +19 -0
  237. cartography/models/airbyte/source.py +75 -0
  238. cartography/models/airbyte/stream.py +74 -0
  239. cartography/models/airbyte/tag.py +69 -0
  240. cartography/models/airbyte/user.py +115 -0
  241. cartography/models/airbyte/workspace.py +46 -0
  242. cartography/models/anthropic/apikey.py +4 -0
  243. cartography/models/anthropic/user.py +4 -0
  244. cartography/models/aws/acm/__init__.py +0 -0
  245. cartography/models/aws/acm/certificate.py +75 -0
  246. cartography/models/aws/apigateway/__init__.py +0 -0
  247. cartography/models/aws/apigateway/apigatewaydeployment.py +74 -0
  248. cartography/models/aws/apigateway/apigatewayintegration.py +79 -0
  249. cartography/models/aws/apigateway/apigatewaymethod.py +74 -0
  250. cartography/models/aws/apigatewayv2/__init__.py +0 -0
  251. cartography/models/aws/apigatewayv2/apigatewayv2.py +53 -0
  252. cartography/models/aws/cloudtrail/management_events.py +153 -0
  253. cartography/models/aws/cloudtrail/trail.py +45 -0
  254. cartography/models/aws/cloudwatch/log_metric_filter.py +79 -0
  255. cartography/models/aws/cloudwatch/metric_alarm.py +53 -0
  256. cartography/models/aws/codebuild/__init__.py +0 -0
  257. cartography/models/aws/codebuild/project.py +49 -0
  258. cartography/models/aws/cognito/__init__.py +0 -0
  259. cartography/models/aws/cognito/identity_pool.py +70 -0
  260. cartography/models/aws/cognito/user_pool.py +47 -0
  261. cartography/models/aws/dynamodb/tables.py +2 -0
  262. cartography/models/aws/ec2/instances.py +25 -1
  263. cartography/models/aws/ec2/networkinterfaces.py +4 -0
  264. cartography/models/aws/ec2/security_group_rules.py +109 -0
  265. cartography/models/aws/ec2/security_groups.py +90 -0
  266. cartography/models/aws/ec2/snapshots.py +58 -0
  267. cartography/models/aws/ec2/subnet_instance.py +2 -0
  268. cartography/models/aws/ec2/subnet_networkinterface.py +2 -0
  269. cartography/models/aws/ec2/subnets.py +65 -0
  270. cartography/models/aws/ec2/volumes.py +20 -0
  271. cartography/models/aws/ec2/vpc.py +46 -0
  272. cartography/models/aws/ec2/vpc_cidr.py +102 -0
  273. cartography/models/aws/ec2/vpc_peering.py +157 -0
  274. cartography/models/aws/ecr/__init__.py +0 -0
  275. cartography/models/aws/ecr/image.py +146 -0
  276. cartography/models/aws/ecr/image_layer.py +107 -0
  277. cartography/models/aws/ecr/repository.py +72 -0
  278. cartography/models/aws/ecr/repository_image.py +95 -0
  279. cartography/models/aws/ecs/__init__.py +0 -0
  280. cartography/models/aws/ecs/clusters.py +64 -0
  281. cartography/models/aws/ecs/container_definitions.py +93 -0
  282. cartography/models/aws/ecs/container_instances.py +84 -0
  283. cartography/models/aws/ecs/containers.py +101 -0
  284. cartography/models/aws/ecs/services.py +134 -0
  285. cartography/models/aws/ecs/task_definitions.py +135 -0
  286. cartography/models/aws/ecs/tasks.py +134 -0
  287. cartography/models/aws/efs/access_point.py +77 -0
  288. cartography/models/aws/efs/file_system.py +60 -0
  289. cartography/models/aws/efs/mount_target.py +29 -2
  290. cartography/models/aws/elasticache/__init__.py +0 -0
  291. cartography/models/aws/elasticache/cluster.py +65 -0
  292. cartography/models/aws/elasticache/topic.py +67 -0
  293. cartography/models/aws/eventbridge/__init__.py +0 -0
  294. cartography/models/aws/eventbridge/rule.py +77 -0
  295. cartography/models/aws/eventbridge/target.py +71 -0
  296. cartography/models/aws/glue/__init__.py +0 -0
  297. cartography/models/aws/glue/connection.py +51 -0
  298. cartography/models/aws/glue/job.py +69 -0
  299. cartography/models/aws/guardduty/__init__.py +1 -0
  300. cartography/models/aws/guardduty/detectors.py +50 -0
  301. cartography/models/aws/guardduty/findings.py +121 -0
  302. cartography/models/aws/iam/access_key.py +103 -0
  303. cartography/models/aws/iam/account_role.py +24 -0
  304. cartography/models/aws/iam/federated_principal.py +60 -0
  305. cartography/models/aws/iam/group.py +60 -0
  306. cartography/models/aws/iam/group_membership.py +27 -0
  307. cartography/models/aws/iam/inline_policy.py +78 -0
  308. cartography/models/aws/iam/managed_policy.py +51 -0
  309. cartography/models/aws/iam/policy_statement.py +57 -0
  310. cartography/models/aws/iam/role.py +83 -0
  311. cartography/models/aws/iam/root_principal.py +52 -0
  312. cartography/models/aws/iam/service_principal.py +30 -0
  313. cartography/models/aws/iam/sts_assumerole_allow.py +38 -0
  314. cartography/models/aws/iam/user.py +59 -0
  315. cartography/models/aws/identitycenter/awsidentitycenter.py +1 -0
  316. cartography/models/aws/identitycenter/awspermissionset.py +70 -0
  317. cartography/models/aws/identitycenter/awssogroup.py +70 -0
  318. cartography/models/aws/identitycenter/awsssouser.py +49 -9
  319. cartography/models/aws/inspector/findings.py +37 -0
  320. cartography/models/aws/inspector/packages.py +1 -31
  321. cartography/models/aws/kms/__init__.py +0 -0
  322. cartography/models/aws/kms/aliases.py +86 -0
  323. cartography/models/aws/kms/grants.py +65 -0
  324. cartography/models/aws/kms/keys.py +88 -0
  325. cartography/models/aws/lambda_function/__init__.py +0 -0
  326. cartography/models/aws/lambda_function/alias.py +74 -0
  327. cartography/models/aws/lambda_function/event_source_mapping.py +88 -0
  328. cartography/models/aws/lambda_function/lambda_function.py +91 -0
  329. cartography/models/aws/lambda_function/layer.py +72 -0
  330. cartography/models/aws/rds/__init__.py +0 -0
  331. cartography/models/aws/rds/cluster.py +91 -0
  332. cartography/models/aws/rds/event_subscription.py +146 -0
  333. cartography/models/aws/rds/instance.py +156 -0
  334. cartography/models/aws/rds/snapshot.py +108 -0
  335. cartography/models/aws/rds/subnet_group.py +101 -0
  336. cartography/models/aws/route53/__init__.py +0 -0
  337. cartography/models/aws/route53/dnsrecord.py +235 -0
  338. cartography/models/aws/route53/nameserver.py +63 -0
  339. cartography/models/aws/route53/subzone.py +40 -0
  340. cartography/models/aws/route53/zone.py +47 -0
  341. cartography/models/aws/s3/notification.py +24 -0
  342. cartography/models/aws/secretsmanager/secret.py +106 -0
  343. cartography/models/aws/secretsmanager/secret_version.py +0 -2
  344. cartography/models/aws/sns/topic_subscription.py +74 -0
  345. cartography/models/aws/sqs/__init__.py +0 -0
  346. cartography/models/aws/sqs/queue.py +89 -0
  347. cartography/models/azure/__init__.py +0 -0
  348. cartography/models/azure/aks_cluster.py +54 -0
  349. cartography/models/azure/aks_nodepool.py +54 -0
  350. cartography/models/azure/app_service.py +59 -0
  351. cartography/models/azure/container_instance.py +57 -0
  352. cartography/models/azure/cosmosdb/__init__.py +0 -0
  353. cartography/models/azure/cosmosdb/account.py +77 -0
  354. cartography/models/azure/cosmosdb/accountfailoverpolicy.py +77 -0
  355. cartography/models/azure/cosmosdb/cassandrakeyspace.py +82 -0
  356. cartography/models/azure/cosmosdb/cassandratable.py +81 -0
  357. cartography/models/azure/cosmosdb/corspolicy.py +74 -0
  358. cartography/models/azure/cosmosdb/dblocation.py +120 -0
  359. cartography/models/azure/cosmosdb/mongodbcollection.py +82 -0
  360. cartography/models/azure/cosmosdb/mongodbdatabase.py +78 -0
  361. cartography/models/azure/cosmosdb/privateendpointconnection.py +81 -0
  362. cartography/models/azure/cosmosdb/sqlcontainer.py +88 -0
  363. cartography/models/azure/cosmosdb/sqldatabase.py +78 -0
  364. cartography/models/azure/cosmosdb/tableresource.py +76 -0
  365. cartography/models/azure/cosmosdb/virtualnetworkrule.py +78 -0
  366. cartography/models/azure/data_factory/__init__.py +0 -0
  367. cartography/models/azure/data_factory/data_factory.py +51 -0
  368. cartography/models/azure/data_factory/data_factory_dataset.py +94 -0
  369. cartography/models/azure/data_factory/data_factory_linked_service.py +78 -0
  370. cartography/models/azure/data_factory/data_factory_pipeline.py +93 -0
  371. cartography/models/azure/data_lake_filesystem.py +51 -0
  372. cartography/models/azure/event_grid_topic.py +57 -0
  373. cartography/models/azure/function_app.py +59 -0
  374. cartography/models/azure/load_balancer/__init__.py +0 -0
  375. cartography/models/azure/load_balancer/load_balancer.py +49 -0
  376. cartography/models/azure/load_balancer/load_balancer_backend_pool.py +73 -0
  377. cartography/models/azure/load_balancer/load_balancer_frontend_ip.py +75 -0
  378. cartography/models/azure/load_balancer/load_balancer_inbound_nat_rule.py +78 -0
  379. cartography/models/azure/load_balancer/load_balancer_rule.py +108 -0
  380. cartography/models/azure/logic_apps.py +56 -0
  381. cartography/models/azure/monitor.py +54 -0
  382. cartography/models/azure/network_interface.py +112 -0
  383. cartography/models/azure/network_security_group.py +50 -0
  384. cartography/models/azure/permission_relationships.py +60 -0
  385. cartography/models/azure/principal.py +41 -0
  386. cartography/models/azure/public_ip_address.py +50 -0
  387. cartography/models/azure/rbac.py +268 -0
  388. cartography/models/azure/resource_groups.py +52 -0
  389. cartography/models/azure/security_center.py +50 -0
  390. cartography/models/azure/sql/__init__.py +0 -0
  391. cartography/models/azure/sql/databasethreatdetectionpolicy.py +85 -0
  392. cartography/models/azure/sql/elasticpool.py +77 -0
  393. cartography/models/azure/sql/failovergroup.py +73 -0
  394. cartography/models/azure/sql/recoverabledatabase.py +75 -0
  395. cartography/models/azure/sql/replicationlink.py +81 -0
  396. cartography/models/azure/sql/restorabledroppeddatabase.py +82 -0
  397. cartography/models/azure/sql/restorepoint.py +74 -0
  398. cartography/models/azure/sql/serveradadministrator.py +74 -0
  399. cartography/models/azure/sql/serverdnsalias.py +71 -0
  400. cartography/models/azure/sql/sqldatabase.py +85 -0
  401. cartography/models/azure/sql/sqlserver.py +50 -0
  402. cartography/models/azure/sql/transparentdataencryption.py +76 -0
  403. cartography/models/azure/storage/__init__.py +0 -0
  404. cartography/models/azure/storage/account.py +59 -0
  405. cartography/models/azure/storage/blobcontainer.py +85 -0
  406. cartography/models/azure/storage/blobservice.py +71 -0
  407. cartography/models/azure/storage/fileservice.py +71 -0
  408. cartography/models/azure/storage/fileshare.py +82 -0
  409. cartography/models/azure/storage/queue.py +71 -0
  410. cartography/models/azure/storage/queueservice.py +73 -0
  411. cartography/models/azure/storage/table.py +72 -0
  412. cartography/models/azure/storage/tableservice.py +73 -0
  413. cartography/models/azure/subnet.py +101 -0
  414. cartography/models/azure/subscription.py +47 -0
  415. cartography/models/azure/tags/__init__.py +0 -0
  416. cartography/models/azure/tags/storage_tag.py +40 -0
  417. cartography/models/azure/tags/tag.py +37 -0
  418. cartography/models/azure/tenant.py +17 -0
  419. cartography/models/azure/virtual_network.py +49 -0
  420. cartography/models/azure/vm/__init__.py +0 -0
  421. cartography/models/azure/vm/datadisk.py +80 -0
  422. cartography/models/azure/vm/disk.py +55 -0
  423. cartography/models/azure/vm/snapshot.py +56 -0
  424. cartography/models/azure/vm/virtualmachine.py +59 -0
  425. cartography/models/bigfix/bigfix_computer.py +1 -1
  426. cartography/models/cloudflare/member.py +4 -0
  427. cartography/models/core/common.py +1 -0
  428. cartography/models/core/nodes.py +15 -2
  429. cartography/models/core/relationships.py +44 -0
  430. cartography/models/crowdstrike/hosts.py +1 -1
  431. cartography/models/digitalocean/droplet.py +2 -0
  432. cartography/models/duo/endpoint.py +1 -1
  433. cartography/models/duo/phone.py +2 -2
  434. cartography/models/duo/user.py +4 -0
  435. cartography/models/entra/app_role_assignment.py +115 -0
  436. cartography/models/entra/application.py +49 -0
  437. cartography/models/entra/entra_user_to_aws_sso.py +41 -0
  438. cartography/models/entra/group.py +117 -0
  439. cartography/models/entra/service_principal.py +104 -0
  440. cartography/models/entra/user.py +42 -51
  441. cartography/models/gcp/__init__.py +0 -0
  442. cartography/models/gcp/bigtable/__init__.py +0 -0
  443. cartography/models/gcp/bigtable/app_profile.py +94 -0
  444. cartography/models/gcp/bigtable/backup.py +91 -0
  445. cartography/models/gcp/bigtable/cluster.py +73 -0
  446. cartography/models/gcp/bigtable/instance.py +52 -0
  447. cartography/models/gcp/bigtable/table.py +69 -0
  448. cartography/models/gcp/compute/__init__.py +0 -0
  449. cartography/models/gcp/compute/subnet.py +74 -0
  450. cartography/models/gcp/compute/vpc.py +50 -0
  451. cartography/models/gcp/crm/__init__.py +0 -0
  452. cartography/models/gcp/crm/folders.py +98 -0
  453. cartography/models/gcp/crm/organizations.py +21 -0
  454. cartography/models/gcp/crm/projects.py +100 -0
  455. cartography/models/gcp/dns.py +109 -0
  456. cartography/models/gcp/gke.py +69 -0
  457. cartography/models/gcp/iam.py +3 -0
  458. cartography/models/gcp/permission_relationships.py +61 -0
  459. cartography/models/gcp/policy_bindings.py +93 -0
  460. cartography/models/gcp/storage/__init__.py +0 -0
  461. cartography/models/gcp/storage/bucket.py +119 -0
  462. cartography/models/github/commits.py +63 -0
  463. cartography/models/github/dependencies.py +73 -0
  464. cartography/models/github/manifests.py +49 -0
  465. cartography/models/github/users.py +10 -0
  466. cartography/models/googleworkspace/__init__.py +0 -0
  467. cartography/models/googleworkspace/device.py +132 -0
  468. cartography/models/googleworkspace/group.py +382 -0
  469. cartography/models/googleworkspace/oauth_app.py +124 -0
  470. cartography/models/googleworkspace/tenant.py +30 -0
  471. cartography/models/googleworkspace/user.py +113 -0
  472. cartography/models/gsuite/__init__.py +0 -0
  473. cartography/models/gsuite/group.py +218 -0
  474. cartography/models/gsuite/tenant.py +29 -0
  475. cartography/models/gsuite/user.py +107 -0
  476. cartography/models/kandji/device.py +1 -2
  477. cartography/models/keycloak/__init__.py +0 -0
  478. cartography/models/keycloak/authenticationexecution.py +160 -0
  479. cartography/models/keycloak/authenticationflow.py +54 -0
  480. cartography/models/keycloak/client.py +179 -0
  481. cartography/models/keycloak/group.py +101 -0
  482. cartography/models/keycloak/identityprovider.py +89 -0
  483. cartography/models/keycloak/organization.py +116 -0
  484. cartography/models/keycloak/organizationdomain.py +73 -0
  485. cartography/models/keycloak/realm.py +173 -0
  486. cartography/models/keycloak/role.py +126 -0
  487. cartography/models/keycloak/scope.py +73 -0
  488. cartography/models/keycloak/user.py +55 -0
  489. cartography/models/kubernetes/__init__.py +0 -0
  490. cartography/models/kubernetes/clusterrolebindings.py +138 -0
  491. cartography/models/kubernetes/clusterroles.py +52 -0
  492. cartography/models/kubernetes/clusters.py +26 -0
  493. cartography/models/kubernetes/containers.py +133 -0
  494. cartography/models/kubernetes/groups.py +107 -0
  495. cartography/models/kubernetes/namespaces.py +51 -0
  496. cartography/models/kubernetes/oidc.py +51 -0
  497. cartography/models/kubernetes/pods.py +80 -0
  498. cartography/models/kubernetes/rolebindings.py +159 -0
  499. cartography/models/kubernetes/roles.py +76 -0
  500. cartography/models/kubernetes/secrets.py +79 -0
  501. cartography/models/kubernetes/serviceaccounts.py +77 -0
  502. cartography/models/kubernetes/services.py +108 -0
  503. cartography/models/kubernetes/users.py +105 -0
  504. cartography/models/lastpass/user.py +4 -0
  505. cartography/models/ontology/__init__.py +0 -0
  506. cartography/models/ontology/device.py +137 -0
  507. cartography/models/ontology/mapping/__init__.py +76 -0
  508. cartography/models/ontology/mapping/data/__init__.py +0 -0
  509. cartography/models/ontology/mapping/data/apikeys.py +93 -0
  510. cartography/models/ontology/mapping/data/computeinstance.py +95 -0
  511. cartography/models/ontology/mapping/data/containers.py +88 -0
  512. cartography/models/ontology/mapping/data/databases.py +182 -0
  513. cartography/models/ontology/mapping/data/devices.py +194 -0
  514. cartography/models/ontology/mapping/data/thirdpartyapps.py +140 -0
  515. cartography/models/ontology/mapping/data/useraccounts.py +416 -0
  516. cartography/models/ontology/mapping/data/users.py +63 -0
  517. cartography/models/ontology/mapping/specs.py +85 -0
  518. cartography/models/ontology/user.py +51 -0
  519. cartography/models/openai/adminapikey.py +4 -0
  520. cartography/models/openai/apikey.py +4 -0
  521. cartography/models/openai/user.py +4 -0
  522. cartography/models/scaleway/__init__.py +0 -0
  523. cartography/models/scaleway/iam/__init__.py +0 -0
  524. cartography/models/scaleway/iam/apikey.py +100 -0
  525. cartography/models/scaleway/iam/application.py +52 -0
  526. cartography/models/scaleway/iam/group.py +95 -0
  527. cartography/models/scaleway/iam/user.py +64 -0
  528. cartography/models/scaleway/instance/__init__.py +0 -0
  529. cartography/models/scaleway/instance/flexibleip.py +52 -0
  530. cartography/models/scaleway/instance/instance.py +120 -0
  531. cartography/models/scaleway/organization.py +19 -0
  532. cartography/models/scaleway/project.py +48 -0
  533. cartography/models/scaleway/storage/__init__.py +0 -0
  534. cartography/models/scaleway/storage/snapshot.py +78 -0
  535. cartography/models/scaleway/storage/volume.py +51 -0
  536. cartography/models/sentinelone/__init__.py +1 -0
  537. cartography/models/sentinelone/account.py +40 -0
  538. cartography/models/sentinelone/agent.py +50 -0
  539. cartography/models/sentinelone/application.py +44 -0
  540. cartography/models/sentinelone/application_version.py +96 -0
  541. cartography/models/sentinelone/cve.py +73 -0
  542. cartography/models/slack/__init__.py +0 -0
  543. cartography/models/slack/channels.py +92 -0
  544. cartography/models/slack/group.py +129 -0
  545. cartography/models/slack/team.py +22 -0
  546. cartography/models/slack/user.py +62 -0
  547. cartography/models/snipeit/asset.py +2 -0
  548. cartography/models/snipeit/user.py +4 -0
  549. cartography/models/spacelift/__init__.py +0 -0
  550. cartography/models/spacelift/cloudtrailevent.py +120 -0
  551. cartography/models/spacelift/run.py +162 -0
  552. cartography/models/spacelift/space.py +131 -0
  553. cartography/models/spacelift/spaceliftaccount.py +31 -0
  554. cartography/models/spacelift/spaceliftgitcommit.py +157 -0
  555. cartography/models/spacelift/stack.py +96 -0
  556. cartography/models/spacelift/user.py +63 -0
  557. cartography/models/spacelift/worker.py +97 -0
  558. cartography/models/spacelift/workerpool.py +90 -0
  559. cartography/models/tailscale/device.py +2 -1
  560. cartography/models/tailscale/user.py +6 -1
  561. cartography/models/trivy/__init__.py +0 -0
  562. cartography/models/trivy/findings.py +66 -0
  563. cartography/models/trivy/fix.py +66 -0
  564. cartography/models/trivy/package.py +71 -0
  565. cartography/rules/README.md +1 -0
  566. cartography/rules/__init__.py +0 -0
  567. cartography/rules/cli.py +261 -0
  568. cartography/rules/data/__init__.py +0 -0
  569. cartography/rules/data/rules/__init__.py +46 -0
  570. cartography/rules/data/rules/cloud_security_product_deactivated.py +49 -0
  571. cartography/rules/data/rules/compute_instance_exposed.py +51 -0
  572. cartography/rules/data/rules/database_instance_exposed.py +53 -0
  573. cartography/rules/data/rules/delegation_boundary_modifiable.py +90 -0
  574. cartography/rules/data/rules/identity_administration_privileges.py +100 -0
  575. cartography/rules/data/rules/inactive_user_active_accounts.py +48 -0
  576. cartography/rules/data/rules/malicious_npm_dependencies_shai_hulud.py +2222 -0
  577. cartography/rules/data/rules/mfa_missing.py +46 -0
  578. cartography/rules/data/rules/object_storage_public.py +100 -0
  579. cartography/rules/data/rules/policy_administration_privileges.py +104 -0
  580. cartography/rules/data/rules/unmanaged_accounts.py +43 -0
  581. cartography/rules/data/rules/workload_identity_admin_capabilities.py +193 -0
  582. cartography/rules/formatters.py +108 -0
  583. cartography/rules/runners.py +216 -0
  584. cartography/rules/spec/__init__.py +0 -0
  585. cartography/rules/spec/model.py +267 -0
  586. cartography/rules/spec/result.py +38 -0
  587. cartography/sync.py +25 -5
  588. cartography/util.py +101 -31
  589. {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/METADATA +61 -22
  590. cartography-0.123.0.dist-info/RECORD +856 -0
  591. {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/entry_points.txt +1 -0
  592. cartography/data/jobs/cleanup/aws_dns_cleanup.json +0 -65
  593. cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json +0 -17
  594. cartography/data/jobs/cleanup/aws_import_ec2_security_groupinfo_cleanup.json +0 -24
  595. cartography/data/jobs/cleanup/aws_import_groups_cleanup.json +0 -13
  596. cartography/data/jobs/cleanup/aws_import_identity_center_cleanup.json +0 -16
  597. cartography/data/jobs/cleanup/aws_import_lambda_cleanup.json +0 -50
  598. cartography/data/jobs/cleanup/aws_import_principals_cleanup.json +0 -30
  599. cartography/data/jobs/cleanup/aws_import_rds_clusters_cleanup.json +0 -23
  600. cartography/data/jobs/cleanup/aws_import_rds_instances_cleanup.json +0 -47
  601. cartography/data/jobs/cleanup/aws_import_rds_snapshots_cleanup.json +0 -23
  602. cartography/data/jobs/cleanup/aws_import_roles_cleanup.json +0 -13
  603. cartography/data/jobs/cleanup/aws_import_secrets_cleanup.json +0 -8
  604. cartography/data/jobs/cleanup/aws_import_snapshots_cleanup.json +0 -30
  605. cartography/data/jobs/cleanup/aws_import_users_cleanup.json +0 -8
  606. cartography/data/jobs/cleanup/aws_import_vpc_cleanup.json +0 -23
  607. cartography/data/jobs/cleanup/aws_import_vpc_peering_cleanup.json +0 -45
  608. cartography/data/jobs/cleanup/aws_kms_details.json +0 -10
  609. cartography/data/jobs/cleanup/azure_cosmosdb_cassandra_keyspace_cleanup.json +0 -25
  610. cartography/data/jobs/cleanup/azure_cosmosdb_cors_details.json +0 -15
  611. cartography/data/jobs/cleanup/azure_cosmosdb_mongodb_database_cleanup.json +0 -25
  612. cartography/data/jobs/cleanup/azure_cosmosdb_sql_database_cleanup.json +0 -25
  613. cartography/data/jobs/cleanup/azure_cosmosdb_table_resources_cleanup.json +0 -15
  614. cartography/data/jobs/cleanup/azure_database_account_cleanup.json +0 -85
  615. cartography/data/jobs/cleanup/azure_import_disks_cleanup.json +0 -15
  616. cartography/data/jobs/cleanup/azure_import_snapshots_cleanup.json +0 -15
  617. cartography/data/jobs/cleanup/azure_import_virtual_machines_cleanup.json +0 -25
  618. cartography/data/jobs/cleanup/azure_sql_server_cleanup.json +0 -125
  619. cartography/data/jobs/cleanup/azure_storage_account_cleanup.json +0 -95
  620. cartography/data/jobs/cleanup/azure_subscriptions_cleanup.json +0 -14
  621. cartography/data/jobs/cleanup/azure_tenant_cleanup.json +0 -9
  622. cartography/data/jobs/cleanup/gcp_compute_vpc_subnet_cleanup.json +0 -35
  623. cartography/data/jobs/cleanup/gcp_crm_folder_cleanup.json +0 -23
  624. cartography/data/jobs/cleanup/gcp_crm_organization_cleanup.json +0 -17
  625. cartography/data/jobs/cleanup/gcp_crm_project_cleanup.json +0 -23
  626. cartography/data/jobs/cleanup/gcp_dns_cleanup.json +0 -29
  627. cartography/data/jobs/cleanup/gcp_gke_cluster_cleanup.json +0 -17
  628. cartography/data/jobs/cleanup/gcp_storage_bucket_cleanup.json +0 -29
  629. cartography/data/jobs/cleanup/gsuite_ingest_groups_cleanup.json +0 -23
  630. cartography/data/jobs/cleanup/gsuite_ingest_users_cleanup.json +0 -11
  631. cartography/data/jobs/cleanup/kubernetes_import_cleanup.json +0 -70
  632. cartography/intel/gcp/crm.py +0 -355
  633. cartography/intel/gsuite/api.py +0 -342
  634. cartography-0.104.0rc2.dist-info/RECORD +0 -455
  635. /cartography/data/jobs/{analysis → scoped_analysis}/aws_s3acl_analysis.json +0 -0
  636. /cartography/models/aws/{apigateway.py → apigateway/apigateway.py} +0 -0
  637. /cartography/models/aws/{apigatewaycertificate.py → apigateway/apigatewaycertificate.py} +0 -0
  638. /cartography/models/aws/{apigatewayresource.py → apigateway/apigatewayresource.py} +0 -0
  639. /cartography/models/aws/{apigatewaystage.py → apigateway/apigatewaystage.py} +0 -0
  640. {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/WHEEL +0 -0
  641. {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/licenses/LICENSE +0 -0
  642. {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/top_level.txt +0 -0
@@ -12,7 +12,39 @@ from azure.core.exceptions import HttpResponseError
12
12
  from azure.core.exceptions import ResourceNotFoundError
13
13
  from azure.mgmt.cosmosdb import CosmosDBManagementClient
14
14
 
15
- from cartography.util import run_cleanup_job
15
+ from cartography.client.core.tx import load
16
+ from cartography.graph.job import GraphJob
17
+ from cartography.models.azure.cosmosdb.account import AzureCosmosDBAccountSchema
18
+ from cartography.models.azure.cosmosdb.accountfailoverpolicy import (
19
+ AzureCosmosDBAccountFailoverPolicySchema,
20
+ )
21
+ from cartography.models.azure.cosmosdb.cassandrakeyspace import (
22
+ AzureCosmosDBCassandraKeyspaceSchema,
23
+ )
24
+ from cartography.models.azure.cosmosdb.cassandratable import (
25
+ AzureCosmosDBCassandraTableSchema,
26
+ )
27
+ from cartography.models.azure.cosmosdb.corspolicy import AzureCosmosDBCorsPolicySchema
28
+ from cartography.models.azure.cosmosdb.dblocation import AzureCosmosDBLocationSchema
29
+ from cartography.models.azure.cosmosdb.mongodbcollection import (
30
+ AzureCosmosDBMongoDBCollectionSchema,
31
+ )
32
+ from cartography.models.azure.cosmosdb.mongodbdatabase import (
33
+ AzureCosmosDBMongoDBDatabaseSchema,
34
+ )
35
+ from cartography.models.azure.cosmosdb.privateendpointconnection import (
36
+ AzureCDBPrivateEndpointConnectionSchema,
37
+ )
38
+ from cartography.models.azure.cosmosdb.sqlcontainer import (
39
+ AzureCosmosDBSqlContainerSchema,
40
+ )
41
+ from cartography.models.azure.cosmosdb.sqldatabase import AzureCosmosDBSqlDatabaseSchema
42
+ from cartography.models.azure.cosmosdb.tableresource import (
43
+ AzureCosmosDBTableResourceSchema,
44
+ )
45
+ from cartography.models.azure.cosmosdb.virtualnetworkrule import (
46
+ AzureCosmosDBVirtualNetworkRuleSchema,
47
+ )
16
48
  from cartography.util import timeit
17
49
 
18
50
  from .util.credentials import Credentials
@@ -83,7 +115,7 @@ def transform_database_account_data(database_account_list: List[Dict]) -> List[D
83
115
  if "ip_rules" in database_account and len(database_account["ip_rules"]) > 0:
84
116
  iprules = [x["ip_address_or_range"] for x in database_account["ip_rules"]]
85
117
  database_account["ipruleslist"] = iprules
86
- database_account["list_of_capabilities"] = capabilities
118
+ database_account["capabilities"] = capabilities
87
119
 
88
120
  return database_account_list
89
121
 
@@ -98,45 +130,12 @@ def load_database_account_data(
98
130
  """
99
131
  Ingest data of all database accounts into neo4j.
100
132
  """
101
- ingest_database_account = """
102
- UNWIND $database_accounts_list AS da
103
- MERGE (d:AzureCosmosDBAccount{id: da.id})
104
- ON CREATE SET d.firstseen = timestamp(),
105
- d.type = da.type, d.resourcegroup = da.resourceGroup,
106
- d.location = da.location
107
- SET d.lastupdated = $azure_update_tag,
108
- d.kind = da.kind,
109
- d.name = da.name,
110
- d.ipranges = da.ipruleslist,
111
- d.capabilities = da.list_of_capabilities,
112
- d.documentendpoint = da.document_endpoint,
113
- d.virtualnetworkfilterenabled = da.is_virtual_network_filter_enabled,
114
- d.enableautomaticfailover = da.enable_automatic_failover,
115
- d.provisioningstate = da.provisioning_state,
116
- d.multiplewritelocations = da.enable_multiple_write_locations,
117
- d.accountoffertype = da.database_account_offer_type,
118
- d.publicnetworkaccess = da.public_network_access,
119
- d.enablecassandraconnector = da.enable_cassandra_connector,
120
- d.connectoroffer = da.connector_offer,
121
- d.disablekeybasedmetadatawriteaccess = da.disable_key_based_metadata_write_access,
122
- d.keyvaulturi = da.key_vault_key_uri,
123
- d.enablefreetier = da.enable_free_tier,
124
- d.enableanalyticalstorage = da.enable_analytical_storage,
125
- d.defaultconsistencylevel = da.consistency_policy.default_consistency_level,
126
- d.maxstalenessprefix = da.consistency_policy.max_staleness_prefix,
127
- d.maxintervalinseconds = da.consistency_policy.max_interval_in_seconds
128
- WITH d
129
- MATCH (owner:AzureSubscription{id: $AZURE_SUBSCRIPTION_ID})
130
- MERGE (owner)-[r:RESOURCE]->(d)
131
- ON CREATE SET r.firstseen = timestamp()
132
- SET r.lastupdated = $azure_update_tag
133
- """
134
-
135
- neo4j_session.run(
136
- ingest_database_account,
137
- database_accounts_list=database_account_list,
133
+ load(
134
+ neo4j_session,
135
+ AzureCosmosDBAccountSchema(),
136
+ database_account_list,
137
+ lastupdated=azure_update_tag,
138
138
  AZURE_SUBSCRIPTION_ID=subscription_id,
139
- azure_update_tag=azure_update_tag,
140
139
  )
141
140
 
142
141
 
@@ -152,35 +151,46 @@ def sync_database_account_data_resources(
152
151
  response (like cors policy, failover policy, private endpoint connections, virtual network rules and locations).
153
152
  """
154
153
  for database_account in database_account_list:
155
- _load_cosmosdb_cors_policy(neo4j_session, database_account, azure_update_tag)
154
+ _load_cosmosdb_cors_policy(
155
+ neo4j_session,
156
+ database_account,
157
+ subscription_id,
158
+ azure_update_tag,
159
+ )
156
160
  _load_cosmosdb_failover_policies(
157
161
  neo4j_session,
158
162
  database_account,
163
+ subscription_id,
159
164
  azure_update_tag,
160
165
  )
161
166
  _load_cosmosdb_private_endpoint_connections(
162
167
  neo4j_session,
163
168
  database_account,
169
+ subscription_id,
164
170
  azure_update_tag,
165
171
  )
166
172
  _load_cosmosdb_virtual_network_rules(
167
173
  neo4j_session,
168
174
  database_account,
175
+ subscription_id,
169
176
  azure_update_tag,
170
177
  )
171
178
  _load_database_account_write_locations(
172
179
  neo4j_session,
173
180
  database_account,
181
+ subscription_id,
174
182
  azure_update_tag,
175
183
  )
176
184
  _load_database_account_read_locations(
177
185
  neo4j_session,
178
186
  database_account,
187
+ subscription_id,
179
188
  azure_update_tag,
180
189
  )
181
190
  _load_database_account_associated_locations(
182
191
  neo4j_session,
183
192
  database_account,
193
+ subscription_id,
184
194
  azure_update_tag,
185
195
  )
186
196
 
@@ -189,6 +199,7 @@ def sync_database_account_data_resources(
189
199
  def _load_database_account_write_locations(
190
200
  neo4j_session: neo4j.Session,
191
201
  database_account: Dict,
202
+ subscription_id: str,
192
203
  azure_update_tag: int,
193
204
  ) -> None:
194
205
  """
@@ -198,31 +209,16 @@ def _load_database_account_write_locations(
198
209
  "write_locations" in database_account
199
210
  and len(database_account["write_locations"]) > 0
200
211
  ):
201
- database_account_id = database_account["id"]
202
212
  write_locations = database_account["write_locations"]
213
+ for wl in write_locations:
214
+ wl["db_write_account_id"] = database_account["id"]
203
215
 
204
- ingest_write_location = """
205
- UNWIND $write_locations_list as wl
206
- MERGE (loc:AzureCosmosDBLocation{id: wl.id})
207
- ON CREATE SET loc.firstseen = timestamp()
208
- SET loc.lastupdated = $azure_update_tag,
209
- loc.locationname = wl.location_name,
210
- loc.documentendpoint = wl.document_endpoint,
211
- loc.provisioningstate = wl.provisioning_state,
212
- loc.failoverpriority = wl.failover_priority,
213
- loc.iszoneredundant = wl.is_zone_redundant
214
- WITH loc
215
- MATCH (d:AzureCosmosDBAccount{id: $DatabaseAccountId})
216
- MERGE (d)-[r:CAN_WRITE_FROM]->(loc)
217
- ON CREATE SET r.firstseen = timestamp()
218
- SET r.lastupdated = $azure_update_tag
219
- """
220
-
221
- neo4j_session.run(
222
- ingest_write_location,
223
- write_locations_list=write_locations,
224
- DatabaseAccountId=database_account_id,
225
- azure_update_tag=azure_update_tag,
216
+ load(
217
+ neo4j_session,
218
+ AzureCosmosDBLocationSchema(),
219
+ write_locations,
220
+ lastupdated=azure_update_tag,
221
+ AZURE_SUBSCRIPTION_ID=subscription_id,
226
222
  )
227
223
 
228
224
 
@@ -230,6 +226,7 @@ def _load_database_account_write_locations(
230
226
  def _load_database_account_read_locations(
231
227
  neo4j_session: neo4j.Session,
232
228
  database_account: Dict,
229
+ subscription_id: str,
233
230
  azure_update_tag: int,
234
231
  ) -> None:
235
232
  """
@@ -239,31 +236,16 @@ def _load_database_account_read_locations(
239
236
  "read_locations" in database_account
240
237
  and len(database_account["read_locations"]) > 0
241
238
  ):
242
- database_account_id = database_account["id"]
243
239
  read_locations = database_account["read_locations"]
240
+ for rl in read_locations:
241
+ rl["db_read_account_id"] = database_account["id"]
244
242
 
245
- ingest_read_location = """
246
- UNWIND $read_locations_list as rl
247
- MERGE (loc:AzureCosmosDBLocation{id: rl.id})
248
- ON CREATE SET loc.firstseen = timestamp()
249
- SET loc.lastupdated = $azure_update_tag,
250
- loc.locationname = rl.location_name,
251
- loc.documentendpoint = rl.document_endpoint,
252
- loc.provisioningstate = rl.provisioning_state,
253
- loc.failoverpriority = rl.failover_priority,
254
- loc.iszoneredundant = rl.is_zone_redundant
255
- WITH loc
256
- MATCH (d:AzureCosmosDBAccount{id: $DatabaseAccountId})
257
- MERGE (d)-[r:CAN_READ_FROM]->(loc)
258
- ON CREATE SET r.firstseen = timestamp()
259
- SET r.lastupdated = $azure_update_tag
260
- """
261
-
262
- neo4j_session.run(
263
- ingest_read_location,
264
- read_locations_list=read_locations,
265
- DatabaseAccountId=database_account_id,
266
- azure_update_tag=azure_update_tag,
243
+ load(
244
+ neo4j_session,
245
+ AzureCosmosDBLocationSchema(),
246
+ read_locations,
247
+ lastupdated=azure_update_tag,
248
+ AZURE_SUBSCRIPTION_ID=subscription_id,
267
249
  )
268
250
 
269
251
 
@@ -271,37 +253,23 @@ def _load_database_account_read_locations(
271
253
  def _load_database_account_associated_locations(
272
254
  neo4j_session: neo4j.Session,
273
255
  database_account: Dict,
256
+ subscription_id: str,
274
257
  azure_update_tag: int,
275
258
  ) -> None:
276
259
  """
277
260
  Ingest the details of enabled location for the database account.
278
261
  """
279
262
  if "locations" in database_account and len(database_account["locations"]) > 0:
280
- database_account_id = database_account["id"]
281
263
  associated_locations = database_account["locations"]
264
+ for al in associated_locations:
265
+ al["db_associated_account_id"] = database_account["id"]
282
266
 
283
- ingest_associated_location = """
284
- UNWIND $associated_locations_list as al
285
- MERGE (loc:AzureCosmosDBLocation{id: al.id})
286
- ON CREATE SET loc.firstseen = timestamp()
287
- SET loc.lastupdated = $azure_update_tag,
288
- loc.locationname = al.location_name,
289
- loc.documentendpoint = al.document_endpoint,
290
- loc.provisioningstate = al.provisioning_state,
291
- loc.failoverpriority = al.failover_priority,
292
- loc.iszoneredundant = al.is_zone_redundant
293
- WITH loc
294
- MATCH (d:AzureCosmosDBAccount{id: $DatabaseAccountId})
295
- MERGE (d)-[r:ASSOCIATED_WITH]->(loc)
296
- ON CREATE SET r.firstseen = timestamp()
297
- SET r.lastupdated = $azure_update_tag
298
- """
299
-
300
- neo4j_session.run(
301
- ingest_associated_location,
302
- associated_locations_list=associated_locations,
303
- DatabaseAccountId=database_account_id,
304
- azure_update_tag=azure_update_tag,
267
+ load(
268
+ neo4j_session,
269
+ AzureCosmosDBLocationSchema(),
270
+ associated_locations,
271
+ lastupdated=azure_update_tag,
272
+ AZURE_SUBSCRIPTION_ID=subscription_id,
305
273
  )
306
274
 
307
275
 
@@ -321,6 +289,7 @@ def transform_cosmosdb_cors_policy(database_account: Dict) -> Dict:
321
289
  def _load_cosmosdb_cors_policy(
322
290
  neo4j_session: neo4j.Session,
323
291
  database_account: Dict,
292
+ subscription_id: str,
324
293
  azure_update_tag: int,
325
294
  ) -> None:
326
295
  """
@@ -331,28 +300,13 @@ def _load_cosmosdb_cors_policy(
331
300
  database_account_id = database_account["id"]
332
301
  cors_policies = database_account["cors"]
333
302
 
334
- ingest_cors_policy = """
335
- UNWIND $cors_policies_list AS cp
336
- MERGE (corspolicy:AzureCosmosDBCorsPolicy{id: cp.cors_policy_unique_id})
337
- ON CREATE SET corspolicy.firstseen = timestamp(),
338
- corspolicy.allowedorigins = cp.allowed_origins
339
- SET corspolicy.lastupdated = $azure_update_tag,
340
- corspolicy.allowedmethods = cp.allowed_methods,
341
- corspolicy.allowedheaders = cp.allowed_headers,
342
- corspolicy.exposedheaders = cp.exposed_headers,
343
- corspolicy.maxageinseconds = cp.max_age_in_seconds
344
- WITH corspolicy
345
- MATCH (d:AzureCosmosDBAccount{id: $DatabaseAccountId})
346
- MERGE (d)-[r:CONTAINS]->(corspolicy)
347
- ON CREATE SET r.firstseen = timestamp()
348
- SET r.lastupdated = $azure_update_tag
349
- """
350
-
351
- neo4j_session.run(
352
- ingest_cors_policy,
353
- cors_policies_list=cors_policies,
303
+ load(
304
+ neo4j_session,
305
+ AzureCosmosDBCorsPolicySchema(),
306
+ cors_policies,
307
+ lastupdated=azure_update_tag,
308
+ AZURE_SUBSCRIPTION_ID=subscription_id,
354
309
  DatabaseAccountId=database_account_id,
355
- azure_update_tag=azure_update_tag,
356
310
  )
357
311
 
358
312
 
@@ -360,6 +314,7 @@ def _load_cosmosdb_cors_policy(
360
314
  def _load_cosmosdb_failover_policies(
361
315
  neo4j_session: neo4j.Session,
362
316
  database_account: Dict,
317
+ subscription_id: str,
363
318
  azure_update_tag: int,
364
319
  ) -> None:
365
320
  """
@@ -372,25 +327,13 @@ def _load_cosmosdb_failover_policies(
372
327
  database_account_id = database_account["id"]
373
328
  failover_policies = database_account["failover_policies"]
374
329
 
375
- ingest_failover_policies = """
376
- UNWIND $failover_policies_list AS fp
377
- MERGE (fpolicy:AzureCosmosDBAccountFailoverPolicy{id: fp.id})
378
- ON CREATE SET fpolicy.firstseen = timestamp()
379
- SET fpolicy.lastupdated = $azure_update_tag,
380
- fpolicy.locationname = fp.location_name,
381
- fpolicy.failoverpriority = fp.failover_priority
382
- WITH fpolicy
383
- MATCH (d:AzureCosmosDBAccount{id: $DatabaseAccountId})
384
- MERGE (d)-[r:CONTAINS]->(fpolicy)
385
- ON CREATE SET r.firstseen = timestamp()
386
- SET r.lastupdated = $azure_update_tag
387
- """
388
-
389
- neo4j_session.run(
390
- ingest_failover_policies,
391
- failover_policies_list=failover_policies,
330
+ load(
331
+ neo4j_session,
332
+ AzureCosmosDBAccountFailoverPolicySchema(),
333
+ failover_policies,
334
+ lastupdated=azure_update_tag,
335
+ AZURE_SUBSCRIPTION_ID=subscription_id,
392
336
  DatabaseAccountId=database_account_id,
393
- azure_update_tag=azure_update_tag,
394
337
  )
395
338
 
396
339
 
@@ -398,6 +341,7 @@ def _load_cosmosdb_failover_policies(
398
341
  def _load_cosmosdb_private_endpoint_connections(
399
342
  neo4j_session: neo4j.Session,
400
343
  database_account: Dict,
344
+ subscription_id: str,
401
345
  azure_update_tag: int,
402
346
  ) -> None:
403
347
  """
@@ -413,27 +357,13 @@ def _load_cosmosdb_private_endpoint_connections(
413
357
  database_account_id = database_account["id"]
414
358
  private_endpoint_connections = database_account["private_endpoint_connections"]
415
359
 
416
- ingest_private_endpoint_connections = """
417
- UNWIND $private_endpoint_connections_list AS connection
418
- MERGE (pec:AzureCDBPrivateEndpointConnection{id: connection.id})
419
- ON CREATE SET pec.firstseen = timestamp()
420
- SET pec.lastupdated = $azure_update_tag,
421
- pec.name = connection.name,
422
- pec.privateendpointid = connection.private_endpoint.id,
423
- pec.status = connection.private_link_service_connection_state.status,
424
- pec.actionrequired = connection.private_link_service_connection_state.actions_required
425
- WITH pec
426
- MATCH (d:AzureCosmosDBAccount{id: $DatabaseAccountId})
427
- MERGE (d)-[r:CONFIGURED_WITH]->(pec)
428
- ON CREATE SET r.firstseen = timestamp()
429
- SET r.lastupdated = $azure_update_tag
430
- """
431
-
432
- neo4j_session.run(
433
- ingest_private_endpoint_connections,
434
- private_endpoint_connections_list=private_endpoint_connections,
360
+ load(
361
+ neo4j_session,
362
+ AzureCDBPrivateEndpointConnectionSchema(),
363
+ private_endpoint_connections,
364
+ lastupdated=azure_update_tag,
365
+ AZURE_SUBSCRIPTION_ID=subscription_id,
435
366
  DatabaseAccountId=database_account_id,
436
- azure_update_tag=azure_update_tag,
437
367
  )
438
368
 
439
369
 
@@ -441,6 +371,7 @@ def _load_cosmosdb_private_endpoint_connections(
441
371
  def _load_cosmosdb_virtual_network_rules(
442
372
  neo4j_session: neo4j.Session,
443
373
  database_account: Dict,
374
+ subscription_id: str,
444
375
  azure_update_tag: int,
445
376
  ) -> None:
446
377
  """
@@ -453,24 +384,13 @@ def _load_cosmosdb_virtual_network_rules(
453
384
  database_account_id = database_account["id"]
454
385
  virtual_network_rules = database_account["virtual_network_rules"]
455
386
 
456
- ingest_virtual_network_rules = """
457
- UNWIND $virtual_network_rules_list AS vnr
458
- MERGE (rules:AzureCosmosDBVirtualNetworkRule{id: vnr.id})
459
- ON CREATE SET rules.firstseen = timestamp()
460
- SET rules.lastupdated = $azure_update_tag,
461
- rules.ignoremissingvnetserviceendpoint = vnr.ignore_missing_v_net_service_endpoint
462
- WITH rules
463
- MATCH (d:AzureCosmosDBAccount{id: $DatabaseAccountId})
464
- MERGE (d)-[r:CONFIGURED_WITH]->(rules)
465
- ON CREATE SET r.firstseen = timestamp()
466
- SET r.lastupdated = $azure_update_tag
467
- """
468
-
469
- neo4j_session.run(
470
- ingest_virtual_network_rules,
471
- virtual_network_rules_list=virtual_network_rules,
387
+ load(
388
+ neo4j_session,
389
+ AzureCosmosDBVirtualNetworkRuleSchema(),
390
+ virtual_network_rules,
391
+ lastupdated=azure_update_tag,
392
+ AZURE_SUBSCRIPTION_ID=subscription_id,
472
393
  DatabaseAccountId=database_account_id,
473
- azure_update_tag=azure_update_tag,
474
394
  )
475
395
 
476
396
 
@@ -762,14 +682,18 @@ def load_database_account_details(
762
682
  table_resources.extend(t)
763
683
 
764
684
  # Loading the table resources
765
- _load_table_resources(neo4j_session, table_resources, update_tag)
685
+ _load_table_resources(neo4j_session, table_resources, subscription_id, update_tag)
766
686
  # Cleanup of table resources (done here because table resource doesn't have any other child resources in it)
767
687
  cleanup_table_resources(neo4j_session, common_job_parameters)
768
688
 
769
689
  # Loading SQL databases, Cassandra Keyspaces and MongoDB databases
770
- _load_sql_databases(neo4j_session, sql_databases, update_tag)
771
- _load_cassandra_keyspaces(neo4j_session, cassandra_keyspaces, update_tag)
772
- _load_mongodb_databases(neo4j_session, mongodb_databases, update_tag)
690
+ _load_sql_databases(neo4j_session, sql_databases, subscription_id, update_tag)
691
+ _load_cassandra_keyspaces(
692
+ neo4j_session, cassandra_keyspaces, subscription_id, update_tag
693
+ )
694
+ _load_mongodb_databases(
695
+ neo4j_session, mongodb_databases, subscription_id, update_tag
696
+ )
773
697
 
774
698
  sync_sql_database_details(
775
699
  neo4j_session,
@@ -801,31 +725,18 @@ def load_database_account_details(
801
725
  def _load_sql_databases(
802
726
  neo4j_session: neo4j.Session,
803
727
  sql_databases: List[Dict],
728
+ subscription_id: str,
804
729
  update_tag: int,
805
730
  ) -> None:
806
731
  """
807
732
  Ingest SQL Databases into neo4j.
808
733
  """
809
- ingest_sql_databases = """
810
- UNWIND $sql_databases_list AS database
811
- MERGE (sdb:AzureCosmosDBSqlDatabase{id: database.id})
812
- ON CREATE SET sdb.firstseen = timestamp(), sdb.type = database.type,
813
- sdb.location = database.location
814
- SET sdb.name = database.name,
815
- sdb.throughput = database.options.throughput,
816
- sdb.maxthroughput = database.options.autoscale_setting.max_throughput,
817
- sdb.lastupdated = $azure_update_tag
818
- WITH sdb, database
819
- MATCH (d:AzureCosmosDBAccount{id: database.database_account_id})
820
- MERGE (d)-[r:CONTAINS]->(sdb)
821
- ON CREATE SET r.firstseen = timestamp()
822
- SET r.lastupdated = $azure_update_tag
823
- """
824
-
825
- neo4j_session.run(
826
- ingest_sql_databases,
827
- sql_databases_list=sql_databases,
828
- azure_update_tag=update_tag,
734
+ load(
735
+ neo4j_session,
736
+ AzureCosmosDBSqlDatabaseSchema(),
737
+ sql_databases,
738
+ lastupdated=update_tag,
739
+ AZURE_SUBSCRIPTION_ID=subscription_id,
829
740
  )
830
741
 
831
742
 
@@ -833,31 +744,18 @@ def _load_sql_databases(
833
744
  def _load_cassandra_keyspaces(
834
745
  neo4j_session: neo4j.Session,
835
746
  cassandra_keyspaces: List[Dict],
747
+ subscription_id: str,
836
748
  update_tag: int,
837
749
  ) -> None:
838
750
  """
839
751
  Ingest Cassandra keyspaces into neo4j.
840
752
  """
841
- ingest_cassandra_keyspaces = """
842
- UNWIND $cassandra_keyspaces_list AS keyspace
843
- MERGE (ck:AzureCosmosDBCassandraKeyspace{id: keyspace.id})
844
- ON CREATE SET ck.firstseen = timestamp(), ck.type = keyspace.type,
845
- ck.location = keyspace.location
846
- SET ck.name = keyspace.name,
847
- ck.lastupdated = $azure_update_tag,
848
- ck.throughput = keyspace.options.throughput,
849
- ck.maxthroughput = keyspace.options.autoscale_setting.max_throughput
850
- WITH ck, keyspace
851
- MATCH (d:AzureCosmosDBAccount{id: keyspace.database_account_id})
852
- MERGE (d)-[r:CONTAINS]->(ck)
853
- ON CREATE SET r.firstseen = timestamp()
854
- SET r.lastupdated = $azure_update_tag
855
- """
856
-
857
- neo4j_session.run(
858
- ingest_cassandra_keyspaces,
859
- cassandra_keyspaces_list=cassandra_keyspaces,
860
- azure_update_tag=update_tag,
753
+ load(
754
+ neo4j_session,
755
+ AzureCosmosDBCassandraKeyspaceSchema(),
756
+ cassandra_keyspaces,
757
+ lastupdated=update_tag,
758
+ AZURE_SUBSCRIPTION_ID=subscription_id,
861
759
  )
862
760
 
863
761
 
@@ -865,31 +763,18 @@ def _load_cassandra_keyspaces(
865
763
  def _load_mongodb_databases(
866
764
  neo4j_session: neo4j.Session,
867
765
  mongodb_databases: List[Dict],
766
+ subscription_id: str,
868
767
  update_tag: int,
869
768
  ) -> None:
870
769
  """
871
770
  Ingest MongoDB databases into neo4j.
872
771
  """
873
- ingest_mongodb_databases = """
874
- UNWIND $mongodb_databases_list AS database
875
- MERGE (mdb:AzureCosmosDBMongoDBDatabase{id: database.id})
876
- ON CREATE SET mdb.firstseen = timestamp(), mdb.type = database.type,
877
- mdb.location = database.location
878
- SET mdb.name = database.name,
879
- mdb.throughput = database.options.throughput,
880
- mdb.maxthroughput = database.options.autoscale_setting.max_throughput,
881
- mdb.lastupdated = $azure_update_tag
882
- WITH mdb, database
883
- MATCH (d:AzureCosmosDBAccount{id: database.database_account_id})
884
- MERGE (d)-[r:CONTAINS]->(mdb)
885
- ON CREATE SET r.firstseen = timestamp()
886
- SET r.lastupdated = $azure_update_tag
887
- """
888
-
889
- neo4j_session.run(
890
- ingest_mongodb_databases,
891
- mongodb_databases_list=mongodb_databases,
892
- azure_update_tag=update_tag,
772
+ load(
773
+ neo4j_session,
774
+ AzureCosmosDBMongoDBDatabaseSchema(),
775
+ mongodb_databases,
776
+ lastupdated=update_tag,
777
+ AZURE_SUBSCRIPTION_ID=subscription_id,
893
778
  )
894
779
 
895
780
 
@@ -897,31 +782,18 @@ def _load_mongodb_databases(
897
782
  def _load_table_resources(
898
783
  neo4j_session: neo4j.Session,
899
784
  table_resources: List[Dict],
785
+ subscription_id: str,
900
786
  update_tag: int,
901
787
  ) -> None:
902
788
  """
903
789
  Ingest Table resources into neo4j.
904
790
  """
905
- ingest_tables = """
906
- UNWIND $table_resources_list AS table
907
- MERGE (tr:AzureCosmosDBTableResource{id: table.id})
908
- ON CREATE SET tr.firstseen = timestamp(), tr.type = table.type,
909
- tr.location = table.location
910
- SET tr.name = table.name,
911
- tr.lastupdated = $azure_update_tag,
912
- tr.throughput = table.options.throughput,
913
- tr.maxthroughput = table.options.autoscale_setting.max_throughput
914
- WITH tr, table
915
- MATCH (d:AzureCosmosDBAccount{id: table.database_account_id})
916
- MERGE (d)-[r:CONTAINS]->(tr)
917
- ON CREATE SET r.firstseen = timestamp()
918
- SET r.lastupdated = $azure_update_tag
919
- """
920
-
921
- neo4j_session.run(
922
- ingest_tables,
923
- table_resources_list=table_resources,
924
- azure_update_tag=update_tag,
791
+ load(
792
+ neo4j_session,
793
+ AzureCosmosDBTableResourceSchema(),
794
+ table_resources,
795
+ lastupdated=update_tag,
796
+ AZURE_SUBSCRIPTION_ID=subscription_id,
925
797
  )
926
798
 
927
799
 
@@ -939,7 +811,9 @@ def sync_sql_database_details(
939
811
  subscription_id,
940
812
  sql_databases,
941
813
  )
942
- load_sql_database_details(neo4j_session, sql_database_details, update_tag)
814
+ load_sql_database_details(
815
+ neo4j_session, sql_database_details, subscription_id, update_tag
816
+ )
943
817
  cleanup_sql_database_details(neo4j_session, common_job_parameters)
944
818
 
945
819
 
@@ -999,6 +873,7 @@ def get_sql_containers(
999
873
  def load_sql_database_details(
1000
874
  neo4j_session: neo4j.Session,
1001
875
  details: List[Tuple[Any, Any]],
876
+ subscription_id: str,
1002
877
  update_tag: int,
1003
878
  ) -> None:
1004
879
  """
@@ -1012,44 +887,25 @@ def load_sql_database_details(
1012
887
  c["database_id"] = database_id
1013
888
  containers.extend(container)
1014
889
 
1015
- _load_sql_containers(neo4j_session, containers, update_tag)
890
+ _load_sql_containers(neo4j_session, containers, subscription_id, update_tag)
1016
891
 
1017
892
 
1018
893
  @timeit
1019
894
  def _load_sql_containers(
1020
895
  neo4j_session: neo4j.Session,
1021
896
  containers: List[Dict],
897
+ subscription_id: str,
1022
898
  update_tag: int,
1023
899
  ) -> None:
1024
900
  """
1025
901
  Ingest SQL Container details into neo4j.
1026
902
  """
1027
- ingest_containers = """
1028
- UNWIND $sql_containers_list AS container
1029
- MERGE (c:AzureCosmosDBSqlContainer{id: container.id})
1030
- ON CREATE SET c.firstseen = timestamp(), c.type = container.type,
1031
- c.location = container.location
1032
- SET c.name = container.name,
1033
- c.lastupdated = $azure_update_tag,
1034
- c.throughput = container.options.throughput,
1035
- c.maxthroughput = container.options.autoscale_setting.max_throughput,
1036
- c.container = container.resource.id,
1037
- c.defaultttl = container.resource.default_ttl,
1038
- c.analyticalttl = container.resource.analytical_storage_ttl,
1039
- c.isautomaticindexingpolicy = container.resource.indexing_policy.automatic,
1040
- c.indexingmode = container.resource.indexing_policy.indexing_mode,
1041
- c.conflictresolutionpolicymode = container.resource.conflict_resolution_policy.mode
1042
- WITH c, container
1043
- MATCH (sdb:AzureCosmosDBSqlDatabase{id: container.database_id})
1044
- MERGE (sdb)-[r:CONTAINS]->(c)
1045
- ON CREATE SET r.firstseen = timestamp()
1046
- SET r.lastupdated = $azure_update_tag
1047
- """
1048
-
1049
- neo4j_session.run(
1050
- ingest_containers,
1051
- sql_containers_list=containers,
1052
- azure_update_tag=update_tag,
903
+ load(
904
+ neo4j_session,
905
+ AzureCosmosDBSqlContainerSchema(),
906
+ containers,
907
+ lastupdated=update_tag,
908
+ AZURE_SUBSCRIPTION_ID=subscription_id,
1053
909
  )
1054
910
 
1055
911
 
@@ -1070,6 +926,7 @@ def sync_cassandra_keyspace_details(
1070
926
  load_cassandra_keyspace_details(
1071
927
  neo4j_session,
1072
928
  cassandra_keyspace_details,
929
+ subscription_id,
1073
930
  update_tag,
1074
931
  )
1075
932
  cleanup_cassandra_keyspace_details(neo4j_session, common_job_parameters)
@@ -1131,6 +988,7 @@ def get_cassandra_tables(
1131
988
  def load_cassandra_keyspace_details(
1132
989
  neo4j_session: neo4j.Session,
1133
990
  details: List[Tuple[Any, Any]],
991
+ subscription_id: str,
1134
992
  update_tag: int,
1135
993
  ) -> None:
1136
994
  """
@@ -1144,41 +1002,25 @@ def load_cassandra_keyspace_details(
1144
1002
  t["keyspace_id"] = keyspace_id
1145
1003
  cassandra_tables.extend(cassandra_table)
1146
1004
 
1147
- _load_cassandra_tables(neo4j_session, cassandra_tables, update_tag)
1005
+ _load_cassandra_tables(neo4j_session, cassandra_tables, subscription_id, update_tag)
1148
1006
 
1149
1007
 
1150
1008
  @timeit
1151
1009
  def _load_cassandra_tables(
1152
1010
  neo4j_session: neo4j.Session,
1153
1011
  cassandra_tables: List[Dict],
1012
+ subscription_id: str,
1154
1013
  update_tag: int,
1155
1014
  ) -> None:
1156
1015
  """
1157
1016
  Ingest Cassandra Tables into neo4j.
1158
1017
  """
1159
- ingest_cassandra_tables = """
1160
- UNWIND $cassandra_tables_list AS table
1161
- MERGE (ct:AzureCosmosDBCassandraTable{id: table.id})
1162
- ON CREATE SET ct.firstseen = timestamp(), ct.type = table.type,
1163
- ct.location = table.location
1164
- SET ct.name = table.name,
1165
- ct.lastupdated = $azure_update_tag,
1166
- ct.throughput = table.options.throughput,
1167
- ct.maxthroughput = table.options.autoscale_setting.max_throughput,
1168
- ct.container = table.resource.id,
1169
- ct.defaultttl = table.resource.default_ttl,
1170
- ct.analyticalttl = table.resource.analytical_storage_ttl
1171
- WITH ct, table
1172
- MATCH (ck:AzureCosmosDBCassandraKeyspace{id: table.keyspace_id})
1173
- MERGE (ck)-[r:CONTAINS]->(ct)
1174
- ON CREATE SET r.firstseen = timestamp()
1175
- SET r.lastupdated = $azure_update_tag
1176
- """
1177
-
1178
- neo4j_session.run(
1179
- ingest_cassandra_tables,
1180
- cassandra_tables_list=cassandra_tables,
1181
- azure_update_tag=update_tag,
1018
+ load(
1019
+ neo4j_session,
1020
+ AzureCosmosDBCassandraTableSchema(),
1021
+ cassandra_tables,
1022
+ lastupdated=update_tag,
1023
+ AZURE_SUBSCRIPTION_ID=subscription_id,
1182
1024
  )
1183
1025
 
1184
1026
 
@@ -1196,7 +1038,9 @@ def sync_mongodb_database_details(
1196
1038
  subscription_id,
1197
1039
  mongodb_databases,
1198
1040
  )
1199
- load_mongodb_databases_details(neo4j_session, mongodb_databases_details, update_tag)
1041
+ load_mongodb_databases_details(
1042
+ neo4j_session, mongodb_databases_details, subscription_id, update_tag
1043
+ )
1200
1044
  cleanup_mongodb_database_details(neo4j_session, common_job_parameters)
1201
1045
 
1202
1046
 
@@ -1256,6 +1100,7 @@ def get_mongodb_collections(
1256
1100
  def load_mongodb_databases_details(
1257
1101
  neo4j_session: neo4j.Session,
1258
1102
  details: List[Tuple[Any, Any]],
1103
+ subscription_id: str,
1259
1104
  update_tag: int,
1260
1105
  ) -> None:
1261
1106
  """
@@ -1269,40 +1114,25 @@ def load_mongodb_databases_details(
1269
1114
  c["database_id"] = database_id
1270
1115
  collections.extend(collection)
1271
1116
 
1272
- _load_collections(neo4j_session, collections, update_tag)
1117
+ _load_collections(neo4j_session, collections, subscription_id, update_tag)
1273
1118
 
1274
1119
 
1275
1120
  @timeit
1276
1121
  def _load_collections(
1277
1122
  neo4j_session: neo4j.Session,
1278
1123
  collections: List[Dict],
1124
+ subscription_id: str,
1279
1125
  update_tag: int,
1280
1126
  ) -> None:
1281
1127
  """
1282
1128
  Ingest MongoDB Collections into neo4j.
1283
1129
  """
1284
- ingest_collections = """
1285
- UNWIND $mongodb_collections_list AS collection
1286
- MERGE (col:AzureCosmosDBMongoDBCollection{id: collection.id})
1287
- ON CREATE SET col.firstseen = timestamp(), col.type = collection.type,
1288
- col.location = collection.location
1289
- SET col.name = collection.name,
1290
- col.lastupdated = $azure_update_tag,
1291
- col.throughput = collection.options.throughput,
1292
- col.maxthroughput = collection.options.autoscale_setting.max_throughput,
1293
- col.collectionname = collection.resource.id,
1294
- col.analyticalttl = collection.resource.analytical_storage_ttl
1295
- WITH col, collection
1296
- MATCH (mdb:AzureCosmosDBMongoDBDatabase{id: collection.database_id})
1297
- MERGE (mdb)-[r:CONTAINS]->(col)
1298
- ON CREATE SET r.firstseen = timestamp()
1299
- SET r.lastupdated = $azure_update_tag
1300
- """
1301
-
1302
- neo4j_session.run(
1303
- ingest_collections,
1304
- mongodb_collections_list=collections,
1305
- azure_update_tag=update_tag,
1130
+ load(
1131
+ neo4j_session,
1132
+ AzureCosmosDBMongoDBCollectionSchema(),
1133
+ collections,
1134
+ lastupdated=update_tag,
1135
+ AZURE_SUBSCRIPTION_ID=subscription_id,
1306
1136
  )
1307
1137
 
1308
1138
 
@@ -1311,10 +1141,26 @@ def cleanup_azure_database_accounts(
1311
1141
  neo4j_session: neo4j.Session,
1312
1142
  common_job_parameters: Dict,
1313
1143
  ) -> None:
1314
- run_cleanup_job(
1315
- "azure_database_account_cleanup.json",
1144
+ GraphJob.from_node_schema(AzureCosmosDBAccountSchema(), common_job_parameters).run(
1145
+ neo4j_session,
1146
+ )
1147
+ GraphJob.from_node_schema(AzureCosmosDBLocationSchema(), common_job_parameters).run(
1148
+ neo4j_session,
1149
+ )
1150
+ GraphJob.from_node_schema(
1151
+ AzureCosmosDBCorsPolicySchema(), common_job_parameters
1152
+ ).run(
1153
+ neo4j_session,
1154
+ )
1155
+ GraphJob.from_node_schema(
1156
+ AzureCosmosDBVirtualNetworkRuleSchema(), common_job_parameters
1157
+ ).run(
1158
+ neo4j_session,
1159
+ )
1160
+ GraphJob.from_node_schema(
1161
+ AzureCDBPrivateEndpointConnectionSchema(), common_job_parameters
1162
+ ).run(
1316
1163
  neo4j_session,
1317
- common_job_parameters,
1318
1164
  )
1319
1165
 
1320
1166
 
@@ -1323,10 +1169,15 @@ def cleanup_sql_database_details(
1323
1169
  neo4j_session: neo4j.Session,
1324
1170
  common_job_parameters: Dict,
1325
1171
  ) -> None:
1326
- run_cleanup_job(
1327
- "azure_cosmosdb_sql_database_cleanup.json",
1172
+ GraphJob.from_node_schema(
1173
+ AzureCosmosDBSqlContainerSchema(), common_job_parameters
1174
+ ).run(
1175
+ neo4j_session,
1176
+ )
1177
+ GraphJob.from_node_schema(
1178
+ AzureCosmosDBSqlDatabaseSchema(), common_job_parameters
1179
+ ).run(
1328
1180
  neo4j_session,
1329
- common_job_parameters,
1330
1181
  )
1331
1182
 
1332
1183
 
@@ -1335,10 +1186,15 @@ def cleanup_cassandra_keyspace_details(
1335
1186
  neo4j_session: neo4j.Session,
1336
1187
  common_job_parameters: Dict,
1337
1188
  ) -> None:
1338
- run_cleanup_job(
1339
- "azure_cosmosdb_cassandra_keyspace_cleanup.json",
1189
+ GraphJob.from_node_schema(
1190
+ AzureCosmosDBCassandraTableSchema(), common_job_parameters
1191
+ ).run(
1192
+ neo4j_session,
1193
+ )
1194
+ GraphJob.from_node_schema(
1195
+ AzureCosmosDBCassandraKeyspaceSchema(), common_job_parameters
1196
+ ).run(
1340
1197
  neo4j_session,
1341
- common_job_parameters,
1342
1198
  )
1343
1199
 
1344
1200
 
@@ -1347,10 +1203,15 @@ def cleanup_mongodb_database_details(
1347
1203
  neo4j_session: neo4j.Session,
1348
1204
  common_job_parameters: Dict,
1349
1205
  ) -> None:
1350
- run_cleanup_job(
1351
- "azure_cosmosdb_mongodb_database_cleanup.json",
1206
+ GraphJob.from_node_schema(
1207
+ AzureCosmosDBMongoDBCollectionSchema(), common_job_parameters
1208
+ ).run(
1209
+ neo4j_session,
1210
+ )
1211
+ GraphJob.from_node_schema(
1212
+ AzureCosmosDBMongoDBDatabaseSchema(), common_job_parameters
1213
+ ).run(
1352
1214
  neo4j_session,
1353
- common_job_parameters,
1354
1215
  )
1355
1216
 
1356
1217
 
@@ -1359,10 +1220,10 @@ def cleanup_table_resources(
1359
1220
  neo4j_session: neo4j.Session,
1360
1221
  common_job_parameters: Dict,
1361
1222
  ) -> None:
1362
- run_cleanup_job(
1363
- "azure_cosmosdb_table_resources_cleanup.json",
1223
+ GraphJob.from_node_schema(
1224
+ AzureCosmosDBTableResourceSchema(), common_job_parameters
1225
+ ).run(
1364
1226
  neo4j_session,
1365
- common_job_parameters,
1366
1227
  )
1367
1228
 
1368
1229