def _getKubernetesJoiningInfo(self, leader: Node = None) -> Dict[str, str]: """ Get the Kubernetes joining info created when Kubernetes was set up on this node, which is the leader, or on a different specified Node. Returns a dict of JOIN_TOKEN, JOIN_CERT_HASH, and JOIN_ENDPOINT, which can be inserted into our Kubernetes worker setup script and config. :param leader: Node to operate on, if not the current machine. """ # Make a parser for the config config = configparser.ConfigParser(interpolation=None) # Leave case alone config.optionxform = str if leader is None: # This info is always supposed to be set up before the Toil appliance # starts, and mounted in at the same path as on the host. So we just go # read it. with open('/etc/kubernetes/worker.ini') as f: config.read_file(f) else: # Grab from remote file with tempfile.TemporaryDirectory() as tmpdir: localFile = os.path.join(tmpdir, 'worker.ini') leader.extractFile('/etc/kubernetes/worker.ini', localFile, 'toil_leader') with open(localFile) as f: config.read_file(f) # Grab everything out of the default section where our setup script put # it. return dict(config['DEFAULT'])
def _setSSH(self, leader: Node = None) -> str: """ Generate a key pair, save it in /root/.ssh/id_rsa.pub on the leader, and return the public key. The file /root/.sshSuccess is used to prevent this operation from running twice. Also starts the ssh agent on the local node, if operating on the local node. :param leader: Node to operate on, if not the current machine. :return: Public key, without the "ssh-rsa" part. """ # To work locally or remotely we need to do all our setup work as one # big bash -c command = [ 'bash', '-c', ('set -e; if [ ! -e /root/.sshSuccess ] ; ' 'then ssh-keygen -f /root/.ssh/id_rsa -t rsa -N ""; ' 'touch /root/.sshSuccess; fi; chmod 700 /root/.ssh;') ] if leader is None: # Run locally subprocess.check_call(command) # Grab from local file with open('/root/.ssh/id_rsa.pub') as f: leaderPublicKey = f.read() else: # Run remotely leader.sshInstance(*command, appliance=True) # Grab from remote file with tempfile.TemporaryDirectory() as tmpdir: localFile = os.path.join(tmpdir, 'id_rsa.pub') leader.extractFile('/root/.ssh/id_rsa.pub', localFile, 'toil_leader') with open(localFile) as f: leaderPublicKey = f.read() # Drop the key type and keep just the key data leaderPublicKey = leaderPublicKey.split(' ')[1] # confirm it really is an RSA public key assert leaderPublicKey.startswith('AAAAB3NzaC1yc2E'), leaderPublicKey return leaderPublicKey