Started E2E UI Tests with selenium
diff --git a/containers/xos/Dockerfile.test b/containers/xos/Dockerfile.test
index ac3c14c..521007a 100644
--- a/containers/xos/Dockerfile.test
+++ b/containers/xos/Dockerfile.test
@@ -12,6 +12,7 @@
 
 RUN node -v
 
-# install node modules
-# RUN cd /opt/xos/tests/api; npm install
+RUN pip install selenium
+
+RUN npm install -g phantomjs
 
diff --git a/xos/configurations/test-standalone/Makefile b/xos/configurations/test-standalone/Makefile
index 9eafa61..171fa82 100644
--- a/xos/configurations/test-standalone/Makefile
+++ b/xos/configurations/test-standalone/Makefile
@@ -36,6 +36,13 @@
 	sudo docker-compose run xos python /opt/xos/tosca/run.py none /opt/xos/configurations/common/mydeployment.yaml
 	sudo docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /opt/xos/configurations/frontend/sample.yaml
 
+	# sudo docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /opt/xos/configurations/cord-pod/setup.yaml
+	# sudo docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /opt/xos/configurations/cord-pod/nodes.yaml
+	# sudo docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /opt/xos/configurations/cord-pod/images.yaml
+	sudo docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /opt/xos/configurations/cord-pod/mgmt-net.yaml
+	sudo docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /opt/xos/configurations/test-standalone/services.yaml
+	sudo docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /opt/xos/configurations/cord-pod/cord-volt-devices.yaml
+
 
 test: restore-initial-db-status
 	# RUN TESTS
@@ -45,6 +52,9 @@
 test-tosca: restore-initial-db-status
 	sudo docker-compose run xos bash -c "cd /opt/xos/tosca/tests; python ./alltests.py"
 
+test-ui: restore-initial-db-status
+	sudo docker exec -u root -i teststandalone_xos_1 bash -c "cd /opt/xos/tests/ui-e2e; python xos-e2e-test.py"
+
 base-container: 
 	cd ../../../containers/xos; make base
 
