Пример #1
0
 def setup(self):
     """
     start cluster if not yet started, assign topology parts to workers and
     start workers
     """
     if(not self.cluster.is_running()):
         self.cluster.start()
     if(not self.cluster.is_running()):
         raise RuntimeError("Cluster won't start")
     self.logger.info("Clustering topology...")
     if(not self.topology):
         parti = Partitioner()
         parti.loadtopo(self.origtopology)
         self.topology = parti.partition(self.cluster.num_workers(),self.cluster.get_worker_shares()) # assigning shares to workers requires that the workers are already startet. elsewise we don't have a way to determine the workerid of the worker. topologies are assigned to workers in ascending workerid order
         self.logger.debug("Tunnels: "+str(self.topology.getTunnels()))
     subtopos = self.topology.getTopos()
     if(len(subtopos) > self.cluster.num_workers()):
         raise RuntimeError("Cluster does not have enough workers for given topology")
     for subtopo in subtopos:
         for node in subtopo.nodes():
             self.node_to_workerid[node]=subtopos.index(subtopo)
             self.nodes.append(NodeWrapper(node, self.get_worker(node)))
             self.node_to_wrapper[node]=self.nodes[-1]
             if (not subtopo.isSwitch(node)):
                 self.hosts.append(self.nodes[-1])
             else:
                 self.switches.append(self.nodes[-1])
     self.logger.debug("Nodemapping: %s",self.node_to_workerid)
     tunnels = [[] for x in range(len(subtopos))]
     for tunnel in self.topology.getTunnels():
         w1 = self.get_worker(tunnel[0])
         w2 = self.get_worker(tunnel[1])
         intf = self.cluster.create_tunnel(w1,w2)
         self.tunnellookup[(tunnel[0],tunnel[1])]=intf
         self.tunnellookup[(tunnel[1],tunnel[0])]=intf
         for i in range(0,2):
             tunnels[self.node_to_workerid[tunnel[i]]].append([intf, tunnel[i], tunnel[2]]) # Assumes that workerid = subtopoid
     for topo in subtopos:
         self.cluster.workers()[subtopos.index(topo)].set_switch(self.switch)
         if(self.controller):
             self.cluster.workers()[subtopos.index(topo)].start(topo=topo, tunnels=tunnels[subtopos.index(topo)], controller=self.controller)
         else:
             self.cluster.workers()[subtopos.index(topo)].start(topo=topo, tunnels=tunnels[subtopos.index(topo)])
     if (config.runWith1500MTU):
         for topo in subtopos:
             for host in topo.nodes():
                 self.setMTU(host,1450)