cartography 0.104.0rc3__py3-none-any.whl → 0.106.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.

Potentially problematic release.


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

Files changed (134) hide show
  1. cartography/_version.py +2 -2
  2. cartography/cli.py +104 -3
  3. cartography/client/aws/__init__.py +19 -0
  4. cartography/client/aws/ecr.py +51 -0
  5. cartography/client/core/tx.py +62 -0
  6. cartography/config.py +32 -0
  7. cartography/data/indexes.cypher +0 -37
  8. cartography/data/jobs/cleanup/aws_import_lambda_cleanup.json +1 -1
  9. cartography/driftdetect/cli.py +3 -2
  10. cartography/graph/cleanupbuilder.py +198 -41
  11. cartography/graph/job.py +42 -0
  12. cartography/graph/querybuilder.py +136 -2
  13. cartography/graph/statement.py +1 -1
  14. cartography/intel/airbyte/__init__.py +105 -0
  15. cartography/intel/airbyte/connections.py +120 -0
  16. cartography/intel/airbyte/destinations.py +81 -0
  17. cartography/intel/airbyte/organizations.py +59 -0
  18. cartography/intel/airbyte/sources.py +78 -0
  19. cartography/intel/airbyte/tags.py +64 -0
  20. cartography/intel/airbyte/users.py +106 -0
  21. cartography/intel/airbyte/util.py +122 -0
  22. cartography/intel/airbyte/workspaces.py +63 -0
  23. cartography/intel/aws/acm.py +124 -0
  24. cartography/intel/aws/cloudtrail.py +3 -38
  25. cartography/intel/aws/codebuild.py +132 -0
  26. cartography/intel/aws/ecr.py +8 -2
  27. cartography/intel/aws/ecs.py +228 -380
  28. cartography/intel/aws/efs.py +179 -11
  29. cartography/intel/aws/iam.py +1 -1
  30. cartography/intel/aws/identitycenter.py +14 -3
  31. cartography/intel/aws/inspector.py +96 -53
  32. cartography/intel/aws/lambda_function.py +1 -1
  33. cartography/intel/aws/rds.py +2 -1
  34. cartography/intel/aws/resources.py +4 -0
  35. cartography/intel/aws/s3.py +195 -4
  36. cartography/intel/aws/sqs.py +36 -90
  37. cartography/intel/entra/__init__.py +22 -0
  38. cartography/intel/entra/applications.py +366 -0
  39. cartography/intel/entra/groups.py +151 -0
  40. cartography/intel/entra/ou.py +21 -5
  41. cartography/intel/entra/users.py +84 -42
  42. cartography/intel/kubernetes/__init__.py +30 -14
  43. cartography/intel/kubernetes/clusters.py +86 -0
  44. cartography/intel/kubernetes/namespaces.py +59 -57
  45. cartography/intel/kubernetes/pods.py +140 -77
  46. cartography/intel/kubernetes/secrets.py +95 -45
  47. cartography/intel/kubernetes/services.py +131 -67
  48. cartography/intel/kubernetes/util.py +125 -14
  49. cartography/intel/scaleway/__init__.py +127 -0
  50. cartography/intel/scaleway/iam/__init__.py +0 -0
  51. cartography/intel/scaleway/iam/apikeys.py +71 -0
  52. cartography/intel/scaleway/iam/applications.py +71 -0
  53. cartography/intel/scaleway/iam/groups.py +71 -0
  54. cartography/intel/scaleway/iam/users.py +71 -0
  55. cartography/intel/scaleway/instances/__init__.py +0 -0
  56. cartography/intel/scaleway/instances/flexibleips.py +86 -0
  57. cartography/intel/scaleway/instances/instances.py +92 -0
  58. cartography/intel/scaleway/projects.py +79 -0
  59. cartography/intel/scaleway/storage/__init__.py +0 -0
  60. cartography/intel/scaleway/storage/snapshots.py +86 -0
  61. cartography/intel/scaleway/storage/volumes.py +84 -0
  62. cartography/intel/scaleway/utils.py +37 -0
  63. cartography/intel/trivy/__init__.py +161 -0
  64. cartography/intel/trivy/scanner.py +363 -0
  65. cartography/models/airbyte/__init__.py +0 -0
  66. cartography/models/airbyte/connection.py +138 -0
  67. cartography/models/airbyte/destination.py +75 -0
  68. cartography/models/airbyte/organization.py +19 -0
  69. cartography/models/airbyte/source.py +75 -0
  70. cartography/models/airbyte/stream.py +74 -0
  71. cartography/models/airbyte/tag.py +69 -0
  72. cartography/models/airbyte/user.py +111 -0
  73. cartography/models/airbyte/workspace.py +46 -0
  74. cartography/models/aws/acm/__init__.py +0 -0
  75. cartography/models/aws/acm/certificate.py +75 -0
  76. cartography/models/aws/cloudtrail/trail.py +24 -0
  77. cartography/models/aws/codebuild/__init__.py +0 -0
  78. cartography/models/aws/codebuild/project.py +49 -0
  79. cartography/models/aws/ecs/__init__.py +0 -0
  80. cartography/models/aws/ecs/clusters.py +64 -0
  81. cartography/models/aws/ecs/container_definitions.py +93 -0
  82. cartography/models/aws/ecs/container_instances.py +84 -0
  83. cartography/models/aws/ecs/containers.py +99 -0
  84. cartography/models/aws/ecs/services.py +117 -0
  85. cartography/models/aws/ecs/task_definitions.py +135 -0
  86. cartography/models/aws/ecs/tasks.py +110 -0
  87. cartography/models/aws/efs/access_point.py +77 -0
  88. cartography/models/aws/efs/file_system.py +60 -0
  89. cartography/models/aws/efs/mount_target.py +29 -2
  90. cartography/models/aws/s3/notification.py +24 -0
  91. cartography/models/aws/secretsmanager/secret_version.py +0 -2
  92. cartography/models/aws/sqs/__init__.py +0 -0
  93. cartography/models/aws/sqs/queue.py +89 -0
  94. cartography/models/core/common.py +1 -0
  95. cartography/models/core/nodes.py +15 -2
  96. cartography/models/core/relationships.py +44 -0
  97. cartography/models/entra/app_role_assignment.py +115 -0
  98. cartography/models/entra/application.py +47 -0
  99. cartography/models/entra/group.py +91 -0
  100. cartography/models/entra/user.py +17 -51
  101. cartography/models/kubernetes/__init__.py +0 -0
  102. cartography/models/kubernetes/clusters.py +26 -0
  103. cartography/models/kubernetes/containers.py +108 -0
  104. cartography/models/kubernetes/namespaces.py +51 -0
  105. cartography/models/kubernetes/pods.py +80 -0
  106. cartography/models/kubernetes/secrets.py +79 -0
  107. cartography/models/kubernetes/services.py +108 -0
  108. cartography/models/scaleway/__init__.py +0 -0
  109. cartography/models/scaleway/iam/__init__.py +0 -0
  110. cartography/models/scaleway/iam/apikey.py +96 -0
  111. cartography/models/scaleway/iam/application.py +52 -0
  112. cartography/models/scaleway/iam/group.py +95 -0
  113. cartography/models/scaleway/iam/user.py +60 -0
  114. cartography/models/scaleway/instance/__init__.py +0 -0
  115. cartography/models/scaleway/instance/flexibleip.py +52 -0
  116. cartography/models/scaleway/instance/instance.py +118 -0
  117. cartography/models/scaleway/organization.py +19 -0
  118. cartography/models/scaleway/project.py +48 -0
  119. cartography/models/scaleway/storage/__init__.py +0 -0
  120. cartography/models/scaleway/storage/snapshot.py +78 -0
  121. cartography/models/scaleway/storage/volume.py +51 -0
  122. cartography/models/trivy/__init__.py +0 -0
  123. cartography/models/trivy/findings.py +66 -0
  124. cartography/models/trivy/fix.py +66 -0
  125. cartography/models/trivy/package.py +71 -0
  126. cartography/sync.py +10 -4
  127. cartography/util.py +15 -10
  128. {cartography-0.104.0rc3.dist-info → cartography-0.106.0.dist-info}/METADATA +6 -2
  129. {cartography-0.104.0rc3.dist-info → cartography-0.106.0.dist-info}/RECORD +133 -49
  130. cartography/data/jobs/cleanup/kubernetes_import_cleanup.json +0 -70
  131. {cartography-0.104.0rc3.dist-info → cartography-0.106.0.dist-info}/WHEEL +0 -0
  132. {cartography-0.104.0rc3.dist-info → cartography-0.106.0.dist-info}/entry_points.txt +0 -0
  133. {cartography-0.104.0rc3.dist-info → cartography-0.106.0.dist-info}/licenses/LICENSE +0 -0
  134. {cartography-0.104.0rc3.dist-info → cartography-0.106.0.dist-info}/top_level.txt +0 -0
