From ba59d77f8dc5774e3f660a7e65f2967a7494e709 Mon Sep 17 00:00:00 2001 From: Bartosz Zurkowski Date: Sat, 25 Apr 2020 12:56:21 +0200 Subject: [PATCH] Scope neighbours for K8S entities by namespace Signed-off-by: Bartosz Zurkowski --- orca/topology/infra/k8s/linker.py | 42 ++++++++++++++++++++++--------- orca/topology/linker.py | 12 +++++++-- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/orca/topology/infra/k8s/linker.py b/orca/topology/infra/k8s/linker.py index aaa63b3..b14062f 100644 --- a/orca/topology/infra/k8s/linker.py +++ b/orca/topology/infra/k8s/linker.py @@ -21,7 +21,25 @@ class Linker(linker.Linker): """Base class for Kubernetes linkers.""" -class PodToServiceLinker(Linker): +class NamespacedLinker(Linker): + + """Scopes linked entities by namespace.""" + + def _get_target_query(self, node): + return self._get_namespace_query(node) + + def _get_source_query(self, node): + return self._get_namespace_query(node) + + def _get_namespace_query(self, node): + return { + 'properties': { + 'namespace': node.properties.namespace + } + } + + +class PodToServiceLinker(NamespacedLinker): """Links Pod entities to Service entities.""" @@ -34,7 +52,7 @@ def get(cls, graph): matcher=matcher.PodToServiceMatcher()) -class PodToReplicaSetLinker(Linker): +class PodToReplicaSetLinker(NamespacedLinker): """Links Pod entities to Replica Set entities.""" @@ -47,7 +65,7 @@ def get(cls, graph): matcher=matcher.PodToReplicaSetMatcher()) -class PodToStatefulSetLinker(Linker): +class PodToStatefulSetLinker(NamespacedLinker): """Links Pod entities to Stateful Set entities.""" @@ -60,7 +78,7 @@ def get(cls, graph): matcher=matcher.PodToStatefulSetMatcher()) -class PodToDaemonSetLinker(Linker): +class PodToDaemonSetLinker(NamespacedLinker): """Links Pod entities to Daemon Set entities.""" @@ -86,7 +104,7 @@ def get(cls, graph): matcher=matcher.PodToNodeMatcher()) -class EndpointsToServiceLinker(Linker): +class EndpointsToServiceLinker(NamespacedLinker): """Links Endpoint entities to Service entities.""" @@ -99,7 +117,7 @@ def get(cls, graph): matcher=matcher.EndpointsToServiceMatcher()) -class DeploymentToHorizontalPodAutoscalerLinker(Linker): +class DeploymentToHorizontalPodAutoscalerLinker(NamespacedLinker): """Links Deployment entities to Horizontal Pod Autoscaler entities.""" @@ -112,7 +130,7 @@ def get(cls, graph): matcher=matcher.HorizontalPodAutoscalerMatcher()) -class ReplicaSetToDeploymentLinker(Linker): +class ReplicaSetToDeploymentLinker(NamespacedLinker): """Links Replica Set entities to Deployment entities.""" @@ -125,7 +143,7 @@ def get(cls, graph): matcher=matcher.ReplicaSetToDeploymentMatcher()) -class ReplicaSetToHorizontalPodAutoscalerLinker(Linker): +class ReplicaSetToHorizontalPodAutoscalerLinker(NamespacedLinker): """Links Replica Set entities to Horizontal Pod Autoscaler entities.""" @@ -138,7 +156,7 @@ def get(cls, graph): matcher=matcher.HorizontalPodAutoscalerMatcher()) -class StatefulSetToHorizontalPodAutoscalerLinker(Linker): +class StatefulSetToHorizontalPodAutoscalerLinker(NamespacedLinker): """Links Stateful Set entities to Horizontal Pod Autoscaler entities.""" @@ -151,7 +169,7 @@ def get(cls, graph): matcher=matcher.HorizontalPodAutoscalerMatcher()) -class ConfigMapToPodLinker(Linker): +class ConfigMapToPodLinker(NamespacedLinker): """Links Config Map entities to Pod entities.""" @@ -164,7 +182,7 @@ def get(cls, graph): matcher=matcher.ConfigMapToPodMatcher()) -class SecretToPodLinker(Linker): +class SecretToPodLinker(NamespacedLinker): """Links Secret entities to Pod entities.""" @@ -203,7 +221,7 @@ def get(cls, graph): matcher=matcher.PersistentVolumeToPersistentVolumeClaimMatcher()) -class PersistentVolumeClaimToPodLinker(Linker): +class PersistentVolumeClaimToPodLinker(NamespacedLinker): """Links Persistent Volume Claim entities to Pod entities.""" diff --git a/orca/topology/linker.py b/orca/topology/linker.py index 446f559..cd4dae4 100644 --- a/orca/topology/linker.py +++ b/orca/topology/linker.py @@ -115,21 +115,29 @@ def _is_source(self, node): def _get_links_from_source(self, source_node): links = [] + query = self._get_target_query(source_node) target_nodes = self._graph.get_nodes( - origin=self.target_spec.origin, kind=self.target_spec.kind) + origin=self.target_spec.origin, kind=self.target_spec.kind, **query) for target_node in target_nodes: if self._matcher.are_linked(source_node, target_node): links.append(graph.Graph.create_link({}, source_node, target_node)) return links + def _get_target_query(self, source_node): + return {} + def _get_links_from_target(self, target_node): links = [] + query = self._get_source_query(target_node) source_nodes = self._graph.get_nodes( - origin=self.source_spec.origin, kind=self.source_spec.kind) + origin=self.source_spec.origin, kind=self.source_spec.kind, **query) for source_node in source_nodes: if self._matcher.are_linked(source_node, target_node): links.append(graph.Graph.create_link({}, source_node, target_node)) return links + def _get_source_query(self, target_node): + return {} + def _build_link_lookup(self, links): return {link.id: link for link in links}