# Copyright 2020 The Knative Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: clusterducktypes.discovery.knative.dev
  labels:
    discovery.knative.dev/release: devel
    knative.dev/crd-install: "true"
spec:
  group: discovery.knative.dev
  versions:
    - &version
      name: v1alpha1
      served: true
      storage: true
      subresources:
        status: {}
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              description: Spec holds the desired state of the ClusterDuckType (from the client).
              type: object
              properties:
                group:
                  description: Group is the API group of the defined duck type. Must match the name of the ClusterDuckType (in the form `<names.plural>.<group>`).
                  type: string
                names:
                  description: Names holds the naming conventions for this duck type.
                  type: object
                  properties:
                    name:
                      description: Name is the serialized name of the resource. It is normally CamelCase and singular.
                      type: string
                    plural:
                      description: Plural is the plural name of the duck type. Must match the name of the ClusterDuckType (in the form `<names.plural>.<group>`). Must be all lowercase.
                      type: string
                    singular:
                      description: Singular is the singular name of the duck type. It must be all lowercase. Defaults to lowercased `name`.
                      type: string
                selectors:
                  description: Selectors is a list of selectors for CustomResourceDefinitions to identify a duck type.
                  type: array
                  items:
                    type: object
                    properties:
                      labelSelector:
                        description: 'LabelSelector is a label selector used to find CRDs that associate with the duck type. Typically this will be in the form: `<group>/<names.singular>=true` Annotations are used to map the versions of the CRD to the correct ducktype. The annotation is expected to be in the form: `<names.plural>.<group>/<versions[x].name>=[CRD.Version]` and results in `x = CRD.Version`. The duck type version annotation can have several CRD versions that map: `<names.plural>.<group>/<versions[x].name>=[CRD.V1],[CRD.V2],[CRD.V3]` this tells the interrupter to match x to all of V1, V2 and V3 versions. If the version mapping annotation is missing, it is assumed this applies as the match. Must be a valid Kubernetes Label Selector.'
                        type: string
                versions:
                  description: Versions holds the schema and printer column mappings for specific versions for duck types.
                  type: array
                  items:
                    type: object
                    properties:
                      additionalPrinterColumns:
                        description: Custom Columns to be used to pretty print the duck type at this version.
                        type: array
                        items:
                          type: object
                          properties:
                            description:
                              description: description is a human readable description of this column.
                              type: string
                            format:
                              description: format is an optional OpenAPI type definition for this column. The 'name' format is applied to the primary identifier column to assist in clients identifying column is the resource name. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for details.
                              type: string
                            jsonPath:
                              description: jsonPath is a simple JSON path (i.e. with array notation) which is evaluated against each custom resource to produce the value for this column.
                              type: string
                            name:
                              description: name is a human readable name for the column.
                              type: string
                            priority:
                              description: priority is an integer defining the relative importance of this column compared to others. Lower numbers are considered higher priority. Columns that may be omitted in limited space scenarios should be given a priority greater than 0.
                              type: integer
                              format: int32
                            type:
                              description: type is an OpenAPI type definition for this column. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for details.
                              type: string
                      name:
                        description: Name is the name of this duck type version.
                        type: string
                      refs:
                        description: Refs is a list of ResourceRefs that implement this duck type. Used for manual discovery.
                        type: array
                        items:
                          type: object
                          properties:
                            apiVersion:
                              description: APIVersion is the group and version of the resource combined. - if group is non-empty, `group/version` - if group is empty, `version`
                              type: string
                            group:
                              description: Group is the resource group.
                              type: string
                            kind:
                              description: Kind is the CamelCased resource kind.
                              type: string
                            resource:
                              description: Resource is the plural resource name.
                              type: string
                            scope:
                              description: Scope indicates whether the resource is cluster- or namespace-scoped.
                              type: string
                            version:
                              description: Version is the version the duck type applies to for the resource.
                              type: string
                      schema:
                        description: Partial Schema of this version of the duck type.
                        type: object
                        properties:
                          openAPIV3Schema:
                            description: openAPIV3Schema is the OpenAPI v3 schema to use for validation and pruning.
                            type: object
                            properties:
                              $ref:
                                type: string
                              $schema:
                                type: string
                              additionalItems:
                                type: string
                              additionalProperties:
                                type: string
                              allOf:
                                type: array
                                items:
                                  type: object
                              anyOf:
                                type: array
                                items:
                                  type: object
                              default:
                                description: default is a default value for undefined object fields. Defaulting is a beta feature under the CustomResourceDefaulting feature gate. Defaulting requires spec.preserveUnknownFields to be false.
                                type: string
                              definitions:
                                type: object
                                x-kubernetes-preserve-unknown-fields: true
                              dependencies:
                                type: object
                                x-kubernetes-preserve-unknown-fields: true
                              description:
                                type: string
                              enum:
                                type: array
                                items:
                                  type: object
                                  properties:
                                    Raw:
                                      type: array
                                      items:
                                        type: integer
                                        maximum: 255
                                        minimum: 0
                              example:
                                type: string
                              exclusiveMaximum:
                                type: boolean
                              exclusiveMinimum:
                                type: boolean
                              externalDocs:
                                type: object
                                properties:
                                  description:
                                    type: string
                                  url:
                                    type: string
                              format:
                                description: 'format is an OpenAPI v3 format string. Unknown formats are ignored. The following formats are validated:  - bsonobjectid: a bson object ID, i.e. a 24 characters hex string - uri: an URI as parsed by Golang net/url.ParseRequestURI - email: an email address as parsed by Golang net/mail.ParseAddress - hostname: a valid representation for an Internet host name, as defined by RFC 1034, section 3.1 [RFC1034]. - ipv4: an IPv4 IP as parsed by Golang net.ParseIP - ipv6: an IPv6 IP as parsed by Golang net.ParseIP - cidr: a CIDR as parsed by Golang net.ParseCIDR - mac: a MAC address as parsed by Golang net.ParseMAC - uuid: an UUID that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{12}$ - uuid3: an UUID3 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?3[0-9a-f]{3}-?[0-9a-f]{4}-?[0-9a-f]{12}$ - uuid4: an UUID4 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?4[0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$ - uuid5: an UUID5 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?5[0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$ - isbn: an ISBN10 or ISBN13 number string like "0321751043" or "978-0321751041" - isbn10: an ISBN10 number string like "0321751043" - isbn13: an ISBN13 number string like "978-0321751041" - creditcard: a credit card number defined by the regex ^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})$ with any non digit characters mixed in - ssn: a U.S. social security number following the regex ^\\d{3}[- ]?\\d{2}[- ]?\\d{4}$ - hexcolor: an hexadecimal color code like "#FFFFFF: following the regex ^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$ - rgbcolor: an RGB color code like rgb like "rgb(255,255,2559" - byte: base64 encoded binary data - password: any kind of string - date: a date string like "2006-01-02" as defined by full-date in RFC3339 - duration: a duration string like "22 ns" as parsed by Golang time.ParseDuration or compatible with Scala duration format - datetime: a date time string like "2014-12-15T19:30:20.000Z" as defined by date-time in RFC3339.'
                                type: string
                              id:
                                type: string
                              items:
                                type: string
                              maxItems:
                                type: integer
                                format: int64
                              maxLength:
                                type: integer
                                format: int64
                              maxProperties:
                                type: integer
                                format: int64
                              maximum:
                                type: number
                                format: double
                              minItems:
                                type: integer
                                format: int64
                              minLength:
                                type: integer
                                format: int64
                              minProperties:
                                type: integer
                                format: int64
                              minimum:
                                type: number
                                format: double
                              multipleOf:
                                type: number
                                format: double
                              not:
                                type: object
                              nullable:
                                type: boolean
                              oneOf:
                                type: array
                                items:
                                  type: object
                              pattern:
                                type: string
                              patternProperties:
                                type: object
                                x-kubernetes-preserve-unknown-fields: true
                              properties:
                                type: object
                                x-kubernetes-preserve-unknown-fields: true
                              required:
                                type: array
                                items:
                                  type: string
                              title:
                                type: string
                              type:
                                type: string
                              uniqueItems:
                                type: boolean
                              x-kubernetes-embedded-resource:
                                description: x-kubernetes-embedded-resource defines that the value is an embedded Kubernetes runtime.Object, with TypeMeta and ObjectMeta. The type must be object. It is allowed to further restrict the embedded object. kind, apiVersion and metadata are validated automatically. x-kubernetes-preserve-unknown-fields is allowed to be true, but does not have to be if the object is fully specified (up to kind, apiVersion, metadata).
                                type: boolean
                              x-kubernetes-int-or-string:
                                description: 'x-kubernetes-int-or-string specifies that this value is either an integer or a string. If this is true, an empty type is allowed and type as child of anyOf is permitted if following one of the following patterns:  1) anyOf: - type: integer - type: string 2) allOf: - anyOf: - type: integer - type: string - ... zero or more'
                                type: boolean
                              x-kubernetes-list-map-keys:
                                description: 'x-kubernetes-list-map-keys annotates an array with the x-kubernetes-list-type `map` by specifying the keys used as the index of the map.  This tag MUST only be used on lists that have the "x-kubernetes-list-type" extension set to "map". Also, the values specified for this attribute must be a scalar typed field of the child structure (no nesting is supported).  The properties specified must either be required or have a default value, to ensure those properties are present for all list items. '
                                type: array
                                items:
                                  type: string
                              x-kubernetes-list-type:
                                description: 'x-kubernetes-list-type annotates an array to further describe its topology. This extension must only be used on lists and may have 3 possible values:  1) `atomic`: the list is treated as a single entity, like a scalar. Atomic lists will be entirely replaced when updated. This extension may be used on any type of list (struct, scalar, ...). 2) `set`: Sets are lists that must not have multiple items with the same value. Each value must be a scalar, an object with x-kubernetes-map-type `atomic` or an array with x-kubernetes-list-type `atomic`. 3) `map`: These lists are like maps in that their elements have a non-index key used to identify them. Order is preserved upon merge. The map tag must only be used on a list with elements of type object. Defaults to atomic for arrays.'
                                type: string
                              x-kubernetes-map-type:
                                description: 'x-kubernetes-map-type annotates an object to further describe its topology. This extension must only be used when type is object and may have 2 possible values:  1) `granular`: These maps are actual maps (key-value pairs) and each fields are independent from each other (they can each be manipulated by separate actors). This is the default behaviour for all maps. 2) `atomic`: the list is treated as a single entity, like a scalar. Atomic maps will be entirely replaced when updated.'
                                type: string
                              x-kubernetes-preserve-unknown-fields:
                                description: x-kubernetes-preserve-unknown-fields stops the API server decoding step from pruning fields which are not specified in the validation schema. This affects fields recursively, but switches back to normal pruning behaviour if nested properties or additionalProperties are specified in the schema. This can either be true or undefined. False is forbidden.
                                type: boolean
            status:
              description: Status communicates the observed state of the ClusterDuckType (from the controller).
              type: object
              properties:
                annotations:
                  description: Annotations is additional Status fields for the Resource to save some additional State as well as convey more information to the user. This is roughly akin to Annotations on any k8s resource, just the reconciler conveying richer information outwards.
                  type: object
                  x-kubernetes-preserve-unknown-fields: true
                conditions:
                  description: Conditions the latest available observations of a resource's current state.
                  type: array
                  items:
                    type: object
                    required:
                      - type
                      - status
                    properties:
                      lastTransitionTime:
                        description: LastTransitionTime is the last time the condition transitioned from one status to another. We use VolatileTime in place of metav1.Time to exclude this from creating equality.Semantic differences (all other things held constant).
                        type: string
                      message:
                        description: A human readable message indicating details about the transition.
                        type: string
                      reason:
                        description: The reason for the condition's last transition.
                        type: string
                      severity:
                        description: Severity with which to treat failures of this type of condition. When this is not specified, it defaults to Error.
                        type: string
                      status:
                        description: Status of the condition, one of True, False, Unknown.
                        type: string
                      type:
                        description: Type of condition.
                        type: string
                duckCount:
                  description: DuckCount is the count of unique duck types found post-hunt.
                  type: integer
                  format: int32
                ducks:
                  description: Ducks is a versioned mapping of the found resources that implement this duck.
                  type: object
                  x-kubernetes-preserve-unknown-fields: true
                observedGeneration:
                  description: ObservedGeneration is the 'Generation' of the Service that was last processed by the controller.
                  type: integer
                  format: int64
      additionalPrinterColumns:
        - name: Short Name
          type: string
          jsonPath: .spec.names.name
        - name: Ducks
          type: integer
          jsonPath: .status.duckCount
        - name: Ready
          type: string
          jsonPath: ".status.conditions[?(@.type=='Ready')].status"
        - name: Reason
          type: string
          jsonPath: ".status.conditions[?(@.type=='Ready')].reason"
  names:
    kind: ClusterDuckType
    plural: clusterducktypes
    singular: clusterducktype
    categories:
    - all
    - knative
    shortNames:
    - cducks
  scope: Cluster