@@ -9,6 +9,10 @@ from cartography.models.core.relationships import LinkDirection
9
9
  from cartography.models.core.relationships import make_target_node_matcher
10
10
  from cartography.models.core.relationships import TargetNodeMatcher
11
11
 
12
+ # The user resource in Microsoft Graph exposes hundreds of properties but, in
13
+ # practice, only a small subset is populated in most tenants. We deliberately
14
+ # model *just* the commonly-used attributes to keep the graph lean.
15
+
12
16
 
13
17
  @dataclass(frozen=True)
14
18
  class EntraUserNodeProperties(CartographyNodeProperties):
@@ -17,61 +21,23 @@ class EntraUserNodeProperties(CartographyNodeProperties):
17
21
  display_name: PropertyRef = PropertyRef("display_name")
18
22
  given_name: PropertyRef = PropertyRef("given_name")
19
23
  surname: PropertyRef = PropertyRef("surname")
20
- # The underlying datatype calls this 'mail' but everything else in cartography uses 'email'
24
+ # The SDK calls this `mail`; we surface it as `email` like the rest of Cartography
21
25
  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")
26
+ mobile_phone: PropertyRef = PropertyRef("mobile_phone")
27
+ business_phones: PropertyRef = PropertyRef("business_phones")
28
+ job_title: PropertyRef = PropertyRef("job_title")
41
29
  department: PropertyRef = PropertyRef("department")
