Merge pull request #151 from open-cloud/feature/docker_base

Create an xos-base Docker container that handles all prereqs
diff --git a/.dockerignore b/.dockerignore
index ea51f67..302c3f5 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,3 +1,4 @@
 views/
 applications/
 xos/tests/api/node_modules
+xos/configurations/cord-pod/images
diff --git a/containers/synchronizer/Dockerfile b/containers/synchronizer/Dockerfile
index c4bb737..2f1e092 100644
--- a/containers/synchronizer/Dockerfile
+++ b/containers/synchronizer/Dockerfile
@@ -1,47 +1,5 @@
 FROM       xosproject/xos
 
-RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y \
-    openssh-client \
-    python-crypto \
-    python-jinja2 \
-    python-paramiko \
-    python-yaml \
-    python-httplib2 \
-    rsync \
-    supervisor
-
-RUN pip install -U \
-    jinja2
-
-# Install custom Ansible
-RUN \
-    git clone -b release1.8.2 git://github.com/ansible/ansible.git /opt/ansible && \
-    git clone -b release1.8.2 git://github.com/ansible/ansible-modules-extras.git /opt/ansible/lib/ansible/modules/extras && \
-    git clone -b release1.8.2 git://github.com/ansible/ansible-modules-extras.git /opt/ansible/v2/ansible/modules/extras && \
-    git clone git://github.com/sb98052/ansible-modules-core.git /opt/ansible/lib/ansible/modules/core && \
-    git clone git://github.com/sb98052/ansible-modules-core.git /opt/ansible/v2/ansible/modules/core && \
-    # git clone uses cached copy, doesn't pick up latest
-    git -C /opt/ansible pull && \
-    git -C /opt/ansible/lib/ansible/modules/core pull && \
-    git -C /opt/ansible/v2/ansible/modules/core pull
-
-
-# For Observer
-RUN mkdir -p /usr/local/share /bin /etc/ansible
-
-COPY conf/ansible-hosts /etc/ansible/hosts
-
-ADD http://phantomjs.googlecode.com/files/phantomjs-1.7.0-linux-x86_64.tar.bz2 /usr/local/share/
-
-RUN git clone git://git.planet-lab.org/fofum.git /tmp/fofum && \
-    cd /tmp/fofum; python setup.py install && \
-    rm -rf /tmp/fofum && \
-    tar jxvf /usr/local/share/phantomjs-1.7.0-linux-x86_64.tar.bz2 -C /usr/local/share/ && \
-    rm -f /usr/local/share/phantomjs-1.7.0-linux-x86_64.tar.bz2 && \
-    ln -s /usr/local/share/phantomjs-1.7.0-linux-x86_64 /usr/local/share/phantomjs && \
-    ln -s /usr/local/share/phantomjs/bin/phantomjs /bin/phantomjs
-
-
 # Supervisor
 COPY conf/synchronizer.conf /etc/supervisor/conf.d/
 
