cartography 0.102.0rc1__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 +327 -0
  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 -44
  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 +97 -0
  184. cartography/models/aws/ec2/route_tables.py +128 -0
  185. cartography/models/aws/ec2/routes.py +85 -0
  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.0rc1.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.0rc1.dist-info → cartography-0.103.0rc1.dist-info}/WHEEL +1 -1
  248. cartography-0.102.0rc1.dist-info/RECORD +0 -377
  249. {cartography-0.102.0rc1.dist-info → cartography-0.103.0rc1.dist-info}/entry_points.txt +0 -0
  250. {cartography-0.102.0rc1.dist-info → cartography-0.103.0rc1.dist-info}/licenses/LICENSE +0 -0
  251. {cartography-0.102.0rc1.dist-info → cartography-0.103.0rc1.dist-info}/top_level.txt +0 -0
@@ -12,64 +12,80 @@ from cartography.models.core.relationships import TargetNodeMatcher
12
12
 
13
13
  @dataclass(frozen=True)
14
14
  class EntraUserNodeProperties(CartographyNodeProperties):
15
- id: PropertyRef = PropertyRef('id')
16
- user_principal_name: PropertyRef = PropertyRef('user_principal_name')
17
- display_name: PropertyRef = PropertyRef('display_name')
18
- given_name: PropertyRef = PropertyRef('given_name')
19
- surname: PropertyRef = PropertyRef('surname')
15
+ id: PropertyRef = PropertyRef("id")
16
+ user_principal_name: PropertyRef = PropertyRef("user_principal_name")
17
+ display_name: PropertyRef = PropertyRef("display_name")
18
+ given_name: PropertyRef = PropertyRef("given_name")
19
+ surname: PropertyRef = PropertyRef("surname")
20
20
  # The underlying datatype calls this 'mail' but everything else in cartography uses 'email'
