Add compass-docker-compose 73/46773/10
authorHarry Huang <huangxiangyu5@huawei.com>
Tue, 7 Nov 2017 07:30:51 +0000 (15:30 +0800)
committerHarry Huang <huangxiangyu5@huawei.com>
Thu, 21 Dec 2017 07:35:12 +0000 (15:35 +0800)
1. Add ansible for docker compose containerized
compass
2. deploy/conf/compass.conf no longer specify
image tags for runtime. build.yaml now is added
into compass tarball to be the only place determine
image tags
3. This patch is based on patch:
https://gerrit.opnfv.org/gerrit/#/c/47393/
use merged compass-tasks
4. Tempoarily using private docker repo for
compass-tasks. Switch to opnfv repo when patch
https://gerrit.opnfv.org/gerrit/#/c/47329/
is merged
5. Modify ansible callback module accrodingly

Change-Id: I0728a9002a1cc7804c9e8f13bd1afdccb684a159
Signed-off-by: Harry Huang <huangxiangyu5@huawei.com>
38 files changed:
build.sh
build/build.yaml
deploy/compass_vm.sh
deploy/conf/compass.conf
deploy/playbook_done.py
deploy/status_callback.py
util/docker-compose/add_machine.yml [new file with mode: 0755]
util/docker-compose/bring_up_compass.yml [new file with mode: 0755]
util/docker-compose/group_vars/all [new file with mode: 0755]
util/docker-compose/roles/cobbler/tasks/main.yml [new file with mode: 0755]
util/docker-compose/roles/cobbler/templates/dhcp.template.j2 [new file with mode: 0755]
util/docker-compose/roles/cobbler/templates/named.template.j2 [new file with mode: 0755]
util/docker-compose/roles/cobbler/templates/settings.j2 [new file with mode: 0755]
util/docker-compose/roles/cobbler/templates/zone.template.j2 [new file with mode: 0755]
util/docker-compose/roles/compass/files/pipework [new file with mode: 0755]
util/docker-compose/roles/compass/files/prepare_ansible.sh [new file with mode: 0755]
util/docker-compose/roles/compass/files/preseed_post_anamon [new file with mode: 0755]
util/docker-compose/roles/compass/files/switch_list.conf [new file with mode: 0755]
util/docker-compose/roles/compass/files/up_containers.sh [new file with mode: 0755]
util/docker-compose/roles/compass/tasks/main.yml [new file with mode: 0755]
util/docker-compose/roles/compass/templates/cobbler.conf.j2 [new file with mode: 0755]
util/docker-compose/roles/compass/templates/dhcp.template.j2 [new file with mode: 0755]
util/docker-compose/roles/compass/templates/distro_signatures.json [new file with mode: 0755]
util/docker-compose/roles/compass/templates/docker-compose.yml.j2 [new file with mode: 0755]
util/docker-compose/roles/compass/templates/machine_list.conf.j2 [new file with mode: 0755]
util/docker-compose/roles/compass/templates/named.template.j2 [new file with mode: 0755]
util/docker-compose/roles/compass/templates/prepare_ansible.sh.j2 [new file with mode: 0755]
util/docker-compose/roles/compass/templates/settings.j2 [new file with mode: 0755]
util/docker-compose/roles/compass/templates/zone.template.j2 [new file with mode: 0755]
util/docker-compose/roles/discovery/tasks/main.yml [new file with mode: 0755]
util/docker-compose/roles/discovery/templates/compass_discovery.service.j2 [new file with mode: 0755]
util/docker-compose/roles/discovery/templates/dhcp.template.j2 [new file with mode: 0755]
util/docker-compose/roles/discovery/templates/distro_signatures.json.j2 [new file with mode: 0755]
util/docker-compose/roles/discovery/vars/main.yml [new file with mode: 0755]
util/docker-compose/roles/machines/tasks/main.yml [new file with mode: 0755]
util/docker-compose/roles/machines/templates/switch_machines_file.j2 [new file with mode: 0755]
util/docker-compose/roles/osa/files/cinder.yml [new file with mode: 0755]
util/docker-compose/roles/osa/tasks/main.yml [new file with mode: 0755]

index 1a0cf45..7f67ee2 100755 (executable)
--- a/build.sh
+++ b/build.sh
@@ -102,7 +102,9 @@ function build_tar()
     sudo rm -rf compass_dists
     mkdir -p compass_dists
     sudo cp -f *.tar *.iso compass_dists
-    sudo tar -zcf compass.tar.gz compass-docker-compose compass_dists
+    sudo cp $COMPASS_PATH/build/build.yaml compass_dists
+    sudo cp -rf $COMPASS_PATH/util/docker-compose ./
+    sudo tar -zcf compass.tar.gz docker-compose compass_dists
     sudo mv compass.tar.gz $TAR_DIR/$TAR_NAME
     cd -
 }
index 210169e..cb97c49 100644 (file)
@@ -15,16 +15,10 @@ packages:
     get_method: docker
     url: compass4nfv/compass-deck:latest
 
-  - name: compass-tasks-osa
-    description: "compass task container for openstack deployment via openstack-ansible"
+  - name: compass-tasks
+    description: "compass task container integrated with openstack-ansible and kubespray"
     get_method: docker
-    url: yifei0van0xue/compass-tasks-osa:latest
-
-  - name: compass-tasks-k8s
-    description: "compass task container for kubernets deployment via kargo"
-    get_method: docker
-    url: compass4nfv/compass-tasks-k8s:latest
-
+    url: huangxiangyu/compass-tasks:latest
 
   - name: compass-cobbler
     description: "cobbler container for compass"
@@ -50,8 +44,3 @@ packages:
     description: "compass repo container for deployment"
     get_method: docker
     url: compass4nfv/compass-repo-osa-ubuntu:euphrates
