Materials for the LambdaNantes 4 workshop: An Introduction to Unikernels with OCaml!
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

pom Pom pom

xvw eff78087 5ecd007e

+98
+1
dune-project
··· 33 33 (description "Umbrella package for unikernels") 34 34 (depends 35 35 (ocaml (>= 5.4.0)) 36 + mcrunch 36 37 solo5 37 38 ocaml-solo5 38 39 mkernel
+1
unikernels.opam
··· 11 11 depends: [ 12 12 "dune" {>= "3.21"} 13 13 "ocaml" {>= "5.4.0"} 14 + "mcrunch" 14 15 "solo5" 15 16 "ocaml-solo5" 16 17 "mkernel"
+33
unikernels/web_html_server/dune
··· 1 + (executable 2 + (name main) 3 + (package unikernels) 4 + (public_name unikernels.web_html_server) 5 + (link_flags :standard -cclib "-z solo5-abi=hvt") 6 + (foreign_stubs 7 + (language c) 8 + (names web_html_manifest)) 9 + (libraries mkernel mirage-crypto-rng-mkernel mnet gmp vifu) 10 + (modules main documents)) 11 + 12 + (rule 13 + (targets web_html_manifest.c) 14 + (deps web_html_manifest.json) 15 + (enabled_if 16 + (= %{context_name} "solo5")) 17 + (action 18 + (run solo5-elftool gen-manifest web_html_manifest.json web_html_manifest.c))) 19 + 20 + (rule 21 + (targets web_html_manifest.c) 22 + (enabled_if 23 + (= %{context_name} "default")) 24 + (action 25 + (write-file web_html_manifest.c ""))) 26 + 27 + (rule 28 + (targets documents.ml) 29 + (deps index.html style.css) 30 + (action 31 + (run mcrunch --list --file index:index.html --file style:style.css -o documents.ml))) 32 + 33 + (vendored_dirs vendors)
+19
unikernels/web_html_server/index.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 + <title>My Unikernel Hello World</title> 7 + <link rel="stylesheet" href="/style.css"> 8 + </head> 9 + <body> 10 + <main> 11 + <div> 12 + <h1>Hello, Lambda Nantes</h1> 13 + <p> 14 + This an operating system dedicated to this page! 15 + </p> 16 + </div> 17 + </main> 18 + </body> 19 + </html>
+37
unikernels/web_html_server/main.ml
··· 1 + (* Initialize a Secure Random Number generator. *) 2 + let rng = 3 + Mkernel.map 4 + (fun () -> 5 + Mirage_crypto_rng_mkernel.initialize (module Mirage_crypto_rng.Fortuna)) 6 + [] 7 + ;; 8 + 9 + (* An helper for finalizing resources (because Miou, the Scheduler, ask 10 + for every task to be terminated) *) 11 + let ( let@ ) finally fn = Fun.protect ~finally fn 12 + let clean_rng rng () = Mirage_crypto_rng_mkernel.kill rng 13 + let clean_stack stack () = Mnet.kill stack 14 + 15 + let index req _server () = 16 + let open Vifu.Response.Syntax in 17 + let source = Flux.Source.list Documents.index in 18 + let* () = Vifu.Response.with_text req "Hello, Lambda Nantes!\n" in 19 + Vifu.Response.respond `OK 20 + ;; 21 + 22 + (* Route of the application *) 23 + let routes = 24 + let open Vifu.Uri in 25 + Vifu.Route.[ get (rel /?? any) --> handler ] 26 + ;; 27 + 28 + (* Main program *) 29 + let () = 30 + let ipv4 = Ipaddr.V4.Prefix.of_string_exn "10.0.0.2/24" in 31 + Mkernel.run 32 + [ rng; Mnet.stack ~name:"service" ipv4 ] 33 + (fun rng (stack, tcp, _) () -> 34 + let@ () = clean_rng rng in 35 + let@ () = clean_stack stack in 36 + Vifu.run ~cfg:(Vifu.Config.v 80) tcp routes ()) 37 + ;;
+6
unikernels/web_html_server/style.css
··· 1 + body { 2 + background-color: #111; 3 + color: #fff; 4 + font-family: sans-serif; 5 + padding: 2rem; 6 + }
+1
unikernels/web_html_server/web_html_manifest.json
··· 1 + {"type":"solo5.manifest","version":1,"devices":[{"type":"NET_BASIC","name":"service"}]}