Skip to content

APIServiceBindings

The APIServiceBinding controller watches APIServiceBindings, and CRDs in the consumer cluster and APIServiceExports in the provider cluster.

It is responsible for:

  • synchronizing APIServiceExports in the provider cluster to CRDs in the consumer cluster

Overview

flowchart TD
    %% Nodes
    start@{ shape: start }
    stop@{ shape: stop }

    enqueue_reconcile(["Enqueue reconcile call
    for APIServiceBinding"])

    is_apiservicebinding_owned{"binding<br>owned?"}
    set_apiservicebinding_condition_connected_to_true(["Set condition
    'Connected'
    to true"])
    set_apiservicebinding_condition_connected_to_true2(["Set condition 'Connected'
    to true"])

    set_apiservicebinding_condition_connected_to_false(["Set condition 'Connected'
    to false"])
    set_apiservicebinding_condition_connected_to_false2(["Set condition 'Connected'
    to false"])

    set_apiservicebinding_condition_schemainsync_to_true(["Set condition 'SchemaInSync'
    to true"])

    get_apiserviceexport(["Get provider
    APIServiceExport"])
    is_apiserviceexport_present{"export<br>exists?"}

    get_apiserviceexportrequest(["Get provider
     APIServiceExportRequest"])
    is_apiserviceexportrequest_in_failed_state{"Is APIServiceExportRequest<br>in failed state?"}

    get_bound_schemas(["Get provider
    BoundSchemas referenced in
    APIServiceExport"])
    bound_schema_fetch_successful(["Fetching BoundSchemas
    succeed?"])
    reference_bound_schema(["Reference BoundSchema
    in APIServiceBinding
    status"])
    convert_boundschema_to_crd(["Convert BoundSchema
    to CRD"])


    get_crd(["Get CRD"])
    create_crd(["Create CRD"])
    update_crd(["Update CRD"])
    is_crd_present{"CRD<br>exists?"}
    is_crd_owned{"CRD<br>owned?"}

    get_clusterbinding(["Get ClusterBinding"])
    set_apiservicebinding_provider_name(["Set provider name"])

    %% Transitions
    start --> enqueue_reconcile
    enqueue_reconcile --> is_apiservicebinding_owned

    is_apiservicebinding_owned --> |yes| get_apiserviceexport
    get_apiserviceexport --> is_apiserviceexport_present
    is_apiserviceexport_present --> |yes| set_apiservicebinding_condition_connected_to_true2
    is_apiserviceexport_present --> |no| get_apiserviceexportrequest
    get_apiserviceexportrequest --> is_apiserviceexportrequest_in_failed_state
    is_apiserviceexportrequest_in_failed_state --> |yes| set_apiservicebinding_condition_connected_to_false2
    is_apiserviceexportrequest_in_failed_state --> |no| set_apiservicebinding_condition_connected_to_false2

    set_apiservicebinding_condition_connected_to_false2 --> stop
    set_apiservicebinding_condition_connected_to_true2 --> get_bound_schemas
    get_bound_schemas --> bound_schema_fetch_successful
    bound_schema_fetch_successful --> |yes| reference_bound_schema
    bound_schema_fetch_successful --> |no| set_apiservicebinding_condition_connected_to_false
    reference_bound_schema --> convert_boundschema_to_crd
    set_apiservicebinding_condition_connected_to_false --> stop

    convert_boundschema_to_crd -->  get_crd

    get_crd --> is_crd_present
    is_crd_present --> |no| create_crd
    is_crd_present --> |yes| is_crd_owned
    create_crd --> update_crd

    update_crd --> set_apiservicebinding_condition_connected_to_true
    set_apiservicebinding_condition_connected_to_true --> set_apiservicebinding_condition_schemainsync_to_true

    is_crd_owned --> |yes| update_crd
    is_crd_owned --> |no| set_apiservicebinding_condition_connected_to_false

    set_apiservicebinding_condition_schemainsync_to_true --> get_clusterbinding
    get_clusterbinding --> set_apiservicebinding_provider_name
    is_apiservicebinding_owned --> |no| stop
    set_apiservicebinding_provider_name --> stop