From 0401f6f2bddc5e71a139f1f1b025542ab030294b Mon Sep 17 00:00:00 2001
From: Simon Pasquier <simon.pasquier@bull.net>
Date: Tue, 3 Sep 2013 11:44:18 +0200
Subject: [PATCH] Adding multi-node DevStack template for Ubuntu

Adding a template that deploys a multi-node OpenStack installation using
DevStack. This template has been tested on Ubuntu and may work as-is on
Debian too.

Note that the security group resources require to use Neutron and Havana
Heat.

Change-Id: Ibdf4fe7407913f75b2253b09639554c013d31c01
---
 cfn/deb/MultiNode_DevStack.yaml | 450 ++++++++++++++++++++++++++++++++
 1 file changed, 450 insertions(+)
 create mode 100644 cfn/deb/MultiNode_DevStack.yaml

diff --git a/cfn/deb/MultiNode_DevStack.yaml b/cfn/deb/MultiNode_DevStack.yaml
new file mode 100644
index 00000000..ed938ccb
--- /dev/null
+++ b/cfn/deb/MultiNode_DevStack.yaml
@@ -0,0 +1,450 @@
+HeatTemplateFormatVersion: '2012-12-12'
+Description: "Setup a multi-node OpenStack installation using DevStack. By
+default, it will start one controller node and one compute node. To start the
+services, login to each node and run: cd /opt/devstack && ./stack.sh
+
+Tested on Ubuntu and may work as-is on Debian too. Note also that the
+security group resources require to use Neutron and Havana Heat."
+
+Parameters:
+  KeyName:
+    Description: Name of an existing KeyPair to enable SSH access to the instances
+    Type: String
+  ComputeNodes:
+    Default: '1'
+    MinValue: '0'
+    Description: Number of compute nodes
+    Type: Number
+  ControllerFlavor:
+    Description: Instance flavor of the Controller node
+    Type: String
+    Default: m1.medium
+    AllowedValues: [m1.tiny, m1.small, m1.medium, m1.large, m1.xlarge]
+    ConstraintDescription: must be a valid instance type.
+  ComputeFlavor:
+    Description: Instance flavor of the Compute node(s)
+    Type: String
+    Default: m1.small
+    AllowedValues: [m1.tiny, m1.small, m1.medium, m1.large, m1.xlarge]
+    ConstraintDescription: must be a valid instance type.
+  LinuxDistribution:
+    Default: precise
+    Description: Distribution of choice
+    Type: String
+    AllowedValues: [precise, quantal, raring, saucy]
+  AdminPassword:
+    Default: password
+    Description: Password for the OpenStack admin user
+    Type: String
+  Virtualization:
+    Default: kvm
+    Description: Virtualization technology
+    Type: String
+    AllowedValues: [kvm, lxc]
+
+Mappings:
+  AWSInstanceType2Arch:
+    m1.tiny: {Arch: '32'}
+    m1.small: {Arch: '32'}
+    m1.medium: {Arch: '64'}
+    m1.large: {Arch: '64'}
+    m1.xlarge: {Arch: '64'}
+  DistroArch2AMI:
+    precise: {'32': precise-server-cloudimg-i386, '64': precise-server-cloudimg-amd64}
+    quantal: {'32': quantal-server-cloudimg-i386, '64': quantal-server-cloudimg-amd64}
+    raring: {'32': raring-server-cloudimg-i386, '64': raring-server-cloudimg-amd64}
+    saucy: {'32': saucy-server-cloudimg-i386, '64': saucy-server-cloudimg-amd64}
+
+Resources:
+
+  IPAddress: {Type: 'AWS::EC2::EIP'}
+
+  IPAssoc:
+    Type: AWS::EC2::EIPAssociation
+    Properties:
+      InstanceId: {Ref: OsController}
+      EIP: {Ref: IPAddress}
+
+  CfnUser:
+    Type: AWS::IAM::User
+
+  CfnUserKey:
+    Type: AWS::IAM::AccessKey
+    Properties:
+      UserName: {Ref: CfnUser}
+
+  OsControllerWaitHandle:
+    Type: AWS::CloudFormation::WaitConditionHandle
+
+  OsControllerWaitCondition:
+    Type: AWS::CloudFormation::WaitCondition
+    DependsOn: OsController
+    Properties:
+      Handle: {Ref: OsControllerWaitHandle}
+      Count: '1'
+      Timeout: '600'
+
+  OsComputeSecurityGroup:
+    Type: AWS::EC2::SecurityGroup
+    Properties:
+      GroupDescription: Enable SSH access
+      VpcId: abcd
+      SecurityGroupIngress:
+      - {CidrIp: 0.0.0.0/0, FromPort: '-1', IpProtocol: icmp, ToPort: '-1'}
+      - {CidrIp: 0.0.0.0/0, FromPort: '22', IpProtocol: tcp, ToPort: '22'}
+
+  OsControllerSecurityGroup:
+    Type: AWS::EC2::SecurityGroup
+    Properties:
+      GroupDescription: Enable HTTP access via port 80 plus SSH access
+      VpcId: abcd
+      SecurityGroupIngress:
+      - {CidrIp: 0.0.0.0/0, FromPort: '-1', IpProtocol: icmp, ToPort: '-1'}
+      - {CidrIp: 0.0.0.0/0, FromPort: '80', IpProtocol: tcp, ToPort: '80'}
+      - {CidrIp: 0.0.0.0/0, FromPort: '22', IpProtocol: tcp, ToPort: '22'}
+
+  OsDefaultSecurityGroup:
+    Type: AWS::EC2::SecurityGroup
+    Properties:
+      GroupDescription: Enable all traffic between controller & compute nodes
+      VpcId: neutron
+      SecurityGroupIngress:
+      - {SourceSecurityGroupId: {Ref: OsControllerSecurityGroup}}
+      - {SourceSecurityGroupId: {Ref: OsComputeSecurityGroup}}
+
+  OsComputeGroup:
+    Type: OS::Heat::InstanceGroup
+    Properties:
+      LaunchConfigurationName: {Ref: OsComputeConfig}
+      Size: {Ref: ComputeNodes}
+      AvailabilityZones: {'Fn::GetAZs': ''}
+
+  OsComputeConfig:
+    Type: AWS::AutoScaling::LaunchConfiguration
+    Metadata:
+      AWS::CloudFormation::Init:
+        config:
+          packages: {}
+          services: {}
+          files:
+            # Create a YAML reference that will be used by other resources (eg OsController)
+            /etc/cfn/cfn-credentials: &cfn-credentials-file
+              content:
+                Fn::Join:
+                - ''
+                - - AWSAccessKeyId=
+                  - {Ref : CfnUserKey}
+                  - '
+
+                    '
+                  - AWSSecretKey=
+                  - 'Fn::GetAtt': [CfnUserKey, SecretAccessKey]
+                  - '
+
+                    '
+              mode: "00400"
+              owner: root
+              group: root
+    Properties:
+      ImageId:
+        Fn::FindInMap:
+        - DistroArch2AMI
+        - {Ref: LinuxDistribution}
+        - Fn::FindInMap:
+          - AWSInstanceType2Arch
+          - {Ref: ComputeFlavor}
+          - Arch
+      InstanceType: {Ref: ComputeFlavor}
+      KeyName: {Ref: KeyName}
+      SecurityGroups:
+      - {Ref: OsComputeSecurityGroup}
+      - {Ref: OsDefaultSecurityGroup}
+      UserData:
+        Fn::Base64:
+          Fn::Join:
+          - ''
+          - - '#!/bin/bash -ve
+
+              '
+            - 'cd /opt
+
+              '
+            - 'apt-get update; apt-get install -y git python-setuptools;
+
+              '
+            - '# Install heat cfn tools
+
+              '
+            - 'apt-get -y install python-argparse cloud-init python-psutil python-pip python-dev
+
+              '
+            - 'apt-get -y remove python-boto
+
+              '
+            - 'pip install ''boto==2.5.2'' heat-cfntools
+
+              '
+            - 'cfn-create-aws-symlinks -s /usr/local/bin/
+
+              '
+            - '/opt/aws/bin/cfn-init
+
+              '
+            - '# Download DevStack from Github
+
+              '
+            - 'git clone https://github.com/openstack-dev/devstack.git
+
+              '
+            - 'cd devstack
+
+              '
+            - '# Boostrap localrc'
+            - '
+
+              '
+            - 'MY_IPV4=$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4/)
+
+              '
+            - cat << EOF >> localrc
+            - '
+
+              '
+            - ADMIN_PASSWORD=
+            - {Ref: AdminPassword}
+            - '
+
+              '
+            - 'MYSQL_PASSWORD=password
+
+              RABBIT_PASSWORD=password
+
+              SERVICE_PASSWORD=password
+
+              SERVICE_TOKEN=tokentoken
+
+              '
+            - 'LOGFILE=/opt/stack/data/stack.log
+
+              '
+            - 'ENABLED_SERVICES=n-cpu,rabbit,neutron,q-agt,q-dhcp
+
+              '
+            - LIBVIRT_TYPE=
+            - {Ref: Virtualization}
+            - '
+
+              '
+            - 'HOST_IP=$MY_IPV4
+
+              '
+            - SERVICE_HOST=
+            - Fn::GetAtt: [OsController, PrivateIp]
+            - '
+
+              '
+            - 'ENABLE_TENANT_TUNNELS=True
+
+              Q_AGENT_EXTRA_AGENT_OPTS=(tunnel_type=gre)
+
+              Q_DHCP_EXTRA_DHCP_OPTS=(dhcp_agents_per_network='
+            - {Ref: ComputeNodes}
+            - ')
+
+              Q_AGENT_EXTRA_OVS_OPTS=(tenant_network_type=gre)
+
+              '
+            - 'Q_USE_NAMESPACE=True
+
+              Q_USE_SECGROUP=True
+
+              '
+            - 'MYSQL_HOST=\$SERVICE_HOST
+
+              '
+            - 'RABBIT_HOST=\$SERVICE_HOST
+
+              '
+            - 'Q_HOST=\$SERVICE_HOST
+
+              '
+            - 'GLANCE_HOSTPORT=\$SERVICE_HOST:9292
+
+              '
+            - 'EOF
+
+              '
+            - 'chown -R ec2-user:ec2-user /opt/devstack
+
+              '
+  OsController:
+    Type: AWS::EC2::Instance
+    Metadata:
+      AWS::CloudFormation::Init:
+        config:
+          packages: {}
+          services: {}
+          files:
+            /etc/cfn/cfn-credentials: *cfn-credentials-file
+    Properties:
+      ImageId:
+        Fn::FindInMap:
+        - DistroArch2AMI
+        - {Ref: LinuxDistribution}
+        - Fn::FindInMap:
+          - AWSInstanceType2Arch
+          - {Ref: ControllerFlavor}
+          - Arch
+      InstanceType: {Ref: ControllerFlavor}
+      KeyName: {Ref: KeyName}
+      SecurityGroups:
+      - {Ref: OsControllerSecurityGroup}
+      - {Ref: OsDefaultSecurityGroup}
+      UserData:
+        Fn::Base64:
+          Fn::Join:
+          - ''
+          - - '#!/bin/bash -ve
+
+              '
+            - 'cd /opt
+
+              '
+            - 'apt-get update; apt-get install -y git;
+
+              '
+            - '# Install heat cfn tools
+
+              '
+            - 'apt-get -y install python-argparse cloud-init python-psutil python-pip
+
+              '
+            - 'apt-get -y remove python-boto
+
+              '
+            - 'pip install ''boto==2.5.2'' heat-cfntools
+
+              '
+            - 'cfn-create-aws-symlinks -s /usr/local/bin/
+
+              '
+            - '/opt/aws/bin/cfn-init --region '
+            - {Ref: 'AWS::Region'}
+            - ' -s '
+            - {Ref: 'AWS::StackName'}
+            - ' -r OsController --access-key '
+            - {Ref: CfnUserKey}
+            - ' --secret-key '
+            - 'Fn::GetAtt': [CfnUserKey, SecretAccessKey]
+            - '
+
+              '
+            - '# Download DevStack from Github'
+            - '
+
+              '
+            - 'git clone https://github.com/openstack-dev/devstack.git
+
+              '
+            - 'cd devstack
+
+              '
+            - '# Boostrap localrc'
+            - 'MY_IPV4=$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4/)
+
+              '
+            - '
+
+              '
+            - cat << EOF >> localrc
+            - '
+
+              '
+            - ADMIN_PASSWORD=
+            - {Ref: AdminPassword}
+            - '
+
+              '
+            - 'MYSQL_PASSWORD=password
+
+              RABBIT_PASSWORD=password
+
+              SERVICE_PASSWORD=password
+
+              SERVICE_TOKEN=tokentoken
+
+              '
+            - 'LOGFILE=/opt/stack/data/stack.log
+
+              '
+            - 'HOST_IP=$MY_IPV4
+
+              '
+            - 'ENABLE_TENANT_TUNNELS=True
+
+              Q_AGENT_EXTRA_AGENT_OPTS=(tunnel_type=gre)
+
+              Q_AGENT_EXTRA_OVS_OPTS=(tenant_network_type=gre)
+
+              Q_SRV_EXTRA_OPTS=(tenant_network_type=gre)
+
+              '
+            - 'Q_USE_NAMESPACE=True
+
+              Q_USE_SECGROUP=True
+
+              '
+            - LIBVIRT_TYPE=
+            - {Ref: Virtualization}
+            - '
+
+              '
+            - 'disable_service n-net
+
+              '
+            - 'disable_service n-cpu
+
+              '
+            - 'enable_service q-svc
+
+              '
+            - 'enable_service q-agt
+
+              '
+            - 'enable_service q-l3
+
+              '
+            - 'enable_service q-meta
+
+              '
+            - 'enable_service neutron
+
+              '
+            - 'ENABLED_SERVICES+=,heat,h-api,h-api-cfn,h-api-cw,h-eng
+
+              '
+            - 'EOF
+
+              '
+            - 'chown -R ec2-user:ec2-user /opt/devstack
+
+              '
+            - "/opt/aws/bin/cfn-signal -e 0 '"
+            - {Ref: OsControllerWaitHandle}
+            - "'"
+
+Outputs:
+  Horizon URL:
+    Value:
+      Fn::Join:
+      - ''
+      - - http://
+        - {Ref: IPAddress}
+        - /
+    Description: URL for Horizon dashboard
+  Horizon user:
+    Value: admin
+    Description: Username for Horizon dashboard
+  Horizon password:
+    Value: {Ref: AdminPassword}
+    Description: Password for Horizon dashboard