Merge "[CORD-1650] Update TOSCA/variables to work with bridge/bond refactor"
diff --git a/docs/dev_guide.md b/docs/dev_guide.md
index d2e0361..ec2f8b3 100644
--- a/docs/dev_guide.md
+++ b/docs/dev_guide.md
@@ -37,12 +37,12 @@
 * *ecord-mock.yml* for local sites, instead of the default value (rcord-mock.yml)
 * *ecord-global-single.yml* to mock global nodes, instead of the default value (rcord-mock.yml)
 
-### CORD-in-a-Box (CiaB) development
+### Virtual Pod (CiaB) development
 
-To understand what CiaB is and what it can help you with, look
+To understand what a Virtual Pod is and what it can help you with, look
 [here](/xos/dev/workflow_pod.md).
 
-To build E-CORD CiaB, follow the steps [here](/install_virtual.md).
+To build E-CORD Virtual Pod, follow the steps [here](/install_virtual.md).
 
 When it’s time to specify the PODCONFIG file, use
 
@@ -68,16 +68,39 @@
 
 ## Run an E-CORD test subscriber
 
-When using local PODs, you can emulate E-CORD test subscribers, doing the
-following.
+When using local PODs, you can emulate E-CORD test subscribers by running:
 
-1. ssh into the the head node
+```shell
+$ make ecord-test-local-subscriber
 
-2. `cd /opt/cord/build/platform-install`
+PLAY [Create E-CORD local test subscriber config and run test] ************************
 
-3. Deploy a test subscriber:
+TASK [Gathering Facts] ****************************************************************
+ok: [head1]
 
-    ```
-    ansible-playbook -i inventory/head-localhost --extra-vars "@/opt/cord_profile/genconfig/config.yml" ecord-test-subscriber-playbook.yml
-    ```
+TASK [test-ecord-local-subscriber : Create test-ecord-local-subsc**********************
+ok: [head1]
+
+TASK [test-ecord-local-subscriber : Read test-ecord-local-subscri**********************
+ok: [head1]
+
+TASK [test-ecord-local-subscriber : Run TOSCA to add E-CORD test-**********************
+ok: [head1]
+
+TASK [test-ecord-local-subscriber : Wait for vEG VM to come up] ***********************
+FAILED - RETRYING: Wait for vEG VM to come up (10 retries left).
+changed: [head1]
+
+TASK [test-ecord-local-subscriber : Get ID of VM] *************************************
+changed: [head1]
+
+TASK [test-ecord-local-subscriber : Get Management IP of VM] **************************
+changed: [head1]
+
+PLAY RECAP ****************************************************************************
+head1                      : ok=7    changed=3    unreachable=0    failed=0
+```
+
+If this completes successfully (no make error) then you've successfully created
+a test subscriber vEG VM.
 
