{
  "description": "InstallPlan defines the installation of a set of operators.",
  "type": "object",
  "required": [
    "metadata",
    "spec"
  ],
  "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"
    },
    "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"
    },
    "metadata": {
      "type": "object"
    },
    "spec": {
      "description": "InstallPlanSpec defines a set of Application resources to be installed",
      "type": "object",
      "required": [
        "approval",
        "approved",
        "clusterServiceVersionNames"
      ],
      "properties": {
        "approval": {
          "description": "Approval is the user approval policy for an InstallPlan. It must be one of \"Automatic\" or \"Manual\".",
          "type": "string"
        },
        "approved": {
          "type": "boolean"
        },
        "clusterServiceVersionNames": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "generation": {
          "type": "integer"
        },
        "source": {
          "type": "string"
        },
        "sourceNamespace": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "status": {
      "description": "InstallPlanStatus represents the information about the status of steps required to complete installation. \n Status may trail the actual state of a system.",
      "type": "object",
      "required": [
        "catalogSources",
        "phase"
      ],
      "properties": {
        "attenuatedServiceAccountRef": {
          "description": "AttenuatedServiceAccountRef references the service account that is used to do scoped operator install.",
          "type": "object",
          "properties": {
            "apiVersion": {
              "description": "API version of the referent.",
              "type": "string"
            },
            "fieldPath": {
              "description": "If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: \"spec.containers{name}\" (where \"name\" refers to the name of the container that triggered the event) or if no container name is specified \"spec.containers[2]\" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.",
              "type": "string"
            },
            "kind": {
              "description": "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
              "type": "string"
            },
            "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"
            },
            "resourceVersion": {
              "description": "Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency",
              "type": "string"
            },
            "uid": {
              "description": "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids",
              "type": "string"
            }
          },
          "additionalProperties": false
        },
        "bundleLookups": {
          "description": "BundleLookups is the set of in-progress requests to pull and unpackage bundle content to the cluster.",
          "type": "array",
          "items": {
            "description": "BundleLookup is a request to pull and unpackage the content of a bundle to the cluster.",
            "type": "object",
            "required": [
              "catalogSourceRef",
              "identifier",
              "path",
              "replaces"
            ],
            "properties": {
              "catalogSourceRef": {
                "description": "CatalogSourceRef is a reference to the CatalogSource the bundle path was resolved from.",
                "type": "object",
                "properties": {
                  "apiVersion": {
                    "description": "API version of the referent.",
                    "type": "string"
                  },
                  "fieldPath": {
                    "description": "If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: \"spec.containers{name}\" (where \"name\" refers to the name of the container that triggered the event) or if no container name is specified \"spec.containers[2]\" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.",
                    "type": "string"
                  },
                  "kind": {
                    "description": "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
                    "type": "string"
                  },
                  "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"
                  },
                  "resourceVersion": {
                    "description": "Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency",
                    "type": "string"
                  },
                  "uid": {
                    "description": "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids",
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "conditions": {
                "description": "Conditions represents the overall state of a BundleLookup.",
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "status",
                    "type"
                  ],
                  "properties": {
                    "lastTransitionTime": {
                      "description": "Last time the condition transitioned from one status to another.",
                      "type": "string",
                      "format": "date-time"
                    },
                    "lastUpdateTime": {
                      "description": "Last time the condition was probed.",
                      "type": "string",
                      "format": "date-time"
                    },
                    "message": {
                      "description": "A human readable message indicating details about the transition.",
                      "type": "string"
                    },
                    "reason": {
                      "description": "The reason for the condition's last transition.",
                      "type": "string"
                    },
                    "status": {
                      "description": "Status of the condition, one of True, False, Unknown.",
                      "type": "string"
                    },
                    "type": {
                      "description": "Type of condition.",
                      "type": "string"
                    }
                  },
                  "additionalProperties": false
                }
              },
              "identifier": {
                "description": "Identifier is the catalog-unique name of the operator (the name of the CSV for bundles that contain CSVs)",
                "type": "string"
              },
              "path": {
                "description": "Path refers to the location of a bundle to pull. It's typically an image reference.",
                "type": "string"
              },
              "properties": {
                "description": "The effective properties of the unpacked bundle.",
                "type": "string"
              },
              "replaces": {
                "description": "Replaces is the name of the bundle to replace with the one found at Path.",
                "type": "string"
              },
              "additionalProperties": false
            },
            "additionalProperties": false
          }
        },
        "catalogSources": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "conditions": {
          "type": "array",
          "items": {
            "description": "InstallPlanCondition represents the overall status of the execution of an InstallPlan.",
            "type": "object",
            "properties": {
              "lastTransitionTime": {
                "type": "string",
                "format": "date-time"
              },
              "lastUpdateTime": {
                "type": "string",
                "format": "date-time"
              },
              "message": {
                "type": "string"
              },
              "reason": {
                "description": "ConditionReason is a camelcased reason for the state transition.",
                "type": "string"
              },
              "status": {
                "type": "string"
              },
              "type": {
                "description": "InstallPlanConditionType describes the state of an InstallPlan at a certain point as a whole.",
                "type": "string"
              }
            },
            "additionalProperties": false
          }
        },
        "message": {
          "description": "Message is a human-readable message containing detailed information that may be important to understanding why the plan has its current status.",
          "type": "string"
        },
        "phase": {
          "description": "InstallPlanPhase is the current status of a InstallPlan as a whole.",
          "type": "string"
        },
        "plan": {
          "type": "array",
          "items": {
            "description": "Step represents the status of an individual step in an InstallPlan.",
            "type": "object",
            "required": [
              "resolving",
              "resource",
              "status"
            ],
            "properties": {
              "optional": {
                "type": "boolean"
              },
              "resolving": {
                "type": "string"
              },
              "resource": {
                "description": "StepResource represents the status of a resource to be tracked by an InstallPlan.",
                "type": "object",
                "required": [
                  "group",
                  "kind",
                  "name",
                  "sourceName",
                  "sourceNamespace",
                  "version"
                ],
                "properties": {
                  "group": {
                    "type": "string"
                  },
                  "kind": {
                    "type": "string"
                  },
                  "manifest": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  },
                  "sourceName": {
                    "type": "string"
                  },
                  "sourceNamespace": {
                    "type": "string"
                  },
                  "version": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "status": {
                "description": "StepStatus is the current status of a particular resource an in InstallPlan",
                "type": "string"
              }
            },
            "additionalProperties": false
          }
        },
        "startTime": {
          "description": "StartTime is the time when the controller began applying the resources listed in the plan to the cluster.",
          "type": "string",
          "format": "date-time"
        }
      },
      "additionalProperties": false
    }
  }
}
