{
  "description": "Klusterlet represents controllers to install the resources for a managed cluster.\nWhen configured, the Klusterlet requires a secret named bootstrap-hub-kubeconfig in the\nagent namespace to allow API requests to the hub for the registration protocol.\nIn Hosted mode, the Klusterlet requires an additional secret named external-managed-kubeconfig\nin the agent namespace to allow API requests to the managed cluster for resources installation.",
  "properties": {
    "apiVersion": {
      "description": "APIVersion defines the versioned schema of this representation of an object.\nServers should convert recognized schemas to the latest internal value, and\nmay reject unrecognized values.\nMore 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.\nServers may infer this from the endpoint the client submits requests to.\nCannot be updated.\nIn CamelCase.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
      "type": "string"
    },
    "metadata": {
      "type": "object"
    },
    "spec": {
      "description": "Spec represents the desired deployment configuration of Klusterlet agent.",
      "properties": {
        "clusterName": {
          "description": "ClusterName is the name of the managed cluster to be created on hub.\nThe Klusterlet agent generates a random name if it is not set, or discovers the appropriate cluster name on OpenShift.",
          "maxLength": 63,
          "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$",
          "type": "string"
        },
        "deployOption": {
          "description": "DeployOption contains the options of deploying a klusterlet",
          "properties": {
            "mode": {
              "description": "Mode can be Default, Hosted, Singleton or SingletonHosted. It is Default mode if not specified\nIn Default mode, all klusterlet related resources are deployed on the managed cluster.\nIn Hosted mode, only crd and configurations are installed on the spoke/managed cluster. Controllers run in another\ncluster (defined as management-cluster) and connect to the mangaged cluster with the kubeconfig in secret of\n\"external-managed-kubeconfig\"(a kubeconfig of managed-cluster with cluster-admin permission).\nIn Singleton mode, registration/work agent is started as a single deployment.\nIn SingletonHosted mode, agent is started as a single deployment in hosted mode.\nNote: Do not modify the Mode field once it's applied.",
              "type": "string"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "externalServerURLs": {
          "description": "ExternalServerURLs represents a list of apiserver urls and ca bundles that is accessible externally\nIf it is set empty, managed cluster has no externally accessible url that hub cluster can visit.",
          "items": {
            "description": "ServerURL represents the apiserver url and ca bundle that is accessible externally",
            "properties": {
              "caBundle": {
                "description": "CABundle is the ca bundle to connect to apiserver of the managed cluster.\nSystem certs are used if it is not set.",
                "format": "byte",
                "type": "string"
              },
              "url": {
                "description": "URL is the url of apiserver endpoint of the managed cluster.",
                "type": "string"
              }
            },
            "required": [
              "url"
            ],
            "type": "object",
            "additionalProperties": false
          },
          "type": "array"
        },
        "hubApiServerHostAlias": {
          "description": "HubApiServerHostAlias contains the host alias for hub api server.\nregistration-agent and work-agent will use it to communicate with hub api server.",
          "properties": {
            "hostname": {
              "description": "Hostname for the above IP address.",
              "pattern": "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$",
              "type": "string"
            },
            "ip": {
              "description": "IP address of the host file entry.",
              "pattern": "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$",
              "type": "string"
            }
          },
          "required": [
            "hostname",
            "ip"
          ],
          "type": "object",
          "additionalProperties": false
        },
        "imagePullSpec": {
          "description": "ImagePullSpec represents the desired image configuration of agent, it takes effect only when\nsingleton mode is set. quay.io/open-cluster-management.io/registration-operator:latest will\nbe used if unspecified",
          "type": "string"
        },
        "namespace": {
          "description": "Namespace is the namespace to deploy the agent on the managed cluster.\nThe namespace must have a prefix of \"open-cluster-management-\", and if it is not set,\nthe namespace of \"open-cluster-management-agent\" is used to deploy agent.\nIn addition, the add-ons are deployed to the namespace of \"{Namespace}-addon\".\nIn the Hosted mode, this namespace still exists on the managed cluster to contain\nnecessary resources, like service accounts, roles and rolebindings, while the agent\nis deployed to the namespace with the same name as klusterlet on the management cluster.",
          "maxLength": 57,
          "pattern": "^open-cluster-management-[-a-z0-9]*[a-z0-9]$",
          "type": "string"
        },
        "nodePlacement": {
          "description": "NodePlacement enables explicit control over the scheduling of the deployed pods.",
          "properties": {
            "nodeSelector": {
              "additionalProperties": {
                "type": "string"
              },
              "description": "NodeSelector defines which Nodes the Pods are scheduled on. The default is an empty list.",
              "type": "object"
            },
            "tolerations": {
              "description": "Tolerations are attached by pods to tolerate any taint that matches\nthe triple <key,value,effect> using the matching operator <operator>.\nThe default is an empty list.",
              "items": {
                "description": "The pod this Toleration is attached to tolerates any taint that matches\nthe triple <key,value,effect> using the matching operator <operator>.",
                "properties": {
                  "effect": {
                    "description": "Effect indicates the taint effect to match. Empty means match all taint effects.\nWhen specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.",
                    "type": "string"
                  },
                  "key": {
                    "description": "Key is the taint key that the toleration applies to. Empty means match all taint keys.\nIf the key is empty, operator must be Exists; this combination means to match all values and all keys.",
                    "type": "string"
                  },
                  "operator": {
                    "description": "Operator represents a key's relationship to the value.\nValid operators are Exists and Equal. Defaults to Equal.\nExists is equivalent to wildcard for value, so that a pod can\ntolerate all taints of a particular category.",
                    "type": "string"
                  },
                  "tolerationSeconds": {
                    "description": "TolerationSeconds represents the period of time the toleration (which must be\nof effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\nit is not set, which means tolerate the taint forever (do not evict). Zero and\nnegative values will be treated as 0 (evict immediately) by the system.",
                    "format": "int64",
                    "type": "integer"
                  },
                  "value": {
                    "description": "Value is the taint value the toleration matches to.\nIf the operator is Exists, the value should be empty, otherwise just a regular string.",
                    "type": "string"
                  }
                },
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "priorityClassName": {
          "description": "PriorityClassName is the name of the PriorityClass that will be used by the\ndeployed klusterlet agent. It will be ignored when the PriorityClass/v1 API\nis not available on the managed cluster.",
          "type": "string"
        },
        "registrationConfiguration": {
          "description": "RegistrationConfiguration contains the configuration of registration",
          "properties": {
            "bootstrapKubeConfigs": {
              "description": "BootstrapKubeConfigs defines the ordered list of bootstrap kubeconfigs. The order decides which bootstrap kubeconfig to use first when rebootstrap.\n\nWhen the agent loses the connection to the current hub over HubConnectionTimeoutSeconds, or the managedcluster CR\nis set `hubAcceptsClient=false` on the hub, the controller marks the related bootstrap kubeconfig as \"failed\".\n\nA failed bootstrapkubeconfig won't be used for the duration specified by SkipFailedBootstrapKubeConfigSeconds.\nBut if the user updates the content of a failed bootstrapkubeconfig, the \"failed\" mark will be cleared.",
              "properties": {
                "localSecretsConfig": {
                  "description": "LocalSecretsConfig include a list of secrets that contains the kubeconfigs for ordered bootstrap kubeconifigs.\nThe secrets must be in the same namespace where the agent controller runs.",
                  "properties": {
                    "hubConnectionTimeoutSeconds": {
                      "default": 600,
                      "description": "HubConnectionTimeoutSeconds is used to set the timeout of connecting to the hub cluster.\nWhen agent loses the connection to the hub over the timeout seconds, the agent do a rebootstrap.\nBy default is 10 mins.",
                      "format": "int32",
                      "minimum": 180,
                      "type": "integer"
                    },
                    "kubeConfigSecrets": {
                      "description": "KubeConfigSecrets is a list of secret names. The secrets are in the same namespace where the agent controller runs.",
                      "items": {
                        "properties": {
                          "name": {
                            "description": "Name is the name of the secret.",
                            "type": "string"
                          }
                        },
                        "required": [
                          "name"
                        ],
                        "type": "object",
                        "additionalProperties": false
                      },
                      "type": "array"
                    }
                  },
                  "required": [
                    "kubeConfigSecrets"
                  ],
                  "type": "object",
                  "additionalProperties": false
                },
                "type": {
                  "default": "None",
                  "description": "Type specifies the type of priority bootstrap kubeconfigs.\nBy default, it is set to None, representing no priority bootstrap kubeconfigs are set.",
                  "enum": [
                    "None",
                    "LocalSecrets"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "type"
              ],
              "type": "object",
              "additionalProperties": false
            },
            "clientCertExpirationSeconds": {
              "description": "clientCertExpirationSeconds represents the seconds of a client certificate to expire. If it is not set or 0, the default\nduration seconds will be set by the hub cluster. If the value is larger than the max signing duration seconds set on\nthe hub cluster, the max signing duration seconds will be set.",
              "format": "int32",
              "type": "integer"
            },
            "clusterAnnotations": {
              "additionalProperties": {
                "type": "string"
              },
              "description": "ClusterAnnotations is annotations with the reserve prefix \"agent.open-cluster-management.io\" set on\nManagedCluster when creating only, other actors can update it afterwards.",
              "type": "object"
            },
            "clusterClaimConfiguration": {
              "description": "ClusterClaimConfiguration represents the configuration of ClusterClaim\nEffective only when the `ClusterClaim` feature gate is enabled.",
              "properties": {
                "maxCustomClusterClaims": {
                  "default": 20,
                  "description": "Maximum number of custom ClusterClaims allowed.",
                  "format": "int32",
                  "type": "integer"
                },
                "reservedClusterClaimSuffixes": {
                  "description": "Custom suffixes for reserved ClusterClaims.",
                  "items": {
                    "maxLength": 64,
                    "minLength": 1,
                    "type": "string"
                  },
                  "maxItems": 10,
                  "type": "array"
                }
              },
              "required": [
                "maxCustomClusterClaims"
              ],
              "type": "object",
              "additionalProperties": false
            },
            "featureGates": {
              "description": "FeatureGates represents the list of feature gates for registration\nIf it is set empty, default feature gates will be used.\nIf it is set, featuregate/Foo is an example of one item in FeatureGates:\n  1. If featuregate/Foo does not exist, registration-operator will discard it\n  2. If featuregate/Foo exists and is false by default. It is now possible to set featuregate/Foo=[false|true]\n  3. If featuregate/Foo exists and is true by default. If a cluster-admin upgrading from 1 to 2 wants to continue having featuregate/Foo=false,\n \the can set featuregate/Foo=false before upgrading. Let's say the cluster-admin wants featuregate/Foo=false.",
              "items": {
                "properties": {
                  "feature": {
                    "description": "Feature is the key of feature gate. e.g. featuregate/Foo.",
                    "type": "string"
                  },
                  "mode": {
                    "default": "Disable",
                    "description": "Mode is either Enable, Disable, \"\" where \"\" is Disable by default.\nIn Enable mode, a valid feature gate `featuregate/Foo` will be set to \"--featuregate/Foo=true\".\nIn Disable mode, a valid feature gate `featuregate/Foo` will be set to \"--featuregate/Foo=false\".",
                    "enum": [
                      "Enable",
                      "Disable"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "feature"
                ],
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            },
            "kubeAPIBurst": {
              "default": 100,
              "description": "KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the spoke cluster.\nIf it is set empty, use the default value: 100",
              "format": "int32",
              "type": "integer"
            },
            "kubeAPIQPS": {
              "default": 50,
              "description": "KubeAPIQPS indicates the maximum QPS while talking with apiserver on the spoke cluster.\nIf it is set empty, use the default value: 50",
              "format": "int32",
              "type": "integer"
            },
            "registrationDriver": {
              "description": "This provides driver details required to register with hub",
              "properties": {
                "authType": {
                  "default": "csr",
                  "description": "Type of the authentication used by managedcluster to register as well as pull work from hub. Possible values are csr and awsirsa.",
                  "enum": [
                    "csr",
                    "awsirsa"
                  ],
                  "type": "string"
                },
                "awsIrsa": {
                  "description": "Contain the details required for registering with hub cluster (ie: an EKS cluster) using AWS IAM roles for service account.\nThis is required only when the authType is awsirsa.",
                  "properties": {
                    "hubClusterArn": {
                      "description": "The arn of the hub cluster (ie: an EKS cluster). This will be required to pass information to hub, which hub will use to create IAM identities for this klusterlet.\nExample - arn:eks:us-west-2:12345678910:cluster/hub-cluster1.",
                      "minLength": 1,
                      "pattern": "^arn:aws:eks:([a-zA-Z0-9-]+):(\\d{12}):cluster/([a-zA-Z0-9-]+)$",
                      "type": "string"
                    },
                    "managedClusterArn": {
                      "description": "The arn of the managed cluster (ie: an EKS cluster). This will be required to generate the md5hash which will be used as a suffix to create IAM role on hub\nas well as used by kluslerlet-agent, to assume role suffixed with the md5hash, on startup.\nExample - arn:eks:us-west-2:12345678910:cluster/managed-cluster1.",
                      "minLength": 1,
                      "pattern": "^arn:aws:eks:([a-zA-Z0-9-]+):(\\d{12}):cluster/([a-zA-Z0-9-]+)$",
                      "type": "string"
                    }
                  },
                  "required": [
                    "hubClusterArn",
                    "managedClusterArn"
                  ],
                  "type": "object",
                  "additionalProperties": false
                }
              },
              "required": [
                "authType"
              ],
              "type": "object",
              "additionalProperties": false
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "registrationImagePullSpec": {
          "description": "RegistrationImagePullSpec represents the desired image configuration of registration agent.\nquay.io/open-cluster-management.io/registration:latest will be used if unspecified.",
          "type": "string"
        },
        "resourceRequirement": {
          "description": "ResourceRequirement specify QoS classes of deployments managed by klusterlet.\nIt applies to all the containers in the deployments.",
          "properties": {
            "resourceRequirements": {
              "description": "ResourceRequirements defines resource requests and limits when Type is ResourceQosClassResourceRequirement",
              "properties": {
                "claims": {
                  "description": "Claims lists the names of resources, defined in spec.resourceClaims,\nthat are used by this container.\n\nThis is an alpha field and requires enabling the\nDynamicResourceAllocation feature gate.\n\nThis field is immutable. It can only be set for containers.",
                  "items": {
                    "description": "ResourceClaim references one entry in PodSpec.ResourceClaims.",
                    "properties": {
                      "name": {
                        "description": "Name must match the name of one entry in pod.spec.resourceClaims of\nthe Pod where this field is used. It makes that resource available\ninside a container.",
                        "type": "string"
                      },
                      "request": {
                        "description": "Request is the name chosen for a request in the referenced claim.\nIf empty, everything from the claim is made available, otherwise\nonly the result of this request.",
                        "type": "string"
                      }
                    },
                    "required": [
                      "name"
                    ],
                    "type": "object",
                    "additionalProperties": false
                  },
                  "type": "array",
                  "x-kubernetes-list-map-keys": [
                    "name"
                  ],
                  "x-kubernetes-list-type": "map"
                },
                "limits": {
                  "additionalProperties": {
                    "anyOf": [
                      {
                        "type": "integer"
                      },
                      {
                        "type": "string"
                      }
                    ],
                    "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
                    "x-kubernetes-int-or-string": true
                  },
                  "description": "Limits describes the maximum amount of compute resources allowed.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/",
                  "type": "object"
                },
                "requests": {
                  "additionalProperties": {
                    "anyOf": [
                      {
                        "type": "integer"
                      },
                      {
                        "type": "string"
                      }
                    ],
                    "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
                    "x-kubernetes-int-or-string": true
                  },
                  "description": "Requests describes the minimum amount of compute resources required.\nIf Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\notherwise to an implementation-defined value. Requests cannot exceed Limits.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/",
                  "type": "object"
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "type": {
              "default": "Default",
              "enum": [
                "Default",
                "BestEffort",
                "ResourceRequirement"
              ],
              "type": "string"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "workConfiguration": {
          "description": "WorkConfiguration contains the configuration of work",
          "properties": {
            "appliedManifestWorkEvictionGracePeriod": {
              "description": "AppliedManifestWorkEvictionGracePeriod is the eviction grace period the work agent will wait before\nevicting the AppliedManifestWorks, whose corresponding ManifestWorks are missing on the hub cluster, from\nthe managed cluster. If not present, the default value of the work agent will be used.",
              "pattern": "^([0-9]+(s|m|h))+$",
              "type": "string"
            },
            "featureGates": {
              "description": "FeatureGates represents the list of feature gates for work\nIf it is set empty, default feature gates will be used.\nIf it is set, featuregate/Foo is an example of one item in FeatureGates:\n  1. If featuregate/Foo does not exist, registration-operator will discard it\n  2. If featuregate/Foo exists and is false by default. It is now possible to set featuregate/Foo=[false|true]\n  3. If featuregate/Foo exists and is true by default. If a cluster-admin upgrading from 1 to 2 wants to continue having featuregate/Foo=false,\n \the can set featuregate/Foo=false before upgrading. Let's say the cluster-admin wants featuregate/Foo=false.",
              "items": {
                "properties": {
                  "feature": {
                    "description": "Feature is the key of feature gate. e.g. featuregate/Foo.",
                    "type": "string"
                  },
                  "mode": {
                    "default": "Disable",
                    "description": "Mode is either Enable, Disable, \"\" where \"\" is Disable by default.\nIn Enable mode, a valid feature gate `featuregate/Foo` will be set to \"--featuregate/Foo=true\".\nIn Disable mode, a valid feature gate `featuregate/Foo` will be set to \"--featuregate/Foo=false\".",
                    "enum": [
                      "Enable",
                      "Disable"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "feature"
                ],
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            },
            "hubKubeAPIBurst": {
              "default": 100,
              "description": "HubKubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the hub cluster.\nIf it is set empty, use the default value: 100",
              "format": "int32",
              "type": "integer"
            },
            "hubKubeAPIQPS": {
              "default": 50,
              "description": "HubKubeAPIQPS indicates the maximum QPS while talking with apiserver on the hub cluster.\nIf it is set empty, use the default value: 50",
              "format": "int32",
              "type": "integer"
            },
            "kubeAPIBurst": {
              "default": 100,
              "description": "KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the spoke cluster.\nIf it is set empty, use the default value: 100",
              "format": "int32",
              "type": "integer"
            },
            "kubeAPIQPS": {
              "default": 50,
              "description": "KubeAPIQPS indicates the maximum QPS while talking with apiserver on the spoke cluster.\nIf it is set empty, use the default value: 50",
              "format": "int32",
              "type": "integer"
            },
            "statusSyncInterval": {
              "description": "StatusSyncInterval is the interval for the work agent to check the status of ManifestWorks.\nLarger value means less frequent status sync and less api calls to the managed cluster, vice versa.\nThe value(x) should be: 5s <= x <= 1h.",
              "pattern": "^([0-9]+(s|m|h))+$",
              "type": "string"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "workImagePullSpec": {
          "description": "WorkImagePullSpec represents the desired image configuration of work agent.\nquay.io/open-cluster-management.io/work:latest will be used if unspecified.",
          "type": "string"
        }
      },
      "type": "object",
      "additionalProperties": false
    },
    "status": {
      "description": "Status represents the current status of Klusterlet agent.",
      "properties": {
        "conditions": {
          "description": "Conditions contain the different condition statuses for this Klusterlet.\nValid condition types are:\nApplied: Components have been applied in the managed cluster.\nAvailable: Components in the managed cluster are available and ready to serve.\nProgressing: Components in the managed cluster are in a transitioning state.\nDegraded: Components in the managed cluster do not match the desired configuration and only provide\ndegraded service.",
          "items": {
            "description": "Condition contains details for one aspect of the current state of this API Resource.",
            "properties": {
              "lastTransitionTime": {
                "description": "lastTransitionTime is the last time the condition transitioned from one status to another.\nThis should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.",
                "format": "date-time",
                "type": "string"
              },
              "message": {
                "description": "message is a human readable message indicating details about the transition.\nThis may be an empty string.",
                "maxLength": 32768,
                "type": "string"
              },
              "observedGeneration": {
                "description": "observedGeneration represents the .metadata.generation that the condition was set based upon.\nFor instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\nwith respect to the current state of the instance.",
                "format": "int64",
                "minimum": 0,
                "type": "integer"
              },
              "reason": {
                "description": "reason contains a programmatic identifier indicating the reason for the condition's last transition.\nProducers of specific condition types may define expected values and meanings for this field,\nand whether the values are considered a guaranteed API.\nThe value should be a CamelCase string.\nThis field may not be empty.",
                "maxLength": 1024,
                "minLength": 1,
                "pattern": "^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$",
                "type": "string"
              },
              "status": {
                "description": "status of the condition, one of True, False, Unknown.",
                "enum": [
                  "True",
                  "False",
                  "Unknown"
                ],
                "type": "string"
              },
              "type": {
                "description": "type of condition in CamelCase or in foo.example.com/CamelCase.",
                "maxLength": 316,
                "pattern": "^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$",
                "type": "string"
              }
            },
            "required": [
              "lastTransitionTime",
              "message",
              "reason",
              "status",
              "type"
            ],
            "type": "object",
            "additionalProperties": false
          },
          "type": "array"
        },
        "generations": {
          "description": "Generations are used to determine when an item needs to be reconciled or has changed in a way that needs a reaction.",
          "items": {
            "description": "GenerationStatus keeps track of the generation for a given resource so that decisions about forced updates can be made.\nThe definition matches the GenerationStatus defined in github.com/openshift/api/v1",
            "properties": {
              "group": {
                "description": "group is the group of the resource that you're tracking",
                "type": "string"
              },
              "lastGeneration": {
                "description": "lastGeneration is the last generation of the resource that controller applies",
                "format": "int64",
                "type": "integer"
              },
              "name": {
                "description": "name is the name of the resource that you're tracking",
                "type": "string"
              },
              "namespace": {
                "description": "namespace is where the resource that you're tracking is",
                "type": "string"
              },
              "resource": {
                "description": "resource is the resource type of the resource that you're tracking",
                "type": "string"
              },
              "version": {
                "description": "version is the version of the resource that you're tracking",
                "type": "string"
              }
            },
            "required": [
              "group",
              "lastGeneration",
              "name",
              "resource",
              "version"
            ],
            "type": "object",
            "additionalProperties": false
          },
          "type": "array"
        },
        "observedGeneration": {
          "description": "ObservedGeneration is the last generation change you've dealt with",
          "format": "int64",
          "type": "integer"
        },
        "relatedResources": {
          "description": "RelatedResources are used to track the resources that are related to this Klusterlet.",
          "items": {
            "description": "RelatedResourceMeta represents the resource that is managed by an operator",
            "properties": {
              "group": {
                "description": "group is the group of the resource that you're tracking",
                "type": "string"
              },
              "name": {
                "description": "name is the name of the resource that you're tracking",
                "type": "string"
              },
              "namespace": {
                "description": "namespace is where the thing you're tracking is",
                "type": "string"
              },
              "resource": {
                "description": "resource is the resource type of the resource that you're tracking",
                "type": "string"
              },
              "version": {
                "description": "version is the version of the thing you're tracking",
                "type": "string"
              }
            },
            "required": [
              "group",
              "name",
              "resource",
              "version"
            ],
            "type": "object",
            "additionalProperties": false
          },
          "type": "array"
        }
      },
      "type": "object",
      "additionalProperties": false
    }
  },
  "type": "object"
}
