Add OOM provisioning script

The instructions to provision a ONAP Operations Manager environment
was included into the vagrant-onap tool. This script requires a
specific docker version besides some tasks that wait for certain
services.

Change-Id: I39f0b7947e7c87d8aa44ffa93cdb414d700379bd
Signed-off-by: Victor Morales <victor.morales@intel.com>
Co-Authored-By: Shashank Kumar Shankar <shashank.kumar.shankar@intel.com>
Issue-ID: INT-370
diff --git a/bootstrap/vagrant-onap/README.md b/bootstrap/vagrant-onap/README.md
index 4e902f0..8f143ad 100644
--- a/bootstrap/vagrant-onap/README.md
+++ b/bootstrap/vagrant-onap/README.md
@@ -43,19 +43,20 @@
 |:----------:|-------------------------------------|
 | aai        | Active and Available Inventory      |
 | appc       | Application Controller              |
+| ccsdk      | Common Controller SDK               |
 | dcae       | Data Collection Analytics & Events  |
 | mr         | Message Router                      |
 | mso        | Master Service Orchestrator         |
 | msb        | Microservices Bus Project           |
+| multicloud | Multi Cloud                         |
+| oom        | ONAP Operations Manager             |
 | policy     | Policy                              |
 | portal     | Portal                              |
 | robot      | Robot                               |
 | sdc        | Service Design & Creation           |
 | sdnc       | Software Defined Network Controller |
-| vid        | Virtual Infrastructure Development  |
 | vfc        | Virtual Function Controller         |
-| multicloud | Multi Cloud                         |
-| ccsdk      | Common Controller SDK               |
+| vid        | Virtual Infrastructure Development  |
 | vnfsdk     | VNF SDK                             |
 | vvp        | VNF Validation Program              |
 |:----------:|-------------------------------------|
diff --git a/bootstrap/vagrant-onap/Vagrantfile b/bootstrap/vagrant-onap/Vagrantfile
index 753e356..01c6afd 100644
--- a/bootstrap/vagrant-onap/Vagrantfile
+++ b/bootstrap/vagrant-onap/Vagrantfile
@@ -142,6 +142,21 @@
     :args   => ["multicloud"],
   },
   {
+    :name   => "oom",
+    :ips    => ['10.252.0.21', "192.168.50.21"],
+    :macs   => [],
+    :cpus   => 16,
+    :cpu    => "50",
+    :ram    => 64 * 1024,
+    :groups => ["individual"],
+    :args   => ["oom"],
+    :hd     => "60G",
+    :fwds   => [
+      { :guest => 8880, :host => 8880, :guest_ip => '192.168.50.21' },
+      { :guest => 8989, :host => 8989, :guest_ip => '192.168.50.21' },
+    ]
+  },
+  {
     :name   => "policy",
     :ips    => ['10.252.0.13', "192.168.50.13"],
     :macs   => [],
@@ -180,6 +195,7 @@
     :ram    => 8 * 1024,
     :groups => ["individual"],
     :args   => ["sdc"],
+    :hd     => "20G",
   },
   {
     :name   => "sdnc",
@@ -251,6 +267,10 @@
     :ram    => 8 * 1024,
     :groups => ["individual"],
     :args   => ['openstack'],
+    :fwds   => [
+      { :guest => 80, :host => 8888, :guest_ip => '192.168.53.4' },
+      { :guest => 6080, :host => 6080, :guest_ip => '192.168.53.4' },
+    ]
   }
 ]
 
@@ -322,15 +342,14 @@
 
 Vagrant.configure("2") do |config|
 
-  # PROXY definitions
-    if ENV['http_proxy'] != nil and ENV['https_proxy'] != nil and ENV['no_proxy'] != nil
+    # PROXY definitions
+    if ENV['http_proxy'] != nil and ENV['https_proxy'] != nil
       if not Vagrant.has_plugin?('vagrant-proxyconf')
         system 'vagrant plugin install vagrant-proxyconf'
         raise 'vagrant-proxyconf was installed but it requires to execute again'
       end
       config.proxy.http     = ENV['http_proxy']
       config.proxy.https    = ENV['https_proxy']
-      config.proxy.no_proxy = ENV['no_proxy']
       configuration['socks_proxy'] = ENV['socks_proxy']
     end
 