diff --git a/containers/xos/Dockerfile b/containers/xos/Dockerfile
index e631e23..cbaad65 100644
--- a/containers/xos/Dockerfile
+++ b/containers/xos/Dockerfile
@@ -1,100 +1,26 @@
-FROM       ubuntu:14.04.3
-
-# XXX Workaround for docker bug:
-# https://github.com/docker/docker/issues/6345
-# Kernel 3.15 breaks docker, uss the line below as a workaround
-# until there is a fix
-RUN ln -s -f /bin/true /usr/bin/chfn
-# XXX End workaround
-
-# Install.
-RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y \
-    curl \
-    gcc \
-    geoip-database \
-    git \
-    graphviz \
-    graphviz-dev \
-    libgeoip1 \
-    libxslt1.1 \
-    libxslt1-dev \
-    libyaml-dev \
-    m4 \
-    pkg-config \
-    python-dev \
-    python-httplib2 \
-    python-pip \
-    python-psycopg2 \
-    python-pycurl \
-    python-setuptools \
-    tar \
-    wget \
-##### observer dependencies
-    python-keystoneclient \
-    python-novaclient \
-    python-neutronclient \
-    python-glanceclient \
-    python-ceilometerclient
-
-RUN pip install \
-    django==1.7 \
-    django-bitfield \
-    django-crispy-forms \
-    django-encrypted-fields \
-    django-extensions \
-    django-filter==0.11.0 \
-    django-geoposition \
-    django-ipware \
-    django_rest_swagger \
-    django-suit==0.3a1 \
-    django-timezones \
-    djangorestframework==3.3.3 \
-    dnslib \
-    jinja2 \
-    lxml \
-    markdown \
-    netaddr \
-    pyOpenSSL \
-    psycopg2 \
-    python-ceilometerclient \
-    python-dateutil \
-    python-keyczar \
-    python-logstash \
-    pygraphviz \
-    pytz \
-    pyyaml \
-    requests
-
-RUN easy_install --upgrade httplib2
-
-RUN easy_install \
-    python_gflags \
-    google_api_python_client \
-    httplib2.ca_certs_locater
-
-ADD http://code.jquery.com/jquery-1.9.1.min.js /usr/local/lib/python2.7/dist-packages/suit/static/suit/js/
+FROM xosproject/xos-base
 
 # Include certificates from Openstack
 ADD local_certs.crt /usr/local/share/ca-certificates/local_certs.crt
 RUN update-ca-certificates
 
-# Install XOS
-RUN git clone git://github.com/open-cloud/xos.git /tmp/xos && \
+# Install and boostrap XOS and Tosca
+ENV XOS_GIT_REPO git://github.com/open-cloud/xos.git
+ENV XOS_GIT_BRANCH master
+
+RUN git clone $XOS_GIT_REPO -b $XOS_GIT_BRANCH /tmp/xos && \
     mv /tmp/xos/xos /opt/ && \
     chmod +x /opt/xos/tools/xos-manage && \
     /opt/xos/tools/xos-manage genkeys
 
-# install Tosca engine
-RUN chmod +x /opt/xos/tosca/run.py
-RUN bash /opt/xos/tosca/install_tosca.sh
-
 EXPOSE 8000
 
-# Set environment variables.
+# Set environment variables
 ENV HOME /root
 
-# Define working directory.
+# Define working directory
 WORKDIR /opt/xos
 
-# Define default command.
+# Define default command
 CMD python /opt/xos/manage.py runserver 0.0.0.0:8000 --insecure --makemigrations
+
diff --git a/containers/xos/Dockerfile.base b/containers/xos/Dockerfile.base
index 8443b6e..e430dc8 100644
--- a/containers/xos/Dockerfile.base
+++ b/containers/xos/Dockerfile.base
@@ -12,6 +12,7 @@
 
 # Install apt packages
 RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y \
+    apt-transport-https \
     curl \
     gcc \
     geoip-database \
