diff --git a/pkg/catalog/catalog.go b/pkg/catalog/catalog.go index 092e01b..50ef5b2 100644 --- a/pkg/catalog/catalog.go +++ b/pkg/catalog/catalog.go @@ -151,6 +151,25 @@ func New(ctx context.Context, config Config, repo api.Repository, builtIns ...Bu reconfigurers = append(reconfigurers, reconfigurer) } + // Inject the plugin build information + buildInfoSetter, okBuildInfoSetter := plugin.Info().(BuildInfoSetter) + metadata, okMetadata := cfrer.(MetadataRetriever) + if okBuildInfoSetter && okMetadata { + value := metadata.GetMetadataByKey(BuildInfoMetadata) + if value == nil { + value = "" + } + if buildInfo, ok := value.(string); ok && buildInfo != "" { + buildInfoSetter.SetValue(buildInfo) + } + } + if !okBuildInfoSetter { + plugin.Logger().Warn("Plugin does not has support for setting the build info") + } + if !okMetadata { + plugin.Logger().Warn("Plugin configurer does not has support for getting the build info as metadata") + } + plugin.Logger().Info("Loaded plugin") pluginCounts[pluginConfig.Type]++ } diff --git a/pkg/catalog/configure.go b/pkg/catalog/configure.go index 411a614..7a75af0 100644 --- a/pkg/catalog/configure.go +++ b/pkg/catalog/configure.go @@ -9,6 +9,9 @@ import ( "log/slog" "strings" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "github.com/openkcm/plugin-sdk/api" "github.com/openkcm/plugin-sdk/pkg/plugin" configv1 "github.com/openkcm/plugin-sdk/proto/service/common/config/v1" @@ -65,6 +68,10 @@ type Reconfigurable struct { } func (r *Reconfigurable) Reconfigure(ctx context.Context) { + if r.DataSource == nil { + return + } + if dataHash, err := ConfigurePlugin(ctx, r.Configurer, r.DataSource, r.LastHash); err != nil { r.Log.Error("Failed to reconfigure plugin", "error", err) } else if dataHash == r.LastHash { @@ -97,7 +104,11 @@ func configurePlugin(ctx context.Context, pluginLog *slog.Logger, configurer Con if !dataSource.IsDynamic() { pluginLog.With("reconfigurable", false).Info("Configured plugin") - return nil, nil + + return &Reconfigurable{ + Log: pluginLog, + Configurer: configurer, + }, nil } pluginLog.With("reconfigurable", true).With("hash", dataHash).Info("Configured plugin") @@ -141,6 +152,8 @@ type configurerV1 struct { plugin.Facade configv1.ConfigServiceClient + + metadata map[string]string } var _ Configurer = (*configurerV1)(nil) @@ -155,10 +168,25 @@ func (v1 *configurerV1) Version() uint { return 1 } -func (v1 *configurerV1) Configure(ctx context.Context, yamlConfiguration string) error { - _, err := v1.ConfigServiceClient.Configure(ctx, &configv1.ConfigureRequest{ - YamlConfiguration: yamlConfiguration, +func (v1 *configurerV1) GetMetadataByKey(key string) any { + if metadata, ok := v1.metadata[key]; ok { + return metadata + } + return nil +} + +func (v1 *configurerV1) Configure(ctx context.Context, data string) error { + resp, err := v1.ConfigServiceClient.Configure(ctx, &configv1.ConfigureRequest{ + YamlConfiguration: data, }) + switch status.Code(err) { + case codes.OK: + if v1.metadata == nil { + v1.metadata = make(map[string]string) + } + v1.metadata[BuildInfoMetadata] = extractBuildInfo(resp) + } + return err } @@ -167,3 +195,15 @@ func hashData(data string) string { _, _ = io.Copy(h, strings.NewReader(data)) return hex.EncodeToString(h.Sum(nil)[:16]) } + +func extractBuildInfo(resp *configv1.ConfigureResponse) string { + defer func() { + _ = recover() + }() + + if resp == nil { + return "" + } + + return strings.TrimSpace(resp.GetBuildInfo()) +} diff --git a/pkg/catalog/configurer.go b/pkg/catalog/configurer.go deleted file mode 100644 index f56ae2e..0000000 --- a/pkg/catalog/configurer.go +++ /dev/null @@ -1,48 +0,0 @@ -package catalog - -import ( - "context" - "strings" - - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - - configv1 "github.com/openkcm/plugin-sdk/proto/service/common/config/v1" -) - -type Configurers []*configurer - -type configurer struct { - plugin Plugin - pluginConfig PluginConfig -} - -func (c *configurer) Configure(ctx context.Context) error { - client := configv1.NewConfigClient(c.plugin.ClientConnection()) - resp, err := client.Configure(ctx, &configv1.ConfigureRequest{ - YamlConfiguration: c.pluginConfig.YamlConfiguration, - }) - switch status.Code(err) { - case codes.Unimplemented: - return nil - case codes.OK: - sbi, ok := c.plugin.Info().(Build) - if ok { - sbi.SetValue(extractBuildInfo(resp)) - } - return nil - } - return err -} - -func extractBuildInfo(resp *configv1.ConfigureResponse) string { - defer func() { - _ = recover() - }() - - if resp == nil { - return "" - } - - return strings.TrimSpace(resp.GetBuildInfo()) -} diff --git a/pkg/catalog/metadata.go b/pkg/catalog/metadata.go new file mode 100644 index 0000000..94307e8 --- /dev/null +++ b/pkg/catalog/metadata.go @@ -0,0 +1,9 @@ +package catalog + +const ( + BuildInfoMetadata = "BuildInfo" +) + +type MetadataRetriever interface { + GetMetadataByKey(key string) any +} diff --git a/pkg/catalog/plugin.go b/pkg/catalog/plugin.go index 14fbb81..4343dca 100644 --- a/pkg/catalog/plugin.go +++ b/pkg/catalog/plugin.go @@ -97,7 +97,7 @@ func (d FileData) IsDynamic() bool { return true } -type Build interface { +type BuildInfoSetter interface { SetValue(string) }