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
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
- name: Set up Go 1.x
uses: actions/setup-go@v2
with:
go-version: ^1.13
go-version: ^1.15
id: go

- name: Check out code into the Go module directory
Expand Down
58 changes: 18 additions & 40 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,52 +1,30 @@
module github.com/joelanford/helm-operator

go 1.13
go 1.15

require (
github.com/Microsoft/hcsshim v0.8.9 // indirect
github.com/bugsnag/bugsnag-go v1.5.3 // indirect
github.com/bugsnag/panicwrap v1.2.0 // indirect
github.com/containerd/continuity v0.0.0-20200413184840-d3ef23f19fbb // indirect
github.com/docker/go-metrics v0.0.1 // indirect
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 // indirect
github.com/garyburd/redigo v1.6.0 // indirect
github.com/go-logr/logr v0.1.0
github.com/gofrs/uuid v3.3.0+incompatible // indirect
github.com/gorilla/handlers v1.4.2 // indirect
github.com/go-logr/logr v0.3.0
github.com/iancoleman/strcase v0.1.2
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
github.com/kr/text v0.1.0
github.com/mattn/go-colorable v0.1.2 // indirect
github.com/onsi/ginkgo v1.12.1
github.com/onsi/gomega v1.10.1
github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6 // indirect
github.com/operator-framework/operator-lib v0.1.0
github.com/prometheus/client_golang v1.5.1 // indirect
github.com/sirupsen/logrus v1.6.0
github.com/onsi/ginkgo v1.14.1
github.com/onsi/gomega v1.10.2
github.com/operator-framework/operator-lib v0.3.0
github.com/sirupsen/logrus v1.7.0
github.com/spf13/afero v1.2.2
github.com/spf13/cobra v1.0.0
github.com/spf13/cobra v1.1.1
github.com/spf13/pflag v1.0.5
github.com/stretchr/testify v1.6.1
github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 // indirect
github.com/yvasiyarov/gorelic v0.0.7 // indirect
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9 // indirect
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f // indirect
golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae // indirect
golang.org/x/tools v0.0.0-20200403190813-44a64ad78b9b
gomodules.xyz/jsonpatch/v2 v2.0.1
google.golang.org/genproto v0.0.0-20200701001935-0939c5918c31 // indirect
google.golang.org/grpc v1.30.0 // indirect
google.golang.org/protobuf v1.25.0 // indirect
helm.sh/helm/v3 v3.3.4
k8s.io/api v0.18.8
k8s.io/apiextensions-apiserver v0.18.8
k8s.io/apimachinery v0.18.8
k8s.io/cli-runtime v0.18.8
k8s.io/client-go v0.18.8
k8s.io/kubectl v0.18.8
golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5
gomodules.xyz/jsonpatch/v2 v2.1.0
helm.sh/helm/v3 v3.4.1
k8s.io/api v0.20.2
k8s.io/apiextensions-apiserver v0.20.2
k8s.io/apimachinery v0.20.2
k8s.io/cli-runtime v0.20.2
k8s.io/client-go v0.20.2
k8s.io/kubectl v0.20.2
rsc.io/letsencrypt v0.0.3 // indirect
sigs.k8s.io/controller-runtime v0.6.2
sigs.k8s.io/kubebuilder v1.0.9-0.20201021204649-36124ae2e027
sigs.k8s.io/controller-runtime v0.8.0
sigs.k8s.io/kubebuilder/v2 v2.3.2-0.20201214213149-0a807f4e9428
sigs.k8s.io/yaml v1.2.0
)
587 changes: 369 additions & 218 deletions go.sum

Large diffs are not rendered by default.

