Skip to content

Commit

Permalink
feat(operator): add support for configuration file
Browse files Browse the repository at this point in the history
Signed-off-by: Dominik Rosiek <drosiek@sumologic.com>
  • Loading branch information
sumo-drosiek committed Feb 20, 2023
1 parent 7d0baf1 commit 8dc863b
Show file tree
Hide file tree
Showing 7 changed files with 156 additions and 6 deletions.
2 changes: 1 addition & 1 deletion operator/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ COPY . .
RUN go mod download

# Build
RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -o manager main.go
RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -o manager main.go config.go

# Use distroless as minimal base image to package the manager binary
# Refer to https://github.com/GoogleContainerTools/distroless for more details
Expand Down
4 changes: 2 additions & 2 deletions operator/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,11 @@ clean:

# Build manager binary
manager: generate fmt vet
go build -o bin/manager main.go
go build -o bin/manager main.go ./config.go

# Run against the configured Kubernetes cluster in ~/.kube/config
run: generate fmt vet manifests
go run ./main.go
go run ./main.go ./config.go

# Install CRDs into a cluster
install: manifests kustomize
Expand Down
38 changes: 38 additions & 0 deletions operator/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package main

import (
"os"

"gopkg.in/yaml.v3"
)

type Config struct {
Sidecar SidecarConfig `yaml:"sidecar,omitempty"`
}

type SidecarConfig struct {
Image string `yaml:"image,omitempty"`
}

func ReadConfig(configPath string) (Config, error) {
// Set default values
config := Config{
Sidecar: SidecarConfig{
Image: "sumologic/tailing-sidecar:latest",
},
}

f, err := os.Open(configPath)
if err != nil {
return config, err
}
defer f.Close()

decoder := yaml.NewDecoder(f)
err = decoder.Decode(&config)

if err != nil && err.Error() == "EOF" {
return config, nil
}
return config, err
}
81 changes: 81 additions & 0 deletions operator/config_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package main

import (
"io/ioutil"
"os"
"testing"

"github.com/stretchr/testify/require"
)

func TestReadConfig(t *testing.T) {
testCases := []struct {
name string
content string
expected Config
expectedError error
}{
{
name: "empty file",
content: ``,
expected: Config{
Sidecar: SidecarConfig{
Image: "sumologic/tailing-sidecar:latest",
},
},
expectedError: nil,
},
{
name: "defaults",
content: `
sidecar:
commands:
- test
- command`,
expected: Config{
Sidecar: SidecarConfig{
Image: "sumologic/tailing-sidecar:latest",
},
},
expectedError: nil,
},
{
name: "overwrite defaults",
content: `
sidecar:
image: my-new-image`,
expected: Config{
Sidecar: SidecarConfig{
Image: "my-new-image",
},
},
expectedError: nil,
},
}

for _, tt := range testCases {
t.Run(tt.name, func(t *testing.T) {
file, err := ioutil.TempFile(".", "prefix")
require.NoError(t, err)
defer os.Remove(file.Name())

_, err = file.WriteString(tt.content)
require.NoError(t, err)
config, err := ReadConfig(file.Name())

if tt.expectedError != nil {
require.Error(t, tt.expectedError, err)
return
}

require.NoError(t, err)
require.Equal(t, tt.expected, config)
})
}
}

func TestReadConfigInvalidFile(t *testing.T) {
_, err := ReadConfig("non-existing-file")
require.Error(t, err)
require.EqualError(t, err, "open non-existing-file: no such file or directory")
}
5 changes: 4 additions & 1 deletion operator/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,16 @@ require (
github.com/nsf/jsondiff v0.0.0-20200515183724-f29ed568f4ce
github.com/onsi/ginkgo v1.16.5
github.com/onsi/gomega v1.26.0
github.com/stretchr/testify v1.8.0
gomodules.xyz/jsonpatch/v2 v2.2.0
k8s.io/api v0.26.0
k8s.io/apimachinery v0.26.0
k8s.io/client-go v0.25.4
sigs.k8s.io/controller-runtime v0.13.1
)

require github.com/pmezard/go-difflib v1.0.0 // indirect

require (
cloud.google.com/go/compute v1.3.0 // indirect
github.com/PuerkitoBio/purell v1.1.1 // indirect
Expand Down Expand Up @@ -65,7 +68,7 @@ require (
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
gopkg.in/yaml.v3 v3.0.1
k8s.io/apiextensions-apiserver v0.25.0 // indirect
k8s.io/component-base v0.25.0 // indirect
k8s.io/klog/v2 v2.80.1 // indirect
Expand Down
3 changes: 3 additions & 0 deletions operator/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -325,13 +325,16 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
Expand Down
29 changes: 27 additions & 2 deletions operator/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,15 +50,40 @@ func main() {
var metricsAddr string
var enableLeaderElection bool
var tailingSidecarImage string
var configPath string
var config Config
var err error

flag.StringVar(&metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.")
flag.BoolVar(&enableLeaderElection, "enable-leader-election", false,
"Enable leader election for controller manager. "+
"Enabling this will ensure there is only one active controller manager.")
flag.StringVar(&tailingSidecarImage, "tailing-sidecar-image", "sumologic/tailing-sidecar:latest", "tailing sidecar image")
flag.StringVar(&tailingSidecarImage, "tailing-sidecar-image", "", "tailing sidecar image")
flag.StringVar(&configPath, "config", "", "Path to the configuration file")
flag.Parse()

ctrl.SetLogger(zap.New(zap.UseDevMode(true)))

if configPath != "" {
config, err = ReadConfig(configPath)

if err != nil {
setupLog.Error(err, "unable to read configuration", "configPath", configPath)
os.Exit(1)
}
} else {
config = Config{}
}

if err := config.Validate(); err != nil {
setupLog.Error(err, "configuration error", "configPath", configPath)
os.Exit(1)
}

if tailingSidecarImage != "" {
config.Sidecar.Image = tailingSidecarImage
}

mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
Scheme: scheme,
MetricsBindAddress: metricsAddr,
Expand All @@ -84,7 +109,7 @@ func main() {
mgr.GetWebhookServer().Register("/add-tailing-sidecars-v1-pod", &webhook.Admission{
Handler: &handler.PodExtender{
Client: mgr.GetClient(),
TailingSidecarImage: tailingSidecarImage,
TailingSidecarImage: config.Sidecar.Image,
},
})

Expand Down

0 comments on commit 8dc863b

Please sign in to comment.