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()