Reconciler Implementation and Design

    1. Update the and initialize the Status conditions (as defined in samplesource_lifecycle.go and samplesource_types.go)
    1. Create/reconcile the Receive Adapter (detailed below)
    2. If successful, update the Status and MarkDeployed
    1. src.Status.PropagateDeploymentAvailability(ra)
    1. Create/reconcile the SinkBinding for the Receive Adapter targeting the Sink (detailed below)
    2. MarkSink with the result
    1. src.Status.MarkSink(sb.Status.SinkURI)
    1. Return a new reconciler event stating that the process is done
    1. return pkgreconciler.NewEvent(corev1.EventTypeNormal, "SampleSourceReconciled", "SampleSource reconciled: \"%s/%s\"", namespace, name)

    As part of the source reconciliation, we have to create and deploy (and update if necessary) the underlying receive adapter.

    Assemble the ReceiveAdapterArgs

    1. ra, err := r.KubeClientSet.AppsV1().Deployments(namespace).Get(expected.Name, metav1.GetOptions{})
    1. Otherwise, create the deployment
    1. ra, err = r.KubeClientSet.AppsV1().Deployments(namespace).Create(expected)
    1. Check if the expected vs existing spec is different, and update the deployment if required
    1. } else if r.podSpecImageSync(expected.Spec.Template.Spec, ra.Spec.Template.Spec) {
    2. ra.Spec.Template.Spec = expected.Spec.Template.Spec
    3. if ra, err = r.KubeClientSet.AppsV1().Deployments(namespace).Update(ra); err != nil {
    4. return ra, err
    5. }
    1. If updated, record the event

    Instead of directly giving the details of the sink to the receive adapter, use a SinkBinding to bind the receive adapter with the sink.

    1. Create a Reference for the receive adapter deployment. This deployment will be ‘s source:
    1. APIVersion: appsv1.SchemeGroupVersion.String(),
    2. Kind: "Deployment",
    3. Namespace: ra.Namespace,
    4. Name: ra.Name,
    5. }
    1. Fetch the existing SinkBinding
    1. namespace := owner.GetObjectMeta().GetNamespace()
    2. sb, err := r.EventingClientSet.SourcesV1alpha2().SinkBindings(namespace).Get(expected.Name, metav1.GetOptions{})
    1. If it doesn’t exist, create it
    1. sb, err = r.EventingClientSet.SourcesV1alpha2().SinkBindings(namespace).Create(expected)
    1. Check if the expected vs existing spec is different, and update the SinkBinding if required
    1. If updated, record the event