{
  "description": "SnapshotGroup is the Schema for the snapshotgroups 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",
        "null"
      ]
    },
    "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",
        "null"
      ]
    },
    "metadata": {
      "type": [
        "object",
        "null"
      ]
    },
    "spec": {
      "additionalProperties": false,
      "description": "SnapshotGroupSpec defines the desired state of the Longhorn SnapshotGroup.\nThe whole spec is immutable after creation: a group is a point-in-time\nrequest, so changing members later has no meaning.",
      "properties": {
        "deadlineSeconds": {
          "default": 300,
          "description": "DeadlineSeconds is the deadline for taking every member snapshot,\nmeasured from the group's metadata.creationTimestamp. When the field is\nomitted, the CRD default applies. Go clients cannot omit the field: an\nunset field arrives as 0, and the mutating webhook replaces the 0 with\nthe default.",
          "format": "int64",
          "maximum": 3600,
          "minimum": 10,
          "type": [
            "integer",
            "null"
          ]
        },
        "labels": {
          "additionalProperties": {
            "type": "string"
          },
          "description": "Labels are engine snapshot labels applied to every member (Snapshot\nspec.labels). They are not visible to Kubernetes label selectors.\nReserved recurring-job label keys are rejected at admission.",
          "nullable": true,
          "type": [
            "object",
            "null"
          ]
        },
        "members": {
          "description": "Members is the fixed member set, resolved from Volumes or VolumeSelector\nand stamped by the mutating webhook at admission. It may not be set by\nthe user.",
          "items": {
            "additionalProperties": false,
            "description": "SnapshotGroupMember identifies one member of the group: the volume and the\nname of its member Snapshot CR, generated at admission.",
            "properties": {
              "snapshotName": {
                "type": "string"
              },
              "volumeName": {
                "type": "string"
              }
            },
            "required": [
              "snapshotName",
              "volumeName"
            ],
            "type": "object"
          },
          "nullable": true,
          "type": [
            "array",
            "null"
          ]
        },
        "volumeSelector": {
          "additionalProperties": false,
          "description": "VolumeSelector selects the member volumes by their labels. Exactly one of\nVolumes or VolumeSelector may be set at creation.",
          "properties": {
            "matchExpressions": {
              "description": "matchExpressions is a list of label selector requirements. The requirements are ANDed.",
              "items": {
                "additionalProperties": false,
                "description": "A label selector requirement is a selector that contains values, a key, and an operator that\nrelates the key and values.",
                "properties": {
                  "key": {
                    "description": "key is the label key that the selector applies to.",
                    "type": "string"
                  },
                  "operator": {
                    "description": "operator represents a key's relationship to a set of values.\nValid operators are In, NotIn, Exists and DoesNotExist.",
                    "type": "string"
                  },
                  "values": {
                    "description": "values is an array of string values. If the operator is In or NotIn,\nthe values array must be non-empty. If the operator is Exists or DoesNotExist,\nthe values array must be empty. This array is replaced during a strategic\nmerge patch.",
                    "items": {
                      "type": "string"
                    },
                    "type": [
                      "array",
                      "null"
                    ],
                    "x-kubernetes-list-type": "atomic"
                  }
                },
                "required": [
                  "key",
                  "operator"
                ],
                "type": "object"
              },
              "type": [
                "array",
                "null"
              ],
              "x-kubernetes-list-type": "atomic"
            },
            "matchLabels": {
              "additionalProperties": {
                "type": "string"
              },
              "description": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\nmap is equivalent to an element of matchExpressions, whose key field is \"key\", the\noperator is \"In\", and the values array contains only \"value\". The requirements are ANDed.",
              "type": [
                "object",
                "null"
              ]
            }
          },
          "type": [
            "object",
            "null"
          ],
          "x-kubernetes-map-type": "atomic"
        },
        "volumes": {
          "description": "Volumes explicitly lists the member volumes. Exactly one of Volumes or\nVolumeSelector may be set at creation; the mutating webhook resolves the\nselection into Members at admission.",
          "items": {
            "type": "string"
          },
          "nullable": true,
          "type": [
            "array",
            "null"
          ]
        }
      },
      "type": [
        "object",
        "null"
      ]
    },
    "status": {
      "additionalProperties": false,
      "description": "SnapshotGroupStatus defines the observed state of the Longhorn SnapshotGroup",
      "properties": {
        "conditions": {
          "description": "Conditions holds the latest observations of the SnapshotGroup's state,\nsuch as Degraded.",
          "items": {
            "additionalProperties": false,
            "properties": {
              "lastProbeTime": {
                "description": "Last time we probed the condition.",
                "type": [
                  "string",
                  "null"
                ]
              },
              "lastTransitionTime": {
                "description": "Last time the condition transitioned from one status to another.",
                "type": [
                  "string",
                  "null"
                ]
              },
              "message": {
                "description": "Human-readable message indicating details about last transition.",
                "type": [
                  "string",
                  "null"
                ]
              },
              "reason": {
                "description": "Unique, one-word, CamelCase reason for the condition's last transition.",
                "type": [
                  "string",
                  "null"
                ]
              },
              "status": {
                "description": "Status is the status of the condition.\nCan be True, False, Unknown.",
                "type": [
                  "string",
                  "null"
                ]
              },
              "type": {
                "description": "Type is the type of the condition.",
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "type": "object"
          },
          "nullable": true,
          "type": [
            "array",
            "null"
          ]
        },
        "creationTime": {
          "description": "CreationTime is the latest member creation time, set when the group\nbecomes Ready.",
          "type": [
            "string",
            "null"
          ]
        },
        "error": {
          "description": "Error is set when the group fails (deadline, name collision).",
          "type": [
            "string",
            "null"
          ]
        },
        "members": {
          "description": "Members is the observed state of every member, one entry per spec\nmember. It is the primary debugging signal: each entry carries the\nmember's last error and creation time.",
          "items": {
            "additionalProperties": false,
            "description": "SnapshotGroupMemberStatus is the observed state of one member, mirrored from\nits Snapshot CR.",
            "properties": {
              "creationTime": {
                "description": "CreationTime is the engine snapshot creation time, mirrored from the\nmember Snapshot. It is kept when the member is later lost.",
                "type": [
                  "string",
                  "null"
                ]
              },
              "error": {
                "description": "Error is the last member error. A member Snapshot CR that disappeared\nafter the group became Ready is recorded with the synthetic error\n\"member snapshot deleted\"; an unusable member keeps its own mirrored\nerror.",
                "type": [
                  "string",
                  "null"
                ]
              },
              "readyToUse": {
                "description": "ReadyToUse mirrors the member Snapshot while the group is InProgress.\nAfter the group is Ready, a member later deleted or unusable is recorded\nhere as false: member entries always tell the per-member truth.",
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "snapshotName": {
                "type": "string"
              },
              "volumeName": {
                "type": "string"
              }
            },
            "required": [
              "snapshotName",
              "volumeName"
            ],
            "type": "object"
          },
          "nullable": true,
          "type": [
            "array",
            "null"
          ]
        },
        "ownerID": {
          "description": "OwnerID is the ID of the node that owns this SnapshotGroup.",
          "type": [
            "string",
            "null"
          ]
        },
        "phase": {
          "description": "Phase is the lifecycle phase: empty until the first reconcile, then\nInProgress -\u003e Ready | Failed.",
          "enum": [
            "InProgress",
            "Ready",
            "Failed",
            ""
          ],
          "type": [
            "string",
            "null"
          ]
        },
        "readyToUse": {
          "description": "ReadyToUse is true when the group is Ready and every member snapshot\nis still individually ready: group readiness is the AND of member\nreadiness, following the Kubernetes VolumeGroupSnapshot convention. It\ndrops to false when a member is lost or unusable after Ready and\nrecovers once every member is whole again; the Degraded condition\ncarries the per-member detail. A failed, partial, or empty group is\nnever reported ready.",
          "type": [
            "boolean",
            "null"
          ]
        }
      },
      "type": [
        "object",
        "null"
      ]
    }
  },
  "type": "object"
}