-
Notifications
You must be signed in to change notification settings - Fork 16
/
plugin.go
68 lines (54 loc) · 1.47 KB
/
plugin.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package plugin
import (
"net"
sdkPlugin "github.com/gatewayd-io/gatewayd-plugin-sdk/plugin"
v1 "github.com/gatewayd-io/gatewayd-plugin-sdk/plugin/v1"
gerr "github.com/gatewayd-io/gatewayd/errors"
)
type Plugin sdkPlugin.Plugin
type IPlugin interface {
Start() (net.Addr, error)
Stop()
Dispense() (v1.GatewayDPluginServiceClient, *gerr.GatewayDError)
Ping() *gerr.GatewayDError
}
var _ IPlugin = (*Plugin)(nil)
// Start starts the plugin.
func (p *Plugin) Start() (net.Addr, error) {
var addr net.Addr
var err error
if addr, err = p.Client.Start(); err != nil {
return nil, gerr.ErrFailedToStartPlugin.Wrap(err)
}
return addr, nil
}
// Stop kills the plugin.
func (p *Plugin) Stop() {
p.Client.Kill()
}
// Dispense returns the plugin client.
func (p *Plugin) Dispense() (v1.GatewayDPluginServiceClient, *gerr.GatewayDError) {
rpcClient, err := p.Client.Client()
if err != nil {
return nil, gerr.ErrFailedToGetRPCClient.Wrap(err)
}
raw, err := rpcClient.Dispense(p.ID.Name)
if err != nil {
return nil, gerr.ErrFailedToDispensePlugin.Wrap(err)
}
if gatewaydPlugin, ok := raw.(v1.GatewayDPluginServiceClient); ok {
return gatewaydPlugin, nil
}
return nil, gerr.ErrPluginNotReady
}
// Ping pings the plugin.
func (p *Plugin) Ping() *gerr.GatewayDError {
rpcClient, err := p.Client.Client()
if err != nil {
return gerr.ErrFailedToGetRPCClient.Wrap(err)
}
if err := rpcClient.Ping(); err != nil {
return gerr.ErrFailedToPingPlugin.Wrap(err)
}
return nil
}