diff --git a/containers/xos/Dockerfile.devel b/containers/xos/Dockerfile.devel
index 2b796e4..6d1c510 100644
--- a/containers/xos/Dockerfile.devel
+++ b/containers/xos/Dockerfile.devel
@@ -1,78 +1,4 @@
-FROM       ubuntu:14.04.3
-
-# XXX Workaround for docker bug:
-# https://github.com/docker/docker/issues/6345
-# Kernel 3.15 breaks docker, uss the line below as a workaround
-# until there is a fix
-RUN ln -s -f /bin/true /usr/bin/chfn
-# XXX End workaround
-
-# Install.
-RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y \
-    curl \
-    gcc \
-    geoip-database \
-    git \
-    graphviz \
-    graphviz-dev \
-    libgeoip1 \
-    libxslt1.1 \
-    libxslt1-dev \
-    libyaml-dev \
-    m4 \
-    pkg-config \
-    python-dev \
-    python-httplib2 \
-    python-pip \
-    python-psycopg2 \
-    python-pycurl \
-    python-setuptools \
-    tar \
-    wget \
-##### observer dependencies
-    python-keystoneclient \
-    python-novaclient \
-    python-neutronclient \
-    python-glanceclient \
-    python-ceilometerclient
-
-RUN pip install \
-    django==1.7 \
-    django-bitfield \
-    django-crispy-forms \
-    django-encrypted-fields \
-    django-extensions \
-    django-filter==0.11.0 \
-    django-geoposition \
-    django-ipware \
-    django_rest_swagger \
-    django-suit==0.3a1 \
-    django-timezones \
-    djangorestframework==3.3.3 \
-    dnslib \
-    jinja2 \
-    lxml \
-    markdown \
-    netaddr \
-    pyOpenSSL \
-    psycopg2 \
-    python-ceilometerclient \
-    python-dateutil \
-    python-keyczar \
-    python-logstash \
-    pygraphviz \
-    pytz \
-    pyyaml \
-    requests
-
-RUN easy_install --upgrade httplib2
-
-RUN easy_install \
-    python_gflags \
-    google_api_python_client \
-    httplib2.ca_certs_locater
-
-ADD http://code.jquery.com/jquery-1.9.1.min.js /usr/local/lib/python2.7/dist-packages/suit/static/suit/js/
+FROM xosproject/xos-base
 
 # Include certificates from Openstack
 ADD containers/xos/local_certs.crt /usr/local/share/ca-certificates/local_certs.crt
@@ -80,20 +6,18 @@
 
 # Install XOS
 ADD xos /opt/xos
-RUN chmod +x /opt/xos/tools/xos-manage
-RUN /opt/xos/tools/xos-manage genkeys
 
-# install Tosca engine
-RUN chmod +x /opt/xos/tosca/run.py
-RUN bash /opt/xos/tosca/install_tosca.sh
+RUN chmod +x /opt/xos/tools/xos-manage && sync && \
+    /opt/xos/tools/xos-manage genkeys
 
 EXPOSE 8000
 
-# Set environment variables.
+# Set environment variables
 ENV HOME /root
 
-# Define working directory.
+# Define working directory
 WORKDIR /opt/xos
 
-# Define default command.
+# Define default command
 CMD python /opt/xos/manage.py runserver 0.0.0.0:8000 --insecure --makemigrations
+
diff --git a/containers/xos/Dockerfile.templ b/containers/xos/Dockerfile.templ
deleted file mode 100644
index 95592c6..0000000
--- a/containers/xos/Dockerfile.templ
+++ /dev/null
@@ -1,93 +0,0 @@
-FROM       ubuntu:14.04.3
-
-# XXX Workaround for docker bug:
-# https://github.com/docker/docker/issues/6345
-# Kernel 3.15 breaks docker, uss the line below as a workaround
-# until there is a fix
-RUN ln -s -f /bin/true /usr/bin/chfn
-# XXX End workaround
-
-# Install.
-RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y \
-    curl \
-    gcc \
-    geoip-database \
-    git \
-    graphviz \
-    graphviz-dev \
-    libgeoip1 \
-    libxslt1.1 \
-    libxslt1-dev \
-    libyaml-dev \
-    m4 \
-    pkg-config \
-    python-dev \
-    python-httplib2 \
-    python-pip \
-    python-psycopg2 \
-    python-pycurl \
-    python-setuptools \
-    tar \
-    wget \
-##### observer dependencies
-    python-keystoneclient \
-    python-novaclient \
-    python-neutronclient \
-    python-glanceclient \
-    python-ceilometerclient
-
-RUN pip install -U \
-    django==1.7 \
-    django-bitfield \
-    django-crispy-forms \
-    django-encrypted-fields \
-    django_evolution \
-    django-extensions \
-    django-filter==0.11.0 \
-    django-geoposition \
-    django-ipware \
-    django_rest_swagger \
-    django-suit==0.3a1 \
-    django-timezones \
-    djangorestframework==3.3.3 \
-    dnslib \
-    google_api_python_client \
-    httplib2 \
-    httplib2.ca_certs_locater \
-    lxml \
-    markdown \
-    netaddr \
-    python-dateutil \
-    python_gflags \
-    python-keyczar \
-    python-logstash \
-    pygraphviz \
-    pytz \
-    pyyaml \
-    requests
-
-ADD http://code.jquery.com/jquery-1.9.1.min.js /usr/local/lib/python2.7/dist-packages/suit/static/suit/js/
-
-# Include certificates from Openstack
-ADD containers/xos/local_certs.crt /usr/local/share/ca-certificates/local_certs.crt
-RUN update-ca-certificates
-
-# Install XOS
-RUN git clone XOS_GIT_REPO -b XOS_GIT_BRANCH /tmp/xos && \
-    mv /tmp/xos/xos /opt/ && \
-    chmod +x /opt/xos/tools/xos-manage && \
-    /opt/xos/tools/xos-manage genkeys
-
-# install Tosca engine
-RUN bash /opt/xos/tosca/install_tosca.sh
-
-EXPOSE 8000
-
-# Set environment variables.
-ENV HOME /root
-
-# Define working directory.
-WORKDIR /root
-
-# Define default command.
-CMD python /opt/xos/manage.py runserver 0.0.0.0:8000 --insecure --makemigrations
diff --git a/containers/xos/Dockerfile.test b/containers/xos/Dockerfile.test
index 8b01b98..ac3c14c 100644
--- a/containers/xos/Dockerfile.test
+++ b/containers/xos/Dockerfile.test
@@ -1,9 +1,17 @@
 FROM       xosproject/xos
 
 # install nodejs
