Skip to content

super basic wasm filter implementation using wazero#2947

Open
szuecs wants to merge 3 commits intomasterfrom
feature/wasm-filter
Open

super basic wasm filter implementation using wazero#2947
szuecs wants to merge 3 commits intomasterfrom
feature/wasm-filter

Conversation

@szuecs
Copy link
Copy Markdown
Member

@szuecs szuecs commented Feb 19, 2024

A very simple implementation to test how WASM support #2946 could look like.

wasm code compile with tinygo, but it could also be some other compiler:

% tinygo build -o add.wasm -target=wasi add.go

export request (add(x,y)) and response (sub(x,y))

% cat /home/sszuecs/go/src/github.com/zalando/skipper/filters/wasm/testdata/add.go
package main

//export request
func request(x, y uint32) uint32 {
        return x + y
}

//export response
func response(x, y uint32) uint32 {
        return x - y
}

// main is required for the `wasi` target, even if it isn't used.
// See https://wazero.io/languages/tinygo/#why-do-i-have-to-define-main
func main() {}
% ./bin/skipper -inline-routes='r: * -> status(200) -> wasm("file:///home/sszuecs/go/src/github.com/zalando/skipper/filters/wasm/testdata/add.wasm") -> <shunt>'
[APP]INFO[0000] Expose metrics in codahale format
[APP]INFO[0000] enable swarm: false
[APP]INFO[0000] Replacing tee filter specification
[APP]INFO[0000] Replacing teenf filter specification
[APP]INFO[0000] Replacing lua filter specification
[APP]INFO[0000] support listener on :9911
[APP]INFO[0000] Dataclients are updated once, first load complete
[APP]INFO[0000] Listen on :9090
[APP]INFO[0000] route settings, reset, route: r: * -> status(200) -> wasm("file:///home/sszuecs/go/src/github.com/zalando/skipper/filters/wasm/testdata/add.wasm") -> <shunt>
[APP]INFO[0000] route settings received
[APP]INFO[0000] TLS settings not found, defaulting to HTTP
[APP]INFO[0000] route settings applied
[APP]INFO[0012] request result: [5]     <- request(2,3) result
[APP]INFO[0012] response result: [1]    <- response(3,2) result
::1 - - [19/Feb/2024:17:35:54 +0100] "GET /foo HTTP/1.1" 200 0 "-" "curl/7.49.0" 0 localhost:9090 - -

Load error would look like:

[APP]INFO[0000] route settings, reset, route: r: * -> status(200) -> wasm("file://filters/wasm/testdata/add.wasm") -> <shunt>
[APP]INFO[0000] route settings received
[APP]ERRO[0000] Failed to load file "/wasm/testdata/add.wasm": open /wasm/testdata/add.wasm: no such file or directory
[APP]ERRO[0000] failed to process route r: failed to create filter "wasm": invalid filter parameters
[APP]INFO[0000] route settings applied

Signed-off-by: Sandor Szücs <sandor.szuecs@zalando.de>
Comment thread filters/wasm/wasm.go

switch u.Scheme {
case "file":
code, err = os.ReadFile(u.Path)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should make this lazy and cacheable and cleanup on filter close

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, as I wrote in the PR title super basic. I used https://github.com/tetratelabs/wazero/tree/main/examples/basic to test the super basic example.

feature: use compilation cache
refactor: pass context from request to wasm call

Signed-off-by: Sandor Szücs <sandor.szuecs@zalando.de>
Signed-off-by: Sandor Szücs <sandor.szuecs@zalando.de>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants