Skip to content
  • Max number of users:
  • Max recommended lifetime:
  • Storage:
  • Estimated running costs?:
  • Capability?:

Download

Start building your cluster by downloading the template.

heat_template_version: 2021-04-16
parameters:
  clustername:
    type: string
    label: Cluster Name
    description: The name to give the cluster

  external-network:
    type: string
    label: External Network Name
    description: The name of the external network to bridge network to

  network-cidr-pri:
    type: string
    label: Primary Nework CIDR
    description: Network CIDR to be used for primary network
    default: '10.100.0.0/16'

  ssh-key:
    type: string
    label: SSH Key for Access

  solo-image:
    type: string
    label: Flight Solo Image ID

  gateway-pri-ip:
    type: string
    label: Gateway Primary IP Address
    default: '10.100.0.101'

  gateway-flavour:
    type: string
    label: Gateway node flavour

resources:
  external-route:
    type: OS::Neutron::Router
    depends_on: cluster-network-pri
    properties:
      name: { list_join: ['-', [ {get_param: clustername}, 'ext-route']] }
      external_gateway_info:
        network: { get_param: external-network }

  external-route-iface:
    type: OS::Neutron::RouterInterface
    properties:
      router: { get_resource: external-route }
      subnet: { get_resource: cluster-network-pri }

  cluster-network:
    type: OS::Neutron::Net
    properties:
      name: { list_join: ['-', [{ get_param: clustername }, 'network']] }

  cluster-network-pri:
    type: OS::Neutron::Subnet
    properties:
      name: { list_join: ['-', [ {get_param: clustername}, 'network-pri']] }
      network: { get_resource: cluster-network }
      cidr: { get_param: network-cidr-pri }
      ip_version: 4

  cluster-sg:
    type: OS::Neutron::SecurityGroup
    properties:
      name: { list_join: ['-', [ {get_param: clustername}, 'network-pri-sg']] }
      rules:
        - direction: egress
          remote_ip_prefix: 0.0.0.0/0
        - direction: ingress
          remote_ip_prefix: { get_param: network-cidr-pri }
        - direction: ingress
          protocol: icmp
          remote_ip_prefix: 0.0.0.0/0
        - direction: ingress
          port_range_min: 22
          port_range_max: 22
          protocol: tcp
          remote_ip_prefix: 0.0.0.0/0
        - direction: ingress
          port_range_min: 80
          port_range_max: 80
          protocol: tcp
          remote_ip_prefix: 0.0.0.0/0
        - direction: ingress
          port_range_min: 443
          port_range_max: 443
          protocol: tcp
          remote_ip_prefix: 0.0.0.0/0
        - direction: ingress
          port_range_min: 5901
          port_range_max: 5911
          protocol: tcp
          remote_ip_prefix: 0.0.0.0/0

  gateway-pri-port:
    type: OS::Neutron::Port
    depends_on: cluster-network-pri
    properties:
      name: { list_join: ['-', ['gateway1', 'pri', { get_param: clustername }]] }
      network: { get_resource: cluster-network }
      security_groups:
        - { get_resource: cluster-sg }
      fixed_ips:
        - subnet: { get_resource: cluster-network-pri }
          ip_address: { get_param: gateway-pri-ip }

  gw:
    type: OS::Nova::Server
    properties:
      name: { list_join: ['.', ['gateway1', { get_param: clustername }, 'alces.network']] }
      flavor: { get_param: gateway-flavour }
      admin_user: flight
      networks:
          - port: { get_resource: gateway-pri-port }
      block_device_mapping_v2:
        - volume_id: { get_resource: gateway-vol }
          boot_index: 0
      user_data_format: RAW
      user_data:
        str_replace:
          template: |
            #cloud-config
            fqdn: gateway1.$clustername.alces.network
            users:
              - default
              - name: flight
                sudo: ALL=(ALL) NOPASSWD:ALL
                ssh-authorized-keys:
                  - $key
            write_files:
              - content: |
                  AUTOPARSEMATCH=$clustername
                  PROFILE_ANSWERS='{ "cluster_type": "openflight-jupyter-standalone", "cluster_name": "$clustername" }'
                  AUTOAPPLY="gateway: all-in-one"
                path: /opt/flight/cloudinit.in
                permissions: '0600'
                owner: root:root
              - content: |
                  # Generate password for flight user
                  FLIGHTPASS=$(cat /dev/urandom |tr -dc _A-Z-a-z-0-9 |head -c 8)
                  echo "$FLIGHTPASS" > /root/flight_user_pass.txt
                  # Ensure Flight Profile uses generated passwords
                  /opt/flight/bin/flight profile configure --answers "{ \"cluster_type\": \"openflight-jupyter-standalone\", \"default_password\": \"$FLIGHTPASS\"}" --accept-defaults
                path: /var/lib/firstrun/scripts/00-generate-passwords.bash
                permissions: '0600'
                owner: root:root
          params:
            $key: { get_param: ssh-key }
            $clustername: { get_param: clustername }

  gateway-vol:
    type: OS::Cinder::Volume
    properties:
      image: { get_param: solo-image }
      size: 100

  gateway-ip:
     type: "OS::Neutron::FloatingIP"
     properties:
        floating_network_id: {get_param: external-network}
        port_id: {get_resource: gateway-pri-port}

Use

This template requires that you have access to an OpenStack Private Cloud Environment which has the latest Flight Solo image available.

  1. Download the template provided above
  2. Launch the cluster (replacing mycluster1 with your desired cluster name)
    openstack stack create -t jupyterlab-jumpstart.yml \
        --parameter clustername=mycluster1 \
        --parameter external-network=dmz \
        --parameter ssh-key="ssh-rsa MyPublicKey" \
        --parameter solo-image="Flight Solo 2023.6" \
        --parameter gateway-flavour=m1.medium \
        "mycluster1" --wait
    

It will take about 10 minutes for the cluster to launch and fully configure itself to be ready for usage. Progress of the application can be verified as complete when flight profile list on gateway1 shows a status of complete.

Once launched, you can access the cluster via ssh to the public IP of gateway1 as the user flight with the private key that corresponds with the ssh-key parameter.

Accessing System

Once launched, you can access the cluster via ssh to the public IP of gateway1 as the user flight with the private key that corresponds with the ssh-key parameter.

The Flight Web Suite is automatically configured on the system and is accessible at the public IP of gateway1. JupyterLab can also be accessed via the Flight Web Suite.

The password for both Flight Web Suite and JupyterLab is auto-generated at launch and is available at /root/flight_user_pass.txt on gateway1.

Copying Data Across

The IP address of the gateway1 node should be shared with you by the system administrator for this cluster. Once received, see the HPC Environment Basics guide to Working with Data and Files.

Additionally, data can be copied to the cluster using the Flight File Manager in Flight Web Suite.

Watch