{
  "apiVersion": "apiextensions.k8s.io/v1",
  "kind": "CustomResourceDefinition",
  "metadata": {
    "name": "restores.cloud.pingcap.com",
    "labels": {}
  },
  "spec": {
    "conversion": {
      "strategy": "None"
    },
    "group": "cloud.pingcap.com",
    "names": {
      "categories": [
        "infra-api"
      ],
      "kind": "Restore",
      "listKind": "RestoreList",
      "plural": "restores",
      "singular": "restore"
    },
    "scope": "Namespaced",
    "versions": [
      {
        "additionalPrinterColumns": [
          {
            "jsonPath": ".spec.clusterName",
            "name": "Cluster",
            "type": "string"
          },
          {
            "jsonPath": ".spec.from.backup",
            "name": "From",
            "type": "string"
          },
          {
            "jsonPath": ".status.phase",
            "name": "PHASE",
            "type": "string"
          },
          {
            "jsonPath": ".metadata.creationTimestamp",
            "name": "AGE",
            "type": "date"
          }
        ],
        "name": "v1",
        "schema": {
          "openAPIV3Schema": {
            "description": "Restore is the Schema for the restores API",
            "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": "RestoreSpec defines the desired state of Restore",
                "properties": {
                  "clusterName": {
                    "description": "ClusterName specifies the name of the target cluster where data is restored to,\nthe cluster must exist in the same namespace with Restore",
                    "type": "string"
                  },
                  "compactBackupName": {
                    "description": "CompactBackupName is the name of the sibling cloudv1.CompactBackup CR used\nfor compaction-accelerated PiTR restore. When set, the restore-controller\npopulates ReplicationConfig.CompactBackupName on the operator Restore CR.\n\nFor PiTR restore only.",
                    "type": "string"
                  },
                  "configuration": {
                    "description": "Configuration is the configuration passed from dataflow\nit is used to replace gitops",
                    "properties": {
                      "baseImage": {
                        "description": "BaseImage of the component",
                        "type": "string"
                      },
                      "config": {
                        "description": "Config is the default configuration of component",
                        "type": "string"
                      },
                      "tag": {
                        "description": "Tag is component image tag",
                        "type": "string"
                      },
                      "tikvImage": {
                        "description": "TiKVImage is the custom TiKV image",
                        "type": "string"
                      },
                      "tikvVersion": {
                        "description": "TiKVVersion is the custom TiKV version",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "env": {
                    "description": "Env adds environment variables to restore pod",
                    "items": {
                      "description": "EnvVar represents an environment variable present in a Container.",
                      "properties": {
                        "name": {
                          "description": "Name of the environment variable. Must be a C_IDENTIFIER.",
                          "type": "string"
                        },
                        "value": {
                          "description": "Variable references $(VAR_NAME) are expanded\nusing the previously defined environment variables in the container and\nany service environment variables. If a variable cannot be resolved,\nthe reference in the input string will be unchanged. Double $$ are reduced\nto a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n\"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\nEscaped references will never be expanded, regardless of whether the variable\nexists or not.\nDefaults to \"\".",
                          "type": "string"
                        },
                        "valueFrom": {
                          "description": "Source for the environment variable's value. Cannot be used if value is not empty.",
                          "properties": {
                            "configMapKeyRef": {
                              "description": "Selects a key of a ConfigMap.",
                              "properties": {
                                "key": {
                                  "description": "The key to select.",
                                  "type": "string"
                                },
                                "name": {
                                  "default": "",
                                  "description": "Name of the referent.\nThis field is effectively required, but due to backwards compatibility is\nallowed to be empty. Instances of this type with an empty value here are\nalmost certainly wrong.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
                                  "type": "string"
                                },
                                "optional": {
                                  "description": "Specify whether the ConfigMap or its key must be defined",
                                  "type": "boolean"
                                }
                              },
                              "required": [
                                "key"
                              ],
                              "type": "object",
                              "x-kubernetes-map-type": "atomic"
                            },
                            "fieldRef": {
                              "description": "Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\nspec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.",
                              "properties": {
                                "apiVersion": {
                                  "description": "Version of the schema the FieldPath is written in terms of, defaults to \"v1\".",
                                  "type": "string"
                                },
                                "fieldPath": {
                                  "description": "Path of the field to select in the specified API version.",
                                  "type": "string"
                                }
                              },
                              "required": [
                                "fieldPath"
                              ],
                              "type": "object",
                              "x-kubernetes-map-type": "atomic"
                            },
                            "resourceFieldRef": {
                              "description": "Selects a resource of the container: only resources limits and requests\n(limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.",
                              "properties": {
                                "containerName": {
                                  "description": "Container name: required for volumes, optional for env vars",
                                  "type": "string"
                                },
                                "divisor": {
                                  "anyOf": [
                                    {
                                      "type": "integer"
                                    },
                                    {
                                      "type": "string"
                                    }
                                  ],
                                  "description": "Specifies the output format of the exposed resources, defaults to \"1\"",
                                  "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
                                  "x-kubernetes-int-or-string": true
                                },
                                "resource": {
                                  "description": "Required: resource to select",
                                  "type": "string"
                                }
                              },
                              "required": [
                                "resource"
                              ],
                              "type": "object",
                              "x-kubernetes-map-type": "atomic"
                            },
                            "secretKeyRef": {
                              "description": "Selects a key of a secret in the pod's namespace",
                              "properties": {
                                "key": {
                                  "description": "The key of the secret to select from.  Must be a valid secret key.",
                                  "type": "string"
                                },
                                "name": {
                                  "default": "",
                                  "description": "Name of the referent.\nThis field is effectively required, but due to backwards compatibility is\nallowed to be empty. Instances of this type with an empty value here are\nalmost certainly wrong.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
                                  "type": "string"
                                },
                                "optional": {
                                  "description": "Specify whether the Secret or its key must be defined",
                                  "type": "boolean"
                                }
                              },
                              "required": [
                                "key"
                              ],
                              "type": "object",
                              "x-kubernetes-map-type": "atomic"
                            }
                          },
                          "type": "object"
                        }
                      },
                      "required": [
                        "name"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  },
                  "from": {
                    "description": "From specified where the backup data locates",
                    "properties": {
                      "PiTRRestoredTS": {
                        "description": "PiTRRestoredTS is the PiTR restored ts.\nit is used when LogBackup is specified",
                        "type": "string"
                      },
                      "backup": {
                        "description": "Backup is the name of the target Backup object, if this field is specified,\nthe backup data will be retrieved from the Backup job.\nThe Backup must exist in the same namespace if specified.",
                        "type": "string"
                      },
                      "bucket": {
                        "description": "(Deprecated) RestoreBucketInfo is the bucket info of the backup data\nit is used in the case that the restore with workflow\nPlease use Region, SnapshotBackupStorage and LogBackupStorage fields instead",
                        "properties": {
                          "backupPrefix": {
                            "description": "BackupPrefix is the prefix of the backup file.",
                            "type": "string"
                          },
                          "cloudProvider": {
                            "description": "CloudProvider is the cloud provider of the bucket",
                            "type": "string"
                          },
                          "logBackupPrefix": {
                            "description": "LogBackupPrefix is the prefix of the log backup file.",
                            "type": "string"
                          },
                          "name": {
                            "description": "Name is the name of the bucket",
                            "type": "string"
                          },
                          "region": {
                            "description": "Region is the region of the bucket",
                            "type": "string"
                          }
                        },
                        "type": "object"
                      },
                      "logBackup": {
                        "description": "LogBackup represents to execute PiTR\nit is the name of Backup object with Log mode\nits usage is same as Backup field",
                        "type": "string"
                      },
                      "logBackupStorage": {
                        "description": "LogBackupStorage is the log backup bucket storage",
                        "type": "string"
                      },
                      "region": {
                        "description": "Region is the region of the backup bucket",
                        "type": "string"
                      },
                      "snapshotBackupStorage": {
                        "description": "SnapshotBackupStorage is the snapshot backup bucket storage",
                        "type": "string"
                      }
                    },
                    "required": [
                      "backup"
                    ],
                    "type": "object"
                  },
                  "instanceType": {
                    "description": "InstanceType specifies the instance type required by restore pod",
                    "type": "string"
                  },
                  "nodeRole": {
                    "description": "NodeRole is the aws role or gcp service account that the br node uses",
                    "type": "string"
                  },
                  "options": {
                    "description": "Options is the parameters list of br, like --filters=xxx",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "paused": {
                    "description": "Paused specifies whether to pause the reconciliation loop for Restore CR",
                    "type": "boolean"
                  },
                  "resourceRequirements": {
                    "description": "ResourceRequirements manage resources(cpu,memory) of restore pod",
                    "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"
                        },
                        "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"
                  }
                },
                "required": [
                  "clusterName",
                  "from"
                ],
                "type": "object"
              },
              "status": {
                "description": "RestoreStatus defines the observed state of Restore",
                "properties": {
                  "phase": {
                    "description": "Phase denotes the current restore progress",
                    "type": "string"
                  },
                  "progresses": {
                    "items": {
                      "properties": {
                        "lastTransitionTime": {
                          "description": "LastTransitionTime is the update time",
                          "format": "date-time",
                          "nullable": true,
                          "type": "string"
                        },
                        "progress": {
                          "description": "Progress is the restore progress percentage value",
                          "format": "int32",
                          "type": "integer"
                        },
                        "step": {
                          "description": "Step is the step name of progress",
                          "type": "string"
                        }
                      },
                      "type": "object"
                    },
                    "type": "array"
                  }
                },
                "required": [
                  "phase"
                ],
                "type": "object"
              }
            },
            "type": "object"
          }
        },
        "served": true,
        "storage": true,
        "subresources": {
          "status": {}
        }
      }
    ]
  }
}
