Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add otelcol-config #1607

Merged
merged 19 commits into from
Jul 9, 2024
Merged
Show file tree
Hide file tree
Changes from 3 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
1 change: 1 addition & 0 deletions pkg/tools/otelcol-config/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include ../../Makefile.Common
92 changes: 92 additions & 0 deletions pkg/tools/otelcol-config/flag.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package main

import (
"os"

"github.com/spf13/pflag"
)

const (
flagHelp = "help"
flagAddTag = "add-tag"
flagDeleteTag = "delete-tag"
flagSetInstallationToken = "set-installation-token"
flagSetOpAmpEndpoint = "set-opamp-endpoint"
flagSetAPIURL = "set-api-url"
flagEnableHostmetrics = "enable-hostmetrics"
flagDisableHostmetrics = "disable-hostmetrics"
flagEnableEphemeral = "enable-ephemeral"
flagDisableEphemeral = "disable-ephemeral"
flagEnableRemoteControl = "enable-remote-control"
flagDisableRemoteControl = "disable-remote-control"
flagConfigDir = "config"
flagSetKV = "set-kv"
flagDelKV = "del-kv"
flagGetKV = "get-kv"
flagAppendKV = "append-kv"
)

const (
addTagUsage = "adds tags (eg: '--add-tag foo=bar --add-tag bar=baz' adds foo and bar tags)"
delTagUsage = "deletes tags (eg: '--delete-tag foo bar' deletes tags foo and bar)"
sitUsage = "sets the sumo logic installation token"
enableHMUsage = "enables hostmetrics"
disableHMUsage = "disables hostmetrics"
enableEphemeralUsage = "enables ephemeral mode"
disableEphemeralUsage = "disables ephemeral mode"
enableRemoteControlUsage = "enables remote control via opamp"
disableRemoteControlUsage = "disables remote control, uses local configuration only"
setOpAmpEndpointUsage = "sets the opamp endpoint (eg: wss://example.com)"
configUsage = "path to sumologic.yaml configuration file"
setKVUsage = "set key-value in sumologic.yaml with yq path (eg: --set-kv extensions.sumologic.foo=bar)"
getKVUsage = "get key-value from sumologic.yaml with yq path (eg: --get-kv extensions.sumologic.foo)"
delKVUsage = "delete key-value from sumologic.yaml with yq path (eg: --del-kv foo.bar)"
appendKVUsage = `append key-value to sumologic.yaml with yq path (eg: --append-kv 'extensions={"foo":"bar"}')`
)

type flagValues struct {
AddTags map[string]string
DeleteTags []string
InstallationToken string
EnableHostmetrics bool
DisableHostmetrics bool
EnableEphemeral bool
DisableEphemeral bool
EnableRemoteControl bool
DisableRemoteControl bool
SetOpAmpEndpoint string
Help bool
ConfigDir string
SetKV map[string]string
DelKV []string
GetKV []string
AppendKV map[string]string
}

func newFlagValues() *flagValues {
return &flagValues{AddTags: make(map[string]string)}
}

func makeFlagSet(fv *flagValues) *pflag.FlagSet {
flags := pflag.NewFlagSet(os.Args[0], pflag.ContinueOnError)

flags.SortFlags = true

flags.StringToStringVarP(&fv.AddTags, flagAddTag, "a", nil, addTagUsage)
flags.StringArrayVarP(&fv.DeleteTags, flagDeleteTag, "d", nil, delTagUsage)
flags.StringVarP(&fv.InstallationToken, flagSetInstallationToken, "t", "", sitUsage)
flags.BoolVar(&fv.EnableHostmetrics, flagEnableHostmetrics, false, enableHMUsage)
flags.BoolVar(&fv.DisableHostmetrics, flagDisableHostmetrics, false, disableHMUsage)
flags.BoolVar(&fv.EnableEphemeral, flagEnableEphemeral, false, enableEphemeralUsage)
flags.BoolVar(&fv.DisableEphemeral, flagDisableEphemeral, false, disableEphemeralUsage)
flags.BoolVar(&fv.EnableRemoteControl, flagEnableRemoteControl, false, enableRemoteControlUsage)
flags.BoolVar(&fv.DisableRemoteControl, flagDisableRemoteControl, false, disableRemoteControlUsage)
flags.StringVarP(&fv.SetOpAmpEndpoint, flagSetOpAmpEndpoint, "e", "", setOpAmpEndpointUsage)
flags.StringVarP(&fv.ConfigDir, flagConfigDir, "c", "", configUsage)
flags.StringToStringVar(&fv.SetKV, flagSetKV, nil, setKVUsage)
flags.StringArrayVar(&fv.GetKV, flagGetKV, nil, getKVUsage)
flags.StringArrayVar(&fv.DelKV, flagDelKV, nil, delKVUsage)
flags.StringToStringVar(&fv.AppendKV, flagAppendKV, nil, appendKVUsage)

return flags
}
35 changes: 35 additions & 0 deletions pkg/tools/otelcol-config/flag_actions.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package main

