Skip to content

Commit

Permalink
Various updates from operator-sdk (#70)
Browse files Browse the repository at this point in the history
* Bump controller-runtime to v0.7.0
* Bump kubebuilder to 0a807f4e9428
* Add healthz and readyz endpoints and flag
* Bump to go 1.15
  • Loading branch information
joelanford committed Jan 15, 2021
1 parent 15a24ee commit 7cad81a
Show file tree
Hide file tree
Showing 62 changed files with 886 additions and 736 deletions.
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

0 comments on commit 7cad81a

Please sign in to comment.