# Copyright 2024 Google Inc.
# 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.

---
name: 'BareMetalCluster'
description: "A Google Bare Metal User Cluster."
docs:
id_format: 'projects/{{project}}/locations/{{location}}/bareMetalClusters/{{name}}'
base_url: 'projects/{{project}}/locations/{{location}}/bareMetalClusters'
self_link: 'projects/{{project}}/locations/{{location}}/bareMetalClusters/{{name}}'
create_url: 'projects/{{project}}/locations/{{location}}/bareMetalClusters?bare_metal_cluster_id={{name}}'
update_url: 'projects/{{project}}/locations/{{location}}/bareMetalClusters/{{name}}'
update_verb: 'PATCH'
update_mask: true
delete_url: 'projects/{{project}}/locations/{{location}}/bareMetalClusters/{{name}}?force=true'
import_format:
  - 'projects/{{project}}/locations/{{location}}/bareMetalClusters/{{name}}'
timeouts:
  insert_minutes: 60
  update_minutes: 60
  delete_minutes: 60
async:
  actions: ['create', 'delete', 'update']
  type: 'OpAsync'
  operation:
    base_url: '{{op_id}}'
  result:
    resource_inside_response: true
custom_code:
taint_resource_on_failed_create: true
sweeper:
  url_substitutions:
    - region: "us-west1"
examples:
  - name: 'gkeonprem_bare_metal_cluster_basic'
    primary_resource_id: 'cluster-basic'
    vars:
      name: 'my-cluster'
    test_env_vars:
      project: 'fake-backend-360322'
  - name: 'gkeonprem_bare_metal_cluster_manuallb'
    primary_resource_id: 'cluster-manuallb'
    vars:
      name: 'cluster-manuallb'
    test_env_vars:
      project: 'fake-backend-360322'
  - name: 'gkeonprem_bare_metal_cluster_bgplb'
    primary_resource_id: 'cluster-bgplb'
    vars:
      name: 'cluster-bgplb'
    test_env_vars:
      project: 'fake-backend-360322'
parameters:
  - name: 'name'
    type: String
    description: The bare metal cluster name.
    url_param_only: true
    required: true
    immutable: true
  - name: 'location'
    type: String
    description: The location of the resource.
    url_param_only: true
    required: true
    immutable: true
