{
  "properties": {
    "apiVersion": {
      "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
      "type": [
        "string",
        "null"
      ]
    },
    "kind": {
      "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
      "type": [
        "string",
        "null"
      ]
    },
    "metadata": {
      "type": [
        "object",
        "null"
      ]
    },
    "spec": {
      "additionalProperties": false,
      "description": "AppBindingSpec is the spec for app",
      "properties": {
        "appRef": {
          "additionalProperties": false,
          "description": "Reference to underlying application",
          "properties": {
            "apiGroup": {
              "type": [
                "string",
                "null"
              ]
            },
            "kind": {
              "type": [
                "string",
                "null"
              ]
            },
            "name": {
              "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
              "type": "string"
            },
            "namespace": {
              "description": "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/",
              "type": [
                "string",
                "null"
              ]
            }
          },
          "required": [
            "name"
          ],
          "type": [
            "object",
            "null"
          ]
        },
        "clientConfig": {
          "additionalProperties": false,
          "description": "ClientConfig defines how to communicate with the app. Required",
          "properties": {
            "caBundle": {
              "description": "CABundle is a PEM encoded CA bundle which will be used to validate the serving certificate of this app.",
              "format": "byte",
              "type": [
                "string",
                "null"
              ]
            },
            "insecureSkipTLSVerify": {
              "description": "InsecureSkipTLSVerify disables TLS certificate verification when communicating with this app. This is strongly discouraged.  You should use the CABundle instead.",
              "type": [
                "boolean",
                "null"
              ]
            },
            "serverName": {
              "description": "ServerName is used to verify the hostname on the returned certificates unless InsecureSkipVerify is given. It is also included in the client's handshake to support virtual hosting unless it is an IP address.",
              "type": [
                "string",
                "null"
              ]
            },
            "service": {
              "additionalProperties": false,
              "description": "`service` is a reference to the service for this app. Either `service` or `url` must be specified. \n If the webhook is running within the cluster, then you should use `service`.",
              "properties": {
                "name": {
                  "description": "`name` is the name of the service. Required",
                  "type": "string"
                },
                "namespace": {
                  "description": "`namespace` is the namespace of the service.",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "path": {
                  "description": "`path` is an optional URL path which will be sent in any request to this service.",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "port": {
                  "description": "The port that will be exposed by this app.",
                  "format": "int32",
                  "type": "integer"
                },
                "query": {
                  "description": "`query` is optional encoded query string, without '?' which will be sent in any request to this service.",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "scheme": {
                  "description": "Specifies which scheme to use, for example: http, https If specified, then it will applied as prefix in this format: scheme:// If not specified, then nothing will be prefixed",
                  "type": "string"
                }
              },
              "required": [
                "name",
                "port",
                "scheme"
              ],
              "type": [
                "object",
                "null"
              ]
            },
            "url": {
              "description": "`url` gives the location of the app, in standard URL form (`[scheme://]host:port/path`). Exactly one of `url` or `service` must be specified. \n The `host` should not refer to a service running in the cluster; use the `service` field instead. The host might be resolved via external DNS in some apiservers (e.g., `kube-apiserver` cannot resolve in-cluster DNS as that would be a layering violation). `host` may also be an IP address. \n A path is optional, and if present may be any string permissible in a URL. You may use the path to pass an arbitrary string to the app, for example, a cluster identifier. \n Attempting to use a user or basic auth e.g. \"user:password@\" is not allowed. Fragments (\"#...\") and query parameters (\"?...\") are not allowed, either.",
              "type": [
                "string",
                "null"
              ]
            }
          },
          "type": "object"
        },
        "parameters": {
          "description": "Parameters is a set of the parameters to be used to connect to the app. The inline YAML/JSON payload to be translated into equivalent JSON object. \n The Parameters field is NOT secret or secured in any way and should NEVER be used to hold sensitive information. To set parameters that contain secret information, you should ALWAYS store that information in a Secret.",
          "type": [
            "object",
            "null"
          ],
          "x-kubernetes-embedded-resource": true,
          "x-kubernetes-preserve-unknown-fields": true
        },
        "secret": {
          "additionalProperties": false,
          "description": "Secret is the name of the secret to create in the AppBinding's namespace that will hold the credentials associated with the AppBinding.",
          "properties": {
            "name": {
              "default": "",
              "description": "Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. TODO: Add other useful fields. apiVersion, kind, uid? More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Drop `kubebuilder:default` when controller-gen doesn't need it https://github.com/kubernetes-sigs/kubebuilder/issues/3896.",
              "type": [
                "string",
                "null"
              ]
            }
          },
          "type": [
            "object",
            "null"
          ],
          "x-kubernetes-map-type": "atomic"
        },
        "secretTransforms": {
          "description": "List of transformations that should be applied to the credentials associated with the ServiceBinding before they are inserted into the Secret.",
          "items": {
            "additionalProperties": false,
            "description": "SecretTransform is a single transformation that is applied to the credentials returned from the broker before they are inserted into the Secret associated with the ServiceBinding. Because different brokers providing the same type of service may each return a different credentials structure, users can specify the transformations that should be applied to the Secret to adapt its entries to whatever the service consumer expects. For example, the credentials returned by the broker may include the key \"USERNAME\", but the consumer requires the username to be exposed under the key \"DB_USER\" instead. To have the Service Catalog transform the Secret, the following SecretTransform must be specified in ServiceBinding.spec.secretTransform: - {\"renameKey\": {\"from\": \"USERNAME\", \"to\": \"DB_USER\"}} Only one of the SecretTransform's members may be specified.",
            "properties": {
              "addKey": {
                "additionalProperties": false,
                "description": "AddKey represents a transform that adds an additional key to the credentials Secret",
                "properties": {
                  "key": {
                    "description": "The name of the key to add",
                    "type": "string"
                  },
                  "stringValue": {
                    "description": "The string (non-binary) value to add to the Secret under the specified key.",
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "value": {
                    "description": "The binary value (possibly non-string) to add to the Secret under the specified key. If both value and stringValue are specified, then value is ignored and stringValue is stored.",
                    "format": "byte",
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "key"
                ],
                "type": [
                  "object",
                  "null"
                ]
              },
              "addKeysFrom": {
                "additionalProperties": false,
                "description": "AddKeysFrom represents a transform that merges all the entries of an existing Secret into the credentials Secret",
                "properties": {
                  "secretRef": {
                    "additionalProperties": false,
                    "description": "The reference to the Secret that should be merged into the credentials Secret.",
                    "properties": {
                      "name": {
                        "default": "",
                        "description": "Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. TODO: Add other useful fields. apiVersion, kind, uid? More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Drop `kubebuilder:default` when controller-gen doesn't need it https://github.com/kubernetes-sigs/kubebuilder/issues/3896.",
                        "type": [
                          "string",
                          "null"
                        ]
                      }
                    },
                    "type": [
                      "object",
                      "null"
                    ],
                    "x-kubernetes-map-type": "atomic"
                  }
                },
                "type": [
                  "object",
                  "null"
                ]
              },
              "removeKey": {
                "additionalProperties": false,
                "description": "RemoveKey represents a transform that removes a credentials Secret entry",
                "properties": {
                  "key": {
                    "description": "The key to remove from the Secret",
                    "type": "string"
                  }
                },
                "required": [
                  "key"
                ],
                "type": [
                  "object",
                  "null"
                ]
              },
              "renameKey": {
                "additionalProperties": false,
                "description": "RenameKey represents a transform that renames a credentials Secret entry's key",
                "properties": {
                  "from": {
                    "description": "The name of the key to rename",
                    "type": "string"
                  },
                  "to": {
                    "description": "The new name for the key",
                    "type": "string"
                  }
                },
                "required": [
                  "from",
                  "to"
                ],
                "type": [
                  "object",
                  "null"
                ]
              }
            },
            "type": "object"
          },
          "type": [
            "array",
            "null"
          ]
        },
        "tlsSecret": {
          "additionalProperties": false,
          "description": "TLSSecret is the name of the secret that will hold the client certificate and private key associated with the AppBinding.",
          "properties": {
            "name": {
              "default": "",
              "description": "Name of the referent. This field is effectively required, but due to backwards compatibility is allowed to be empty. Instances of this type with an empty value here are almost certainly wrong. TODO: Add other useful fields. apiVersion, kind, uid? More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Drop `kubebuilder:default` when controller-gen doesn't need it https://github.com/kubernetes-sigs/kubebuilder/issues/3896.",
              "type": [
                "string",
                "null"
              ]
            }
          },
          "type": [
            "object",
            "null"
          ],
          "x-kubernetes-map-type": "atomic"
        },
        "type": {
          "description": "Type used to facilitate programmatic handling of application.",
          "type": [
            "string",
            "null"
          ]
        },
        "version": {
          "description": "Version used to facilitate programmatic handling of application.",
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "clientConfig"
      ],
      "type": [
        "object",
        "null"
      ]
    }
  },
  "type": "object"
}