# Copyright 2020 Google LLC
#
# 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
#
#     http://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: topics.internal.events.cloud.google.com
  labels:
    events.cloud.google.com/release: devel
    events.cloud.google.com/crd-install: "true"
    duck.knative.dev/addressable: "true"
spec:
  group: internal.events.cloud.google.com
  names:
    kind: Topic
    plural: topics
    singular: topic
    categories:
    - all
    - knative
    - pubsub
  scope: Namespaced
  preserveUnknownFields: false
  conversion:
    strategy: Webhook
    webhook:
      # conversionReviewVersions indicates what ConversionReview versions are understood/preferred by the webhook.
      # The first version in the list understood by the API server is sent to the webhook.
      # The webhook must respond with a ConversionReview object in the same version it received.
      conversionReviewVersions: ["v1", "v1beta1"]
      clientConfig:
        service:
          name: webhook
          namespace: events-system
  versions:
  - &version
    name: v1
    served: true
    storage: true
    subresources:
      status: {}
    additionalPrinterColumns:
    - name: Ready
      type: string
      jsonPath: ".status.conditions[?(@.type==\"Ready\")].status"
    - name: Reason
      type: string
      jsonPath: ".status.conditions[?(@.type==\"Ready\")].reason"
    - name: Address
      type: string
      jsonPath: .status.address.url
    - name: Age
      type: date
      jsonPath: .metadata.creationTimestamp
    # We remove status.properties.serviceAccountName from the schema of v1.
    schema:
      openAPIV3Schema: &openAPIV3Schema
        type: object
        properties: &properties
          spec:
            type: object
            required:
              - topic
            properties:
              serviceAccountName:
                type: string
                description: "Kubernetes service account used to bind to a google service account to poll the Cloud Pub/Sub Subscription. The value of the Kubernetes service account must be a valid DNS subdomain name. (see https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#dns-subdomain-names)"
              secret:
                type: object
                description: "Credential used to poll the Cloud Pub/Sub Subscription. It is not used to create or delete the Subscription, only to poll it. The value of the secret entry must be a service account key in the JSON format (see https://cloud.google.com/iam/docs/creating-managing-service-account-keys). Defaults to secret.name of 'google-cloud-key' and secret.key of 'key.json'."
                properties:
                  name:
                    type: string
                  key:
                    type: string
                  optional:
                    type: boolean
              project:
                type: string
                description: "ID of the Google Cloud Project to own the Pub/Sub credentials. E.g. 'my-project-1234' rather than its display name, 'My Project' or its number '1234567890'. If omitted uses the Project ID from the GKE cluster metadata service."
              topic:
                type: string
                description: "ID of the Cloud Pub/Sub Topic to create. It must be in the form of the unique identifier within the project, not the entire name. E.g. it must be 'laconia', not 'projects/my-gcp-project/topics/laconia'."
              propagationPolicy:
                type: string
                enum: [CreateDelete, CreateNoDelete, NoCreateNoDelete]
                description: "Propagation policy defines how Topic controls the Cloud Pub/Sub topic for lifecycle changes. Default is CreateNoDelete."
              publisher:
                type: boolean
                description: "Flag that controls the creation of an HTTP publisher endpoint. If set to true, then a publisher will be created and this Topic will be Addressable (have status.address). If set to false, then no publisher will be created and this custom object represents the creation and deletion of a GCP Pub/Sub Topic only."
          status: &status
            type: object
            properties: &statusProperties
              observedGeneration:
                type: integer
                format: int64
              conditions:
                type: array
                items:
                  type: object
                  properties:
                    lastTransitionTime:
                      # we use a string in the stored object but a wrapper object
                      # at runtime.
                      type: string
                    message:
                      type: string
                    reason:
                      type: string
                    severity:
                      type: string
                    status:
                      type: string
                    type:
                      type: string
                  required:
                    - type
                    - status
              projectId:
                type: string
              topicId:
                type: string
              address:
                type: object
                properties:
                  url:
                    type: string
  - << : *version
    name: v1alpha1
    # TODO: Flip served bit of v1alpha1 in https://github.com/google/knative-gcp/issues/1544.
    served: true
    storage: false
    # v1alpha1 and v1beta1 have serviceAccountName in status.properties in the schema
    schema: &v1alpha1Schema
      openAPIV3Schema:
        << : *openAPIV3Schema
        properties:
          << : *properties
          status:
            << : *status
            properties:
              <<: *statusProperties
              serviceAccountName:
                type: string
  - << : *version
    name: v1beta1
    served: true
    storage: false
    # the schema of v1beta1 is exactly the same as v1alpha1 schema
    schema: *v1alpha1Schema