21
- email: PropertyRef = PropertyRef('mail', extra_index=True)
22
- other_mails: PropertyRef = PropertyRef('other_mails')
23
- preferred_language: PropertyRef = PropertyRef('preferred_language')
24
- preferred_name: PropertyRef = PropertyRef('preferred_name')
25
- state: PropertyRef = PropertyRef('state')
26
- usage_location: PropertyRef = PropertyRef('usage_location')
27
- user_type: PropertyRef = PropertyRef('user_type')
28
- show_in_address_list: PropertyRef = PropertyRef('show_in_address_list')
29
- sign_in_sessions_valid_from_date_time: PropertyRef = PropertyRef('sign_in_sessions_valid_from_date_time')
30
- security_identifier: PropertyRef = PropertyRef('security_identifier')
31
- account_enabled: PropertyRef = PropertyRef('account_enabled')
32
- city: PropertyRef = PropertyRef('city')
33
- company_name: PropertyRef = PropertyRef('company_name')
34
- consent_provided_for_minor: PropertyRef = PropertyRef('consent_provided_for_minor')
35
- country: PropertyRef = PropertyRef('country')
36
- created_date_time: PropertyRef = PropertyRef('created_date_time')
37
- creation_type: PropertyRef = PropertyRef('creation_type')
38
- deleted_date_time: PropertyRef = PropertyRef('deleted_date_time')
39
- department: PropertyRef = PropertyRef('department')
40
- employee_id: PropertyRef = PropertyRef('employee_id')
41
- employee_type: PropertyRef = PropertyRef('employee_type')
42
- external_user_state: PropertyRef = PropertyRef('external_user_state')
43
- external_user_state_change_date_time: PropertyRef = PropertyRef('external_user_state_change_date_time')
44
- hire_date: PropertyRef = PropertyRef('hire_date')
45
- is_management_restricted: PropertyRef = PropertyRef('is_management_restricted')
46
- is_resource_account: PropertyRef = PropertyRef('is_resource_account')
47
- job_title: PropertyRef = PropertyRef('job_title')
48
- last_password_change_date_time: PropertyRef = PropertyRef('last_password_change_date_time')
49
- mail_nickname: PropertyRef = PropertyRef('mail_nickname')
50
- office_location: PropertyRef = PropertyRef('office_location')
51
- on_premises_distinguished_name: PropertyRef = PropertyRef('on_premises_distinguished_name')
52
- on_premises_domain_name: PropertyRef = PropertyRef('on_premises_domain_name')
53
- on_premises_immutable_id: PropertyRef = PropertyRef('on_premises_immutable_id')
54
- on_premises_last_sync_date_time: PropertyRef = PropertyRef('on_premises_last_sync_date_time')
55
- on_premises_sam_account_name: PropertyRef = PropertyRef('on_premises_sam_account_name')
56
- on_premises_security_identifier: PropertyRef = PropertyRef('on_premises_security_identifier')
57
- on_premises_sync_enabled: PropertyRef = PropertyRef('on_premises_sync_enabled')
58
- on_premises_user_principal_name: PropertyRef = PropertyRef('on_premises_user_principal_name')
59
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
21
+ email: PropertyRef = PropertyRef("mail", extra_index=True)
22
+ other_mails: PropertyRef = PropertyRef("other_mails")
23
+ preferred_language: PropertyRef = PropertyRef("preferred_language")
24
+ preferred_name: PropertyRef = PropertyRef("preferred_name")
25
+ state: PropertyRef = PropertyRef("state")
26
+ usage_location: PropertyRef = PropertyRef("usage_location")
27
+ user_type: PropertyRef = PropertyRef("user_type")
28
+ show_in_address_list: PropertyRef = PropertyRef("show_in_address_list")
29
+ sign_in_sessions_valid_from_date_time: PropertyRef = PropertyRef(
30
+ "sign_in_sessions_valid_from_date_time"
31
+ )
32
+ security_identifier: PropertyRef = PropertyRef("security_identifier")
33
+ account_enabled: PropertyRef = PropertyRef("account_enabled")
34
+ city: PropertyRef = PropertyRef("city")
35
+ company_name: PropertyRef = PropertyRef("company_name")
36
+ consent_provided_for_minor: PropertyRef = PropertyRef("consent_provided_for_minor")
37
+ country: PropertyRef = PropertyRef("country")
38
+ created_date_time: PropertyRef = PropertyRef("created_date_time")
39
+ creation_type: PropertyRef = PropertyRef("creation_type")
40
+ deleted_date_time: PropertyRef = PropertyRef("deleted_date_time")
41
+ department: PropertyRef = PropertyRef("department")
42
+ employee_id: PropertyRef = PropertyRef("employee_id")
43
+ employee_type: PropertyRef = PropertyRef("employee_type")
44
+ external_user_state: PropertyRef = PropertyRef("external_user_state")
45
+ external_user_state_change_date_time: PropertyRef = PropertyRef(
46
+ "external_user_state_change_date_time"
47
+ )
48
+ hire_date: PropertyRef = PropertyRef("hire_date")
49
+ is_management_restricted: PropertyRef = PropertyRef("is_management_restricted")
50
+ is_resource_account: PropertyRef = PropertyRef("is_resource_account")
51
+ job_title: PropertyRef = PropertyRef("job_title")
52
+ last_password_change_date_time: PropertyRef = PropertyRef(
53
+ "last_password_change_date_time"
54
+ )
55
+ mail_nickname: PropertyRef = PropertyRef("mail_nickname")
56
+ office_location: PropertyRef = PropertyRef("office_location")
57
+ on_premises_distinguished_name: PropertyRef = PropertyRef(
58
+ "on_premises_distinguished_name"
59
+ )
60
+ on_premises_domain_name: PropertyRef = PropertyRef("on_premises_domain_name")
61
+ on_premises_immutable_id: PropertyRef = PropertyRef("on_premises_immutable_id")
62
+ on_premises_last_sync_date_time: PropertyRef = PropertyRef(
63
+ "on_premises_last_sync_date_time"
64
+ )
65
+ on_premises_sam_account_name: PropertyRef = PropertyRef(
66
+ "on_premises_sam_account_name"
67
+ )
68
+ on_premises_security_identifier: PropertyRef = PropertyRef(
69
+ "on_premises_security_identifier"
70
+ )
71
+ on_premises_sync_enabled: PropertyRef = PropertyRef("on_premises_sync_enabled")
72
+ on_premises_user_principal_name: PropertyRef = PropertyRef(
73
+ "on_premises_user_principal_name"
74
+ )
75
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
60
76
 
61
77
 
62
78
  @dataclass(frozen=True)
63
79
  class EntraTenantToUserRelProperties(CartographyRelProperties):
64
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
80
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
65
81
 
66
82
 
67
83
  @dataclass(frozen=True)
68
84
  # (:EntraUser)<-[:RESOURCE]-(:AzureTenant)
69
85
  class EntraUserToTenantRel(CartographyRelSchema):
