def drain_nodes(node_names): """ Drain nodes Args: node_names (list): The names of the nodes Raises: TimeoutExpired: in case drain command fails to complete in time """ ocp = OCP(kind="node") node_names_str = " ".join(node_names) log.info(f"Draining nodes {node_names_str}") try: ocp.exec_oc_cmd( f"adm drain {node_names_str} --force=true --ignore-daemonsets " f"--delete-local-data", timeout=1800, ) except TimeoutExpired: ct_pod = pod.get_ceph_tools_pod() ceph_status = ct_pod.exec_cmd_on_pod("ceph status", out_yaml_format=False) log.error( f"Drain command failed to complete. Ceph status: {ceph_status}") # TODO: Add re-balance status once pull/1679 is merged raise
def schedule_nodes(node_names): """ Change nodes to be scheduled Args: node_names (list): The names of the nodes """ ocp = OCP(kind="node") node_names_str = " ".join(node_names) ocp.exec_oc_cmd(f"adm uncordon {node_names_str}") log.info(f"Scheduling nodes {node_names_str}") wait_for_nodes_status(node_names)
def drain_nodes(node_names): """ Drain nodes Args: node_names (list): The names of the nodes """ ocp = OCP(kind='node') node_names_str = ' '.join(node_names) log.info(f'Draining nodes {node_names_str}') ocp.exec_oc_cmd( f"adm drain {node_names_str} --force=true --ignore-daemonsets " f"--delete-local-data")
def unschedule_nodes(node_names): """ Change nodes to be unscheduled Args: node_names (list): The names of the nodes """ ocp = OCP(kind="node") node_names_str = " ".join(node_names) log.info(f"Unscheduling nodes {node_names_str}") ocp.exec_oc_cmd(f"adm cordon {node_names_str}") wait_for_nodes_status(node_names, status=constants.NODE_READY_SCHEDULING_DISABLED)
def scale_down_deployments(node_name): """ Scale down the deployments of a node as described in the documents of node replacement with LSO Args: node_name (str): The node name """ ocp = OCP(kind="node", namespace=defaults.ROOK_CLUSTER_NAMESPACE) pods_to_scale_down = get_node_pods_to_scale_down(node_name) for p in pods_to_scale_down: deployment_name = pod.get_deployment_name(p.name) log.info(f"Scale down deploymet {deployment_name}") ocp.exec_oc_cmd(f"scale deployment {deployment_name} --replicas=0") log.info("Scale down rook-ceph-crashcollector") ocp.exec_oc_cmd( f"scale deployment --selector=app=rook-ceph-crashcollector," f"node_name='{node_name}' --replicas=0")
def taint_ocs_nodes(nodes_to_taint=None): """ Function to taint nodes with "node.ocs.openshift.io/storage=true:NoSchedule" Args: nodes_to_taint (list): Nodes to taint """ if not check_taint_on_ocs_nodes(): ocp = OCP() ocs_nodes = get_ocs_nodes() nodes_to_taint = nodes_to_taint if nodes_to_taint else ocs_nodes log.info(f"Taint nodes with taint: " f"{constants.OPERATOR_NODE_TAINT}") for node in nodes_to_taint: taint_cmd = f"adm taint nodes {node.name} {constants.OPERATOR_NODE_TAINT}" ocp.exec_oc_cmd(command=taint_cmd) else: log.info( f"One or more nodes already have taint {constants.OPERATOR_NODE_TAINT} " )
def remove_nodes(nodes): """ Remove the nodes from cluster Args: nodes (list): list of node instances to remove from cluster """ ocp = OCP(kind="node") node_names = [node.get().get("metadata").get("name") for node in nodes] node_names_str = " ".join(node_names) # unschedule node unschedule_nodes(node_names) # Drain all the pods from the node drain_nodes(node_names) # delete the nodes log.info(f"Deleting nodes {node_names_str}") ocp.exec_oc_cmd(f"delete nodes {node_names_str}")
def untaint_ocs_nodes(taint=constants.OPERATOR_NODE_TAINT, nodes_to_untaint=None): """ Function to remove taints from nodes Args: taint (str): taint to use nodes_to_taint (list): list of nodes to untaint Return: bool: True if untainted, false otherwise """ if check_taint_on_nodes(): ocp = OCP() ocs_nodes = get_ocs_nodes() nodes_to_taint = nodes_to_untaint if nodes_to_untaint else ocs_nodes for node in nodes_to_taint: taint_cmd = f"adm taint nodes {node.name} {taint}-" ocp.exec_oc_cmd(command=taint_cmd) log.info(f"Untainted {node.name}") return True return False
def add_scc_policy(sa_name, namespace): """ Adding ServiceAccount to scc privileged Args: sa_name (str): ServiceAccount name namespace (str): The namespace for the scc_policy creation """ ocp = OCP() out = ocp.exec_oc_cmd( command= f"adm policy add-scc-to-user privileged system:serviceaccount:{namespace}:{sa_name}", out_yaml_format=False) logger.info(out)
def remove_scc_policy(sa_name, namespace): """ Removing ServiceAccount from scc privileged Args: sa_name (str): ServiceAccount name namespace (str): The namespace for the scc_policy deletion """ ocp = OCP() out = ocp.exec_oc_cmd( command= f"adm policy remove-scc-from-user privileged system:serviceaccount:{namespace}:{sa_name}", out_yaml_format=False) logger.info(out)