properties:
  - name: 'adminClusterMembership'
    type: String
    description: |
      The Admin Cluster this Bare Metal User Cluster belongs to.
      This is the full resource name of the Admin Cluster's hub membership.
    required: true
    immutable: true
    diff_suppress_func: 'tpgresource.ProjectNumberDiffSuppress'
  - name: 'description'
    type: String
    description: |
      A human readable description of this Bare Metal User Cluster.
  - name: 'bareMetalVersion'
    type: String
    description: |
      A human readable description of this Bare Metal User Cluster.
    required: true
  - name: 'annotations'
    type: KeyValueAnnotations
    description: |
      Annotations on the Bare Metal User Cluster.
      This field has the same restrictions as Kubernetes annotations.
      The total size of all keys and values combined is limited to 256k.
      Key can have 2 segments: prefix (optional) and name (required),
      separated by a slash (/).
      Prefix must be a DNS subdomain.
      Name must be 63 characters or less, begin and end with alphanumerics,
      with dashes (-), underscores (_), dots (.), and alphanumerics between.
  - name: 'networkConfig'
    type: NestedObject
    description: |
      Network configuration.
    required: true
    properties:
      - name: 'islandModeCidr'
        type: NestedObject
        exactly_one_of:
          - 'network_config.0.island_mode_cidr'
        properties:
          - name: 'serviceAddressCidrBlocks'
            type: Array
            description: |
              All services in the cluster are assigned an RFC1918 IPv4 address from these ranges. This field cannot be changed after creation.
            required: true
            item_type:
              type: String
          - name: 'podAddressCidrBlocks'
            type: Array
            description: |
              All pods in the cluster are assigned an RFC1918 IPv4 address from these ranges. This field cannot be changed after creation.
            required: true
            item_type:
              type: String
      - name: 'advancedNetworking'
        type: Boolean
        description: |
          Enables the use of advanced Anthos networking features, such as Bundled
          Load Balancing with BGP or the egress NAT gateway.
          Setting configuration for advanced networking features will automatically
          set this flag.
      - name: 'multipleNetworkInterfacesConfig'
        type: NestedObject
        description: |
          Configuration for multiple network interfaces.
        properties:
          - name: 'enabled'
            type: Boolean
            description: |
              Whether to enable multiple network interfaces for your pods.
              When set network_config.advanced_networking is automatically
              set to true.
      - name: 'srIovConfig'
        type: NestedObject
        description: |
          Configuration for SR-IOV.
        properties:
          - name: 'enabled'
            type: Boolean
            description: |
              Whether to install the SR-IOV operator.
  - name: 'controlPlane'
    type: NestedObject
    description: |
      Specifies the control plane configuration.
    required: true
    properties:
      - name: 'controlPlaneNodePoolConfig'
        type: NestedObject
        description: |
          Configures the node pool running the control plane. If specified the corresponding NodePool will be created for the cluster's control plane. The NodePool will have the same name and namespace as the cluster.
        required: true
        properties:
          - name: 'nodePoolConfig'
            type: NestedObject
            description: |
              The generic configuration for a node pool running the control plane.
            required: true
            properties:
              - name: 'nodeConfigs'
                type: Array
                description: The list of machine addresses in the Bare Metal Node
                  Pool.
                item_type:
                  type: NestedObject
                  properties:
                    - name: 'nodeIp'
                      type: String
                      description: |
                        The default IPv4 address for SSH access and Kubernetes node.
                        Example: 192.168.0.1
                    - name: 'labels'
                      type: KeyValuePairs
                      description: |
                        The map of Kubernetes labels (key/value pairs) to be applied to
                        each node. These will added in addition to any default label(s)
                        that Kubernetes may apply to the node. In case of conflict in
                        label keys, the applied set may differ depending on the Kubernetes
                        version -- it's best to assume the behavior is undefined and
                        conflicts should be avoided. For more information, including usage
                        and the valid values, see:
                          - http://kubernetes.io/v1.1/docs/user-guide/labels.html
                        An object containing a list of "key": value pairs.
                        Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
              - name: 'operatingSystem'
                type: String
                description: |
                  Specifies the nodes operating system (default: LINUX).
                default_value: "LINUX"
              - name: 'taints'
                type: Array
                description: |
                  The initial taints assigned to nodes of this node pool.
                default_from_api: true
                item_type:
                  type: NestedObject
                  properties:
                    - name: 'key'
                      type: String
                      description: |
                        Key associated with the effect.
                    - name: 'value'
                      type: String
                      description: |
                        Value associated with the effect.
                    - name: 'effect'
                      type: Enum
                      description: |
                        Specifies the nodes operating system (default: LINUX).
                      enum_values:
                        - 'EFFECT_UNSPECIFIED'
                        - 'PREFER_NO_SCHEDULE'
                        - 'NO_EXECUTE'
              - name: 'labels'
                type: KeyValuePairs
                description: |
                  The map of Kubernetes labels (key/value pairs) to be applied to
                  each node. These will added in addition to any default label(s)
                  that Kubernetes may apply to the node. In case of conflict in
                  label keys, the applied set may differ depending on the Kubernetes
                  version -- it's best to assume the behavior is undefined and
                  conflicts should be avoided. For more information, including usage
                  and the valid values, see:
                    - http://kubernetes.io/v1.1/docs/user-guide/labels.html
                  An object containing a list of "key": value pairs.
                  For example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
                default_from_api: true
      - name: 'apiServerArgs'
        type: Array
        description: |
          Customizes the default API server args. Only a subset of
          customized flags are supported. Please refer to the API server
          documentation below to know the exact format:
          https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/
        item_type:
          type: NestedObject
          properties:
            - name: 'argument'
              type: String
              description: |
                The argument name as it appears on the API Server command line please make sure to remove the leading dashes.
              required: true
            - name: 'value'
              type: String
              description: |
                The value of the arg as it will be passed to the API Server command line.
              required: true
  - name: 'loadBalancer'
    type: NestedObject
    description: |
      Specifies the load balancer configuration.
    required: true
    properties:
      - name: 'vipConfig'
        type: NestedObject
        description: |
          Specified the Bare Metal Load Balancer Config
        required: true
        properties:
          - name: 'controlPlaneVip'
            type: String
            description: The VIP which you previously set aside for the Kubernetes
              API of this Bare Metal User Cluster.
            required: true
          - name: 'ingressVip'
            type: String
            description: The VIP which you previously set aside for ingress traffic
              into this Bare Metal User Cluster.
            required: true
      - name: 'portConfig'
        type: NestedObject
        description: |
          Specifies the load balancer ports.
        required: true
        properties:
          - name: 'controlPlaneLoadBalancerPort'
            type: Integer
            description: |
              The port that control plane hosted load balancers will listen on.
            required: true
      - name: 'metalLbConfig'
        type: NestedObject
        exactly_one_of:
          - 'load_balancer.0.metal_lb_config'
          - 'load_balancer.0.manual_lb_config'
          - 'load_balancer.0.bgp_lb_config'
        properties:
          - name: 'addressPools'
            type: Array
            description: |
              AddressPools is a list of non-overlapping IP pools used by load balancer
              typed services. All addresses must be routable to load balancer nodes.
              IngressVIP must be included in the pools.
            required: true
            item_type:
              type: NestedObject
              properties:
                - name: 'pool'
                  type: String
                  description: |
                    The name of the address pool.
                  required: true
                - name: 'addresses'
                  type: Array
                  description: |
                    The addresses that are part of this pool. Each address must be either in the CIDR form (1.2.3.0/24) or range form (1.2.3.1-1.2.3.5).
                  required: true
                  item_type:
                    type: String
                - name: 'avoidBuggyIps'
                  type: Boolean
                  description: |
                    If true, avoid using IPs ending in .0 or .255.
                    This avoids buggy consumer devices mistakenly dropping IPv4 traffic for those special IP addresses.
                - name: 'manualAssign'
                  type: Boolean
                  description: |
                    If true, prevent IP addresses from being automatically assigned.
          - name: 'loadBalancerNodePoolConfig'
            type: NestedObject
            description: |
              Specifies the load balancer's node pool configuration.
            properties:
              - name: 'nodePoolConfig'
                type: NestedObject
                description: |
                  The generic configuration for a node pool running a load balancer.
                properties:
                  - name: 'nodeConfigs'
                    type: Array
                    description: The list of machine addresses in the Bare Metal Node
                      Pool.
                    item_type:
                      type: NestedObject
                      properties:
                        - name: 'nodeIp'
                          type: String
                          description: |
                            The default IPv4 address for SSH access and Kubernetes node.
                            Example: 192.168.0.1
                        - name: 'labels'
                          type: KeyValuePairs
                          description: |
                            The map of Kubernetes labels (key/value pairs) to be applied to
                            each node. These will added in addition to any default label(s)
                            that Kubernetes may apply to the node. In case of conflict in
                            label keys, the applied set may differ depending on the Kubernetes
                            version -- it's best to assume the behavior is undefined and
                            conflicts should be avoided. For more information, including usage
                            and the valid values, see:
                              - http://kubernetes.io/v1.1/docs/user-guide/labels.html
                            An object containing a list of "key": value pairs.
                            For example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
                  - name: 'operatingSystem'
                    type: String
                    description: |
                      Specifies the nodes operating system (default: LINUX).
                    default_from_api: true
                  - name: 'taints'
                    type: Array
                    description: |
                      The initial taints assigned to nodes of this node pool.
                    default_from_api: true
                    item_type:
                      type: NestedObject
                      properties:
                        - name: 'key'
                          type: String
                          description: |
                            Key associated with the effect.
                        - name: 'value'
                          type: String
                          description: |
                            Value associated with the effect.
                        - name: 'effect'
                          type: Enum
                          description: |
                            Specifies the nodes operating system (default: LINUX).
                          enum_values:
                            - 'EFFECT_UNSPECIFIED'
                            - 'PREFER_NO_SCHEDULE'
                            - 'NO_EXECUTE'
                  - name: 'labels'
                    type: KeyValuePairs
                    description: |
                      The map of Kubernetes labels (key/value pairs) to be applied to
                      each node. These will added in addition to any default label(s)
                      that Kubernetes may apply to the node. In case of conflict in
                      label keys, the applied set may differ depending on the Kubernetes
                      version -- it's best to assume the behavior is undefined and
                      conflicts should be avoided. For more information, including usage
                      and the valid values, see:
                        - http://kubernetes.io/v1.1/docs/user-guide/labels.html
                      An object containing a list of "key": value pairs.
                      For example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
                    default_from_api: true
      - name: 'manualLbConfig'
        type: NestedObject
        exactly_one_of:
          - 'load_balancer.0.metal_lb_config'
          - 'load_balancer.0.manual_lb_config'
          - 'load_balancer.0.bgp_lb_config'
        properties:
          - name: 'enabled'
            type: Boolean
            description: |
              Whether manual load balancing is enabled.
            required: true
      - name: 'bgpLbConfig'
        type: NestedObject
        description: |
          Configuration for BGP typed load balancers.
        exactly_one_of:
          - 'load_balancer.0.metal_lb_config'
          - 'load_balancer.0.manual_lb_config'
          - 'load_balancer.0.bgp_lb_config'
        properties:
          - name: 'asn'
            type: Integer
            description: |
              BGP autonomous system number (ASN) of the cluster.
              This field can be updated after cluster creation.
            required: true
          - name: 'bgpPeerConfigs'
            type: Array
            description: |
              The list of BGP peers that the cluster will connect to.
              At least one peer must be configured for each control plane node.
              Control plane nodes will connect to these peers to advertise the control
              plane VIP. The Services load balancer also uses these peers by default.
              This field can be updated after cluster creation.
            required: true
            item_type:
              type: NestedObject
              properties:
                - name: 'asn'
                  type: Integer
                  description: |
                    BGP autonomous system number (ASN) for the network that contains the
                    external peer device.
                  required: true
                - name: 'ipAddress'
                  type: String
                  description: |
                    The IP address of the external peer device.
                  required: true
                - name: 'controlPlaneNodes'
                  type: Array
                  description: |
                    The IP address of the control plane node that connects to the external
                    peer.
                    If you don't specify any control plane nodes, all control plane nodes
                    can connect to the external peer. If you specify one or more IP addresses,
                    only the nodes specified participate in peering sessions.
                  item_type:
                    type: String
          - name: 'addressPools'
            type: Array
            description: |
              AddressPools is a list of non-overlapping IP pools used by load balancer
              typed services. All addresses must be routable to load balancer nodes.
              IngressVIP must be included in the pools.
            required: true
            item_type:
              type: NestedObject
              properties:
                - name: 'pool'
                  type: String
                  description: |
                    The name of the address pool.
                  required: true
                - name: 'addresses'
                  type: Array
                  description: |
                    The addresses that are part of this pool. Each address must be either in the CIDR form (1.2.3.0/24) or range form (1.2.3.1-1.2.3.5).
                  required: true
                  item_type:
                    type: String
                - name: 'avoidBuggyIps'
                  type: Boolean
                  description: |
                    If true, avoid using IPs ending in .0 or .255.
                    This avoids buggy consumer devices mistakenly dropping IPv4 traffic for those special IP addresses.
                - name: 'manualAssign'
                  type: String
                  description: |
                    If true, prevent IP addresses from being automatically assigned.
          - name: 'loadBalancerNodePoolConfig'
            type: NestedObject
            description: |
              Specifies the node pool running data plane load balancing. L2 connectivity
              is required among nodes in this pool. If missing, the control plane node
              pool is used for data plane load balancing.
            properties:
              - name: 'nodePoolConfig'
                type: NestedObject
                description: |
                  The generic configuration for a node pool running a load balancer.
                properties:
                  - name: 'nodeConfigs'
                    type: Array
                    description: The list of machine addresses in the Bare Metal Node Pool.
                    item_type:
                      type: NestedObject
                      properties:
                        - name: 'nodeIp'
                          type: String
                          description: |
                            The default IPv4 address for SSH access and Kubernetes node.
                            Example: 192.168.0.1
                        - name: 'labels'
                          type: KeyValuePairs
                          description: |
                            The map of Kubernetes labels (key/value pairs) to be applied to
                            each node. These will added in addition to any default label(s)
                            that Kubernetes may apply to the node. In case of conflict in
                            label keys, the applied set may differ depending on the Kubernetes
                            version -- it's best to assume the behavior is undefined and
                            conflicts should be avoided. For more information, including usage
                            and the valid values, see:
                              - http://kubernetes.io/v1.1/docs/user-guide/labels.html
                            An object containing a list of "key": value pairs.
                            For example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
                  - name: 'operatingSystem'
                    type: String
                    description: |
                      Specifies the nodes operating system (default: LINUX).
                  - name: 'taints'
                    type: Array
                    description: |
                      The initial taints assigned to nodes of this node pool.
                    item_type:
                      type: NestedObject
                      properties:
                        - name: 'key'
                          type: String
                          description: |
                            Key associated with the effect.
                        - name: 'value'
                          type: String
                          description: |
                            Value associated with the effect.
                        - name: 'effect'
                          type: Enum
                          description: |
                            Specifies the nodes operating system (default: LINUX).
                          enum_values:
                            - 'EFFECT_UNSPECIFIED'
                            - 'PREFER_NO_SCHEDULE'
                            - 'NO_EXECUTE'
                  - name: 'labels'
                    type: KeyValuePairs
                    description: |
                      The map of Kubernetes labels (key/value pairs) to be applied to
                      each node. These will added in addition to any default label(s)
                      that Kubernetes may apply to the node. In case of conflict in
                      label keys, the applied set may differ depending on the Kubernetes
                      version -- it's best to assume the behavior is undefined and
                      conflicts should be avoided. For more information, including usage
                      and the valid values, see:
                        - http://kubernetes.io/v1.1/docs/user-guide/labels.html
                      An object containing a list of "key": value pairs.
                      For example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
                  - name: 'kubeletConfig'
                    type: NestedObject
                    description: |
                      The modifiable kubelet configurations for the baremetal machines.
                    properties:
                      - name: 'registryPullQps'
                        type: Integer
                        description: |
                          The limit of registry pulls per second.
                          Setting this value to 0 means no limit.
                          Updating this field may impact scalability by changing the amount of
                          traffic produced by image pulls.
                          Defaults to 5.
                        default_value: 5
                      - name: 'registryBurst'
                        type: Integer
                        description: |
                          The maximum size of bursty pulls, temporarily allows pulls to burst to this
                          number, while still not exceeding registry_pull_qps.
                          The value must not be a negative number.
                          Updating this field may impact scalability by changing the amount of
                          traffic produced by image pulls.
                          Defaults to 10.
                        default_value: 10
                      - name: 'serializeImagePullsDisabled'
                        type: Boolean
                        description: |
                          Prevents the Kubelet from pulling multiple images at a time.
                          We recommend *not* changing the default value on nodes that run docker
                          daemon with version  < 1.9 or an Another Union File System (Aufs) storage
                          backend. Issue https://github.com/kubernetes/kubernetes/issues/10959 has
                          more details.
  - name: 'storage'
    type: NestedObject
    description: |
      Specifies the cluster storage configuration.
    required: true
    properties:
      - name: 'lvpShareConfig'
        type: NestedObject
        description: |
          Specifies the config for local PersistentVolumes backed by
          subdirectories in a shared filesystem. These subdirectores are
          automatically created during cluster creation.
        required: true
        properties:
          - name: 'lvpConfig'
            type: NestedObject
            description: |
              Defines the machine path and storage class for the LVP Share.
            required: true
            properties:
              - name: 'path'
                type: String
                description: |
                  The host machine path.
                required: true
              - name: 'storageClass'
                type: String
                description: |
                  The StorageClass name that PVs will be created with.
                required: true
          - name: 'sharedPathPvCount'
            type: Integer
            description: |
              The number of subdirectories to create under path.
      - name: 'lvpNodeMountsConfig'
        type: NestedObject
        description: |
          Specifies the config for local PersistentVolumes backed
          by mounted node disks. These disks need to be formatted and mounted by the
          user, which can be done before or after cluster creation.
        required: true
        properties:
          - name: 'path'
            type: String
            description: |
              The host machine path.
            required: true
          - name: 'storageClass'
            type: String
            description: |
              The StorageClass name that PVs will be created with.
            required: true
  - name: 'proxy'
    type: NestedObject
    description: |
      Specifies the cluster proxy configuration.
    properties:
      - name: 'uri'
        type: String
        description: |
          Specifies the address of your proxy server.
          For example: http://domain
          WARNING: Do not provide credentials in the format
          of http://(username:password@)domain these will be rejected by the server.
        required: true
      - name: 'noProxy'
        type: Array
        description: |
          A list of IPs, hostnames, and domains that should skip the proxy.
          For example ["127.0.0.1", "example.com", ".corp", "localhost"].
        item_type:
          type: String
  - name: 'clusterOperations'
    type: NestedObject
    description: |
      Specifies the User Cluster's observability infrastructure.
    properties:
      - name: 'enableApplicationLogs'
        type: Boolean
        description: |
          Whether collection of application logs/metrics should be enabled (in addition to system logs/metrics).
  - name: 'maintenanceConfig'
    type: NestedObject
    description: |
      Specifies the workload node configurations.
    properties:
      - name: 'maintenanceAddressCidrBlocks'
        type: Array
        description: |
          All IPv4 address from these ranges will be placed into maintenance mode.
          Nodes in maintenance mode will be cordoned and drained. When both of these
          are true, the "baremetal.cluster.gke.io/maintenance" annotation will be set
          on the node resource.
        required: true
        item_type:
          type: String
  - name: 'nodeConfig'
    type: NestedObject
    description: |
      Specifies the workload node configurations.
    properties:
      - name: 'maxPodsPerNode'
        type: Integer
        description: |
          The maximum number of pods a node can run. The size of the CIDR range
          assigned to the node will be derived from this parameter.
        default_from_api: true
      - name: 'containerRuntime'
        type: Enum
        description: |
          The available runtimes that can be used to run containers in a Bare Metal User Cluster.
        default_from_api: true
        enum_values:
          - 'CONTAINER_RUNTIME_UNSPECIFIED'
          - 'DOCKER'
          - 'CONTAINERD'
  - name: 'nodeAccessConfig'
    type: NestedObject
    description: |
      Specifies the node access related settings for the bare metal user cluster.
    properties:
      - name: 'loginUser'
        type: String
        description: |
          LoginUser is the user name used to access node machines.
          It defaults to "root" if not set.
        required: false
        default_from_api: true
  - name: 'osEnvironmentConfig'
    type: NestedObject
    description: |
      OS environment related configurations.
    properties:
      - name: 'packageRepoExcluded'
        type: Boolean
        description: |
          Whether the package repo should not be included when initializing
          bare metal machines.
        required: true
  - name: 'securityConfig'
    type: NestedObject
    description: |
      Specifies the security related settings for the Bare Metal User Cluster.
    properties:
      - name: 'authorization'
        type: NestedObject
        description: |
          Configures user access to the Bare Metal User cluster.
        properties:
          - name: 'adminUsers'
            type: Array
            description: Users that will be granted the cluster-admin role on the
              cluster, providing full access to the cluster.
            required: true
            item_type:
              type: NestedObject
              properties:
                - name: 'username'
                  type: String
                  description: |
                    The name of the user, e.g. `my-gcp-id@gmail.com`.
                  required: true
  - name: 'binaryAuthorization'
    type: NestedObject
    description: Binary Authorization related configurations.
    properties:
      - name: 'evaluationMode'
        type: Enum
        description: |
          Mode of operation for binauthz policy evaluation. If unspecified,
          defaults to DISABLED.
        enum_values:
          - 'DISABLED'
          - 'PROJECT_SINGLETON_POLICY_ENFORCE'
  - name: 'upgradePolicy'
    type: NestedObject
    description: The cluster upgrade policy.
    properties:
      - name: 'policy'
        type: Enum
        description: Specifies which upgrade policy to use.
        enum_values:
          - 'SERIAL'
          - 'CONCURRENT'
  - name: 'uid'
    type: String
    description: |
      The unique identifier of the Bare Metal User Cluster.
    output: true
  - name: 'state'
    type: Enum
    description: The current state of this cluster.
    output: true
    enum_values:
      - 'STATE_UNSPECIFIED'
      - 'PROVISIONING'
      - 'RUNNING'
      - 'RECONCILING'
      - 'STOPPING'
      - 'ERROR'
      - 'DEGRADED'
  - name: 'endpoint'
    type: String
    description: |
      The IP address name of Bare Metal User Cluster's API server.
    output: true
  - name: 'reconciling'
    type: Boolean
    description: |
      If set, there are currently changes in flight to the Bare Metal User Cluster.
    output: true
  - name: 'createTime'
    type: Time
    description: |
      The time the cluster was created, in RFC3339 text format.
    output: true
  - name: 'updateTime'
    type: Time
    description: |
      The time the cluster was last updated, in RFC3339 text format.
    output: true
  - name: 'deleteTime'
    type: Time
    description: |
      The time the cluster was deleted, in RFC3339 text format.
    output: true
  - name: 'localName'
    type: String
    description: |
      The object name of the Bare Metal Cluster custom resource on the
      associated admin cluster. This field is used to support conflicting
      names when enrolling existing clusters to the API. When used as a part of
      cluster enrollment, this field will differ from the ID in the resource
      name. For new clusters, this field will match the user provided cluster ID
      and be visible in the last component of the resource name. It is not
      modifiable.
      All users should use this name to access their cluster using gkectl or
      kubectl and should expect to see the local name when viewing admin
      cluster controller logs.
    output: true
  - name: 'etag'
    type: String
    description: |
      This checksum is computed by the server based on the value of other
      fields, and may be sent on update and delete requests to ensure the
      client has an up-to-date value before proceeding.
      Allows clients to perform consistent read-modify-writes
      through optimistic concurrency control.
    output: true
  - name: 'fleet'
    type: NestedObject
    description: |
      Fleet related configuration.
      Fleets are a Google Cloud concept for logically organizing clusters,
      letting you use and manage multi-cluster capabilities and apply
      consistent policies across your systems.
      See [Anthos Fleets](https://cloud.google.com/anthos/multicluster-management/fleets) for
      more details on Anthos multi-cluster capabilities using Fleets.
    output: true
    properties:
      - name: 'membership'
        type: String
        description: |
          The name of the managed Hub Membership resource associated to this cluster.
          Membership names are formatted as
          `projects/<project-number>/locations/<location>/memberships/<cluster-id>`.
        output: true
  - name: 'status'
    type: NestedObject
    description: |
      Specifies detailed cluster status.
    output: true
    properties:
      - name: 'errorMessage'
        type: String
        description: |
          Human-friendly representation of the error message from the user cluster
          controller. The error message can be temporary as the user cluster
          controller creates a cluster or node pool. If the error message persists
          for a longer period of time, it can be used to surface error message to
          indicate real problems requiring user intervention.
        output: true
      - name: 'conditions'
        type: Array
        description: |
          ResourceConditions provide a standard mechanism for higher-level status reporting from user cluster controller.
        output: true
        item_type:
          type: NestedObject
          properties:
            - name: 'type'
              type: String
              description: |
                Type of the condition.
                (e.g., ClusterRunning, NodePoolRunning or ServerSidePreflightReady)
            - name: 'reason'
              type: String
              description: |
                Machine-readable message indicating details about last transition.
            - name: 'message'
              type: String
              description: |
                Human-readable message indicating details about last transition.
            - name: 'lastTransitionTime'
              type: Time
              description: |
                Last time the condition transit from one status to another.
              output: true
            - name: 'state'
              type: Enum
              description: The lifecycle state of the condition.
              output: true
              enum_values:
                - 'STATE_UNSPECIFIED'
                - 'STATE_TRUE'
                - 'STATE_FALSE'
                - 'STATE_UNKNOWN'
  - name: 'validationCheck'
    type: NestedObject
    description: |
      Specifies the security related settings for the Bare Metal User Cluster.
    output: true
    properties:
      - name: 'options'
        type: Enum
        description: Options used for the validation check.
        output: true
        enum_values:
          - 'OPTIONS_UNSPECIFIED'
          - 'SKIP_VALIDATION_CHECK_BLOCKING'
          - 'SKIP_VALIDATION_ALL'
      - name: 'status'
        type: NestedObject
        description: |
          Specifies the detailed validation check status
        output: true
        properties:
          - name: 'result'
            type: Array
            description: Individual checks which failed as part of the Preflight check
              execution.
            output: true
            item_type:
              type: NestedObject
              properties:
                - name: 'options'
                  type: Enum
                  description: Options used for the validation check.
                  output: true
                  enum_values:
                    - 'STATE_UNKNOWN'
                    - 'STATE_FAILURE'
                    - 'STATE_SKIPPED'
                    - 'STATE_UNKNOWN'
                    - 'STATE_FATAL'
                    - 'STATE_WARNING'
                - name: 'description'
                  type: String
                  description: |
                    The description of the validation check.
                  output: true
                - name: 'category'
                  type: String
                  description: |
                    The category of the validation.
                  output: true
                - name: 'reason'
                  type: String
                  description: |
                    A human-readable message of the check failure.
                  output: true
                - name: 'details'
                  type: String
                  description: |
                    Detailed failure information, which might be unformatted.
                  output: true
      - name: 'scenario'
        type: Enum
        description: The scenario when the preflight checks were run..
        output: true
        enum_values:
          - 'SCENARIO_UNSPECIFIED'
          - 'CREATE'
          - 'UPDATE'