70
- target_node_label: str = 'AzureTenant'
86
+ target_node_label: str = "AzureTenant"
71
87
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
72
- {'id': PropertyRef('TENANT_ID', set_in_kwargs=True)},
88
+ {"id": PropertyRef("TENANT_ID", set_in_kwargs=True)},
73
89
  )
74
90
  direction: LinkDirection = LinkDirection.INWARD
75
91
  rel_label: str = "RESOURCE"
@@ -78,6 +94,6 @@ class EntraUserToTenantRel(CartographyRelSchema):
78
94
 
79
95
  @dataclass(frozen=True)
80
96
  class EntraUserSchema(CartographyNodeSchema):
81
- label: str = 'EntraUser'
97
+ label: str = "EntraUser"
82
98
  properties: EntraUserNodeProperties = EntraUserNodeProperties()
83
99
  sub_resource_relationship: EntraUserToTenantRel = EntraUserToTenantRel()
@@ -15,41 +15,41 @@ logger = logging.getLogger(__name__)
15
15
 
16
16
  @dataclass(frozen=True)
17
17
  class GCPServiceAccountNodeProperties(CartographyNodeProperties):
18
- id: PropertyRef = PropertyRef('id', extra_index=True)
19
- email: PropertyRef = PropertyRef('email', extra_index=True)
20
- display_name: PropertyRef = PropertyRef('displayName')
21
- oauth2_client_id: PropertyRef = PropertyRef('oauth2ClientId')
22
- unique_id: PropertyRef = PropertyRef('uniqueId')
23
- disabled: PropertyRef = PropertyRef('disabled')
24
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
25
- project_id: PropertyRef = PropertyRef('projectId', set_in_kwargs=True)
18
+ id: PropertyRef = PropertyRef("id", extra_index=True)
19
+ email: PropertyRef = PropertyRef("email", extra_index=True)
20
+ display_name: PropertyRef = PropertyRef("displayName")
21
+ oauth2_client_id: PropertyRef = PropertyRef("oauth2ClientId")
22
+ unique_id: PropertyRef = PropertyRef("uniqueId")
23
+ disabled: PropertyRef = PropertyRef("disabled")
24
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
25
+ project_id: PropertyRef = PropertyRef("projectId", set_in_kwargs=True)
26
26
 
27
27
 
28
28
  @dataclass(frozen=True)
29
29
  class GCPRoleNodeProperties(CartographyNodeProperties):
30
- id: PropertyRef = PropertyRef('name', extra_index=True)
31
- name: PropertyRef = PropertyRef('name', extra_index=True)
32
- title: PropertyRef = PropertyRef('title')
33
- description: PropertyRef = PropertyRef('description')
34
- deleted: PropertyRef = PropertyRef('deleted')
35
- etag: PropertyRef = PropertyRef('etag')
36
- permissions: PropertyRef = PropertyRef('includedPermissions')
37
- role_type: PropertyRef = PropertyRef('roleType')
38
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
39
- project_id: PropertyRef = PropertyRef('projectId', set_in_kwargs=True)
30
+ id: PropertyRef = PropertyRef("name", extra_index=True)
31
+ name: PropertyRef = PropertyRef("name", extra_index=True)
32
+ title: PropertyRef = PropertyRef("title")
33
+ description: PropertyRef = PropertyRef("description")
34
+ deleted: PropertyRef = PropertyRef("deleted")
35
+ etag: PropertyRef = PropertyRef("etag")
36
+ permissions: PropertyRef = PropertyRef("includedPermissions")
37
+ role_type: PropertyRef = PropertyRef("roleType")
38
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
39
+ project_id: PropertyRef = PropertyRef("projectId", set_in_kwargs=True)
40
40
 
41
41
 
42
42
  @dataclass(frozen=True)
43
43
  class GCPIAMToProjectRelProperties(CartographyRelProperties):
44
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
44
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
45
45
 
46
46
 
47
47
  @dataclass(frozen=True)
48
48
  # (:GCPUser|GCPServiceAccount|GCPRole)<-[:RESOURCE]-(:GCPProject)
49
49
  class GCPPrincipalToProject(CartographyRelSchema):
50
- target_node_label: str = 'GCPProject'
50
+ target_node_label: str = "GCPProject"
51
51
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
52
- {'id': PropertyRef('projectId', set_in_kwargs=True)},
52
+ {"id": PropertyRef("projectId", set_in_kwargs=True)},
53
53
  )
54
54
  direction: LinkDirection = LinkDirection.INWARD
55
55
  rel_label: str = "RESOURCE"