@@ -357,6 +376,15 @@
     nodes.each do |node|
       config.vm.define node[:name] do |nodeconfig|
 
+      # NO_PROXY definitions
+      if ENV['no_proxy'] != nil
+        if not Vagrant.has_plugin?('vagrant-proxyconf')
+          system 'vagrant plugin install vagrant-proxyconf'
+          raise 'vagrant-proxyconf was installed but it requires to execute again'
+        end
+        config.proxy.no_proxy = node[:ips].join(",") + "," + ENV['no_proxy']
+      end
+
         # Common Settings:
 
         nodeconfig.vm.provider "virtualbox" do |vbox|
@@ -378,12 +406,22 @@
             :adapter => 3,
             :ip  => node[:ips][1],
             :type => :static
+
+          # Set Storage
+          if node.has_key? :hd
+            volume_file = node[:name] + '-vol1-data.vdi'
+            unless File.exist?(volume_file)
+              vbox.customize ['createhd', '--filename', volume_file, '--size', node[:hd]]
+            end
+            vbox.customize ['storageattach', :id, '--storagectl', 'SATAController', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', volume_file]
+          end
         end
 
         nodeconfig.vm.provider "libvirt" do |lbox|
           lbox.memory = node[:ram]
           lbox.nested = true
           lbox.cpu_mode = 'host-passthrough'
+          lbox.cpus = node[:cpus]
 
           # Set Network
           nodeconfig.vm.network :private_network,
@@ -392,6 +430,20 @@
           nodeconfig.vm.network :private_network,
             :ip  => node[:ips][1],
             :type => :static
+
+          # Set Storage
+          if node.has_key? :hd
+            lbox.storage :file, bus: 'sata', device: 'sda', size: node[:hd]
+          end
+        end
+        if node.has_key? :fwds
+          node[:fwds].each do |fwd|
+            nodeconfig.vm.network :forwarded_port,
+              :guest => fwd[:guest],
+              :guest_ip => fwd[:guest_ip],
+              :host => fwd[:host],
+              :host_ip => "0.0.0.0"
+          end
         end
 
         nodeconfig.vm.provider :openstack do |obox|
@@ -426,28 +478,14 @@
 
         # Set Sync Folder
         nodeconfig.vm.synced_folder ".", "/vagrant", disabled: true
-        nodeconfig.vm.synced_folder './opt', '/opt/', create: true
-        nodeconfig.vm.synced_folder './lib', '/var/onap/', create: true
+        nodeconfig.vm.synced_folder './opt', '/opt/', create: true, type: "nfs"
+        nodeconfig.vm.synced_folder './lib', '/var/onap/', create: true, type: "nfs"
         if !is_windows
           nodeconfig.vm.synced_folder '~/.m2', '/root/.m2/', create: true
         end
 
         # Specific settings:
 
-        # Set Storage (For SDC or All-in-one)
-        if node[:name].include?("all-in-one") || node[:name].include?("sdc")
-          nodeconfig.vm.provider "virtualbox" do |v|
-              unless File.exist?(sdc_volume)
-                  v.customize ['createhd', '--filename', sdc_volume, '--size', 20 * 1024]
-              end
-              v.customize ['storageattach', :id, '--storagectl', 'SATAController', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', sdc_volume]
-            end
-
-            nodeconfig.vm.provider "libvirt" do |v|
-                v.storage :file, path: sdc_volume, bus: 'sata', device: 'vdb', size: '2G'
-            end
-        end
-
         if node[:name].include? "testing"
             nodeconfig.vm.synced_folder './tests', '/var/onap_tests/', create: true
             test_suite = ENV.fetch('TEST_SUITE', '*')
diff --git a/bootstrap/vagrant-onap/doc/source/install/index.rst b/bootstrap/vagrant-onap/doc/source/install/index.rst
index 83c68b6..62f57e6 100644
--- a/bootstrap/vagrant-onap/doc/source/install/index.rst
+++ b/bootstrap/vagrant-onap/doc/source/install/index.rst
@@ -17,12 +17,15 @@
 
     $ wget -q https://releases.hashicorp.com/vagrant/2.0.1/vagrant_2.0.1_x86_64.deb
     $ sudo dpkg -i vagrant_2.0.1_x86_64.deb
+
     $ echo "deb http://download.virtualbox.org/virtualbox/debian trusty contrib" >> /etc/apt/sources.list
     $ wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
     $ wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
     $ sudo apt-get update -y
     $ sudo apt-get install -y virtualbox-5.1 dkms
 
+    $ sudo apt install -y nfs-kernel-server
+
 .. end
 
 CentOS
@@ -32,10 +35,13 @@
 
     $ wget -q https://releases.hashicorp.com/vagrant/2.0.1/vagrant_2.0.1_x86_64.rpm
     $ sudo yum install vagrant_2.0.1_x86_64.rpm
+
     $ wget -q http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox.repo -P /etc/yum.repos.d
     $ sudo yum --enablerepo=epel install dkms
     $ wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | rpm --import -
-    $ sudo yum install VirtualBox-5.1
+    $ sudo yum install -y VirtualBox-5.1
+
+    $ sudo yum install -y nfs-utils nfs-utils-lib
 
 .. end
 
diff --git a/bootstrap/vagrant-onap/lib/_onap_functions b/bootstrap/vagrant-onap/lib/_onap_functions
index cedd6f0..960b298 100755
--- a/bootstrap/vagrant-onap/lib/_onap_functions
+++ b/bootstrap/vagrant-onap/lib/_onap_functions
@@ -15,7 +15,7 @@
 # docker_openecomp_login() - Login to OpenECOMP Docker Hub
 function docker_openecomp_login {
     install_docker
-    docker login -u $nexus_username -p $nexus_password $nexus_docker_repo
+    docker login -u ${nexus_username:-docker} -p ${nexus_password:-docker} ${nexus_docker_repo:-nexus3.onap.org:10001}
 }
 
 # pull_openecomp_image() - Pull Docker container image from a Docker Registry Hub
@@ -23,7 +23,7 @@
     local image=$1
     local tag=$2
     docker_openecomp_login
-    pull_docker_image $nexus_docker_repo/openecomp/${image}:${docker_version-latest} $tag
+    pull_docker_image ${nexus_docker_repo:-nexus3.onap.org:10001}/openecomp/${image}:${docker_version-latest} $tag
     docker logout
 }
 
@@ -32,7 +32,7 @@
     local image=$1
     local tag=$2
     docker_openecomp_login
-    pull_docker_image $nexus_docker_repo/onap/${image}:${docker_version-latest} $tag
+    pull_docker_image ${nexus_docker_repo:-nexus3.onap.org:10001}/onap/${image}:${docker_version-latest} $tag
     docker logout
 }
 