-
-  - name: compass-docker-compose
-    description: "containerized compass compose ansible"
-    get_method: git
-    url: https://github.com/yifei-xue/compass-docker-compose.git
index cc0471a..7689f41 100755 (executable)
@@ -27,11 +27,11 @@ function install_compass_core() {
 }
 
 function set_compass_machine() {
-    local config_file=$WORK_DIR/installer/compass-docker-compose/group_vars/all
+    local config_file=$WORK_DIR/installer/docker-compose/group_vars/all
     sed -i '/pxe_boot_macs/d' $config_file
     echo "pxe_boot_macs: [${machines}]" >> $config_file
 
-    ansible-playbook $WORK_DIR/installer/compass-docker-compose/add_machine.yml
+    ansible-playbook $WORK_DIR/installer/docker-compose/add_machine.yml
 }
 
 function install_compass() {
@@ -129,13 +129,9 @@ function wait_ok() {
 }
 
 function launch_compass() {
-    local group_vars=$WORK_DIR/installer/compass-docker-compose/group_vars/all
+    local group_vars=$WORK_DIR/installer/docker-compose/group_vars/all
     sed -i "s#^\(compass_dir:\).*#\1 $COMPASS_DIR#g" $group_vars
-    sed -i "s#^\(compass_deck:\).*#\1 $COMPASS_DECK#g" $group_vars
-    sed -i "s#^\(compass_tasks:\).*#\1 $COMPASS_TASKS#g" $group_vars
-    sed -i "s#^\(compass_cobbler:\).*#\1 $COMPASS_COBBLER#g" $group_vars
-    sed -i "s#^\(compass_db:\).*#\1 $COMPASS_DB#g" $group_vars
-    sed -i "s#^\(compass_mq:\).*#\1 $COMPASS_MQ#g" $group_vars
+    sed -i "s#^\(compose_images:\).*#\1 $COMPOSE_IMAGES#g" $group_vars
 
     if [[ $OFFLINE_DEPLOY == "Enable" ]]; then
         sed -i "s#.*\(compass_repo:\).*#\1 $COMPASS_REPO#g" $group_vars
@@ -150,7 +146,7 @@ function launch_compass() {
 
     sed -i "s#^\(deck_port:\).*#\1 $COMPASS_DECK_PORT#g" $group_vars
     sed -i "s#^\(repo_port:\).*#\1 $COMPASS_REPO_PORT#g" $group_vars
-    ansible-playbook $WORK_DIR/installer/compass-docker-compose/bring_up_compass.yml
+    ansible-playbook $WORK_DIR/installer/docker-compose/bring_up_compass.yml
 }
 
 function recover_compass() {
index 78dd141..9d9145f 100644 (file)
@@ -17,38 +17,4 @@ export NTP_SERVER="$COMPASS_SERVER"
 export NAMESERVERS=${USER_NAMESERVER:-"$COMPASS_SERVER"}
 export COMPASS_REPO_PORT="5151"
 export OFFLINE_DEPLOY=${OFFLINE_DEPLOY:-'Disable'}
-
-if [ "$COMPASS_ARCH" = "aarch64" ]; then
-  # Docker images for aarch64
-
-  # Arm images are temporarily held at dockerhub linaro repo
-  COMPASS_DOCKER_REPO=${COMPASS_DOCKER_REPO:-linaro}
-
-  export COMPASS_DECK="$COMPASS_DOCKER_REPO/compass-deck"
-  export COMPASS_TASKS="$COMPASS_DOCKER_REPO/compass-tasks-osa"
-
-  if [[ "x"$KUBERNETES_VERSION != "x" ]]; then
-    export COMPASS_TASKS="$COMPASS_DOCKER_REPO/compass-tasks-k8s"
-  fi
-
-  export COMPASS_DB="$COMPASS_DOCKER_REPO/compass-db"
-  export COMPASS_MQ="$COMPASS_DOCKER_REPO/compass-mq"
-  export COMPASS_REPO="$COMPASS_DOCKER_REPO/compass-repo-osa-ubuntu:euphrates"
-  export COMPASS_COBBLER="$COMPASS_DOCKER_REPO/compass-cobbler"
-
-else
-  # Docker images for x86_64
-
-  export COMPASS_DECK="compass4nfv/compass-deck"
-  export COMPASS_TASKS="yifei0van0xue/compass-tasks-osa"
-
-  if [[ "x"$KUBERNETES_VERSION != "x" ]]; then
-    export COMPASS_TASKS="compass4nfv/compass-tasks-k8s"
-  fi
-
-  export COMPASS_DB="compass4nfv/compass-db"
-  export COMPASS_MQ="compass4nfv/compass-mq"
-  export COMPASS_REPO="compass4nfv/compass-repo-osa-ubuntu:euphrates"
-  export COMPASS_COBBLER="yifei0van0xue/compass-cobbler"
-
-fi
+export COMPOSE_IMAGES="[compass-db,compass-mq,compass-deck,compass-tasks,compass-cobbler]"
index 24c8c55..6b1043d 100644 (file)
 # limitations under the License.
 
 """Ansible playbook callback after a playbook run has completed."""
-import os
 import sys
 
 from ansible.plugins.callback import CallbackBase
 
-current_dir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(current_dir + '/..')
+compass_bin = "/opt/compass/bin"
+sys.path.append(compass_bin)
 
+import switch_virtualenv  # noqa: F401
 
-# import switch_virtualenv  # noqa
 from compass.apiclient.restful import Client  # noqa: E402
 from compass.utils import flags  # noqa: E402
 
index 4bbbc32..f0615f3 100644 (file)
@@ -16,13 +16,13 @@ from ansible.plugins.callback import CallbackBase
 COMPASS_HOST = "compass-deck"
 
 
-def task_error(display, host, data):
-    display.display("task_error: host=%s,data=%s" % (host, data))
-
-#    if isinstance(data, dict):
-#        invocation = data.pop('invocation', {})
-
-    notify_host(display, COMPASS_HOST, host, "failed")
+def task_error(display, host, data):
+    display.display("task_error: host=%s,data=%s" % (host, data))
+#
+#     if isinstance(data, dict):
+#         invocation = data.pop('invocation', {})
+#
+    notify_host(display, COMPASS_HOST, host, "failed")
 
 
 class CallbackModule(CallbackBase):
@@ -101,39 +101,47 @@ class CallbackModule(CallbackBase):
 
     def v2_playbook_on_stats(self, stats):
         self._display.display("playbook_on_stats enter")
+        all_vars = self.play.get_variable_manager().get_vars(self.loader)
+        host_vars = all_vars["hostvars"]
         hosts = sorted(stats.processed.keys())
-        failures = False
-        unreachable = False
-
-        for host in hosts:
-            summary = stats.summarize(host)
-            # self._display.display("host: %s \nsummary: %s\n" % (host, summary)) # noqa
-
-            if summary['failures'] > 0:
-                failures = True
-            if summary['unreachable'] > 0:
-                unreachable = True
+        cluster_name = host_vars[hosts[0]]['cluster_name']
 
         headers = {"Content-type": "application/json",
                    "Accept": "*/*"}
-
         conn = httplib.HTTPConnection(COMPASS_HOST, 80)
         token = auth(conn)
         headers["X-Auth-Token"] = token
-        get_url = "/api/hosts"
+        get_url = "/api/clusterhosts"
         conn.request("GET", get_url, "", headers)
         resp = conn.getresponse()
         raise_for_status(resp)
-        host_data = json.loads(resp.read())
-        clusterhosts = [item["name"] for item in host_data]
-
-        if failures or unreachable:
-            host_status = "error"
-        else:
-            host_status = "succ"
+        clusterhost_data = json.loads(resp.read())
+        clusterhost_mapping = {}
+        for item in clusterhost_data:
+            if item["clustername"] == cluster_name:
+                clusterhost_mapping.update({item["hostname"]:
+                                           item["clusterhost_id"]})
+
+        force_error = False
+        if "localhost" in hosts:
+            summary = stats.summarize("localhost")
+            if summary['failures'] > 0 or summary['unreachable'] > 0:
+                force_error = True
+
+        for hostname, hostid in clusterhost_mapping.iteritems():
+            if hostname not in hosts:
+                continue
+
+            summary = stats.summarize(hostname)
+            # self._display.display("host: %s \nsummary: %s\n" % (host, summary)) # noqa
 
-        for host in clusterhosts:
-            notify_host(self._display, "compass-deck", host, host_status)
+            if summary['failures'] > 0 or summary['unreachable'] > 0 \
+               or force_error:
+                status = "error"
+            else:
+                status = "succ"
+            self._display.display("hostname: %s" % hostname)
+            notify_host(self._display, COMPASS_HOST, hostid, status)
 
 
 def raise_for_status(resp):
@@ -157,17 +165,15 @@ def auth(conn):
     return json.loads(resp.read())["token"]
 
 
-def notify_host(display, compass_host, host, status):
-    display.display("hostname: %s" % host)
-    host = host.strip("host")
-    url = "/api/clusterhosts/%s/state" % host
+def notify_host(display, compass_host, hostid, status):
+    url = "/api/clusterhosts/%s/state" % hostid
     if status == "succ":
         body = {"state": "SUCCESSFUL"}
     elif status == "error":
         body = {"state": "ERROR"}
     else:
-        display.error("notify_host: host %s with status %s is not supported"
-                      % (host, status))
+        display.error("notify_host: hostid %s with status %s is not supported"
+                      % (hostid, status))
         return
 
     headers = {"Content-type": "application/json",
diff --git a/util/docker-compose/add_machine.yml b/util/docker-compose/add_machine.yml
new file mode 100755 (executable)
index 0000000..05a66ae
--- /dev/null
@@ -0,0 +1,8 @@
+---
+- name: Add Machine
+  hosts: localhost
+  sudo: "True"
+  roles:
+    # - discovery
+    - machines
+    # - osa
diff --git a/util/docker-compose/bring_up_compass.yml b/util/docker-compose/bring_up_compass.yml
new file mode 100755 (executable)
index 0000000..77b8536
--- /dev/null
@@ -0,0 +1,8 @@
+---
+- name: Install Compass
+  hosts: localhost
+  sudo: "True"
+  roles:
+    # - docker
+    - compass
+    - cobbler
diff --git a/util/docker-compose/group_vars/all b/util/docker-compose/group_vars/all
new file mode 100755 (executable)
index 0000000..1dafe81
--- /dev/null
@@ -0,0 +1,41 @@
+---
+# env vars
+compass_dir:
+compass_dists_dir: "{{ compass_dir }}/work/deploy/installer/compass_dists"
+docker_compose_dir: "{{ compass_dir }}/work/deploy/docker"
+
+compose_images:
+
+docker_tag: v0.1
+deck_port: 5050
+repo_port: 5151
+
+host_ip: 10.1.0.1
+install_subnet: 10.1.0.0
+install_prefix: 24
+install_netmask: 255.255.255.0
+install_ip_range: 10.1.0.100 10.1.0.250
+
+pip_pkg_name: pip-openstack.tar.gz
+feature_pkg_name: packages.tar.gz
+
+distros:
+  ubuntu-16.04.3:
+    breed: "ubuntu"
+    kickstart: "default16.seed"
+    kopts: "netcfg/choose_interface=auto console='ttyS0,115200n8' console=tty0 net.ifnames=0 biosdevname=0 vga=788"
+    kopts_post: "console='ttyS0,115200n8' console=tty0 net.ifnames=0 biosdevname=0 vga=788"
+    extra: "--apt-dists=xenial --apt-components=main"
+    aliase: "xenial"
+    version: "ubuntu"
+    iso_name: ubuntu-16.04.3-server-amd64
+    ppa_name: xenial-pike-ppa
+
+  CentOS-7:
+    breed: "redhat"
+    kickstart: "default.ks"
+    aliase: "centos7"
+    version: "centos"
+    iso_name: CentOS-7-x86_64-Minimal-1708
+    ppa_name: centos7-pike-ppa
+
diff --git a/util/docker-compose/roles/cobbler/tasks/main.yml b/util/docker-compose/roles/cobbler/tasks/main.yml
new file mode 100755 (executable)
index 0000000..e3f1308
--- /dev/null
@@ -0,0 +1,97 @@
+---
+- name: copy files
+  shell: |
+    docker exec compass-cobbler bash -c \
+    "cp -rf /root/cobbler/* /var/lib/cobbler/; \
+     rm -rf /var/lib/cobbler/conf; \
+     cp -rf /root/cobbler/conf/* /etc/cobbler"
+
+- name: chmod migrate_ks.py
+  shell: |
+    docker exec compass-cobbler bash -c \
+    "chmod +x /var/lib/cobbler/triggers/sync/post/migrate_ks.py"
+
+- name: render cobbler files
+  template:
+    src: "{{ item }}.j2"
+    dest: "{{ docker_compose_dir }}/cobbler/{{ item }}"
+  with_items:
+    - dhcp.template
+    - named.template
+    - settings
+    - zone.template
+
+- name: copy files to /etc/cobbler
+  shell: |
+    docker cp "{{ docker_compose_dir }}/cobbler/{{ item }}" compass-cobbler:/etc/cobbler
+  with_items:
+    - dhcp.template
+    - named.template
+    - settings
+    - zone.template
+
+# - name: restart cobblerd service
+#   shell: |
+#     docker exec compass-cobbler bash -c \
+#     "service cobblerd restart"
+
+- name: prepare iso and ppa
+  shell: |
+    docker cp "{{ compass_dists_dir }}/{{ item.value.iso_name }}.iso" compass-cobbler:/tmp
+    docker exec compass-cobbler bash -c \
+    "mkdir -p /mnt/{{ item.value.iso_name }}; \
+     mount -o loop /tmp/{{ item.value.iso_name }}.iso /mnt/{{ item.value.iso_name }}"
+    docker cp "{{ compass_dists_dir }}/{{ item.value.ppa_name }}.tar.gz" compass-cobbler:/tmp
+    docker exec compass-cobbler bash -c \
+    "mkdir -p /var/lib/cobbler/repo_mirror/{{ item.value.ppa_name }}"
+  with_dict: "{{ distros }}"
+  run_once: "True"
+  ignore_errors: "True"
+
+- name: cobbler import iso
+  shell: |
+    name=`basename {{ item.value.iso_name }} | \
+    sed -e 's/.iso//g' -e 's/-amd64//g' -e 's/-x86_64//g'`
+    docker exec compass-cobbler bash -c \
+    "service cobblerd restart;
+     sleep 3;
+     cobbler import --name $name \
+                    --path /mnt/{{ item.value.iso_name }} \
+                    --arch x86_64 \
+                    --kickstart /var/lib/cobbler/kickstarts/{{ item.value.kickstart }} \
+                    --breed {{ item.value.breed }}"
+  with_dict: "{{ distros }}"
+  run_once: "True"
+  register: result2
+  until: result2.rc == 0
+  retries: 10
+  delay: 3
+
+- name: add repos
+  shell: |
+    docker exec compass-cobbler bash -c \
+    "cobbler repo add --name {{ item.value.ppa_name }} \
+                      --mirror /var/lib/cobbler/repo_mirror/{{ item.value.ppa_name }} \
+                      --mirror-locally True \
+                      --arch=x86_64 {{ item.value.extra | default()}}"
+  with_dict: "{{ distros }}"
+  run_once: "True"
+
+- name: edit profiles
+  shell: |
+    name=`basename {{ item.value.iso_name }} | \
+    sed -e 's/.iso//g' -e 's/-amd64//g' -e 's/-x86_64//g'`-x86_64
+    docker exec compass-cobbler bash -c \
+    "cobbler profile edit --name $name \
+                          --name-servers '' \
+                          --repos {{ item.value.ppa_name }} \
+                          --ksmeta \"tree=http://{{ host_ip }}/cobbler/ks_mirror/$name\" \
+                          --kopts \"{{ item.value.kopts | default('') }}\" \
+                          --kopts-post \"{{ item.value.kopts_post | default('') }}\""
+  with_dict: "{{ distros }}"
+  run_once: "True"
+
+- name: cobbler sync
+  shell: |
+    docker exec compass-cobbler bash -c \
+    "cobbler sync"
diff --git a/util/docker-compose/roles/cobbler/templates/dhcp.template.j2 b/util/docker-compose/roles/cobbler/templates/dhcp.template.j2
new file mode 100755 (executable)
index 0000000..0665f2f
--- /dev/null
@@ -0,0 +1,97 @@
+# ******************************************************************
+# Cobbler managed dhcpd.conf file
+#
+# generated from cobbler dhcp.conf template ($date)
+# Do NOT make changes to /etc/dhcpd.conf. Instead, make your changes
+# in /etc/cobbler/dhcp.template, as /etc/dhcpd.conf will be
+# overwritten.
+#
+# ******************************************************************
+
+ddns-update-style interim;
+
+allow booting;
+allow bootp;
+deny unknown-clients;
+local-address {{ host_ip }};
+log-facility local6;
+
+ignore client-updates;
+set vendorclass = option vendor-class-identifier;
+
+option pxe-system-type code 93 = unsigned integer 16;
+option space pxelinux;
+option pxelinux.magic      code 208 = string;
+option pxelinux.configfile code 209 = text;
+option pxelinux.pathprefix code 210 = text;
+option pxelinux.reboottime code 211 = unsigned integer 32;
+
+subnet {{ install_subnet }} netmask {{ install_netmask }} {
+     option routers {{ host_ip }};
+     option domain-name-servers {{ host_ip }};
+     option subnet-mask {{ install_netmask }};
+     range dynamic-bootp {{ install_ip_range }};
+     default-lease-time 21600;
+     max-lease-time 43200;
+     next-server {{ host_ip }};
+     class "pxeclients" {
+          match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
+          if option pxe-system-type = 00:02 {
+                  filename "ia64/elilo.efi";
+          } else if option pxe-system-type = 00:06 {
+                  filename "grub/grub-x86.efi";
+          } else if option pxe-system-type = 00:07 {
+                  filename "grub/grub-x86_64.efi";
+          } else {
+                  filename "pxelinux.0";
+          }
+     }
+
+}
+
+#for dhcp_tag in $dhcp_tags.keys():
+    ## group could be subnet if your dhcp tags line up with your subnets
+    ## or really any valid dhcpd.conf construct ... if you only use the
+    ## default dhcp tag in cobbler, the group block can be deleted for a
+    ## flat configuration
+# group for Cobbler DHCP tag: $dhcp_tag
+group {
+        #for mac in $dhcp_tags[$dhcp_tag].keys():
+            #set iface = $dhcp_tags[$dhcp_tag][$mac]
+    host $iface.name {
+        hardware ethernet $mac;
+        site-option-space "pxelinux";
+        option pxelinux.magic f1:00:74:7e;
+        if exists dhcp-parameter-request-list {
+            # Always send the PXELINUX options (specified in hexadecimal)
+            option dhcp-parameter-request-list = concat(option dhcp-parameter-request-list,d0,d1,d2,d3);
+        }
+        option pxelinux.reboottime 30;
+        #if $iface.hostname:
+        option host-name "$iface.hostname";
+        #end if
+        #if $iface.netmask:
+        option subnet-mask $iface.netmask;
+        #end if
+        #if $iface.gateway:
+        option routers $iface.gateway;
+        #end if
+        #if $iface.enable_gpxe:
+        if exists user-class and option user-class = "gPXE" {
+            filename "http://$cobbler_server/cblr/svc/op/gpxe/system/$iface.owner";
+        } else if exists user-class and option user-class = "iPXE" {
+            filename "http://$cobbler_server/cblr/svc/op/gpxe/system/$iface.owner";
+        } else {
+            filename "undionly.kpxe";
+        }
+        #else
+        filename "$iface.filename";
+        #end if
+        ## Cobbler defaults to $next_server, but some users
+        ## may like to use $iface.system.server for proxied setups
+        next-server $next_server;
+        ## next-server $iface.next_server;
+    }
+        #end for
+}
+#end for
diff --git a/util/docker-compose/roles/cobbler/templates/named.template.j2 b/util/docker-compose/roles/cobbler/templates/named.template.j2
new file mode 100755 (executable)
index 0000000..0cf7622
--- /dev/null
@@ -0,0 +1,31 @@
+options {
+          listen-on port 53 { {{ host_ip }}; };
+          directory       "/var/named";
+          dump-file       "/var/named/data/cache_dump.db";
+          statistics-file "/var/named/data/named_stats.txt";
+          memstatistics-file "/var/named/data/named_mem_stats.txt";
+          allow-query { 127.0.0.0/8; {{ install_subnet }}/{{ install_prefix }}; };
+          recursion yes;
+};
+
+logging {
+        channel default_debug {
+                file "data/named.run";
+                severity dynamic;
+        };
+};
+
+#for $zone in $forward_zones
+zone "${zone}." {
+    type master;
+    file "$zone";
+};
+
+#end for
+#for $zone, $arpa in $reverse_zones
+zone "${arpa}." {
+    type master;
+    file "$zone";
+};
+
+#end for
diff --git a/util/docker-compose/roles/cobbler/templates/settings.j2 b/util/docker-compose/roles/cobbler/templates/settings.j2
new file mode 100755 (executable)
index 0000000..9e4a739
--- /dev/null
@@ -0,0 +1,450 @@
+---
+# cobbler settings file
+# restart cobblerd and run "cobbler sync" after making changes
+# This config file is in YAML 1.0 format
+# see http://yaml.org
+# ==========================================================
+# if 1, cobbler will allow insertions of system records that duplicate
+# the --dns-name information of other system records.  In general,
+# this is undesirable and should be left 0.
+allow_duplicate_hostnames: 0
+
+# if 1, cobbler will allow insertions of system records that duplicate
+# the ip address information of other system records.  In general,
+# this is undesirable and should be left 0.
+allow_duplicate_ips: 0
+
+# if 1, cobbler will allow insertions of system records that duplicate
+# the mac address information of other system records.  In general,
+# this is undesirable.
+allow_duplicate_macs: 0
+
+# if 1, cobbler will allow settings to be changed dynamically without
+# a restart of the cobblerd daemon. You can only change this variable
+# by manually editing the settings file, and you MUST restart cobblerd
+# after changing it.
+allow_dynamic_settings: 0
+
+# by default, installs are *not* set to send installation logs to the cobbler
+# # # server.  With 'anamon_enabled', kickstart templates may use the pre_anamon
+# # # snippet to allow remote live monitoring of their installations from the
+# # # cobbler server.  Installation logs will be stored under
+# # # /var/log/cobbler/anamon/.  NOTE: This does allow an xmlrpc call to send logs
+# # # to this directory, without authentication, so enable only if you are
+# # # ok with this limitation.
+anamon_enabled: 1
+
+# If using authn_pam in the modules.conf, this can be configured
+# to change the PAM service authentication will be tested against.
+# The default value is "login".
+authn_pam_service: "login"
+
+# Email out a report when cobbler finishes installing a system.
+# enabled: set to 1 to turn this feature on
+# sender: optional
+# email: which addresses to email
+# smtp_server: used to specify another server for an MTA
+# subject: use the default subject unless overridden
+build_reporting_enabled: 0
+build_reporting_sender: ""
+build_reporting_email: [ 'root@localhost' ]
+build_reporting_smtp_server: "localhost"
+build_reporting_subject: ""
+
+# Cheetah-language kickstart templates can import Python modules.
+# while this is a useful feature, it is not safe to allow them to
+# import anything they want. This whitelists which modules can be
+# imported through Cheetah.  Users can expand this as needed but
+# should never allow modules such as subprocess or those that
+# allow access to the filesystem as Cheetah templates are evaluated
+# by cobblerd as code.
+cheetah_import_whitelist:
+ - "random"
+ - "re"
+ - "time"
+
+# Default createrepo_flags to use for new repositories. If you have
+# createrepo >= 0.4.10, consider "-c cache --update -C", which can
+# dramatically improve your "cobbler reposync" time.  "-s sha"
+# enables working with Fedora repos from F11/F12 from EL-4 or
+# EL-5 without python-hashlib installed (which is not available
+# on EL-4)
+createrepo_flags: "-c cache -s sha"
+
+# if no kickstart is specified to profile add, use this template
+default_kickstart: /var/lib/cobbler/kickstarts/default.ks
+
+# configure all installed systems to use these nameservers by default
+# unless defined differently in the profile.  For DHCP configurations
+# you probably do /not/ want to supply this.
+default_name_servers: ['10.1.10.15']
+
+# if using the authz_ownership module (see the Wiki), objects
+# created without specifying an owner are assigned to this
+# owner and/or group.  Can be a comma seperated list.
+default_ownership:
+ - "admin"
+
+# cobbler has various sample kickstart templates stored
+# in /var/lib/cobbler/kickstarts/.  This controls
+# what install (root) password is set up for those
+# systems that reference this variable.  The factory
+# default is "cobbler" and cobbler check will warn if
+# this is not changed.
+# The simplest way to change the password is to run
+# openssl passwd -1
+# and put the output between the "" below.
+default_password_crypted: "$1$huawei$9OkoVJwO4W8vavlXd1bUS/"
+
+# the default template type to use in the absence of any
+# other detected template. If you do not specify the template
+# with '#template=<template_type>' on the first line of your
+# templates/snippets, cobbler will assume try to use the
+# following template engine to parse the templates.
+#
+# Current valid values are: cheetah, jinja2
+default_template_type: "cheetah"
+
+# for libvirt based installs in koan, if no virt bridge
+# is specified, which bridge do we try?  For EL 4/5 hosts
+# this should be xenbr0, for all versions of Fedora, try
+# "virbr0".  This can be overriden on a per-profile
+# basis or at the koan command line though this saves
+# typing to just set it here to the most common option.
+default_virt_bridge: xenbr0
+
+# use this as the default disk size for virt guests (GB)
+default_virt_file_size: 5
+
+# use this as the default memory size for virt guests (MB)
+default_virt_ram: 512
+
+# if koan is invoked without --virt-type and no virt-type
+# is set on the profile/system, what virtualization type
+# should be assumed?  Values: xenpv, xenfv, qemu, vmware
+# (NOTE: this does not change what virt_type is chosen by import)
+default_virt_type: xenpv
+
+# enable gPXE booting? Enabling this option will cause cobbler
+# to copy the undionly.kpxe file to the tftp root directory,
+# and if a profile/system is configured to boot via gpxe it will
+# chain load off pxelinux.0.
+# Default: 0
+enable_gpxe: 0
+
+# controls whether cobbler will add each new profile entry to the default
+# PXE boot menu.  This can be over-ridden on a per-profile
+# basis when adding/editing profiles with --enable-menu=0/1.  Users
+# should ordinarily leave this setting enabled unless they are concerned
+# with accidental reinstalls from users who select an entry at the PXE
+# boot menu.  Adding a password to the boot menus templates
+# may also be a good solution to prevent unwanted reinstallations
+enable_menu: 0
+
+# enable Func-integration?  This makes sure each installed machine is set up
+# to use func out of the box, which is a powerful way to script and control
+# remote machines.
+# Func lives at http://fedorahosted.org/func
+# read more at https://github.com/cobbler/cobbler/wiki/Func-integration
+# you will need to mirror Fedora/EPEL packages for this feature, so see
+# https://github.com/cobbler/cobbler/wiki/Manage-yum-repos if you want cobbler
+# to help you with this
+func_auto_setup: 0
+func_master: overlord.example.org
+
+# change this port if Apache is not running plaintext on port
+# 80.  Most people can leave this alone.
+http_port: 80
+
+# kernel options that should be present in every cobbler installation.
+# kernel options can also be applied at the distro/profile/system
+# level.
+kernel_options:
+ ksdevice: bootif
+ lang: ' '
+ text: ~
+
+# s390 systems require additional kernel options in addition to the
+# above defaults
+kernel_options_s390x:
+ RUNKS: 1
+ ramdisk_size: 40000
+ root: /dev/ram0
+ ro: ~
+ ip: off
+ vnc: ~
+
+# configuration options if using the authn_ldap module. See the
+# the Wiki for details.  This can be ignored if you are not using
+# LDAP for WebUI/XMLRPC authentication.
+ldap_server: "ldap.example.com"
+ldap_base_dn: "DC=example,DC=com"
+ldap_port: 389
+ldap_tls: 1
+ldap_anonymous_bind: 1
+ldap_search_bind_dn: ''
+ldap_search_passwd: ''
+ldap_search_prefix: 'uid='
+ldap_tls_cacertfile: ''
+ldap_tls_keyfile: ''
+ldap_tls_certfile: ''
+
+# cobbler has a feature that allows for integration with config management
+# systems such as Puppet.  The following parameters work in conjunction with
+# --mgmt-classes  and are described in furhter detail at:
+# https://github.com/cobbler/cobbler/wiki/Using-cobbler-with-a-configuration-management-system
+mgmt_classes: []
+mgmt_parameters:
+ from_cobbler: 1
+
+# if enabled, this setting ensures that puppet is installed during
+# machine provision, a client certificate is generated and a
+# certificate signing request is made with the puppet master server
+puppet_auto_setup: 0
+
+# when puppet starts on a system after installation it needs to have
+# its certificate signed by the puppet master server. Enabling the
+# following feature will ensure that the puppet server signs the
+# certificate after installation if the puppet master server is
+# running on the same machine as cobbler. This requires
+# puppet_auto_setup above to be enabled
+sign_puppet_certs_automatically: 0
+
+# location of the puppet executable, used for revoking certificates
+puppetca_path: "/usr/bin/puppet"
+
+# when a puppet managed machine is reinstalled it is necessary to
+# remove the puppet certificate from the puppet master server before a
+# new certificate is signed (see above). Enabling the following
+# feature will ensure that the certificate for the machine to be
+# installed is removed from the puppet master server if the puppet
+# master server is running on the same machine as cobbler. This
+# requires puppet_auto_setup above to be enabled
+remove_old_puppet_certs_automatically: 0
+
+# choose a --server argument when running puppetd/puppet agent during kickstart
+#puppet_server: 'puppet'
+
+# let cobbler know that you're using a newer version of puppet
+# choose version 3 to use: 'puppet agent'; version 2 uses status quo: 'puppetd'
+#puppet_version: 2
+
+# choose whether to enable puppet parameterized classes or not.
+# puppet versions prior to 2.6.5 do not support parameters
+#puppet_parameterized_classes: 1
+
+# set to 1 to enable Cobbler's DHCP management features.
+# the choice of DHCP management engine is in /etc/cobbler/modules.conf
+manage_dhcp: 1
+
+# set to 1 to enable Cobbler's DNS management features.
+# the choice of DNS mangement engine is in /etc/cobbler/modules.conf
+manage_dns: 1
+
+# set to path of bind chroot to create bind-chroot compatible bind
+# configuration files.  This should be automatically detected.
+bind_chroot_path: ""
+
+# set to the ip address of the master bind DNS server for creating secondary
+# bind configuration files
+bind_master: 127.0.0.1
+
+# set to 1 to enable Cobbler's TFTP management features.
+# the choice of TFTP mangement engine is in /etc/cobbler/modules.conf
+manage_tftpd: 1
+
+# set to 1 to enable Cobbler's RSYNC management features.
+manage_rsync: 0
+
+# if using BIND (named) for DNS management in /etc/cobbler/modules.conf
+# and manage_dns is enabled (above), this lists which zones are managed
+# See the Wiki (https://github.com/cobbler/cobbler/wiki/Dns-management) for more info
+manage_forward_zones: ['ods.com']
+manage_reverse_zones: []
+
+# if using cobbler with manage_dhcp, put the IP address
+# of the cobbler server here so that PXE booting guests can find it
+# if you do not set this correctly, this will be manifested in TFTP open timeouts.
+next_server: {{ host_ip }}
+
+# settings for power management features.  optional.
+# see https://github.com/cobbler/cobbler/wiki/Power-management to learn more
+# choices (refer to codes.py):
+#    apc_snmp bladecenter bullpap drac ether_wake ilo integrity
+#    ipmilan ipmitool lpar rsa virsh wti
+power_management_default_type: 'ipmitool'
+
+# the commands used by the power management module are sourced
+# from what directory?
+power_template_dir: "/etc/cobbler/power"
+
+# if this setting is set to 1, cobbler systems that pxe boot
+# will request at the end of their installation to toggle the
+# --netboot-enabled record in the cobbler system record.  This eliminates
+# the potential for a PXE boot loop if the system is set to PXE
+# first in it's BIOS order.  Enable this if PXE is first in your BIOS
+# boot order, otherwise leave this disabled.   See the manpage
+# for --netboot-enabled.
+pxe_just_once: 1
+
+# the templates used for PXE config generation are sourced
+# from what directory?
+pxe_template_dir: "/etc/cobbler/pxe"
+
+# Path to where system consoles are
+consoles: "/var/consoles"
+
+# Are you using a Red Hat management platform in addition to Cobbler?
+# Cobbler can help you register to it.  Choose one of the following:
+#   "off"    : I'm not using Red Hat Network, Satellite, or Spacewalk
+#   "hosted" : I'm using Red Hat Network
+#   "site"   : I'm using Red Hat Satellite Server or Spacewalk
+# You will also want to read: https://github.com/cobbler/cobbler/wiki/Tips-for-RHN
+redhat_management_type: "off"
+
+# if redhat_management_type is enabled, choose your server
+#   "management.example.org" : For Satellite or Spacewalk
+#   "xmlrpc.rhn.redhat.com"  : For Red Hat Network
+# This setting is also used by the code that supports using Spacewalk/Satellite users/passwords
+# within Cobbler Web and Cobbler XMLRPC.  Using RHN Hosted for this is not supported.
+# This feature can be used even if redhat_management_type is off, you just have
+# to have authn_spacewalk selected in modules.conf
+redhat_management_server: "xmlrpc.rhn.redhat.com"
+
+# specify the default Red Hat authorization key to use to register
+# system.  If left blank, no registration will be attempted.  Similarly
+# you can set the --redhat-management-key to blank on any system to
+# keep it from trying to register.
+redhat_management_key: ""
+
+# if using authn_spacewalk in modules.conf to let cobbler authenticate
+# against Satellite/Spacewalk's auth system, by default it will not allow per user
+# access into Cobbler Web and Cobbler XMLRPC.
+# in order to permit this, the following setting must be enabled HOWEVER
+# doing so will permit all Spacewalk/Satellite users of certain types to edit all
+# of cobbler's configuration.
+# these roles are:  config_admin and org_admin
+# users should turn this on only if they want this behavior and
+# do not have a cross-multi-org seperation concern.  If you have
+# a single org in your satellite, it's probably safe to turn this
+# on and then you can use CobblerWeb alongside a Satellite install.
+redhat_management_permissive: 0
+
+# if set to 1, allows /usr/bin/cobbler-register (part of the koan package)
+# to be used to remotely add new cobbler system records to cobbler.
+# this effectively allows for registration of new hardware from system
+# records.
+register_new_installs: 0
+
+# Flags to use for yum's reposync.  If your version of yum reposync
+# does not support -l, you may need to remove that option.
+reposync_flags: "-l -n -d"
+
+# These options will be used for an rsync initiated by cobbler replicate
+replicate_rsync_options: "-avzH"
+
+# when DHCP and DNS management are enabled, cobbler sync can automatically
+# restart those services to apply changes.  The exception for this is
+# if using ISC for DHCP, then omapi eliminates the need for a restart.
+# omapi, however, is experimental and not recommended for most configurations.
+# If DHCP and DNS are going to be managed, but hosted on a box that
+# is not on this server, disable restarts here and write some other
+# script to ensure that the config files get copied/rsynced to the destination
+# box.  This can be done by modifying the restart services trigger.
+# Note that if manage_dhcp and manage_dns are disabled, the respective
+# parameter will have no effect.  Most users should not need to change
+# this.
+restart_dns: 1
+restart_dhcp: 1
+
+# install triggers are scripts in /var/lib/cobbler/triggers/install
+# that are triggered in kickstart pre and post sections.  Any
+# executable script in those directories is run.  They can be used
+# to send email or perform other actions.  They are currently
+# run as root so if you do not need this functionality you can
+# disable it, though this will also disable "cobbler status" which
+# uses a logging trigger to audit install progress.
+run_install_triggers: 1
+
+# enables a trigger which version controls all changes to /var/lib/cobbler
+# when add, edit, or sync events are performed.  This can be used
+# to revert to previous database versions, generate RSS feeds, or for
+# other auditing or backup purposes. "git" and "hg" are currently suported,
+# but git is the recommend SCM for use with this feature.
+scm_track_enabled: 0
+scm_track_mode: "git"
+
+# this is the address of the cobbler server -- as it is used
+# by systems during the install process, it must be the address
+# or hostname of the system as those systems can see the server.
+# if you have a server that appears differently to different subnets
+# (dual homed, etc), you need to read the --server-override section
+# of the manpage for how that works.
+server: {{ host_ip }}
+
+# If set to 1, all commands will be forced to use the localhost address
+# instead of using the above value which can force commands like
+# cobbler sync to open a connection to a remote address if one is in the
+# configuration and would traceback.
+client_use_localhost: 0
+
+# If set to 1, all commands to the API (not directly to the XMLRPC
+# server) will go over HTTPS instead of plaintext. Be sure to change
+# the http_port setting to the correct value for the web server
+client_use_https: 0
+
+# this is a directory of files that cobbler uses to make
+# templating easier.  See the Wiki for more information.  Changing
+# this directory should not be required.
+snippetsdir: /var/lib/cobbler/snippets
+
+# Normally if a kickstart is specified at a remote location, this
+# URL will be passed directly to the kickstarting system, thus bypassing
+# the usual snippet templating Cobbler does for local kickstart files. If
+# this option is enabled, Cobbler will fetch the file contents internally
+# and serve a templated version of the file to the client.
+template_remote_kickstarts: 0
+
+# should new profiles for virtual machines default to auto booting with the physical host when the physical host reboots?
+# this can be overridden on each profile or system object.
+virt_auto_boot: 1
+
+# cobbler's web directory.  Don't change this setting -- see the
+# Wiki on "relocating your cobbler install" if your /var partition
+# is not large enough.
+webdir: /var/www/cobbler
+
+# cobbler's public XMLRPC listens on this port.  Change this only
+# if absolutely needed, as you'll have to start supplying a new
+# port option to koan if it is not the default.
+xmlrpc_port: 25151
+
+# "cobbler repo add" commands set cobbler up with repository
+# information that can be used during kickstart and is automatically
+# set up in the cobbler kickstart templates.  By default, these
+# are only available at install time.  To make these repositories
+# usable on installed systems (since cobbler makes a very convient)
+# mirror, set this to 1.  Most users can safely set this to 1.  Users
+# who have a dual homed cobbler server, or are installing laptops that
+# will not always have access to the cobbler server may wish to leave
+# this as 0.  In that case, the cobbler mirrored yum repos are still
+# accessable at http://cobbler.example.org/cblr/repo_mirror and yum
+# configuration can still be done manually.  This is just a shortcut.
+yum_post_install_mirror: 1
+
+# the default yum priority for all the distros.  This is only used
+# if yum-priorities plugin is used.  1=maximum.  Tweak with caution.
+yum_distro_priority: 1
+
+# Flags to use for yumdownloader.  Not all versions may support
+# --resolve.
+yumdownloader_flags: "--resolve"
+
+# sort and indent JSON output to make it more human-readable
+serializer_pretty_json: 0
+
+# replication rsync options for distros, kickstarts, snippets set to override default value of "-avzH"
+replicate_rsync_options: "-avzH"
+
+# replication rsync options for repos set to override default value of "-avzH"
+replicate_repo_rsync_options: "-avzH"
diff --git a/util/docker-compose/roles/cobbler/templates/zone.template.j2 b/util/docker-compose/roles/cobbler/templates/zone.template.j2
new file mode 100755 (executable)
index 0000000..ea67b73
--- /dev/null
@@ -0,0 +1,17 @@
+\$TTL 300
+@                       IN      SOA     $cobbler_server. nobody.example.com. (
+                                        $serial   ; Serial
+                                        600         ; Refresh
+                                        1800         ; Retry
+                                        604800       ; Expire
+                                        300          ; TTL
+                                        )
+
+                        IN      NS      $cobbler_server.
+
+
+$cname_record
+
+$host_record
+compass-250-41 IN A {{ host_ip }}
+metrics IN A {{ host_ip }}
diff --git a/util/docker-compose/roles/compass/files/pipework b/util/docker-compose/roles/compass/files/pipework
new file mode 100755 (executable)
index 0000000..6d796fc
--- /dev/null
@@ -0,0 +1,443 @@
+#!/bin/sh
+# This script is jpetazzo's work.  The only reason for its
+# existence in the repo is to saving a working copy in case
+#  the original one gets deleted.
+#
+# This code should (try to) follow Google's Shell Style Guide
+# (https://google-styleguide.googlecode.com/svn/trunk/shell.xml)
+set -e
+
+case "$1" in
+  --wait)
+    WAIT=1
+    ;;
+  --direct-phys)
+    DIRECT_PHYS=1
+    shift
+    ;;
+esac
+
+IFNAME=$1
+
+# default value set further down if not set here
+CONTAINER_IFNAME=
+if [ "$2" = "-i" ]; then
+  CONTAINER_IFNAME=$3
+  shift 2
+fi
+
+if [ "$2" = "-l" ]; then
+  LOCAL_IFNAME=$3
+  shift 2
+fi
+
+#inet or inet6
+FAMILY_FLAG="-4"
+if [ "$2" = "-a" ]; then
+  FAMILY_FLAG="-$3"
+  shift 2
+fi
+
+GUESTNAME=$2
+IPADDR=$3
+MACADDR=$4
+
+case "$MACADDR" in
+  *@*)
+    VLAN="${MACADDR#*@}"
+    VLAN="${VLAN%%@*}"
+    MACADDR="${MACADDR%%@*}"
+    ;;
+  *)
+    VLAN=
+    ;;
+esac
+
+# did they ask to generate a custom MACADDR?
+# generate the unique string
+case "$MACADDR" in
+  U:*)
+    macunique="${MACADDR#*:}"
+    # now generate a 48-bit hash string from $macunique
+    MACADDR=$(echo $macunique|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
+   ;;
+esac
+
+
+[ "$IPADDR" ] || [ "$WAIT" ] || {
+  echo "Syntax:"
+  echo "pipework <hostinterface> [-i containerinterface] [-l localinterfacename] [-a addressfamily] <guest> <ipaddr>/<subnet>[@default_gateway] [macaddr][@vlan]"
+  echo "pipework <hostinterface> [-i containerinterface] [-l localinterfacename] <guest> dhcp [macaddr][@vlan]"
+  echo "pipework route <guest> <route_command>"
+  echo "pipework --wait [-i containerinterface]"
+  exit 1
+}
+
+# Succeed if the given utility is installed. Fail otherwise.
+# For explanations about `which` vs `type` vs `command`, see:
+# http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script/677212#677212
+# (Thanks to @chenhanxiao for pointing this out!)
+installed () {
+  command -v "$1" >/dev/null 2>&1
+}
+
+# Google Styleguide says error messages should go to standard error.
+warn () {
+  echo "$@" >&2
+}
+die () {
+  status="$1"
+  shift
+  warn "$@"
+  exit "$status"
+}
+
+# First step: determine type of first argument (bridge, physical interface...),
+# Unless "--wait" is set (then skip the whole section)
+if [ -z "$WAIT" ]; then
+  if [ -d "/sys/class/net/$IFNAME" ]
+  then
+    if [ -d "/sys/class/net/$IFNAME/bridge" ]; then
+      IFTYPE=bridge
+      BRTYPE=linux
+    elif installed ovs-vsctl && ovs-vsctl list-br|grep -q "^${IFNAME}$"; then
+      IFTYPE=bridge
+      BRTYPE=openvswitch
+    elif [ "$(cat "/sys/class/net/$IFNAME/type")" -eq 32 ]; then # InfiniBand IPoIB interface type 32
+      IFTYPE=ipoib
+      # The IPoIB kernel module is fussy, set device name to ib0 if not overridden
+      CONTAINER_IFNAME=${CONTAINER_IFNAME:-ib0}
+      PKEY=$VLAN
+    else IFTYPE=phys
+    fi
+  else
+    case "$IFNAME" in
+      br*)
+        IFTYPE=bridge
+        BRTYPE=linux
+        ;;
+      ovs*)
+        if ! installed ovs-vsctl; then
+          die 1 "Need OVS installed on the system to create an ovs bridge"
+        fi
+        IFTYPE=bridge
+        BRTYPE=openvswitch
+        ;;
+      route*)
+        IFTYPE=route
+        ;;
+      dummy*)
+        IFTYPE=dummy
+        ;;
+      *) die 1 "I do not know how to setup interface $IFNAME." ;;
+    esac
+  fi
+fi
+
+# Set the default container interface name to eth1 if not already set
+CONTAINER_IFNAME=${CONTAINER_IFNAME:-eth1}
+
+[ "$WAIT" ] && {
+  while true; do
+    # This first method works even without `ip` or `ifconfig` installed,
+    # but doesn't work on older kernels (e.g. CentOS 6.X). See #128.
+    grep -q '^1$' "/sys/class/net/$CONTAINER_IFNAME/carrier" && break
+    # This method hopefully works on those older kernels.
+    ip link ls dev "$CONTAINER_IFNAME" && break
+    sleep 1
+  done > /dev/null 2>&1
+  exit 0
+}
+
+[ "$IFTYPE" = bridge ] && [ "$BRTYPE" = linux ] && [ "$VLAN" ] && {
+  die 1 "VLAN configuration currently unsupported for Linux bridge."
+}
+
+[ "$IFTYPE" = ipoib ] && [ "$MACADDR" ] && {
+  die 1 "MACADDR configuration unsupported for IPoIB interfaces."
+}
+
+# Second step: find the guest (for now, we only support LXC containers)
+while read _ mnt fstype options _; do
+  [ "$fstype" != "cgroup" ] && continue
+  echo "$options" | grep -qw devices || continue
+  CGROUPMNT=$mnt
+done < /proc/mounts
+
+[ "$CGROUPMNT" ] || {
+    die 1 "Could not locate cgroup mount point."
+}
+
+# Try to find a cgroup matching exactly the provided name.
+N=$(find "$CGROUPMNT" -name "$GUESTNAME" | wc -l)
+case "$N" in
+  0)
+    # If we didn't find anything, try to lookup the container with Docker.
+    if installed docker; then
+      RETRIES=3
+      while [ "$RETRIES" -gt 0 ]; do
+        DOCKERPID=$(docker inspect --format='{{ .State.Pid }}' "$GUESTNAME")
+        [ "$DOCKERPID" != 0 ] && break
+        sleep 1
+        RETRIES=$((RETRIES - 1))
+      done
+
+      [ "$DOCKERPID" = 0 ] && {
+        die 1 "Docker inspect returned invalid PID 0"
+      }
+
+      [ "$DOCKERPID" = "<no value>" ] && {
+        die 1 "Container $GUESTNAME not found, and unknown to Docker."
+      }
+    else
+      die 1 "Container $GUESTNAME not found, and Docker not installed."
+    fi
+    ;;
+  1) true ;;
+  *) die 1 "Found more than one container matching $GUESTNAME." ;;
+esac
+
+# only check IPADDR if we are not in a route mode
+[ "$IFTYPE" != route ] && {
+  case "$IPADDR" in
+         # Let's check first if the user asked for DHCP allocation.
+         dhcp|dhcp:*)
+           # Use Docker-specific strategy to run the DHCP client
+           # from the busybox image, in the network namespace of
+           # the container.
+           if ! [ "$DOCKERPID" ]; then
+             warn "You asked for a Docker-specific DHCP method."
+             warn "However, $GUESTNAME doesn't seem to be a Docker container."
+             warn "Try to replace 'dhcp' with another option?"
+             die 1 "Aborting."
+           fi
+           DHCP_CLIENT=${IPADDR%%:*}
+           ;;
+         udhcpc|udhcpc:*|udhcpc-f|udhcpc-f:*|dhcpcd|dhcpcd:*|dhclient|dhclient:*|dhclient-f|dhclient-f:*)
+           DHCP_CLIENT=${IPADDR%%:*}
+           # did they ask for the client to remain?
+           DHCP_FOREGROUND=
+           [ "${DHCP_CLIENT: -2}" = '-f' ] && {
+             DHCP_FOREGROUND=true
+           }
+           DHCP_CLIENT=${DHCP_CLIENT%-f}
+           if ! installed "$DHCP_CLIENT"; then
+             die 1 "You asked for DHCP client $DHCP_CLIENT, but I can't find it."
+           fi
+           ;;
+         # Alright, no DHCP? Then let's see if we have a subnet *and* gateway.
+         */*@*)
+           GATEWAY="${IPADDR#*@}" GATEWAY="${GATEWAY%%@*}"
+           IPADDR="${IPADDR%%@*}"
+           ;;
+         # No gateway? We need at least a subnet, anyway!
+         */*) : ;;
+         # ... No? Then stop right here.
+         *)
+           warn "The IP address should include a netmask."
+           die 1 "Maybe you meant $IPADDR/24 ?"
+           ;;
+  esac
+}
+
+# If a DHCP method was specified, extract the DHCP options.
+if [ "$DHCP_CLIENT" ]; then
+  case "$IPADDR" in
+    *:*) DHCP_OPTIONS="${IPADDR#*:}" ;;
+  esac
+fi
+
+if [ "$DOCKERPID" ]; then
+  NSPID=$DOCKERPID
+else
+  NSPID=$(head -n 1 "$(find "$CGROUPMNT" -name "$GUESTNAME" | head -n 1)/tasks")
+  [ "$NSPID" ] || {
+    # it is an alternative way to get the pid
+    NSPID=$(lxc-info -n  "$GUESTNAME" | grep PID | grep -Eo '[0-9]+')
+    [ "$NSPID" ] || {
+      die 1 "Could not find a process inside container $GUESTNAME."
+    }
+  }
+fi
+
+# Check if an incompatible VLAN device already exists
+[ "$IFTYPE" = phys ] && [ "$VLAN" ] && [ -d "/sys/class/net/$IFNAME.VLAN" ] && {
+  ip -d link show "$IFNAME.$VLAN" | grep -q "vlan.*id $VLAN" || {
+    die 1 "$IFNAME.VLAN already exists but is not a VLAN device for tag $VLAN"
+  }
+}
+
+[ ! -d /var/run/netns ] && mkdir -p /var/run/netns
+rm -f "/var/run/netns/$NSPID"
+ln -s "/proc/$NSPID/ns/net" "/var/run/netns/$NSPID"
+
+# Check if we need to create a bridge.
+[ "$IFTYPE" = bridge ] && [ ! -d "/sys/class/net/$IFNAME" ] && {
+  [ "$BRTYPE" = linux ] && {
+    (ip link add dev "$IFNAME" type bridge > /dev/null 2>&1) || (brctl addbr "$IFNAME")
+    ip link set "$IFNAME" up
+  }
+  [ "$BRTYPE" = openvswitch ] && {
+    ovs-vsctl add-br "$IFNAME"
+  }
+}
+
+[ "$IFTYPE" != "route" ] && [ "$IFTYPE" != "dummy" ] && MTU=$(ip link show "$IFNAME" | awk '{print $5}')
+
+# If it's a bridge, we need to create a veth pair
+[ "$IFTYPE" = bridge ] && {
+  if [ -z "$LOCAL_IFNAME" ]; then
+    LOCAL_IFNAME="v${CONTAINER_IFNAME}pl${NSPID}"
+  fi
+  GUEST_IFNAME="v${CONTAINER_IFNAME}pg${NSPID}"
+  # Does the link already exist?
+  if ip link show "$LOCAL_IFNAME" >/dev/null 2>&1; then
+    # link exists, is it in use?
+    if ip link show "$LOCAL_IFNAME" up | grep -q "UP"; then
+      echo "Link $LOCAL_IFNAME exists and is up"
+      exit 1
+    fi
+    # delete the link so we can re-add it afterwards
+    ip link del "$LOCAL_IFNAME"
+  fi
+  ip link add name "$LOCAL_IFNAME" mtu "$MTU" type veth peer name "$GUEST_IFNAME" mtu "$MTU"
+  case "$BRTYPE" in
+    linux)
+      (ip link set "$LOCAL_IFNAME" master "$IFNAME" > /dev/null 2>&1) || (brctl addif "$IFNAME" "$LOCAL_IFNAME")
+      ;;
+    openvswitch)
+      if ! ovs-vsctl list-ports "$IFNAME" | grep -q "^${LOCAL_IFNAME}$"; then
+        ovs-vsctl add-port "$IFNAME" "$LOCAL_IFNAME" ${VLAN:+tag="$VLAN"}
+      fi
+      ;;
+  esac
+  ip link set "$LOCAL_IFNAME" up
+}
+
+# If it's a physical interface, create a macvlan subinterface
+[ "$IFTYPE" = phys ] && {
+  [ "$VLAN" ] && {
+    [ ! -d "/sys/class/net/${IFNAME}.${VLAN}" ] && {
+      ip link add link "$IFNAME" name "$IFNAME.$VLAN" mtu "$MTU" type vlan id "$VLAN"
+    }
+    ip link set "$IFNAME" up
+    IFNAME=$IFNAME.$VLAN
+  }
+
+  if [ ! -z "$DIRECT_PHYS" ]; then
+    GUEST_IFNAME=$IFNAME
+  else
+    GUEST_IFNAME=ph$NSPID$CONTAINER_IFNAME
+    ip link add link "$IFNAME" dev "$GUEST_IFNAME" mtu "$MTU" type macvlan mode bridge
+  fi
+
+  ip link set "$IFNAME" up
+}
+
+# If it's an IPoIB interface, create a virtual IPoIB interface (the IPoIB
+# equivalent of a macvlan device)
+#
+# Note: no macvlan subinterface nor Ethernet bridge can be created on top of an
+# IPoIB interface. InfiniBand is not Ethernet. IPoIB is an IP layer on top of
+# InfiniBand, without an intermediate Ethernet layer.
+[ "$IFTYPE" = ipoib ] && {
+  GUEST_IFNAME="${IFNAME}.${NSPID}"
+
+  # If a partition key is provided, use it
+  [ "$PKEY" ] && {
+    GUEST_IFNAME="${IFNAME}.${PKEY}.${NSPID}"
+    PKEY="pkey 0x$PKEY"
+  }
+
+  ip link add link "$IFNAME" name "$GUEST_IFNAME" type ipoib $PKEY
+  ip link set "$IFNAME" up
+}
+
+# If its a dummy interface, create a dummy interface.
+[ "$IFTYPE" = dummy ] && {
+  GUEST_IFNAME=du$NSPID$CONTAINER_IFNAME
+  ip link add dev "$GUEST_IFNAME" type dummy
+}
+
+# If the `route` command was specified ...
+if [ "$IFTYPE" = route ]; then
+  # ... discard the first two arguments and pass the rest to the route command.
+  shift 2
+  ip netns exec "$NSPID" ip route "$@"
+else
+  # Otherwise, run normally.
+  ip link set "$GUEST_IFNAME" netns "$NSPID"
+  ip netns exec "$NSPID" ip link set "$GUEST_IFNAME" name "$CONTAINER_IFNAME"
+  [ "$MACADDR" ] && ip netns exec "$NSPID" ip link set dev "$CONTAINER_IFNAME" address "$MACADDR"
+
+       # When using any of the DHCP methods, we start a DHCP client in the
+       # network namespace of the container. With the 'dhcp' method, the
+       # client used is taken from the Docker busybox image (therefore
+       # requiring no specific client installed on the host). Other methods
+       # use a locally installed client.
+       case "$DHCP_CLIENT" in
+         dhcp)
+           docker run -d --net container:$GUESTNAME --cap-add NET_ADMIN \
+                  busybox udhcpc -i "$CONTAINER_IFNAME" -x "hostname:$GUESTNAME" \
+                  $DHCP_OPTIONS \
+                  >/dev/null
+           ;;
+         udhcpc)
+           DHCP_Q="-q"
+           [ "$DHCP_FOREGROUND" ] && {
+             DHCP_OPTIONS="$DHCP_OPTIONS -f"
+           }
+           ip netns exec "$NSPID" "$DHCP_CLIENT" -qi "$CONTAINER_IFNAME" \
+                                                 -x "hostname:$GUESTNAME" \
+                                                 -p "/var/run/udhcpc.$GUESTNAME.pid" \
+                                                 $DHCP_OPTIONS
+           [ ! "$DHCP_FOREGROUND" ] && {
+             rm "/var/run/udhcpc.$GUESTNAME.pid"
+           }
+           ;;
+         dhclient)
+           ip netns exec "$NSPID" "$DHCP_CLIENT" "$CONTAINER_IFNAME" \
+                                                 -pf "/var/run/dhclient.$GUESTNAME.pid" \
+                                                 -lf "/etc/dhclient/dhclient.$GUESTNAME.leases" \
+                                                 $DHCP_OPTIONS
+           # kill dhclient after get ip address to prevent device be used after container close
+           [ ! "$DHCP_FOREGROUND" ] && {
+             kill "$(cat "/var/run/dhclient.$GUESTNAME.pid")"
+             rm "/var/run/dhclient.$GUESTNAME.pid"
+           }
+           ;;
+         dhcpcd)
+           ip netns exec "$NSPID" "$DHCP_CLIENT" -q "$CONTAINER_IFNAME" -h "$GUESTNAME"
+           ;;
+         "")
+           if installed ipcalc; then
+             eval $(ipcalc -b $IPADDR)
+             ip netns exec "$NSPID" ip "$FAMILY_FLAG" addr add "$IPADDR" brd "$BROADCAST" dev "$CONTAINER_IFNAME"
+           else
+             ip netns exec "$NSPID" ip "$FAMILY_FLAG" addr add "$IPADDR" dev "$CONTAINER_IFNAME"
+           fi
+
+           [ "$GATEWAY" ] && {
+             ip netns exec "$NSPID" ip "$FAMILY_FLAG" route delete default >/dev/null 2>&1 && true
+           }
+           ip netns exec "$NSPID" ip "$FAMILY_FLAG" link set "$CONTAINER_IFNAME" up
+           [ "$GATEWAY" ] && {
+             ip netns exec "$NSPID" ip "$FAMILY_FLAG" route get "$GATEWAY" >/dev/null 2>&1 || \
+             ip netns exec "$NSPID" ip "$FAMILY_FLAG" route add "$GATEWAY/32" dev "$CONTAINER_IFNAME"
+             ip netns exec "$NSPID" ip "$FAMILY_FLAG" route replace default via "$GATEWAY" dev "$CONTAINER_IFNAME"
+           }
+           ;;
+       esac
+
+  # Give our ARP neighbors a nudge about the new interface
+  if installed arping; then
+    IPADDR=$(echo "$IPADDR" | cut -d/ -f1)
+    ip netns exec "$NSPID" arping -c 1 -A -I "$CONTAINER_IFNAME" "$IPADDR" > /dev/null 2>&1 || true
+  else
+    echo "Warning: arping not found; interface may not be immediately reachable"
+  fi
+fi
+# Remove NSPID to avoid `ip netns` catch it.
+rm -f "/var/run/netns/$NSPID"
+
+# vim: set tabstop=2 shiftwidth=2 softtabstop=2 expandtab :
diff --git a/util/docker-compose/roles/compass/files/prepare_ansible.sh b/util/docker-compose/roles/compass/files/prepare_ansible.sh
new file mode 100755 (executable)
index 0000000..031333c
--- /dev/null
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+for i in `ls /root/compass4nfv/deploy/adapters/ansible | grep "openstack_"`; do
+    mkdir -p /root/docker_compose/ansible/$i
+    cp -rf /root/compass4nfv/deploy/adapters/ansible/openstack/* /root/docker_compose/ansible/$i
+    cp -rf /root/compass4nfv/deploy/adapters/ansible/$i /root/docker_compose/ansible/
+done
+cp -rf /root/compass4nfv/deploy/adapters/ansible/roles /root/docker_compose/ansible/
diff --git a/util/docker-compose/roles/compass/files/preseed_post_anamon b/util/docker-compose/roles/compass/files/preseed_post_anamon
new file mode 100755 (executable)
index 0000000..b4c8525
--- /dev/null
@@ -0,0 +1,80 @@
+#if $str($getVar('anamon_enabled','')) == "1"
+
+## install anamon script
+    #if $getVar("compass_server", "") != ""
+wget -O /usr/local/sbin/anamon "http://$compass_server:$http_port/cobbler/aux/anamon"
+    #else
+wget -O /usr/local/sbin/anamon "http://$server:$http_port/cobbler/aux/anamon"
+    #end if
+## install anamon system service
+cat << EOF > /etc/init.d/anamon.init
+#raw
+#!/bin/bash
+## BEGIN INIT INFO
+# Provides: anamon.init
+# Default-Start: 3 5
+# Default-Stop: 0 1 2 4 6
+# Required-Start: $network
+# Short-Description: Starts the cobbler anamon boot notification program
+# Description: anamon runs the first time a machine is booted after
+#              installation.
+## END INIT INFO
+
+#
+# anamon.init: Starts the cobbler post-install boot notification program
+#
+# chkconfig: 35 95 95
+#
+# description: anamon runs the first time a machine is booted after
+#              installation.
+#
+#end raw
+cd /var/log/installer
+gunzip initial-status.gz
+cd -
+#if $getVar("compass_server","") != ""
+/usr/local/sbin/anamon --watchfile "/var/log/installer/syslog /var/log/installer/hardware-summary /var/log/installer/initial-status /var/log/installer/status" --name $name --server $compass_server --port $http_port --exit
+#else
+/usr/local/sbin/anamon --watchfile "/var/log/installer/syslog /var/log/installer/hardware-summary /var/log/installer/initial-status /var/log/installer/status" --name $name --server $server --port $http_port --exit
+#end if
+update-rc.d -f anamon remove
+mv /etc/init.d/anamon.init /tmp/anamon.init
+EOF
+
+## adjust permissions
+chmod 755 /etc/init.d/anamon.init /usr/local/sbin/anamon
+test -d /selinux && restorecon /etc/init.d/anamon.init /usr/local/sbin/anamon
+
+## enable the script
+update-rc.d anamon.init defaults 95 95
+#end if
+
+## place start-up script for updating os state
+#if $getVar('compass_server', '') != ""
+    #set srv = $getVar('compass_server','')
+#else
+    #set srv = $getVar('server','')
+#end if
+cat << EOF > /etc/init.d/set_state
+#raw
+#!/bin/bash
+# Provides: set_state
+# Default-Start: 3 5
+# Default-Stop: 0 1 2 4 6
+# Required-Start: $network $ssh
+# Short-Description: Notifies the os installation is finished
+# Description: set_state runs the first time a machine is booted after
+#              installation.
+#end raw
+wget -O /tmp/os_state --post-data='{"ready": true}' --header=Content-Type:application/json "http://$srv:5050/api/hosts/${host_id}/state_internal"
+update-rc.d -f set_state remove
+mv /etc/init.d/set_state /tmp/set_state
+EOF
+
+## adjust permissions
+chmod 755 /etc/init.d/set_state
+test -d /selinux && restorecon /etc/init.d/set_state
+
+update-rc.d set_state defaults 99 99
+
+echo "compass_server=$server" >> /etc/compass.conf
diff --git a/util/docker-compose/roles/compass/files/switch_list.conf b/util/docker-compose/roles/compass/files/switch_list.conf
new file mode 100755 (executable)
index 0000000..21c46c0
--- /dev/null
@@ -0,0 +1,3 @@
+SWITCH_LIST = [
+    '127.0.0.1'
+]
diff --git a/util/docker-compose/roles/compass/files/up_containers.sh b/util/docker-compose/roles/compass/files/up_containers.sh
new file mode 100755 (executable)
index 0000000..9aca591
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/bash
+cd /root/docker_compose
+docker-compose up
diff --git a/util/docker-compose/roles/compass/tasks/main.yml b/util/docker-compose/roles/compass/tasks/main.yml
new file mode 100755 (executable)
index 0000000..9ee7902
--- /dev/null
@@ -0,0 +1,139 @@
+---
+- include_vars: "{{ compass_dists_dir }}/build.yaml"
+
+- set_fact:
+    image_name: "{{ item.name | regex_replace('-', '_') }}"
+    image_repo: "{{ item.url }}"
+  with_items: "{{ packages }}"
+  when: item.name in compose_images
+  register: compass_images
+
+- name: generate compose_images.yml
+  copy:
+    dest: "{{ compass_dists_dir }}/compose_images.yml"
+    content: |
+      {% set image_dict = {} %}
+      {% for item in compass_images.results %}
+      {% if "ansible_facts" in item %}
+      {% set facts = item.ansible_facts %}
+      {% set _ = image_dict.update({facts.image_name: facts.image_repo}) %}
+      {% endif %}
+      {% endfor %}
+      {% for key in image_dict %}
+      {{ key }}: {{ image_dict[key] }}
+      {% endfor %}
+
+- include_vars: "{{ compass_dists_dir }}/compose_images.yml"
+
+- name: get jumphost ip
+  shell: |
+    external_nic=`ip route |grep '^default'|awk '{print $5F}'|sed -n '1p'`
+    host_ip=`ifconfig $external_nic | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`
+    echo $host_ip
+  register: external_ip
+
+- name: fix name.service
+  shell: |
+    if [ ! -f "/etc/apparmor.d/disable/usr.sbin.named" ]; then
+        ln -s /etc/apparmor.d/usr.sbin.named /etc/apparmor.d/disable/
+        apparmor_parser -R /etc/apparmor.d/usr.sbin.named
+    fi
+
+- name: render docker-compose file
+  template:
+    src: docker-compose.yml.j2
+    dest: "{{ docker_compose_dir }}/docker-compose.yml"
+
+- name: docker-compose down
+  shell: docker-compose down
+  args:
+    chdir: "{{ docker_compose_dir }}"
+
+- name: load docker images
+  shell: |
+    images=$(ls "{{ compass_dists_dir }}" | grep .*.tar)
+    for image in $images
+    do
+        docker load -i "{{ compass_dists_dir }}/$image"
+    done
+
+- name: copy files
+  shell:
+    cp -rf "{{ item }}" "{{ docker_compose_dir }}"
+  with_items:
+    - "{{ compass_dir }}/deploy/adapters/ansible"
+    - "{{ compass_dir }}/deploy/compass_conf"
+    - "{{ compass_dir }}/deploy/adapters/cobbler"
+
+- name: retrieve plugins list
+  command: "ls {{ compass_dir }}/plugins/"
+  register: plugin_list
+
+- name: copy plugins roles
+  copy:
+    src: "{{ compass_dir }}/plugins/{{ item }}/roles/"
+    dest: "{{ docker_compose_dir }}/ansible/roles/"
+  with_items: "{{ plugin_list.stdout_lines }}"
+  when: item != 'template'
+
+- name: chmod directory
+  file:
+    dest: "{{ item }}"
+    mode: 0755
+  with_items:
+    - "{{ compass_dir }}/deploy/adapters/ansible"
+    - "{{ compass_dir }}/deploy/compass_conf"
+    - "{{ compass_dir }}/deploy/adapters/cobbler"
+
+- name: copy ansible scripts into ansible folder
+  shell: |
+    for i in `ls "{{ docker_compose_dir }}/ansible" | grep "openstack_"`; do
+        cp -rf "{{ docker_compose_dir }}"/ansible/openstack/* \
+             "{{ docker_compose_dir }}"/ansible/$i
+    done
+
+- name: create run dir
+  file:
+    path: "{{ docker_compose_dir }}/ansible/run"
+    state: directory
+
+- name: render cobbler
+  template:
+    src: "{{ item }}.j2"
+    dest: "{{ docker_compose_dir }}/compass_conf/os_installer/{{ item }}"
+  with_items:
+    - cobbler.conf
+
+- name: docker-compose up
+  shell: docker-compose up -d
+  args:
+    chdir: "{{ docker_compose_dir }}"
+
+- name: create compass db tables
+  shell: |
+    sleep 3; \
+    docker exec compass-deck bash -c "/opt/compass/bin/manage_db.py createdb"
+  register: result1
+  until: result1.rc == 0
+  retries: 10
+  delay: 2
+  tags:
+    - redploy
+
+- name: add ansible callback
+  shell: |
+    docker cp "{{ item }}" \
+    compass-deck:/root/compass-deck/bin/ansible_callbacks
+    docker cp "{{ item }}" \
+    compass-tasks:/opt/ansible_callbacks
+  with_items:
+    - "{{ compass_dir }}/deploy/status_callback.py"
+    - "{{ compass_dir }}/deploy/playbook_done.py"
+
+- name: rm ansible run
+  shell: |
+    docker exec compass-tasks bash -c "rm -rf /var/ansible/run/*"
+
+- name: start httpd service
+  shell: |
+    docker exec compass-deck bash -c "systemctl start httpd"
diff --git a/util/docker-compose/roles/compass/templates/cobbler.conf.j2 b/util/docker-compose/roles/compass/templates/cobbler.conf.j2
new file mode 100755 (executable)
index 0000000..5cc86e8
--- /dev/null
@@ -0,0 +1,9 @@
+NAME = 'cobbler'
+INSTANCE_NAME = 'cobbler'
+SETTINGS = {
+    'cobbler_url': 'http://{{ host_ip }}/cobbler_api',
+    'credentials': {
+        'username': 'cobbler',
+        'password': 'cobbler'
+    }
+}
diff --git a/util/docker-compose/roles/compass/templates/dhcp.template.j2 b/util/docker-compose/roles/compass/templates/dhcp.template.j2
new file mode 100755 (executable)
index 0000000..0665f2f
--- /dev/null
@@ -0,0 +1,97 @@
+# ******************************************************************
+# Cobbler managed dhcpd.conf file
+#
+# generated from cobbler dhcp.conf template ($date)
+# Do NOT make changes to /etc/dhcpd.conf. Instead, make your changes
+# in /etc/cobbler/dhcp.template, as /etc/dhcpd.conf will be
+# overwritten.
+#
+# ******************************************************************
+
+ddns-update-style interim;
+
+allow booting;
+allow bootp;
+deny unknown-clients;
+local-address {{ host_ip }};
+log-facility local6;
+
+ignore client-updates;
+set vendorclass = option vendor-class-identifier;
+
+option pxe-system-type code 93 = unsigned integer 16;
+option space pxelinux;
+option pxelinux.magic      code 208 = string;
+option pxelinux.configfile code 209 = text;
+option pxelinux.pathprefix code 210 = text;
+option pxelinux.reboottime code 211 = unsigned integer 32;
+
+subnet {{ install_subnet }} netmask {{ install_netmask }} {
+     option routers {{ host_ip }};
+     option domain-name-servers {{ host_ip }};
+     option subnet-mask {{ install_netmask }};
+     range dynamic-bootp {{ install_ip_range }};
+     default-lease-time 21600;
+     max-lease-time 43200;
+     next-server {{ host_ip }};
+     class "pxeclients" {
+          match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
+          if option pxe-system-type = 00:02 {
+                  filename "ia64/elilo.efi";
+          } else if option pxe-system-type = 00:06 {
+                  filename "grub/grub-x86.efi";
+          } else if option pxe-system-type = 00:07 {
+                  filename "grub/grub-x86_64.efi";
+          } else {
+                  filename "pxelinux.0";
+          }
+     }
+
+}
+
+#for dhcp_tag in $dhcp_tags.keys():
+    ## group could be subnet if your dhcp tags line up with your subnets
+    ## or really any valid dhcpd.conf construct ... if you only use the
+    ## default dhcp tag in cobbler, the group block can be deleted for a
+    ## flat configuration
+# group for Cobbler DHCP tag: $dhcp_tag
+group {
+        #for mac in $dhcp_tags[$dhcp_tag].keys():
+            #set iface = $dhcp_tags[$dhcp_tag][$mac]
+    host $iface.name {
+        hardware ethernet $mac;
+        site-option-space "pxelinux";
+        option pxelinux.magic f1:00:74:7e;
+        if exists dhcp-parameter-request-list {
+            # Always send the PXELINUX options (specified in hexadecimal)
+            option dhcp-parameter-request-list = concat(option dhcp-parameter-request-list,d0,d1,d2,d3);
+        }
+        option pxelinux.reboottime 30;
+        #if $iface.hostname:
+        option host-name "$iface.hostname";
+        #end if
+        #if $iface.netmask:
+        option subnet-mask $iface.netmask;
+        #end if
+        #if $iface.gateway:
+        option routers $iface.gateway;
+        #end if
+        #if $iface.enable_gpxe:
+        if exists user-class and option user-class = "gPXE" {
+            filename "http://$cobbler_server/cblr/svc/op/gpxe/system/$iface.owner";
+        } else if exists user-class and option user-class = "iPXE" {
+            filename "http://$cobbler_server/cblr/svc/op/gpxe/system/$iface.owner";
+        } else {
+            filename "undionly.kpxe";
+        }
+        #else
+        filename "$iface.filename";
+        #end if
+        ## Cobbler defaults to $next_server, but some users
+        ## may like to use $iface.system.server for proxied setups
+        next-server $next_server;
+        ## next-server $iface.next_server;
+    }
+        #end for
+}
+#end for
diff --git a/util/docker-compose/roles/compass/templates/distro_signatures.json b/util/docker-compose/roles/compass/templates/distro_signatures.json
new file mode 100755 (executable)
index 0000000..e699181
--- /dev/null
@@ -0,0 +1,974 @@
+{"breeds":
+ {
+  "redhat": {
+   "rhel4": {
+    "signatures":["RedHat/RPMS","CentOS/RPMS"],
+    "version_file":"(redhat|sl|centos)-release-4(AS|WS|ES)[\\.-]+(.*)\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*).rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "rhel5": {
+    "signatures":["RedHat","Server","CentOS","Client"],
+    "version_file":"(redhat|sl|centos)-release-5([^\\.][\\w]*)?[\\.-]+(.*)\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*).rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "rhel6": {
+    "signatures":["Packages"],
+    "version_file":"(redhat|sl|slf|centos|oraclelinux)-release-(?!notes)([\\w]*-)*6(Server)*[\\.-]+(.*)\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*).rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "rhel7": {
+    "signatures":["Packages"],
+    "version_file":"(redhat|sl|slf|centos|oraclelinux)-release-(?!notes)([\\w]*-)*7(Server)*[\\.-]+(.*)\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*).rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "fedora16": {
+    "signatures":["Packages"],
+    "version_file":"(fedora)-release-16-(.*)\\.noarch\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "fedora17": {
+    "signatures":["Packages"],
+    "version_file":"(fedora)-release-17-(.*)\\.noarch\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"repo=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "fedora18": {
+    "signatures":["Packages"],
+    "version_file":"(fedora)-release-18-(.*)\\.noarch\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"repo=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "fedora19": {
+    "signatures":["Packages"],
+    "version_file":"(fedora)-release-19-(.*)\\.noarch\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"repo=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "fedora20": {
+    "signatures":["Packages"],
+    "version_file":"(fedora)-release-20-(.*)\\.noarch\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"repo=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "fedora21": {
+    "signatures":["Packages"],
+    "version_file":"(fedora)-release-21-(.*)\\.noarch\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"repo=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "fedora22": {
+    "signatures":["Packages"],
+    "version_file":"(fedora)-release-22-(.*)\\.noarch\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64","ppc64le"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"repo=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "fedora23": {
+    "signatures":["Packages"],
+    "version_file":"(fedora)-release-23-(.*)\\.noarch\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64","ppc64le"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"repo=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "cloudlinux6": {
+    "signatures":["Packages"],
+    "version_file":"(cloudlinux)-release-(.*)\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*).rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   }
+  },
+  "debian": {
+   "squeeze": {
+    "signatures":["dists"],
+    "version_file":"Release",
+    "version_file_regex":"Codename: squeeze",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "wheezy": {
+    "signatures":["dists"],
+    "version_file":"Release",
+    "version_file_regex":"Codename: wheezy",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "jessie": {
+    "signatures":["dists"],
+    "version_file":"Release",
+    "version_file_regex":"Codename: jessie",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "stretch": {
+    "signatures":["dists"],
+    "version_file":"Release",
+    "version_file_regex":"Codename: stretch",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   }
+  },
+  "ubuntu": {
+   "lucid": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: lucid|Ubuntu 10.04",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "oneiric": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: oneiric|Ubuntu 11.10",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "precise": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: precise|Ubuntu 12.04",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "quantal": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: quantal|Ubuntu 12.10",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "raring": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: raring|Ubuntu 13.04",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "saucy": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: saucy|Ubuntu 13.10",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "trusty": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: trusty|Ubuntu 14.04",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "vivid": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: vivid|Ubuntu 15.04",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "wily": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: wily|Ubuntu 15.10",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "xenial": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: xenial|Ubuntu 16.04",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   }
+  },
+  "suse": {
+   "opensuse11.2": {
+    "signatures":["suse"],
+    "version_file":"openSUSE-release-11.2-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"(linux|vmlinuz(.*))",
+    "initrd_file":"initrd(.*)",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "opensuse11.3": {
+    "signatures":["suse"],
+    "version_file":"openSUSE-release-11.3-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"(linux|vmlinuz(.*))",
+    "initrd_file":"initrd(.*)",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "opensuse11.4": {
+    "signatures":["suse"],
+    "version_file":"openSUSE-release-11.4-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"(linux|vmlinuz(.*))",
+    "initrd_file":"initrd(.*)",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "opensuse12.1": {
+    "signatures":["suse"],
+    "version_file":"openSUSE-release-12.1-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"(linux|vmlinuz(.*))",
+    "initrd_file":"initrd(.*)",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "opensuse12.2": {
+    "signatures":["suse"],
+    "version_file":"openSUSE-release-12.2-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"(linux|vmlinuz(.*))",
+    "initrd_file":"initrd(.*)",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "opensuse12.3": {
+    "signatures":["suse"],
+    "version_file":"openSUSE-release-12.3-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"(linux|vmlinuz(.*))",
+    "initrd_file":"initrd(.*)",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "opensuse13.1": {
+    "signatures":["suse"],
+    "version_file":"openSUSE-release-13.1-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"(linux|vmlinuz(.*))",
+    "initrd_file":"initrd(.*)",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "opensuse13.2": {
+    "signatures":["suse"],
+    "version_file":"openSUSE-release-13.2-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"(linux|vmlinuz(.*))",
+    "initrd_file":"initrd(.*)",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "sles10": {
+    "signatures":["suse"],
+    "version_file":"sles-release-10-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64","ppc64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"linux[64.gz]?",
+    "initrd_file":"initrd[64]?",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "sles11": {
+    "signatures":["suse"],
+    "version_file":"sles-release-11-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64","ppc64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"linux[64.gz]?",
+    "initrd_file":"initrd[64]?",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "sles11sp1": {
+    "signatures":["suse"],
+    "version_file":"sles-release-11.1-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64","ppc64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"linux[64.gz]?",
+    "initrd_file":"initrd[64]?",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "sles11sp2": {
+    "signatures":["suse"],
+    "version_file":"sles-release-11.2-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64","ppc64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"linux[64.gz]?",
+    "initrd_file":"initrd[64]?",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "sles11sp3": {
+    "signatures":["suse"],
+    "version_file":"sles-release-11.3-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64","ppc64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"linux[64.gz]?",
+    "initrd_file":"initrd[64]?",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "sles11sp4": {
+    "signatures":["suse"],
+    "version_file":"sles-release-11.4-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64","ppc64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"linux[64.gz]?",
+    "initrd_file":"initrd[64]?",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "sles12": {
+    "signatures":["suse"],
+    "version_file":"(sles|SLES-for-VMware)-release-12-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64","ppc64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"linux[64.gz]?",
+    "initrd_file":"initrd[64]?",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   }
+  },
+  "vmware": {
+   "esx4": {
+    "signatures":["VMware/RPMS"],
+    "version_file":"vmware-esx-vmware-release-(.*)\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.x86_64\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"vmlinuz",
+    "initrd_file":"initrd\\.img",
+    "isolinux_ok":true,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_esx4.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "esxi4": {
+    "signatures":["imagedd.bz2"],
+    "version_file":"vmkernel\\.gz",
+    "version_file_regex":"^.*ESXi 4.1\\.(\\d)+ \\[Releasebuild-([\\d]+)\\].*$",
+    "kernel_arch":"vmkernel\\.gz",
+    "kernel_arch_regex":"^.*SystemVsiCpuArch.*(X86_64).*$",
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"mboot\\.c32",
+    "initrd_file":"vmkboot\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_esxi4.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":["vmkernel.gz","sys.vgz","cim.vgz","ienviron.vgz","install.vgz"]
+   },
+   "esxi5": {
+    "signatures":["tboot.b00"],
+    "version_file":"s\\.v00",
+    "version_file_regex":"^.*ESXi 5\\.0\\.(.*)build-([\\d]+).*$",
+    "kernel_arch":"tools\\.t00",
+    "kernel_arch_regex":"^.*(x86_64).*$",
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"mboot\\.c32",
+    "initrd_file":"imgpayld\\.tgz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_esxi5.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "template_files":"/etc/cobbler/pxe/bootcfg_esxi5.template=$local_img_path/cobbler-boot.cfg",
+    "boot_files":["*.*"]
+   },
+   "esxi51": {
+    "signatures":["tboot.b00"],
+    "version_file":"s\\.v00",
+    "version_file_regex":"^.*ESXi 5\\.1\\.(.*)build-([\\d]+).*$",
+    "kernel_arch":"tools\\.t00",
+    "kernel_arch_regex":"^.*(x86_64).*$",
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"mboot\\.c32",
+    "initrd_file":"imgpayld\\.tgz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_esxi5.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "template_files":"/etc/cobbler/pxe/bootcfg_esxi51.template=$local_img_path/cobbler-boot.cfg",
+    "boot_files":["*.*"]
+   },
+   "esxi55": {
+    "signatures":["tboot.b00"],
+    "version_file":"s\\.v00",
+    "version_file_regex":"^.*ESXi 5\\.5\\.(.*)build-([\\d]+).*$",
+    "kernel_arch":"tools\\.t00",
+    "kernel_arch_regex":"^.*(x86_64).*$",
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"mboot\\.c32",
+    "initrd_file":"imgpayld\\.tgz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_esxi5.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "template_files":"/etc/cobbler/pxe/bootcfg_esxi55.template=$local_img_path/cobbler-boot.cfg",
+    "boot_files":["*.*"]
+   },
+   "esxi60": {
+    "signatures":["tboot.b00"],
+    "version_file":"s\\.v00",
+    "version_file_regex":"^.*ESXi 6\\.0\\.(.*)build-([\\d]+).*$",
+    "kernel_arch":"tools\\.t00",
+    "kernel_arch_regex":"^.*(x86_64).*$",
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"mboot\\.c32",
+    "initrd_file":"imgpayld\\.tgz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_esxi5.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "template_files":"/etc/cobbler/pxe/bootcfg_esxi60.template=$local_img_path/cobbler-boot.cfg",
+    "boot_files":["*.*"]
+   }
+  },
+  "freebsd": {
+   "8.2": {
+    "signatures":["boot"],
+    "version_file":"8\\.2-RELEASE",
+    "version_file_regex":null,
+    "kernel_arch":"device\\.hints",
+    "kernel_arch_regex":"^.*FreeBSD: src/sys/(.*)/conf/GENERIC\\.hints.*$",
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"pxeboot(.*)",
+    "initrd_file":"mfsroot\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "8.3": {
+    "signatures":["boot"],
+    "version_file":"8\\.3-RELEASE",
+    "version_file_regex":null,
+    "kernel_arch":"device\\.hints",
+    "kernel_arch_regex":"^.*FreeBSD: src/sys/(.*)/conf/GENERIC\\.hints.*$",
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"pxeboot(.*)",
+    "initrd_file":"mfsroot\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "8.4": {
+    "signatures":["boot"],
+    "version_file":"8\\.4-RELEASE",
+    "version_file_regex":null,
+    "kernel_arch":"device\\.hints",
+    "kernel_arch_regex":"^.*FreeBSD: src/sys/(.*)/conf/GENERIC\\.hints.*$",
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"pxeboot(.*)",
+    "initrd_file":"mfsroot\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "9.0": {
+    "signatures":["boot"],
+    "version_file":"device\\.hints",
+    "version_file_regex":"^.*FreeBSD: release/9.0(.*)/sys/(.*)/conf/GENERIC.hints.*$",
+    "kernel_arch":"device\\.hints",
+    "kernel_arch_regex":"^.*FreeBSD: release/9.0(.*)/sys/(.*)/conf/GENERIC.hints.*$",
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"pxeboot(.*)",
+    "initrd_file":"mbr",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "10.0": {
+    "signatures":["release"],
+    "version_file":"10\\.0\\-RELEASE",
+    "version_file_regex":null,
+    "kernel_arch":"device\\.hints",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"base.txz",
+    "initrd_file":"base.txz",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   }
+  },
+  "xen": {
+   "xcp16": {
+    "signatures":["packages.main"],
+    "version_file":"^XS-REPOSITORY$",
+    "version_file_regex":"^.*product=\"XCP\" version=\"1\\.6\\.([0-9]+)\".*$",
+    "kernel_arch":"xen\\.gz",
+    "kernel_arch_regex":"^.*(x86_64).*$",
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"vmlinuz",
+    "initrd_file":"xen\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"dom0_max_vcpus=1-2 dom0_mem=max:752M,752M",
+    "kernel_options_post":"",
+    "boot_files":["install.img"]
+   },
+   "xenserver620": {
+    "signatures":["packages.xenserver"],
+    "version_file":"^XS-REPOSITORY$",
+    "version_file_regex":"^.*product=\"XenServer\" version=\"6\\.2\\.([0-9]+)\".*$",
+    "kernel_arch":"xen\\.gz",
+    "kernel_arch_regex":"^.*(x86_64).*$",
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"mboot\\.c32",
+    "initrd_file":"xen\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":["install.img"]
+   },
+   "xenserver650": {
+    "signatures":["packages.xenserver"],
+    "version_file":"^XS-REPOSITORY$",
+    "version_file_regex":"^.*product=\"XenServer\" version=\"6\\.5\\.([0-9]+)\".*$",
+    "kernel_arch":"xen\\.gz",
+    "kernel_arch_regex":"^.*(x86_64).*$",
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"mboot\\.c32",
+    "initrd_file":"xen\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":["install.img"]
+   }
+  },
+  "unix": {
+  },
+  "windows": {
+  },
+  "nexenta": {
+    "4": {
+      "signatures":["boot"],
+      "version_file": "platform",
+      "version_file_regex": null,
+      "supported_arches":["x86_64"],
+      "supported_repo_breeds":["apt"],
+      "kernel_file":"platform/i86pc/kernel/amd64/unix",
+      "initrd_file":"platform/i86pc/amd64/miniroot",
+      "kernel_arch": "",
+      "kernel_arch_regex": null,
+      "isolinux_ok":false,
+      "kernel_options":"",
+      "kernel_options_post":"",
+      "boot_files":[],
+      "default_kickstart":""
+    }
+  },
+  "generic": {
+   "generic26": {
+    "signatures":[],
+    "version_file":"",
+    "version_file_regex":"",
+    "kernel_arch":"",
+    "kernel_arch_regex":"",
+    "supported_arches":["i386","x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"",
+    "initrd_file":"",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "virtio26": {
+    "signatures":[],
+    "version_file":"",
+    "version_file_regex":"",
+    "kernel_arch":"",
+    "kernel_arch_regex":"",
+    "supported_arches":["i386","x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"",
+    "initrd_file":"",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   }
+  }
+ }
+}
diff --git a/util/docker-compose/roles/compass/templates/docker-compose.yml.j2 b/util/docker-compose/roles/compass/templates/docker-compose.yml.j2
new file mode 100755 (executable)
index 0000000..7fc8ea3
--- /dev/null
@@ -0,0 +1,103 @@
+version: '2'
+
+services:
+{% if compass_db is defined %}
+  compass-db:
+    container_name: compass-db
+    hostname: compass-db
+    privileged: true
+    expose:
+    - 3306
+    tty: true
+    image: {{ compass_db }}
+    stdin_open: true
+    command:
+    - /sbin/entrypoint.sh
+{% endif %}
+
+{% if compass_mq is defined %}
+  compass-mq:
+    container_name: compass-mq
+    hostname: compass-mq
+    privileged: true
+    expose:
+    - 5672
+    tty: true
+    image: {{ compass_mq }}
+    stdin_open: true
+{% endif %}
+
+{% if compass_tasks is defined %}
+  compass-tasks:
+    container_name: compass-tasks
+    hostname: compass-tasks
+    privileged: true
+    image: {{ compass_tasks }}
+    links:
+    - compass-mq
+    - compass-cobbler
+    depends_on:
+    - compass-mq
+    - compass-cobbler
+    stdin_open: true
+    volumes:
+    - {{ docker_compose_dir }}/compass_conf:/etc/compass
+    - {{ docker_compose_dir }}/ansible:/var/ansible
+    command:
+    - /usr/local/bin/start.sh
+{% endif %}
+
+{% if compass_deck is defined %}
+  compass-deck:
+    container_name: compass-deck
+    hostname: compass-deck
+    privileged: true
+    image: {{ compass_deck }}
+    ports:
+    - {{ host_ip }}:{{ deck_port }}:80/tcp
+    - {{ external_ip.stdout }}:{{ deck_port }}:80/tcp
+    tty: true
+    links:
+    - compass-db
+    - compass-mq
+    depends_on:
+    - compass-db
+    - compass-mq
+    stdin_open: true
+    volumes:
+    - {{ docker_compose_dir }}/compass_conf:/etc/compass
+    command:
+    - /sbin/init
+    - /usr/local/bin/start.sh
+{% endif %}
+
+{% if compass_cobbler is defined %}
+  compass-cobbler:
+    container_name: compass-cobbler
+    hostname: compass-cobbler
+    network_mode: host
+    privileged: true
+    image: {{ compass_cobbler }}
+    ports:
+    - {{ host_ip }}:80:80/tcp
+    - {{ host_ip }}:69:69
+    - {{ host_ip }}:443:443/tcp
+    - {{ host_ip }}:25151:25151/tcp
+    - {{ host_ip }}:67:67/tcp
+    volumes:
+    - {{ docker_compose_dir }}/cobbler:/root/cobbler
+    command:
+    - /sbin/init
+{% endif %}
+
+{% if compass_repo is defined %}
+  compass-repo:
+    container_name: compass-repo
+    hostname: compass-repo
+    privileged: true
+    image: {{ compass_repo }}
+    ports:
+    - {{ host_ip }}:{{ repo_port }}:80/tcp
+    tty: true
+    stdin_open: true
+{% endif %}
diff --git a/util/docker-compose/roles/compass/templates/machine_list.conf.j2 b/util/docker-compose/roles/compass/templates/machine_list.conf.j2
new file mode 100755 (executable)
index 0000000..d85f74d
--- /dev/null
@@ -0,0 +1,14 @@
+MACHINE_LIST = [
+    {
+        '127.0.0.1': [
+{% set port_num = 200 %}
+{% for mac in mac_addresses %}
+            {
+                'port': '{{ port_num }}',
+                'mac': '{{ mac }}',
+                'vlan': 0
+            },
+{% endfor %}
+        ]
+    }
+]
diff --git a/util/docker-compose/roles/compass/templates/named.template.j2 b/util/docker-compose/roles/compass/templates/named.template.j2
new file mode 100755 (executable)
index 0000000..0cf7622
--- /dev/null
@@ -0,0 +1,31 @@
+options {
+          listen-on port 53 { {{ host_ip }}; };
+          directory       "/var/named";
+          dump-file       "/var/named/data/cache_dump.db";
+          statistics-file "/var/named/data/named_stats.txt";
+          memstatistics-file "/var/named/data/named_mem_stats.txt";
+          allow-query { 127.0.0.0/8; {{ install_subnet }}/{{ install_prefix }}; };
+          recursion yes;
+};
+
+logging {
+        channel default_debug {
+                file "data/named.run";
+                severity dynamic;
+        };
+};
+
+#for $zone in $forward_zones
+zone "${zone}." {
+    type master;
+    file "$zone";
+};
+
+#end for
+#for $zone, $arpa in $reverse_zones
+zone "${arpa}." {
+    type master;
+    file "$zone";
+};
+
+#end for
diff --git a/util/docker-compose/roles/compass/templates/prepare_ansible.sh.j2 b/util/docker-compose/roles/compass/templates/prepare_ansible.sh.j2
new file mode 100755 (executable)
index 0000000..e0de125
--- /dev/null
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+for i in `ls {{ compass_adapter_dir }}/ansible | grep "openstack_"`; do
+    mkdir -p {{ docker_compose_dir }}/ansible/$i
+    cp -rf {{ compass_adapter_dir }}/ansible/openstack/* {{ docker_compose_dir }}/ansible/$i
+    cp -rf {{ compass_adapter_dir }}/ansible/$i {{ docker_compose_dir }}/ansible/
+done
+cp -rf {{ compass_adapter_dir }}/ansible/roles {{ docker_compose_dir }}/ansible/
diff --git a/util/docker-compose/roles/compass/templates/settings.j2 b/util/docker-compose/roles/compass/templates/settings.j2
new file mode 100755 (executable)
index 0000000..9e4a739
--- /dev/null
@@ -0,0 +1,450 @@
+---
+# cobbler settings file
+# restart cobblerd and run "cobbler sync" after making changes
+# This config file is in YAML 1.0 format
+# see http://yaml.org
+# ==========================================================
+# if 1, cobbler will allow insertions of system records that duplicate
+# the --dns-name information of other system records.  In general,
+# this is undesirable and should be left 0.
+allow_duplicate_hostnames: 0
+
+# if 1, cobbler will allow insertions of system records that duplicate
+# the ip address information of other system records.  In general,
+# this is undesirable and should be left 0.
+allow_duplicate_ips: 0
+
+# if 1, cobbler will allow insertions of system records that duplicate
+# the mac address information of other system records.  In general,
+# this is undesirable.
+allow_duplicate_macs: 0
+
+# if 1, cobbler will allow settings to be changed dynamically without
+# a restart of the cobblerd daemon. You can only change this variable
+# by manually editing the settings file, and you MUST restart cobblerd
+# after changing it.
+allow_dynamic_settings: 0
+
+# by default, installs are *not* set to send installation logs to the cobbler
+# # # server.  With 'anamon_enabled', kickstart templates may use the pre_anamon
+# # # snippet to allow remote live monitoring of their installations from the
+# # # cobbler server.  Installation logs will be stored under
+# # # /var/log/cobbler/anamon/.  NOTE: This does allow an xmlrpc call to send logs
+# # # to this directory, without authentication, so enable only if you are
+# # # ok with this limitation.
+anamon_enabled: 1
+
+# If using authn_pam in the modules.conf, this can be configured
+# to change the PAM service authentication will be tested against.
+# The default value is "login".
+authn_pam_service: "login"
+
+# Email out a report when cobbler finishes installing a system.
+# enabled: set to 1 to turn this feature on
+# sender: optional
+# email: which addresses to email
+# smtp_server: used to specify another server for an MTA
+# subject: use the default subject unless overridden
+build_reporting_enabled: 0
+build_reporting_sender: ""
+build_reporting_email: [ 'root@localhost' ]
+build_reporting_smtp_server: "localhost"
+build_reporting_subject: ""
+
+# Cheetah-language kickstart templates can import Python modules.
+# while this is a useful feature, it is not safe to allow them to
+# import anything they want. This whitelists which modules can be
+# imported through Cheetah.  Users can expand this as needed but
+# should never allow modules such as subprocess or those that
+# allow access to the filesystem as Cheetah templates are evaluated
+# by cobblerd as code.
+cheetah_import_whitelist:
+ - "random"
+ - "re"
+ - "time"
+
+# Default createrepo_flags to use for new repositories. If you have
+# createrepo >= 0.4.10, consider "-c cache --update -C", which can
+# dramatically improve your "cobbler reposync" time.  "-s sha"
+# enables working with Fedora repos from F11/F12 from EL-4 or
+# EL-5 without python-hashlib installed (which is not available
+# on EL-4)
+createrepo_flags: "-c cache -s sha"
+
+# if no kickstart is specified to profile add, use this template
+default_kickstart: /var/lib/cobbler/kickstarts/default.ks
+
+# configure all installed systems to use these nameservers by default
+# unless defined differently in the profile.  For DHCP configurations
+# you probably do /not/ want to supply this.
+default_name_servers: ['10.1.10.15']
+
+# if using the authz_ownership module (see the Wiki), objects
+# created without specifying an owner are assigned to this
+# owner and/or group.  Can be a comma seperated list.
+default_ownership:
+ - "admin"
+
+# cobbler has various sample kickstart templates stored
+# in /var/lib/cobbler/kickstarts/.  This controls
+# what install (root) password is set up for those
+# systems that reference this variable.  The factory
+# default is "cobbler" and cobbler check will warn if
+# this is not changed.
+# The simplest way to change the password is to run
+# openssl passwd -1
+# and put the output between the "" below.
+default_password_crypted: "$1$huawei$9OkoVJwO4W8vavlXd1bUS/"
+
+# the default template type to use in the absence of any
+# other detected template. If you do not specify the template
+# with '#template=<template_type>' on the first line of your
+# templates/snippets, cobbler will assume try to use the
+# following template engine to parse the templates.
+#
+# Current valid values are: cheetah, jinja2
+default_template_type: "cheetah"
+
+# for libvirt based installs in koan, if no virt bridge
+# is specified, which bridge do we try?  For EL 4/5 hosts
+# this should be xenbr0, for all versions of Fedora, try
+# "virbr0".  This can be overriden on a per-profile
+# basis or at the koan command line though this saves
+# typing to just set it here to the most common option.
+default_virt_bridge: xenbr0
+
+# use this as the default disk size for virt guests (GB)
+default_virt_file_size: 5
+
+# use this as the default memory size for virt guests (MB)
+default_virt_ram: 512
+
+# if koan is invoked without --virt-type and no virt-type
+# is set on the profile/system, what virtualization type
+# should be assumed?  Values: xenpv, xenfv, qemu, vmware
+# (NOTE: this does not change what virt_type is chosen by import)
+default_virt_type: xenpv
+
+# enable gPXE booting? Enabling this option will cause cobbler
+# to copy the undionly.kpxe file to the tftp root directory,
+# and if a profile/system is configured to boot via gpxe it will
+# chain load off pxelinux.0.
+# Default: 0
+enable_gpxe: 0
+
+# controls whether cobbler will add each new profile entry to the default
+# PXE boot menu.  This can be over-ridden on a per-profile
+# basis when adding/editing profiles with --enable-menu=0/1.  Users
+# should ordinarily leave this setting enabled unless they are concerned
+# with accidental reinstalls from users who select an entry at the PXE
+# boot menu.  Adding a password to the boot menus templates
+# may also be a good solution to prevent unwanted reinstallations
+enable_menu: 0
+
+# enable Func-integration?  This makes sure each installed machine is set up
+# to use func out of the box, which is a powerful way to script and control
+# remote machines.
+# Func lives at http://fedorahosted.org/func
+# read more at https://github.com/cobbler/cobbler/wiki/Func-integration
+# you will need to mirror Fedora/EPEL packages for this feature, so see
+# https://github.com/cobbler/cobbler/wiki/Manage-yum-repos if you want cobbler
+# to help you with this
+func_auto_setup: 0
+func_master: overlord.example.org
+
+# change this port if Apache is not running plaintext on port
+# 80.  Most people can leave this alone.
+http_port: 80
+
+# kernel options that should be present in every cobbler installation.
+# kernel options can also be applied at the distro/profile/system
+# level.
+kernel_options:
+ ksdevice: bootif
+ lang: ' '
+ text: ~
+
+# s390 systems require additional kernel options in addition to the
+# above defaults
+kernel_options_s390x:
+ RUNKS: 1
+ ramdisk_size: 40000
+ root: /dev/ram0
+ ro: ~
+ ip: off
+ vnc: ~
+
+# configuration options if using the authn_ldap module. See the
+# the Wiki for details.  This can be ignored if you are not using
+# LDAP for WebUI/XMLRPC authentication.
+ldap_server: "ldap.example.com"
+ldap_base_dn: "DC=example,DC=com"
+ldap_port: 389
+ldap_tls: 1
+ldap_anonymous_bind: 1
+ldap_search_bind_dn: ''
+ldap_search_passwd: ''
+ldap_search_prefix: 'uid='
+ldap_tls_cacertfile: ''
+ldap_tls_keyfile: ''
+ldap_tls_certfile: ''
+
+# cobbler has a feature that allows for integration with config management
+# systems such as Puppet.  The following parameters work in conjunction with
+# --mgmt-classes  and are described in furhter detail at:
+# https://github.com/cobbler/cobbler/wiki/Using-cobbler-with-a-configuration-management-system
+mgmt_classes: []
+mgmt_parameters:
+ from_cobbler: 1
+
+# if enabled, this setting ensures that puppet is installed during
+# machine provision, a client certificate is generated and a
+# certificate signing request is made with the puppet master server
+puppet_auto_setup: 0
+
+# when puppet starts on a system after installation it needs to have
+# its certificate signed by the puppet master server. Enabling the
+# following feature will ensure that the puppet server signs the
+# certificate after installation if the puppet master server is
+# running on the same machine as cobbler. This requires
+# puppet_auto_setup above to be enabled
+sign_puppet_certs_automatically: 0
+
+# location of the puppet executable, used for revoking certificates
+puppetca_path: "/usr/bin/puppet"
+
+# when a puppet managed machine is reinstalled it is necessary to
+# remove the puppet certificate from the puppet master server before a
+# new certificate is signed (see above). Enabling the following
+# feature will ensure that the certificate for the machine to be
+# installed is removed from the puppet master server if the puppet
+# master server is running on the same machine as cobbler. This
+# requires puppet_auto_setup above to be enabled
+remove_old_puppet_certs_automatically: 0
+
+# choose a --server argument when running puppetd/puppet agent during kickstart
+#puppet_server: 'puppet'
+
+# let cobbler know that you're using a newer version of puppet
+# choose version 3 to use: 'puppet agent'; version 2 uses status quo: 'puppetd'
+#puppet_version: 2
+
+# choose whether to enable puppet parameterized classes or not.
+# puppet versions prior to 2.6.5 do not support parameters
+#puppet_parameterized_classes: 1
+
+# set to 1 to enable Cobbler's DHCP management features.
+# the choice of DHCP management engine is in /etc/cobbler/modules.conf
+manage_dhcp: 1
+
+# set to 1 to enable Cobbler's DNS management features.
+# the choice of DNS mangement engine is in /etc/cobbler/modules.conf
+manage_dns: 1
+
+# set to path of bind chroot to create bind-chroot compatible bind
+# configuration files.  This should be automatically detected.
+bind_chroot_path: ""
+
+# set to the ip address of the master bind DNS server for creating secondary
+# bind configuration files
+bind_master: 127.0.0.1
+
+# set to 1 to enable Cobbler's TFTP management features.
+# the choice of TFTP mangement engine is in /etc/cobbler/modules.conf
+manage_tftpd: 1
+
+# set to 1 to enable Cobbler's RSYNC management features.
+manage_rsync: 0
+
+# if using BIND (named) for DNS management in /etc/cobbler/modules.conf
+# and manage_dns is enabled (above), this lists which zones are managed
+# See the Wiki (https://github.com/cobbler/cobbler/wiki/Dns-management) for more info
+manage_forward_zones: ['ods.com']
+manage_reverse_zones: []
+
+# if using cobbler with manage_dhcp, put the IP address
+# of the cobbler server here so that PXE booting guests can find it
+# if you do not set this correctly, this will be manifested in TFTP open timeouts.
+next_server: {{ host_ip }}
+
+# settings for power management features.  optional.
+# see https://github.com/cobbler/cobbler/wiki/Power-management to learn more
+# choices (refer to codes.py):
+#    apc_snmp bladecenter bullpap drac ether_wake ilo integrity
+#    ipmilan ipmitool lpar rsa virsh wti
+power_management_default_type: 'ipmitool'
+
+# the commands used by the power management module are sourced
+# from what directory?
+power_template_dir: "/etc/cobbler/power"
+
+# if this setting is set to 1, cobbler systems that pxe boot
+# will request at the end of their installation to toggle the
+# --netboot-enabled record in the cobbler system record.  This eliminates
+# the potential for a PXE boot loop if the system is set to PXE
+# first in it's BIOS order.  Enable this if PXE is first in your BIOS
+# boot order, otherwise leave this disabled.   See the manpage
+# for --netboot-enabled.
+pxe_just_once: 1
+
+# the templates used for PXE config generation are sourced
+# from what directory?
+pxe_template_dir: "/etc/cobbler/pxe"
+
+# Path to where system consoles are
+consoles: "/var/consoles"
+
+# Are you using a Red Hat management platform in addition to Cobbler?
+# Cobbler can help you register to it.  Choose one of the following:
+#   "off"    : I'm not using Red Hat Network, Satellite, or Spacewalk
+#   "hosted" : I'm using Red Hat Network
+#   "site"   : I'm using Red Hat Satellite Server or Spacewalk
+# You will also want to read: https://github.com/cobbler/cobbler/wiki/Tips-for-RHN
+redhat_management_type: "off"
+
+# if redhat_management_type is enabled, choose your server
+#   "management.example.org" : For Satellite or Spacewalk
+#   "xmlrpc.rhn.redhat.com"  : For Red Hat Network
+# This setting is also used by the code that supports using Spacewalk/Satellite users/passwords
+# within Cobbler Web and Cobbler XMLRPC.  Using RHN Hosted for this is not supported.
+# This feature can be used even if redhat_management_type is off, you just have
+# to have authn_spacewalk selected in modules.conf
+redhat_management_server: "xmlrpc.rhn.redhat.com"
+
+# specify the default Red Hat authorization key to use to register
+# system.  If left blank, no registration will be attempted.  Similarly
+# you can set the --redhat-management-key to blank on any system to
+# keep it from trying to register.
+redhat_management_key: ""
+
+# if using authn_spacewalk in modules.conf to let cobbler authenticate
+# against Satellite/Spacewalk's auth system, by default it will not allow per user
+# access into Cobbler Web and Cobbler XMLRPC.
+# in order to permit this, the following setting must be enabled HOWEVER
+# doing so will permit all Spacewalk/Satellite users of certain types to edit all
+# of cobbler's configuration.
+# these roles are:  config_admin and org_admin
+# users should turn this on only if they want this behavior and
+# do not have a cross-multi-org seperation concern.  If you have
+# a single org in your satellite, it's probably safe to turn this
+# on and then you can use CobblerWeb alongside a Satellite install.
+redhat_management_permissive: 0
+
+# if set to 1, allows /usr/bin/cobbler-register (part of the koan package)
+# to be used to remotely add new cobbler system records to cobbler.
+# this effectively allows for registration of new hardware from system
+# records.
+register_new_installs: 0
+
+# Flags to use for yum's reposync.  If your version of yum reposync
+# does not support -l, you may need to remove that option.
+reposync_flags: "-l -n -d"
+
+# These options will be used for an rsync initiated by cobbler replicate
+replicate_rsync_options: "-avzH"
+
+# when DHCP and DNS management are enabled, cobbler sync can automatically
+# restart those services to apply changes.  The exception for this is
+# if using ISC for DHCP, then omapi eliminates the need for a restart.
+# omapi, however, is experimental and not recommended for most configurations.
+# If DHCP and DNS are going to be managed, but hosted on a box that
+# is not on this server, disable restarts here and write some other
+# script to ensure that the config files get copied/rsynced to the destination
+# box.  This can be done by modifying the restart services trigger.
+# Note that if manage_dhcp and manage_dns are disabled, the respective
+# parameter will have no effect.  Most users should not need to change
+# this.
+restart_dns: 1
+restart_dhcp: 1
+
+# install triggers are scripts in /var/lib/cobbler/triggers/install
+# that are triggered in kickstart pre and post sections.  Any
+# executable script in those directories is run.  They can be used
+# to send email or perform other actions.  They are currently
+# run as root so if you do not need this functionality you can
+# disable it, though this will also disable "cobbler status" which
+# uses a logging trigger to audit install progress.
+run_install_triggers: 1
+
+# enables a trigger which version controls all changes to /var/lib/cobbler
+# when add, edit, or sync events are performed.  This can be used
+# to revert to previous database versions, generate RSS feeds, or for
+# other auditing or backup purposes. "git" and "hg" are currently suported,
+# but git is the recommend SCM for use with this feature.
+scm_track_enabled: 0
+scm_track_mode: "git"
+
+# this is the address of the cobbler server -- as it is used
+# by systems during the install process, it must be the address
+# or hostname of the system as those systems can see the server.
+# if you have a server that appears differently to different subnets
+# (dual homed, etc), you need to read the --server-override section
+# of the manpage for how that works.
+server: {{ host_ip }}
+
+# If set to 1, all commands will be forced to use the localhost address
+# instead of using the above value which can force commands like
+# cobbler sync to open a connection to a remote address if one is in the
+# configuration and would traceback.
+client_use_localhost: 0
+
+# If set to 1, all commands to the API (not directly to the XMLRPC
+# server) will go over HTTPS instead of plaintext. Be sure to change
+# the http_port setting to the correct value for the web server
+client_use_https: 0
+
+# this is a directory of files that cobbler uses to make
+# templating easier.  See the Wiki for more information.  Changing
+# this directory should not be required.
+snippetsdir: /var/lib/cobbler/snippets
+
+# Normally if a kickstart is specified at a remote location, this
+# URL will be passed directly to the kickstarting system, thus bypassing
+# the usual snippet templating Cobbler does for local kickstart files. If
+# this option is enabled, Cobbler will fetch the file contents internally
+# and serve a templated version of the file to the client.
+template_remote_kickstarts: 0
+
+# should new profiles for virtual machines default to auto booting with the physical host when the physical host reboots?
+# this can be overridden on each profile or system object.
+virt_auto_boot: 1
+
+# cobbler's web directory.  Don't change this setting -- see the
+# Wiki on "relocating your cobbler install" if your /var partition
+# is not large enough.
+webdir: /var/www/cobbler
+
+# cobbler's public XMLRPC listens on this port.  Change this only
+# if absolutely needed, as you'll have to start supplying a new
+# port option to koan if it is not the default.
+xmlrpc_port: 25151
+
+# "cobbler repo add" commands set cobbler up with repository
+# information that can be used during kickstart and is automatically
+# set up in the cobbler kickstart templates.  By default, these
+# are only available at install time.  To make these repositories
+# usable on installed systems (since cobbler makes a very convient)
+# mirror, set this to 1.  Most users can safely set this to 1.  Users
+# who have a dual homed cobbler server, or are installing laptops that
+# will not always have access to the cobbler server may wish to leave
+# this as 0.  In that case, the cobbler mirrored yum repos are still
+# accessable at http://cobbler.example.org/cblr/repo_mirror and yum
+# configuration can still be done manually.  This is just a shortcut.
+yum_post_install_mirror: 1
+
+# the default yum priority for all the distros.  This is only used
+# if yum-priorities plugin is used.  1=maximum.  Tweak with caution.
+yum_distro_priority: 1
+
+# Flags to use for yumdownloader.  Not all versions may support
+# --resolve.
+yumdownloader_flags: "--resolve"
+
+# sort and indent JSON output to make it more human-readable
+serializer_pretty_json: 0
+
+# replication rsync options for distros, kickstarts, snippets set to override default value of "-avzH"
+replicate_rsync_options: "-avzH"
+
+# replication rsync options for repos set to override default value of "-avzH"
+replicate_repo_rsync_options: "-avzH"
diff --git a/util/docker-compose/roles/compass/templates/zone.template.j2 b/util/docker-compose/roles/compass/templates/zone.template.j2
new file mode 100755 (executable)
index 0000000..ea67b73
--- /dev/null
@@ -0,0 +1,17 @@
+\$TTL 300
+@                       IN      SOA     $cobbler_server. nobody.example.com. (
+                                        $serial   ; Serial
+                                        600         ; Refresh
+                                        1800         ; Retry
+                                        604800       ; Expire
+                                        300          ; TTL
+                                        )
+
+                        IN      NS      $cobbler_server.
+
+
+$cname_record
+
+$host_record
+compass-250-41 IN A {{ host_ip }}
+metrics IN A {{ host_ip }}
diff --git a/util/docker-compose/roles/discovery/tasks/main.yml b/util/docker-compose/roles/discovery/tasks/main.yml
new file mode 100755 (executable)
index 0000000..ac4b24e
--- /dev/null
@@ -0,0 +1,71 @@
+---
+- name: config avahi
+  template:
+    src: compass_discovery.service.j2
+    dest: "{{ docker_compose_dir }}/extra/compass_discovery.service"
+
+- name: restart avahi service
+  shell: |
+    docker exec compass-cobbler bash -c \
+    "cp -rf /root/extra/compass_discovery.service /etc/avahi/services/; \
+     service avahi-daemon restart"
+
+- name: add tinycore signature
+  template:
+    src: distro_signatures.json.j2
+    dest: "{{ docker_compose_dir }}/extra/distro_signatures.json"
+
+- name: restart cobblerd service
+  shell: |
+    docker exec compass-cobbler bash -c \
+    "cp -rf /root/extra/distro_signatures.json /var/lib/cobbler/; \
+     service cobblerd restart"
+
+- name: config dhcp
+  shell: |
+    docker exec compass-cobbler bash -c \
+    "sed -i 's/deny unknown-clients/allow unknown-clients/' /etc/cobbler/dhcp.template"
+
+- name: download tinycore
+  get_url:
+    url: "{{ tinycore_url }}"
+    dest: "{{ docker_compose_dir }}/extra/"
+
+- name: mount tinycore
+  shell: |
+    docker exec compass-cobbler bash -c \
+    "mkdir -p /home/tinycore; \
+     mount -o loop /root/extra/core.iso /home/tinycore;"
+  ignore_errors: "yes"
+  run_once: "True"
+
+- name: import tinycore distros
+  shell: |
+    docker exec compass-cobbler bash -c \
+    "service cobblerd restart; \
+     sleep 3; \
+     cobbler import --name {{ tinycore.DistroName }} \
+                    --arch {{ tinycore.DistroArch }} \
+                    --path /home/tinycore;"
+  register: result
+  until: result.rc == 0
+  retries: 10
+  delay: 3
+
+- name: edit tinycore profile
+  shell: |
+    docker exec compass-cobbler bash -c \
+    "cobbler profile edit --name {{ tinycore.DistroName }}-{{ tinycore.DistroArch }} \
+                          --enable-menu True \
+                          --kopts 'owner_id={{ cluster_id }}'"
+
+- name: add default system
+  shell: |
+    docker exec compass-cobbler bash -c \
+    "cobbler system add --name default \
+                        --profile {{ tinycore.DistroName }}-{{ tinycore.DistroArch }}"
+
+- name: cobbler sync
+  shell: |
+    docker exec compass-cobbler bash -c \
+    "cobbler sync"
diff --git a/util/docker-compose/roles/discovery/templates/compass_discovery.service.j2 b/util/docker-compose/roles/discovery/templates/compass_discovery.service.j2
new file mode 100755 (executable)
index 0000000..ae6418b
--- /dev/null
@@ -0,0 +1,7 @@
+<service-group>
+    <name replace-wildcards="yes">Compass Discovery Service on %h</name>
+    <service protocol="ipv4">
+        <type>_compass-core._tcp</type>
+        <port>{{ deck_port }}</port>
+    </service>
+</service-group>
diff --git a/util/docker-compose/roles/discovery/templates/dhcp.template.j2 b/util/docker-compose/roles/discovery/templates/dhcp.template.j2
new file mode 100755 (executable)
index 0000000..c0559e7
--- /dev/null
@@ -0,0 +1,123 @@
+# ******************************************************************
+# Cobbler managed dhcpd.conf file
+#
+# generated from cobbler dhcp.conf template ($date)
+# Do NOT make changes to /etc/dhcpd.conf. Instead, make your changes
+# in /etc/cobbler/dhcp.template, as /etc/dhcpd.conf will be
+# overwritten.
+#
+# ******************************************************************
+
+ddns-update-style interim;
+
+allow booting;
+allow bootp;
+allow unknown-clients;
+local-address {{ cobbler_server }};
+log-facility local6;
+
+ignore client-updates;
+set vendorclass = option vendor-class-identifier;
+
+option pxe-system-type code 93 = unsigned integer 16;
+option space pxelinux;
+option pxelinux.magic      code 208 = string;
+option pxelinux.configfile code 209 = text;
+option pxelinux.pathprefix code 210 = text;
+option pxelinux.reboottime code 211 = unsigned integer 32;
+
+{% if dockerized %}
+subnet {{ compass0_subnet_ip }} netmask {{ compass0_subnet_mask }} {
+     option routers {{ compass0_router }};
+     option domain-name-servers {{ compass0_router }};
+     option subnet-mask {{ compass0_subnet_mask }};
+     range dynamic-bootp {{ compass0_dhcp_range }};
+     default-lease-time 21600;
+     max-lease-time 43200;
+     next-server $next_server;
+     class "pxeclients" {
+          match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
+          if option pxe-system-type = 00:02 {
+                  filename "ia64/elilo.efi";
+          } else if option pxe-system-type = 00:06 {
+                  filename "grub/grub-x86.efi";
+          } else if option pxe-system-type = 00:07 {
+                  filename "grub/grub-x86_64.efi";
+          } else {
+                  filename "pxelinux.0";
+          }
+     }
+
+}
+{% endif %}
+
+subnet {{ mgmt_subnet_ip }} netmask {{ mgmt_subnet_mask }} {
+     option routers {{ mgmt_router }};
+     option domain-name-servers {{ mgmt_router }};
+     option subnet-mask {{ mgmt_subnet_mask }};
+     range dynamic-bootp {{ mgmt_dhcp_range }};
+     default-lease-time 21600;
+     max-lease-time 43200;
+     next-server {{ mgmt_next_ip }};
+     class "pxeclients" {
+          match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
+          if option pxe-system-type = 00:02 {
+                  filename "ia64/elilo.efi";
+          } else if option pxe-system-type = 00:06 {
+                  filename "grub/grub-x86.efi";
+          } else if option pxe-system-type = 00:07 {
+                  filename "grub/grub-x86_64.efi";
+          } else {
+                  filename "pxelinux.0";
+          }
+     }
+
+}
+
+#for dhcp_tag in $dhcp_tags.keys():
+    ## group could be subnet if your dhcp tags line up with your subnets
+    ## or really any valid dhcpd.conf construct ... if you only use the
+    ## default dhcp tag in cobbler, the group block can be deleted for a
+    ## flat configuration
+# group for Cobbler DHCP tag: $dhcp_tag
+group {
+        #for mac in $dhcp_tags[$dhcp_tag].keys():
+            #set iface = $dhcp_tags[$dhcp_tag][$mac]
+    host $iface.name {
+        hardware ethernet $mac;
+        site-option-space "pxelinux";
+        option pxelinux.magic f1:00:74:7e;
+        if exists dhcp-parameter-request-list {
+            # Always send the PXELINUX options (specified in hexadecimal)
+            option dhcp-parameter-request-list = concat(option dhcp-parameter-request-list,d0,d1,d2,d3);
+        }
+        option pxelinux.reboottime 30;
+        #if $iface.hostname:
+        option host-name "$iface.hostname";
+        #end if
+        #if $iface.netmask:
+        option subnet-mask $iface.netmask;
+        #end if
+        #if $iface.gateway:
+        option routers $iface.gateway;
+        #end if
+        #if $iface.enable_gpxe:
+        if exists user-class and option user-class = "gPXE" {
+            filename "http://$cobbler_server/cblr/svc/op/gpxe/system/$iface.owner";
+        } else if exists user-class and option user-class = "iPXE" {
+            filename "http://$cobbler_server/cblr/svc/op/gpxe/system/$iface.owner";
+        } else {
+            filename "undionly.kpxe";
+        }
+        #else
+        filename "$iface.filename";
+        #end if
+        ## Cobbler defaults to $next_server, but some users
+        ## may like to use $iface.system.server for proxied setups
+        next-server $next_server;
+        ## next-server $iface.next_server;
+    }
+        #end for
+}
+#end for
+
diff --git a/util/docker-compose/roles/discovery/templates/distro_signatures.json.j2 b/util/docker-compose/roles/discovery/templates/distro_signatures.json.j2
new file mode 100755 (executable)
index 0000000..21d22fe
--- /dev/null
@@ -0,0 +1,1008 @@
+{"breeds":
+ {
+  "tinycore": {
+   "corepure64": {
+    "signatures":["boot"],
+    "version_file":"",
+    "version_file_regex":"",
+    "kernel_arch":"",
+    "kernel_arch_regex":"",
+    "supported_arches":["x86_64","amd64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"vmlinuz64",
+    "initrd_file":"corepure64.gz",
+    "isolinux_ok":true,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "generic27": {
+    "signatures":["boot"],
+    "version_file":"",
+    "version_file_regex":"",
+    "kernel_arch":"",
+    "kernel_arch_regex":"",
+    "supported_arches":["i386"],
+    "supported_repo_breeds":[],
+    "kernel_file":"vmlinuz",
+    "initrd_file":"core.gz",
+    "isolinux_ok":true,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   }
+  },
+  "redhat": {
+   "rhel4": {
+    "signatures":["RedHat/RPMS","CentOS/RPMS"],
+    "version_file":"(redhat|sl|centos)-release-4(AS|WS|ES)[\\.-]+(.*)\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*).rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "rhel5": {
+    "signatures":["RedHat","Server","CentOS","Client"],
+    "version_file":"(redhat|sl|centos)-release-5([^\\.][\\w]*)?[\\.-]+(.*)\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*).rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "rhel6": {
+    "signatures":["Packages"],
+    "version_file":"(redhat|sl|slf|centos|oraclelinux)-release-(?!notes)([\\w]*-)*6(Server)*[\\.-]+(.*)\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*).rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "rhel7": {
+    "signatures":["Packages"],
+    "version_file":"(redhat|sl|slf|centos|oraclelinux)-release-(?!notes)([\\w]*-)*7(Server)*[\\.-]+(.*)\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*).rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "fedora16": {
+    "signatures":["Packages"],
+    "version_file":"(fedora)-release-16-(.*)\\.noarch\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "fedora17": {
+    "signatures":["Packages"],
+    "version_file":"(fedora)-release-17-(.*)\\.noarch\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"repo=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "fedora18": {
+    "signatures":["Packages"],
+    "version_file":"(fedora)-release-18-(.*)\\.noarch\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"repo=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "fedora19": {
+    "signatures":["Packages"],
+    "version_file":"(fedora)-release-19-(.*)\\.noarch\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"repo=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "fedora20": {
+    "signatures":["Packages"],
+    "version_file":"(fedora)-release-20-(.*)\\.noarch\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"repo=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "fedora21": {
+    "signatures":["Packages"],
+    "version_file":"(fedora)-release-21-(.*)\\.noarch\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"repo=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "fedora22": {
+    "signatures":["Packages"],
+    "version_file":"(fedora)-release-22-(.*)\\.noarch\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64","ppc64le"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"repo=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "fedora23": {
+    "signatures":["Packages"],
+    "version_file":"(fedora)-release-23-(.*)\\.noarch\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64","ppc64le"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"repo=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "cloudlinux6": {
+    "signatures":["Packages"],
+    "version_file":"(cloudlinux)-release-(.*)\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*).rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","x86_64","ppc","ppc64"],
+    "supported_repo_breeds":["rsync", "rhn", "yum"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.img",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_end.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   }
+  },
+  "debian": {
+   "squeeze": {
+    "signatures":["dists"],
+    "version_file":"Release",
+    "version_file_regex":"Codename: squeeze",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "wheezy": {
+    "signatures":["dists"],
+    "version_file":"Release",
+    "version_file_regex":"Codename: wheezy",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "jessie": {
+    "signatures":["dists"],
+    "version_file":"Release",
+    "version_file_regex":"Codename: jessie",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "stretch": {
+    "signatures":["dists"],
+    "version_file":"Release",
+    "version_file_regex":"Codename: stretch",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"vmlinuz(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   }
+  },
+  "ubuntu": {
+   "lucid": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: lucid|Ubuntu 10.04",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "oneiric": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: oneiric|Ubuntu 11.10",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "precise": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: precise|Ubuntu 12.04",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "quantal": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: quantal|Ubuntu 12.10",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "raring": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: raring|Ubuntu 13.04",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "saucy": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: saucy|Ubuntu 13.10",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "trusty": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: trusty|Ubuntu 14.04",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "vivid": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: vivid|Ubuntu 15.04",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "wily": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: wily|Ubuntu 15.10",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "xenial": {
+    "signatures":["dists", ".disk"],
+    "version_file":"Release|mini-info",
+    "version_file_regex":"Codename: xenial|Ubuntu 16.04",
+    "kernel_arch":"linux-headers-(.*)\\.deb",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":["apt"],
+    "kernel_file":"linux(.*)",
+    "initrd_file":"initrd(.*)\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample.seed",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   }
+  },
+  "suse": {
+   "opensuse11.2": {
+    "signatures":["suse"],
+    "version_file":"openSUSE-release-11.2-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"(linux|vmlinuz(.*))",
+    "initrd_file":"initrd(.*)",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "opensuse11.3": {
+    "signatures":["suse"],
+    "version_file":"openSUSE-release-11.3-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"(linux|vmlinuz(.*))",
+    "initrd_file":"initrd(.*)",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "opensuse11.4": {
+    "signatures":["suse"],
+    "version_file":"openSUSE-release-11.4-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"(linux|vmlinuz(.*))",
+    "initrd_file":"initrd(.*)",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "opensuse12.1": {
+    "signatures":["suse"],
+    "version_file":"openSUSE-release-12.1-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"(linux|vmlinuz(.*))",
+    "initrd_file":"initrd(.*)",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "opensuse12.2": {
+    "signatures":["suse"],
+    "version_file":"openSUSE-release-12.2-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"(linux|vmlinuz(.*))",
+    "initrd_file":"initrd(.*)",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "opensuse12.3": {
+    "signatures":["suse"],
+    "version_file":"openSUSE-release-12.3-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"(linux|vmlinuz(.*))",
+    "initrd_file":"initrd(.*)",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "opensuse13.1": {
+    "signatures":["suse"],
+    "version_file":"openSUSE-release-13.1-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"(linux|vmlinuz(.*))",
+    "initrd_file":"initrd(.*)",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "opensuse13.2": {
+    "signatures":["suse"],
+    "version_file":"openSUSE-release-13.2-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"(linux|vmlinuz(.*))",
+    "initrd_file":"initrd(.*)",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "sles10": {
+    "signatures":["suse"],
+    "version_file":"sles-release-10-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64","ppc64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"linux[64.gz]?",
+    "initrd_file":"initrd[64]?",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "sles11": {
+    "signatures":["suse"],
+    "version_file":"sles-release-11-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64","ppc64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"linux[64.gz]?",
+    "initrd_file":"initrd[64]?",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "sles11sp1": {
+    "signatures":["suse"],
+    "version_file":"sles-release-11.1-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64","ppc64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"linux[64.gz]?",
+    "initrd_file":"initrd[64]?",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "sles11sp2": {
+    "signatures":["suse"],
+    "version_file":"sles-release-11.2-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64","ppc64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"linux[64.gz]?",
+    "initrd_file":"initrd[64]?",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "sles11sp3": {
+    "signatures":["suse"],
+    "version_file":"sles-release-11.3-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64","ppc64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"linux[64.gz]?",
+    "initrd_file":"initrd[64]?",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "sles11sp4": {
+    "signatures":["suse"],
+    "version_file":"sles-release-11.4-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64","ppc64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"linux[64.gz]?",
+    "initrd_file":"initrd[64]?",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "sles12": {
+    "signatures":["suse"],
+    "version_file":"(sles|SLES-for-VMware)-release-12-(.*).rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","i586","x86_64","ppc64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"linux[64.gz]?",
+    "initrd_file":"initrd[64]?",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_autoyast.xml",
+    "kernel_options":"install=$tree",
+    "kernel_options_post":"",
+    "boot_files":[]
+   }
+  },
+  "vmware": {
+   "esx4": {
+    "signatures":["VMware/RPMS"],
+    "version_file":"vmware-esx-vmware-release-(.*)\\.rpm",
+    "version_file_regex":null,
+    "kernel_arch":"kernel-(.*)\\.x86_64\\.rpm",
+    "kernel_arch_regex":null,
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":["yum"],
+    "kernel_file":"vmlinuz",
+    "initrd_file":"initrd\\.img",
+    "isolinux_ok":true,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_esx4.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "esxi4": {
+    "signatures":["imagedd.bz2"],
+    "version_file":"vmkernel\\.gz",
+    "version_file_regex":"^.*ESXi 4.1\\.(\\d)+ \\[Releasebuild-([\\d]+)\\].*$",
+    "kernel_arch":"vmkernel\\.gz",
+    "kernel_arch_regex":"^.*SystemVsiCpuArch.*(X86_64).*$",
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"mboot\\.c32",
+    "initrd_file":"vmkboot\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_esxi4.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":["vmkernel.gz","sys.vgz","cim.vgz","ienviron.vgz","install.vgz"]
+   },
+   "esxi5": {
+    "signatures":["tboot.b00"],
+    "version_file":"s\\.v00",
+    "version_file_regex":"^.*ESXi 5\\.0\\.(.*)build-([\\d]+).*$",
+    "kernel_arch":"tools\\.t00",
+    "kernel_arch_regex":"^.*(x86_64).*$",
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"mboot\\.c32",
+    "initrd_file":"imgpayld\\.tgz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_esxi5.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "template_files":"/etc/cobbler/pxe/bootcfg_esxi5.template=$local_img_path/cobbler-boot.cfg",
+    "boot_files":["*.*"]
+   },
+   "esxi51": {
+    "signatures":["tboot.b00"],
+    "version_file":"s\\.v00",
+    "version_file_regex":"^.*ESXi 5\\.1\\.(.*)build-([\\d]+).*$",
+    "kernel_arch":"tools\\.t00",
+    "kernel_arch_regex":"^.*(x86_64).*$",
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"mboot\\.c32",
+    "initrd_file":"imgpayld\\.tgz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_esxi5.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "template_files":"/etc/cobbler/pxe/bootcfg_esxi51.template=$local_img_path/cobbler-boot.cfg",
+    "boot_files":["*.*"]
+   },
+   "esxi55": {
+    "signatures":["tboot.b00"],
+    "version_file":"s\\.v00",
+    "version_file_regex":"^.*ESXi 5\\.5\\.(.*)build-([\\d]+).*$",
+    "kernel_arch":"tools\\.t00",
+    "kernel_arch_regex":"^.*(x86_64).*$",
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"mboot\\.c32",
+    "initrd_file":"imgpayld\\.tgz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_esxi5.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "template_files":"/etc/cobbler/pxe/bootcfg_esxi55.template=$local_img_path/cobbler-boot.cfg",
+    "boot_files":["*.*"]
+   },
+   "esxi60": {
+    "signatures":["tboot.b00"],
+    "version_file":"s\\.v00",
+    "version_file_regex":"^.*ESXi 6\\.0\\.(.*)build-([\\d]+).*$",
+    "kernel_arch":"tools\\.t00",
+    "kernel_arch_regex":"^.*(x86_64).*$",
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"mboot\\.c32",
+    "initrd_file":"imgpayld\\.tgz",
+    "isolinux_ok":false,
+    "default_kickstart":"/var/lib/cobbler/kickstarts/sample_esxi5.ks",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "template_files":"/etc/cobbler/pxe/bootcfg_esxi60.template=$local_img_path/cobbler-boot.cfg",
+    "boot_files":["*.*"]
+   }
+  },
+  "freebsd": {
+   "8.2": {
+    "signatures":["boot"],
+    "version_file":"8\\.2-RELEASE",
+    "version_file_regex":null,
+    "kernel_arch":"device\\.hints",
+    "kernel_arch_regex":"^.*FreeBSD: src/sys/(.*)/conf/GENERIC\\.hints.*$",
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"pxeboot(.*)",
+    "initrd_file":"mfsroot\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "8.3": {
+    "signatures":["boot"],
+    "version_file":"8\\.3-RELEASE",
+    "version_file_regex":null,
+    "kernel_arch":"device\\.hints",
+    "kernel_arch_regex":"^.*FreeBSD: src/sys/(.*)/conf/GENERIC\\.hints.*$",
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"pxeboot(.*)",
+    "initrd_file":"mfsroot\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "8.4": {
+    "signatures":["boot"],
+    "version_file":"8\\.4-RELEASE",
+    "version_file_regex":null,
+    "kernel_arch":"device\\.hints",
+    "kernel_arch_regex":"^.*FreeBSD: src/sys/(.*)/conf/GENERIC\\.hints.*$",
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"pxeboot(.*)",
+    "initrd_file":"mfsroot\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "9.0": {
+    "signatures":["boot"],
+    "version_file":"device\\.hints",
+    "version_file_regex":"^.*FreeBSD: release/9.0(.*)/sys/(.*)/conf/GENERIC.hints.*$",
+    "kernel_arch":"device\\.hints",
+    "kernel_arch_regex":"^.*FreeBSD: release/9.0(.*)/sys/(.*)/conf/GENERIC.hints.*$",
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"pxeboot(.*)",
+    "initrd_file":"mbr",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "10.0": {
+    "signatures":["release"],
+    "version_file":"10\\.0\\-RELEASE",
+    "version_file_regex":null,
+    "kernel_arch":"device\\.hints",
+    "kernel_arch_regex":null,
+    "supported_arches":["i386","amd64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"base.txz",
+    "initrd_file":"base.txz",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   }
+  },
+  "xen": {
+   "xcp16": {
+    "signatures":["packages.main"],
+    "version_file":"^XS-REPOSITORY$",
+    "version_file_regex":"^.*product=\"XCP\" version=\"1\\.6\\.([0-9]+)\".*$",
+    "kernel_arch":"xen\\.gz",
+    "kernel_arch_regex":"^.*(x86_64).*$",
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"vmlinuz",
+    "initrd_file":"xen\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"dom0_max_vcpus=1-2 dom0_mem=max:752M,752M",
+    "kernel_options_post":"",
+    "boot_files":["install.img"]
+   },
+   "xenserver620": {
+    "signatures":["packages.xenserver"],
+    "version_file":"^XS-REPOSITORY$",
+    "version_file_regex":"^.*product=\"XenServer\" version=\"6\\.2\\.([0-9]+)\".*$",
+    "kernel_arch":"xen\\.gz",
+    "kernel_arch_regex":"^.*(x86_64).*$",
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"mboot\\.c32",
+    "initrd_file":"xen\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":["install.img"]
+   },
+   "xenserver650": {
+    "signatures":["packages.xenserver"],
+    "version_file":"^XS-REPOSITORY$",
+    "version_file_regex":"^.*product=\"XenServer\" version=\"6\\.5\\.([0-9]+)\".*$",
+    "kernel_arch":"xen\\.gz",
+    "kernel_arch_regex":"^.*(x86_64).*$",
+    "supported_arches":["x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"mboot\\.c32",
+    "initrd_file":"xen\\.gz",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":["install.img"]
+   }
+  },
+  "unix": {
+  },
+  "windows": {
+  },
+  "nexenta": {
+    "4": {
+      "signatures":["boot"],
+      "version_file": "platform",
+      "version_file_regex": null,
+      "supported_arches":["x86_64"],
+      "supported_repo_breeds":["apt"],
+      "kernel_file":"platform/i86pc/kernel/amd64/unix",
+      "initrd_file":"platform/i86pc/amd64/miniroot",
+      "kernel_arch": "",
+      "kernel_arch_regex": null,
+      "isolinux_ok":false,
+      "kernel_options":"",
+      "kernel_options_post":"",
+      "boot_files":[],
+      "default_kickstart":""
+    }
+  },
+  "generic": {
+   "generic26": {
+    "signatures":[],
+    "version_file":"",
+    "version_file_regex":"",
+    "kernel_arch":"",
+    "kernel_arch_regex":"",
+    "supported_arches":["i386","x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"",
+    "initrd_file":"",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   },
+   "virtio26": {
+    "signatures":[],
+    "version_file":"",
+    "version_file_regex":"",
+    "kernel_arch":"",
+    "kernel_arch_regex":"",
+    "supported_arches":["i386","x86_64"],
+    "supported_repo_breeds":[],
+    "kernel_file":"",
+    "initrd_file":"",
+    "isolinux_ok":false,
+    "default_kickstart":"",
+    "kernel_options":"",
+    "kernel_options_post":"",
+    "boot_files":[]
+   }
+  }
+ }
+}
diff --git a/util/docker-compose/roles/discovery/vars/main.yml b/util/docker-compose/roles/discovery/vars/main.yml
new file mode 100755 (executable)
index 0000000..a1104a4
--- /dev/null
@@ -0,0 +1,17 @@
+##############################################################################
+# Copyright (c) 2016-2017 HUAWEI TECHNOLOGIES CO.,LTD and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+---
+
+tinycore_url: http://192.168.104.2:9999/download/core.iso
+
+tinycore:
+  DistroName: tinycore
+  DistroArch: x86_64
+
+cluster_id: 1
diff --git a/util/docker-compose/roles/machines/tasks/main.yml b/util/docker-compose/roles/machines/tasks/main.yml
new file mode 100755 (executable)
index 0000000..365a9d9
--- /dev/null
@@ -0,0 +1,21 @@
+---
+- name: create switch file if test mode enabled
+  template: src=switch_machines_file.j2
+            dest="{{ docker_compose_dir }}/switch_machines_file"
+  tags:
+    - redploy
+
+- name: docker cp switch_machines_file
+  shell: |
+    docker cp "{{ docker_compose_dir }}/switch_machines_file" \
+    compass-deck:/tmp/switch_machines_file
+  tags:
+    - redploy
+
+- name: inject switches and mac addresses
+  shell: |
+    docker exec compass-deck bash -c \
+    "/opt/compass/bin/manage_db.py set_switch_machines \
+    --switch_machines_file /tmp/switch_machines_file"
+  tags:
+    - redploy
diff --git a/util/docker-compose/roles/machines/templates/switch_machines_file.j2 b/util/docker-compose/roles/machines/templates/switch_machines_file.j2
new file mode 100755 (executable)
index 0000000..489befc
--- /dev/null
@@ -0,0 +1,4 @@
+switch,1.1.1.1,huawei,2c,public,under_monitoring
+{% for mac in pxe_boot_macs %}
+machine,1.1.1.1,8,{{ mac }}
+{% endfor %}
diff --git a/util/docker-compose/roles/osa/files/cinder.yml b/util/docker-compose/roles/osa/files/cinder.yml
new file mode 100755 (executable)
index 0000000..3a39935
--- /dev/null
@@ -0,0 +1,13 @@
+---
+# This file contains an example to show how to set
+# the cinder-volume service to run in a container.
+#
+# Important note:
+# When using LVM or any iSCSI-based cinder backends, such as NetApp with
+# iSCSI protocol, the cinder-volume service *must* run on metal.
+# Reference: https://bugs.launchpad.net/ubuntu/+source/lxc/+bug/1226855
+
+container_skel:
+  cinder_volumes_container:
+    properties:
+      is_metal: true
diff --git a/util/docker-compose/roles/osa/tasks/main.yml b/util/docker-compose/roles/osa/tasks/main.yml
new file mode 100755 (executable)
index 0000000..7b86890
--- /dev/null
@@ -0,0 +1,48 @@
+---
+- name: install packege
+  shell: |
+    docker exec compass-tasks bash -c \
+    "yum upgrade -y; \
+     yum install https://rdoproject.org/repos/openstack-ocata/rdo-release-ocata.rpm -y; \
+     yum install git ntp ntpdate openssh-server python-devel sudo '@Development Tools' -y"
+
+- name: git clone openstack-ansible
+  shell: |
+    docker exec compass-tasks bash -c \
+    "rm -rf /opt/openstack-ansible; \
+     git clone https://git.openstack.org/openstack/openstack-ansible /opt/openstack-ansible"
+
+- name: change openstack-ansible to ocata branch
+  shell: |
+    docker exec compass-tasks bash -c \
+    "cd /opt/openstack-ansible; \
+     git checkout -b ocata remotes/origin/stable/ocata"
+
+- name: copy /opt/openstack-ansible/etc/openstack_deploy to /etc/openstack_deploy
+  shell: |
+    docker exec compass-tasks bash -c \
+    "rm -rf /etc/openstack_deploy; \
+     /bin/cp -rf /opt/openstack-ansible/etc/openstack_deploy /etc/openstack_deploy"
+
+- name: bootstrap
+  shell: |
+    docker exec compass-tasks bash -c \
+    "cd /opt/openstack-ansible; \
+     scripts/bootstrap-ansible.sh; \
+     rm /usr/local/bin/ansible-playbook -f"
+
+- name: generate password token
+  shell: |
+    docker exec compass-tasks bash -c \
+    " cd /opt/openstack-ansible/scripts/; \
+      python pw-token-gen.py --file /etc/openstack_deploy/user_secrets.yml"
+
+- name: copy cinder file
+  copy:
+   src: cinder.yml
+   dest: "{{ docker_compose_dir }}/cinder.yml"
+
+- name: copy file to docker
+  shell: |
+    docker cp "{{ docker_compose_dir }}/cinder.yml" \
+    compass-tasks:/etc/openstack_deploy/env.d/cinder.yml;