Skip to content

Commit 742c3e9

Browse files
authored
feat: load multi wasm plugins (#182)
1. Support load multi wasm file. 2. Support routing strategy between multiple wasm instances 3. Supports hot loading of multiple wasm files 4. Update wasm.go demo
1 parent 17552a5 commit 742c3e9

19 files changed

+415
-201
lines changed

demo/go.sum

+3-2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc
4343
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
4444
github.com/tetratelabs/proxy-wasm-go-sdk v0.1.2-0.20210520063156-d39281baed90 h1:Ze9Uyy8LL0+mcF4UWFKoL2mx3MzptgxeG9nJqSZiK8E=
4545
github.com/tetratelabs/proxy-wasm-go-sdk v0.1.2-0.20210520063156-d39281baed90/go.mod h1:qZ+4i6e2wHlhnhgpH0VG4QFzqd2BEvQbQFU0npt2e2k=
46+
github.com/wasmerio/wasmer-go v1.0.3/go.mod h1:0gzVdSfg6pysA6QVp6iVRPTagC6Wq9pOE8J86WKb2Fk=
4647
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
4748
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
4849
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -98,5 +99,5 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie
9899
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
99100
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
100101
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
101-
mosn.io/layotto/spec v0.0.0-20210707123820-584778d048d3 h1:8GbrNw6AOi4+DrQGG5TbxMNPPRQJ0uXjkSCP2qeKc08=
102-
mosn.io/layotto/spec v0.0.0-20210707123820-584778d048d3/go.mod h1:ex31WL9Vx1PadpZmN4CZpw/57xzBeKIwqMI5fYXi7RY=
102+
mosn.io/proxy-wasm-go-host v0.1.0 h1:WtXMiOpuDyx3Vruf/BUAiu4bo30rSPx68E5vxEBTT6g=
103+
mosn.io/proxy-wasm-go-host v0.1.0/go.mod h1:wBRY9Xjf77GZhvAuEc6nQXZ6dQK39kNU2ok/+Z8mSU8=

demo/wasm/code/golang/wasm.go

+16-4
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
package main
1818

1919
import (
20+
"unsafe"
21+
2022
"github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm"
23+
"github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm/rawhostcall"
2124
"github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm/types"
2225
)
2326

@@ -46,8 +49,6 @@ type myHttpContext struct {
4649

4750
// override
4851
func (ctx *myHttpContext) OnHttpRequestHeaders(numHeaders int, endOfStream bool) types.Action {
49-
proxywasm.LogInfo("golang wasm receive a http request")
50-
5152
hs, err := proxywasm.GetHttpRequestHeaders()
5253
var name string
5354
for _, h := range hs {
@@ -56,12 +57,11 @@ func (ctx *myHttpContext) OnHttpRequestHeaders(numHeaders int, endOfStream bool)
5657
}
5758
}
5859

59-
result, err := proxywasm.CallForeignFunction("SayHello", []byte(`{"service_name":"helloworld","name":"`+name+`"}`))
60+
result, err := proxywasm.CallForeignFunction("SayHello", []byte(`{"service_name":"helloworld","name":"`+name+`_`+ID+`"}`))
6061
if err != nil {
6162
proxywasm.LogErrorf("call foreign func failed: %v", err)
6263
}
6364
proxywasm.SetHttpResponseBody(result)
64-
6565
return types.ActionContinue
6666
}
6767

@@ -70,3 +70,15 @@ func proxyOnMemoryAllocate(size uint) *byte {
7070
buf := make([]byte, size)
7171
return &buf[0]
7272
}
73+
74+
const ID = "id_1"
75+
76+
// DO NOT MODIFY THE FOLLOWING FUNCTIONS!
77+
//export proxy_get_id
78+
func GetID() types.Status {
79+
_ = ID[len(ID)-1]
80+
81+
id := ID
82+
bt := *(*[]byte)(unsafe.Pointer(&id))
83+
return rawhostcall.ProxySetBufferBytes(types.BufferTypeCallData, 0, len(ID), &bt[0], len(ID))
84+
}

demo/wasm/code/golang/wasm_1_1.wasm

250 KB
Binary file not shown.

demo/wasm/code/golang/wasm_1_2.wasm

250 KB
Binary file not shown.

demo/wasm/code/golang/wasm_2.wasm

250 KB
Binary file not shown.

demo/wasm/config.json

+23-5
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,29 @@
4646
{
4747
"type": "Layotto",
4848
"config": {
49-
"name": "wasm_demo",
50-
"instance_num": 1,
51-
"vm_config": {
52-
"engine": "wasmer",
53-
"path": "demo/wasm/code/golang/wasm.wasm"
49+
"id_1_1": {
50+
"name": "id_1",
51+
"instance_num": 1,
52+
"vm_config": {
53+
"engine": "wasmer",
54+
"path": "demo/wasm/code/golang/wasm_1_1.wasm"
55+
}
56+
},
57+
"id_1_2": {
58+
"name": "id_1",
59+
"instance_num": 2,
60+
"vm_config": {
61+
"engine": "wasmer",
62+
"path": "demo/wasm/code/golang/wasm_1_2.wasm"
63+
}
64+
},
65+
"id_2": {
66+
"name": "id_2",
67+
"instance_num": 1,
68+
"vm_config": {
69+
"engine": "wasmer",
70+
"path": "demo/wasm/code/golang/wasm_2.wasm"
71+
}
5472
}
5573
}
5674
}

go.mod

+3-2
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,18 @@ require (
1414
github.com/pkg/errors v0.9.1
1515
github.com/shirou/gopsutil v3.21.3+incompatible
1616
github.com/stretchr/testify v1.7.0
17+
github.com/tetratelabs/proxy-wasm-go-sdk v0.1.2-0.20210520063156-d39281baed90
1718
github.com/tklauser/go-sysconf v0.3.5 // indirect
1819
github.com/urfave/cli v1.22.1
1920
github.com/valyala/fasthttp v1.26.0
2021
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect
2122
google.golang.org/grpc v1.39.0
2223
google.golang.org/grpc/examples v0.0.0-20210526223527-2de42fcbbce3 // indirect
2324
google.golang.org/protobuf v1.27.1
24-
mosn.io/api v0.0.0-20210414070543-8a0686b03540
25+
mosn.io/api v0.0.0-20210714065837-5b4c2d66e70c
2526
mosn.io/layotto/components v0.0.0-20210625065826-9c2ad8dbcf05
2627
mosn.io/layotto/spec v0.0.0-20210707123820-584778d048d3
27-
mosn.io/mosn v0.23.0
28+
mosn.io/mosn v0.24.1-0.20210817133744-f3fc4c31ddee
2829
mosn.io/pkg v0.0.0-20210604065522-6e8f5a087814
2930
mosn.io/proxy-wasm-go-host v0.0.0-20210312032409-2334f9cf62ec
3031
)

go.sum

+17-4
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q
110110
github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
111111
github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798 h1:2T/jmrHeTezcCM58lvEQXs0UpQJCo5SoGAcg+mbSTIg=
112112
github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
113+
github.com/HdrHistogram/hdrhistogram-go v1.0.1/go.mod h1:BWJ+nMSHY3L41Zj7CA3uXnloDp7xxV0YvstAE7nKTaM=
113114
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
114115
github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
115116
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
@@ -459,6 +460,7 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
459460
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
460461
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
461462
github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
463+
github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
462464
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
463465
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
464466
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
@@ -794,8 +796,9 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5
794796
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
795797
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
796798
github.com/microcosm-cc/bluemonday v1.0.7/go.mod h1:HOT/6NaBlR0f9XlxD3zolN6Z3N8Lp4pvhp+jLS5ihnI=
797-
github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA=
798799
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
800+
github.com/miekg/dns v1.1.25 h1:dFwPR6SfLtrSwgDcIq2bcU/gVutB4sNApq2HBdqcakg=
801+
github.com/miekg/dns v1.1.25/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
799802
github.com/minio/highwayhash v1.0.0/go.mod h1:xQboMTeM9nY9v/LlAOxFctujiv5+Aq2hR5dxBpaMbdc=
800803
github.com/minio/highwayhash v1.0.1 h1:dZ6IIu8Z14VlC0VpfKofAhCy74wu/Qb5gcn52yWoz/0=
801804
github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY=
@@ -1093,6 +1096,8 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69
10931096
github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ=
10941097
github.com/testcontainers/testcontainers-go v0.9.0/go.mod h1:b22BFXhRbg4PJmeMVWh6ftqjyZHgiIl3w274e9r3C2E=
10951098
github.com/tetratelabs/proxy-wasm-go-sdk v0.0.13/go.mod h1:y1ZQT4bQEBnR8Do4nSOzb3roczzPvcAp8UrF6NEYWNY=
1099+
github.com/tetratelabs/proxy-wasm-go-sdk v0.1.2-0.20210520063156-d39281baed90 h1:Ze9Uyy8LL0+mcF4UWFKoL2mx3MzptgxeG9nJqSZiK8E=
1100+
github.com/tetratelabs/proxy-wasm-go-sdk v0.1.2-0.20210520063156-d39281baed90/go.mod h1:qZ+4i6e2wHlhnhgpH0VG4QFzqd2BEvQbQFU0npt2e2k=
10961101
github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0=
10971102
github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k=
10981103
github.com/tidwall/gjson v1.2.1/go.mod h1:c/nTNbUr0E0OrXEhq1pwa8iEgc2DOt4ZZqAt1HtCkPA=
@@ -1112,6 +1117,8 @@ github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlp
11121117
github.com/trainyao/go-maglev v0.0.0-20200611125015-4c1ae64d96a8 h1:o6jtI8/BV93ZCw681cNVMjyvLfnBboUP/lBOfmkb4Pg=
11131118
github.com/trainyao/go-maglev v0.0.0-20200611125015-4c1ae64d96a8/go.mod h1:VBsRn0SDTltC3/SzN6SgXlQtmBk6U5sf0KW+eT+WMbc=
11141119
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
1120+
github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
1121+
github.com/uber/jaeger-lib v2.4.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
11151122
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
11161123
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
11171124
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
@@ -1260,6 +1267,7 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
12601267
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
12611268
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
12621269
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
1270+
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
12631271
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
12641272
golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
12651273
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -1331,6 +1339,7 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL
13311339
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
13321340
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
13331341
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
1342+
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
13341343
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
13351344
golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
13361345
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -1411,6 +1420,8 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w
14111420
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
14121421
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
14131422
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
1423+
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
1424+
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
14141425
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
14151426
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
14161427
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1503,6 +1514,7 @@ golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgw
15031514
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
15041515
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
15051516
golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
1517+
golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
15061518
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
15071519
golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
15081520
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -1766,11 +1778,12 @@ k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKf
17661778
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM=
17671779
k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
17681780
mosn.io/api v0.0.0-20210204052134-5b9a826795fd/go.mod h1:TBv4bz2f2RbpgdohbVAFRFVOoN8YyEUiLH3jAh752Qc=
1769-
mosn.io/api v0.0.0-20210414070543-8a0686b03540 h1:hdfOaKU2c5jpLCdJC22IQ8kR7qVCUtl6dSq/FsepnuY=
17701781
mosn.io/api v0.0.0-20210414070543-8a0686b03540/go.mod h1:TBv4bz2f2RbpgdohbVAFRFVOoN8YyEUiLH3jAh752Qc=
1782+
mosn.io/api v0.0.0-20210714065837-5b4c2d66e70c h1:DBzFfP1xalj3nnROidazArdP/QxbI1PHSMCKi7sAaQM=
1783+
mosn.io/api v0.0.0-20210714065837-5b4c2d66e70c/go.mod h1:TBv4bz2f2RbpgdohbVAFRFVOoN8YyEUiLH3jAh752Qc=
17711784
mosn.io/mosn v0.22.1-0.20210425073346-b6880db4669c/go.mod h1:YJmivhBjRLif073XgEQRIlEpk15/S4V7cysS2H/40io=
1772-
mosn.io/mosn v0.23.0 h1:XwI99UnGFZ336hCxyEoM97MJ5aJI5F127zNKfCRGQ64=
1773-
mosn.io/mosn v0.23.0/go.mod h1:9miwkXcUXDYHYIgS+PqyapiRQFpoeNaQDxG2UdGLS3Y=
1785+
mosn.io/mosn v0.24.1-0.20210817133744-f3fc4c31ddee h1:rSda+aicdWTQpckhjN0oF6TuakCuOmv14TmNhbB7NLU=
1786+
mosn.io/mosn v0.24.1-0.20210817133744-f3fc4c31ddee/go.mod h1:t8FDJezfK6iMVYYSs5G74tZGFkFHPsOfiX/TY9EtIYM=
17741787
mosn.io/pkg v0.0.0-20210401090620-f0e0d1a3efce/go.mod h1:YEv5sGe7kqo/Yzj7OJI7Udl3iUcagNeo5unGPiUaUfw=
17751788
mosn.io/pkg v0.0.0-20210604065522-6e8f5a087814 h1:42A6tqajl/hGKkSVLa3mCnaQh8i568Zxgtx0ZECjCmw=
17761789
mosn.io/pkg v0.0.0-20210604065522-6e8f5a087814/go.mod h1:YEv5sGe7kqo/Yzj7OJI7Udl3iUcagNeo5unGPiUaUfw=

pkg/wasm/abi.go

+31
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package wasm
1818

1919
import (
20+
sdkTypes "github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm/types"
2021
"mosn.io/mosn/pkg/types"
2122
"mosn.io/mosn/pkg/wasm/abi"
2223
v1 "mosn.io/mosn/pkg/wasm/abi/proxywasm010"
@@ -39,6 +40,36 @@ type AbiV2Impl struct {
3940
v1.ABIContext
4041
}
4142

43+
var (
44+
_ types.ABIHandler = &AbiV2Impl{}
45+
_ Exports = &AbiV2Impl{}
46+
)
47+
4248
func (a *AbiV2Impl) Name() string {
4349
return AbiV2
4450
}
51+
52+
func (a *AbiV2Impl) GetABIExports() interface{} {
53+
return a
54+
}
55+
56+
func (a *AbiV2Impl) ProxyGetID() (string, error) {
57+
ff, err := a.Instance.GetExportsFunc("proxy_get_id")
58+
if err != nil {
59+
return "", err
60+
}
61+
res, err := ff.Call()
62+
if err != nil {
63+
a.Instance.HandleError(err)
64+
return "", err
65+
}
66+
a.Imports.Wait()
67+
68+
status := sdkTypes.Status(res.(int32))
69+
if err := sdkTypes.StatusToError(status); err != nil {
70+
a.Instance.HandleError(err)
71+
return "", err
72+
}
73+
74+
return string(a.Imports.GetFuncCallData().Bytes()), nil
75+
}

pkg/wasm/config.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,17 @@ import (
2525
"mosn.io/mosn/pkg/log"
2626
)
2727

28-
type filterConfig struct {
28+
type filterConfigItem struct {
2929
FromWasmPlugin string `json:"from_wasm_plugin,omitempty"`
3030
VmConfig *v2.WasmVmConfig `json:"vm_config,omitempty"`
3131
InstanceNum int `json:"instance_num,omitempty"`
3232
RootContextID int32 `json:"root_context_id,omitempty"`
3333
UserData map[string]string `json:"-"`
34+
PluginName string `json:"-"`
3435
}
3536

36-
func parseFilterConfig(cfg map[string]interface{}) (*filterConfig, error) {
37-
config := filterConfig{
37+
func parseFilterConfigItem(cfg map[string]interface{}) (*filterConfigItem, error) {
38+
config := filterConfigItem{
3839
UserData: make(map[string]string),
3940
RootContextID: 1, // default value is 1
4041
}
@@ -63,7 +64,7 @@ func parseFilterConfig(cfg map[string]interface{}) (*filterConfig, error) {
6364
return &config, nil
6465
}
6566

66-
func checkVmConfig(config *filterConfig) error {
67+
func checkVmConfig(config *filterConfigItem) error {
6768
if config.FromWasmPlugin != "" {
6869
config.VmConfig = nil
6970
config.InstanceNum = 0
@@ -81,7 +82,7 @@ func checkVmConfig(config *filterConfig) error {
8182
return nil
8283
}
8384

84-
func parseUserData(rawConfigBytes []byte, config *filterConfig) error {
85+
func parseUserData(rawConfigBytes []byte, config *filterConfigItem) error {
8586
if len(rawConfigBytes) == 0 || config == nil {
8687
log.DefaultLogger.Errorf("[proxywasm][config] fail to parse user data, invalid param, raw: %v, config: %v",
8788
string(rawConfigBytes), config)

pkg/wasm/config_test.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717
package wasm
1818

1919
import (
20-
"github.com/stretchr/testify/assert"
2120
"testing"
21+
22+
"github.com/stretchr/testify/assert"
2223
)
2324

2425
func TestXProxyWasmConfigFromGlobalPlugin(t *testing.T) {
@@ -29,7 +30,7 @@ func TestXProxyWasmConfigFromGlobalPlugin(t *testing.T) {
2930
"user_config2": "user_value2",
3031
}
3132

32-
config, err := parseFilterConfig(configMap)
33+
config, err := parseFilterConfigItem(configMap)
3334
assert.Nil(t, err)
3435
assert.Nil(t, config.VmConfig)
3536
assert.Equal(t, config.InstanceNum, 0)
@@ -42,7 +43,7 @@ func TestXProxyWasmConfigWithoutUserData(t *testing.T) {
4243
"instance_num": 2,
4344
}
4445

45-
config, err := parseFilterConfig(configMap)
46+
config, err := parseFilterConfigItem(configMap)
4647
assert.Nil(t, err)
4748
assert.Nil(t, config.VmConfig)
4849
assert.Equal(t, config.InstanceNum, 0)
@@ -63,7 +64,7 @@ func TestXProxyWasmConfigWithVM(t *testing.T) {
6364
"user_config4": "user_value4",
6465
}
6566

66-
config, err := parseFilterConfig(configMap)
67+
config, err := parseFilterConfigItem(configMap)
6768
assert.Nil(t, err)
6869
assert.Equal(t, config.FromWasmPlugin, "")
6970
assert.NotNil(t, config.VmConfig)

pkg/wasm/dispatch.go

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package wasm
2+
3+
import (
4+
"errors"
5+
"math/rand"
6+
7+
"mosn.io/mosn/pkg/log"
8+
)
9+
10+
type Group struct {
11+
count int
12+
plugins []*WasmPlugin
13+
}
14+
15+
type Router struct {
16+
routes map[string]*Group
17+
}
18+
19+
// RegisterRoute register a group with id
20+
// unsafe for concurrent
21+
func (route *Router) RegisterRoute(id string, plugin *WasmPlugin) {
22+
if group, found := route.routes[id]; found {
23+
group.count += 1
24+
group.plugins = append(group.plugins, plugin)
25+
} else {
26+
route.routes[id] = &Group{
27+
count: 1,
28+
plugins: []*WasmPlugin{plugin},
29+
}
30+
}
31+
}
32+
33+
func (route *Router) GetRandomPluginByID(id string) (*WasmPlugin, error) {
34+
group, ok := route.routes[id]
35+
if !ok {
36+
log.DefaultLogger.Errorf("[proxywasm][filter] GetRandomPluginByID id not registered, id: %s", id)
37+
return nil, errors.New("id is not registered")
38+
}
39+
40+
idx := rand.Intn(group.count)
41+
plugin := group.plugins[idx]
42+
log.DefaultLogger.Infof("[proxywasm][dispatch] GetRandomPluginByID return index: %d, plugin: %s", idx, plugin.pluginName)
43+
return plugin, nil
44+
45+
}

pkg/wasm/exports.go

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package wasm
2+
3+
import "mosn.io/proxy-wasm-go-host/proxywasm"
4+
5+
type Exports interface {
6+
proxywasm.Exports
7+
8+
// ProxyGetID return the id
9+
ProxyGetID() (string, error)
10+
}

0 commit comments

Comments
 (0)