def ssh_into_node(base_client, pool_id, node_id, username, ssh_key=None, password=None, port_forward_list=None, internal=False): if internal: result = base_client.batch_client.compute_node.get(pool_id=pool_id, node_id=node_id) rls = models.RemoteLogin(ip_address=result.ip_address, port="22") else: result = base_client.batch_client.compute_node.get_remote_login_settings( pool_id, node_id) rls = models.RemoteLogin(ip_address=result.remote_login_ip_address, port=str(result.remote_login_port)) ssh_lib.node_ssh( username=username, hostname=rls.ip_address, port=rls.port, ssh_key=ssh_key, password=password, port_forward_list=port_forward_list, )
def node_run(base_client, cluster_id, node_id, command, internal, container_name=None, timeout=None): cluster = base_client.get(cluster_id) pool, nodes = cluster.pool, list(cluster.nodes) try: node = next(node for node in nodes if node.id == node_id) except StopIteration: raise error.AztkError("Node with id {} not found".format(node_id)) if internal: node_rls = models.RemoteLogin(ip_address=node.ip_address, port="22") else: node_rls = base_client.get_remote_login_settings(pool.id, node.id) try: generated_username, ssh_key = base_client.generate_user_on_node( pool.id, node.id) output = ssh_lib.node_exec_command( node.id, command, generated_username, node_rls.ip_address, node_rls.port, ssh_key=ssh_key.exportKey().decode('utf-8'), container_name=container_name, timeout=timeout) return output finally: base_client.delete_user_on_node(cluster_id, node.id, generated_username)
def __cluster_copy(self, cluster_id, source_path, destination_path, container_name=None, internal=False, get=False, timeout=None): pool, nodes = self.__get_pool_details(cluster_id) nodes = [node for node in nodes] if internal: cluster_nodes = [(node, models.RemoteLogin(ip_address=node.ip_address, port="22")) for node in nodes] else: cluster_nodes = [ (node, self.__get_remote_login_settings(pool.id, node.id)) for node in nodes ] try: ssh_key = self.__create_user_on_pool('aztk', pool.id, nodes) output = asyncio.get_event_loop().run_until_complete( ssh_lib.clus_copy(container_name=container_name, username='******', nodes=cluster_nodes, source_path=source_path, destination_path=destination_path, ssh_key=ssh_key.exportKey().decode('utf-8'), get=get, timeout=timeout)) return output except (OSError, batch_error.BatchErrorException) as exc: raise exc finally: self.__delete_user_on_pool('aztk', pool.id, nodes)
def __cluster_run(self, cluster_id, command, internal, container_name=None, timeout=None): pool, nodes = self.__get_pool_details(cluster_id) nodes = [node for node in nodes] if internal: cluster_nodes = [(node, models.RemoteLogin(ip_address=node.ip_address, port="22")) for node in nodes] else: cluster_nodes = [ (node, self.__get_remote_login_settings(pool.id, node.id)) for node in nodes ] try: ssh_key = self.__create_user_on_pool('aztk', pool.id, nodes) output = asyncio.get_event_loop().run_until_complete( ssh_lib.clus_exec_command( command, 'aztk', cluster_nodes, ssh_key=ssh_key.exportKey().decode('utf-8'), container_name=container_name, timeout=timeout)) return output except OSError as exc: raise exc finally: self.__delete_user_on_pool('aztk', pool.id, nodes)
def __node_run(self, cluster_id, node_id, command, internal, container_name=None, timeout=None): pool, nodes = self.__get_pool_details(cluster_id) try: node = next(node for node in nodes if node.id == node_id) except StopIteration: raise error.AztkError("Node with id {} not found".format(node_id)) if internal: node_rls = models.RemoteLogin(ip_address=node.ip_address, port="22") else: node_rls = self.__get_remote_login_settings(pool.id, node.id) try: generated_username, ssh_key = self.__generate_user_on_node( pool.id, node.id) output = ssh_lib.node_exec_command( node.id, command, generated_username, node_rls.ip_address, node_rls.port, ssh_key=ssh_key.exportKey().decode("utf-8"), container_name=container_name, timeout=timeout, ) return output finally: self.__delete_user(cluster_id, node.id, generated_username)
def _get_remote_login_settings(base_client, pool_id: str, node_id: str): """ Get the remote_login_settings for node :param pool_id :param node_id :returns aztk.models.RemoteLogin """ result = base_client.batch_client.compute_node.get_remote_login_settings(pool_id, node_id) return models.RemoteLogin(ip_address=result.remote_login_ip_address, port=str(result.remote_login_port))
def cluster_copy( cluster_operations, cluster_id, source_path, destination_path=None, container_name=None, internal=False, get=False, timeout=None, ): cluster = cluster_operations.get(cluster_id) pool, nodes = cluster.pool, list(cluster.nodes) if internal: cluster_nodes = [(node, models.RemoteLogin(ip_address=node.ip_address, port="22")) for node in nodes] else: cluster_nodes = [ (node, cluster_operations.get_remote_login_settings(pool.id, node.id)) for node in nodes ] try: generated_username, ssh_key = cluster_operations.generate_user_on_cluster( pool.id, nodes) except BatchErrorException as e: raise error.AztkError(helpers.format_batch_exception(e)) try: output = asyncio.get_event_loop().run_until_complete( ssh_lib.clus_copy( container_name=container_name, username=generated_username, nodes=cluster_nodes, source_path=source_path, destination_path=destination_path, ssh_key=ssh_key.exportKey().decode("utf-8"), get=get, timeout=timeout, )) return output except (OSError, BatchErrorException) as exc: raise exc finally: cluster_operations.delete_user_on_cluster(pool.id, nodes, generated_username)
def cluster_run(base_operations, cluster_id, command, internal, container_name=None, timeout=None): cluster = base_operations.get(cluster_id) pool, nodes = cluster.pool, list(cluster.nodes) if internal: cluster_nodes = [(node, models.RemoteLogin(ip_address=node.ip_address, port="22")) for node in nodes] else: cluster_nodes = [ (node, base_operations.get_remote_login_settings(pool.id, node.id)) for node in nodes ] try: generated_username, ssh_key = base_operations.generate_user_on_cluster( pool.id, nodes) except batch_error.BatchErrorException as e: raise error.AztkError(helpers.format_batch_exception(e)) try: output = asyncio.get_event_loop().run_until_complete( ssh_lib.clus_exec_command( command, generated_username, cluster_nodes, ssh_key=ssh_key.exportKey().decode("utf-8"), container_name=container_name, timeout=timeout, )) return output except OSError as exc: raise exc finally: base_operations.delete_user_on_cluster(pool.id, nodes, generated_username)