diff --git a/pkg/tools/otelcol-config/ephemeral.go b/pkg/tools/otelcol-config/ephemeral.go index f858bd5a4b..4fd474e915 100644 --- a/pkg/tools/otelcol-config/ephemeral.go +++ b/pkg/tools/otelcol-config/ephemeral.go @@ -1,6 +1,11 @@ package main -import "errors" +import ( + "bytes" + "fmt" + + "github.com/mikefarah/yq/v4/pkg/yqlib" +) // EnableEphemeralAction links the available ephemeral configuration to conf.d func EnableEphemeralAction(ctx *actionContext) error { @@ -9,7 +14,7 @@ func EnableEphemeralAction(ctx *actionContext) error { return err } if conf.SumologicRemote != nil { - return errors.New("enable-ephemeral not supported for remote-controlled collectors") + return writeEphemeralRemote(ctx, conf.SumologicRemote, ".extensions.sumologic.ephemeral = true") } return ctx.LinkEphemeral() } @@ -21,7 +26,34 @@ func DisableEphemeralAction(ctx *actionContext) error { return err } if conf.SumologicRemote != nil { - return errors.New("disable-ephemeral not supported for remote-controlled collectors") + return writeEphemeralRemote(ctx, conf.SumologicRemote, ".extensions.sumologic.ephemeral = false") } return ctx.UnlinkEphemeral() } + +func writeEphemeralRemote(ctx *actionContext, doc []byte, expr string) error { + encoder := yqlib.YamlFormat.EncoderFactory() + decoder := yqlib.YamlFormat.DecoderFactory() + eval := yqlib.NewStringEvaluator() + if len(doc) == 0 { + // --null-input + buf := new(bytes.Buffer) + writer := yqlib.NewSinglePrinterWriter(buf) + printer := yqlib.NewPrinter(encoder, writer) + err := yqlib.NewStreamEvaluator().EvaluateNew(expr, printer) + if err != nil { + return fmt.Errorf("error writing sumologic-remote.yaml: %s", err) + } + doc = buf.Bytes() + } else { + result, err := eval.EvaluateAll(expr, string(doc), encoder, decoder) + if err != nil { + return fmt.Errorf("error evaluating yq expression: %s", err) + } + doc = []byte(result) + } + if _, err := ctx.WriteSumologicRemote(doc); err != nil { + return fmt.Errorf("error writing sumologic-remote.yaml: %s", err) + } + return nil +} diff --git a/pkg/tools/otelcol-config/ephemeral_test.go b/pkg/tools/otelcol-config/ephemeral_test.go index ad13ef4244..6d0d64cb71 100644 --- a/pkg/tools/otelcol-config/ephemeral_test.go +++ b/pkg/tools/otelcol-config/ephemeral_test.go @@ -35,12 +35,13 @@ func TestEnableEphemeralActionRemoteControlled(t *testing.T) { ctx := &actionContext{ ConfigDir: fstest.MapFS{ SumologicRemoteDotYaml: &fstest.MapFile{ - Data: []byte(`{"extensions":{"opamp":{"enabled":true}}}`), + Data: []byte("extensions:\n opamp:\n enabled: true\n"), }, }, + WriteSumologicRemote: newTestWriter([]byte("extensions:\n opamp:\n enabled: true\n sumologic:\n ephemeral: true\n")).Write, } - if err := EnableEphemeralAction(ctx); err == nil { - t.Fatal("expected non-nil error") + if err := EnableEphemeralAction(ctx); err != nil { + t.Fatal(err) } } @@ -48,12 +49,13 @@ func TestDisableEphemeralActionRemoteControlled(t *testing.T) { ctx := &actionContext{ ConfigDir: fstest.MapFS{ SumologicRemoteDotYaml: &fstest.MapFile{ - Data: []byte(`{"extensions":{"opamp":{"enabled":true}}}`), + Data: []byte("extensions:\n opamp:\n enabled: true\n"), }, }, + WriteSumologicRemote: newTestWriter([]byte("extensions:\n opamp:\n enabled: true\n sumologic:\n ephemeral: false\n")).Write, } - if err := DisableEphemeralAction(ctx); err == nil { - t.Fatal("expected non-nil error") + if err := DisableEphemeralAction(ctx); err != nil { + t.Fatal(err) } }