set new model url in model

We are not longer using salt-models/training and all models should be
updated to salt-models/mcp-virtual-lab

Change-Id: Ie49ff2fe216eae2e533b68502d2bc206cea506e0
diff --git a/classes/cluster/virtual-mcp05-dvr/infra/config.yml b/classes/cluster/virtual-mcp05-dvr/infra/config.yml
index 464f3b6..1626f1a 100644
--- a/classes/cluster/virtual-mcp05-dvr/infra/config.yml
+++ b/classes/cluster/virtual-mcp05-dvr/infra/config.yml
@@ -23,7 +23,7 @@
 - cluster.virtual-mcp05-dvr
 parameters:
   _param:
-    reclass_data_repository: https://gerrit.mcp.mirantis.net/salt-models/training
+    reclass_data_repository: https://gerrit.mcp.mirantis.net/salt-models/mcp-virtual-lab
     reclass_data_revision: master
     salt_master_environment_repository: "https://github.com/tcpcloud"
     salt_master_environment_revision: master
diff --git a/classes/cluster/virtual-mcp05-ovs/infra/config.yml b/classes/cluster/virtual-mcp05-ovs/infra/config.yml
index 2e5a1f5..231babf 100644
--- a/classes/cluster/virtual-mcp05-ovs/infra/config.yml
+++ b/classes/cluster/virtual-mcp05-ovs/infra/config.yml
@@ -23,7 +23,7 @@
 - cluster.virtual-mcp05-ovs
 parameters:
   _param:
-    reclass_data_repository: https://gerrit.mcp.mirantis.net/salt-models/training
+    reclass_data_repository: https://gerrit.mcp.mirantis.net/salt-models/mcp-virtual-lab
     reclass_data_revision: master
     salt_master_environment_repository: "https://github.com/tcpcloud"
     salt_master_environment_revision: master
diff --git a/classes/cluster/virtual-mcp10-contrail/infra/config.yml b/classes/cluster/virtual-mcp10-contrail/infra/config.yml
index 832514d..6563a6b 100755
--- a/classes/cluster/virtual-mcp10-contrail/infra/config.yml
+++ b/classes/cluster/virtual-mcp10-contrail/infra/config.yml
@@ -24,7 +24,7 @@
 - cluster.virtual-mcp10-contrail
 parameters:
   _param:
-    reclass_data_repository: "https://gerrit.mcp.mirantis.net/salt-models/training"
+    reclass_data_repository: "https://gerrit.mcp.mirantis.net/salt-models/mcp-virtual-lab"
     reclass_data_revision: master
     reclass_config_master: 192.168.10.100
     single_address: 172.16.10.100
diff --git a/classes/cluster/virtual-mcp10-dvr/infra/config.yml b/classes/cluster/virtual-mcp10-dvr/infra/config.yml
index e2fe62e..4c09279 100644
--- a/classes/cluster/virtual-mcp10-dvr/infra/config.yml
+++ b/classes/cluster/virtual-mcp10-dvr/infra/config.yml
@@ -23,7 +23,7 @@
 - cluster.virtual-mcp10-dvr
 parameters:
   _param:
-    reclass_data_repository: https://gerrit.mcp.mirantis.net/salt-models/training
+    reclass_data_repository: https://gerrit.mcp.mirantis.net/salt-models/mcp-virtual-lab
     reclass_data_revision: master
     salt_master_environment_repository: "https://github.com/tcpcloud"
     salt_master_environment_revision: master
diff --git a/classes/cluster/virtual-mcp10-ovs/infra/config.yml b/classes/cluster/virtual-mcp10-ovs/infra/config.yml
index 3d0c87e..951ba2b 100644
--- a/classes/cluster/virtual-mcp10-ovs/infra/config.yml
+++ b/classes/cluster/virtual-mcp10-ovs/infra/config.yml
@@ -23,7 +23,7 @@
 - cluster.virtual-mcp10-ovs
 parameters:
   _param:
-    reclass_data_repository: https://gerrit.mcp.mirantis.net/salt-models/training
+    reclass_data_repository: https://gerrit.mcp.mirantis.net/salt-models/mcp-virtual-lab
     reclass_data_revision: master
     salt_master_environment_repository: "https://github.com/tcpcloud"
     salt_master_environment_revision: master