import (
"errors"

"github.com/spf13/pflag"
)

var notImplementedError = errors.New("not implemented")

func notImplementedAction(*pflag.Flag, *pflag.FlagSet) error {
return notImplementedError
}

type action func(actionFlag *pflag.Flag, allFlags *pflag.FlagSet) error

var flagActions = map[string]action{
flagHelp: helpAction,
flagAddTag: notImplementedAction,
flagDeleteTag: notImplementedAction,
flagSetInstallationToken: notImplementedAction,
flagEnableHostmetrics: notImplementedAction,
flagDisableHostmetrics: notImplementedAction,
flagEnableEphemeral: notImplementedAction,
flagDisableEphemeral: notImplementedAction,
flagSetAPIURL: notImplementedAction,
flagEnableRemoteControl: notImplementedAction,
flagDisableRemoteControl: notImplementedAction,
flagSetOpAmpEndpoint: notImplementedAction,
flagConfigDir: notImplementedAction,
flagSetKV: notImplementedAction,
flagDelKV: notImplementedAction,
flagGetKV: notImplementedAction,
flagAppendKV: notImplementedAction,
}
183 changes: 183 additions & 0 deletions pkg/tools/otelcol-config/flag_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
package main

import (
"testing"

"github.com/google/go-cmp/cmp"
"github.com/spf13/pflag"
)

func TestFlagActions(t *testing.T) {
// test that flagActions is built correctly
fv := newFlagValues()
fs := makeFlagSet(fv)
fs.VisitAll(func(flag *pflag.Flag) {
action := flagActions[flag.Name]
if action == nil {
t.Errorf("undefined flag action: %s", flag.Name)
}
})
}

func TestAddTag(t *testing.T) {
tests := []struct {
name string
flags []string
wantTags map[string]string
}{
{
name: "simple",
flags: []string{"otelcol-config", "--add-tag", "foo=bar"},
wantTags: map[string]string{"foo": "bar"},
},
{
name: "multiple",
flags: []string{"otelcol-config", "--add-tag", "foo=bar", "--add-tag", "bar=biff"},
wantTags: map[string]string{"foo": "bar", "bar": "biff"},
},
}

for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
fv := newFlagValues()
fs := makeFlagSet(fv)
if err := fs.Parse(test.flags); err != nil {
t.Fatal(err)
}
if got, want := fv.AddTags, test.wantTags; !cmp.Equal(got, want) {
t.Errorf("bad flag values: got %v, want %v", got, want)
}
})
}
}

func TestDeleteTag(t *testing.T) {
tests := []struct {
name string
flags []string
wantTags []string
}{
{
name: "simple",
flags: []string{"otelcol-config", "--delete-tag", "foo"},
wantTags: []string{"foo"},
},
{
name: "multiple",
flags: []string{"otelcol-config", "--delete-tag", "foo", "--delete-tag", "bar"},
wantTags: []string{"foo", "bar"},
},
}

for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
fv := newFlagValues()
fs := makeFlagSet(fv)
if err := fs.Parse(test.flags); err != nil {
t.Fatal(err)
}
if got, want := fv.DeleteTags, test.wantTags; !cmp.Equal(got, want) {
t.Errorf("bad flag values: got %v, want %v", got, want)
}
})
}
}

func TestSetInstallationToken(t *testing.T) {
fv := newFlagValues()
fs := makeFlagSet(fv)
if err := fs.Parse([]string{"otelcol-config", "--set-installation-token", "abcdef"}); err != nil {
t.Fatal(err)
}
if got, want := fv.InstallationToken, "abcdef"; !cmp.Equal(got, want) {
t.Errorf("bad flag values: got %v, want %v", got, want)
}
}

