Example #1
0
 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
Example #2
0
 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
Example #3
0
 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 = {}
Example #4
0
 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
Example #5
0
 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()
Example #6
0
 def call_docker(self, command):
     command = "docker %s %s"%(self.node_connect_str, command)
     return call(command)
Example #7
0
 def call(self, command):
     return call("docker-machine ssh %s %s"%(self.name, command))