diff --git a/bootstrap/vagrant-onap/lib/config/env-vars b/bootstrap/vagrant-onap/lib/config/env-vars
index 1eddf67..a55557a 100755
--- a/bootstrap/vagrant-onap/lib/config/env-vars
+++ b/bootstrap/vagrant-onap/lib/config/env-vars
@@ -13,6 +13,7 @@
 ["msb"]="$git_src_folder/msb"
 ["mso"]="$git_src_folder/mso"
 ["multicloud"]="$git_src_folder/multicloud"
+["oom"]="$git_src_folder/oom"
 ["policy"]="$git_src_folder/policy"
 ["portal"]="$git_src_folder/portal"
 ["robot"]="$git_src_folder/testsuite"
@@ -50,6 +51,7 @@
 ["multicloud"]="multicloud multicloud/framework multicloud/openstack \
 multicloud/openstack/vmware multicloud/openstack/windriver \
 multicloud/azure"
+["oom"]="oom oom/registrator"
 ["policy"]="policy/api policy/common policy/docker \
 policy/drools-applications policy/drools-pdp policy/engine \
 policy/gui policy/pap policy/pdp"
diff --git a/bootstrap/vagrant-onap/lib/files/kubectl_config_generator.py b/bootstrap/vagrant-onap/lib/files/kubectl_config_generator.py
new file mode 100644
index 0000000..6b5a6e9
--- /dev/null
+++ b/bootstrap/vagrant-onap/lib/files/kubectl_config_generator.py
@@ -0,0 +1,40 @@
+import requests
+import os
+import base64
+
+RANCHER_URL = str(os.environ['RANCHER_URL'])
+RANCHER_ENVIRONMENT_ID = str(os.environ['RANCHER_ENVIRONMENT'])
+data = requests.post(RANCHER_URL + '/v1/projects/' + RANCHER_ENVIRONMENT_ID + '/apikeys',
+                     {"accountId": RANCHER_ENVIRONMENT_ID,
+                      "description": "ONAP on Kubernetes",
+                      "name": "ONAP on Kubernetes",
+                      "publicValue": "string",
+                      "secretValue": "password"})
+json_dct = data.json()
+access_key = json_dct['publicValue']
+secret_key = json_dct['secretValue']
+auth_header = 'Basic ' + base64.b64encode(access_key + ':' + secret_key)
+token = "\"" + str(base64.b64encode(auth_header)) + "\""
+dct = \
+"""
+apiVersion: v1
+kind: Config
+clusters:
+- cluster:
+    api-version: v1
+    insecure-skip-tls-verify: true
+    server: "{}/r/projects/{}/kubernetes:6443"
+  name: "onap_on_kubernetes"
+contexts:
+- context:
+    cluster: "onap_on_kubernetes"
+    user: "onap_on_kubernetes"
+  name: "onap_on_kubernetes"
+current-context: "onap_on_kubernetes"
+users:
+- name: "onap_on_kubernetes"
+  user:
+    token: {}
+""".format(RANCHER_URL, RANCHER_ENVIRONMENT_ID, token)
+with open("config", "w") as file:
+    file.write(dct)
diff --git a/bootstrap/vagrant-onap/lib/functions b/bootstrap/vagrant-onap/lib/functions
index 08c6d91..9531fc7 100755
--- a/bootstrap/vagrant-onap/lib/functions
+++ b/bootstrap/vagrant-onap/lib/functions
@@ -139,6 +139,7 @@
     local docker_conf_backup=/tmp/docker.backup
     local docker_conf=/etc/default/docker
     local chameleonsocks_filename=chameleonsocks.sh