30
+ company_name: PropertyRef = PropertyRef("company_name")
31
+ office_location: PropertyRef = PropertyRef("office_location")
42
32
  employee_id: PropertyRef = PropertyRef("employee_id")
43
33
  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
- )
34
+ city: PropertyRef = PropertyRef("city")
35
+ state: PropertyRef = PropertyRef("state")
36
+ country: PropertyRef = PropertyRef("country")
37
+ preferred_language: PropertyRef = PropertyRef("preferred_language")
38
+ account_enabled: PropertyRef = PropertyRef("account_enabled")
39
+ age_group: PropertyRef = PropertyRef("age_group")
40
+ manager_id: PropertyRef = PropertyRef("manager_id")
75
41
  lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
76
42
 
77
43
 
File without changes
@@ -0,0 +1,26 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+
7
+
8
+ @dataclass(frozen=True)
9
+ class KubernetesClusterNodeProperties(CartographyNodeProperties):
10
+ id: PropertyRef = PropertyRef("id")
11
+ name: PropertyRef = PropertyRef("name", extra_index=True)
12
+ creation_timestamp: PropertyRef = PropertyRef("creation_timestamp")
13
+ external_id: PropertyRef = PropertyRef("external_id", extra_index=True)
14
+ version: PropertyRef = PropertyRef("git_version")
15
+ version_major: PropertyRef = PropertyRef("version_major")
16
+ version_minor: PropertyRef = PropertyRef("version_minor")
17
+ go_version: PropertyRef = PropertyRef("go_version")
18
+ compiler: PropertyRef = PropertyRef("compiler")
19
+ platform: PropertyRef = PropertyRef("platform")
20
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
21
+
22
+
23
+ @dataclass(frozen=True)
24
+ class KubernetesClusterSchema(CartographyNodeSchema):
25
+ label: str = "KubernetesCluster"
26
+ properties: KubernetesClusterNodeProperties = KubernetesClusterNodeProperties()
@@ -0,0 +1,108 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.relationships import CartographyRelProperties
7
+ from cartography.models.core.relationships import CartographyRelSchema
8
+ from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_target_node_matcher
10
+ from cartography.models.core.relationships import OtherRelationships
11
+ from cartography.models.core.relationships import TargetNodeMatcher
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class KubernetesContainerNodeProperties(CartographyNodeProperties):
16
+ id: PropertyRef = PropertyRef("uid")
17
+ name: PropertyRef = PropertyRef("name", extra_index=True)
18
+ image: PropertyRef = PropertyRef("image", extra_index=True)
19
+ namespace: PropertyRef = PropertyRef("namespace", extra_index=True)
20
+ cluster_name: PropertyRef = PropertyRef(
21
+ "CLUSTER_NAME", set_in_kwargs=True, extra_index=True
22
+ )
23
+ image_pull_policy: PropertyRef = PropertyRef("image_pull_policy")
24
+ status_image_id: PropertyRef = PropertyRef("status_image_id")
25
+ status_image_sha: PropertyRef = PropertyRef("status_image_sha")
26
+ status_ready: PropertyRef = PropertyRef("status_ready")
27
+ status_started: PropertyRef = PropertyRef("status_started")
28
+ status_state: PropertyRef = PropertyRef("status_state")
29
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
30
+
31
+
32
+ @dataclass(frozen=True)
33
+ class KubernetesContainerToKubernetesNamespaceRelProperties(CartographyRelProperties):
34
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
35
+
36
+
37
+ @dataclass(frozen=True)
38
+ class KubernetesContainerToKubernetesPodRelProperties(CartographyRelProperties):
39
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
40
+
41
+
42
+ @dataclass(frozen=True)
43
+ # (:KubernetesContainer)<-[:CONTAINS]-(:KubernetesNamespace)
44
+ class KubernetesContainerToKubernetesNamespaceRel(CartographyRelSchema):
45
+ target_node_label: str = "KubernetesNamespace"
46
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
47
+ {
48
+ "cluster_name": PropertyRef("CLUSTER_NAME", set_in_kwargs=True),
49
+ "name": PropertyRef("namespace"),
50
+ }
51
+ )
52
+ direction: LinkDirection = LinkDirection.INWARD
53
+ rel_label: str = "CONTAINS"
54
+ properties: KubernetesContainerToKubernetesNamespaceRelProperties = (
55
+ KubernetesContainerToKubernetesNamespaceRelProperties()
56
+ )
57
+
58
+
59
+ @dataclass(frozen=True)
60
+ # (:KubernetesContainer)<-[:CONTAINS]-(:KubernetesPod)
61
+ class KubernetesContainerToKubernetesPodRel(CartographyRelSchema):
62
+ target_node_label: str = "KubernetesPod"
63
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
64
+ {
65
+ "cluster_name": PropertyRef("CLUSTER_NAME", set_in_kwargs=True),
66
+ "namespace": PropertyRef("namespace"),
67
+ "id": PropertyRef("pod_id"),
68
+ }
69
+ )
70
+ direction: LinkDirection = LinkDirection.INWARD
71
+ rel_label: str = "CONTAINS"
72
+ properties: KubernetesContainerToKubernetesPodRelProperties = (
73
+ KubernetesContainerToKubernetesPodRelProperties()
74
+ )
75
+
76
+
77
+ @dataclass(frozen=True)
78
+ class KubernetesContainerToKubernetesClusterRelProperties(CartographyRelProperties):
79
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
80
+
81
+
82
+ @dataclass(frozen=True)
83
+ # (:KubernetesContainer)<-[:RESOURCE]-(:KubernetesCluster)
84
+ class KubernetesContainerToKubernetesClusterRel(CartographyRelSchema):
85
+ target_node_label: str = "KubernetesCluster"
86
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
87
+ {"id": PropertyRef("CLUSTER_ID", set_in_kwargs=True)}
88
+ )
89
+ direction: LinkDirection = LinkDirection.INWARD
90
+ rel_label: str = "RESOURCE"
91
+ properties: KubernetesContainerToKubernetesClusterRelProperties = (
92
+ KubernetesContainerToKubernetesClusterRelProperties()
93
+ )
94
+
95
+
96
+ @dataclass(frozen=True)
97
+ class KubernetesContainerSchema(CartographyNodeSchema):
98
+ label: str = "KubernetesContainer"
99
+ properties: KubernetesContainerNodeProperties = KubernetesContainerNodeProperties()
100
+ sub_resource_relationship: KubernetesContainerToKubernetesClusterRel = (
101
+ KubernetesContainerToKubernetesClusterRel()
102
+ )
103
+ other_relationships: OtherRelationships = OtherRelationships(
104
+ [
105
+ KubernetesContainerToKubernetesNamespaceRel(),
106
+ KubernetesContainerToKubernetesPodRel(),
107
+ ]
108
+ )
@@ -0,0 +1,51 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.relationships import CartographyRelProperties
7
+ from cartography.models.core.relationships import CartographyRelSchema
8
+ from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_target_node_matcher
10
+ from cartography.models.core.relationships import TargetNodeMatcher
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class KubernetesNamespaceNodeProperties(CartographyNodeProperties):
15
+ id: PropertyRef = PropertyRef("uid")
16
+ name: PropertyRef = PropertyRef("name", extra_index=True)
17
+ creation_timestamp: PropertyRef = PropertyRef("creation_timestamp")
18
+ deletion_timestamp: PropertyRef = PropertyRef("deletion_timestamp")
19
+ status_phase: PropertyRef = PropertyRef("status_phase")
20
+ cluster_name: PropertyRef = PropertyRef(
21
+ "cluster_name", set_in_kwargs=True, extra_index=True
22
+ )
23
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
24
+
25
+
26
+ @dataclass(frozen=True)
27
+ class KubernetesNamespaceToKubernetesClusterRelProperties(CartographyRelProperties):
28
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
29
+
30
+
31
+ @dataclass(frozen=True)
32
+ # (:KubernetesNamespace)<-[:RESOURCE]-(:KubernetesCluster)
33
+ class KubernetesNamespaceToKubernetesClusterRel(CartographyRelSchema):
34
+ target_node_label: str = "KubernetesCluster"
35
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
36
+ {"id": PropertyRef("CLUSTER_ID", set_in_kwargs=True)},
37
+ )
38
+ direction: LinkDirection = LinkDirection.INWARD
39
+ rel_label: str = "RESOURCE"
40
+ properties: KubernetesNamespaceToKubernetesClusterRelProperties = (
41
+ KubernetesNamespaceToKubernetesClusterRelProperties()
42
+ )
43
+
44
+
45
+ @dataclass(frozen=True)
46
+ class KubernetesNamespaceSchema(CartographyNodeSchema):
47
+ label: str = "KubernetesNamespace"
48
+ properties: KubernetesNamespaceNodeProperties = KubernetesNamespaceNodeProperties()
49
+ sub_resource_relationship: KubernetesNamespaceToKubernetesClusterRel = (
50
+ KubernetesNamespaceToKubernetesClusterRel()
51
+ )
@@ -0,0 +1,80 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.relationships import CartographyRelProperties
7
+ from cartography.models.core.relationships import CartographyRelSchema
8
+ from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_target_node_matcher
10
+ from cartography.models.core.relationships import OtherRelationships
11
+ from cartography.models.core.relationships import TargetNodeMatcher
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class KubernetesPodNodeProperties(CartographyNodeProperties):
16
+ id: PropertyRef = PropertyRef("uid")
17
+ name: PropertyRef = PropertyRef("name", extra_index=True)
18
+ status_phase: PropertyRef = PropertyRef("status_phase")
19
+ creation_timestamp: PropertyRef = PropertyRef("creation_timestamp")
20
+ deletion_timestamp: PropertyRef = PropertyRef("deletion_timestamp")
21
+ namespace: PropertyRef = PropertyRef("namespace", extra_index=True)
22
+ labels: PropertyRef = PropertyRef("labels")
23
+ cluster_name: PropertyRef = PropertyRef(
24
+ "CLUSTER_NAME", set_in_kwargs=True, extra_index=True
25
+ )
26
+ node: PropertyRef = PropertyRef("node")
27
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
28
+
29
+
30
+ @dataclass(frozen=True)
31
+ class KubernetesPodToKubernetesNamespaceRelProperties(CartographyRelProperties):
32
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
33
+
34
+
35
+ @dataclass(frozen=True)
36
+ # (:KubernetesPod)<-[:CONTAINS]-(:KubernetesNamespace)
37
+ class KubernetesPodToKubernetesNamespaceRel(CartographyRelSchema):
38
+ target_node_label: str = "KubernetesNamespace"
39
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
40
+ {
41
+ "cluster_name": PropertyRef("CLUSTER_NAME", set_in_kwargs=True),
42
+ "name": PropertyRef("namespace"),
43
+ }
44
+ )
45
+ direction: LinkDirection = LinkDirection.INWARD
46
+ rel_label: str = "CONTAINS"
47
+ properties: KubernetesPodToKubernetesNamespaceRelProperties = (
48
+ KubernetesPodToKubernetesNamespaceRelProperties()
49
+ )
50
+
51
+
52
+ @dataclass(frozen=True)
53
+ class KubernetesPodToKubernetesClusterRelProperties(CartographyRelProperties):
54
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
55
+
56
+
57
+ @dataclass(frozen=True)
58
+ # (:KubernetesPod)<-[:RESOURCE]-(:KubernetesCluster)
59
+ class KubernetesPodToKubernetesClusterRel(CartographyRelSchema):
60
+ target_node_label: str = "KubernetesCluster"
61
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
62
+ {"id": PropertyRef("CLUSTER_ID", set_in_kwargs=True)}
63
+ )
64
+ direction: LinkDirection = LinkDirection.INWARD
65
+ rel_label: str = "RESOURCE"
66
+ properties: KubernetesPodToKubernetesClusterRelProperties = (
67
+ KubernetesPodToKubernetesClusterRelProperties()
68
+ )
69
+
70
+
71
+ @dataclass(frozen=True)
72
+ class KubernetesPodSchema(CartographyNodeSchema):
73
+ label: str = "KubernetesPod"
74
+ properties: KubernetesPodNodeProperties = KubernetesPodNodeProperties()
75
+ sub_resource_relationship: KubernetesPodToKubernetesClusterRel = (
76
+ KubernetesPodToKubernetesClusterRel()
77
+ )
78
+ other_relationships: OtherRelationships = OtherRelationships(
79
+ [KubernetesPodToKubernetesNamespaceRel()]
80
+ )
@@ -0,0 +1,79 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.relationships import CartographyRelProperties
7
+ from cartography.models.core.relationships import CartographyRelSchema
8
+ from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_target_node_matcher
10
+ from cartography.models.core.relationships import OtherRelationships
11
+ from cartography.models.core.relationships import TargetNodeMatcher
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class KubernetesSecretNodeProperties(CartographyNodeProperties):
16
+ id: PropertyRef = PropertyRef("uid")
17
+ name: PropertyRef = PropertyRef("name", extra_index=True)
18
+ creation_timestamp: PropertyRef = PropertyRef("creation_timestamp")
19
+ deletion_timestamp: PropertyRef = PropertyRef("deletion_timestamp")
20
+ namespace: PropertyRef = PropertyRef("namespace", extra_index=True)
21
+ owner_references: PropertyRef = PropertyRef("owner_references")
22
+ type: PropertyRef = PropertyRef("type")
23
+ cluster_name: PropertyRef = PropertyRef(
24
+ "CLUSTER_NAME", set_in_kwargs=True, extra_index=True
25
+ )
26
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
27
+
28
+
29
+ @dataclass(frozen=True)
30
+ class KubernetesSecretToKubernetesNamespaceRelProperties(CartographyRelProperties):
31
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
32
+
33
+
34
+ @dataclass(frozen=True)
35
+ # (:KubernetesSecret)<-[:CONTAINS]-(:KubernetesNamespace)
36
+ class KubernetesSecretToKubernetesNamespaceRel(CartographyRelSchema):
37
+ target_node_label: str = "KubernetesNamespace"
38
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
39
+ {
40
+ "cluster_name": PropertyRef("CLUSTER_NAME", set_in_kwargs=True),
41
+ "name": PropertyRef("namespace"),
42
+ }
43
+ )
44
+ direction: LinkDirection = LinkDirection.INWARD
45
+ rel_label: str = "CONTAINS"
46
+ properties: KubernetesSecretToKubernetesNamespaceRelProperties = (
47
+ KubernetesSecretToKubernetesNamespaceRelProperties()
48
+ )
49
+
50
+
51
+ @dataclass(frozen=True)
52
+ class KubernetesSecretToKubernetesClusterRelProperties(CartographyRelProperties):
53
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
54
+
55
+
56
+ @dataclass(frozen=True)
57
+ # (:KubernetesSecret)<-[:RESOURCE]-(:KubernetesCluster)
58
+ class KubernetesSecretToKubernetesClusterRel(CartographyRelSchema):
59
+ target_node_label: str = "KubernetesCluster"
60
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
61
+ {"id": PropertyRef("CLUSTER_ID", set_in_kwargs=True)}
62
+ )
63
+ direction: LinkDirection = LinkDirection.INWARD
64
+ rel_label: str = "RESOURCE"
65
+ properties: KubernetesSecretToKubernetesClusterRelProperties = (
66
+ KubernetesSecretToKubernetesClusterRelProperties()
67
+ )
68
+
69
+
70
+ @dataclass(frozen=True)
71
+ class KubernetesSecretSchema(CartographyNodeSchema):
72
+ label: str = "KubernetesSecret"
73
+ properties: KubernetesSecretNodeProperties = KubernetesSecretNodeProperties()
74
+ sub_resource_relationship: KubernetesSecretToKubernetesClusterRel = (
75
+ KubernetesSecretToKubernetesClusterRel()
76
+ )
77
+ other_relationships: OtherRelationships = OtherRelationships(
78
+ [KubernetesSecretToKubernetesNamespaceRel()]
79
+ )
@@ -0,0 +1,108 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.relationships import CartographyRelProperties
7
+ from cartography.models.core.relationships import CartographyRelSchema
8
+ from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_target_node_matcher
10
+ from cartography.models.core.relationships import OtherRelationships
11
+ from cartography.models.core.relationships import TargetNodeMatcher
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class KubernetesServiceNodeProperties(CartographyNodeProperties):
16
+ id: PropertyRef = PropertyRef("uid")
17
+ name: PropertyRef = PropertyRef("name", extra_index=True)
18
+ creation_timestamp: PropertyRef = PropertyRef("creation_timestamp")
19
+ deletion_timestamp: PropertyRef = PropertyRef("deletion_timestamp")
20
+ namespace: PropertyRef = PropertyRef("namespace", extra_index=True)
21
+ selector: PropertyRef = PropertyRef("selector")
22
+ type: PropertyRef = PropertyRef("type")
23
+ cluster_ip: PropertyRef = PropertyRef("cluster_ip")
24
+ load_balancer_ip: PropertyRef = PropertyRef("load_balancer_ip")
25
+ load_balancer_ingress: PropertyRef = PropertyRef("load_balancer_ingress")
26
+ cluster_name: PropertyRef = PropertyRef(
27
+ "CLUSTER_NAME", set_in_kwargs=True, extra_index=True
28
+ )
29
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
30
+
31
+
32
+ @dataclass(frozen=True)
33
+ class KubernetesServiceToKubernetesClusterRelProperties(CartographyRelProperties):
34
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
35
+
36
+
37
+ @dataclass(frozen=True)
38
+ # (:KubernetesService)<-[:RESOURCE]-(:KubernetesCluster)
39
+ class KubernetesServiceToKubernetesClusterRel(CartographyRelSchema):
40
+ target_node_label: str = "KubernetesCluster"
41
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
42
+ {"id": PropertyRef("CLUSTER_ID", set_in_kwargs=True)}
43
+ )
44
+ direction: LinkDirection = LinkDirection.INWARD
45
+ rel_label: str = "RESOURCE"
46
+ properties: KubernetesServiceToKubernetesClusterRelProperties = (
47
+ KubernetesServiceToKubernetesClusterRelProperties()
48
+ )
49
+
50
+
51
+ @dataclass(frozen=True)
52
+ class KubernetesServiceToKubernetesNamespaceRelProperties(CartographyRelProperties):
53
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
54
+
55
+
56
+ @dataclass(frozen=True)
57
+ # (:KubernetesService)<-[:CONTAINS]-(:KubernetesNamespace)
58
+ class KubernetesServiceToKubernetesNamespaceRel(CartographyRelSchema):
59
+ target_node_label: str = "KubernetesNamespace"
60
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
61
+ {
62
+ "cluster_name": PropertyRef("CLUSTER_NAME", set_in_kwargs=True),
63
+ "name": PropertyRef("namespace"),
64
+ }
65
+ )
66
+ direction: LinkDirection = LinkDirection.INWARD
67
+ rel_label: str = "CONTAINS"
68
+ properties: KubernetesServiceToKubernetesNamespaceRelProperties = (
69
+ KubernetesServiceToKubernetesNamespaceRelProperties()
70
+ )
71
+
72
+
73
+ @dataclass(frozen=True)
74
+ class KubernetesServiceToKubernetesPodRelProperties(CartographyRelProperties):
75
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
76
+
77
+
78
+ @dataclass(frozen=True)
79
+ # (:KubernetesService)-[:TARGET]->(:KubernetesPod)
80
+ class KubernetesServiceToKubernetesPodRel(CartographyRelSchema):
81
+ target_node_label: str = "KubernetesPod"
82
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
83
+ {
84
+ "cluster_name": PropertyRef("CLUSTER_NAME", set_in_kwargs=True),
85
+ "namespace": PropertyRef("namespace"),
86
+ "id": PropertyRef("pod_ids", one_to_many=True),
87
+ }
88
+ )
89
+ direction: LinkDirection = LinkDirection.OUTWARD
90
+ rel_label: str = "TARGETS"
91
+ properties: KubernetesServiceToKubernetesPodRelProperties = (
92
+ KubernetesServiceToKubernetesPodRelProperties()
93
+ )
94
+
95
+
96
+ @dataclass(frozen=True)
97
+ class KubernetesServiceSchema(CartographyNodeSchema):
98
+ label: str = "KubernetesService"
99
+ properties: KubernetesServiceNodeProperties = KubernetesServiceNodeProperties()
100
+ sub_resource_relationship: KubernetesServiceToKubernetesClusterRel = (
101
+ KubernetesServiceToKubernetesClusterRel()
102
+ )
103
+ other_relationships: OtherRelationships = OtherRelationships(
104
+ [
105
+ KubernetesServiceToKubernetesNamespaceRel(),
106
+ KubernetesServiceToKubernetesPodRel(),
107
+ ]
108
+ )
File without changes
File without changes
@@ -0,0 +1,96 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.relationships import CartographyRelProperties
7
+ from cartography.models.core.relationships import CartographyRelSchema
8
+ from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_target_node_matcher
10
+ from cartography.models.core.relationships import OtherRelationships
11
+ from cartography.models.core.relationships import TargetNodeMatcher
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class ScalewayApiKeyProperties(CartographyNodeProperties):
16
+ id: PropertyRef = PropertyRef("access_key")
17
+ description: PropertyRef = PropertyRef("description")
18
+ created_at: PropertyRef = PropertyRef("created_at")
19
+ updated_at: PropertyRef = PropertyRef("updated_at")
20
+ expires_at: PropertyRef = PropertyRef("expires_at")
21
+ default_project_id: PropertyRef = PropertyRef("default_project_id")
22
+ editable: PropertyRef = PropertyRef("editable")
23
+ deletable: PropertyRef = PropertyRef("deletable")
24
+ managed: PropertyRef = PropertyRef("managed")
25
+ creation_ip: PropertyRef = PropertyRef("creation_ip")
26
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
27
+
28
+
29
+ @dataclass(frozen=True)
30
+ class ScalewayApiKeyToUserProperties(CartographyRelProperties):
31
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
32
+
33
+
34
+ @dataclass(frozen=True)
35
+ # (:ScalewayUser)-[:HAS]->(:ScalewayApiKey)
36
+ class ScalewayApiKeyToUserRel(CartographyRelSchema):
37
+ target_node_label: str = "ScalewayUser"
38
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
39
+ {"id": PropertyRef("user_id")},
40
+ )
41
+ direction: LinkDirection = LinkDirection.INWARD
42
+ rel_label: str = "HAS"
43
+ properties: ScalewayApiKeyToUserProperties = ScalewayApiKeyToUserProperties()
44
+
45
+
46
+ @dataclass(frozen=True)
47
+ class ScalewayApiKeyToApplicationProperties(CartographyRelProperties):
48
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
49
+
50
+
51
+ @dataclass(frozen=True)
52
+ # (:ScalewayApplication)-[:HAS]->(:ScalewayApiKey)
53
+ class ScalewayApiKeyToApplicationRel(CartographyRelSchema):
54
+ target_node_label: str = "ScalewayApplication"
55
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
56
+ {"id": PropertyRef("application_id")},
57
+ )
58
+ direction: LinkDirection = LinkDirection.INWARD
59
+ rel_label: str = "HAS"
60
+ properties: ScalewayApiKeyToApplicationProperties = (
61
+ ScalewayApiKeyToApplicationProperties()
62
+ )
63
+
64
+
65
+ @dataclass(frozen=True)
66
+ class ScalewayApiKeyToOrganizationRelProperties(CartographyRelProperties):
67
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
68
+
69
+
70
+ @dataclass(frozen=True)
71
+ # (:ScalewayOrganization)-[:RESOURCE]->(:ScalewayApiKey)
72
+ class ScalewayApiKeyToOrganizationRel(CartographyRelSchema):
73
+ target_node_label: str = "ScalewayOrganization"
74
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
75
+ {"id": PropertyRef("ORG_ID", set_in_kwargs=True)},
76
+ )
77
+ direction: LinkDirection = LinkDirection.INWARD
78
+ rel_label: str = "RESOURCE"
79
+ properties: ScalewayApiKeyToOrganizationRelProperties = (
80
+ ScalewayApiKeyToOrganizationRelProperties()
81
+ )
82
+
83
+
84
+ @dataclass(frozen=True)
85
+ class ScalewayApiKeySchema(CartographyNodeSchema):
86
+ label: str = "ScalewayApiKey"
87
+ properties: ScalewayApiKeyProperties = ScalewayApiKeyProperties()
88
+ sub_resource_relationship: ScalewayApiKeyToOrganizationRel = (
89
+ ScalewayApiKeyToOrganizationRel()
90
+ )
91
+ other_relationships: OtherRelationships = OtherRelationships(
92
+ [
93
+ ScalewayApiKeyToUserRel(),
94
+ ScalewayApiKeyToApplicationRel(),
95
+ ]
96
+ )