Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions pkg/stub/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@ import (
type mockPlugin struct {
}

func (m mockPlugin) Config() Config {
return Config{}
}

func (m mockPlugin) Configure(context.Context, RuntimeConfig) error {
return nil
}

func (m mockPlugin) GetSecret(context.Context, secrets.Request) (secrets.Envelope, error) {
return secrets.Envelope{}, nil
}
Expand Down
73 changes: 73 additions & 0 deletions pkg/stub/register.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package stub

import (
"context"
"fmt"
"net"
"net/http"
"time"

"connectrpc.com/connect"
"github.com/sirupsen/logrus"
"google.golang.org/protobuf/proto"

resolverv1 "github.com/docker/secrets-engine/pkg/api/resolver/v1"
"github.com/docker/secrets-engine/pkg/api/resolver/v1/resolverv1connect"
)

type registerClient struct {
engineClient resolverv1connect.EngineServiceClient
pluginName string
plugin Plugin
timeout time.Duration
}

func newRegisterClient(conn net.Conn, pluginName string, plugin Plugin, timeout time.Duration) *registerClient {
return &registerClient{
engineClient: resolverv1connect.NewEngineServiceClient(createHTTPClient(conn), "http://unix"),
pluginName: pluginName,
plugin: plugin,
timeout: timeout,
}
}

func createHTTPClient(conn net.Conn) *http.Client {
return &http.Client{
Transport: &http.Transport{
DialContext: func(context.Context, string, string) (net.Conn, error) {
return conn, nil
},
},
}
}

func (c *registerClient) register(ctx context.Context) (*RuntimeConfig, error) {
logrus.Infof("Registering plugin %s...", c.pluginName)
ctx, cancel := context.WithTimeout(ctx, c.timeout)
defer cancel()
config := c.plugin.Config()
req := connect.NewRequest(resolverv1.RegisterPluginRequest_builder{
Name: proto.String(c.pluginName),
Version: proto.String(config.Version),
Pattern: proto.String(config.Pattern),
}.Build())
resp, err := c.engineClient.RegisterPlugin(ctx, req)
if err != nil {
return nil, fmt.Errorf("failed to register with secrets engine: %w", err)
}
return &RuntimeConfig{
Config: resp.Msg.GetConfig(),
Engine: resp.Msg.GetEngineName(),
Version: resp.Msg.GetEngineVersion(),
}, nil
}

func DoRegister(ctx context.Context, conn net.Conn, pluginName string, plugin Plugin, timeout time.Duration) (*RuntimeConfig, error) {
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Export again is temporary to make the linter happy.

client := newRegisterClient(conn, pluginName, plugin, timeout)
resp, err := client.register(ctx)
if err != nil {
return nil, fmt.Errorf("failed to register plugin %s: %w", pluginName, err)
}
logrus.Infof("Plugin %s registered successfully", pluginName)
return resp, nil
}
16 changes: 16 additions & 0 deletions pkg/stub/stub.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,25 @@ import (
type Plugin interface {
secrets.Resolver

Config() Config

Configure(context.Context, RuntimeConfig) error

Shutdown(context.Context)
}

type RuntimeConfig struct {
Config string
Engine string
Version string
}

type Config struct {
Version string

Pattern string
}

// Stub is the interface the stub provides for the plugin implementation.
type Stub interface {
// RegistrationTimeout returns the registration timeout for the stub.
Expand Down