+    local max_concurrent_downloads=${1:-3}
 
     cp $docker_conf $docker_conf_backup
     if [ $http_proxy ]; then
@@ -160,7 +161,20 @@
     fi
     rm $docker_conf_backup
 
-    echo "DOCKER_OPTS=\"-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock\"" >> $docker_conf
+    echo "DOCKER_OPTS=\"-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --max-concurrent-downloads $max_concurrent_downloads \"" >> $docker_conf
+    usermod -aG docker $USER
+
+    source /etc/os-release || source /usr/lib/os-release
+    case ${ID,,} in
+        *suse)
+        ;;
+        ubuntu|debian)
+            service docker restart
+            sleep 10
+        ;;
+        rhel|centos|fedora)
+        ;;
+    esac
 }
 
 # install_nodejs() - Download and install NodeJS
@@ -208,7 +222,7 @@
 
 # install_docker() - Download and install docker-engine
 function install_docker {
-    if is_package_installed docker-ce; then
+    if $(docker version &>/dev/null); then
         return
     fi
     source /etc/os-release || source /usr/lib/os-release
@@ -229,8 +243,6 @@
 
     install_package docker-ce
     _configure_docker_settings
-    service docker restart
-    sleep 10
 }
 
 # pull_docker_image() - Pull Docker container image from the Public Docker Registry Hub
@@ -265,8 +277,8 @@
     if [ ! -d /opt/opendaylight/current ]; then
         mkdir -p /opt/opendaylight/
         wget "https://nexus.opendaylight.org/content/repositories/public/org/opendaylight/integration/distribution-karaf/"$odl_version"/distribution-karaf-"$odl_version".tar.gz" -P /opt/
-        tar xvf "/opt/distribution-karaf-"$odl_version".tar.gz" -C /opt/
-        mv "/opt/distribution-karaf-"$odl_version /opt/opendaylight/current
+        tar xvf "/opt/distribution-karaf-"$odl_version".tar.gz" -C /tmp/
+        mv "/tmp/distribution-karaf-"$odl_version /opt/opendaylight/current
         rm -rf "/opt/distribution-karaf-"$odl_version".tar.gz"
     fi
 }