@@ -58,13 +58,13 @@ class GCPPrincipalToProject(CartographyRelSchema):
58
58
 
59
59
  @dataclass(frozen=True)
60
60
  class GCPServiceAccountSchema(CartographyNodeSchema):
61
- label: str = 'GCPServiceAccount'
61
+ label: str = "GCPServiceAccount"
62
62
  properties: GCPServiceAccountNodeProperties = GCPServiceAccountNodeProperties()
63
63
  sub_resource_relationship: GCPPrincipalToProject = GCPPrincipalToProject()
64
64
 
65
65
 
66
66
  @dataclass(frozen=True)
67
67
  class GCPRoleSchema(CartographyNodeSchema):
68
- label: str = 'GCPRole'
68
+ label: str = "GCPRole"
69
69
  properties: GCPRoleNodeProperties = GCPRoleNodeProperties()
70
70
  sub_resource_relationship: GCPPrincipalToProject = GCPPrincipalToProject()
@@ -4,6 +4,7 @@ This schema does not handle the org's relationships. Those are handled by other
4
4
  * GitHubUserSchema defines (GitHubUser)-[MEMBER_OF|ADMIN_OF|UNAFFILIATED]->(GitHubOrganization)
5
5
  (There may be others, these are just two examples.)
6
6
  """
7
+
7
8
  from dataclasses import dataclass
8
9
 
9
10
  from cartography.models.core.common import PropertyRef
@@ -13,14 +14,14 @@ from cartography.models.core.nodes import CartographyNodeSchema
13
14
 
14
15
  @dataclass(frozen=True)
15
16
  class GitHubOrganizationNodeProperties(CartographyNodeProperties):
16
- id: PropertyRef = PropertyRef('url')
17
- username: PropertyRef = PropertyRef('login', extra_index=True)
18
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
17
+ id: PropertyRef = PropertyRef("url")
18
+ username: PropertyRef = PropertyRef("login", extra_index=True)
19
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
19
20
 
20
21
 
21
22
  @dataclass(frozen=True)
22
23
  class GitHubOrganizationSchema(CartographyNodeSchema):
23
- label: str = 'GitHubOrganization'
24
+ label: str = "GitHubOrganization"
24
25
  properties: GitHubOrganizationNodeProperties = GitHubOrganizationNodeProperties()
25
26
  other_relationships = None
26
27
  sub_resource_relationship = None
@@ -13,23 +13,23 @@ from cartography.models.core.relationships import TargetNodeMatcher
13
13
 
14
14
  @dataclass(frozen=True)
15
15
  class GitHubTeamNodeProperties(CartographyNodeProperties):
16
- id: PropertyRef = PropertyRef('url')
17
- url: PropertyRef = PropertyRef('url')
18
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
19
- name: PropertyRef = PropertyRef('name', extra_index=True)
20
- description: PropertyRef = PropertyRef('description')
16
+ id: PropertyRef = PropertyRef("url")
17
+ url: PropertyRef = PropertyRef("url")
18
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
19
+ name: PropertyRef = PropertyRef("name", extra_index=True)
20
+ description: PropertyRef = PropertyRef("description")
21
21
 
22
22
 
23
23
  @dataclass(frozen=True)
24
24
  class GitHubTeamToRepoRelProperties(CartographyRelProperties):
25
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
25
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
26
26
 
27
27
 
28
28
  @dataclass(frozen=True)
29
29
  class GitHubTeamAdminRepoRel(CartographyRelSchema):
30
- target_node_label: str = 'GitHubRepository'
30
+ target_node_label: str = "GitHubRepository"
31
31
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
32
- {'id': PropertyRef('ADMIN')},
32
+ {"id": PropertyRef("ADMIN")},
33
33
  )
34
34
  direction: LinkDirection = LinkDirection.OUTWARD
35
35
  rel_label: str = "ADMIN"
@@ -38,9 +38,9 @@ class GitHubTeamAdminRepoRel(CartographyRelSchema):
38
38
 
39
39
  @dataclass(frozen=True)
40
40
  class GitHubTeamMaintainRepoRel(CartographyRelSchema):
41
- target_node_label: str = 'GitHubRepository'
41
+ target_node_label: str = "GitHubRepository"
42
42
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
43
- {'id': PropertyRef('MAINTAIN')},
43
+ {"id": PropertyRef("MAINTAIN")},
44
44
  )
45
45
  direction: LinkDirection = LinkDirection.OUTWARD
46
46
  rel_label: str = "MAINTAIN"
@@ -49,9 +49,9 @@ class GitHubTeamMaintainRepoRel(CartographyRelSchema):
49
49
 
50
50
  @dataclass(frozen=True)
51
51
  class GitHubTeamReadRepoRel(CartographyRelSchema):
52
- target_node_label: str = 'GitHubRepository'
52
+ target_node_label: str = "GitHubRepository"
53
53
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
54
- {'id': PropertyRef('READ')},
54
+ {"id": PropertyRef("READ")},
55
55
  )
56
56
  direction: LinkDirection = LinkDirection.OUTWARD
57
57
  rel_label: str = "READ"
@@ -60,9 +60,9 @@ class GitHubTeamReadRepoRel(CartographyRelSchema):
60
60
 
61
61
  @dataclass(frozen=True)
62
62
  class GitHubTeamTriageRepoRel(CartographyRelSchema):
63
- target_node_label: str = 'GitHubRepository'
63
+ target_node_label: str = "GitHubRepository"
64
64
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
65
- {'id': PropertyRef('TRIAGE')},
65
+ {"id": PropertyRef("TRIAGE")},
66
66
  )
67
67
  direction: LinkDirection = LinkDirection.OUTWARD
68
68
  rel_label: str = "TRIAGE"
@@ -71,9 +71,9 @@ class GitHubTeamTriageRepoRel(CartographyRelSchema):
71
71
 
72
72
  @dataclass(frozen=True)
73
73
  class GitHubTeamWriteRepoRel(CartographyRelSchema):
74
- target_node_label: str = 'GitHubRepository'
74
+ target_node_label: str = "GitHubRepository"
75
75
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
76
- {'id': PropertyRef('WRITE')},
76
+ {"id": PropertyRef("WRITE")},
77
77
  )
78
78
  direction: LinkDirection = LinkDirection.OUTWARD
79
79
  rel_label: str = "WRITE"
@@ -82,14 +82,14 @@ class GitHubTeamWriteRepoRel(CartographyRelSchema):
82
82
 
83
83
  @dataclass(frozen=True)
84
84
  class GitHubTeamToUserRelProperties(CartographyRelProperties):
85
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
85
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
86
86
 
87
87
 
88
88
  @dataclass(frozen=True)
89
89
  class GitHubTeamMaintainerUserRel(CartographyRelSchema):
90
- target_node_label: str = 'GitHubUser'
90
+ target_node_label: str = "GitHubUser"
91
91
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
92
- {'id': PropertyRef('MAINTAINER')},
92
+ {"id": PropertyRef("MAINTAINER")},
93
93
  )
94
94
  direction: LinkDirection = LinkDirection.INWARD
95
95
  rel_label: str = "MAINTAINER"
@@ -98,9 +98,9 @@ class GitHubTeamMaintainerUserRel(CartographyRelSchema):
98
98
 
99
99
  @dataclass(frozen=True)
100
100
  class GitHubTeamMemberUserRel(CartographyRelSchema):
101
- target_node_label: str = 'GitHubUser'
101
+ target_node_label: str = "GitHubUser"
102
102
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
103
- {'id': PropertyRef('MEMBER')},
103
+ {"id": PropertyRef("MEMBER")},
104
104
  )
105
105
  direction: LinkDirection = LinkDirection.INWARD
106
106
  rel_label: str = "MEMBER"
@@ -109,39 +109,43 @@ class GitHubTeamMemberUserRel(CartographyRelSchema):
109
109
 
110
110
  @dataclass(frozen=True)
111
111
  class GitHubTeamToOrganizationRelProperties(CartographyRelProperties):
112
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
112
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
113
113
 
114
114
 
115
115
  @dataclass(frozen=True)
116
116
  class GitHubTeamToOrganizationRel(CartographyRelSchema):
117
- target_node_label: str = 'GitHubOrganization'
117
+ target_node_label: str = "GitHubOrganization"
118
118
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
119
- {'id': PropertyRef('org_url', set_in_kwargs=True)},
119
+ {"id": PropertyRef("org_url", set_in_kwargs=True)},
120
120
  )
121
121
  direction: LinkDirection = LinkDirection.INWARD
122
122
  rel_label: str = "RESOURCE"
123
- properties: GitHubTeamToOrganizationRelProperties = GitHubTeamToOrganizationRelProperties()
123
+ properties: GitHubTeamToOrganizationRelProperties = (
124
+ GitHubTeamToOrganizationRelProperties()
125
+ )
124
126
 
125
127
 
126
128
  @dataclass(frozen=True)
127
129
  class GitHubTeamToChildTeamRelProperties(CartographyRelProperties):
128
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
130
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
129
131
 
130
132
 
131
133
  @dataclass(frozen=True)
132
134
  class GitHubTeamChildTeamRel(CartographyRelSchema):
133
- target_node_label: str = 'GitHubTeam'
135
+ target_node_label: str = "GitHubTeam"
134
136
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
135
- {'id': PropertyRef('MEMBER_OF_TEAM')},
137
+ {"id": PropertyRef("MEMBER_OF_TEAM")},
136
138
  )
137
139
  direction: LinkDirection = LinkDirection.INWARD
138
140
  rel_label: str = "MEMBER_OF_TEAM"
139
- properties: GitHubTeamToChildTeamRelProperties = GitHubTeamToChildTeamRelProperties()
141
+ properties: GitHubTeamToChildTeamRelProperties = (
142
+ GitHubTeamToChildTeamRelProperties()
143
+ )
140
144
 
141
145
 
142
146
  @dataclass(frozen=True)
143
147
  class GitHubTeamSchema(CartographyNodeSchema):
144
- label: str = 'GitHubTeam'
148
+ label: str = "GitHubTeam"
145
149
  properties: GitHubTeamNodeProperties = GitHubTeamNodeProperties()
146
150
  other_relationships: OtherRelationships = OtherRelationships(
147
151
  [
@@ -155,4 +159,6 @@ class GitHubTeamSchema(CartographyNodeSchema):
155
159
  GitHubTeamChildTeamRel(),
156
160
  ],
157
161
  )
158
- sub_resource_relationship: GitHubTeamToOrganizationRel = GitHubTeamToOrganizationRel()
162
+ sub_resource_relationship: GitHubTeamToOrganizationRel = (
163
+ GitHubTeamToOrganizationRel()
164
+ )
@@ -27,6 +27,7 @@ The main importance of having two schemas is to allow the two sets of users to b
27
27
  an unaffiliated user, but the user already exists in the graph (perhaps they are members of another GitHub orgs for
28
28
  example), then loading the unaffiliated user will not blank out the 'has_2fa_enabled' property.
29
29
  """