-RUN curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
-RUN sudo apt-get install -y nodejs
+COPY containers/xos/nodesource.gpg.key /tmp/nodesource.gpg.key
+
+RUN apt-key add /tmp/nodesource.gpg.key && \
+    echo "deb https://deb.nodesource.com/node_4.x trusty main" \
+    > /etc/apt/sources.list.d/nodesource.list
+
+RUN apt-get update && apt-get install -y --force-yes nodejs && \
+    rm -rf /var/lib/apt/lists/*
+
 RUN node -v
 
 # install node modules
-# RUN cd /opt/xos/tests/api; npm install
\ No newline at end of file
+# RUN cd /opt/xos/tests/api; npm install
+
diff --git a/containers/xos/Makefile b/containers/xos/Makefile
index cf91988..1f856b7 100644
--- a/containers/xos/Makefile
+++ b/containers/xos/Makefile
@@ -1,30 +1,63 @@
-CONTAINER_NAME:=xos-server
-IMAGE_NAME:=xosproject/xos
-TOSCA_CONFIG_PATH:=/opt/xos/configurations/opencloud/opencloud.yaml
-XOS_GIT_REPO?=git://github.com/open-cloud/xos.git
-XOS_GIT_BRANCH?=master
-NO_DOCKER_CACHE?=false
+# Docker container Makefile for XOS
+#
+# Targets:
+#
+#  `base`   - XOS prerequistie files, no XOS code, builds xosproject/xos-base
+#  `build`  - base + XOS code, git pulled in Dockerfile from main repo,
+#             builds xosproject/xos
+#  `custom` - base + XOS code, git pulled in Dockerfile from selectable repo,
+#             builds xosproject/xos
+#  `devel`  - base + XOS code from local directory, builds xosproject/xos
+#  `test`   - xosproject/xos + nodejs testing frameworks, builds
+#             xosproject/xos-test
+#
 
-.PHONY: build
-build: ; sudo docker build --no-cache=${NO_DOCKER_CACHE} --rm -t ${IMAGE_NAME} .
+NO_DOCKER_CACHE    ?= false
 
-.PHONY: custom
-custom: ; cat Dockerfile.templ | sed -e "s|XOS_GIT_REPO|${XOS_GIT_REPO}|g" -e "s|XOS_GIT_BRANCH|${XOS_GIT_BRANCH}|g" | docker build --no-cache=${NO_DOCKER_CACHE} --rm -t ${IMAGE_NAME} -
+CONTAINER_NAME     ?= xos-server
+IMAGE_NAME         ?= xosproject/xos
 
-.PHONY: devel
-devel: ; cd ../..; ls; sudo docker build -f containers/xos/Dockerfile.devel --no-cache=${NO_DOCKER_CACHE} --rm -t ${IMAGE_NAME} .
+XOS_GIT_REPO       ?= git://github.com/open-cloud/xos.git
+XOS_GIT_BRANCH     ?= master
 
-.PHONY: test
-test: ; cd ../..; ls; sudo docker build -f containers/xos/Dockerfile.test --no-cache=${NO_DOCKER_CACHE} --rm -t ${IMAGE_NAME} .
+TOSCA_CONFIG_PATH  ?= /opt/xos/configurations/opencloud/opencloud.yaml
 
-.PHONY: run
-run: ; sudo docker run -d --name ${CONTAINER_NAME} -p 80:8000 -v /usr/local/share/ca-certificates:/usr/local/share/ca-certificates:ro ${IMAGE_NAME}
+base:
+	sudo docker build --no-cache=${NO_DOCKER_CACHE} --rm \
+	-f Dockerfile.base -t xosproject/xos-base .
 
-.PHONY: runtosca
-runtosca: ; sudo docker exec -it ${CONTAINER_NAME} /usr/bin/python /opt/xos/tosca/run.py padmin@vicci.org ${TOSCA_CONFIG_PATH}
+build:
+	sudo docker build --no-cache=${NO_DOCKER_CACHE} --rm \
+	-f Dockerfile -t ${IMAGE_NAME} .
 
-.PHONY: stop
-stop: ; sudo docker stop ${CONTAINER_NAME}
+custom:
+	docker build --no-cache=${NO_DOCKER_CACHE} --rm \
+	--build-arg XOS_GIT_REPO=${XOS_GIT_REPO} \
+	--build-arg XOS_GIT_BRANCH=${XOS_GIT_BRANCH} \
+	-f Dockerfile -t ${IMAGE_NAME} .
 
-.PHONY: rm
-rm: ; sudo docker rm ${CONTAINER_NAME}
+devel:
+	sudo docker build --no-cache=${NO_DOCKER_CACHE} --rm \
+	-f Dockerfile.devel -t ${IMAGE_NAME} ../..
+
+test:
+	sudo docker build --no-cache=${NO_DOCKER_CACHE} --rm \
+	-f Dockerfile.test -t xosproject/xos-test ../..
+
+run:
+	sudo docker run -d --name ${CONTAINER_NAME} -p 80:8000 \
+	${IMAGE_NAME}
+
+runtosca:
+	sudo docker exec -it ${CONTAINER_NAME} \
+  /usr/bin/python /opt/xos/tosca/run.py padmin@vicci.org ${TOSCA_CONFIG_PATH}
+
+stop:
+	sudo docker stop ${CONTAINER_NAME}
+
+rm:
+	sudo docker rm ${CONTAINER_NAME}
+
+rmi:
+	sudo docker rmi `docker images | grep "^<none>" | awk '{print $$3}'`
+
diff --git a/containers/xos/nodesource.gpg.key b/containers/xos/nodesource.gpg.key
new file mode 100644
index 0000000..1dc1d10
--- /dev/null
+++ b/containers/xos/nodesource.gpg.key
@@ -0,0 +1,52 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1
+Comment: GPGTools - https://gpgtools.org
+
+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
+=CLGF
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/xos/configurations/devel/Makefile b/xos/configurations/devel/Makefile
index e55f38b..cc29f53 100644
--- a/xos/configurations/devel/Makefile
+++ b/xos/configurations/devel/Makefile
@@ -1,8 +1,8 @@
 MYIP:=$(shell hostname -i)
 
-cloudlab: common_cloudlab xos
+cloudlab: common_cloudlab containers xos
 
-devstack: upgrade_pkgs common_devstack xos
+devstack: upgrade_pkgs common_devstack containers xos
 
 xos:
 	sudo MYIP=$(MYIP) docker-compose up -d