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)