Create Deployment Dependant Resource

Now it’s time for our Operator to actually do something, let’s have him create a Deployment for us using the information from our Custom Resource :

Create a new Java class named DeploymentDependant with the following content :

package com.redhat.devnation;


import io.fabric8.kubernetes.api.model.apps.Deployment;
import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;

public class DeploymentDependant extends CRUDKubernetesDependentResource<Deployment, Greeting> {

    public DeploymentDependant() {
        super(Deployment.class);
    }

    @Override
    protected Deployment desired(Greeting primary, Context<Greeting> context) {
        Deployment deployment = new DeploymentBuilder()
        .withNewMetadata()
           .withName("greeting-app")
           .addToLabels("app", "greeting-app")
        .endMetadata()
        .withNewSpec()
           .withReplicas(1)
           .withNewTemplate()
             .withNewMetadata()
             .addToLabels("app", "greeting-app")
             .endMetadata()
             .withNewSpec()
               .addNewContainer()
                  .withName("greeting-container")
                  .withImage("quay.io/rhdevelopers/blue-green-canary")
                  .addNewEnv().withName("BLUE_GREEN_CANARY_COLOR").withValue(primary.getSpec().getColor()).endEnv()
                  .addNewEnv().withName("BLUE_GREEN_CANARY_MESSAGE").withValue(primary.getSpec().getGreeting()).endEnv()
               .endContainer()
             .endSpec()
           .endTemplate()
           .withNewSelector()
             .addToMatchLabels("app","greeting-app")
           .endSelector()
        .endSpec()
      .build();
    return deployment;
    }
}

And now let’s update our reconciler, GreetingReconciler.java

package com.redhat.devnation;

import static io.javaoperatorsdk.operator.api.reconciler.Constants.WATCH_CURRENT_NAMESPACE;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent;

@ControllerConfiguration(namespaces = WATCH_CURRENT_NAMESPACE, dependents = {
  @Dependent(type = DeploymentDependant.class))})
public class GreetingReconciler implements Reconciler<Greeting> {
  private final KubernetesClient client;

  public GreetingReconciler(KubernetesClient client) {
    this.client = client;
  }

  // TODO Fill in the rest of the reconciler

  @Override
  public UpdateControl<Greeting> reconcile(Greeting resource, Context context) {
    // TODO: fill in logic

    return UpdateControl.noUpdate();
  }
}

Make sure a deployment has been created : kubectl get deployment

You should have an output like :

NAME           READY   UP-TO-DATE   AVAILABLE   AGE
greeting-app   1/1     1            1           70m