Skip to content

Commit 45fdab6

Browse files
committed
todo
1 parent cbdce82 commit 45fdab6

4 files changed

Lines changed: 122 additions & 1 deletion

File tree

pkg/adaptation/plugin.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package adaptation
22

33
import (
4+
"connectrpc.com/connect"
45
"context"
6+
"errors"
7+
v1 "github.com/docker/secrets-engine/pkg/api/resolver/v1"
8+
"google.golang.org/protobuf/proto"
59
"net"
610
"net/http"
711
"os/exec"
@@ -62,6 +66,36 @@ func newExternalPlugin(conn net.Conn, v setupValidator) (*plugin, error) {
6266
}, nil
6367
}
6468

69+
var (
70+
errIdMismatch = errors.New("id mismatch")
71+
)
72+
73+
func (p *plugin) GetSecret(ctx context.Context, request secrets.Request) (secrets.Envelope, error) {
74+
req := connect.NewRequest(v1.GetSecretRequest_builder{
75+
SecretId: proto.String(request.ID.String()),
76+
}.Build())
77+
resp, err := p.resolverClient.GetSecret(ctx, req)
78+
if err != nil {
79+
return envelopeErr(request, err), err
80+
}
81+
id, err := secrets.ParseID(resp.Msg.GetSecretId())
82+
if err != nil {
83+
return envelopeErr(request, err), err
84+
}
85+
if id != request.ID {
86+
return envelopeErr(request, errIdMismatch), errIdMismatch
87+
}
88+
return secrets.Envelope{
89+
ID: id,
90+
Value: []byte(resp.Msg.GetSecretValue()),
91+
Provider: p.base,
92+
}, nil
93+
}
94+
95+
func envelopeErr(req secrets.Request, err error) secrets.Envelope {
96+
return secrets.Envelope{ID: req.ID, ResolvedAt: time.Now(), Error: err.Error()}
97+
}
98+
6599
func newSocketClient(conn net.Conn) *http.Client {
66100
return &http.Client{
67101
Transport: &http.Transport{

pkg/adaptation/plugin_test.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,85 @@
11
package adaptation
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"github.com/docker/secrets-engine/pkg/api"
7+
"github.com/docker/secrets-engine/pkg/secrets"
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
"net"
11+
"os"
12+
"path/filepath"
13+
"testing"
14+
"time"
15+
16+
p "github.com/docker/secrets-engine/plugin"
17+
)
18+
19+
type mockStub struct {
20+
}
21+
22+
func (m mockStub) GetSecret(ctx context.Context, request secrets.Request) (secrets.Envelope, error) {
23+
return secrets.Envelope{}, nil
24+
}
25+
26+
func (m mockStub) Config() p.Config {
27+
return p.Config{
28+
Version: "v1",
29+
Pattern: "*",
30+
}
31+
}
32+
33+
func (m mockStub) Configure(ctx context.Context, config p.RuntimeConfig) error {
34+
return nil
35+
}
36+
37+
func (m mockStub) Shutdown(context.Context) {
38+
}
39+
40+
func Test_newExternalPlugin(t *testing.T) {
41+
tests := []struct {
42+
name string
43+
test func(t *testing.T)
44+
}{
45+
{
46+
name: "create external plugin",
47+
test: func(t *testing.T) {
48+
t.Setenv("XDG_RUNTIME_DIR", os.TempDir())
49+
socketPath := api.DefaultSocketPath()
50+
os.Remove(socketPath)
51+
require.NoError(t, os.MkdirAll(filepath.Dir(socketPath), 0755))
52+
l, err := net.ListenUnix("unix", &net.UnixAddr{
53+
Name: socketPath,
54+
Net: "unix",
55+
})
56+
go func() {
57+
conn, err := l.Accept()
58+
require.NoError(t, err)
59+
60+
p, err := newExternalPlugin(conn, setupValidator{
61+
out: pluginCfgOut{engineName: "test-engine", engineVersion: "1.0.0", requestTimeout: 30 * time.Second},
62+
acceptPattern: func(pattern secrets.Pattern) error { return nil },
63+
})
64+
assert.NoError(t, err)
65+
defer p.close()
66+
e, err := p.GetSecret(t.Context(), secrets.Request{ID: "foo"})
67+
assert.NoError(t, err)
68+
fmt.Printf("Received envelope: %+v\n", e)
69+
}()
70+
71+
conn, err := net.DialUnix("unix", nil, &net.UnixAddr{Name: socketPath, Net: "unix"})
72+
require.NoError(t, err)
73+
74+
s, err := p.New(&mockStub{}, p.WithPluginName("my-plugin"), p.WithConnection(conn))
75+
require.NoError(t, err)
76+
assert.NoError(t, s.Run(context.Background()))
77+
},
78+
},
79+
}
80+
for _, tt := range tests {
81+
t.Run(tt.name, func(t *testing.T) {
82+
tt.test(t)
83+
})
84+
}
85+
}

pkg/adaptation/registration.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package adaptation
33
import (
44
"context"
55
"errors"
6+
"github.com/sirupsen/logrus"
67
"sync"
78
"time"
89

@@ -40,6 +41,7 @@ type RegisterService struct {
4041
}
4142

4243
func (r *RegisterService) RegisterPlugin(ctx context.Context, c *connect.Request[resolverv1.RegisterPluginRequest]) (*connect.Response[resolverv1.RegisterPluginResponse], error) {
44+
logrus.Infof("Reveived plugin registration request: %s@%s (pattern: %v)", c.Msg.GetName(), c.Msg.GetVersion(), c.Msg.GetPattern())
4345
pattern, err := secrets.ParsePattern(c.Msg.GetPattern())
4446
if err != nil {
4547
return nil, connect.NewError(connect.CodeInvalidArgument, err)

pkg/adaptation/setup.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ func setup(conn net.Conn, v setupValidator) (*setupResult, error) {
5050
var out pluginCfgIn
5151
select {
5252
case r := <-chRegistrationResult:
53+
fmt.Printf("Received registration result: %+v\n", r)
5354
if r.err != nil {
5455
i.Close()
5556
return nil, fmt.Errorf("failed to register plugin: %w", err)
@@ -76,7 +77,7 @@ func (p setupValidator) Validate(in pluginCfgIn) (*pluginCfgOut, error) {
7677
if p.name == "" && in.name == "" {
7778
return nil, errors.New("plugin name is required when not launched by engine")
7879
}
79-
if err := p.acceptPattern(in.pattern); err == nil {
80+
if err := p.acceptPattern(in.pattern); err != nil {
8081
return nil, err
8182
}
8283
return &p.out, nil

0 commit comments

Comments
 (0)