25 changes: 20 additions & 5 deletions internal/cmd/run/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ import (

"github.com/spf13/cobra"
"github.com/spf13/pflag"
"k8s.io/client-go/tools/leaderelection/resourcelock"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/healthz"
logf "sigs.k8s.io/controller-runtime/pkg/log"
zapl "sigs.k8s.io/controller-runtime/pkg/log/zap"

Expand Down Expand Up @@ -56,6 +58,7 @@ func NewCmd() *cobra.Command {

type run struct {
metricsAddr string
probeAddr string
enableLeaderElection bool
leaderElectionID string
leaderElectionNamespace string
Expand All @@ -67,6 +70,7 @@ type run struct {

func (r *run) bindFlags(fs *pflag.FlagSet) {
fs.StringVar(&r.metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.")
fs.StringVar(&r.probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.")
fs.BoolVar(&r.enableLeaderElection, "enable-leader-election", false,
"Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.")
fs.StringVar(&r.leaderElectionID, "leader-election-id", "",
Expand Down Expand Up @@ -104,11 +108,13 @@ func (r *run) run(cmd *cobra.Command) {
}

options := ctrl.Options{
MetricsBindAddress: r.metricsAddr,
LeaderElection: r.enableLeaderElection,
LeaderElectionID: r.leaderElectionID,
LeaderElectionNamespace: r.leaderElectionNamespace,
NewClient: manager.NewDelegatingClientFunc(),
MetricsBindAddress: r.metricsAddr,
HealthProbeBindAddress: r.probeAddr,
LeaderElection: r.enableLeaderElection,
LeaderElectionID: r.leaderElectionID,
LeaderElectionNamespace: r.leaderElectionNamespace,
LeaderElectionResourceLock: resourcelock.ConfigMapsResourceLock,
ClientBuilder: manager.NewCachingClientBuilder(),
}
manager.ConfigureWatchNamespaces(&options, log)
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), options)
Expand All @@ -117,6 +123,15 @@ func (r *run) run(cmd *cobra.Command) {
os.Exit(1)
}

if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
log.Error(err, "unable to setup health check")
os.Exit(1)
}
if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil {
log.Error(err, "unable to setup readiness check")
os.Exit(1)
}

ws, err := watches.Load(r.watchesFile)
if err != nil {
log.Error(err, "unable to load watches.yaml", "path", r.watchesFile)
Expand Down
20 changes: 14 additions & 6 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,29 +17,31 @@ limitations under the License.
package main

import (
"fmt"
"log"
"runtime"

"github.com/spf13/cobra"
"sigs.k8s.io/kubebuilder/pkg/cli"
"sigs.k8s.io/kubebuilder/v2/pkg/cli"
"sigs.k8s.io/kubebuilder/v2/pkg/model/config"

"github.com/joelanford/helm-operator/internal/cmd/run"
"github.com/joelanford/helm-operator/internal/cmd/version"
"github.com/joelanford/helm-operator/internal/version"
pluginv1 "github.com/joelanford/helm-operator/pkg/plugins/v1"
)

func main() {
commands := []*cobra.Command{
run.NewCmd(),
version.NewCmd(),
}
c, err := cli.New(
cli.WithCommandName("helm-operator"),
cli.WithVersion(getVersion()),
cli.WithPlugins(
&pluginv1.Plugin{},
),
cli.WithDefaultPlugins(
&pluginv1.Plugin{},
),
cli.WithDefaultProjectVersion(config.Version3Alpha),
cli.WithDefaultPlugins(config.Version3Alpha, &pluginv1.Plugin{}),
cli.WithExtraCommands(commands...),
)
if err != nil {
Expand All @@ -50,3 +52,9 @@ func main() {
log.Fatal(err)
}
}

func getVersion() string {
return fmt.Sprintf("helm-operator version: %q, commit: %q, go version: %q, GOOS: %q, GOARCH: %q\n",
version.Version, version.GitCommit, runtime.Version(), runtime.GOOS, runtime.GOARCH)

}
15 changes: 8 additions & 7 deletions pkg/client/actionclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,18 +41,19 @@ import (
apitypes "k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/strategicpatch"
"k8s.io/cli-runtime/pkg/resource"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/yaml"

"github.com/joelanford/helm-operator/pkg/internal/sdk/controllerutil"
)

type ActionClientGetter interface {
ActionClientFor(obj Object) (ActionInterface, error)
ActionClientFor(obj client.Object) (ActionInterface, error)
}

type ActionClientGetterFunc func(obj Object) (ActionInterface, error)
type ActionClientGetterFunc func(obj client.Object) (ActionInterface, error)

func (acgf ActionClientGetterFunc) ActionClientFor(obj Object) (ActionInterface, error) {
func (acgf ActionClientGetterFunc) ActionClientFor(obj client.Object) (ActionInterface, error) {
return acgf(obj)
}

Expand All @@ -79,7 +80,7 @@ type actionClientGetter struct {

var _ ActionClientGetter = &actionClientGetter{}

func (hcg *actionClientGetter) ActionClientFor(obj Object) (ActionInterface, error) {
func (hcg *actionClientGetter) ActionClientFor(obj client.Object) (ActionInterface, error) {
actionConfig, err := hcg.acg.ActionConfigFor(obj)
if err != nil {
return nil, err
Expand Down Expand Up @@ -199,7 +200,7 @@ func (c *actionClient) Reconcile(rel *release.Release) error {

helper := resource.NewHelper(expected.Client, expected.Mapping)

existing, err := helper.Get(expected.Namespace, expected.Name, expected.Export)
existing, err := helper.Get(expected.Namespace, expected.Name)
if apierrors.IsNotFound(err) {
if _, err := helper.Create(expected.Namespace, true, expected.Object); err != nil {
return fmt.Errorf("create error: %w", err)
Expand Down Expand Up @@ -294,14 +295,14 @@ func createJSONMergePatch(existingJSON, expectedJSON []byte) ([]byte, error) {
return json.Marshal(patchOps)
}

func createPostRenderer(rm meta.RESTMapper, kubeClient kube.Interface, owner Object) postrender.PostRenderer {
func createPostRenderer(rm meta.RESTMapper, kubeClient kube.Interface, owner client.Object) postrender.PostRenderer {
return &ownerPostRenderer{rm, kubeClient, owner}
}

type ownerPostRenderer struct {
rm meta.RESTMapper
kubeClient kube.Interface
owner Object
owner client.Object
}

func (pr *ownerPostRenderer) Run(in *bytes.Buffer) (*bytes.Buffer, error) {
Expand Down
30 changes: 12 additions & 18 deletions pkg/client/actionclient_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ import (
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
apitypes "k8s.io/apimachinery/pkg/types"
"k8s.io/cli-runtime/pkg/resource"
Expand Down Expand Up @@ -70,8 +69,8 @@ var _ = Describe("ActionClient", func() {
gvk := schema.GroupVersionKind{Group: "test", Version: "v1alpha1", Kind: "Test"}
expectedObj := &unstructured.Unstructured{}
expectedObj.SetGroupVersionKind(gvk)
var actualObj Object
f := ActionClientGetterFunc(func(obj Object) (ActionInterface, error) {
var actualObj client.Object
f := ActionClientGetterFunc(func(obj client.Object) (ActionInterface, error) {
actualObj = obj
return nil, nil
})
Expand All @@ -81,7 +80,7 @@ var _ = Describe("ActionClient", func() {
})

var _ = Describe("ActionClientFor", func() {
var obj Object
var obj client.Object
BeforeEach(func() {
obj = testutil.BuildTestCR(gvk)
})
Expand All @@ -95,7 +94,7 @@ var _ = Describe("ActionClient", func() {

var _ = Describe("ActionClient methods", func() {
var (
obj Object
obj client.Object
cl client.Client
ac ActionInterface
vals = chartutil.Values{"service": map[string]interface{}{"type": "NodePort"}}
Expand Down Expand Up @@ -325,12 +324,11 @@ var _ = Describe("ActionClient", func() {
By("changing manifest resources", func() {
objs := manifestToObjects(installedRelease.Manifest)
for _, obj := range objs {
key, err := client.ObjectKeyFromObject(obj)
Expect(err).To(BeNil())
key := client.ObjectKeyFromObject(obj)

u := &unstructured.Unstructured{}
u.SetGroupVersionKind(obj.GetObjectKind().GroupVersionKind())
err = cl.Get(context.TODO(), key, u)
err := cl.Get(context.TODO(), key, u)
Expect(err).To(BeNil())

labels := u.GetLabels()
Expand Down Expand Up @@ -521,7 +519,7 @@ var _ = Describe("ActionClient", func() {
var _ = Describe("ownerPostRenderer", func() {
var (
pr ownerPostRenderer
owner Object
owner client.Object
)

BeforeEach(func() {
Expand All @@ -547,8 +545,8 @@ var _ = Describe("ActionClient", func() {
})
})

func manifestToObjects(manifest string) []runtime.Object {
objs := []runtime.Object{}
func manifestToObjects(manifest string) []client.Object {
objs := []client.Object{}
for _, m := range releaseutil.SplitManifests(manifest) {
u := &unstructured.Unstructured{}
err := yaml.Unmarshal([]byte(m), u)
Expand Down Expand Up @@ -576,10 +574,8 @@ func verifyRelease(cl client.Client, ns string, rel *release.Release) {
By("verifying the release resources exist", func() {
objs := manifestToObjects(rel.Manifest)
for _, obj := range objs {
key, err := client.ObjectKeyFromObject(obj)
Expect(err).To(BeNil())

err = cl.Get(context.TODO(), key, obj)
key := client.ObjectKeyFromObject(obj)
err := cl.Get(context.TODO(), key, obj)
Expect(err).To(BeNil())
}
})
Expand All @@ -604,9 +600,7 @@ func verifyNoRelease(cl client.Client, ns string, name string, rel *release.Rele
err := yaml.Unmarshal([]byte(r), u)
Expect(err).To(BeNil())

key, err := client.ObjectKeyFromObject(u)
Expect(err).To(BeNil())

key := client.ObjectKeyFromObject(u)
err = cl.Get(context.TODO(), key, u)
Expect(apierrors.IsNotFound(err)).To(BeTrue())
}
Expand Down
11 changes: 3 additions & 8 deletions pkg/client/actionconfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,14 @@ import (
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
v1 "k8s.io/client-go/kubernetes/typed/core/v1"
"k8s.io/client-go/rest"
cmdutil "k8s.io/kubectl/pkg/cmd/util"
"sigs.k8s.io/controller-runtime/pkg/client"
)

type Object interface {
runtime.Object
metav1.Object
}

type ActionConfigGetter interface {
ActionConfigFor(obj Object) (*action.Configuration, error)
ActionConfigFor(obj client.Object) (*action.Configuration, error)
}

func NewActionConfigGetter(cfg *rest.Config, rm meta.RESTMapper, log logr.Logger) ActionConfigGetter {
Expand All @@ -59,7 +54,7 @@ type actionConfigGetter struct {
log logr.Logger
}

func (acg *actionConfigGetter) ActionConfigFor(obj Object) (*action.Configuration, error) {
func (acg *actionConfigGetter) ActionConfigFor(obj client.Object) (*action.Configuration, error) {
// Create a RESTClientGetter
rcg := newRESTClientGetter(acg.cfg, acg.restMapper, obj.GetNamespace())

Expand Down
3 changes: 2 additions & 1 deletion pkg/client/actionconfig_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package client
import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"

"github.com/joelanford/helm-operator/pkg/internal/testutil"
Expand All @@ -32,7 +33,7 @@ var _ = Describe("ActionConfig", func() {
})

var _ = Describe("GetActionConfig", func() {
var obj Object
var obj client.Object
BeforeEach(func() {
obj = testutil.BuildTestCR(gvk)
})
Expand Down
Loading