Vagrant box for development use.

vagrant up onosdev sets up a vm with three lxc instances
which should be used with the lxc cell.

Change-Id: I18b5cc5366efc61f05063798b498559eb49a8eff
diff --git a/tools/dev/vagrant/ansible/ansible.cfg b/tools/dev/vagrant/ansible/ansible.cfg
new file mode 100644
index 0000000..bd331b2
--- /dev/null
+++ b/tools/dev/vagrant/ansible/ansible.cfg
@@ -0,0 +1,9 @@
+[defaults]
+callback_plugins=/etc/ansible/callback_plugins/
+host_key_checking=False
+deprecation_warnings=False
+
+[privilege_escalation]
+become=True
+become_method=sudo
+become_user=root
diff --git a/tools/dev/vagrant/ansible/onosdev.retry b/tools/dev/vagrant/ansible/onosdev.retry
new file mode 100644
index 0000000..2fbb50c
--- /dev/null
+++ b/tools/dev/vagrant/ansible/onosdev.retry
@@ -0,0 +1 @@
+localhost
diff --git a/tools/dev/vagrant/ansible/onosdev.yml b/tools/dev/vagrant/ansible/onosdev.yml
new file mode 100644
index 0000000..cd7a5a5
--- /dev/null
+++ b/tools/dev/vagrant/ansible/onosdev.yml
@@ -0,0 +1,8 @@
+- hosts: localhost
+  remote_user: vagrant
+  serial: 1
+  roles:
+    - common
+    - brctl
+    - java8-oracle
+    - lxc
diff --git a/tools/dev/vagrant/ansible/roles/brctl/tasks/main.yml b/tools/dev/vagrant/ansible/roles/brctl/tasks/main.yml
new file mode 100644
index 0000000..002509a
--- /dev/null
+++ b/tools/dev/vagrant/ansible/roles/brctl/tasks/main.yml
@@ -0,0 +1,37 @@
+- name: Bridge onosbr0 is present
+  become: yes
+  template:
+    src: templates/create_bridge.j2
+    dest: /etc/network/if-pre-up.d/create_bridge_{{ networks.bridge_name }}
+    owner: root
+    group: root
+    mode: 0755
+
+- name: eth1 is in onosbr0
+  become: yes
+  template:
+    src: templates/add_iface.j2
+    dest: /etc/network/if-pre-up.d/add_iface_{{ interfaces.hostonly }}
+    owner: root
+    group: root
+    mode: 0755
+
+- name: Activate onos bridge
+  become: yes
+  command: /etc/network/if-pre-up.d/create_bridge_{{ networks.bridge_name }} report-changed
+  register: bridge_changed
+  changed_when: bridge_changed.stdout == 'true'
+
+- name: Activate eth1 in bridge
+  become: yes
+  command: /etc/network/if-pre-up.d/add_iface_{{ interfaces.hostonly }} report-changed
+  register: bridge_iface_changed
+  changed_when: bridge_iface_changed == 'true'
+
+- name: Flush ip of eth1
+  become: yes
+  command: /sbin/ip addr flush {{ interfaces.hostonly }}
+
+- name: bring onosbr0 up
+  become: yes
+  command: /sbin/ifconfig onosbr0 up
diff --git a/tools/dev/vagrant/ansible/roles/brctl/templates/add_iface.j2 b/tools/dev/vagrant/ansible/roles/brctl/templates/add_iface.j2
new file mode 100644
index 0000000..f09bd50
--- /dev/null
+++ b/tools/dev/vagrant/ansible/roles/brctl/templates/add_iface.j2
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+REPORT_CHANGED=0
+if [ $# -gt 0 ]; then
+    REPORT_CHANGED=1
+fi
+CHANGED='false'
+
+FOUND=$(brctl show | grep "^{{ interfaces.hostonly }}" | wc -l)
+if [ $FOUND -eq 0 ]; then
+    CHANGED='true'
+    brctl addif {{ networks.bridge_name }} {{ interfaces.hostonly }}
+fi
+
+if [ $REPORT_CHANGED -ne 0 ]; then
+    echo -n $CHANGED
+fi
diff --git a/tools/dev/vagrant/ansible/roles/brctl/templates/create_bridge.j2 b/tools/dev/vagrant/ansible/roles/brctl/templates/create_bridge.j2
new file mode 100644
index 0000000..5f12261
--- /dev/null
+++ b/tools/dev/vagrant/ansible/roles/brctl/templates/create_bridge.j2
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+REPORT_CHANGED=0
+if [ $# -gt 0 ]; then
+    REPORT_CHANGED=1
+fi
+CHANGED='false'
+
+FOUND=$(brctl show | grep "^{{ networks.bridge_name }}" | wc -l)
+if [ $FOUND -eq 0 ]; then
+    CHANGED='true'
+    brctl addbr {{ networks.bridge_name }}
+fi
+
+if [ $REPORT_CHANGED -ne 0 ]; then
+    echo -n $CHANGED
+fi
diff --git a/tools/dev/vagrant/ansible/roles/brctl/vars/main.yml b/tools/dev/vagrant/ansible/roles/brctl/vars/main.yml
new file mode 100644
index 0000000..5c705ac
--- /dev/null
+++ b/tools/dev/vagrant/ansible/roles/brctl/vars/main.yml
@@ -0,0 +1,9 @@
+interfaces:
+    hostonly: "{{ hostonly_iface | default('eth1') }}"
+
+networks:
+    # CHANGE:
+    #   'bridge' name of the bridge to create that is used when connecting
+    #            the LXC containers
+    bridge_name: "{{ bridge_name | default('onosbr0') }}"
+    bridge: "{{ bridge_network | default('10.100.198.200/24') }}"
diff --git a/tools/dev/vagrant/ansible/roles/common/defaults/main.yml b/tools/dev/vagrant/ansible/roles/common/defaults/main.yml
new file mode 100644
index 0000000..cd8a8e3
--- /dev/null
+++ b/tools/dev/vagrant/ansible/roles/common/defaults/main.yml
@@ -0,0 +1,6 @@
+hosts: [
+  { host_ip: "10.100.198.200", host_name: "onosdev"},
+  { host_ip: "10.100.198.201", host_name: "onos1"},
+  { host_ip: "10.100.198.202", host_name: "onos2"},
+  { host_ip: "10.100.198.203", host_name: "onos3"},
+]
diff --git a/tools/dev/vagrant/ansible/roles/common/tasks/main.yml b/tools/dev/vagrant/ansible/roles/common/tasks/main.yml
new file mode 100644
index 0000000..d03f8ec
--- /dev/null
+++ b/tools/dev/vagrant/ansible/roles/common/tasks/main.yml
@@ -0,0 +1,42 @@
+- name: bridge-utils is present
+  apt:
+    name: bridge-utils
+    force: yes
+  tags: [common]
+
+- name: lxc is present
+  apt:
+    name: lxc
+    force: yes
+  tags: [common]
+
+- name: python-dev is present
+  apt:
+    name: python-dev
+    force: yes
+  tags: [common]
+
+- name: lxc-dev is present
+  apt:
+    name: lxc-dev
+    force: yes
+  tags: [common]
+
+- name: python-pip is present
+  apt:
+    name: python-pip
+    force: yes
+  tags: [common]
+
+- name: python3-lxc is present
+  pip:
+    name: lxc-python2
+    state: present
+  tags: [common]
+- name: Host is present
+  lineinfile:
+    dest: /etc/hosts
+    regexp: "^{{ item.host_ip }}"
+    line: "{{ item.host_ip }} {{ item.host_name }}"
+  with_items: hosts
+  tags: [common]
diff --git a/tools/dev/vagrant/ansible/roles/java8-oracle/meta/main.yml b/tools/dev/vagrant/ansible/roles/java8-oracle/meta/main.yml
new file mode 100644
index 0000000..a51875b
--- /dev/null
+++ b/tools/dev/vagrant/ansible/roles/java8-oracle/meta/main.yml
@@ -0,0 +1,15 @@
+---
+galaxy_info:
+  author: Ciena Blueplanet
+  description: Java 8 from Oracle
+  company: Ciena Blueplanet
+  license: Apache 2.0
+  min_ansible_version: 2.0
+  platforms:
+    - name: Ubuntu
+      versions:
+        - trusty
+  galaxy_tags:
+    - development
+    - system
+dependencies: []
diff --git a/tools/dev/vagrant/ansible/roles/java8-oracle/tasks/main.yml b/tools/dev/vagrant/ansible/roles/java8-oracle/tasks/main.yml
new file mode 100644
index 0000000..46deb76
--- /dev/null
+++ b/tools/dev/vagrant/ansible/roles/java8-oracle/tasks/main.yml
@@ -0,0 +1,20 @@
+---
+- name: Install add-apt-repostory
+  become: yes
+  apt: name=software-properties-common state=latest update_cache=yes
+
+- name: Add Oracle Java Repository
+  become: yes
+  apt_repository: repo='ppa:webupd8team/java'
+
+- name: Accept Java 8 License
+  become: yes
+  debconf: name='oracle-java8-installer' question='shared/accepted-oracle-license-v1-1' value='true' vtype='select'
+
+- name: Install Oracle Java 8
+  become: yes
+  apt: name={{item}} state=latest
+  with_items:
+    - oracle-java8-installer
+    - ca-certificates
+    - oracle-java8-set-default
diff --git a/tools/dev/vagrant/ansible/roles/lxc/files/99-onos-sudoers b/tools/dev/vagrant/ansible/roles/lxc/files/99-onos-sudoers
new file mode 100644
index 0000000..2a00bee
--- /dev/null
+++ b/tools/dev/vagrant/ansible/roles/lxc/files/99-onos-sudoers
@@ -0,0 +1 @@
+ubuntu ALL=(ALL:ALL) NOPASSWD:ALL
diff --git a/tools/dev/vagrant/ansible/roles/lxc/files/default.conf b/tools/dev/vagrant/ansible/roles/lxc/files/default.conf
new file mode 100644
index 0000000..b496600
--- /dev/null
+++ b/tools/dev/vagrant/ansible/roles/lxc/files/default.conf
@@ -0,0 +1,11 @@
+lxc.mount.entry = /usr/lib/jvm/java-8-oracle usr/lib/jvm/java none bind,create=dir 0 0
+
+lxc.network.type = veth
+lxc.network.link = lxcbr0
+lxc.network.flags = up
+lxc.network.name = eth0
+
+lxc.network.type = veth
+lxc.network.link = onosbr0
+lxc.network.flags = up
+lxc.network.name = eth1
diff --git a/tools/dev/vagrant/ansible/roles/lxc/tasks/main.yml b/tools/dev/vagrant/ansible/roles/lxc/tasks/main.yml
new file mode 100644
index 0000000..ab4fbd4
--- /dev/null
+++ b/tools/dev/vagrant/ansible/roles/lxc/tasks/main.yml
@@ -0,0 +1,55 @@
+- name: Remove lxc default config
+  become: yes
+  file: path=/etc/lxc/default.conf state=absent
+
+- name: Copy default lxc file
+  become: yes
+  copy:
+    src: files/default.conf
+    dest: /etc/lxc/default.conf
+    mode: 644
+
+- name: Create onos1 container
+  lxc_container:
+    name: onos1
+    container_log: true
+    template: ubuntu
+    state: started
+    template_options: --release trusty
+    container_config:
+      - "lxc.network.ipv4=10.100.198.201/24"
+    container_command: | 
+      ln -s /usr/lib/jvm/java/bin/java /usr/bin/java         
+      apt-get update
+      apt-get install -y openssh-server
+      echo "ubuntu ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers.d/99-onos-sudoers
+
+- name: Create onos2 container
+  lxc_container:
+    name: onos2
+    container_log: true
+    template: ubuntu
+    state: started
+    template_options: --release trusty
+    container_config:
+      - "lxc.network.ipv4=10.100.198.202/24"
+    container_command: |
+      ln -s /usr/lib/jvm/java/bin/java /usr/bin/java
+      apt-get update
+      apt-get install -y openssh-server
+      echo "ubuntu ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers.d/99-onos-sudoers
+
+- name: Create onos3 container
+  lxc_container:
+    name: onos3
+    container_log: true
+    template: ubuntu
+    state: started
+    template_options: --release trusty
+    container_config:
+      - "lxc.network.ipv4=10.100.198.203/24"
+    container_command: |
+      ln -s /usr/lib/jvm/java/bin/java /usr/bin/java
+      apt-get update
+      apt-get install -y openssh-server
+      echo "ubuntu ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers.d/99-onos-sudoers