Install the CORD-in-a-Box head node into the 'prod' VM

Change-Id: I121130e21ae4268a9dbc9d0a6fb8ff8095ffdcc7
diff --git a/ansible/add-extra-drive.yml b/ansible/add-extra-drive.yml
new file mode 100644
index 0000000..22a3a1b
--- /dev/null
+++ b/ansible/add-extra-drive.yml
@@ -0,0 +1,5 @@
+- hosts: localhost
+  remote_user: vagrant
+  serial: 1
+  roles:
+    - extra-drive
diff --git a/ansible/maas-provision.yml b/ansible/maas-provision.yml
new file mode 100644
index 0000000..9b180c5
--- /dev/null
+++ b/ansible/maas-provision.yml
@@ -0,0 +1,5 @@
+- hosts: localhost
+  remote_user: vagrant
+  serial: 1
+  roles:
+    - maas-provision
diff --git a/ansible/roles/extra-drive/defaults/main.yml b/ansible/roles/extra-drive/defaults/main.yml
new file mode 100644
index 0000000..1d16dac
--- /dev/null
+++ b/ansible/roles/extra-drive/defaults/main.yml
@@ -0,0 +1,6 @@
+extra_disk_dev: /dev/vda
+
+extra_disk_links:
+ - { src: /mnt/lxd, dest: /var/lib/lxd }
+ - { src: /mnt/docker-registry, dest: /docker-registry }
+ - { src: /mnt/lxcfs, dest: /var/lib/lxcfs }
diff --git a/ansible/roles/extra-drive/tasks/main.yml b/ansible/roles/extra-drive/tasks/main.yml
new file mode 100644
index 0000000..edf6bde
--- /dev/null
+++ b/ansible/roles/extra-drive/tasks/main.yml
@@ -0,0 +1,36 @@
+- name: Check if the disk is partitioned
+  stat: path={{ extra_disk_dev }}1
+  register: device_stat
+
+- name: Set disk label
+  command: parted {{ extra_disk_dev }} mklabel msdos
+  when: device_stat.stat.exists == false
+
+- name: Create primary partition
+  command: parted {{ extra_disk_dev }} mkpart primary 1 100%
+  when: device_stat.stat.exists == false
+
+- name: Make filesystem
+  filesystem:
+    fstype: ext4
+    dev: "{{ extra_disk_dev }}1"
+
+- name: Mount extra disk
+  mount:
+    name: /mnt
+    src: "{{ extra_disk_dev }}1"
+    fstype: ext4
+    state: mounted
+
+- name: Create directories
+  file:
+    path: "{{ item.src }}"
+    state: directory
+  with_items: "{{ extra_disk_links }}"
+
+- name: Set up links
+  file:
+    src: "{{ item.src }}"
+    dest: "{{ item.dest }}"
+    state: link
+  with_items: "{{ extra_disk_links }}"
diff --git a/ansible/roles/maas-provision/tasks/main.yml b/ansible/roles/maas-provision/tasks/main.yml
new file mode 100644
index 0000000..32e43ea
--- /dev/null
+++ b/ansible/roles/maas-provision/tasks/main.yml
@@ -0,0 +1,37 @@
+# Doesn't seem to be a MAAS module for Ansible yet
+- name: Get MAAS credentials
+  become: yes
+  command: maas-region-admin apikey --username=cord
+  register: maas_key
+  tags:
+    - skip_ansible_lint
+
+- name: Login to MAAS
+  command: maas login cord http://localhost/MAAS/api/1.0 {{ maas_key.stdout }}
+  tags:
+    - skip_ansible_lint
+
+- name: Wait for node to become ready
+  shell: maas cord nodes list|jq -r '.[] | select(.status == 0).system_id'
+  register: nodeid
+  until: nodeid.stdout
+  retries: 40
+  delay: 15
+  tags:
+    - skip_ansible_lint
+
+# We need to be able to reboot the VM on the physical server running CiaB
+- name: Add remote power state
+  command: maas cord node update {{ nodeid.stdout }} power_type="virsh" power_parameters_power_address="qemu+ssh://{{ maas_user }}@10.100.198.1/system" power_parameters_power_id="{{ vagrant_name }}"
+  tags:
+    - skip_ansible_lint
+
+- name: Wait for node to be fully provisioned
+  become: yes
+  shell: /usr/local/bin/get-node-prov-state |jq '.[] | select(.id == "{{ nodeid.stdout }}").status'
+  register: prov_state
+  until: prov_state.stdout == "2"
+  retries: 80
+  delay: 30
+  tags:
+    - skip_ansible_lint
diff --git a/ansible/roles/vlan-stag-ctag/defaults/main.yml b/ansible/roles/vlan-stag-ctag/defaults/main.yml
new file mode 100644
index 0000000..575532f
--- /dev/null
+++ b/ansible/roles/vlan-stag-ctag/defaults/main.yml
@@ -0,0 +1,3 @@
+olt_if: eth1
+s_tag: 222
+c_tag: 111
diff --git a/ansible/roles/vlan-stag-ctag/handlers/main.yml b/ansible/roles/vlan-stag-ctag/handlers/main.yml
new file mode 100644
index 0000000..fdeefb2
--- /dev/null
+++ b/ansible/roles/vlan-stag-ctag/handlers/main.yml
@@ -0,0 +1,2 @@
+- name: Reboot node
+  command: shutdown -r now
diff --git a/ansible/roles/vlan-stag-ctag/tasks/main.yml b/ansible/roles/vlan-stag-ctag/tasks/main.yml
new file mode 100644
index 0000000..c4c325c
--- /dev/null
+++ b/ansible/roles/vlan-stag-ctag/tasks/main.yml
@@ -0,0 +1,8 @@
+- name: Set up /etc/rc.local (creates VLAN interfaces)
+  template:
+    src: templates/rc.local.j2
+    dest: /etc/rc.local
+    mode: 0755
+    owner: root
+  notify:
+    - Reboot node
diff --git a/ansible/roles/vlan-stag-ctag/templates/rc.local.j2 b/ansible/roles/vlan-stag-ctag/templates/rc.local.j2
new file mode 100644
index 0000000..4632053
--- /dev/null
+++ b/ansible/roles/vlan-stag-ctag/templates/rc.local.j2
@@ -0,0 +1,13 @@
+#!/bin/sh -e
+
+# Set up VLAN tagging interface ("simulated OLT")
+ip link add link {{ olt_if }} name {{ olt_if }}.{{ s_tag }} type vlan id {{ s_tag }}
+ip link add link {{ olt_if }}.{{ s_tag }} name {{ olt_if }}.{{ s_tag }}.{{ c_tag }} type vlan id {{ c_tag }}
+ifconfig {{ olt_if }} up
+ifconfig {{ olt_if }}.{{ s_tag }} up
+ifconfig {{ olt_if }}.{{ s_tag }}.{{ c_tag }} up
+
+# Get IP address from vSG
+dhclient {{ olt_if }}.{{ s_tag }}.{{ c_tag }}
+
+exit 0
diff --git a/ansible/testclient.yml b/ansible/testclient.yml
new file mode 100644
index 0000000..404cecc
--- /dev/null
+++ b/ansible/testclient.yml
@@ -0,0 +1,5 @@
+- hosts: localhost
+  remote_user: vagrant
+  serial: 1
+  roles:
+    - vlan-stag-ctag