diff --git a/xos/configurations/test-standalone/services.yaml b/xos/configurations/test-standalone/services.yaml
new file mode 100644
index 0000000..40e0127
--- /dev/null
+++ b/xos/configurations/test-standalone/services.yaml
@@ -0,0 +1,258 @@
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+description: Just enough Tosca to get the vSG slice running on the CORD POD
+
+imports:
+   - custom_types/xos.yaml
+
+topology_template:
+  node_templates:
+    # CORD Services
+    service#vtr:
+      type: tosca.nodes.Service
+      properties:
+          view_url: /admin/vtr/vtrservice/$id$/
+          kind: vTR
+          replaces: service_vtr
+
+    service#volt:
+      type: tosca.nodes.VOLTService
+      requirements:
+          - vsg_tenant:
+              node: service#vsg
+              relationship: tosca.relationships.TenantOfService
+      properties:
+          view_url: /admin/cord/voltservice/$id$/
+          kind: vOLT
+          replaces: service_volt
+
+    addresses_vsg:
+      type: tosca.nodes.AddressPool
+      properties:
+          addresses: 10.168.0.0/24
+          gateway_ip: 10.168.0.1
+          gateway_mac: 02:42:0a:a8:00:01
+
+    addresses_exampleservice-public:
+      type: tosca.nodes.AddressPool
+      properties:
+          addresses: 10.168.1.0/24
+          gateway_ip: 10.168.1.1
+          gateway_mac: 02:42:0a:a8:00:01
+
+    service#vsg:
+      type: tosca.nodes.VSGService
+      requirements:
+          - vrouter_tenant:
+              node: service#vrouter
+              relationship: tosca.relationships.TenantOfService
+      properties:
+          view_url: /admin/cord/vsgservice/$id$/
+          # backend_network_label: hpc_client
+          private_key_fn: /opt/xos/synchronizers/vcpe/vcpe_private_key
+#          node_label: label_vsg
+          replaces: service_vsg
+
+    service#vrouter:
+      type: tosca.nodes.VRouterService
+      properties:
+          view_url: /admin/vrouter/vrouterservice/$id$/
+          replaces: service_vrouter
+      requirements:
+          - addresses_vsg:
+              node: addresses_vsg
+              relationship: tosca.relationships.ProvidesAddresses
+          - addresses_service1:
+              node: addresses_exampleservice-public
+              relationship: tosca.relationships.ProvidesAddresses
+
+#     service#fabric:
+#       type: tosca.nodes.FabricService
+#       properties:
+#           view_url: /admin/fabric/fabricservice/$id$/
+#           replaces: service_fabric
+
+#     service#ONOS_Fabric:
+#       type: tosca.nodes.ONOSService
+#       requirements:
+#       properties:
+#           kind: onos
+#           view_url: /admin/onos/onosservice/$id$/
+#           no_container: true
+#           rest_hostname: onos-fabric
+#           replaces: service_ONOS_Fabric
+
+#     service#ONOS_CORD:
+#       type: tosca.nodes.ONOSService
+#       properties:
+#           no-delete: true
+#           no-create: false
+#           no-update: true
+
+#     # vOLT_ONOS_app:
+#     #   type: tosca.nodes.ONOSvOLTApp
+#     #   requirements:
+#     #       - onos_tenant:
+#     #           node: service#ONOS_CORD
+#     #           relationship: tosca.relationships.TenantOfService
+#     #       - volt_service:
+#     #           node: service#volt
+#     #           relationship: tosca.relationships.UsedByService
+#     #   properties:
+#     #       install_dependencies: onos-ext-notifier-1.0-SNAPSHOT.oar, onos-ext-volt-event-publisher-1.0-SNAPSHOT.oar
+#     #       dependencies: org.onosproject.openflow-base, org.onosproject.olt, org.ciena.onos.ext_notifier, org.ciena.onos.volt_event_publisher
+#     #       autogenerate: volt-network-cfg
+
+#     # vRouter_ONOS_app:
+#     #   type: tosca.nodes.ONOSvRouterApp
+#     #   requirements:
+#     #       - onos_tenant:
+#     #           node: service#ONOS_Fabric
+#     #           relationship: tosca.relationships.TenantOfService
+#     #       - vrouter_service:
+#     #           node: service#vrouter
+#     #           relationship: tosca.relationships.UsedByService
+#     #   properties:
+#     #       dependencies: org.onosproject.vrouter
+#     #       autogenerate: vrouter-network-cfg
+
+#     Private:
+#       type: tosca.nodes.NetworkTemplate
+
+#     management:
+#       type: tosca.nodes.network.Network.XOS
+#       properties:
+#           no-create: true
+#           no-delete: true
+#           no-update: true
+
+#     image#vsg-1.0:
+#       type: tosca.nodes.Image
+
+#     mysite:
+#       type: tosca.nodes.Site
+
+#     label_vsg:
+#       type: tosca.nodes.NodeLabel
+
+#     # Networks required by the CORD setup
+#     mysite_vsg-access:
+#       type: tosca.nodes.network.Network
+#       properties:
+#           ip_version: 4
+#       requirements:
+#           - network_template:
+#               node: Private
+#               relationship: tosca.relationships.UsesNetworkTemplate
+#           - owner:
+#               node: mysite_vsg
+#               relationship: tosca.relationships.MemberOfSlice
+#           - connection:
+#               node: mysite_vsg
+#               relationship: tosca.relationships.ConnectsToSlice
+
+#     # CORD Slices
+#     mysite_vsg:
+#       description: vSG Controller Slice
+#       type: tosca.nodes.Slice
+#       properties:
+#           network: noauto
+#       requirements:
+#           - vsg_service:
+#               node: service#vsg
+#               relationship: tosca.relationships.MemberOfService
+#           - site:
+#               node: mysite
+#               relationship: tosca.relationships.MemberOfSite
+#           - management:
+#               node: management
+#               relationship: tosca.relationships.ConnectsToNetwork
+#           - image:
+#               node: image#vsg-1.0
+#               relationship: tosca.relationships.DefaultImage
+
+#     # Let's add a user who can be administrator of the household
+#     johndoe@myhouse.com:
+#       type: tosca.nodes.User
+#       properties:
+#           password: letmein
+#           firstname: john
+#           lastname: doe
+#       requirements:
+#           - site:
+#               node: mysite
+#               relationship: tosca.relationships.MemberOfSite
+#           - dependency:
+#                 node: mysite_vsg
+#                 relationship: tosca.relationships.DependsOn
+
+#     # A subscriber
+#     My House:
+#        type: tosca.nodes.CORDSubscriber
+#        properties:
+#            service_specific_id: 123
+#            firewall_enable: false
+#            cdn_enable: false
+#            url_filter_enable: false
+#            url_filter_level: R
+#        requirements:
+#           - house_admin:
+#               node: johndoe@myhouse.com
+#               relationship: tosca.relationships.AdminPrivilege
+
+#     Mom's PC:
+#        type: tosca.nodes.CORDUser
+#        properties:
+#            mac: 01:02:03:04:05:06
+#            level: PG_13
+#        requirements:
+#            - household:
+#                node: My House
+#                relationship: tosca.relationships.SubscriberDevice
+
+#     Dad's PC:
+#        type: tosca.nodes.CORDUser
+#        properties:
+#            mac: 90:E2:BA:82:F9:75
+#            level: PG_13
+#        requirements:
+#            - household:
+#                node: My House
+#                relationship: tosca.relationships.SubscriberDevice
+
+#     Jack's Laptop:
+#        type: tosca.nodes.CORDUser
+#        properties:
+#            mac: 68:5B:35:9D:91:D5
+#            level: PG_13
+#        requirements:
+#            - household:
+#                node: My House
+#                relationship: tosca.relationships.SubscriberDevice
+
+#     Jill's Laptop:
+#        type: tosca.nodes.CORDUser
+#        properties:
+#            mac: 34:36:3B:C9:B6:A6
+#            level: PG_13
+#        requirements:
+#            - household:
+#                node: My House
+#                relationship: tosca.relationships.SubscriberDevice
+
+#     My Volt:
+#         type: tosca.nodes.VOLTTenant
+#         properties:
+#             service_specific_id: 123
+#             s_tag: 222
+#             c_tag: 111
+#         requirements:
+#             - provider_service:
+#                 node: service#volt
+#                 relationship: tosca.relationships.MemberOfService
+#             - subscriber:
+#                 node: My House
+#                 relationship: tosca.relationships.BelongsToSubscriber
+#             - dependency:
+#                 node: mysite_vsg
+#                 relationship: tosca.relationships.DependsOn
diff --git a/xos/tests/ui-e2e/.gitignore b/xos/tests/ui-e2e/.gitignore
new file mode 100644
index 0000000..f00183e
--- /dev/null
+++ b/xos/tests/ui-e2e/.gitignore
@@ -0,0 +1,2 @@
+ghostdriver.log
+xos/*
diff --git a/xos/tests/ui-e2e/REAME.md b/xos/tests/ui-e2e/REAME.md
new file mode 100644
index 0000000..c8634fa
--- /dev/null
+++ b/xos/tests/ui-e2e/REAME.md
@@ -0,0 +1,10 @@
+# XOS UI End to End Test
+
+This tests are implemented using `selenium`.
+
+To execute them, you should install it with `pip install selenium` and you should have `phantomjs` available as a command. You can install it with `npm install phantomjs -g`.
+
+# Execute the test
+If you want to execute the tests locally, simply navigate to this folder and execute: `python xos-e2e-test.py`
+
+You can optionally use Firefox as target browser with `python xos-e2e-test.py firefox`
\ No newline at end of file
diff --git a/xos/tests/ui-e2e/xos-e2e-test.py b/xos/tests/ui-e2e/xos-e2e-test.py
new file mode 100644
index 0000000..37804b8
--- /dev/null
+++ b/xos/tests/ui-e2e/xos-e2e-test.py
@@ -0,0 +1,68 @@
+import unittest
+from selenium import webdriver
+from selenium.webdriver.common.keys import Keys
+import sys
+
+
+class XosUI(unittest.TestCase):
+    """Test cases for XOS"""
+
+    url = 'http://127.0.0.1:8000/'
+
+    def setUp(self):
+        if(hasattr(self, 'browser') and self.browser == 'firefox'):
+            self.driver = webdriver.Firefox()
+        elif(hasattr(self, 'browser') and self.browser == 'chrome'):
+            self.driver = webdriver.Chrome()
+        else:
+            self.driver = webdriver.PhantomJS()
+
+        self.driver.set_window_size(1120, 550)
+        self.driver.get(self.url)
+
+    def tearDown(self):
+        self.driver.close()
+        self.driver.quit()
+
+    def doLogin(self):
+        username = self.driver.find_element_by_css_selector('#id_username')
+        password = self.driver.find_element_by_css_selector('#id_password')
+        sign_in = self.driver.find_element_by_css_selector('.btn.btn-primary')
+
+        username.send_keys('padmin@vicci.org')
+        password.send_keys('letmein')
+        sign_in.click()
+
+    def test_login_page(self):
+        """
+        Test that the login page has the login form
+        """
+
+        login_container = self.driver.find_element_by_css_selector('body.login #content-main')
+        assert login_container
+        username = login_container.find_element_by_css_selector('#id_username')
+        password = login_container.find_element_by_css_selector('#id_password')
+        sign_in = login_container.find_element_by_css_selector('.btn.btn-primary')
+        assert username
+        assert password
+        assert sign_in
+
+    def test_login_function(self):
+        """
+        Test that login is working
+        """
+        self.doLogin()
+
+        # if we have a sidebar the login has worked
+        sidebar = self.driver.find_element_by_css_selector('#sidebar-wrapper')
+        assert sidebar
+
+
+if __name__ == "__main__":
+    if len(sys.argv) > 1:
+        XosUI.browser = sys.argv[1]
+        if(sys.argv[2]):
+            XosUI.url = sys.argv[2]
+            del sys.argv[2]
+        del sys.argv[1]
+    unittest.main()