diff --git a/test/ecord-test-local-subscriber-playbook.yml b/test/ecord-test-local-subscriber-playbook.yml
new file mode 100644
index 0000000..cbdd135
--- /dev/null
+++ b/test/ecord-test-local-subscriber-playbook.yml
@@ -0,0 +1,23 @@
+---
+# 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.
+
+# ecord-test-local-subscriber-playbook.yml
+# Configures and enables an E-CORD local subscriber, then runs test
+
+- name: Create E-CORD local test subscriber config and run test
+  hosts: head
+  roles:
+    - test-ecord-local-subscriber
+
diff --git a/test/roles/test-ecord-local-subscriber/defaults/main.yml b/test/roles/test-ecord-local-subscriber/defaults/main.yml
new file mode 100644
index 0000000..4b05773
--- /dev/null
+++ b/test/roles/test-ecord-local-subscriber/defaults/main.yml
@@ -0,0 +1,28 @@
+---
+# 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-ecord-local-subscriber/defaults/main.yml
+
+xos_tosca_url: "http://xos-tosca/xos-tosca"
+
+config_credentials_dir: "{{ playbook_dir }}/../../../../build/platform-install/credentials"
+
+head_cord_profile_dir: "/opt/cord_profile"
+
+xos_admin_user: "xosadmin@opencord.org"
+xos_admin_pass: "{{ lookup('password', config_credentials_dir ~ '/xosadmin@opencord.org chars=ascii_letters,digits') }}"
+
+site_name: placeholder-sitename
+
diff --git a/test/roles/test-ecord-local-subscriber/tasks/main.yml b/test/roles/test-ecord-local-subscriber/tasks/main.yml
new file mode 100644
index 0000000..988d13c
--- /dev/null
+++ b/test/roles/test-ecord-local-subscriber/tasks/main.yml
@@ -0,0 +1,64 @@
+---
+# 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-ecord-local-subscriber/tasks/main.yml
+
+- name: Create test-ecord-local-subscriber.yaml TOSCA config
+  template:
+    src: test-ecord-local-subscriber.yaml.j2
+    dest: "{{ head_cord_profile_dir }}/test-ecord-local-subscriber.yaml"
+    owner: "{{ ansible_user_id }}"
+    mode: 0644
+
+- name: Read test-ecord-local-subscriber.yaml
+  slurp:
+    src: "{{ head_cord_profile_dir }}/test-ecord-local-subscriber.yaml"
+  register: test_ecord_local_subscriber_slurp
+
+- name: Run TOSCA to add E-CORD test-subscriber
+  uri:
+    url: "{{ xos_tosca_url }}/run"
+    method: POST
+    headers:
+      xos-username: "{{ xos_admin_user }}"
+      xos-password: "{{ xos_admin_pass }}"
+    body: "{{ test_ecord_local_subscriber_slurp['content'] | b64decode }}"
+    status_code: 200
+  register: result
+  until: result | success
+  retries: 50
+  delay: 5
+
+- name: Wait for vEG VM to come up
+  shell: bash -c "source /opt/cord_profile/admin-openrc.sh; nova list --all-tenants|grep 'veg.*ACTIVE' > /dev/null"
+  register: result
+  until: result | success
+  retries: 10
+  delay: 60
+  tags:
+    - skip_ansible_lint # running a sub job
+
+- name: Get ID of VM
+  shell: bash -c "source /opt/cord_profile/admin-openrc.sh; nova list --all-tenants|grep {{ site_name }}_veg|cut -d '|' -f 2"
+  register: nova_id
+  tags:
+    - skip_ansible_lint # running a sub job
+
+- name: Get Management IP of VM
+  shell: bash -c "source /opt/cord_profile/admin-openrc.sh; nova interface-list {{ nova_id.stdout }}|grep -o -m 1 '172\.27\.[[:digit:]]*\.[[:digit:]]*'"
+  register: mgmt_ip
+  tags:
+    - skip_ansible_lint # running a sub job
+
diff --git a/test/roles/test-ecord-local-subscriber/templates/test-ecord-local-subscriber.yaml.j2 b/test/roles/test-ecord-local-subscriber/templates/test-ecord-local-subscriber.yaml.j2
new file mode 100644
index 0000000..7ffc11d
--- /dev/null
+++ b/test/roles/test-ecord-local-subscriber/templates/test-ecord-local-subscriber.yaml.j2
@@ -0,0 +1,127 @@
+---
+{#
+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: Creates a CORD test subscriber, created by ecord profile
+
+imports:
+   - custom_types/site.yaml
+   - custom_types/slice.yaml
+   - custom_types/user.yaml
+   - custom_types/serviceinstance.yaml
+   - custom_types/serviceinstancelink.yaml
+   - custom_types/vegservice.yaml
+   - custom_types/vegtenant.yaml
+   - custom_types/veeservice.yaml
+   - custom_types/veeserviceinstance.yaml
+
+topology_template:
+  node_templates:
+
+# site, fully created in deployment.yaml
+    {{ site_name }}:
+      type: tosca.nodes.Site
+      properties:
+        name: {{ site_name }}
+        must-exist: true
+
+# veg slice, veg/vee services, fully created in ecord-services.yaml
+    {{ site_name }}_veg:
+      type: tosca.nodes.Slice
+      properties:
+        name: {{ site_name }}_veg
+        must-exist: true
+
+    service#vee:
+      type: tosca.nodes.VEEService
+      properties:
+        name: vee
+        must-exist: true
+
+    service#veg:
+      type: tosca.nodes.VEGService
+      requirements:
+      properties:
+        name: veg
+        must-exist: true
+
+# Test subscriber
+
+    # Let's add a user who can be administrator of the household
+    johndoe@myhouse.com:
+      type: tosca.nodes.User
+      properties:
+        username: johndoe@myhouse.com
+        email: johndoe@myhouse.com
+        password: letmein
+        firstname: john
+        lastname: doe
+      requirements:
+        - site:
+            node: {{ site_name }}
+            relationship: tosca.relationships.BelongsToOne
+
+    # A subscriber
+    my_enterprise:
+      type: tosca.nodes.ServiceInstance
+      properties:
+        name: my_enterprise
+        service_specific_id: "123"
+
+    my_vEG:
+      type: tosca.nodes.VEGTenant
+      properties:
+        name: my_vEG
+        service_specific_id: "123"
+      requirements:
+        - owner:
+            node: service#veg
+            relationship: tosca.relationships.BelongsToOne
+
+    my_vEE:
+      type: tosca.nodes.VEEServiceInstance
+      properties:
+        name: my_vEE
+        service_specific_id: "123"
+        s_tag: 123
+        c_tag: 123
+      requirements:
+        - owner:
+            node: service#vee
+            relationship: tosca.relationships.BelongsToOne
+
+    my_vEG_vEE_link:
+      type: tosca.nodes.ServiceInstanceLink
+      requirements:
+        - provider_service_instance:
+            node: my_vEG
+            relationship: tosca.relationships.BelongsToOne
+        - subscriber_service_instance:
+            node: my_vEE
+            relationship: tosca.relationships.BelongsToOne
+
+    my_vEE_enterprise_link:
+      type: tosca.nodes.ServiceInstanceLink
+      requirements:
+        - provider_service_instance:
+            node: my_vEE
+            relationship: tosca.relationships.BelongsToOne
+        - subscriber_service_instance:
+            node: my_enterprise
+            relationship: tosca.relationships.BelongsToOne
+