func TestEnableHostmetrics(t *testing.T) {
fv := newFlagValues()
fs := makeFlagSet(fv)
if err := fs.Parse([]string{"otelcol-config", "--enable-hostmetrics"}); err != nil {
t.Fatal(err)
}
if got, want := fv.EnableHostmetrics, true; !cmp.Equal(got, want) {
t.Errorf("bad flag values: got %v, want %v", got, want)
}
}

func TestDisableHostmetrics(t *testing.T) {
fv := newFlagValues()
fs := makeFlagSet(fv)
if err := fs.Parse([]string{"otelcol-config", "--disable-hostmetrics"}); err != nil {
t.Fatal(err)
}
if got, want := fv.DisableHostmetrics, true; !cmp.Equal(got, want) {
t.Errorf("bad flag values: got %v, want %v", got, want)
}
}

func TestEnableEphemeral(t *testing.T) {
fv := newFlagValues()
fs := makeFlagSet(fv)
if err := fs.Parse([]string{"otelcol-config", "--enable-ephemeral"}); err != nil {
t.Fatal(err)
}
if got, want := fv.EnableEphemeral, true; !cmp.Equal(got, want) {
t.Errorf("bad flag values: got %v, want %v", got, want)
}
}

func TestDisableEphemeral(t *testing.T) {
fv := newFlagValues()
fs := makeFlagSet(fv)
if err := fs.Parse([]string{"otelcol-config", "--disable-ephemeral"}); err != nil {
t.Fatal(err)
}
if got, want := fv.DisableEphemeral, true; !cmp.Equal(got, want) {
t.Errorf("bad flag values: got %v, want %v", got, want)
}
}

func TestEnableRemoteControl(t *testing.T) {
fv := newFlagValues()
fs := makeFlagSet(fv)
if err := fs.Parse([]string{"otelcol-config", "--enable-remote-control"}); err != nil {
t.Fatal(err)
}
if got, want := fv.EnableRemoteControl, true; !cmp.Equal(got, want) {
t.Errorf("bad flag values: got %v, want %v", got, want)
}
}

func TestDisableRemoteControl(t *testing.T) {
fv := newFlagValues()
fs := makeFlagSet(fv)
if err := fs.Parse([]string{"otelcol-config", "--disable-remote-control"}); err != nil {
t.Fatal(err)
}
if got, want := fv.DisableRemoteControl, true; !cmp.Equal(got, want) {
t.Errorf("bad flag values: got %v, want %v", got, want)
}
}

func TestSetOpampEndpoint(t *testing.T) {
fv := newFlagValues()
fs := makeFlagSet(fv)
if err := fs.Parse([]string{"otelcol-config", "--set-opamp-endpoint", "wss://example.com"}); err != nil {
t.Fatal(err)
}
if got, want := fv.SetOpAmpEndpoint, "wss://example.com"; !cmp.Equal(got, want) {
t.Errorf("bad flag values: got %v, want %v", got, want)
}
}

func TestConfigDir(t *testing.T) {
fv := newFlagValues()
fs := makeFlagSet(fv)
if err := fs.Parse([]string{"otelcol-config", "--config", "/etc/otelcol-sumo"}); err != nil {
t.Fatal(err)
}
if got, want := fv.ConfigDir, "/etc/otelcol-sumo"; !cmp.Equal(got, want) {
t.Errorf("bad flag values: got %v, want %v", got, want)
}
}
7 changes: 7 additions & 0 deletions pkg/tools/otelcol-config/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module github.com/SumoLogic/sumologic-otel-collector/pkg/tools/otelcol-config

go 1.21.3

require github.com/spf13/pflag v1.0.5

require github.com/google/go-cmp v0.6.0 // indirect
4 changes: 4 additions & 0 deletions pkg/tools/otelcol-config/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
14 changes: 14 additions & 0 deletions pkg/tools/otelcol-config/help.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package main

import (
"fmt"
"os"

"github.com/spf13/pflag"
)

func helpAction(_ *pflag.Flag, fs *pflag.FlagSet) error {
fmt.Printf("%s: configure otelcol-sumo\n", os.Args[0])
fs.PrintDefaults()
return nil
}
Loading