Merge branch 'master' of github.com:open-cloud/xos
diff --git a/xos/openstack_observer/steps/sync_container.py b/xos/openstack_observer/steps/sync_container.py
index c6ac936..a5880f0 100644
--- a/xos/openstack_observer/steps/sync_container.py
+++ b/xos/openstack_observer/steps/sync_container.py
@@ -41,14 +41,45 @@
     def get_node_key(self, node):
         return "/opt/xos/node-key"
 
+    def get_instance_port(self, container_port):
+        print container_port
+        print container_port.network
+        for p in container_port.network.links.all():
+            if (p.instance) and (p.instance.node == container_port.container.node) and (p.mac):
+                return p
+        return None
+
+    def get_ports(self, o):
+        i=0
+        ports = []
+        for port in o.ports.all():
+            if not port.mac:
+                raise Exception("Port on network %s is not yet ready" % port.network.name)
+
+            pd={}
+            pd["device"] = "eth%d" % i
+            pd["mac"] = port.mac
+            pd["ip"] = port.ip
+
+            instance_port = self.get_instance_port(port)
+            if not instance_port:
+                raise Exception("No instance on slice for port on network %s" % port.network.name)
+
+            pd["snoop_instance_mac"] = instance_port.mac
+            pd["snoop_instance_id"] = instance_port.instance.instance_id
+
+            ports.append(pd)
+        return ports
+
     def get_extra_attributes(self, o):
         fields={}
         fields["ansible_tag"] = "container-%s" % str(o.id)
         fields["baremetal_ssh"] = True
         fields["instance_name"] = "rootcontext"
-        fields["container_name"] = o.name
+        fields["container_name"] = "%s-%s" % (o.slice.name, str(o.id))
         fields["docker_image"] = o.docker_image
         fields["username"] = "xos"
+        fields["ports"] = self.get_ports(o)
         return fields
 
     def sync_fields(self, o, fields):
diff --git a/xos/openstack_observer/steps/sync_container.yaml b/xos/openstack_observer/steps/sync_container.yaml
index d97f0df..f8c6df5 100644
--- a/xos/openstack_observer/steps/sync_container.yaml
+++ b/xos/openstack_observer/steps/sync_container.yaml
@@ -5,6 +5,18 @@
   user: {{ username }}
   sudo: yes
 
+  vars:
+    container_name: {{ container_name }}
+    docker_image: {{ docker_image }}
+    ports:
+    {% for port in ports %}
+       - device: {{ port.device }}
+         mac: {{ port.mac }}
+         ip: {{ port.ip }}
+         snoop_instance_mac: {{ port.snoop_instance_mac }}
+         snoop_instance_id: {{ port.snoop_instance_id }}
+    {% endfor %}
+
   tasks:
 
 #  - name: Fix /etc/hosts
@@ -13,6 +25,7 @@
 #      regexp="127.0.0.1 localhost"
 #      line="127.0.0.1 localhost {{ instance_hostname }}"
 
+{% if false %}
   - name: Add repo key
     apt_key:
       keyserver=hkp://pgp.mit.edu:80
@@ -38,11 +51,23 @@
       name=docker-py
       state=latest
 
-  - name: Start Container
-    docker:
-      docker_api_version: "1.18"
-      name: {{ container_name }}
-      # was: reloaded
-      state: running
-      image: {{ docker_image }}
+  - name: install Pipework
+    get_url: url=https://raw.githubusercontent.com/jpetazzo/pipework/master/pipework
+       dest=/usr/local/bin/pipework
+       mode=0755
+{% endif %}
+
+#  - name: Start Container
+#    docker:
+#      docker_api_version: "1.18"
+#      name: {{ container_name }}
+#      # was: reloaded
+#      state: running
+#      image: {{ docker_image }}
+
+  - name: container upstart
+    template: src=/opt/xos/openstack_observer/templates/container.conf.j2 dest=/etc/init/container-{{ container_name }}.conf
+
+  - name: container startup script
+    template: src=/opt/xos/openstack_observer/templates/start-container.sh.j2 dest=/usr/local/sbin/start-container-{{ container_name }}.sh mode=0755
 
diff --git a/xos/openstack_observer/templates/container.conf.j2 b/xos/openstack_observer/templates/container.conf.j2
new file mode 100644
index 0000000..d3ef42d
--- /dev/null
+++ b/xos/openstack_observer/templates/container.conf.j2
@@ -0,0 +1,11 @@
+# Upstart script for container
+description "container"
+author "smbaker@gmail.com"
+start on filesystem and started docker
+stop on runlevel [!2345]
+respawn
+
+script
+  /usr/local/sbin/start-container-{{ container_name }}.sh
+end script
+
diff --git a/xos/openstack_observer/templates/start-container.sh.j2 b/xos/openstack_observer/templates/start-container.sh.j2
new file mode 100644
index 0000000..5656992
--- /dev/null
+++ b/xos/openstack_observer/templates/start-container.sh.j2
@@ -0,0 +1,44 @@
+#!/bin/bash
+
+iptables -L > /dev/null
+ip6tables -L > /dev/null
+
+CONTAINER={{ container_name }}
+IMAGE={{ docker_image }}
+
+docker inspect $CONTAINER > /dev/null 2>&1
+if [ "$?" == 1 ]
+then
+    docker pull $IMAGE
+    docker run -d --name=$CONTAINER --privileged=true --net=none $IMAGE
+else
+    docker start $CONTAINER
+fi
+
+{% if ports %}
+{% for port in ports %}
+IP="{{ port.ip }}"
+MAC="{{ port.mac }}"
+DEVICE="{{ port.device }}"

+INSTANCE_MAC="{{ port.snoop_instance_mac }}"
+INSTANCE_ID="{{ port.snoop_instance_id }}"
+INSTANCE_TAP=`virsh domiflist $INSTANCE_ID | grep -i $INSTANCE_MAC | awk '{print $1}'`
+INSTANCE_TAP=${INSTANCE_TAP:3}
+VLAN_ID=`ovs-vsctl show | grep -i -A 1 port.*$INSTANCE_TAP | grep -i tag | awk '{print $2}'`
+TAP="con`echo $CONTAINER_$DEVICE|md5sum|awk '{print $1}'`"
+TAP=${TAP:0:12}
+echo im=$INSTANCE_MAC ii=$INSTANCE_ID it=$INSTANCE_TAP vlan=$VLAN_ID tap=$TAP con=$CONTAINER dev=$DEVICE mac=$MAC
+ovs-vsctl show | grep -i $TAP
+if [[ $? == 1 ]]; then
+    echo creating tap
+    ovs-vsctl add-port br-int $TAP tag=$VLAN_ID -- set interface $TAP type=internal
+else
+    echo tap exists
+fi
+
+docker exec $CONTAINER ifconfig $DEVICE >> /dev/null || pipework $TAP -i $DEVICE $CONTAINER $IP/24 $MAC
+{% endfor %}
+{% endif %}
+
+# Attach to container
+# docker start -a $CONTAINER