30
+
30
31
  from dataclasses import dataclass
31
32
 
32
33
  from cartography.models.core.common import PropertyRef
@@ -43,20 +44,20 @@ from cartography.models.core.relationships import TargetNodeMatcher
43
44
  @dataclass(frozen=True)
44
45
  class BaseGitHubUserNodeProperties(CartographyNodeProperties):
45
46
  # core properties in all GitHubUser nodes
46
- id: PropertyRef = PropertyRef('url')
47
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
48
- fullname: PropertyRef = PropertyRef('name')
49
- username: PropertyRef = PropertyRef('login', extra_index=True)
50
- is_site_admin: PropertyRef = PropertyRef('isSiteAdmin')
51
- is_enterprise_owner: PropertyRef = PropertyRef('isEnterpriseOwner')
52
- email: PropertyRef = PropertyRef('email')
53
- company: PropertyRef = PropertyRef('company')
47
+ id: PropertyRef = PropertyRef("url")
48
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
49
+ fullname: PropertyRef = PropertyRef("name")
50
+ username: PropertyRef = PropertyRef("login", extra_index=True)
51
+ is_site_admin: PropertyRef = PropertyRef("isSiteAdmin")
52
+ is_enterprise_owner: PropertyRef = PropertyRef("isEnterpriseOwner")
53
+ email: PropertyRef = PropertyRef("email")
54
+ company: PropertyRef = PropertyRef("company")
54
55
 
