Further updates in testing 89/20589/1
authorblsaws <bryan.sullivan@att.com>
Wed, 7 Sep 2016 15:53:01 +0000 (08:53 -0700)
committerblsaws <bryan.sullivan@att.com>
Wed, 7 Sep 2016 15:53:01 +0000 (08:53 -0700)
JIRA: MODELS-23

Change-Id: Iabbf132a2bf3b1c8f475a113b519a97c9bedcae0
Signed-off-by: blsaws <bryan.sullivan@att.com>
tests/hello-world.hot [new file with mode: 0644]
tests/tosca-vnfd-hello-world-tacker.yaml [new file with mode: 0644]
tests/utils/cloudify-setup.sh
tests/utils/tacker-setup.sh

diff --git a/tests/hello-world.hot b/tests/hello-world.hot
new file mode 100644 (file)
index 0000000..398bc62
--- /dev/null
@@ -0,0 +1,38 @@
+heat_template_version: 2013-05-23
+description: 'Hello World'
+parameters: {}
+resources:
+  VDU1:
+    type: OS::Nova::Server
+    properties:
+      availability_zone: nova
+      config_drive: false
+      flavor: {get_resource: VDU1_flavor}
+      image: cirros-0.3.4-x86_64-uec
+      networks:
+      - port:
+          get_resource: CP1
+      - port:
+          get_resource: CP2
+      - port:
+          get_resource: CP3
+      user_data_format: SOFTWARE_CONFIG
+  CP1:
+    type: OS::Neutron::Port
+    properties:
+      network: vnf_mgmt
+  CP2:
+    type: OS::Neutron::Port
+    properties:
+      network: vnf_private
+  CP3:
+    type: OS::Neutron::Port
+    properties:
+      network: public
+  VDU1_flavor:
+    properties: {disk: 1, ram: 512, vcpus: 1}
+    type: OS::Nova::Flavor
+outputs:
+  mgmt_ip-VDU1:
+    value:
+      get_attr: [CP1, fixed_ips, 0, ip_address]
diff --git a/tests/tosca-vnfd-hello-world-tacker.yaml b/tests/tosca-vnfd-hello-world-tacker.yaml
new file mode 100644 (file)
index 0000000..fd0a70b
--- /dev/null
@@ -0,0 +1,73 @@
+tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0
+
+description: Hello World
+
+metadata:
+  template_name: tosca-vnfd-hello-world
+
+topology_template:
+  node_templates:
+    VDU1:
+      type: tosca.nodes.nfv.VDU.Tacker
+      capabilities:
+        nfv_compute:
+          properties:
+            num_cpus: 1
+            mem_size: 512 MB
+            disk_size: 1 GB
+      properties:
+        image: cirros-0.3.4-x86_64-uec
+        availability_zone: nova
+        mgmt_driver: noop
+        config: |
+          param0: key1
+          param1: key2
+
+    CP1:
+      type: tosca.nodes.nfv.CP.Tacker
+      properties:
+        management: true
+        anti_spoofing_protection: false
+      requirements:
+        - virtualLink:
+            node: VL1
+        - virtualBinding:
+            node: VDU1
+
+    CP2:
+      type: tosca.nodes.nfv.CP.Tacker
+      properties:
+        anti_spoofing_protection: false
+      requirements:
+        - virtualLink:
+            node: VL2
+        - virtualBinding:
+            node: VDU1
+
+    CP3:
+      type: tosca.nodes.nfv.CP.Tacker
+      properties:
+        anti_spoofing_protection: false
+      requirements:
+        - virtualLink:
+            node: VL3
+        - virtualBinding:
+            node: VDU1
+
+    VL1:
+      type: tosca.nodes.nfv.VL
+      properties:
+        network_name: vnf_mgmt
+        vendor: Tacker
+
+    VL2:
+      type: tosca.nodes.nfv.VL
+      properties:
+        network_name: vnf_private
+        vendor: Tacker
+
+    VL3:
+      type: tosca.nodes.nfv.VL
+      properties:
+        network_name: public
+        vendor: Tacker
index 387ccbf..baf41fa 100644 (file)
@@ -131,14 +131,13 @@ EOF
     ;;
   "clean")
     source /tmp/cloudify/admin-openrc.sh
