CORD-2131 Create M-CORD profile with Spirent RAN+MME

Change-Id: I2cccaeecfb0ef8ee6b8465b7be7af2e532ff1fb6
diff --git a/roles/cord-profile/templates/mcord-spirent-services.yml.j2 b/roles/cord-profile/templates/mcord-spirent-services.yml.j2
new file mode 100644
index 0000000..0b257b1
--- /dev/null
+++ b/roles/cord-profile/templates/mcord-spirent-services.yml.j2
@@ -0,0 +1,211 @@
+
+{#
+Copyright 2017-present Open Networking Foundation
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+#}
+
+
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+description: created by platform-install, need to add M-CORD services later
+
+imports:
+   - custom_types/xos.yaml
+   - custom_types/slice.yaml
+   - custom_types/site.yaml
+   - custom_types/image.yaml
+   - custom_types/flavor.yaml
+   - custom_types/network.yaml
+   - custom_types/onosservice.yaml
+   - custom_types/networkslice.yaml
+   - custom_types/venbservice.yaml
+   - custom_types/venbserviceinstance.yaml
+
+topology_template:
+  node_templates:
+
+# site, image, fully created in deployment.yaml
+    {{ site_name }}:
+      type: tosca.nodes.Site
+      properties:
+        must-exist: true
+        name: {{ site_name }}
+
+    m1.small:
+      type: tosca.nodes.Flavor
+      properties:
+        name: m1.small
+        must-exist: true
+    m1.large:
+      type: tosca.nodes.Flavor
+      properties:
+        name: m1.large
+        must-exist: true
+    m1.medium:
+      type: tosca.nodes.Flavor
+      properties:
+        name: m1.medium
+        must-exist: true
+    m1.xlarge:
+      type: tosca.nodes.Flavor
+      properties:
+        name: m1.xlarge
+        must-exist: true
+
+    trusty-server-multi-nic:
+      type: tosca.nodes.Image
+      properties:
+        name: trusty-server-multi-nic
+
+# management networks, fully created in management-net.yaml
+    management:
+      type: tosca.nodes.Network
+      properties:
+        must-exist: true
+        name: management
+
+{% if use_management_hosts %}
+    management_hosts:
+      type: tosca.nodes.Network
+      properties:
+        must-exist: true
+        name: management_hosts
+{% endif %}
+
+# s1u_network is for connectivity between VMs, fully created in s1u-net.yaml
+    s1u_network:
+      type: tosca.nodes.Network
+      properties:
+        must-exist: true
+        name: s1u_network
+# s11_network is for connectivity between VMs, fully created in s11-net.yaml
+    s11_network:
+      type: tosca.nodes.Network
+      properties:
+        must-exist: true
+        name: s11_network
+# nbi_network is for connectivity between VMs, fully created in nbi-net.yaml
+    nbi_network:
+      type: tosca.nodes.Network
+      properties:
+        must-exist: true
+        name: nbi_network
+# sbi_network is for connectivity between VMs, fully created in sbi-net.yaml
+    sbi_network:
+      type: tosca.nodes.Network
+      properties:
+        must-exist: true
+        name: sbi_network
+# sgi_network is for connectivity between VMs, fully created in sgi-net.yaml
+    sgi_network:
+      type: tosca.nodes.Network
+      properties:
+        must-exist: true
+        name: sgi_network
+
+# ONOS_CORD, fully created in vtn.yaml
+    service#ONOS_CORD:
+      type: tosca.nodes.ONOSService
+      properties:
+        must-exist: true
+        name: ONOS_CORD
+
+# ONOS_Fabric, fully created in fabric.yaml
+    service#ONOS_Fabric:
+      type: tosca.nodes.ONOSService
+      properties:
+        must-exist: true
+        name: ONOS_Fabric
+
+# CORD Services
+    service#venb:
+      type: tosca.nodes.VENBService
+      properties:
+          name: venb
+          kind: vEPC
+          public_key: {{ lookup('file', config_cord_profile_dir + '/key_import/mcord_rsa.pub') }}
+          private_key_fn: /opt/xos/services/venb/keys/mcord_rsa
+      artifacts:
+          pubkey: /opt/cord_profile/key_import/mcord_rsa.pub
+
+# CORD Slices
+    {{ site_name }}_venb:
+      description: vENB Service Slice
+      type: tosca.nodes.Slice
+      properties:
+          name: {{ site_name }}_venb
+          default_isolation: vm
+          network: noauto
+      requirements:
+          - site:
+              node: mysite
+              relationship: tosca.relationships.BelongsToOne
+          - service:
+              node: service#venb
+              relationship: tosca.relationships.BelongsToOne
+          - default_image:
+              node: trusty-server-multi-nic
+              relationship: tosca.relationships.BelongsToOne
+          - default_flavor:
+              node: m1.small
+              relationship: tosca.relationships.BelongsToOne
+
+    venb_instance1:
+      type: tosca.nodes.VENBServiceInstance
+      properties:
+        name: venb_instance1
+      requirements:
+        - owner:
+            node: service#venb
+            relationship: tosca.relationships.BelongsToOne
+
+    venb_slice_management_network:
+      type: tosca.nodes.NetworkSlice
+      requirements:
+        - network:
+            node: management
+            relationship: tosca.relationships.BelongsToOne
+        - slice:
+            node: {{ site_name }}_venb
+            relationship: tosca.relationships.BelongsToOne
+
+    venb_slice_s11_network:
+      type: tosca.nodes.NetworkSlice
+      requirements:
+        - network:
+            node: s11_network
+            relationship: tosca.relationships.BelongsToOne
+        - slice:
+            node: {{ site_name }}_venb
+            relationship: tosca.relationships.BelongsToOne
+
+    venb_slice_s1u_network:
+      type: tosca.nodes.NetworkSlice
+      requirements:
+        - network:
+            node: s1u_network
+            relationship: tosca.relationships.BelongsToOne
+        - slice:
+            node: {{ site_name }}_venb
+            relationship: tosca.relationships.BelongsToOne
+
+    venb_slice_sgi_network:
+      type: tosca.nodes.NetworkSlice
+      requirements:
+        - network:
+            node: sgi_network
+            relationship: tosca.relationships.BelongsToOne
+        - slice:
+            node: {{ site_name }}_venb
+            relationship: tosca.relationships.BelongsToOne
diff --git a/roles/test-mcord-base-spirent/defaults/main.yml b/roles/test-mcord-base-spirent/defaults/main.yml
new file mode 100644
index 0000000..2e0ccc9
--- /dev/null
+++ b/roles/test-mcord-base-spirent/defaults/main.yml
@@ -0,0 +1,52 @@
+---
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# test-mcord-base/defaults/main.yml
+
+head_cord_profile_dir: "/opt/cord_profile"
+
+xos_ui_port: 9000
+
+xos_admin_user: "xosadmin@opencord.org"
+maas_xos_admin_pass: "{{ lookup('file', '/opt/credentials/xosadmin@opencord.org') }}"
+
+test_networks:
+  - management
+  - sgi_network
+  - s11_network
+  - sbi_network
+  - nbi_network
+
+test_services:
+  - venb
+  - vspgwc
+  - sdncontroller
+  - vspgwu
+
+test_ports:
+  - { vm: venb, network: management }
+  - { vm: venb, network: s11_network }
+  - { vm: venb, network: sgi_network }
+  - { vm: venb, network: s1u_network }
+  - { vm: vspgwc, network: management }
+  - { vm: vspgwc, network: s11_network }
+  - { vm: vspgwc, network: nbi_network }
+  - { vm: sdncontroller, network: management }
+  - { vm: sdncontroller, network: nbi_network }
+  - { vm: sdncontroller, network: sbi_network }
+  - { vm: vspgwu, network: management }
+  - { vm: vspgwu, network: s1u_network }
+  - { vm: vspgwu, network: sgi_network }
+  - { vm: vspgwu, network: sbi_network }
diff --git a/roles/test-mcord-base-spirent/tasks/main.yml b/roles/test-mcord-base-spirent/tasks/main.yml
new file mode 100644
index 0000000..2cfd0e3
--- /dev/null
+++ b/roles/test-mcord-base-spirent/tasks/main.yml
@@ -0,0 +1,45 @@
+
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+---
+# test-mcord-base/tasks/main.yml
+# Run tests to check that the base elements of M-CORD are present
+
+- name: Wait for networks to be synchronized
+  shell: bash -c "source /opt/cord_profile/admin-openrc.sh; neutron net-list|grep '{{ item }}' > /dev/null"
+  register: result
+  until: result | success
+  retries: 10
+  delay: 60
+  with_items: "{{ test_networks }}"
+  tags:
+    - skip_ansible_lint # running a sub job
+
+- name: Wait for VMs to come up
+  shell: bash -c "source /opt/cord_profile/admin-openrc.sh; nova list --all-tenants|grep '{{ item }}.*ACTIVE' > /dev/null"
+  register: result
+  until: result | success
+  retries: 10
+  delay: 60
+  with_items: "{{ test_services }}"
+  tags:
+    - skip_ansible_lint # running a sub job
+
+- name: Verify that VMs are properly networked
+  shell: bash -c "source /opt/cord_profile/admin-openrc.sh; nova list --all-tenants|grep '{{ item.vm }}.*ACTIVE.*{{ item.network }}' > /dev/null"
+  with_items: "{{ test_ports }}"
+  tags:
+    - skip_ansible_lint # running a sub job
\ No newline at end of file
diff --git a/roles/test-mcord-base/defaults/main.yml b/roles/test-mcord-base/defaults/main.yml
index 5f58813..1cf905f 100644
--- a/roles/test-mcord-base/defaults/main.yml
+++ b/roles/test-mcord-base/defaults/main.yml
@@ -22,3 +22,34 @@
 xos_admin_user: "xosadmin@opencord.org"
 maas_xos_admin_pass: "{{ lookup('file', '/opt/credentials/xosadmin@opencord.org') }}"
 
+test_networks:
+  - management
+  - sgi_network
+  - s11_network
+  - s1mme_network
+  - sbi_network
+  - nbi_network
+
+test_services:
+  - internetemulator
+  - vmme
+  - vspgwc
+  - sdncontroller
+  - vspgwu
+
+test_ports:
+  - { vm: vmme, network: management }
+  - { vm: vmme, network: s11_network }
+  - { vm: vmme, network: s1mme_network }
+  - { vm: vspgwc, network: management }
+  - { vm: vspgwc, network: s11_network }
+  - { vm: vspgwc, network: nbi_network }
+  - { vm: sdncontroller, network: management }
+  - { vm: sdncontroller, network: nbi_network }
+  - { vm: sdncontroller, network: sbi_network }
+  - { vm: vspgwu, network: management }
+  - { vm: vspgwu, network: s1u_network }
+  - { vm: vspgwu, network: sgi_network }
+  - { vm: vspgwu, network: sbi_network }
+  - { vm: internetemulator, network: management }
+  - { vm: internetemulator, network: sgi_network }
diff --git a/roles/test-mcord-base/tasks/main.yml b/roles/test-mcord-base/tasks/main.yml
index 8bdeb89..193c4d7 100644
--- a/roles/test-mcord-base/tasks/main.yml
+++ b/roles/test-mcord-base/tasks/main.yml
@@ -24,11 +24,7 @@
   until: result | success
   retries: 10
   delay: 60
-  with_items:
-    - management
-    - sgi_network
-    - s11_network
-    - s1mme_network
+  with_items: "{{ test_networks }}"
   tags:
     - skip_ansible_lint # running a sub job
 
@@ -38,8 +34,12 @@
   until: result | success
   retries: 10
   delay: 60
-  with_items:
-    - internetemulator
-    - vmme
+  with_items: "{{ test_services }}"
+  tags:
+    - skip_ansible_lint # running a sub job
+
+- name: Verify that VMs are properly networked
+  shell: bash -c "source /opt/cord_profile/admin-openrc.sh; nova list --all-tenants|grep '{{ item.vm }}.*ACTIVE.*{{ item.network }}' > /dev/null"
+  with_items: "{{ test_ports }}"
   tags:
     - skip_ansible_lint # running a sub job