Skip to content

Commit

Permalink
Normalize options on the stub and update the normalized CR
Browse files Browse the repository at this point in the history
Signed-off-by: Juraci Paixão Kröhling <juraci@kroehling.de>
  • Loading branch information
jpkrohling committed Oct 9, 2018
1 parent 864626d commit e418edb
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 63 deletions.
58 changes: 0 additions & 58 deletions pkg/controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package controller

import (
"context"
"strings"

"github.com/operator-framework/operator-sdk/pkg/sdk"
"github.com/sirupsen/logrus"
Expand All @@ -18,67 +17,10 @@ type Controller interface {

// NewController build a new controller object for the given spec
func NewController(ctx context.Context, jaeger *v1alpha1.Jaeger) Controller {
// we need a name!
if jaeger.ObjectMeta.Name == "" {
logrus.Infof("This Jaeger instance was created without a name. Setting it to 'my-jaeger'")
jaeger.ObjectMeta.Name = "my-jaeger"
}

// normalize the storage type
if jaeger.Spec.Storage.Type == "" {
logrus.Infof(
"Storage type wasn't provided for the Jaeger instance '%v'. Falling back to 'memory'",
jaeger.ObjectMeta.Name,
)
jaeger.Spec.Storage.Type = "memory"
}

if unknownStorage(jaeger.Spec.Storage.Type) {
logrus.Infof(
"The provided storage type for the Jaeger instance '%v' is unknown ('%v'). Falling back to 'memory'",
jaeger.ObjectMeta.Name,
jaeger.Spec.Storage.Type,
)
jaeger.Spec.Storage.Type = "memory"
}

// normalize the deployment strategy
if strings.ToLower(jaeger.Spec.Strategy) != "production" {
jaeger.Spec.Strategy = "all-in-one"
}

logrus.Debugf("Jaeger strategy: %s", jaeger.Spec.Strategy)
if jaeger.Spec.Strategy == "all-in-one" {
return newAllInOneController(ctx, jaeger)
}

// check for incompatible options
if strings.ToLower(jaeger.Spec.Storage.Type) == "memory" {
logrus.Warnf(
"No suitable storage was provided for the Jaeger instance '%v'. "+
"Falling back to all-in-one. Storage type: '%v'",
jaeger.ObjectMeta.Name,
jaeger.Spec.Storage.Type,
)
return newAllInOneController(ctx, jaeger)
}

return newProductionController(ctx, jaeger)
}

func unknownStorage(typ string) bool {
known := []string{
"memory",
"kafka",
"elasticsearch",
"cassandra",
}

for _, k := range known {
if strings.ToLower(typ) == k {
return false
}
}

return true
}
72 changes: 67 additions & 5 deletions pkg/stub/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package stub

import (
"context"
"strings"

"github.com/operator-framework/operator-sdk/pkg/sdk"
"github.com/sirupsen/logrus"
Expand All @@ -26,16 +27,56 @@ func (h *Handler) Handle(ctx context.Context, event sdk.Event) error {
case *v1alpha1.Jaeger:
if event.Deleted {
logrus.Infof("Deleting '%s'", o.Name)
// aparently, everything created by the CR should cascade the deletion to the
// resources it created, so, no need to do anything
// on a next version, we could think about cleaning up the data pertaining to
// us at the storage level, but not for now
return nil
}

// we need a name!
if o.Name == "" {
logrus.Infof("This Jaeger instance was created without a name. Setting it to 'my-jaeger'")
o.Name = "my-jaeger"
}

// normalize the storage type
if o.Spec.Storage.Type == "" {
logrus.Infof("Storage type wasn't provided for the Jaeger instance '%v'. Falling back to 'memory'", o.Name)
o.Spec.Storage.Type = "memory"
}

if unknownStorage(o.Spec.Storage.Type) {
logrus.Infof(
"The provided storage type for the Jaeger instance '%v' is unknown ('%v'). Falling back to 'memory'",
o.Name,
o.Spec.Storage.Type,
)
o.Spec.Storage.Type = "memory"
}

// normalize the deployment strategy
if strings.ToLower(o.Spec.Strategy) != "production" {
o.Spec.Strategy = "all-in-one"
}

// check for incompatible options
// if the storage is `memory`, then the only possible strategy is `all-in-one`
if strings.ToLower(o.Spec.Storage.Type) == "memory" && o.Spec.Strategy != "all-in-one" {
logrus.Warnf(
"No suitable storage was provided for the Jaeger instance '%v'. Falling back to all-in-one. Storage type: '%v'",
o.Name,
o.Spec.Storage.Type,
)
o.Spec.Strategy = "all-in-one"
}

// we store back the "fixed" CR, so that what is stored reflects what is being used
if err := sdk.Update(o); err != nil {
logrus.Errorf("failed to update %v", o)
return err
}

ctrl := controller.NewController(ctx, o)

objs := ctrl.Create()
created := false
for _, obj := range objs {
err := sdk.Create(obj)
if err != nil && !apierrors.IsAlreadyExists(err) {
Expand All @@ -44,10 +85,14 @@ func (h *Handler) Handle(ctx context.Context, event sdk.Event) error {
}

if err == nil {
logrus.Infof("Created '%v'", o.Name)
created = true
}
}

if created {
logrus.Infof("Configured %v", o.Name)
}

objs = ctrl.Update()
for _, obj := range objs {
logrus.Debugf("Updating %v", obj)
Expand All @@ -59,3 +104,20 @@ func (h *Handler) Handle(ctx context.Context, event sdk.Event) error {
}
return nil
}

func unknownStorage(typ string) bool {
known := []string{
"memory",
"kafka",
"elasticsearch",
"cassandra",
}

for _, k := range known {
if strings.ToLower(typ) == k {
return false
}
}

return true
}

0 comments on commit e418edb

Please sign in to comment.