Information Flow for Operator SDK Ansible-based Operators

    • Gets the primary resource based on NamespacedName this uses the cache from controller runtime.
    • Determines if the resource is deleted based on the existence of a finalizer and a metadata.DeletionTimeStamp.
      • If deleted and not one of our finalizers we exit with no error.
      • If finalizer is needed, but is not on the object, and is not deleted then add it and continue.
    • Creates the proxy’s kubeconfig.
    • Calls out Runner using the runner package.
    • Watches for events to come back across the results channel.
      • Logs the events
      • Keeps track of failure messages as well as the StatusEvent, which is the ending event that the Ansible sends to mark the playbook/role is completed.
    • If a finalizer exists and the resource was deleted then remove the finalizer and update the object and continue.
    • Update the status of the resource to mark that the run has completed
    • Create the socket that ansible will communicate over
    • Create the directory on disk for ansible runner. or update the files on disk if they already exist.
    • Run the ansible runner command in a go routine, when this exits close the channel for the socket.
    • Every request to the k8s api goes through the proxy.
    • The owner reference is injected into the object that is being created in the same namespace as the CR.
    • The operator-sdk annotations are injected into the object that is being created outside of namepsace of the CR.
    • The proxy then adds dependent watches for the correct controller if we have not started watching the type already.
    • On a GET, we attempt to use the informer cache to get the resource. This will also attempt to re-add dependent watches if we find a type with an owner reference.
    • Ansible is run and has its own process.