Skip to content
This repository has been archived by the owner on Apr 30, 2020. It is now read-only.

Commit

Permalink
Now fully reconciles with actions that return true
Browse files Browse the repository at this point in the history
  • Loading branch information
Rohan CJ committed Feb 11, 2019
1 parent e4fb946 commit c2055b6
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 57 deletions.
2 changes: 1 addition & 1 deletion pkg/apis/operator/v1alpha1/glustercluster_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ type GlusterClusterSpec struct {
// GlusterClusterStatus defines the observed state of GlusterCluster
type GlusterClusterStatus struct {
State string `json:"state,omitempty"`
ReconcileVersion int `json:"reconcileVersion,omitempty"`
ReconcileVersion *int `json:"reconcileVersion,omitempty"`
ReconcileActions map[string]reconciler.Result `json:"reconcileActions,omitempty"`
}

Expand Down
28 changes: 28 additions & 0 deletions pkg/controller/glustercluster/etcdClusterCreated.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package glustercluster

import (
"github.com/gluster/anthill/pkg/reconciler"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
)

//EtcdClusterCreatedV1 reconciles the cluster's etcd cluster
var EtcdClusterCreated = reconciler.NewAction(
"EtcdClusterCreated",
[]*reconciler.Action{
etcdCRDExists,
},
func(request reconcile.Request, client client.Client, scheme *runtime.Scheme) (reconciler.Result, error) {
return reconciler.Result{Status: corev1.ConditionTrue, Message: "it's true"}, nil
},
)

var etcdCRDExists = reconciler.NewAction(
"etcdCRDExists",
[]*reconciler.Action{},
func(request reconcile.Request, client client.Client, scheme *runtime.Scheme) (reconciler.Result, error) {
return reconciler.Result{Status: corev1.ConditionTrue, Message: "it's true"}, nil
},
)
33 changes: 19 additions & 14 deletions pkg/controller/glustercluster/reconcile.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package glustercluster

import (
"context"
"strconv"

"k8s.io/apimachinery/pkg/api/errors"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
Expand All @@ -26,7 +25,6 @@ var (
// Note:
// The Controller will requeue the Request to be processed again if the returned error is non-nil or
// Result.Requeue is true, otherwise upon completion it will remove the work from the queue.

func (r *ReconcileGlusterCluster) Reconcile(request reconcile.Request) (reconcile.Result, error) {
reqLogger := log.WithValues("Request.Namespace", request.Namespace, "Request.Name", request.Name)
reqLogger.Info("Reconciling GlusterCluster")
Expand All @@ -47,30 +45,32 @@ func (r *ReconcileGlusterCluster) Reconcile(request reconcile.Request) (reconcil

// Get current reconcile version from CR
version := instance.Status.ReconcileVersion
if version == 0 {
if version == nil {
// choose the highest compatible version
reconcileProcedure, _ = allProcedures.NewestCompatible(version)
reconcileProcedure, _ = allProcedures.Newest()
} else {
// If no current version, use highest version to reconcile
reconcileProcedure, _ = allProcedures.Newest()
reconcileProcedure, _ = allProcedures.NewestCompatible(*version)
}

// Execute the reconcile procedure. Not sure how to handle the error
procedureStatus, _ := reconcileProcedure.Execute(request, r.client, r.scheme)
procedureStatus, err := reconcileProcedure.Execute(request, r.client, r.scheme)
if err != nil {
log.Error(err, "Failed to execute procedure.")
return reconcile.Result{RequeueAfter: 3e+10}, err
}
// Walk ProcedureStatus.Results and add to the CR status
reconcileActionStatus := make(map[string]reconciler.Result)
for _, result := range procedureStatus.Results {
instance.Status.ReconcileActions[result.Name] = result.Result
}

err = r.client.Status().Update(context.TODO(), instance)
if err != nil {
return reconcile.Result{}, err
reconcileActionStatus[result.Name] = result.Result
}
instance.Status.ReconcileActions = reconcileActionStatus
// if ProcedureStatus.FullyReconciled
// update reconcile version in the CR to match the Procedure version
// use a timed reconcile requeue //left this part out. Why requeue?
if procedureStatus.FullyReconciled {
instance.Spec.Options["reconcileVersion"] = strconv.Itoa(reconcileProcedure.Version())
newVersion := reconcileProcedure.Version()
instance.Status.ReconcileVersion = &newVersion
err := r.client.Update(context.TODO(), instance)
if err != nil {
if errors.IsNotFound(err) {
Expand All @@ -83,7 +83,12 @@ func (r *ReconcileGlusterCluster) Reconcile(request reconcile.Request) (reconcil
return reconcile.Result{}, err
}
} else {
// requeue immediately
err = r.client.Update(context.TODO(), instance)
if err != nil {

return reconcile.Result{}, err
}
//requeue immediately
return reconcile.Result{Requeue: true}, nil
}

Expand Down
52 changes: 10 additions & 42 deletions pkg/controller/glustercluster/v1.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,73 +8,41 @@ import (
"sigs.k8s.io/controller-runtime/pkg/reconcile"
)

// Procedure versioin 0
var ProcedureV1 = reconciler.NewProcedure( //not happy with this name
// ProcedureV1 is Procedure version 1
var ProcedureV1 = reconciler.NewProcedure(
0,
0,
[]*reconciler.Action{
EtcdClusterCreated,
GlusterFuseProvisionerDeployed,
GlusterFuseAttachedDeployed,
GlusterFuseAttacherDeployed,
GlusterFuseNodeDeployed,
},
)

/* action candidates --- (need a naming convention)
//action => prereq => prereq
// I can only think of a procedure with a single action
// since procedureList doesn't preserve order.
nodePool => nodeSVC => nodeCR => nodeCRD
=> etcdCluster => etcdCRD
*/

//procedure level actions
var EtcdClusterCreated = reconciler.NewAction(
"EtcdClusterCreated",
[]*reconciler.Action{
ExamplePrereqAction,
},
func(request reconcile.Request, client client.Client, scheme *runtime.Scheme) (reconciler.Result, error) {
return reconciler.Result{Status: corev1.ConditionTrue, Message: "it's true"}, nil
},
)
//Move the definitions below out to their own files when implementing them.

//GlusterFuseProvisionerDeployed deploys the GlusterFuseProvisioner
var GlusterFuseProvisionerDeployed = reconciler.NewAction(
"GlusterFuseProvisionerDeployed",
[]*reconciler.Action{
ExamplePrereqAction,
},
[]*reconciler.Action{},
func(request reconcile.Request, client client.Client, scheme *runtime.Scheme) (reconciler.Result, error) {
return reconciler.Result{Status: corev1.ConditionTrue, Message: "it's true"}, nil
},
)

var GlusterFuseAttachedDeployed = reconciler.NewAction(
//GlusterFuseAttacherDeployed deploys the GlusterFuseAttacher
var GlusterFuseAttacherDeployed = reconciler.NewAction(
"GlusterFuseAttachedDeployed",
[]*reconciler.Action{
ExamplePrereqAction,
},
[]*reconciler.Action{},
func(request reconcile.Request, client client.Client, scheme *runtime.Scheme) (reconciler.Result, error) {
return reconciler.Result{Status: corev1.ConditionTrue, Message: "it's true"}, nil
},
)

//GlusterFuseNodeDeployed deployes the GlusterFuseNode
var GlusterFuseNodeDeployed = reconciler.NewAction(
"GlusterFuseNodeDeployed",
[]*reconciler.Action{
ExamplePrereqAction,
},
func(request reconcile.Request, client client.Client, scheme *runtime.Scheme) (reconciler.Result, error) {
return reconciler.Result{Status: corev1.ConditionTrue, Message: "it's true"}, nil
},
)

//prereq level actions
var ExamplePrereqAction = reconciler.NewAction(
"ExamplePrereqAction",
[]*reconciler.Action{},
func(request reconcile.Request, client client.Client, scheme *runtime.Scheme) (reconciler.Result, error) {
return reconciler.Result{Status: corev1.ConditionTrue, Message: "it's true"}, nil
Expand Down

0 comments on commit c2055b6

Please sign in to comment.