diff --git a/scripts/test_reclass.sh b/scripts/test_reclass.sh
new file mode 100755
index 0000000..9ea80ec
--- /dev/null
+++ b/scripts/test_reclass.sh
@@ -0,0 +1,157 @@
+#!/usr/bin/env bash
+
+set -e
+if [[ $DEBUG =~ ^(True|true|1|yes)$ ]]; then
+    set -x
+fi
+
+## Overrideable options
+DOCKER_IMAGE=${DOCKER_IMAGE:-"ubuntu:16.04"}
+DIST=${DIST:-xenial}
+RECLASS_ROOT=${RECLASS_ROOT:-$(pwd)}
+SALT_OPTS="${SALT_OPTS} --retcode-passthrough --force-color"
+DOCKER_OPTS="${DOCKER_OPTS} -e DEBIAN_FRONTEND=noninteractive"
+SKIP_CLEANUP=${SKIP_CLEANUP:-0}
+
+declare -a CONTAINERS
+
+## Functions
+log_info() {
+    echo "[INFO] $*"
+}
+
+log_err() {
+    echo "[ERROR] $*" >&2
+}
+
+docker_exec() {
+    if [[ $DETACH =~ ^(True|true|1|yes)$ ]]; then
+        exec_opts="-d"
+    else
+        exec_opts=""
+    fi
+
+    docker exec ${exec_opts} ${CONTAINER} /bin/bash -c "$*"
+}
+
+_atexit() {
+    RETVAL=$?
+    trap true INT TERM EXIT
+    if [ $SKIP_CLEANUP -eq 1 ]; then
+        return $RETVAL
+    fi
+
+    log_info "Cleaning up"
+
+    for container in ${CONTAINERS[@]}; do
+        CONTAINER=$container docker_exec "chown -R $(id -u):$(id -g) /srv/salt/reclass" || true
+        docker rm -f $container >/dev/null || true
+    done
+
+    if [ $RETVAL -ne 0 ]; then
+        log_err "Execution failed"
+    else
+        log_info "Execution successful"
+    fi
+
+    return $RETVAL
+}
+
+run_container() {
+    MASTER_HOSTNAME=$1
+    CONTAINER=$(docker run ${DOCKER_OPTS} --name ${MASTER_HOSTNAME} -h $(echo ${MASTER_HOSTNAME}|cut -d . -f 1) -v ${RECLASS_ROOT}:/srv/salt/reclass -i -t -d ${DOCKER_IMAGE})
+    echo $CONTAINER
+}
+
+test_master() {
+    MASTER_HOSTNAME=$1
+    log_info "Installing packages"
+    docker_exec "which wget >/dev/null || (apt-get update; apt-get install -y wget)"
+    docker_exec "echo 'deb [arch=amd64] http://apt-mk.mirantis.com/${DIST}/ nightly salt salt-latest' > /etc/apt/sources.list.d/apt-mk.list"
+    docker_exec "wget -O - http://apt-mk.mirantis.com/public.gpg | apt-key add -"
+
+    docker_exec "apt-get update"
+    docker_exec "apt-get install -y salt-master python-psutil iproute2 curl reclass salt-formula-*"
+
+    log_info "Setting up Salt master"
+    # TODO: remove grains.d hack when fixed in formula
+    docker_exec "mkdir -p /etc/salt/grains.d && touch /etc/salt/grains.d/dummy"
+    docker_exec "[ ! -d /etc/salt/pki/minion ] && mkdir -p /etc/salt/pki/minion"
+    docker_exec "[ ! -d /etc/salt/master.d ] && mkdir -p /etc/salt/master.d || true"
+    docker_exec "cat << 'EOF' >> /etc/salt/master.d/master.conf
+file_roots:
+  base:
+    - /usr/share/salt-formulas/env
+pillar_opts: False
+open_mode: True
+reclass: &reclass
+  storage_type: yaml_fs
+  inventory_base_uri: /srv/salt/reclass
+ext_pillar:
+  - reclass: *reclass
+master_tops:
+  reclass: *reclass
+EOF"
+
+    log_info "Setting up reclass"
+    docker_exec "[ -d /srv/salt/reclass/classes/service ] || mkdir -p /srv/salt/reclass/classes/service || true"
+    docker_exec "for i in /usr/share/salt-formulas/reclass/service/*; do
+    [ -e /srv/salt/reclass/classes/service/\$(basename \$i) ] || ln -s \$i /srv/salt/reclass/classes/service/\$(basename \$i)
+    done"
+
+    docker_exec "[ ! -d /etc/reclass ] && mkdir /etc/reclass || true"
+    docker_exec "cat << 'EOF' >> /etc/reclass/reclass-config.yml
+storage_type: yaml_fs
+pretty_print: True
+output: yaml
+inventory_base_uri: /srv/salt/reclass
+EOF"
+
+    log_info "Setting up Salt minion"
+    docker_exec "apt-get install -y salt-minion"
+    docker_exec "[ ! -d /etc/salt/minion.d ] && mkdir -p /etc/salt/minion.d || true"
+    docker_exec "cat << EOF >> /etc/salt/minion.d/minion.conf
+id: ${MASTER_HOSTNAME}
+master: localhost
+EOF"
+
+    log_info "Starting Salt master service"
+    DETACH=1 docker_exec "/usr/bin/salt-master"
+    sleep 3
+
+    docker_exec "salt-call saltutil.sync_all"
+    log_info "Running states to finish Salt master setup"
+    docker_exec "reclass --nodeinfo ${MASTER_HOSTNAME} >/dev/null"
+    docker_exec "salt-call ${SALT_OPTS} state.show_top"
+
+    if [[ $SALT_MASTER_FULL =~ ^(True|true|1|yes)$ ]]; then
+        # TODO: can fail on "hostname: you must be root to change the host name"
+        docker_exec "salt-call ${SALT_OPTS} state.sls linux,openssh" || true
+        docker_exec "salt-call ${SALT_OPTS} state.sls salt,reclass"
+    else
+        docker_exec "salt-call ${SALT_OPTS} state.sls reclass.storage.node" || true
+    fi
+
+    NODES=$(docker_exec "find /srv/salt/reclass/nodes -type f -name *.yml ! -name cfg*")
+    for node in ${NODES}; do
+        node=$(basename $node .yml)
+        log_info "Testing node ${node}"
+        docker_exec "reclass --nodeinfo ${node} >/dev/null"
+        docker_exec "salt-call ${SALT_OPTS} --id=${node} state.show_top"
+        docker_exec "salt-call ${SALT_OPTS} --id=${node} state.show_lowstate >/dev/null"
+    done
+}
+
+
+## Main
+trap _atexit INT TERM EXIT
+
+masters=$(find nodes -type f -name cfg*.yml)
+for master in ${masters[@]}; do
+    master=$(basename $master .yml)
+    log_info "Testing Salt master ${master}"
+    log_info "Creating docker container from image ${DOCKER_IMAGE}"
+    CONTAINER=$(run_container $master)
+    CONTAINERS+=(${CONTAINER})
+    test_master $master
+done