-    
-    id=($(neutron port-list|grep -v "+"|grep -v id|awk '{print $2}')); for id in ${id[@]}; do neutron port-delete ${id};  done
-    fip=($(neutron floatingip-list|grep -v "+"|grep -v id|awk '{print $2}')); for id in ${fip[@]}; do neutron floatingip-delete ${id};  done
-    sid=($(openstack server list|grep -v "+"|grep -v id|awk '{print $2}')); for id in ${sid[@]}; do openstack server delete ${id};  done
-    sid=($(openstack security group list|grep security_group_local_security_group|awk '{print $2}')); for id in ${sid[@]}; do openstack security group delete ${id};  done
-    sid=($(openstack router list|grep cloudify_mgmt_router|awk '{print $2}')); for id in ${sid[@]}; do openstack router delete ${id};  done
+    openstack router show vnf_mgmt_router
+    neutron router-gateway-clear vnf_mgmt_router
+    pid=($(neutron router-port-list vnf_mgmt_router|grep -v name|awk '{print $2}')); for id in ${pid[@]}; do neutron router-interface-delete vnf_mgmt_router vnf_mgmt;  done
+    neutron router-delete vnf_mgmt_router
+    neutron net-delete vnf_mgmt
     sudo docker stop $(sudo docker ps -a | awk "/cloudify/ { print \$1 }")
-    sudo docker rm $(sudo docker ps -a | awk "/cloudify/ { print \$1 }")
+    sudo docker rm -v $(sudo docker ps -a | awk "/cloudify/ { print \$1 }")
     exit 0
     ;;
   *)
@@ -251,22 +250,22 @@ else
   echo "$0: Prepare the Cloudify CLI prerequisites and data"
 
   echo "Create management network"
-  if [ $(neutron net-list | awk "/ cloudify_mgmt / { print \$2 }") ]; then
-    echo "$0: cloudify_mgmt network exists"
+  if [ $(neutron net-list | awk "/ vnf_mgmt / { print \$2 }") ]; then
+    echo "$0: vnf_mgmt network exists"
   else
-    neutron net-create cloudify_mgmt           
+    neutron net-create vnf_mgmt                
     echo "$0: Create management subnet"
-    neutron subnet-create cloudify_mgmt 10.0.0.0/24 --name cloudify_mgmt --gateway 10.0.0.1 --enable-dhcp --allocation-pool start=10.0.0.2,end=10.0.0.254 --dns-nameserver 8.8.8.8
+    neutron subnet-create vnf_mgmt 10.0.0.0/24 --name vnf_mgmt --gateway 10.0.0.1 --enable-dhcp --allocation-pool start=10.0.0.2,end=10.0.0.254 --dns-nameserver 8.8.8.8
   fi
 
-  echo "$0: Create router for cloudify_mgmt network"
-  neutron router-create cloudify_mgmt_router
+  echo "$0: Create router for vnf_mgmt network"
+  neutron router-create vnf_mgmt_router
 
-  echo "$0: Create router gateway for cloudify_mgmt network"
-  neutron router-gateway-set cloudify_mgmt_router $EXTERNAL_NETWORK_NAME
+  echo "$0: Create router gateway for vnf_mgmt network"
+  neutron router-gateway-set vnf_mgmt_router $EXTERNAL_NETWORK_NAME
 
-  echo "$0: Add router interface for cloudify_mgmt network"
-  neutron router-interface-add cloudify_mgmt_router subnet=cloudify_mgmt
+  echo "$0: Add router interface for vnf_mgmt network"
+  neutron router-interface-add vnf_mgmt_router subnet=vnf_mgmt
                
   echo "$0: Install Cloudify OpenStack Plugin"
 #  pip install https://github.com/cloudify-cosmo/cloudify-openstack-plugin/archive/1.4.zip
@@ -275,7 +274,7 @@ else
   git clone https://github.com/cloudify-cosmo/cloudify-openstack-plugin.git
   git checkout 1.4
   echo "$0: Patch plugin.yaml to reference management network"
-  sed -i -- ":a;N;\$!ba;s/management_network_name:\n        default: ''/management_network_name:\n        default: 'cloudify_mgmt'/" /tmp/cloudify/cloudify-openstack-plugin/plugin.yaml               
+  sed -i -- ":a;N;\$!ba;s/management_network_name:\n        default: ''/management_network_name:\n        default: 'vnf_mgmt'/" /tmp/cloudify/cloudify-openstack-plugin/plugin.yaml            
   cd cloudify-openstack-plugin
   python setup.py build
   python setup.py install