55
56
 
56
57
  @dataclass(frozen=True)
57
58
  class GitHubOrganizationUserNodeProperties(BaseGitHubUserNodeProperties):
58
59
  # specified for affiliated users only. The GitHub api does not return this property for unaffiliated users.
59
- has_2fa_enabled: PropertyRef = PropertyRef('hasTwoFactorEnabled')
60
+ has_2fa_enabled: PropertyRef = PropertyRef("hasTwoFactorEnabled")
60
61
 
61
62
 
62
63
  @dataclass(frozen=True)
@@ -67,46 +68,54 @@ class GitHubUnaffiliatedUserNodeProperties(BaseGitHubUserNodeProperties):
67
68
 
68
69
  @dataclass(frozen=True)
69
70
  class GitHubUserToOrganizationRelProperties(CartographyRelProperties):
70
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
71
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
71
72
 
72
73
 
73
74
  @dataclass(frozen=True)
74
75
  class GitHubUserMemberOfOrganizationRel(CartographyRelSchema):
75
- target_node_label: str = 'GitHubOrganization'
76
+ target_node_label: str = "GitHubOrganization"
76
77
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
77
- {'id': PropertyRef('MEMBER_OF')},
78
+ {"id": PropertyRef("MEMBER_OF")},
78
79
  )
