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

Fix resource reloading and remove reloader #1031

Merged
merged 3 commits into from
Nov 6, 2019
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
5 changes: 0 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,6 @@ manager: prebuild
manager-clean:
rm -f bin/manager

# Install reloader into a cluster via kubectl kudo init
.PHONY: reloader
deploy-reloader:
go run -ldflags "${LDFLAGS}" cmd/kubectl-kudo/main.go init --disable-manager

.PHONY: run
# Run against the configured Kubernetes cluster in ~/.kube/config
run:
Expand Down
14 changes: 10 additions & 4 deletions pkg/apis/kudo/v1beta1/instance_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ import (
"log"
"reflect"

"k8s.io/apimachinery/pkg/util/uuid"

apimachinerytypes "k8s.io/apimachinery/pkg/types"

"github.com/kudobuilder/kudo/pkg/util/kudo"

corev1 "k8s.io/api/core/v1"
Expand Down Expand Up @@ -72,10 +76,11 @@ type AggregatedStatus struct {
//+-------------+ +----------------+
//
type PlanStatus struct {
Name string `json:"name,omitempty"`
Status ExecutionStatus `json:"status,omitempty"`
LastFinishedRun metav1.Time `json:"lastFinishedRun,omitempty"`
Phases []PhaseStatus `json:"phases,omitempty"`
Name string `json:"name,omitempty"`
Status ExecutionStatus `json:"status,omitempty"`
LastFinishedRun metav1.Time `json:"lastFinishedRun,omitempty"`
Phases []PhaseStatus `json:"phases,omitempty"`
UID apimachinerytypes.UID `json:"uid,omitempty"`
}

// PhaseStatus is representing status of a phase
Expand Down Expand Up @@ -260,6 +265,7 @@ func (i *Instance) StartPlanExecution(planName string, ov *OperatorVersion) erro
notFound = false
planStatus := i.Status.PlanStatus[planIndex]
planStatus.Status = ExecutionPending
planStatus.UID = uuid.NewUUID()
for j, p := range v.Phases {
planStatus.Phases[j].Status = ExecutionPending
for k := range p.Steps {
Expand Down
2 changes: 2 additions & 0 deletions pkg/engine/renderer/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"text/template"

"github.com/kudobuilder/kudo/pkg/engine"
"k8s.io/apimachinery/pkg/types"

"github.com/Masterminds/sprig"
)
Expand All @@ -16,6 +17,7 @@ type Metadata struct {
engine.Metadata

PlanName string
PlanUID types.UID
PhaseName string
StepName string
TaskName string
Expand Down
1 change: 1 addition & 0 deletions pkg/engine/renderer/enhancer.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ func (k *KustomizeEnhancer) Apply(templates map[string]string, metadata Metadata
kudo.PhaseAnnotation: metadata.PhaseName,
kudo.StepAnnotation: metadata.StepName,
kudo.OperatorVersionAnnotation: metadata.OperatorVersion,
kudo.PlanUIDAnnotation: string(metadata.PlanUID),
},
GeneratorOptions: &ktypes.GeneratorOptions{
DisableNameSuffixHash: true,
Expand Down
1 change: 1 addition & 0 deletions pkg/engine/workflow/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ func Execute(pl *ActivePlan, em *engine.Metadata, c client.Client, enh renderer.
exm := renderer.Metadata{
Metadata: *em,
PlanName: pl.Name,
PlanUID: planStatus.UID,
PhaseName: ph.Name,
StepName: st.Name,
TaskName: tn,
Expand Down
42 changes: 14 additions & 28 deletions pkg/kudoctl/cmd/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,25 +51,20 @@ and finishes with success if KUDO is already installed.
`
)

const defaultReloaderImage = "stakater/reloader:v0.0.49"

type initCmd struct {
out io.Writer
fs afero.Fs
image string
reloaderImage string
disableManager bool
disableReloader bool
dryRun bool
output string
version string
ns string
wait bool
timeout int64
clientOnly bool
crdOnly bool
home kudohome.Home
client *kube.Client
out io.Writer
fs afero.Fs
image string
dryRun bool
output string
version string
ns string
wait bool
timeout int64
clientOnly bool
crdOnly bool
home kudohome.Home
client *kube.Client
}

func newInitCmd(fs afero.Fs, out io.Writer) *cobra.Command {
Expand Down Expand Up @@ -97,13 +92,10 @@ func newInitCmd(fs afero.Fs, out io.Writer) *cobra.Command {
f := cmd.Flags()
f.BoolVarP(&i.clientOnly, "client-only", "c", false, "If set does not install KUDO on the server")
f.StringVarP(&i.image, "kudo-image", "i", "", "Override KUDO controller image and/or version")
f.StringVar(&i.reloaderImage, "reloader-image", defaultReloaderImage, "Override reloader controller image and/or version")
f.StringVarP(&i.version, "version", "", "", "Override KUDO controller version of the KUDO image")
f.StringVarP(&i.output, "output", "o", "", "Output format")
f.BoolVar(&i.dryRun, "dry-run", false, "Do not install local or remote")
f.BoolVar(&i.crdOnly, "crd-only", false, "Add only KUDO CRDs to your cluster")
f.BoolVar(&i.disableManager, "disable-manager", false, "Disable running the manager container. Useful in development.")
f.BoolVar(&i.disableReloader, "disable-reloader", false, "Disable running the reloader container. Useful in development.")
f.BoolVarP(&i.wait, "wait", "w", false, "Block until KUDO manager is running and ready to receive requests")
f.Int64Var(&i.timeout, "wait-timeout", 300, "Wait timeout to be used")

Expand All @@ -126,24 +118,18 @@ func (initCmd *initCmd) validate(flags *flag.FlagSet) error {
if flags.Changed("wait-timeout") && !initCmd.wait {
return errors.New("wait-timeout is only useful when using the flag '--wait'")
}
if initCmd.disableManager && initCmd.disableReloader {
return errors.New("disabling both the manager and reloader is unsupported")
}

return nil
}

// run initializes local config and installs KUDO manager to Kubernetes cluster.
func (initCmd *initCmd) run() error {
opts := cmdInit.NewOptions(initCmd.version, initCmd.ns, initCmd.reloaderImage)
opts := cmdInit.NewOptions(initCmd.version, initCmd.ns)
// if image provided switch to it.
if initCmd.image != "" {
opts.Image = initCmd.image
}

opts.DisableManager = initCmd.disableManager
opts.DisableReloader = initCmd.disableReloader

//TODO: implement output=yaml|json (define a type for output to constrain)
//define an Encoder to replace YAMLWriter
if strings.ToLower(initCmd.output) == "yaml" {
Expand Down
88 changes: 32 additions & 56 deletions pkg/kudoctl/cmd/init/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,10 @@ import (
//Defines the deployment of the KUDO manager and it's service definition.

const (
group = "kudo.dev"
reloaderAnnotationBase = "reloader.kudo.dev/"
autoAnnotation = reloaderAnnotationBase + "auto"
secretAnnotation = "secret." + reloaderAnnotationBase + "reload"
configMapAnnotation = "configmap." + reloaderAnnotationBase + "reload"
crdVersion = "v1beta1"
defaultns = "kudo-system"
defaultGracePeriod = 10
group = "kudo.dev"
crdVersion = "v1beta1"
defaultns = "kudo-system"
defaultGracePeriod = 10
)

// Options is the configurable options to init
Expand All @@ -44,15 +40,10 @@ type Options struct {
TerminationGracePeriodSeconds int64
// Image defines the image to be used
Image string

// ReloaderImage defines the reloader image
ReloaderImage string
DisableManager bool
DisableReloader bool
}

// NewOptions provides an option struct with defaults
func NewOptions(v string, ns string, reloaderImage string) Options {
func NewOptions(v string, ns string) Options {

if v == "" {
v = version.Get().GitVersion
Expand All @@ -66,7 +57,6 @@ func NewOptions(v string, ns string, reloaderImage string) Options {
Namespace: ns,
TerminationGracePeriodSeconds: defaultGracePeriod,
Image: fmt.Sprintf("kudobuilder/controller:v%v", v),
ReloaderImage: reloaderImage,
}
}

Expand Down Expand Up @@ -185,8 +175,33 @@ func generateDeployment(opts Options) *appsv1.StatefulSet {
Labels: labels,
},
Spec: v1.PodSpec{
ServiceAccountName: "kudo-manager",
Containers: []v1.Container{},
ServiceAccountName: "kudo-manager",
Containers: []v1.Container{

{

Command: []string{"/root/manager"},
Env: []v1.EnvVar{
{Name: "POD_NAMESPACE", ValueFrom: &v1.EnvVarSource{FieldRef: &v1.ObjectFieldSelector{FieldPath: "metadata.namespace"}}},
{Name: "SECRET_NAME", Value: "kudo-webhook-server-secret"},
},
Image: image,
ImagePullPolicy: "Always",
Name: "manager",
Ports: []v1.ContainerPort{
// name matters for service
{ContainerPort: 9876, Name: "webhook-server", Protocol: "TCP"},
},
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{
"cpu": resource.MustParse("100m"),
"memory": resource.MustParse("50Mi")},
},
VolumeMounts: []v1.VolumeMount{
{Name: "cert", MountPath: "/tmp/cert", ReadOnly: true},
},
},
},
TerminationGracePeriodSeconds: &opts.TerminationGracePeriodSeconds,
Volumes: []v1.Volume{
{Name: "cert", VolumeSource: v1.VolumeSource{Secret: &v1.SecretVolumeSource{SecretName: "kudo-webhook-server-secret", DefaultMode: &secretDefaultMode}}},
Expand All @@ -196,45 +211,6 @@ func generateDeployment(opts Options) *appsv1.StatefulSet {
},
}

if !opts.DisableManager {
d.Spec.Template.Spec.Containers = append(d.Spec.Template.Spec.Containers, v1.Container{

Command: []string{"/root/manager"},
Env: []v1.EnvVar{
{Name: "POD_NAMESPACE", ValueFrom: &v1.EnvVarSource{FieldRef: &v1.ObjectFieldSelector{FieldPath: "metadata.namespace"}}},
{Name: "SECRET_NAME", Value: "kudo-webhook-server-secret"},
},
Image: image,
ImagePullPolicy: "Always",
Name: "manager",
Ports: []v1.ContainerPort{
// name matters for service
{ContainerPort: 9876, Name: "webhook-server", Protocol: "TCP"},
},
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{
"cpu": resource.MustParse("100m"),
"memory": resource.MustParse("50Mi")},
},
VolumeMounts: []v1.VolumeMount{
{Name: "cert", MountPath: "/tmp/cert", ReadOnly: true},
},
})
}

if !opts.DisableReloader {
d.Spec.Template.Spec.Containers = append(d.Spec.Template.Spec.Containers, v1.Container{
Image: opts.ReloaderImage,
ImagePullPolicy: "Always",
Name: "reloader",
Args: []string{
"--auto-annotation", autoAnnotation,
"--configmap-annotation", configMapAnnotation,
"--secret-annotation", secretAnnotation,
},
})
}

return d
}

Expand Down
2 changes: 1 addition & 1 deletion pkg/kudoctl/cmd/init_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ func TestNoErrorOnReInit(t *testing.T) {

func deleteInitObjects(client *testutils.RetryClient) {
crds := cmdinit.CRDs().AsArray()
prereqs := cmdinit.Prereq(cmdinit.NewOptions("", "", defaultReloaderImage))
prereqs := cmdinit.Prereq(cmdinit.NewOptions("", ""))
deleteCRDs(crds, client)
deletePrereq(prereqs, client)
}
Expand Down
13 changes: 0 additions & 13 deletions pkg/kudoctl/cmd/init_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,18 +131,6 @@ func TestInitCmd_YAMLWriter(t *testing.T) {
file: "deploy-kudo-ns-default.yaml",
settings: env.DefaultSettings, // "default" namespace
},
{
file: "deploy-kudo-manager-only.yaml",
additionalFlags: map[string]string{
"disable-reloader": "true",
},
},
{
file: "deploy-kudo-reloader-only.yaml",
additionalFlags: map[string]string{
"disable-manager": "true",
},
},
}

for _, tc := range testCases {
Expand Down Expand Up @@ -238,7 +226,6 @@ func TestNewInitCmd(t *testing.T) {
{name: "name and version together invalid", flags: map[string]string{"kudo-image": "foo", "version": "bar"}, errorMessage: "specify either 'kudo-image' or 'version', not both"},
{name: "crd-only and wait together invalid", flags: map[string]string{"crd-only": "true", "wait": "true"}, errorMessage: "wait is not allowed with crd-only"},
{name: "wait-timeout invalid without wait", flags: map[string]string{"wait-timeout": "400"}, errorMessage: "wait-timeout is only useful when using the flag '--wait'"},
{name: "specifying both disable-manager and disable-reloader", flags: map[string]string{"disable-manager": "true", "disable-reloader": "true"}, errorMessage: "disabling both the manager and reloader is unsupported"},
}

for _, tt := range tests {
Expand Down
Loading