Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
Only add very basic components

Signed-off-by: Jens Schneider <schneider@23technologies.cloud>
  • Loading branch information
JensAc committed May 6, 2022
0 parents commit 455c9c7
Show file tree
Hide file tree
Showing 9 changed files with 2,162 additions and 0 deletions.
137 changes: 137 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
# SPDX-FileCopyrightText: 2021 SAP SE or an SAP affiliate company and Gardener contributors
#
# SPDX-License-Identifier: Apache-2.0

EXTENSION_PREFIX := gardener-extension
NAME := mwe
REGISTRY := eu.gcr.io/gardener-project/gardener
IMAGE_PREFIX := $(REGISTRY)/extensions
REPO_ROOT := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
HACK_DIR := $(REPO_ROOT)/hack
VERSION := $(shell cat "$(REPO_ROOT)/VERSION")
LD_FLAGS := "-w $(shell $(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/get-build-ld-flags.sh k8s.io/component-base $(REPO_ROOT)/VERSION $(EXTENSION_PREFIX)-$(NAME))"
LEADER_ELECTION := false
IGNORE_OPERATION_ANNOTATION := true
KUBECONFIG := dev/kubeconfig.yaml

WEBHOOK_CONFIG_PORT := 8444
WEBHOOK_CONFIG_URL := localhost:${WEBHOOK_CONFIG_PORT}
EXTENSION_NAMESPACE :=

WEBHOOK_PARAM := --webhook-config-url=${WEBHOOK_CONFIG_URL}
ifeq (${WEBHOOK_CONFIG_MODE}, service)
WEBHOOK_PARAM := --webhook-config-namespace=${EXTENSION_NAMESPACE}
endif