79
80
  direction: LinkDirection = LinkDirection.OUTWARD
80
81
  rel_label: str = "MEMBER_OF"
81
- properties: GitHubUserToOrganizationRelProperties = GitHubUserToOrganizationRelProperties()
82
+ properties: GitHubUserToOrganizationRelProperties = (
83
+ GitHubUserToOrganizationRelProperties()
84
+ )
82
85
 
83
86
 
84
87
  @dataclass(frozen=True)
85
88
  class GitHubUserAdminOfOrganizationRel(CartographyRelSchema):
86
- target_node_label: str = 'GitHubOrganization'
89
+ target_node_label: str = "GitHubOrganization"
87
90
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
88
- {'id': PropertyRef('ADMIN_OF')},
91
+ {"id": PropertyRef("ADMIN_OF")},
89
92
  )
90
93
  direction: LinkDirection = LinkDirection.OUTWARD
91
94
  rel_label: str = "ADMIN_OF"
92
- properties: GitHubUserToOrganizationRelProperties = GitHubUserToOrganizationRelProperties()
95
+ properties: GitHubUserToOrganizationRelProperties = (
96
+ GitHubUserToOrganizationRelProperties()
97
+ )
93
98
 
94
99
 
95
100
  @dataclass(frozen=True)
96
101
  class GitHubUserUnaffiliatedOrganizationRel(CartographyRelSchema):
97
- target_node_label: str = 'GitHubOrganization'
102
+ target_node_label: str = "GitHubOrganization"
98
103
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
99
- {'id': PropertyRef('UNAFFILIATED')},
104
+ {"id": PropertyRef("UNAFFILIATED")},
100
105
  )
101
106
  direction: LinkDirection = LinkDirection.OUTWARD
102
107
  rel_label: str = "UNAFFILIATED"
103
- properties: GitHubUserToOrganizationRelProperties = GitHubUserToOrganizationRelProperties()
108
+ properties: GitHubUserToOrganizationRelProperties = (
109
+ GitHubUserToOrganizationRelProperties()
110
+ )
104
111
 
105
112
 
106
113
  @dataclass(frozen=True)
107
114
  class GitHubOrganizationUserSchema(CartographyNodeSchema):
