{
  "apiVersion": "apiextensions.k8s.io/v1",
  "kind": "CustomResourceDefinition",
  "metadata": {
    "name": "backups.cloud.pingcap.com",
    "labels": {}
  },
  "spec": {
    "conversion": {
      "strategy": "None"
    },
    "group": "cloud.pingcap.com",
    "names": {
      "categories": [
        "infra-api"
      ],
      "kind": "Backup",
      "listKind": "BackupList",
      "plural": "backups",
      "singular": "backup"
    },
    "scope": "Namespaced",
    "versions": [
      {
        "additionalPrinterColumns": [
          {
            "jsonPath": ".spec.clusterName",
            "name": "Cluster",
            "type": "string"
          },
          {
            "jsonPath": ".status.phase",
            "name": "PHASE",
            "type": "string"
          },
          {
            "jsonPath": ".metadata.creationTimestamp",
            "name": "AGE",
            "type": "date"
          }
        ],
        "name": "v1",
        "schema": {
          "openAPIV3Schema": {
            "description": "Backup is the Schema for the backups 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": "BackupSpec defines the desired state of Backup",
                "properties": {
                  "accountRef": {
                    "description": "Attach the account ref into the backup when it is created\nNow we use the account same with the network",
                    "properties": {
                      "name": {
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "clean_policy": {
                    "description": "CleanPolicy indicates how to clean backup",
                    "type": "string"
                  },
                  "clusterName": {
                    "description": "ClusterName is the target cluster name, target cluster must exist in the same namespace as backup",
                    "type": "string"
                  },
                  "commitTS": {
                    "description": "CommitTs is the commit ts of the backup, snapshot ts for snapshot backup or start ts for log backup.\nFormat supports TSO or datetime, e.g. '400036290571534337', '2018-05-11 01:42:23'.\nDefault is current timestamp.",
                    "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 backup 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"
                  },
                  "instanceType": {
                    "description": "InstanceType specifies the instance type required by backup pod",
                    "type": "string"
                  },
                  "logStop": {
                    "description": "LogStop indicates that will stop the log backup.",
                    "type": "boolean"
                  },
                  "logTruncateUntil": {
                    "description": "LogTruncateUntil is log backup truncate until timestamp.\nFormat supports TSO or datetime, e.g. '400036290571534337', '2018-05-11 01:42:23'.",
                    "type": "string"
                  },
                  "mode": {
                    "description": "Mode is the backup mode, such as snapshot backup or log backup.",
                    "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 --backupts=xxx",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "paused": {
                    "description": "Paused specifies whether to pause the reconciliation loop for Backup CR",
                    "type": "boolean"
                  },
                  "resourceRequirements": {
                    "description": "ResourceRequirements manage resources(cpu,memory) of backup 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"
                  },
                  "storage": {
                    "description": "Storage is the target storage address, use s3 uri. like gs://xxxx",
                    "type": "string"
                  },
                  "tableFilter": {
                    "description": "TableFilter means table filter expression for 'db.table' matching.",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  }
                },
                "required": [
                  "clusterName"
                ],
                "type": "object"
              },
              "status": {
                "description": "BackupStatus defines the observed state of Backup",
                "properties": {
                  "backupPath": {
                    "description": "BackupPath is the location of the backup.",
                    "type": "string"
                  },
                  "backupSize": {
                    "description": "BackupSize is the physical storage size taken by the backup assets",
                    "format": "int64",
                    "type": "integer"
                  },
                  "backupTS": {
                    "description": "BackupTS is the snapshot timestamp for snapshot backup or start timestamp for log backup",
                    "type": "string"
                  },
                  "bucketName": {
                    "description": "BucketName is the object store path of this backup",
                    "type": "string"
                  },
                  "fromProvider": {
                    "description": "FromProvider encodes the provider specific status of\nthe backup, e.g. target shoot name of the backup",
                    "nullable": true,
                    "type": "object",
                    "x-kubernetes-embedded-resource": true,
                    "x-kubernetes-preserve-unknown-fields": true
                  },
                  "logCheckpointTs": {
                    "description": "LogCheckpointTs is the ts of log backup process",
                    "type": "string"
                  },
                  "logSubCommandStatuses": {
                    "additionalProperties": {
                      "description": "LogSubCommandStatus is the log backup subcommand's status.",
                      "properties": {
                        "command": {
                          "description": "Command is the log backup subcommand.",
                          "type": "string"
                        },
                        "conditions": {
                          "items": {
                            "description": "BackupCondition describes the observed state of a Backup at a certain point.",
                            "properties": {
                              "command": {
                                "type": "string"
                              },
                              "lastTransitionTime": {
                                "format": "date-time",
                                "nullable": true,
                                "type": "string"
                              },
                              "message": {
                                "type": "string"
                              },
                              "reason": {
                                "type": "string"
                              },
                              "status": {
                                "type": "string"
                              },
                              "type": {
                                "description": "BackupConditionType represents a valid condition of a Backup.",
                                "type": "string"
                              }
                            },
                            "required": [
                              "status",
                              "type"
                            ],
                            "type": "object"
                          },
                          "nullable": true,
                          "type": "array"
                        },
                        "logTruncatingUntil": {
                          "description": "LogTruncatingUntil is log backup truncate until timestamp which is used to mark the truncate command.",
                          "type": "string"
                        },
                        "phase": {
                          "description": "Phase is the command current phase.",
                          "type": "string"
                        },
                        "timeCompleted": {
                          "description": "TimeCompleted is the time at which the command was completed.",
                          "format": "date-time",
                          "nullable": true,
                          "type": "string"
                        },
                        "timeStarted": {
                          "description": "TimeStarted is the time at which the command was started.",
                          "format": "date-time",
                          "nullable": true,
                          "type": "string"
                        }
                      },
                      "type": "object"
                    },
                    "description": "LogSubCommandStatuses is the detail status of log backup subcommands, record each command separately, but only record the last command.",
                    "type": "object"
                  },
                  "logTruncateUntil": {
                    "description": "LogTruncateUntil is log backup truncate until timestamp which will be the same as Spec.LogTruncateUntil when truncate is complete",
                    "type": "string"
                  },
                  "phase": {
                    "description": "Phase denotes current backup progress",
                    "type": "string"
                  }
                },
                "required": [
                  "phase"
                ],
                "type": "object"
              }
            },
            "required": [
              "spec"
            ],
            "type": "object"
          }
        },
        "served": true,
        "storage": true,
        "subresources": {
          "status": {}
        }
      }
    ]
  }
}
