def destroy_nodes(self): L.error("DESTROYING ALL NODES FOR MANAGER %s"%self.name) for node in self.nodes: L.warning("KILLING NODE: %s"%node) try: call("docker-machine kill %s && sleep 10"%node) call("docker-machine rm %s"%node) except: pass
def connect(self, force=False): if not force and not self.client: output = call("docker-machine env %s"%self.name) if not 'DOCKER_HOST' in output: raise IOError("Unexpected output connecting to docker-machine") self.exists = True self.node_info = dict([l[7:].replace('"','').split('=') for l in output.split("\n") if l.startswith('export ')]) self.host = self.node_info['DOCKER_HOST'] self.node_cert_path = self.node_info['DOCKER_CERT_PATH'] self.node_connect_str = '-H %s' % self.host nodes_dir = os.path.join(self.manager.cfg['home'], '.data/nodes/%s'%self.manager.name) if not os.path.isdir(nodes_dir): os.makedirs(nodes_dir) with open(os.path.join(nodes_dir, '%s.yml'%self.name), 'w+') as fh: fh.write(yaml.dump(self.manager._node_statuses[self.name])) if self.node_cert_path: self.node_connect_str += ' --tls=true --tlscacert="%s" --tlscert="%s" --tlskey="%s"'%( self.node_cert_path+'/ca.pem', self.node_cert_path+'/cert.pem', self.node_cert_path+'/key.pem', ) self.client_tls = tls.TLSConfig( verify=self.node_cert_path+'/ca.pem', assert_hostname=False, client_cert=(self.node_cert_path+'/cert.pem', self.node_cert_path+'/key.pem')) self.client = get_client(self.host.replace('tcp:', 'https:'), tls=self.client_tls) return self
def __init__(self, name, manager): self.name = self.name = name self.manager = manager _s = manager._node_statuses if name in _s: if not _s[name]['status'] == 'Running': call('docker-machine start %s'%name) manager.update_nodes() self.ip = _s[name]['ip'] self.exists = True self.host = _s[name]['host'] else: self.ip = '' self.exists = False self.host = '' self.client = None self._names = {} self._containers = {}
def update_nodes(self): from urlparse import urlparse _stats = [l.replace('*', '').split() for l in call('docker-machine ls').split('\n')[1:]] self._node_statuses = { _s[0]: { 'driver':_s[1], 'status':_s[2], 'host': len(_s) > 3 and _s[3], 'ip': len(_s)> 3 and urlparse(_s[3]).hostname, } for _s in _stats } self._nodes = dict((n, Node(n, self)) for n in self.cfg.get('nodes', [self.name])) for n in self._nodes: if len(self.leader_nodes)<= 5: self.leader_nodes.append(self._nodes[n]) return self._nodes
def create_node(self, name, cfg=None, options=None): if not cfg: cfg = {} if not options: options = {} else: cfg.update(options) options['provider'] = cfg.get('provider', {'name': 'local'}) iaas = options['provider'].get('driver', 'virtualbox') services = options['services'] = options.get('services', []) L.info("Creating new machine %s on %s"%(name, iaas)) swarm = cfg.get('swarm-token', '') extra = ' '.join(options['provider'].get('extra', [])) if not len(self.running_nodes): swarm_extra = ' --swarm --swarm-master --swarm-discovery token://%s'%swarm else: swarm_extra = ' --swarm --swarm-discovery token://%s'%swarm command = "docker-machine create --driver %s %s %s"%( iaas, extra, name) output = call(command) L.ok("Done creating %s on %s!"%(name, iaas)) self.update_nodes()
def call_docker(self, command): command = "docker %s %s"%(self.node_connect_str, command) return call(command)
def call(self, command): return call("docker-machine ssh %s %s"%(self.name, command))