108
- label: str = 'GitHubUser'
109
- properties: GitHubOrganizationUserNodeProperties = GitHubOrganizationUserNodeProperties()
115
+ label: str = "GitHubUser"
116
+ properties: GitHubOrganizationUserNodeProperties = (
117
+ GitHubOrganizationUserNodeProperties()
118
+ )
110
119
  other_relationships: OtherRelationships = OtherRelationships(
111
120
  [
112
121
  GitHubUserMemberOfOrganizationRel(),
@@ -118,8 +127,10 @@ class GitHubOrganizationUserSchema(CartographyNodeSchema):
118
127
 
119
128
  @dataclass(frozen=True)
120
129
  class GitHubUnaffiliatedUserSchema(CartographyNodeSchema):
121
- label: str = 'GitHubUser'
122
- properties: GitHubUnaffiliatedUserNodeProperties = GitHubUnaffiliatedUserNodeProperties()
130
+ label: str = "GitHubUser"
131
+ properties: GitHubUnaffiliatedUserNodeProperties = (
132
+ GitHubUnaffiliatedUserNodeProperties()
133
+ )
123
134
  other_relationships: OtherRelationships = OtherRelationships(
124
135
  [
125
136
  GitHubUserUnaffiliatedOrganizationRel(),
@@ -12,37 +12,43 @@ from cartography.models.core.relationships import TargetNodeMatcher
12
12
 
13
13
  @dataclass(frozen=True)
14
14
  class KandjiDeviceNodeProperties(CartographyNodeProperties):
15
- id: PropertyRef = PropertyRef('id')
16
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
15
+ id: PropertyRef = PropertyRef("id")
16
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
17
17
 
18
- device_id: PropertyRef = PropertyRef('device_id')
19
- device_name: PropertyRef = PropertyRef('device_name')
20
- last_check_in: PropertyRef = PropertyRef('last_check_in')
21
- model: PropertyRef = PropertyRef('model')
22
- os_version: PropertyRef = PropertyRef('os_version')
23
- platform: PropertyRef = PropertyRef('platform')
24
- serial_number: PropertyRef = PropertyRef('serial_number', extra_index=True)
18
+ device_id: PropertyRef = PropertyRef("device_id")
19
+ device_name: PropertyRef = PropertyRef("device_name")
20
+ last_check_in: PropertyRef = PropertyRef("last_check_in")
21
+ model: PropertyRef = PropertyRef("model")
22
+ os_version: PropertyRef = PropertyRef("os_version")
23
+ platform: PropertyRef = PropertyRef("platform")
24
+ serial_number: PropertyRef = PropertyRef("serial_number", extra_index=True)
25
25
 
26
26
 
27
27
  @dataclass(frozen=True)
28
28
  class KandjiTenantToKandjiDeviceRelProperties(CartographyRelProperties):
29
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
29
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
30
30
 
31
31
 
32
32
  @dataclass(frozen=True)
33
33
  # (:KandjiDevice)-[:ENROLLED_TO]->(:KandjiTenant)
34
34
  class KandjiTenantToKandjiDeviceRel(CartographyRelSchema):
35
- target_node_label: str = 'KandjiTenant'
35
+ target_node_label: str = "KandjiTenant"
36
36
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
37
- {'id': PropertyRef('TENANT_ID', set_in_kwargs=True)},
37
+ {"id": PropertyRef("TENANT_ID", set_in_kwargs=True)},
38
38
  )
39
39
  direction: LinkDirection = LinkDirection.OUTWARD
40
40
  rel_label: str = "ENROLLED_TO"
41
- properties: KandjiTenantToKandjiDeviceRelProperties = KandjiTenantToKandjiDeviceRelProperties()
41
+ properties: KandjiTenantToKandjiDeviceRelProperties = (
42
+ KandjiTenantToKandjiDeviceRelProperties()
43
+ )
42
44
 
43
45
 
44
46
  @dataclass(frozen=True)
45
47
  class KandjiDeviceSchema(CartographyNodeSchema):
46
- label: str = 'KandjiDevice' # The label of the node
47
- properties: KandjiDeviceNodeProperties = KandjiDeviceNodeProperties() # An object representing all properties
48
- sub_resource_relationship: KandjiTenantToKandjiDeviceRel = KandjiTenantToKandjiDeviceRel()
48
+ label: str = "KandjiDevice" # The label of the node
49
+ properties: KandjiDeviceNodeProperties = (
50
+ KandjiDeviceNodeProperties()
51
+ ) # An object representing all properties
52
+ sub_resource_relationship: KandjiTenantToKandjiDeviceRel = (
53
+ KandjiTenantToKandjiDeviceRel()
54
+ )
@@ -7,11 +7,13 @@ from cartography.models.core.nodes import CartographyNodeSchema
7
7
 
8
8
  @dataclass(frozen=True)
9
9
  class KandjiTenantNodeProperties(CartographyNodeProperties):
10
- id: PropertyRef = PropertyRef('id')
11
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
10
+ id: PropertyRef = PropertyRef("id")
11
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
12
12
 
13
13
 
14
14
  @dataclass(frozen=True)
15
15
  class KandjiTenantSchema(CartographyNodeSchema):
16
- label: str = 'KandjiTenant' # The label of the node
17
- properties: KandjiTenantNodeProperties = KandjiTenantNodeProperties() # An object representing all properties
16
+ label: str = "KandjiTenant" # The label of the node
17
+ properties: KandjiTenantNodeProperties = (
18
+ KandjiTenantNodeProperties()
19
+ ) # An object representing all properties
@@ -7,11 +7,11 @@ from cartography.models.core.nodes import CartographyNodeSchema
7
7
 
8
8
  @dataclass(frozen=True)
9
9
  class LastpassTenantNodeProperties(CartographyNodeProperties):
10
- id: PropertyRef = PropertyRef('id')
11
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
10
+ id: PropertyRef = PropertyRef("id")
11
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
12
12
 
13
13
 
14
14
  @dataclass(frozen=True)
15
15
  class LastpassTenantSchema(CartographyNodeSchema):
16
- label: str = 'LastpassTenant'
16
+ label: str = "LastpassTenant"
17
17
  properties: LastpassTenantNodeProperties = LastpassTenantNodeProperties()