Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 30 additions & 12 deletions orca/topology/infra/k8s/linker.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""

Expand All @@ -34,7 +52,7 @@ def get(cls, graph):
matcher=matcher.PodToServiceMatcher())


class PodToReplicaSetLinker(Linker):
class PodToReplicaSetLinker(NamespacedLinker):

"""Links Pod entities to Replica Set entities."""

Expand All @@ -47,7 +65,7 @@ def get(cls, graph):
matcher=matcher.PodToReplicaSetMatcher())


class PodToStatefulSetLinker(Linker):
class PodToStatefulSetLinker(NamespacedLinker):

"""Links Pod entities to Stateful Set entities."""

Expand All @@ -60,7 +78,7 @@ def get(cls, graph):
matcher=matcher.PodToStatefulSetMatcher())


class PodToDaemonSetLinker(Linker):
class PodToDaemonSetLinker(NamespacedLinker):

"""Links Pod entities to Daemon Set entities."""

Expand All @@ -86,7 +104,7 @@ def get(cls, graph):
matcher=matcher.PodToNodeMatcher())


class EndpointsToServiceLinker(Linker):
class EndpointsToServiceLinker(NamespacedLinker):

"""Links Endpoint entities to Service entities."""

Expand All @@ -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."""

Expand All @@ -112,7 +130,7 @@ def get(cls, graph):
matcher=matcher.HorizontalPodAutoscalerMatcher())


class ReplicaSetToDeploymentLinker(Linker):
class ReplicaSetToDeploymentLinker(NamespacedLinker):

"""Links Replica Set entities to Deployment entities."""

Expand All @@ -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."""

Expand All @@ -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."""

Expand All @@ -151,7 +169,7 @@ def get(cls, graph):
matcher=matcher.HorizontalPodAutoscalerMatcher())


class ConfigMapToPodLinker(Linker):
class ConfigMapToPodLinker(NamespacedLinker):

"""Links Config Map entities to Pod entities."""

Expand All @@ -164,7 +182,7 @@ def get(cls, graph):
matcher=matcher.ConfigMapToPodMatcher())


class SecretToPodLinker(Linker):
class SecretToPodLinker(NamespacedLinker):

"""Links Secret entities to Pod entities."""

Expand Down Expand Up @@ -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."""

Expand Down
12 changes: 10 additions & 2 deletions orca/topology/linker.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}