@@ -285,6 +284,7 @@ else
   if [ -d "cloudify-fabric-plugin" ]; then rm -rf cloudify-fabric-plugin; fi  
   git clone https://github.com/cloudify-cosmo/cloudify-fabric-plugin.git
   cd cloudify-fabric-plugin
+  git checkout 1.4
   python setup.py build
   python setup.py install
   cd ..
index 4e60632..078a388 100644 (file)
@@ -90,28 +90,73 @@ function get_external_net () {
   fi
 }
 
-dist=`grep DISTRIB_ID /etc/*-release | awk -F '=' '{print $2}'`
-case "$2" in
-  "init")
-    # STEP 1: Create the Tacker container and launch it
-    echo "$0: Copy this script to /tmp/tacker"
-    mkdir /tmp/tacker
-    cp $0 /tmp/tacker/.
-    chmod 755 /tmp/tacker/*.sh
-
-    echo "$0: Setup admin-openrc.sh"
-    setenv
-
-    echo "$0: Setup container"
-    if [ "$dist" == "Ubuntu" ]; then
-      # xenial is needed for python 3.5
-      sudo docker pull ubuntu:xenial
-      sudo service docker start
-      sudo docker run -it -d -v /tmp/tacker/:/tmp/tacker --name tacker ubuntu:xenial /bin/bash
-    else 
-      # Centos
-      echo "Centos-based install"
-      sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
+function setup_test_environment () {
+  echo "Create management network"
+  if [ $(neutron net-list | awk "/ vnf_mgmt / { print \$2 }") ]; then
+    echo "$0: vnf_mgmt network exists"
+  else
+    neutron net-create vnf_mgmt                
+    echo "$0: Create management subnet"
+    neutron subnet-create vnf_mgmt 192.168.200.0/24 --name vnf_mgmt --gateway 192.168.200.1 --enable-dhcp --allocation-pool start=192.168.200.2,end=192.168.200.254 --dns-nameserver 8.8.8.8
+  fi
+
+  echo "$0: Create router for vnf_mgmt network"
+  if [ $(neutron router-list | awk "/ vnf_mgmt / { print \$2 }") ]; then
+    echo "$0: vnf_mgmt router exists"
+  else
+    neutron router-create vnf_mgmt_router
+    echo "$0: Add router interface for vnf_mgmt network"
+    neutron router-interface-add vnf_mgmt_router subnet=vnf_mgmt
+  fi
+
+  echo "Create private network"
+  if [ $(neutron net-list | awk "/ vnf_private / { print \$2 }") ]; then
+    echo "$0: vnf_private network exists"
+  else
+    neutron net-create vnf_private             
+    echo "$0: Create private subnet"
+    neutron subnet-create vnf_private 192.168.201.0/24 --name vnf_private --gateway 192.168.201.1 --enable-dhcp --allocation-pool start=192.168.201.2,end=192.168.201.254 --dns-nameserver 8.8.8.8
+  fi
+
+  echo "$0: Create router for vnf_private network"
+  if [ $(neutron router-list | awk "/ vnf_private / { print \$2 }") ]; then
+    echo "$0: vnf_private router exists"
+  else
+    neutron router-create vnf_private_router
+    echo "$0: Create router gateway for vnf_private network"
+    get_external_net
+    neutron router-gateway-set vnf_private_router $EXTERNAL_NETWORK_NAME
+    echo "$0: Add router interface for vnf_private network"
+    neutron router-interface-add vnf_private_router subnet=vnf_private
+  fi
+
+  echo "$0: Create image cirros-0.3.4-x86_64-uec"
+  image=$(openstack image list | awk "/ cirros-0.3.4-x86_64-uec / { print \$2 }")
+  if [ -z $image ]; then glance --os-image-api-version 1 image-create --name cirros-0.3.4-x86_64-uec --disk-format qcow2 --location http://download.cirros-cloud.net/0.3.3/cirros-0.3.3-x86_64-disk.img --container-format bare
+  fi
+}
+
+function create_tacker_container () {
+  echo "$0: Creating docker container for Tacker installation"
+  # STEP 1: Create the Tacker container and launch it
+  echo "$0: Copy this script to /tmp/tacker"
+  mkdir /tmp/tacker
+  cp $0 /tmp/tacker/.
+  chmod 755 /tmp/tacker/*.sh
+
+  echo "$0: Setup admin-openrc.sh"
+  setenv
+
+  echo "$0: Setup container"
+  if [ "$dist" == "Ubuntu" ]; then
+    # xenial is needed for python 3.5
+    sudo docker pull ubuntu:xenial
+    sudo service docker start
+    sudo docker run -it -d -v /tmp/tacker/:/tmp/tacker --name tacker ubuntu:xenial /bin/bash
+  else 
+    # Centos
+    echo "Centos-based install"
+    sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
 [dockerrepo]
 name=Docker Repository--parents 
 baseurl=https://yum.dockerproject.org/repo/main/centos/7/
@@ -119,24 +164,187 @@ enabled=1
 gpgcheck=1
 gpgkey=https://yum.dockerproject.org/gpg 
 EOF
-      sudo yum install -y docker-engine
-      # xenial is needed for python 3.5
-      sudo docker pull ubuntu:xenial
-      sudo service docker start
-      sudo docker run -i -t -d -v /tmp/tacker/:/tmp/tacker --name tacker ubuntu:xenial /bin/bash
-      echo $(sudo docker ps -a | awk "/tacker/ { print \$1 }")
-    fi
+    sudo yum install -y docker-engine
+    # xenial is needed for python 3.5
+    sudo docker pull ubuntu:xenial
+    sudo service docker start
+    sudo docker run -i -t -d -v /tmp/tacker/:/tmp/tacker --name tacker ubuntu:xenial /bin/bash
+    echo $(sudo docker ps -a | awk "/tacker/ { print \$1 }")
+  fi
+}
+
+function install_tacker () {
+  echo "$0: Installing Tacker"
+  # STEP 2: Install Tacker in the container
+  # Per http://docs.openstack.org/developer/tacker/install/manual_installation.html
+  echo "$0: Install dependencies - OS specific"
+  if [ "$dist" == "Ubuntu" ]; then
+    apt-get update
+    apt-get install -y python
+    apt-get install -y python-dev
+    apt-get install -y python-pip
+    apt-get install -y wget
+    apt-get install -y openssh-server
+    apt-get install -y git
+    apt-get install -y apg
+    apt-get install -y libffi-dev
+    apt-get install -y libssl-dev
+    export MYSQL_PASSWORD=$(/usr/bin/apg -n 1 -m 16 -c cl_seed)
+    echo $MYSQL_PASSWORD >~/mysql
+    debconf-set-selections <<< 'mysql-server mysql-server/root_password password '$MYSQL_PASSWORD
+    debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password '$MYSQL_PASSWORD
+    apt-get -q -y install mysql-server python-mysqldb
+    service mysql restart 
+  fi
+
+  cd /tmp/tacker
+
+  echo "$0: create Tacker database"
+  mysql --user=root --password=$MYSQL_PASSWORD -e "CREATE DATABASE tacker; GRANT ALL PRIVILEGES ON tacker.* TO 'root@localhost' IDENTIFIED BY '"$MYSQL_PASSWORD"'; GRANT ALL PRIVILEGES ON tacker.* TO 'root'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"';"
+
+  echo "$0: Upgrage pip again - needs to be the latest version due to errors found in earlier testing"
+  pip install --upgrade pip
+
+  echo "$0: install python-openstackclient python-glanceclient"
+  pip install --upgrade python-openstackclient python-glanceclient python-neutronclient keystonemiddleware
+
+  echo "$0: Setup admin-openrc.sh"
+  source /tmp/tacker/admin-openrc.sh
+
+  echo "$0: Setup Tacker user in OpenStack"
+  service_project=$(openstack project list | awk "/service/ { print \$4 }")
+  openstack user create --project $service_project --password tacker tacker
+  openstack role add --project $service_project --user tacker admin
+
+  echo "$0: Create Tacker service in OpenStack"
+  sid=$(openstack service list | awk "/ tacker / { print \$2 }")
+  openstack service create --name tacker --description "Tacker Project" nfv-orchestration
+  sid=$(openstack service list | awk "/ tacker / { print \$2 }")
+
+  echo "$0: Create Tacker service endpoint in OpenStack"
+  ip=$(ip addr | awk "/ global eth0/ { print \$2 }" | sed -- 's/\/16//')
+  region=$(openstack endpoint list | awk "/ nova / { print \$4 }")
+  openstack endpoint create --region $region \
+      --publicurl "http://$ip:9890/" \
+      --adminurl "http://$ip:9890/" \
+      --internalurl "http://$ip:9890/" $sid
+
+  echo "$0: Clone Tacker"
+  if [[ -d /tmp/tacker/tacker ]]; then rm -rf /tmp/tacker/tacker; fi
+  git clone git://git.openstack.org/openstack/tacker
+  cd tacker
+  git checkout stable/mitaka
+
+  echo "$0: Setup Tacker"
+  pip install -r requirements.txt
+  pip install tosca-parser
+  python setup.py install
+  mkdir /var/log/tacker
+
+  # Following lines apply to master and not stable/mitaka
+  #echo "$0: install tox"
+  #pip install tox
+  #echo "$0: generate tacker.conf.sample"
+  #tox -e config-gen
+
+  echo "$0: Update tacker.conf values"
+  mkdir /usr/local/etc/tacker
+  cp etc/tacker/tacker.conf /usr/local/etc/tacker/tacker.conf
+  sed -i -- 's/# auth_strategy = keystone/auth_strategy = keystone/' /usr/local/etc/tacker/tacker.conf
+  sed -i -- 's/# debug = False/debug = True/' /usr/local/etc/tacker/tacker.conf
+  sed -i -- 's/# use_syslog = False/use_syslog = False/' /usr/local/etc/tacker/tacker.conf
+  sed -i -- 's~# state_path = /var/lib/tacker~state_path = /var/lib/tacker~' /usr/local/etc/tacker/tacker.conf
+  sed -i -- "s/project_name = service/project_name = $service_project/g" /usr/local/etc/tacker/tacker.conf
+  sed -i -- "s/password = service-password/password = tacker/" /usr/local/etc/tacker/tacker.conf
+  sed -i -- "s/username = tacker/username = tacker/" /usr/local/etc/tacker/tacker.conf
+  sed -i -- "s~auth_url = http://127.0.0.1:35357~auth_url = http://$KEYSTONE_HOST:35357~" /usr/local/etc/tacker/tacker.conf
+  sed -i -- "s~identity_uri = http://127.0.0.1:5000~# identity_uri = http://127.0.0.1:5000~" /usr/local/etc/tacker/tacker.conf
+  sed -i -- "s~auth_uri = http://127.0.0.1:5000~auth_uri = http://$KEYSTONE_HOST:5000~" /usr/local/etc/tacker/tacker.conf
+  # Not sure what the effect of the next line is, given that we are running as root
+  #sed -i -- "s~# root_helper = sudo~root_helper = sudo /usr/local/bin/tacker-rootwrap /usr/local/etc/tacker/rootwrap.conf~" /usr/local/etc/tacker/tacker.conf
+  sed -i -- "s~# connection = mysql://root:pass@127.0.0.1:3306/tacker~connection = mysql://root:$MYSQL_PASSWORD@localhost:3306/tacker?charset=utf8~" /usr/local/etc/tacker/tacker.conf
+  sed -i -- "s~heat_uri = http://localhost:8004/v1~heat_uri = http://$HEAT_HOST:8004/v1~" /usr/local/etc/tacker/tacker.conf
+  sed -i -- "s~# api_paste_config = api-paste.ini~api_paste_config = /tmp/tacker/tacker/etc/tacker/api-paste.ini~" /usr/local/etc/tacker/tacker.conf
+  sed -i -- "s/# bind_host = 0.0.0.0/bind_host = $ip/" /usr/local/etc/tacker/tacker.conf
+  sed -i -- "s/# bind_port = 8888/bind_port = 9890/" /usr/local/etc/tacker/tacker.conf
+
+  echo "$0: Populate Tacker database"
+  /usr/local/bin/tacker-db-manage --config-file /usr/local/etc/tacker/tacker.conf upgrade head
+
+  echo "$0: Install Tacker Client"
+  cd /tmp/tacker
+  if [[ -d /tmp/tacker/python-tackerclient ]]; then rm -rf /tmp/tacker/python-tackerclient; fi
+  git clone https://github.com/openstack/python-tackerclient
+  cd python-tackerclient
+  git checkout stable/mitaka
+  python setup.py install
+
+  # deferred until its determined how to get this to Horizon
+  #echo "$0: Install Tacker Horizon plugin"
+  #cd /tmp/tacker
+  #git clone https://github.com/openstack/tacker-horizon
+  #cd tacker-horizon
+  #python setup.py install
+  # The next two commands must affect the Horizon server
+  #cp openstack_dashboard_extensions/* /usr/share/openstack-dashboard/openstack_dashboard/enabled/
+  #service apache2 restart
+
+  echo "$0: Start the Tacker Server"
+  python /usr/local/bin/tacker-server --config-file /usr/local/etc/tacker/tacker.conf --log-file /var/log/tacker/tacker.log & disown
+
+  echo "$0: Wait 30 seconds for Tacker server to come online"
+  sleep 30
+
+  echo "$0: Register default VIM"
+  cd /tmp/tacker
+  cat <<EOF >vim-config.yaml 
+auth_url: $OS_AUTH_URL
+username: $OS_USERNAME
+password: $OS_PASSWORD
+project_name: admin
+EOF
+
+  tacker vim-register --config-file vim-config.yaml --description OpenStack --name VIM0
+}
+
+dist=`grep DISTRIB_ID /etc/*-release | awk -F '=' '{print $2}'`
+case "$2" in
+  "init")
+     uid=$(openstack user list | awk "/ tacker / { print \$2 }")
+     if [[ $uid ]]; then
+       echo "$0: Tacker user exists, assuming Tacker service is already installed"
+     else
+       create_tacker_container
+     fi
     exit 0
     ;;
   "setup")
+     uid=$(openstack user list | awk "/ tacker / { print \$2 }")
+     if [[ $uid ]]; then
+       echo "$0: Tacker user exists, assuming Tacker service is already installed"
+     else
+       install_tacker
+     fi
+
+    echo "$0: Prepare Tacker test network environment"
+    setup_test_environment
+    exit 0
     ;;
   "clean")
     source /tmp/tacker/admin-openrc.sh
     openstack endpoint delete $(openstack endpoint list | awk "/tacker/ { print \$2 }")
     openstack user delete $(openstack user list | awk "/tacker/ { print \$2 }")
     openstack service delete $(openstack service list | awk "/tacker/ { print \$2 }")
+    neutron router-gateway-clear vnf_mgmt_router
+    pid=($(neutron router-port-list vnf_mgmt_router|grep -v name|awk '{print $2}')); for id in ${pid[@]}; do neutron router-interface-delete vnf_mgmt_router vnf_mgmt;  done
+    neutron router-delete vnf_mgmt_router
+    neutron net-delete vnf_mgmt
+    neutron router-gateway-clear vnf_private_router
+    pid=($(neutron router-port-list vnf_private_router|grep -v name|awk '{print $2}')); for id in ${pid[@]}; do neutron router-interface-delete vnf_private_router vnf_private;  done
+    neutron router-delete vnf_private_router
+    neutron net-delete vnf_private
     sudo docker stop $(sudo docker ps -a | awk "/tacker/ { print \$1 }")
-    sudo docker rm $(sudo docker ps -a | awk "/tacker/ { print \$1 }")
+    sudo docker rm -v $(sudo docker ps -a | awk "/tacker/ { print \$1 }")
     exit 0
     ;;
   *)
@@ -146,174 +354,3 @@ EOF
     echo "clean: remove Tacker service"
     exit 1
 esac
-
-# STEP 2: Install Tacker in the container
-# Per http://docs.openstack.org/developer/tacker/install/manual_installation.html
-echo "$0: Install dependencies - OS specific"
-if [ "$dist" == "Ubuntu" ]; then
-  apt-get update
-  apt-get install -y python
-  apt-get install -y python-dev
-  apt-get install -y python-pip
-  apt-get install -y wget
-  apt-get install -y openssh-server
-  apt-get install -y git
-  apt-get install -y apg
-  apt-get install -y libffi-dev
-  apt-get install -y libssl-dev
-  export MYSQL_PASSWORD=$(/usr/bin/apg -n 1 -m 16 -c cl_seed)
-  echo $MYSQL_PASSWORD >~/mysql
-  debconf-set-selections <<< 'mysql-server mysql-server/root_password password '$MYSQL_PASSWORD
-  debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password '$MYSQL_PASSWORD
-  apt-get -q -y install mysql-server python-mysqldb
-  service mysql restart 
-fi
-
-cd /tmp/tacker
-
-echo "$0: create Tacker database"
-mysql --user=root --password=$MYSQL_PASSWORD -e "CREATE DATABASE tacker; GRANT ALL PRIVILEGES ON tacker.* TO 'root@localhost' IDENTIFIED BY '"$MYSQL_PASSWORD"'; GRANT ALL PRIVILEGES ON tacker.* TO 'root'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"';"
-
-echo "$0: Upgrage pip again - needs to be the latest version due to errors found in earlier testing"
-pip install --upgrade pip
-
-echo "$0: install python-openstackclient python-glanceclient"
-pip install --upgrade python-openstackclient python-glanceclient python-neutronclient keystonemiddleware
-
-echo "$0: Setup admin-openrc.sh"
-source /tmp/tacker/admin-openrc.sh
-
-echo "$0: Setup Tacker user in OpenStack"
-openstack user create --project services --password tacker tacker
-openstack role add --project services --user tacker admin
-
-echo "$0: Create Tacker service in OpenStack"
-openstack service create --name tacker --description "Tacker Project" nfv-orchestration
-sid=$(openstack service list | awk "/ tacker / { print \$2 }")
-
-echo "$0: Create Tacker service endpoint in OpenStack"
-ip=$(ip addr | awk "/ global eth0/ { print \$2 }" | sed -- 's/\/16//')
-openstack endpoint create --region RegionOne \
-    --publicurl "http://$ip:9890/" \
-    --adminurl "http://$ip:9890/" \
-    --internalurl "http://$ip:9890/" $sid
-
-echo "$0: Clone Tacker"
-if [[ -d /tmp/tacker/tacker ]]; then rm -rf /tmp/tacker/tacker; fi
-git clone git://git.openstack.org/openstack/tacker
-cd tacker
-git checkout stable/mitaka
-
-echo "$0: Install Tacker"
-pip install -r requirements.txt
-pip install tosca-parser
-python setup.py install
-mkdir /var/log/tacker
-
-# Following lines apply to master and not stable/mitaka
-#echo "$0: install tox"
-#pip install tox
-#echo "$0: generate tacker.conf.sample"
-#tox -e config-gen
-
-echo "$0: Update tacker.conf values"
-mkdir /usr/local/etc/tacker
-cp etc/tacker/tacker.conf /usr/local/etc/tacker/tacker.conf
-sed -i -- 's/# auth_strategy = keystone/auth_strategy = keystone/' /usr/local/etc/tacker/tacker.conf
-sed -i -- 's/# debug = False/debug = True/' /usr/local/etc/tacker/tacker.conf
-sed -i -- 's/# use_syslog = False/use_syslog = False/' /usr/local/etc/tacker/tacker.conf
-sed -i -- 's~# state_path = /var/lib/tacker~state_path = /var/lib/tacker~' /usr/local/etc/tacker/tacker.conf
-sed -i -- "s/project_name = service/project_name = services/g" /usr/local/etc/tacker/tacker.conf
-sed -i -- "s/password = service-password/password = tacker/" /usr/local/etc/tacker/tacker.conf
-sed -i -- "s/username = tacker/username = tacker/" /usr/local/etc/tacker/tacker.conf
-sed -i -- "s~auth_url = http://127.0.0.1:35357~auth_url = http://$KEYSTONE_HOST:35357~" /usr/local/etc/tacker/tacker.conf
-sed -i -- "s~identity_uri = http://127.0.0.1:5000~# identity_uri = http://127.0.0.1:5000~" /usr/local/etc/tacker/tacker.conf
-sed -i -- "s~auth_uri = http://127.0.0.1:5000~auth_uri = http://$KEYSTONE_HOST:5000~" /usr/local/etc/tacker/tacker.conf
-# Not sure what the effect of the next line is, given that we are running as root
-#sed -i -- "s~# root_helper = sudo~root_helper = sudo /usr/local/bin/tacker-rootwrap /usr/local/etc/tacker/rootwrap.conf~" /usr/local/etc/tacker/tacker.conf
-sed -i -- "s~# connection = mysql://root:pass@127.0.0.1:3306/tacker~connection = mysql://root:$MYSQL_PASSWORD@localhost:3306/tacker?charset=utf8~" /usr/local/etc/tacker/tacker.conf
-sed -i -- "s~heat_uri = http://localhost:8004/v1~heat_uri = http://$HEAT_HOST:8004/v1~" /usr/local/etc/tacker/tacker.conf
-sed -i -- "s~# api_paste_config = api-paste.ini~api_paste_config = /tmp/tacker/tacker/etc/tacker/api-paste.ini~" /usr/local/etc/tacker/tacker.conf
-sed -i -- "s/# bind_host = 0.0.0.0/bind_host = $ip/" /usr/local/etc/tacker/tacker.conf
-sed -i -- "s/# bind_port = 8888/bind_port = 9890/" /usr/local/etc/tacker/tacker.conf
-
-echo "$0: Populate Tacker database"
-/usr/local/bin/tacker-db-manage --config-file /usr/local/etc/tacker/tacker.conf upgrade head
-
-echo "$0: Install Tacker Client"
-cd /tmp/tacker
-if [[ -d /tmp/tacker/python-tackerclient ]]; then rm -rf /tmp/tacker/python-tackerclient; fi
-git clone https://github.com/openstack/python-tackerclient
-cd python-tackerclient
-git checkout stable/mitaka
-python setup.py install
-
-# deferred until its determined how to get this to Horizon
-#echo "$0: Install Tacker Horizon plugin"
-#cd /tmp/tacker
-#git clone https://github.com/openstack/tacker-horizon
-#cd tacker-horizon
-#python setup.py install
-# The next two commands must affect the Horizon server
-#cp openstack_dashboard_extensions/* /usr/share/openstack-dashboard/openstack_dashboard/enabled/
-#service apache2 restart
-
-echo "$0: Start the Tacker Server"
-python /usr/local/bin/tacker-server --config-file /usr/local/etc/tacker/tacker.conf --log-file /var/log/tacker/tacker.log & disown
-
-echo "$0: Register default VIM"
-cd /tmp/tacker
-cat <<EOF >vim-config.yaml 
-auth_url: $OS_AUTH_URL
-username: $OS_USERNAME
-password: $OS_PASSWORD
-project_name: admin
-EOF
-tacker vim-register --config-file vim-config.yaml --description OpenStack --name VIM0
-
-echo "$0: Prepare Tacker test network environment"
-
-echo "Create management network"
-if [ $(neutron net-list | awk "/ tacker_mgmt / { print \$2 }") ]; then
-  echo "$0: tacker_mgmt network exists"
-else
-  neutron net-create tacker_mgmt               
-  echo "$0: Create management subnet"
-  neutron subnet-create tacker_mgmt 192.168.200.0/24 --name tacker_mgmt --gateway 192.168.200.1 --enable-dhcp --allocation-pool start=192.168.200.2,end=192.168.200.254 --dns-nameserver 8.8.8.8
-fi
-
-echo "$0: Create router for cloudify_mgmt network"
-if [ $(neutron router-list | awk "/ tacker_mgmt / { print \$2 }") ]; then
-  echo "$0: tacker_mgmt router exists"
-else
-  neutron router-create tacker_mgmt_router
-  echo "$0: Add router interface for cloudify_mgmt network"
-  neutron router-interface-add tacker_mgmt_router subnet=tacker_mgmt
-fi
-
-echo "Create private network"
-if [ $(neutron net-list | awk "/ tacker_private / { print \$2 }") ]; then
-  echo "$0: tacker_private network exists"
-else
-  neutron net-create tacker_private            
-  echo "$0: Create private subnet"
-  neutron subnet-create tacker_private 192.168.201.0/24 --name tacker_private --gateway 192.168.201.1 --enable-dhcp --allocation-pool start=192.168.201.2,end=192.168.201.254 --dns-nameserver 8.8.8.8
-fi
-
-echo "$0: Create router for cloudify_private network"
-if [ $(neutron router-list | awk "/ tacker_private / { print \$2 }") ]; then
-  echo "$0: tacker_private router exists"
-else
-  neutron router-create tacker_private_router
-  echo "$0: Create router gateway for cloudify_private network"
-  neutron router-gateway-set tacker_private_router $EXTERNAL_NETWORK_NAME
-  echo "$0: Add router interface for cloudify_private network"
-  neutron router-interface-add tacker_private_router subnet=tacker_private
-fi
-
-echo "$0: Create image cirros-0.3.4-x86_64-uec"
-image=$(openstack image list | awk "/ cirros-0.3.4-x86_64-uec / { print \$2 }")
-if [ -z $image ]; then glance --os-image-api-version 1 image-create --name cirros-0.3.4-x86_64-uec --disk-format qcow2 --location http://download.cirros-cloud.net/0.3.3/cirros-0.3.3-x86_64-disk.img --container-format bare
-fi
-
-