@@ -356,3 +368,17 @@
     eval $docker_build
     popd
 }
+
+# mount_external_partition() - Create partition and mount the external volume
+function mount_external_partition {
+    local dev_name="/dev/$1"
+    local mount_dir=$2
+
+    sfdisk $dev_name << EOF
+;
+EOF
+    mkfs -t ext4 ${dev_name}1
+    mkdir -p $mount_dir
+    mount ${dev_name}1 $mount_dir
+    echo "${dev_name}1  $mount_dir           ext4    errors=remount-ro,noatime,barrier=0 0       1" >> /etc/fstab
+}
diff --git a/bootstrap/vagrant-onap/lib/oom b/bootstrap/vagrant-onap/lib/oom
new file mode 100755
index 0000000..ef7e5ed
--- /dev/null
+++ b/bootstrap/vagrant-onap/lib/oom
@@ -0,0 +1,220 @@
+#!/bin/bash
+
+source /var/onap/functions
+
+RANCHER_PORT=8880
+oom_delay=30
+export RANCHER_URL=http://localhost:$RANCHER_PORT
+export RANCHER_ACCESS_KEY='access_key'
+export RANCHER_SECRET_KEY='secret_key'
+
+# _install_docker() - Function that installs Docker version for Rancher
+function _install_docker {
+    if ! $(docker version &>/dev/null); then
+        curl https://releases.rancher.com/install-docker/1.12.sh | sh
+        _configure_docker_settings 15
+    fi
+}
+
+# _pull_rancher_images() - Function that retrieves Rancher images required for k8s
+function _pull_rancher_images {
+    for image in "net:v0.13.5" "k8s:v1.8.5-rancher3" \
+"lb-service-rancher:v0.7.17" "network-manager:v0.7.18" "metadata:v0.9.5" \
+"kubectld:v0.8.5" "kubernetes-agent:v0.6.6" "dns:v0.15.3" \
+"kubernetes-auth:v0.0.8" "healthcheck:v0.3.3" "etcd:v2.3.7-13" \
+"etc-host-updater:v0.0.3" "net:holder"; do
+        pull_docker_image rancher/$image &
+    done
+}
+
+# _pull_k8s_images() - Function that retrieves Google k8s images
+function _pull_k8s_images {
+    for image in "kubernetes-dashboard-amd64:v1.7.1" \
+"k8s-dns-sidecar-amd64:1.14.5" "k8s-dns-kube-dns-amd64:1.14.5" \
+"k8s-dns-dnsmasq-nanny-amd64:1.14.5" "heapster-influxdb-amd64:v1.3.3" \
+"heapster-grafana-amd64:v4.4.3" "heapster-amd64:v1.4.0" "pause-amd64:3.0"; do
+        pull_docker_image gcr.io/google_containers/$image  &
+    done
+}
+
+# _install_rancher() - Function that installs Rancher CLI and container
+function _install_rancher {
+    local rancher_version=v0.6.5
+    local rancher_server_version=v1.6.10
+    local rancher_server=rancher/server:$rancher_server_version
+
+    if [ ! -d /opt/rancher/current ]; then
+        mkdir -p /opt/rancher/current
+        wget https://github.com/rancher/cli/releases/download/$rancher_version/rancher-linux-amd64-$rancher_version.tar.gz
+        tar -xzf rancher-linux-amd64-$rancher_version.tar.gz -C /tmp
+        mv /tmp/rancher-$rancher_version/rancher /opt/rancher/current/
+    fi
+
+    _install_docker
+    pull_docker_image $rancher_server
+    run_docker_image -d --restart=unless-stopped -p $RANCHER_PORT:8080 $rancher_server
+    while true; do
+        if curl --fail -X GET $RANCHER_URL; then
+            break
+        fi
+        echo "waiting for racher"
+        sleep $oom_delay
+    done
+}
+
+# _install_kubernetes() - Function that deploys kubernetes via RancherOS host registration
+function _install_kubernetes {
+    local rancher_agent_version=v1.2.7
+    local rancher_agent=rancher/agent:$rancher_agent_version
+
+    _install_rancher
+
+    _pull_rancher_images
+    _pull_k8s_images
+    pull_docker_image $rancher_agent
+    _wait_docker_pull
+
+    pushd /opt/rancher/current/
+    export RANCHER_ENVIRONMENT=`./rancher env create -t kubernetes onap_on_kubernetes`
+    popd
+
+    install_python_package rancher-agent-registration
+    export no_proxy=$no_proxy,$IP_ADDRESS
+    rancher-agent-registration --host-ip $IP_ADDRESS --url http://$IP_ADDRESS:$RANCHER_PORT --environment $RANCHER_ENVIRONMENT --key $RANCHER_ACCESS_KEY --secret $RANCHER_SECRET_KEY
+}
+
+# _install_kubectl() - Function that installs kubectl as client for kubernetes
+function _install_kubectl {
+    if ! $(kubectl version &>/dev/null); then
+        rm -rf ~/.kube
+        curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
+        chmod +x ./kubectl
+        mv ./kubectl /usr/local/bin/kubectl
+        mkdir ~/.kube
+        pushd ~/.kube
+        python /var/onap/files/kubectl_config_generator.py
+        popd
+    fi
+}
+
+# _install_helm() - Function that install Kubernetes Package Manager
+function _install_helm {
+    local helm_version=v2.3.0
+
+    if ! $(helm version &>/dev/null); then
+        wget http://storage.googleapis.com/kubernetes-helm/helm-${helm_version}-linux-amd64.tar.gz
+        tar -zxvf helm-${helm_version}-linux-amd64.tar.gz -C /tmp
+        mv /tmp/linux-amd64/helm /usr/local/bin/helm
+        helm init
+    fi
+}
+
+# _pull_images_from_yaml() - Function that parses a yaml file and pull their images
+function _pull_images_from_yaml_file {
+    local values_file=$1
+    local prefix=$2
+    local s='[[:space:]]*'
+    local w='[a-zA-Z0-9_]*'
+    fs=`echo @|tr @ '\034'`
+
+    for line in $(sed -ne "s|^\($s\):|\1|" \
+-e "s|^\($s\)\($w\)$s:$s[\"']\(.*\)[\"']$s\$|\1$fs\2$fs\3|p" \
+-e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p"  $values_file |
+awk -F$fs '{
+indent = length($1)/2;
+vname[indent] = $2;
+for (i in vname) {
+    if (i > indent) {
+        delete vname[i]}
+    }
+    if (length($3) > 0) {
+        vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])(".")}
+        printf("%s%s%s=%s\n", "'$prefix'",vn, $2, $3);
+    }
+}' | grep image); do
+        echo $line
+        if echo $line | grep -q Version ; then
+            pull_docker_image "$image_name:$(echo $line | awk -F "=" '{print $2}')" &
+        else
+            image_name=`echo ${line#*=}`
+            if [[ ${image_name#*${nexus_docker_repo:-nexus3.onap.org:10001}} == *:* ]]; then
+                pull_docker_image $image_name &
+            else
+                pull_docker_image $image_name:latest
+            fi
+        fi
+    done
+}
+
+# _wait_docker_pull() - Function that waits for all docker pull processes
+function _wait_docker_pull {
+    local counter=150
+
+    while [ $(ps -ef | grep "docker pull" | wc -l) -gt 1 ]; do
+        sleep $oom_delay
+        counter=$((counter - 1))
+        if [ "$counter" -eq 0 ]; then
+            break
+        fi
+    done
+}
+
+# get_oom_images() - Function that retrieves ONAP images from official hub
+function get_oom_images {
+    if [[ "$build_image" == "True" ]]; then
+        # TODO(electrocucaracha): Create a function for calling the build docker function of every ONAP project
+        echo "Not Implemented"
+    else
+        if [[ "$clone_repo" != "True" ]]; then
+            clone_repos "oom"
+        fi
+
+        docker_openecomp_login
+        for values_file in `find ${src_folders[oom]}/kubernetes -name values.yaml -type f`; do
+            _pull_images_from_yaml_file $values_file
+        done
+        docker logout
+        _wait_docker_pull
+    fi
+}
+
+# _install_oom() - Function that clones OOM and deploys ONAP
+function install_oom {
+    if [[ "$clone_repo" != "True" ]]; then
+        clone_repos "oom"
+    fi
+    pushd ${src_folders[oom]}/kubernetes/oneclick
+    source setenv.bash
+
+    pushd ${src_folders[oom]}/kubernetes/config
+    cp onap-parameters-sample.yaml onap-parameters.yaml
+    ./createConfig.sh -n onap
+    popd
+
+    for app in consul msb mso message-router sdnc vid robot portal policy appc aai sdc dcaegen2 log cli multicloud clamp vnfsdk uui aaf vfc kube2msb; do
+        ./createAll.bash -n onap -a $app
+    done
+    popd
+}
+
+# init_oom() - Function that deploys ONAP using OOM
+function init_oom {
+    mount_external_partition sda /var/lib/docker/
+    _install_kubernetes
+    _install_kubectl
+    _install_helm
+    if [[ "$clone_repo" == "True" ]]; then
+        clone_repos "oom"
+    fi
+
+    if [[ "$skip_get_images" == "False" ]]; then
+        get_oom_images
+        if [[ "$skip_install" == "False" ]]; then
+            until kubectl cluster-info; do
+                echo "waiting for kubernetes host"
+                sleep $oom_delay
+            done
+            install_oom
+        fi
+    fi
+}
diff --git a/bootstrap/vagrant-onap/lib/sdc b/bootstrap/vagrant-onap/lib/sdc
index 9b0a69e..fee583d 100755
--- a/bootstrap/vagrant-onap/lib/sdc
+++ b/bootstrap/vagrant-onap/lib/sdc
@@ -2,24 +2,6 @@
 
 source /var/onap/functions
 
-# _mount_external_partition() - Create partition and mount the external volume
-function _mount_external_partition {
-    cat <<EOL > /tmp/sdc_ext_volume_partitions.txt
-# partition table of /dev/sdb
-unit: sectors
-
-/dev/sdb1 : start=     2048, size=209713152, Id=83
-/dev/sdb2 : start=        0, size=        0, Id= 0
-/dev/sdb3 : start=        0, size=        0, Id= 0
-/dev/sdb4 : start=        0, size=        0, Id= 0
-EOL
-    sfdisk --force /dev/sdb < /tmp/sdc_ext_volume_partitions.txt
-    mkfs -t ext4 /dev/sdb1
-    mkdir -p /data
-    mount /dev/sdb1 /data
-    echo "/dev/sdb1  /data           ext4    errors=remount-ro,noatime,barrier=0 0       1" >> /etc/fstab
-}
-
 # _init_data_folders() - Function that initialize the data folders
 function _init_data_folders {
     mkdir -p /data/environments
@@ -82,7 +64,7 @@
 
 # init_sdc() - Function that initialize SDC services
 function init_sdc {
-    _mount_external_partition
+    mount_external_partition sdb /data/
     if [[ "$clone_repo" == "True" ]]; then
         clone_repos "sdc"
         if [[ "$compile_repo" == "True" ]]; then
diff --git a/bootstrap/vagrant-onap/tools/Run.ps1 b/bootstrap/vagrant-onap/tools/Run.ps1
index 1592d65..de57a15 100644
--- a/bootstrap/vagrant-onap/tools/Run.ps1
+++ b/bootstrap/vagrant-onap/tools/Run.ps1
@@ -31,7 +31,7 @@
 #>
 
 Param(
-    [ValidateSet("all_in_one","dns", "mr", "sdc", "aai", "mso", "robot", "vid", "sdnc", "portal", "dcae", "policy", "appc", "vfc", "multicloud", "ccsdk", "vnfsdk", "vvp", "openstack", "msb", "testing")]
+    [ValidateSet("all_in_one","dns", "mr", "sdc", "aai", "mso", "robot", "vid", "sdnc", "portal", "dcae", "policy", "appc", "vfc", "multicloud", "ccsdk", "vnfsdk", "vvp", "openstack", "msb", "oom", "testing")]
 
     [Parameter(Mandatory=$True,Position=0)]
     [ValidateNotNullOrEmpty()]
@@ -86,7 +86,7 @@
 switch ($Command)
     {
         "all_in_one" { $env:DEPLOY_MODE="all-in-one" }
-        { @("dns", "mr", "sdc", "aai", "mso", "robot", "vid", "sdnc", "portal", "dcae", "policy", "appc", "vfc", "multicloud", "ccsdk", "vnfsdk", "vvp", "openstack", "msb") -contains $_ } { $env:DEPLOY_MODE="individual" }
+        { @("dns", "mr", "sdc", "aai", "mso", "robot", "vid", "sdnc", "portal", "dcae", "policy", "appc", "vfc", "multicloud", "ccsdk", "vnfsdk", "vvp", "openstack", "msb", "oom") -contains $_ } { $env:DEPLOY_MODE="individual" }
         "testing"
             {
                 $env:DEPLOY_MODE="testing"
diff --git a/bootstrap/vagrant-onap/tools/run.sh b/bootstrap/vagrant-onap/tools/run.sh
index 6f1cb54..27e0aa3 100755
--- a/bootstrap/vagrant-onap/tools/run.sh
+++ b/bootstrap/vagrant-onap/tools/run.sh
@@ -16,7 +16,7 @@
         Test case to use in testing mode.
 Commands:
     all_in_one  Deploy in all-in-one mode.
-    dns|mr|sdc|aai|mso|robot|vid|sdnc|portal|dcae|policy|appc|vfc|vnfsdk|multicloud|ccsdk|vvp|openstack|msb  Deploy chosen service.
+    dns|mr|sdc|aai|mso|robot|vid|sdnc|portal|dcae|policy|appc|vfc|vnfsdk|multicloud|ccsdk|vvp|openstack|msb|oom  Deploy chosen service.
     testing  Deploy in testing mode.
 EOF
 }
@@ -65,7 +65,7 @@
     "all_in_one" )
         export DEPLOY_MODE='all-in-one'
         ;;
-    "dns" | "mr" | "sdc" | "aai" | "mso" | "robot" | "vid" | "sdnc" | "portal" | "dcae" | "policy" | "appc" | "vfc" | "vnfsdk"| "multicloud" | "ccsdk" | "vvp" | "openstack" | "msb" )
+    "dns" | "mr" | "sdc" | "aai" | "mso" | "robot" | "vid" | "sdnc" | "portal" | "dcae" | "policy" | "appc" | "vfc" | "vnfsdk"| "multicloud" | "ccsdk" | "vvp" | "openstack" | "msb" | "oom" )
         export DEPLOY_MODE='individual'
         ;;
     "testing" )
diff --git a/bootstrap/vagrant-onap/tools/setup_libvirt.sh b/bootstrap/vagrant-onap/tools/setup_libvirt.sh
new file mode 100755
index 0000000..54003d6
--- /dev/null
+++ b/bootstrap/vagrant-onap/tools/setup_libvirt.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+export VAGRANT_DEFAULT_PROVIDER=libvirt
+
+source /etc/os-release || source /usr/lib/os-release
+case ${ID,,} in
+    *suse)
+    ;;
+    ubuntu|debian)
+    # vagrant-libvirt dependencies
+    sudo apt-get install -y qemu libvirt-bin ebtables dnsmasq libxslt-dev libxml2-dev libvirt-dev zlib1g-dev ruby-dev
+
+    # NFS
+    sudo apt-get install -y nfs-kernel-server
+    ;;
+    rhel|centos|fedora)
+    PKG_MANAGER=$(which dnf || which yum)
+    sudo $PKG_MANAGER install -y qemu libvirt libvirt-devel ruby-devel gcc qemu-kvm
+    ;;
+esac
+vagrant plugin install vagrant-libvirt
diff --git a/bootstrap/vagrant-onap/vagrant_utils/postinstall.sh b/bootstrap/vagrant-onap/vagrant_utils/postinstall.sh
index 4a014dc..3b5017a 100755
--- a/bootstrap/vagrant-onap/vagrant_utils/postinstall.sh
+++ b/bootstrap/vagrant-onap/vagrant_utils/postinstall.sh
@@ -20,7 +20,7 @@
     source /var/onap/${serv}
     configure_service ${serv}_serv.sh
     init_${serv}
-    echo "source /var/onap/${serv}" >> ~/.profile
+    echo "source /var/onap/${serv}" >> ~/.bashrc
 done
 
-echo "source /var/onap/functions" >> ~/.profile
+echo "source /var/onap/functions" >> ~/.bashrc