def set_memory_limit(self, kubernetes_memory_limit):
        """Set memory limit for job pods. Validate if provided format is correct."""
        if kubernetes_memory_limit:
            if not validate_kubernetes_memory(kubernetes_memory_limit):
                msg = f'The "kubernetes_memory_limit" provided {kubernetes_memory_limit} has wrong format.'
                logging.error(
                    "Error while validating Kubernetes memory limit: {}".format(msg)
                )
                raise REANAKubernetesWrongMemoryFormat(msg)

            if REANA_KUBERNETES_JOBS_MAX_USER_MEMORY_LIMIT:
                custom_job_memory_limit_bytes = kubernetes_memory_to_bytes(
                    kubernetes_memory_limit
                )
                max_custom_job_memory_limit_bytes = kubernetes_memory_to_bytes(
                    REANA_KUBERNETES_JOBS_MAX_USER_MEMORY_LIMIT
                )
                if custom_job_memory_limit_bytes > max_custom_job_memory_limit_bytes:
                    msg = f'The "kubernetes_memory_limit" provided ({kubernetes_memory_limit}) exceeds the limit ({REANA_KUBERNETES_JOBS_MAX_USER_MEMORY_LIMIT}).'
                    raise REANAKubernetesMemoryLimitExceeded(msg)

        self.kubernetes_memory_limit = kubernetes_memory_limit
Esempio n. 2
0
    def get_memory_usage(self):
        """Get nodes memory usage."""
        result = dict()
        try:
            nodes = current_k8s_corev1_api_client.list_node()
            for node in nodes.items:
                result[node.metadata.name] = {
                    "capacity": node.status.capacity["memory"]
                }

            node_metrics = current_k8s_custom_objects_api_client.list_cluster_custom_object(
                "metrics.k8s.io", "v1beta1", "nodes"
            )
            for node_metric in node_metrics.get("items", []):
                node_name = node_metric["metadata"]["name"]
                result[node_name]["usage"] = node_metric["usage"]["memory"]

                node_capacity = result[node_name]["capacity"]
                node_usage = result[node_name]["usage"]
                node_usage_percentage = ClusterHealth.get_percentage(
                    kubernetes_memory_to_bytes(node_usage),
                    kubernetes_memory_to_bytes(node_capacity),
                )
                result[node_name]["percentage"] = f"{node_usage_percentage}%"
                result[node_name]["available"] = node_capacity - node_usage
        except ApiException as e:
            msg = "Error while calling `metrics.k8s.io` API."
            logging.error(msg)
            logging.error(e)
            return {"error": msg}
        except ValueError as e:
            # FIXME: after new Kubernetes release this should be not needed
            msg = "Error while retreiving k8s list of nodes."
            logging.error(msg)
            logging.error(e)
            return {"error": msg}

        return result
Esempio n. 3
0
 def get_nodes_memory(self):
     """Get list of all node memory capacities."""
     try:
         nodes = current_k8s_corev1_api_client.list_node()
         return [
             kubernetes_memory_to_bytes(node.status.capacity["memory"])
             for node in nodes.items
         ]
     except ValueError as e:
         # FIXME: after new Kubernetes release this should be not needed
         msg = "Error while retreiving k8s list of nodes."
         logging.error(msg)
         logging.error(e)
         return []
Esempio n. 4
0
 def _get_memory_limit(self, step):
     """Get memory limit value."""
     memory_limit = (
         step.get("kubernetes_memory_limit") or REANA_KUBERNETES_JOBS_MEMORY_LIMIT
     )
     return kubernetes_memory_to_bytes(memory_limit)
Esempio n. 5
0
def test_kubernetes_memory_to_bytes(k8s_memory, bytes_):
    """Test conversion of k8s memory format to bytes."""
    assert kubernetes_memory_to_bytes(k8s_memory) == bytes_
Esempio n. 6
0
ADMIN_USER_ID = "00000000-0000-0000-0000-000000000000"

SHARED_VOLUME_PATH = os.getenv("SHARED_VOLUME_PATH", "/var/reana")

REANA_HOSTNAME = os.getenv("REANA_HOSTNAME")

REANA_SSO_CERN_CONSUMER_KEY = os.getenv("CERN_CONSUMER_KEY", "CHANGE_ME")

REANA_SSO_CERN_CONSUMER_SECRET = os.getenv("CERN_CONSUMER_SECRET", "CHANGE_ME")

REANA_KUBERNETES_JOBS_MEMORY_LIMIT = os.getenv("REANA_KUBERNETES_JOBS_MEMORY_LIMIT")
"""Maximum memory limit for user job containers for workflow complexity estimation."""

REANA_KUBERNETES_JOBS_MEMORY_LIMIT_IN_BYTES = (
    kubernetes_memory_to_bytes(REANA_KUBERNETES_JOBS_MEMORY_LIMIT)
    if REANA_KUBERNETES_JOBS_MEMORY_LIMIT
    else 0
)
"""Maximum memory limit for user job containers in bytes."""

REANA_WORKFLOW_SCHEDULING_POLICY = os.getenv("REANA_WORKFLOW_SCHEDULING_POLICY", "fifo")

REANA_WORKFLOW_SCHEDULING_POLICIES = ["fifo", "balanced"]
"""REANA workflow scheduling policies.
- ``fifo``: first-in first-out strategy starting workflows as they come.
- ``balanced``: a weighted strategy taking into account existing multi-user workloads and the DAG complexity of incoming workflows.
"""

SUPPORTED_COMPUTE_BACKENDS = json.loads(os.getenv("REANA_COMPUTE_BACKENDS", "[]")) or []
"""List of supported compute backends."""
Esempio n. 7
0
 def _get_memory_limit(self, step):
     """Get memory limit value."""
     memory_limit = step.get("kubernetes_memory_limit",
                             REANA_COMPLEXITY_JOBS_MEMORY_LIMIT)
     return kubernetes_memory_to_bytes(memory_limit)