heat_template_version: 2016-10-14

description: OpenShift cluster server

parameters:

  name:
    type: string
    label: Name
    description: Name

  group:
    type: string
    label: Host Group
    description: The Primary Ansible Host Group
    default: host

  cluster_env:
    type: string
    label: Cluster environment
    description: Environment of the cluster

  cluster_id:
    type: string
    label: Cluster ID
    description: Identifier of the cluster

  type:
    type: string
    label: Type
    description: Type master or node

  subtype:
    type: string
    label: Sub-type
    description: Sub-type compute or infra for nodes, default otherwise
    default: default

  key_name:
    type: string
    label: Key name
    description: Key name of keypair

  image:
    type: string
    label: Image
    description: Name of the image

  flavor:
    type: string
    label: Flavor
    description: Name of the flavor

  net:
    type: string
    label: Net ID
    description: Net resource

  net_name:
    type: string
    label: Net name
    description: Net name

{% if not provider_network %}
  subnet:
    type: string
    label: Subnet ID
    description: Subnet resource
{% endif %}

{% if openshift_use_flannel|default(False)|bool %}
  attach_data_net:
    type: boolean
    default: false
    label: Attach-data-net
    description: A switch for data port connection

  data_net:
    type: string
    default: ''
    label: Net ID
    description: Net resource

{% if not provider_network %}
  data_subnet:
    type: string
    default: ''
    label: Subnet ID
    description: Subnet resource
{% endif %}
{% endif %}

  secgrp:
    type: comma_delimited_list
    label: Security groups
    description: Security group resources

  attach_float_net:
    type: boolean
    default: true

    label: Attach-float-net
    description: A switch for floating network port connection

{% if not provider_network %}
  floating_network:
    type: string
    default: ''
    label: Floating network
    description: Network to allocate floating IP from
{% endif %}

  availability_zone:
    type: string
    description: The Availability Zone to launch the instance.
    default: nova

  volume_size:
    type: number
    description: Size of the volume to be created.
    default: 1
    constraints:
      - range: { min: 1, max: 1024 }
        description: must be between 1 and 1024 Gb.

  node_labels:
    type: json
    description: OpenShift Node Labels
    default: {"region": "default" }

  scheduler_hints:
    type: json
    description: Server scheduler hints.
    default: {}

outputs:

  name:
    description: Name of the server
    value: { get_attr: [ server, name ] }

  private_ip:
    description: Private IP of the server
    value:
      get_attr:
        - server
        - addresses
        - { get_param: net_name }
        - 0
        - addr

  floating_ip:
    description: Floating IP of the server
    value:
      get_attr:
        - server
        - addresses
        - { get_param: net_name }
{% if provider_network %}
        - 0
{% else %}
        - 1
{% endif %}
        - addr

conditions:
  no_floating: {not: { get_param: attach_float_net} }
{% if openshift_use_flannel|default(False)|bool %}
  no_data_subnet: {not: { get_param: attach_data_net} }
{% endif %}

resources:

  server:
    type: OS::Nova::Server
    properties:
      name:      { get_param: name }
      key_name:  { get_param: key_name }
      image:     { get_param: image }
      flavor:    { get_param: flavor }
      networks:
{% if openshift_use_flannel|default(False)|bool %}
        if:
          - no_data_subnet
{% if use_trunk_ports|default(false)|bool %}
          - - port:  { get_attr: [trunk-port, port_id] }
{% else %}
          - - port:  { get_resource: port }
{% endif %}
{% if use_trunk_ports|default(false)|bool %}
          - - port:  { get_attr: [trunk-port, port_id] }
{% else %}
          - - port:  { get_resource: port }
            - port:  { get_resource: data_port }
{% endif %}

{% else %}
{% if use_trunk_ports|default(false)|bool %}
        - port:  { get_attr: [trunk-port, port_id] }
{% else %}
        - port:  { get_resource: port }
{% endif %}
{% endif %}
      user_data:
        get_file: user-data
      user_data_format: RAW
      user_data_update_policy: IGNORE
      metadata:
        group: { get_param: group }
        environment: { get_param: cluster_env }
        clusterid: { get_param: cluster_id }
        host-type: { get_param: type }
        sub-host-type:    { get_param: subtype }
        node_labels: { get_param: node_labels }
      scheduler_hints: { get_param: scheduler_hints }

{% if use_trunk_ports|default(false)|bool %}
  trunk-port:
    type: OS::Neutron::Trunk
    properties:
      name: { get_param: name }
      port: { get_resource: port }
{% endif %}

  port:
    type: OS::Neutron::Port
    properties:
      network: { get_param: net }
{% if not provider_network %}
      fixed_ips:
        - subnet: { get_param: subnet }
{% endif %}
      security_groups: { get_param: secgrp }

{% if openshift_use_flannel|default(False)|bool %}
  data_port:
    type: OS::Neutron::Port
    condition: { not: no_data_subnet }
    properties:
      network: { get_param: data_net }
      port_security_enabled: false
{% if not provider_network %}
      fixed_ips:
        - subnet: { get_param: data_subnet }
{% endif %}
{% endif %}

{% if not provider_network %}
  floating-ip:
    condition: { not: no_floating }
    type: OS::Neutron::FloatingIP
    properties:
      floating_network: { get_param: floating_network }
      port_id: { get_resource: port }
{% endif %}

{% if not ephemeral_volumes|default(false)|bool %}
  cinder_volume:
    type: OS::Cinder::Volume
    properties:
      size: { get_param: volume_size }
      availability_zone: { get_param: availability_zone }

  volume_attachment:
    type: OS::Cinder::VolumeAttachment
    properties:
      volume_id: { get_resource: cinder_volume }
      instance_uuid: { get_resource: server }
      mountpoint: /dev/sdb
{% endif %}
