frenetic-lang/frenetic

Unable to load global policies in frenetic shell

ZhijiaCHEN opened this issue · 8 comments

I tried to use frenetic shell to load policies, but the shell crashed at <location> => <location>syntax. Please see the following simple routing policies for a linear topology with two switches.

Policy to load in frenetic shell:

(* This policy would crash frenetic shell *)
(filter ip4Dst = 10.0.0.2 and switch = 1; port:=2; (1@2 => 2@2); port:= 1)+
(filter ip4Dst = 10.0.0.1 and switch = 2; port:= 2; (2@2 => 2@1); port := 1)

(* This policy works fine *)
(*(filter ip4Dst = 10.0.0.2 and switch = 1; port:=2) +
(filter ip4Dst = 10.0.0.2 and switch = 2; port:=1) +
(filter ip4Dst = 10.0.0.1 and switch = 2; port:=2) +
(filter ip4Dst = 10.0.0.1 and switch = 1; port:=1)*)

Shell crash message:

frenetic> load rt.txt
(((pid 13458) (thread_id 0)) "2018-01-14 03:59:28.540971321Z"
 "unhandled exception in Async scheduler"
 ("unhandled exception"
  ((monitor.ml.Error (Frenetic_netkat__Syntax.Non_local)
    ("Raised at file \"src/lib/netkat/Local_compiler.ml\", line 123, characters 32-47"
     "Called from file \"src/lib/async/NetKAT_Controller.ml\", line 39, characters 11-53"
     "Called from file \"src/lib/async/Shell.ml\", line 302, characters 22-43"
     "Called from file \"src/lib/async/Shell.ml\", line 324, characters 30-48"
     "Re-raised at file \"parsing/location.ml\", line 450, characters 12-23"
     "Re-raised at file \"parsing/location.ml\", line 450, characters 12-23"
     "Re-raised at file \"parsing/location.ml\", line 450, characters 12-23"
     "Re-raised at file \"parsing/location.ml\", line 450, characters 12-23"
     "Re-raised at file \"parsing/location.ml\", line 450, characters 12-23"
     "Re-raised at file \"parsing/location.ml\", line 450, characters 12-23"
     "Called from file \"src/lib/async/Shell.ml\", line 329, characters 5-17"
     "Called from file \"src/deferred0.ml\", line 61, characters 64-69"
     "Called from file \"src/job_queue.ml\", line 159, characters 6-47"
     "Caught by monitor main"))
   ((pid 13458) (thread_id 3)))))
frenetic@sdnhubvm:~/src/frenetic/examples/virtual/big-switch$

That's because the file has a global policy but NetKAT is passing it to the local compiler, which is barfing ungracefully.

https://github.com/frenetic-lang/frenetic/blob/master/src/lib/async/NetKAT_Controller.ml#L39

I can think of several ways to resolve it such as invoking the global compiler, or checking that the policy is local so at least we give a nice error message. @smolkaj what do you think we should do?

OK, then I think I should be able to load the policy by invoking global compiler manually.

Yes, the global and virtual compilers are not currently integrated with the shell. I like using the dump command:

frenetic dump global <file> --update-controller

The --update-controler flag allows you to push the resulting tables to the controller.

I see, thanks for the instruction!

I think it's better to give a new subject to this issue. I am changing it to "Unable to load global policies in frenetic shell". Please feel free to revise it if you have something to improve.

Thanks. By the way, I just added a --stdin flag to the dump command, see #602. Once this is merged in, you can write

frenetic dump global --update-controller --stdin "1@1=>2@2"

That's cool! Thanks for your help.

This has been addressed by #604.