def invariant_check_prompt(self): answer = msg.raw_input('Check Invariants? [Ny]') if answer != '' and answer.lower() != 'n': msg.interactive("Which one?") msg.interactive(" 'l' - loops") msg.interactive(" 'b' - blackholes") msg.interactive(" 'r' - routing consistency") msg.interactive(" 'c' - connectivity") msg.interactive(" 'o' - omega") answer = msg.raw_input(" ") result = None if answer.lower() == 'l': result = self.invariant_checker.check_loops() elif answer.lower() == 'b': result = self.invariant_checker.check_blackholes() elif answer.lower() == 'r': result = self.invariant_checker.check_routing_consistency() elif answer.lower() == 'c': result = self.invariant_checker.check_connectivity() elif answer.lower() == 'o': result = self.invariant_checker.check_correspondence(self.live_switches, self.live_links, self.access_links) else: log.warn("Unknown input...") if result is None: return else: msg.interactive("Result: %s" % str(result))
def dataplane_trace_prompt(self): if self.dataplane_trace: while True: answer = msg.raw_input('Feed in next dataplane event? [Ny]') if answer != '' and answer.lower() != 'n': self.inject_trace_event() else: break
def loop(self, steps=None): self.running = True end_time = self.logical_time + steps if steps else sys.maxint while self.running and self.logical_time < end_time: self.logical_time += 1 self.trigger_events() msg.event("Round %d completed." % self.logical_time) if self.interactive: # TODO: print out the state of the network at each timestep? Take a # verbose flag.. self.invariant_check_prompt() self.dataplane_trace_prompt() answer = msg.raw_input('Continue to next round? [Yn]').strip() if answer != '' and answer.lower() != 'y': self.stop() break else: # not self.interactive if (self.logical_time % self.check_interval) == 0: # Time to run correspondence! # spawn a thread for running correspondence. Make sure the controller doesn't # think we've gone idle though: send OFP_ECHO_REQUESTS every few seconds # TODO: this is a HACK def do_correspondence(): any_policy_violations = self.invariant_checker.check_correspondence(self.live_switches, self.live_links, self.access_links) if any_policy_violations: msg.fail("There were policy-violations!") else: msg.interactive("No policy-violations!") thread = threading.Thread(target=do_correspondence) thread.start() while thread.isAlive(): for switch in self.live_switches: # connection -> deferred io worker -> io worker switch.send(of.ofp_echo_request().pack()) thread.join(2.0) if self.dataplane_trace and (self.logical_time % self.trace_interval) == 0: self.inject_trace_event() time.sleep(self.delay)