Skip to content

Commit

Permalink
create a provisioner job per matching node
Browse files Browse the repository at this point in the history
Signed-off-by: Sven Pfennig <[email protected]>
  • Loading branch information
0xE282B0 committed Sep 29, 2023
1 parent 422b797 commit 58b73f0
Showing 1 changed file with 68 additions and 27 deletions.
95 changes: 68 additions & 27 deletions controllers/shim_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,65 +74,90 @@ func (r *ShimReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.
return ctrl.Result{}, client.IgnoreNotFound(err)
}

// Create a new Kubernetes Job based on the Shim custom resource
job := r.buildJobForShim(shim)

// Set the owner reference to the Shim custom resource
if err := controllerutil.SetControllerReference(shim, job, r.Scheme); err != nil {
nodeList := &corev1.NodeList{}
if err := r.Client.List(ctx, nodeList); err != nil {
log.Log.Error(err, "Failed to get all nodes status")
return ctrl.Result{}, err
}

// Check if the Job already exists, if not, create it
found := &batchv1.Job{}
err = r.Get(ctx, types.NamespacedName{
Name: job.Name,
Namespace: job.Namespace}, found)
if err != nil && client.IgnoreNotFound(err) != nil {
return ctrl.Result{}, err
}
for _, node := range nodeList.Items {

if err != nil {
// Job does not exist, create it
if err := r.Create(ctx, job); err != nil {
return ctrl.Result{}, err
if !matchNode(shim, node) {
continue
}

r.Recorder.Event(shim, corev1.EventTypeNormal, "Created", "something was created")
// Create a new Kubernetes Job based on the Shim custom resource
job := r.buildJobForShim(shim, node)

if err := r.UpdateConditions(ctx, shim, metav1.Condition{
Type: typeAvailableShim,
Status: metav1.ConditionUnknown,
Reason: "Reconciling",
Message: "Job created"}); err != nil {
// Check if the Job already exists, if not, create it
found := &batchv1.Job{}
err = r.Get(ctx, types.NamespacedName{
Name: job.Name,
Namespace: job.Namespace}, found)
if err != nil && client.IgnoreNotFound(err) != nil {
return ctrl.Result{}, err
}
}

if err != nil {
// Job does not exist, create it
if err := r.Create(ctx, job); err != nil {
log.Log.Error(err, "Failed to create job")
//return ctrl.Result{}, err
}

err := r.Get(ctx, req.NamespacedName, shim)
if err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
}

r.Recorder.Event(shim, corev1.EventTypeNormal, "Created", "something was created")

if err := r.UpdateConditions(ctx, shim, metav1.Condition{
Type: typeAvailableShim,
Status: metav1.ConditionUnknown,
Reason: "Reconciling",
Message: "Job created"}); err != nil {
return ctrl.Result{}, err
}
}
}
// Job already exists, do nothing
return ctrl.Result{}, nil
}

func (r *ShimReconciler) buildJobForShim(shim *v1beta1.Shim) *batchv1.Job {
func (r *ShimReconciler) buildJobForShim(shim *v1beta1.Shim, node corev1.Node) *batchv1.Job {
//TODO: check if shim nodeselctor matches node.

backoffLimit := int32(1)
job := &batchv1.Job{
ObjectMeta: metav1.ObjectMeta{
Name: fmt.Sprintf("shim-job-%s", shim.Name),
Name: fmt.Sprintf("%s-%s", shim.Name, node.Name),
Namespace: os.Getenv("CONTROLLER_NAMESPACE"),
},
Spec: batchv1.JobSpec{
BackoffLimit: &backoffLimit,
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
RestartPolicy: "Never",
NodeName: node.Name,
NodeSelector: shim.Spec.NodeSelector,
Containers: []corev1.Container{
{
Name: "my-shim-container",
Image: "your-specific-image", // Set your specific image here
// Add other container settings as needed
},
},
RestartPolicy: "Never",
},
},
},
}

// Set the owner reference to the Shim custom resource
if err := controllerutil.SetControllerReference(shim, job, r.Scheme); err != nil {
return nil
}

return job
}

Expand All @@ -151,6 +176,22 @@ func (r *ShimReconciler) UpdateConditions(ctx context.Context, shim *runtimev1be
return nil
}

func matchNode(shim *v1beta1.Shim, node corev1.Node) bool {
if shim.Spec.NodeSelector == nil {
return true
}
matchNode := false
for selector, selectorValue := range shim.Spec.NodeSelector {
for label, labelValue := range node.Labels {
if label == selector && labelValue == selectorValue {
matchNode = true
break
}
}
}
return matchNode
}

// SetupWithManager sets up the controller with the Manager.
func (r *ShimReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
Expand Down

0 comments on commit 58b73f0

Please sign in to comment.