TOOLS_DIR := $(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/tools
include $(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/tools.mk

.PHONY: start
start:
@LEADER_ELECTION_NAMESPACE=garden GO111MODULE=on go run \
-mod=vendor \
-ldflags $(LD_FLAGS) \
./cmd/$(EXTENSION_PREFIX)-$(NAME) \
--kubeconfig=${KUBECONFIG} \
--ignore-operation-annotation=$(IGNORE_OPERATION_ANNOTATION) \
--leader-election=$(LEADER_ELECTION) \
--webhook-config-server-host=localhost \
--webhook-config-server-port=${WEBHOOK_CONFIG_PORT} \
--gardener-version="v1.39.0"

#################################################################
# Rules related to binary build, Docker image build and release #
#################################################################

.PHONY: install
install:
@LD_FLAGS=$(LD_FLAGS) \
$(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/install.sh ./...

.PHONY: docker-login
docker-login:
@gcloud auth activate-service-account --key-file .kube-secrets/gcr/gcr-readwrite.json

.PHONY: docker-images
docker-images:
@docker build -t $(IMAGE_PREFIX)/$(NAME):$(VERSION) -t $(IMAGE_PREFIX)/$(NAME):latest -f Dockerfile -m 6g --target $(EXTENSION_PREFIX)-$(NAME) .

#####################################################################
# Rules for verification, formatting, linting, testing and cleaning #
#####################################################################

.PHONY: install-requirements
install-requirements:
@go install -mod=vendor $(REPO_ROOT)/vendor/github.com/ahmetb/gen-crd-api-reference-docs
@go install -mod=vendor $(REPO_ROOT)/vendor/github.com/golang/mock/mockgen
@go install -mod=vendor $(REPO_ROOT)/vendor/golang.org/x/tools/cmd/goimports
@$(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/install-requirements.sh

.PHONY: revendor
revendor:
@GO111MODULE=on go mod vendor
@GO111MODULE=on go mod tidy
@chmod +x $(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/*
@chmod +x $(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/.ci/*
@sed -i "1 s/.*/\#\!\/usr\/bin\/env bash/" $(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/get-build-ld-flags.sh
@sed -i "1 s/.*/\#\!\/usr\/bin\/env bash/" $(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/generate-controller-registration.sh
@sed -i "1 s/.*/\#\!\/usr\/bin\/env bash/" $(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/hook-me.sh
@sed -i "s/host.docker.internal/172.18.0.1/" $(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/hook-me.sh

# @$(REPO_ROOT)/hack/update-github-templates.sh

.PHONY: clean
clean:
@$(shell find ./example -type f -name "controller-registration.yaml" -exec rm '{}' \;)
@$(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/clean.sh ./cmd/... ./pkg/... ./test/...

.PHONY: check-generate
check-generate:
@$(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/check-generate.sh $(REPO_ROOT)

# TODO: after next gardener/gardener revendoring use the docforge instance in the tools directory
.PHONY: check-docforge
check-docforge:
@./hack/check-docforge.sh

.PHONY: check
check: $(GOIMPORTS)
go vet ./...
@$(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/check-charts.sh ./charts

.PHONY: generate
generate:
@GO111MODULE=off hack/update-codegen.sh --parallel
@$(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/generate.sh ./charts/... ./cmd/... ./pkg/... ./test/...

.PHONY: format
format:
@$(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/format.sh ./cmd ./pkg ./test

.PHONY: test
test:
@SKIP_FETCH_TOOLS=1 $(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/test.sh ./cmd/... ./pkg/...

.PHONY: test-cov
test-cov:
@SKIP_FETCH_TOOLS=1 $(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/test-cover.sh ./cmd/... ./pkg/...

.PHONY: test-clean
test-clean:
@$(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/test-cover-clean.sh

.PHONY: verify
verify: check check-docforge format test

.PHONY: verify-extended
verify-extended: install-requirements check-generate check check-docforge format test test-cov test-clean

.PHONY: get-debug-command
get-debug-command:
$(info LEADER_ELECTION_NAMESPACE=garden dlv debug --build-flags "mod vendor" ./cmd/$(EXTENSION_PREFIX)-$(NAME) -- \
--kubeconfig=${KUBECONFIG} \
--ignore-operation-annotation=$(IGNORE_OPERATION_ANNOTATION) \
--leader-election=$(LEADER_ELECTION) \
--gardener-version="v1.39.0")
@true
86 changes: 86 additions & 0 deletions cmd/gardener-extension-mwe/app/app.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// SPDX-FileCopyrightText: 2021 SAP SE or an SAP affiliate company and Gardener contributors
//
// SPDX-License-Identifier: Apache-2.0

package app

import (
"context"
"fmt"

"github.com/23technologies/gardener-extension-mwe/pkg/controller/lifecycle"
extensionscontroller "github.com/gardener/gardener/extensions/pkg/controller"
"github.com/gardener/gardener/extensions/pkg/util"

"github.com/spf13/cobra"
corev1 "k8s.io/api/core/v1"
componentbaseconfig "k8s.io/component-base/config"
"k8s.io/component-base/version/verflag"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/manager"
)

// NewServiceControllerCommand creates a new command that is used to start the mwe controller
func NewServiceControllerCommand() *cobra.Command {
options := NewOptions()

cmd := &cobra.Command{
Use: "gardener-extension-mwe",
Short: "Minimal working example controller does nothing special",
SilenceErrors: true,

RunE: func(cmd *cobra.Command, args []string) error {
verflag.PrintAndExitIfRequested()

if err := options.optionAggregator.Complete(); err != nil {
return fmt.Errorf("error completing options: %s", err)
}
cmd.SilenceUsage = true
return options.run(cmd.Context())
},
}

verflag.AddFlags(cmd.Flags())
options.optionAggregator.AddFlags(cmd.Flags())

return cmd
}

func (o *Options) run(ctx context.Context) error {
// TODO: Make these flags configurable via command line parameters or component config file.
util.ApplyClientConnectionConfigurationToRESTConfig(&componentbaseconfig.ClientConnectionConfiguration{
QPS: 100.0,
Burst: 130,
}, o.restOptions.Completed().Config)

mgrOpts := o.managerOptions.Completed().Options()

// do not enable a metrics server for the quick start
mgrOpts.MetricsBindAddress = "0"

mgrOpts.ClientDisableCacheFor = []client.Object{
&corev1.Secret{}, // applied for ManagedResources
}

mgr, err := manager.New(o.restOptions.Completed().Config, mgrOpts)
if err != nil {
return fmt.Errorf("could not instantiate controller-manager: %s", err)
}

if err := extensionscontroller.AddToScheme(mgr.GetScheme()); err != nil {
return fmt.Errorf("could not update manager scheme: %s", err)
}

o.controllerOptions.Completed().Apply(&lifecycle.DefaultAddOptions.ControllerOptions)
o.lifecycleOptions.Completed().Apply(&lifecycle.DefaultAddOptions.ControllerOptions)

if err := o.controllerSwitches.Completed().AddToManager(mgr); err != nil {
return fmt.Errorf("could not add controllers to manager: %s", err)
}

if err := mgr.Start(ctx); err != nil {
return fmt.Errorf("error running manager: %s", err)
}

return nil
}
70 changes: 70 additions & 0 deletions cmd/gardener-extension-mwe/app/options.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
// SPDX-FileCopyrightText: 2021 SAP SE or an SAP affiliate company and Gardener contributors
//
// SPDX-License-Identifier: Apache-2.0

package app

import (
"os"

"github.com/23technologies/gardener-extension-mwe/pkg/controller/lifecycle"
controllercmd "github.com/gardener/gardener/extensions/pkg/controller/cmd"
)

// ExtensionName is the name of the extension.
const ExtensionName = "mwe"

// Options holds configuration passed to the mwe controller.
type Options struct {
generalOptions *controllercmd.GeneralOptions
restOptions *controllercmd.RESTOptions
managerOptions *controllercmd.ManagerOptions
controllerOptions *controllercmd.ControllerOptions
lifecycleOptions *controllercmd.ControllerOptions
healthOptions *controllercmd.ControllerOptions
controllerSwitches *controllercmd.SwitchOptions
reconcileOptions *controllercmd.ReconcilerOptions
optionAggregator controllercmd.OptionAggregator
}

// NewOptions creates a new Options instance.
func NewOptions() *Options {
options := &Options{
generalOptions: &controllercmd.GeneralOptions{},
restOptions: &controllercmd.RESTOptions{},
managerOptions: &controllercmd.ManagerOptions{
// These are default values.
LeaderElection: true,
LeaderElectionID: controllercmd.LeaderElectionNameID(ExtensionName),
LeaderElectionNamespace: os.Getenv("LEADER_ELECTION_NAMESPACE"),
},
controllerOptions: &controllercmd.ControllerOptions{
// This is a default value.
MaxConcurrentReconciles: 5,
},
lifecycleOptions: &controllercmd.ControllerOptions{
// This is a default value.
MaxConcurrentReconciles: 5,
},
healthOptions: &controllercmd.ControllerOptions{
// This is a default value.
MaxConcurrentReconciles: 5,
},
reconcileOptions: &controllercmd.ReconcilerOptions{},
controllerSwitches: controllercmd.NewSwitchOptions(
controllercmd.Switch("mwe_lifecycle_controller", lifecycle.AddToManager)),
}

options.optionAggregator = controllercmd.NewOptionAggregator(
options.generalOptions,
options.restOptions,
options.managerOptions,
options.controllerOptions,
controllercmd.PrefixOption("lifecycle-", options.lifecycleOptions),
controllercmd.PrefixOption("healthcheck-", options.healthOptions),
options.controllerSwitches,
options.reconcileOptions,
)

return options
}
24 changes: 24 additions & 0 deletions cmd/gardener-extension-mwe/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// SPDX-FileCopyrightText: 2021 SAP SE or an SAP affiliate company and Gardener contributors
//
// SPDX-License-Identifier: Apache-2.0

package main

import (
"fmt"

"github.com/23technologies/gardener-extension-mwe/cmd/gardener-extension-mwe/app"

"github.com/gardener/gardener/pkg/logger"
runtimelog "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/manager/signals"
)

func main() {
runtimelog.SetLogger(logger.ZapLogger(false))

ctx := signals.SetupSignalHandler()
if err := app.NewServiceControllerCommand().ExecuteContext(ctx); err != nil {
fmt.Println(err)
}
}
23 changes: 23 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
module github.com/23technologies/gardener-extension-mwe

go 1.16

require (
github.com/ahmetb/gen-crd-api-reference-docs v0.2.0
github.com/gardener/gardener v1.43.1
github.com/go-logr/logr v1.2.2
github.com/spf13/cobra v1.4.0
golang.org/x/tools v0.1.9
k8s.io/api v0.23.5
k8s.io/code-generator v0.23.5
k8s.io/component-base v0.23.5
sigs.k8s.io/controller-runtime v0.11.2
)

replace (
k8s.io/api => k8s.io/api v0.22.2
k8s.io/apimachinery => k8s.io/apimachinery v0.22.2
k8s.io/client-go => k8s.io/client-go v0.22.2
k8s.io/component-base => k8s.io/component-base v0.22.2
k8s.io/helm => k8s.io/helm v2.13.1+incompatible
)
Loading

0 comments on commit 455c9c7

Please sign in to comment.