{
  "description": "Tenant is the Schema for the tenants API",
  "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": "TenantSpec defines the desired state of Tenant",
      "properties": {
        "argocd": {
          "description": "ArgoCD defines configurations for the tenant",
          "properties": {
            "sourceRepos": {
              "description": "SourceRepos contains list of repository URLs which can be used for deployment",
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          "required": [
            "sourceRepos"
          ],
          "type": "object",
          "additionalProperties": false
        },
        "desc": {
          "description": "Desc can contains description about the tenant",
          "type": "string"
        },
        "editors": {
          "description": "Editors defines the list of editors",
          "properties": {
            "groups": {
              "description": "Groups defines the list of linked Openshift Groups",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "users": {
              "description": "Users defines the list of linked Openshift Users",
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "hibernation": {
          "description": "Hibernation contains the schedule during which the tenant will be sleeping",
          "properties": {
            "sleepSchedule": {
              "description": "SleepSchedule contains the schedule during which the resources within the tenant's namespaces will be put to sleep",
              "type": "string"
            },
            "wakeSchedule": {
              "description": "WakeSchedule contains the schedule during which the resources within the tenant's namespaces will be awoken",
              "type": "string"
            }
          },
          "required": [
            "sleepSchedule",
            "wakeSchedule"
          ],
          "type": "object",
          "additionalProperties": false
        },
        "namespaceAnnotations": {
          "description": "NamespaceAnnotations adds annotations across tenant namespaces and specific annotations across given namespaces",
          "properties": {
            "common": {
              "additionalProperties": {
                "type": "string"
              },
              "description": "Common consists of annotations applied across all tenant namespaces",
              "type": "object"
            },
            "specific": {
              "description": "Specific consists of annotations applied across given tenant namespaces",
              "items": {
                "properties": {
                  "annotations": {
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Annotations add annotations to the specified namespace",
                    "type": "object"
                  },
                  "namespaces": {
                    "description": "Namespace names on which annotations will be applied",
                    "items": {
                      "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?",
                      "type": "string"
                    },
                    "type": "array"
                  }
                },
                "required": [
                  "annotations",
                  "namespaces"
                ],
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "namespaceLabels": {
          "description": "NamespaceLabels adds labels across tenant namespaces and specific labels across given namespaces",
          "properties": {
            "common": {
              "additionalProperties": {
                "type": "string"
              },
              "description": "Common consists of labels applied across all tenant namespaces",
              "type": "object"
            },
            "specific": {
              "description": "Specific consists of labels applied across given tenant namespaces",
              "items": {
                "properties": {
                  "labels": {
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Labels to be added to the specified namespace",
                    "type": "object"
                  },
                  "namespaces": {
                    "description": "Namespaces names on which labels will be applied",
                    "items": {
                      "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?",
                      "type": "string"
                    },
                    "type": "array"
                  }
                },
                "required": [
                  "labels",
                  "namespaces"
                ],
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "namespaces": {
          "description": "Namespaces field create new namespaces which are mentioned in it",
          "items": {
            "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?",
            "type": "string"
          },
          "type": "array"
        },
        "owners": {
          "description": "Owners defines the list of admins",
          "properties": {
            "groups": {
              "description": "Groups defines the list of linked Openshift Groups",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "users": {
              "description": "Users defines the list of linked Openshift Users",
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "quota": {
          "description": "Quota field is used to link relevant Tenant Operator Quota CR",
          "type": "string"
        },
        "sandbox": {
          "default": false,
          "description": "Sandbox field is used to make sandbox environments for all mentioned users in tenant spec",
          "type": "boolean"
        },
        "templateInstances": {
          "description": "TemplateInstances are templates that will be added in matching namespaces",
          "items": {
            "description": "TenantTemplateInstance defines a template instance",
            "properties": {
              "metadata": {
                "description": "The metadata of the template instance to create",
                "type": "object"
              },
              "selector": {
                "description": "The labeSelector to filter namespaces that templates should be created by default in. If it is omitted, templates are created in all namespaces.",
                "properties": {
                  "matchExpressions": {
                    "description": "matchExpressions is a list of label selector requirements. The requirements are ANDed.",
                    "items": {
                      "description": "A label selector requirement is a selector that contains values, a key, and an operator that relates 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. Valid 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, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.",
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        }
                      },
                      "required": [
                        "key",
                        "operator"
                      ],
                      "type": "object",
                      "additionalProperties": false
                    },
                    "type": "array"
                  },
                  "matchLabels": {
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.",
                    "type": "object"
                  }
                },
                "type": "object",
                "additionalProperties": false
              },
              "spec": {
                "description": "The spec of the template instance",
                "properties": {
                  "parameters": {
                    "description": "Parameters hold the values of the defined parameters in the template",
                    "items": {
                      "properties": {
                        "name": {
                          "description": "Name is the name of the parameter to set",
                          "type": "string"
                        },
                        "value": {
                          "description": "Value is the value of the parameter to set",
                          "type": "string"
                        }
                      },
                      "type": "object",
                      "additionalProperties": false
                    },
                    "type": "array"
                  },
                  "sync": {
                    "description": "If true the template instance will keep the deployed resources in sync with the template.",
                    "type": "boolean"
                  },
                  "template": {
                    "description": "The template to instantiate. This is an immutable field",
                    "type": "string"
                  }
                },
                "required": [
                  "template"
                ],
                "type": "object",
                "additionalProperties": false
              }
            },
            "type": "object",
            "additionalProperties": false
          },
          "type": "array"
        },
        "viewers": {
          "description": "Viewers defines the list of viewers",
          "properties": {
            "groups": {
              "description": "Groups defines the list of linked Openshift Groups",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "users": {
              "description": "Users defines the list of linked Openshift Users",
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          "type": "object",
          "additionalProperties": false
        }
      },
      "required": [
        "quota"
      ],
      "type": "object",
      "additionalProperties": false
    },
    "status": {
      "description": "TenantStatus defines the observed state of Tenant",
      "properties": {
        "conditions": {
          "description": "Status conditions for tenant",
          "items": {
            "description": "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions.  For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }",
            "properties": {
              "lastTransitionTime": {
                "description": "lastTransitionTime is the last time the condition transitioned from one status to another. This 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. This may be an empty string.",
                "maxLength": 32768,
                "type": "string"
              },
              "observedGeneration": {
                "description": "observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with 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. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This 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. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)",
                "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"
        },
        "deployedNamespaces": {
          "description": "DeployedNamespaces has the string for created namespaces so they can be synced with spec",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "deployedSandboxes": {
          "additionalProperties": {
            "type": "string"
          },
          "description": "DeployedSandboxes has the map for created sandbox environments so they can be synced with spec",
          "type": "object"
        },
        "namespaceAnnotations": {
          "description": "NamespaceAnnotations stores the previous state of annotations for across tenant namespaces and specific annotations across given namespaces, if mentioned in spec",
          "properties": {
            "common": {
              "additionalProperties": {
                "type": "string"
              },
              "description": "Common consists of annotations applied across all tenant namespaces",
              "type": "object"
            },
            "specific": {
              "description": "Specific consists of annotations applied across given tenant namespaces",
              "items": {
                "properties": {
                  "annotations": {
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Annotations add annotations to the specified namespace",
                    "type": "object"
                  },
                  "namespaces": {
                    "description": "Namespace names on which annotations will be applied",
                    "items": {
                      "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?",
                      "type": "string"
                    },
                    "type": "array"
                  }
                },
                "required": [
                  "annotations",
                  "namespaces"
                ],
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "namespaceLabels": {
          "description": "NamespaceLabels stores the previous state of labels for across tenant namespaces and specific labels across given namespaces, if mentioned in spec",
          "properties": {
            "common": {
              "additionalProperties": {
                "type": "string"
              },
              "description": "Common consists of labels applied across all tenant namespaces",
              "type": "object"
            },
            "specific": {
              "description": "Specific consists of labels applied across given tenant namespaces",
              "items": {
                "properties": {
                  "labels": {
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Labels to be added to the specified namespace",
                    "type": "object"
                  },
                  "namespaces": {
                    "description": "Namespaces names on which labels will be applied",
                    "items": {
                      "pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?",
                      "type": "string"
                    },
                    "type": "array"
                  }
                },
                "required": [
                  "labels",
                  "namespaces"
                ],
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "sandboxState": {
          "description": "SandboxState stores the previous state of sandbox field, if mentioned in spec",
          "type": "boolean"
        }
      },
      "type": "object",
      "additionalProperties": false
    }
  },
  "type": "object"
}
