Merge branch 'master' into v7.0 25/8925/1
authorbeierlm <mark.beierl@canonical.com>
Sat, 16 May 2020 01:47:43 +0000 (21:47 -0400)
committerbeierlm <mark.beierl@canonical.com>
Sat, 16 May 2020 01:48:29 +0000 (21:48 -0400)
Change-Id: Iec1f1db2b2d4953e560c8e8b7be2f6ddca86edd1
Signed-off-by: beierlm <mark.beierl@canonical.com>
209 files changed:
.gitignore
docker/Keystone/Dockerfile
docker/Keystone/LDAP.md [new file with mode: 0644]
docker/Keystone/scripts/start.sh
docker/LCM/Dockerfile
docker/MON/Dockerfile
docker/RO/Dockerfile
installers/60-lxd-production.conf [new file with mode: 0644]
installers/charm/README.md [new file with mode: 0644]
installers/charm/build.sh [new file with mode: 0755]
installers/charm/bundles/osm-ha/bundle.yaml [new file with mode: 0644]
installers/charm/bundles/osm/bundle.yaml [new file with mode: 0644]
installers/charm/generate_bundle.py [new file with mode: 0644]
installers/charm/interfaces/osm-nbi/README.md [new file with mode: 0644]
installers/charm/interfaces/osm-nbi/copyright [new file with mode: 0644]
installers/charm/interfaces/osm-nbi/interface.yaml [new file with mode: 0644]
installers/charm/interfaces/osm-nbi/provides.py [new file with mode: 0644]
installers/charm/interfaces/osm-nbi/requires.py [new file with mode: 0644]
installers/charm/interfaces/osm-ro/README.md [new file with mode: 0644]
installers/charm/interfaces/osm-ro/copyright [new file with mode: 0644]
installers/charm/interfaces/osm-ro/interface.yaml [new file with mode: 0644]
installers/charm/interfaces/osm-ro/provides.py [new file with mode: 0644]
installers/charm/interfaces/osm-ro/requires.py [new file with mode: 0644]
installers/charm/layers/osm-common/README.md [new file with mode: 0644]
installers/charm/layers/osm-common/layer.yaml [new file with mode: 0644]
installers/charm/layers/osm-common/lib/charms/osm/k8s.py [new file with mode: 0644]
installers/charm/layers/osm-common/metadata.yaml [new file with mode: 0644]
installers/charm/layers/osm-common/reactive/osm_common.py [new file with mode: 0644]
installers/charm/lcm-k8s/.yamllint.yaml [new file with mode: 0644]
installers/charm/lcm-k8s/README.md [new file with mode: 0644]
installers/charm/lcm-k8s/config.yaml [new file with mode: 0644]
installers/charm/lcm-k8s/icon.svg [new file with mode: 0644]
installers/charm/lcm-k8s/layer.yaml [new file with mode: 0644]
installers/charm/lcm-k8s/metadata.yaml [new file with mode: 0644]
installers/charm/lcm-k8s/reactive/lcm.py [new file with mode: 0644]
installers/charm/lcm-k8s/reactive/spec_template.yaml [new file with mode: 0644]
installers/charm/lcm-k8s/tox.ini [new file with mode: 0644]
installers/charm/lint.sh [new file with mode: 0755]
installers/charm/mon-k8s/.yamllint.yaml [new file with mode: 0644]
installers/charm/mon-k8s/README.md [new file with mode: 0644]
installers/charm/mon-k8s/config.yaml [new file with mode: 0644]
installers/charm/mon-k8s/icon.svg [new file with mode: 0644]
installers/charm/mon-k8s/layer.yaml [new file with mode: 0644]
installers/charm/mon-k8s/metadata.yaml [new file with mode: 0644]
installers/charm/mon-k8s/reactive/mon_k8s.py [new file with mode: 0644]
installers/charm/mon-k8s/reactive/spec_template.yaml [new file with mode: 0644]
installers/charm/mon-k8s/tox.ini [new file with mode: 0644]
installers/charm/nbi-k8s/.yamllint.yaml [new file with mode: 0644]
installers/charm/nbi-k8s/README.md [new file with mode: 0755]
installers/charm/nbi-k8s/config.yaml [new file with mode: 0755]
installers/charm/nbi-k8s/icon.svg [new file with mode: 0644]
installers/charm/nbi-k8s/layer.yaml [new file with mode: 0644]
installers/charm/nbi-k8s/metadata.yaml [new file with mode: 0755]
installers/charm/nbi-k8s/reactive/nbi.py [new file with mode: 0644]
installers/charm/nbi-k8s/reactive/spec_template.yaml [new file with mode: 0644]
installers/charm/nbi-k8s/tox.ini [new file with mode: 0644]
installers/charm/nbi-k8s/wheelhouse.txt [new file with mode: 0644]
installers/charm/pol-k8s/.yamllint.yaml [new file with mode: 0644]
installers/charm/pol-k8s/README.md [new file with mode: 0644]
installers/charm/pol-k8s/config.yaml [new file with mode: 0644]
installers/charm/pol-k8s/icon.svg [new file with mode: 0644]
installers/charm/pol-k8s/layer.yaml [new file with mode: 0644]
installers/charm/pol-k8s/metadata.yaml [new file with mode: 0644]
installers/charm/pol-k8s/reactive/pol_k8s.py [new file with mode: 0644]
installers/charm/pol-k8s/reactive/spec_template.yaml [new file with mode: 0644]
installers/charm/pol-k8s/tox.ini [new file with mode: 0644]
installers/charm/ro-k8s/.yamllint.yaml [new file with mode: 0644]
installers/charm/ro-k8s/README.md [new file with mode: 0755]
installers/charm/ro-k8s/config.yaml [new file with mode: 0755]
installers/charm/ro-k8s/icon.svg [new file with mode: 0644]
installers/charm/ro-k8s/layer.yaml [new file with mode: 0644]
installers/charm/ro-k8s/metadata.yaml [new file with mode: 0755]
installers/charm/ro-k8s/reactive/ro.py [new file with mode: 0644]
installers/charm/ro-k8s/reactive/spec_template.yaml [new file with mode: 0644]
installers/charm/ro-k8s/tox.ini [new file with mode: 0644]
installers/charm/ui-k8s/.yamllint.yaml [new file with mode: 0644]
installers/charm/ui-k8s/README.md [new file with mode: 0755]
installers/charm/ui-k8s/config.yaml [new file with mode: 0755]
installers/charm/ui-k8s/icon.svg [new file with mode: 0644]
installers/charm/ui-k8s/layer.yaml [new file with mode: 0644]
installers/charm/ui-k8s/metadata.yaml [new file with mode: 0755]
installers/charm/ui-k8s/reactive/spec_template.yaml [new file with mode: 0644]
installers/charm/ui-k8s/reactive/ui.py [new file with mode: 0644]
installers/charm/ui-k8s/tox.ini [new file with mode: 0644]
installers/charmed_install.sh [new file with mode: 0755]
installers/charmed_uninstall.sh [new file with mode: 0755]
installers/docker/docker-compose.yaml
installers/docker/files/dashboards-osm.yml [deleted file]
installers/docker/files/datasource-prometheus.yml [deleted file]
installers/docker/files/node_exporter.service [deleted file]
installers/docker/files/osm-sample-dashboard.json [deleted file]
installers/docker/files/osm-system-dashboard.json [deleted file]
installers/docker/files/prometheus.yml [deleted file]
installers/docker/grafana/dashboards-osm.yml [new file with mode: 0644]
installers/docker/grafana/datasource-prometheus.yml [new file with mode: 0644]
installers/docker/grafana/osm-sample-dashboard.json [new file with mode: 0644]
installers/docker/grafana/osm-system-dashboard.json [new file with mode: 0644]
installers/docker/osm_pla/docker-compose.yaml [new file with mode: 0644]
installers/docker/osm_pla/pla.yaml [new file with mode: 0644]
installers/docker/osm_pods/keystone.yaml
installers/docker/osm_pods/prometheus.yaml
installers/docker/prometheus/prometheus.yml [new file with mode: 0644]
installers/docker/prometheus_exporters/node_exporter.service [new file with mode: 0644]
installers/full_install_osm.sh
installers/install_osm.sh
installers/lxd-preseed.conf [new file with mode: 0644]
robot-systest/README.md [new file with mode: 0644]
robot-systest/README_Robot_Test.md [deleted file]
robot-systest/deprecated/README_Robot_Test.md [new file with mode: 0644]
robot-systest/deprecated/lib/api/common.robot [new file with mode: 0644]
robot-systest/deprecated/lib/api/vim_lib.robot [new file with mode: 0644]
robot-systest/deprecated/lib/cli/network_slicing_lib.robot [new file with mode: 0644]
robot-systest/deprecated/lib/cli/ns_lib.robot [new file with mode: 0644]
robot-systest/deprecated/lib/cli/nsd_lib.robot [new file with mode: 0644]
robot-systest/deprecated/lib/cli/osm_package_tools_lib.robot [new file with mode: 0644]
robot-systest/deprecated/lib/cli/osm_platform_resiliancy_recovery_lib.robot [new file with mode: 0644]
robot-systest/deprecated/lib/cli/rbac_lib.robot [new file with mode: 0644]
robot-systest/deprecated/lib/cli/sdnc_account_lib.robot [new file with mode: 0644]
robot-systest/deprecated/lib/cli/vim_account_lib.robot [new file with mode: 0644]
robot-systest/deprecated/lib/cli/vnfd_lib.robot [new file with mode: 0644]
robot-systest/deprecated/lib/client_lib/client_lib.py [new file with mode: 0644]
robot-systest/deprecated/lib/custom_lib.py [new file with mode: 0644]
robot-systest/deprecated/lib/gui/login_gui.robot [new file with mode: 0644]
robot-systest/deprecated/resource/api/common.robot [new file with mode: 0644]
robot-systest/deprecated/resource/api/variables.py [new file with mode: 0644]
robot-systest/deprecated/resource/cli/disable_port_security_ns_data.py [new file with mode: 0644]
robot-systest/deprecated/resource/cli/hackfest_basic_ns_data.py [new file with mode: 0644]
robot-systest/deprecated/resource/cli/hackfest_cloudinit_ns_data.py [new file with mode: 0644]
robot-systest/deprecated/resource/cli/hackfest_epa_ns_data.py [new file with mode: 0644]
robot-systest/deprecated/resource/cli/hackfest_multivdu_ns_data.py [new file with mode: 0644]
robot-systest/deprecated/resource/cli/hackfest_simplecharm_ns_data.py [new file with mode: 0644]
robot-systest/deprecated/resource/cli/test_vnf_data.py [new file with mode: 0644]
robot-systest/deprecated/resource/cli/ubuntu-cloudinit_ns_data.py [new file with mode: 0644]
robot-systest/deprecated/run_test.sh [new file with mode: 0644]
robot-systest/deprecated/testsuite/api/TS01__Vim_Account.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS008__Test_SDNC.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS009__Feature_6283_Network_Slicing_Test.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS010__OSM_Platform_Resiliency_and_Recovery_Test.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS011__Feature_1415_RBAC_For_Platform_Test.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS012__Feature_7181_Allow_Instantiation_Parameters_in_CloudInit.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS013__Feature_1415_RBAC_Visibility_Of_Packages_And_Instances.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS014__Feature_7921_MongoDB_Filesystem_Test.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS015__Feature_8047_OSMClient_Package_Creation_And_Validation.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS016__Manual_VNF_VDU_Scaling_Test.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS017__Feature_7326_Disable_Port_Security_at_Network_level.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS01__Test_VNF.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS02__Test_Vim.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS03__Hackfest_Basic_NS.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS04__Hackfest_Simplecharm_NS.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS05__Hackfest_Multivdu_NS.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS06__Hackfest_Cloudinit_NS.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/TS07__Hackfest_EPA_NS.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/cli/__init__.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/client_library/TS01__OSMClient_Library_Test.robot [new file with mode: 0644]
robot-systest/deprecated/testsuite/gui/TS01__Test_GUI_Login.robot [new file with mode: 0644]
robot-systest/environment.rc [new file with mode: 0644]
robot-systest/lib/api/common.robot [deleted file]
robot-systest/lib/api/vim_lib.robot [deleted file]
robot-systest/lib/cli/network_slicing_lib.robot [deleted file]
robot-systest/lib/cli/ns_lib.robot [deleted file]
robot-systest/lib/cli/nsd_lib.robot [deleted file]
robot-systest/lib/cli/osm_platform_resiliancy_recovery_lib.robot [deleted file]
robot-systest/lib/cli/rbac_lib.robot [deleted file]
robot-systest/lib/cli/sdnc_account_lib.robot [deleted file]
robot-systest/lib/cli/vim_account_lib.robot [deleted file]
robot-systest/lib/cli/vnfd_lib.robot [deleted file]
robot-systest/lib/client_lib/client_lib.py [deleted file]
robot-systest/lib/connectivity_lib.robot [new file with mode: 0644]
robot-systest/lib/custom_lib.py [deleted file]
robot-systest/lib/gui/login_gui.robot [deleted file]
robot-systest/lib/ns_lib.robot [new file with mode: 0644]
robot-systest/lib/nsd_lib.robot [new file with mode: 0644]
robot-systest/lib/ssh_lib.robot [new file with mode: 0644]
robot-systest/lib/vnfd_lib.robot [new file with mode: 0644]
robot-systest/resource/api/common.robot [deleted file]
robot-systest/resource/api/variables.py [deleted file]
robot-systest/resource/cli/hackfest_basic_ns_data.py [deleted file]
robot-systest/resource/cli/hackfest_cloudinit_ns_data.py [deleted file]
robot-systest/resource/cli/hackfest_epa_ns_data.py [deleted file]
robot-systest/resource/cli/hackfest_multivdu_ns_data.py [deleted file]
robot-systest/resource/cli/hackfest_simplecharm_ns_data.py [deleted file]
robot-systest/resource/cli/test_vnf_data.py [deleted file]
robot-systest/resource/cli/ubuntu-cloudinit_ns_data.py [deleted file]
robot-systest/resources/hackfest_basic_ns_data.py [new file with mode: 0644]
robot-systest/resources/hackfest_cloudinit_ns_data.py [new file with mode: 0644]
robot-systest/resources/hackfest_multivdu_ns_data.py [new file with mode: 0644]
robot-systest/run_test.sh [deleted file]
robot-systest/testsuite/api/TS01__Vim_Account.robot [deleted file]
robot-systest/testsuite/cli/TS008__Test_SDNC.robot [deleted file]
robot-systest/testsuite/cli/TS009__Feature_6283_Network_Slicing_Test.robot [deleted file]
robot-systest/testsuite/cli/TS010__OSM_Platform_Resiliency_and_Recovery_Test.robot [deleted file]
robot-systest/testsuite/cli/TS011__Feature_1415_RBAC_For_Platform_Test.robot [deleted file]
robot-systest/testsuite/cli/TS012__Feature_7181_Allow_Instantiation_Parameters_in_CloudInit.robot [deleted file]
robot-systest/testsuite/cli/TS01__Test_VNF.robot [deleted file]
robot-systest/testsuite/cli/TS02__Test_Vim.robot [deleted file]
robot-systest/testsuite/cli/TS03__Hackfest_Basic_NS.robot [deleted file]
robot-systest/testsuite/cli/TS04__Hackfest_Simplecharm_NS.robot [deleted file]
robot-systest/testsuite/cli/TS05__Hackfest_Multivdu_NS.robot [deleted file]
robot-systest/testsuite/cli/TS06__Hackfest_Cloudinit_NS.robot [deleted file]
robot-systest/testsuite/cli/TS07__Hackfest_EPA_NS.robot [deleted file]
robot-systest/testsuite/cli/__init__.robot [deleted file]
robot-systest/testsuite/client_library/TS01__OSMClient_Library_Test.robot [deleted file]
robot-systest/testsuite/gui/TS01__Test_GUI_Login.robot [deleted file]
robot-systest/testsuite/hackfest_basic.robot [new file with mode: 0644]
robot-systest/testsuite/hackfest_cloudinit.robot [new file with mode: 0644]
robot-systest/testsuite/hackfest_multivdu.robot [new file with mode: 0644]
systest/lib/osm/osm.py
systest/testcases/vnfs/test_vnfs.py
tools/license_scan.sh

index 96ee3a3..e3ed0f8 100644 (file)
@@ -24,8 +24,17 @@ osm-devops_*.post*
 
 #IDEs
 .idea
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+*.code-workspace
 
 #local stuff files that end in ".local" or folders called "local"
 *.local
 local
 
+installers/charm/**/release/
+__pycache__
+.tox
index 861dfd6..3880e96 100644 (file)
@@ -35,7 +35,9 @@ RUN apt-get update && \
     apt-get install -y software-properties-common && \
     add-apt-repository -y cloud-archive:pike && \
     apt-get update && apt dist-upgrade -y && \
-    apt-get install -y python-openstackclient keystone apache2 libapache2-mod-wsgi net-tools mysql-client && \
+    apt-get install -y python-openstackclient keystone apache2 libapache2-mod-wsgi net-tools mysql-client dnsutils && \
+    apt-get install -y python-pip build-essential python-dev libldap2-dev libsasl2-dev libssl-dev libffi-dev libxml2-dev libxslt1-dev zlib1g-dev ldap-utils && \
+    pip install python-ldap ldappool && \
     rm -rf /var/lib/apt/lists/* && \
     chmod +x start.sh
 
@@ -56,5 +58,23 @@ ENV ADMIN_PROJECT           admin
 ENV SERVICE_USERNAME        nbi
 ENV SERVICE_PASSWORD        nbi
 ENV SERVICE_PROJECT         service
+# ldap
+# ENV LDAP_AUTHENTICATION_DOMAIN_NAME     no default
+# ENV LDAP_URL                            ldap://localhost
+# ENV LDAP_BIND_USER                      no defauslt
+# ENV LDAP_BIND_PASSWORD                  no default
+# ENV LDAP_USER_TREE_DN                   no default
+# ENV LDAP_USER_OBJECTCLASS               inetOrgPerson
+# ENV LDAP_USER_ID_ATTRIBUTE              cn
+# ENV LDAP_USER_NAME_ATTRIBUTE            sn
+# ENV LDAP_USER_PASS_ATTRIBUTE            userPassword
+# ENV LDAP_USER_FILTER                    no default
+# ENV LDAP_USER_ENABLED_ATTRIBUTE         enabled
+# ENV LDAP_USER_ENABLED_MASK              0
+# ENV LDAP_USER_ENABLED_DEFAULT           true
+# ENV LDAP_USER_ENABLED_INVERT            false
+# ENV LDAP_USE_STARTTLS                   false
+# ENV LDAP_TLS_CACERT_BASE64              no default
+# ENV LDAP_TLS_REQ_CERT                   demand
 
 ENTRYPOINT ./start.sh
diff --git a/docker/Keystone/LDAP.md b/docker/Keystone/LDAP.md
new file mode 100644 (file)
index 0000000..9b28f64
--- /dev/null
@@ -0,0 +1,95 @@
+<!--
+# Copyright 2020 Canonical Ltd.
+# All rights reserved.
+#
+# 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.
+## -->
+
+# User authentication with external LDAP server
+
+When using the Keystone back-end, an external LDAP server may be used for user authentication, whereas the assignment information (RBAC roles/projects) is always stored in the local mysql database. In this working model, two user and project domains are used.
+
+- The "default" domain, in which the external LDAP is not checked, mainly intended for administrative users ("admin").
+- The the "ldap" domain, in which the validation of credentials is delegated to the LDAP server. User creation / deletion is also done in the external LDAP, and the GUI and osm client are used for configuring assignment only.
+
+The name of "ldap" domain is configurable, and must be synchronized in the GUI, NBI and Keystone OSM modules.
+
+## LDAP Synchronization
+
+For the "ldap" domain, Keystone will synchronize the user information between the LDAP server and the local mysql database. This is done at component startup time and periodically (in the cron), once a day, executing this command
+
+```bash
+keystone-manage mapping_purge --domain-name $LDAP_AUTHENTICATION_DOMAIN_NAME; keystone-manage mapping_populate --domain-name $LDAP_AUTHENTICATION_DOMAIN_NAME
+```
+
+If a user tries to authenticate but is not yet in the local database, the relevant data will be loaded to mysql automatically. For this reason is not crucial to execute synchronization too often. User deletion in LDAP will only be performed in mysql after the periodic synchronization. For this reason, it has to be taken into account that the user info shown by osm client may not be fully up to date until the next sync.
+
+Keystone never deletes the assignment information, even if the LDAP user disappears. For this reason, if a new client is created in LDAP reusing the same identifier, the RBAC info associated will be the previous one.
+
+The binding to the external LDAP may be:
+
+- Anonymous. The remote LDAP server must support anonymous BIND with read permissions over the user branch
+- Authenticated. A user account must exist in the LDAP server for Keystone, having read permissions over the user branch. This account should never expire.
+
+The connection may be in clear (which is rarely used) or TLS.
+
+### Configuration
+
+The Keystone component will configure itself at startup time using a few environment variables as follows (see [this](https://www.oreilly.com/library/view/identity-authentication-and/9781491941249/ch04.html) for details):
+
+- **LDAP_AUTHENTICATION_DOMAIN_NAME**: name of the domain which use LDAP authentication
+- **LDAP_URL**: URL of the LDAP server
+- **LDAP_BIND_USER** and **LDAP_BIND_PASSWORD**: This is the user/password to bind and search for users. If not specified, the user accessing Keystone needs to have anonymous query rights to the dn_tree specified in the next configuration option.
+- **LDAP_USER_TREE_DN**: This specifies the root of the tree in the LDAP server in which Keystone will search for users.
+- **LDAP_USER_OBJECTCLASS**: This specifies the LDAP object class that Keystone will filter on within user_tree_dn to find user objects. Any objects of other classes will be ignored.
+- **LDAP_USER_ID_ATTRIBUTE**, **LDAP_USER_NAME_ATTRIBUTE** and **LDAP_USER_PASS_ATTRIBUTE**: This set of options define the mapping to LDAP attributes for the three key user attributes supported by Keystone. The LDAP attribute chosen for user_id must be something that is immutable for a user and no more than 64 characters in length. Notice that Distinguished Name (DN) may be longer than 64 characters and thus is not suitable. An uid, or mail may be appropriate.
+- **LDAP_USER_FILTER**: This filter option allow additional filter (over and above user_objectclass) to be included into the search of user. One common use of this is to provide more efficient searching, where the recommended search for user objects is (&(objectCategory=person)(objectClass=user)). By specifying user_objectclass as user and user_filter as objectCategory=person in the Keystone configuration file, this can be achieved.
+- **LDAP_USER_ENABLED_ATTRIBUTE**: In Keystone, a user entity can be either enabled or disabled. Setting the above option will give a mapping to an equivalent attribute in LDAP, allowing your LDAP management tools to disable a user.
+- **LDAP_USER_ENABLED_MASK**: Some LDAP schemas, rather than having a dedicated attribute for user enablement, use a bit within a general control attribute (such as userAccountControl) to indicate this. Setting user_enabled_mask will cause Keystone to look at only the status of this bit in the attribute specified by user_enabled_attribute, with the bit set indicating the user is enabled.
+- **LDAP_USER_ENABLED_DEFAULT**: Most LDAP servers use a boolean or bit in a control field to indicate enablement. However, some schemas might use an integer value in an attribute. In this situation, set user_enabled_default to the integer value that represents a user being enabled.
+- **LDAP_USER_ENABLED_INVERT**: Some LDAP schemas have an “account locked” attribute, which is the equivalent to account being “disabled.” In order to map this to the Keystone enabled attribute, you can utilize the user_enabled_invert setting in conjunction with user_enabled_attribute to map the lock status to disabled in Keystone.
+- **LDAP_USE_STARTTLS**: Enable Transport Layer Security (TLS) for providing a secure connection from Keystone to LDAP (StartTLS, not LDAPS).
+- **LDAP_TLS_CACERT_BASE64**: CA certificate in Base64 format (if you have the PEM file, text inside "-----BEGIN CERTIFICATE-----"/"-----END CERTIFICATE-----" tags).
+- **LDAP_TLS_REQ_CERT**: Defines how the certificates are checked for validity in the client (i.e., Keystone end) of the secure connection (this doesn’t affect what level of checking the server is doing on the certificates it receives from Keystone). Possible values are "demand", "never", and "allow". The default of demand means the client always checks the certificate and will drop the connection if it is not provided or invalid. never is the opposite—it never checks it, nor requires it to be provided. allow means that if it is not provided then the connection is allowed to continue, but if it is provided it will be checked—and if invalid, the connection will be dropped.
+
+#### default values
+
+- **LDAP_AUTHENTICATION_DOMAIN_NAME**: no default
+- **LDAP_URL**: ldap://localhost
+- **LDAP_BIND_USER**: no default
+- **LDAP_BIND_PASSWORD**: no default
+- **LDAP_USER_TREE_DN**: no default
+- **LDAP_USER_OBJECTCLASS**: inetOrgPerson
+- **LDAP_USER_ID_ATTRIBUTE**: cn
+- **LDAP_USER_NAME_ATTRIBUTE**: sn
+- **LDAP_USER_PASS_ATTRIBUTE**: userPassword
+- **LDAP_USER_FILTER**: no default
+- **LDAP_USER_ENABLED_ATTRIBUTE**: enabled
+- **LDAP_USER_ENABLED_MASK**: 0
+- **LDAP_USER_ENABLED_DEFAULT**: true
+- **LDAP_USER_ENABLED_INVERT**: false
+- **LDAP_USE_STARTTLS**: false
+- **LDAP_TLS_CACERT_BASE64**: no default
+- **LDAP_TLS_REQ_CERT**: demand
+
+#### Example
+
+- **LDAP_AUTHENTICATION_DOMAIN_NAME**: ldap
+- **LDAP_URL**: ldap://ldap.example.com
+- **LDAP_BIND_USER**: cn=keystone,ou=Users,dc=example,dc=com
+- **LDAP_BIND_PASSWORD**: keystone
+- **LDAP_USER_TREE_DN**: ou=Users,dc=example,dc=com
+- **LDAP_USER_OBJECTCLASS**: person
+- **LDAP_USER_ID_ATTRIBUTE**: cn
+- **LDAP_USE_STARTTLS**: "true"
+- **LDAP_TLS_CACERT_BASE64**: MIID/TCCAmWg...
index 8dd61ad..78c7820 100755 (executable)
@@ -41,6 +41,24 @@ function wait_db(){
     return 0
 }
 
+function wait_keystone_host(){
+    attempt=0
+    timeout=2
+    echo "Wait until Keystone hostname can be resolved "
+    while ! nslookup $KEYSTONE_HOST; do
+        #wait 120 sec
+        if [ $attempt -ge $max_attempts ]; then
+            echo
+            echo "Can not resolve ${KEYSTONE_HOST} during $max_attempts sec"
+            return 1
+        fi
+        attempt=$[$attempt+1]
+        echo -n "."
+        sleep 1
+    done
+    return 0
+}
+
 function is_db_created() {
     db_host=$1
     db_port=$2
@@ -66,17 +84,87 @@ if [ -z $DB_EXISTS ]; then
     mysql -h"$DB_HOST" -P"$DB_PORT" -u"$ROOT_DB_USER" -p"$ROOT_DB_PASSWORD" --default_character_set utf8 -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '$KEYSTONE_DB_PASSWORD'"
     mysql -h"$DB_HOST" -P"$DB_PORT" -u"$ROOT_DB_USER" -p"$ROOT_DB_PASSWORD" --default_character_set utf8 -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '$KEYSTONE_DB_PASSWORD'"
 else
-    if [ $(mysql -h"$DB_HOST" -P"$DB_PORT" -u"$ROOT_DB_USER" -p"$ROOT_DB_PASSWORD" --default_character_set utf8 -sse "SELECT COUNT(*) FROM keystone;") -gt 0 ]; then
+    if [ $(mysql -h"$DB_HOST" -P"$DB_PORT" -u"$ROOT_DB_USER" -p"$ROOT_DB_PASSWORD" --default_character_set utf8 -sse "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'keystone';") -gt 0 ]; then
         echo "DB keystone is empty"
         DB_NOT_EMPTY="y"
     fi
 fi
 
 # Setting Keystone database connection
-sed -i "721s%.*%connection = mysql+pymysql://keystone:$KEYSTONE_DB_PASSWORD@$DB_HOST:$DB_PORT/keystone%" /etc/keystone/keystone.conf
+sed -i '/^\[database\]$/,/^\[/ s/^connection = .*/connection = mysql+pymysql:\/\/keystone:'$KEYSTONE_DB_PASSWORD'@'$DB_HOST':'$DB_PORT'\/keystone/' /etc/keystone/keystone.conf
 
 # Setting Keystone tokens
-sed -i "2934s%.*%provider = fernet%" /etc/keystone/keystone.conf
+sed -i '/^\[token\]$/,/^\[/ s/^.*provider = .*/provider = fernet/' /etc/keystone/keystone.conf
+
+
+# Use LDAP authentication for Identity
+if [ $LDAP_AUTHENTICATION_DOMAIN_NAME ]; then
+    # Enable Keyston domains
+    sed -i "s%.*domain_specific_drivers_enabled =.*%domain_specific_drivers_enabled = true%" /etc/keystone/keystone.conf
+    sed -i "s%.*domain_config_dir =.*%domain_config_dir = /etc/keystone/domains%" /etc/keystone/keystone.conf
+    mkdir -p /etc/keystone/domains
+    # Configure domain for LDAP authentication
+    cat << EOF > /etc/keystone/domains/keystone.$LDAP_AUTHENTICATION_DOMAIN_NAME.conf
+[identity]
+driver = ldap
+[ldap]
+url = $LDAP_URL
+user_allow_create=false
+user_allow_update=false
+user_allow_delete=false
+group_allow_create=false
+group_allow_update=false
+group_allow_delete=false
+query_scope = sub
+EOF
+    if [ $LDAP_BIND_USER ]; then
+        echo "user = $LDAP_BIND_USER" >> /etc/keystone/domains/keystone.$LDAP_AUTHENTICATION_DOMAIN_NAME.conf
+    fi
+    if [ $LDAP_BIND_PASSWORD ]; then
+        echo "password = $LDAP_BIND_PASSWORD" >> /etc/keystone/domains/keystone.$LDAP_AUTHENTICATION_DOMAIN_NAME.conf
+    fi
+    if [ $LDAP_USER_TREE_DN ]; then
+        echo "user_tree_dn = $LDAP_USER_TREE_DN" >> /etc/keystone/domains/keystone.$LDAP_AUTHENTICATION_DOMAIN_NAME.conf
+    fi
+    if [ $LDAP_USER_OBJECTCLASS ]; then
+        echo "user_objectclass = $LDAP_USER_OBJECTCLASS" >> /etc/keystone/domains/keystone.$LDAP_AUTHENTICATION_DOMAIN_NAME.conf
+    fi
+    if [ $LDAP_USER_ID_ATTRIBUTE ]; then
+        echo "user_id_attribute = $LDAP_USER_ID_ATTRIBUTE" >> /etc/keystone/domains/keystone.$LDAP_AUTHENTICATION_DOMAIN_NAME.conf
+    fi
+    if [ $LDAP_USER_NAME_ATTRIBUTE ]; then
+        echo "user_name_attribute = $LDAP_USER_NAME_ATTRIBUTE" >> /etc/keystone/domains/keystone.$LDAP_AUTHENTICATION_DOMAIN_NAME.conf
+    fi
+    if [ $LDAP_USER_PASS_ATTRIBUTE ]; then
+        echo "user_pass_attribute = $LDAP_USER_PASS_ATTRIBUTE" >> /etc/keystone/domains/keystone.$LDAP_AUTHENTICATION_DOMAIN_NAME.conf
+    fi
+    if [ $LDAP_USER_FILTER ]; then
+        echo "user_filter = $LDAP_USER_FILTER" >> /etc/keystone/domains/keystone.$LDAP_AUTHENTICATION_DOMAIN_NAME.conf
+    fi
+    if [ $LDAP_USER_ENABLED_ATTRIBUTE ]; then
+        echo "user_enabled_attribute = $LDAP_USER_ENABLED_ATTRIBUTE" >> /etc/keystone/domains/keystone.$LDAP_AUTHENTICATION_DOMAIN_NAME.conf
+    fi
+    if [ $LDAP_USER_ENABLED_MASK ]; then
+        echo "user_enabled_mask = $LDAP_USER_ENABLED_MASK" >> /etc/keystone/domains/keystone.$LDAP_AUTHENTICATION_DOMAIN_NAME.conf
+    fi
+    if [ $LDAP_USER_ENABLED_DEFAULT ]; then
+        echo "user_enabled_default = $LDAP_USER_ENABLED_DEFAULT" >> /etc/keystone/domains/keystone.$LDAP_AUTHENTICATION_DOMAIN_NAME.conf
+    fi
+    if [ $LDAP_USER_ENABLED_INVERT ]; then
+        echo "user_enabled_invert = $LDAP_USER_ENABLED_INVERT" >> /etc/keystone/domains/keystone.$LDAP_AUTHENTICATION_DOMAIN_NAME.conf
+    fi
+    if [ $LDAP_USE_STARTTLS ] && [ "$LDAP_USE_STARTTLS" == "true" ]; then
+        echo "use_tls = true" >> /etc/keystone/domains/keystone.$LDAP_AUTHENTICATION_DOMAIN_NAME.conf
+        mkdir -p /etc/keystone/ssl/certs/
+        echo "-----BEGIN CERTIFICATE-----" > /etc/keystone/ssl/certs/ca.pem
+        echo $LDAP_TLS_CACERT_BASE64 >> /etc/keystone/ssl/certs/ca.pem
+        echo "-----END CERTIFICATE-----" >> /etc/keystone/ssl/certs/ca.pem
+        echo "tls_cacertfile = /etc/keystone/ssl/certs/ca.pem" >> /etc/keystone/domains/keystone.$LDAP_AUTHENTICATION_DOMAIN_NAME.conf
+        if [ $LDAP_TLS_REQ_CERT ]; then
+            echo "tls_req_cert = $LDAP_TLS_REQ_CERT" >> /etc/keystone/domains/keystone.$LDAP_AUTHENTICATION_DOMAIN_NAME.conf
+        fi
+    fi
+fi
 
 # Populate Keystone database
 if [ -z $DB_EXISTS ] || [ -z $DB_NOT_EMPTY ]; then
@@ -87,6 +175,8 @@ fi
 keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
 keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
 
+wait_keystone_host
+
 # Bootstrap Keystone service
 if [ -z $DB_EXISTS ] || [ -z $DB_NOT_EMPTY ]; then
     keystone-manage bootstrap \
@@ -99,6 +189,7 @@ if [ -z $DB_EXISTS ] || [ -z $DB_NOT_EMPTY ]; then
         --bootstrap-region-id "$REGION_ID"
 fi
 
+echo "ServerName $KEYSTONE_HOST" >> /etc/apache2/apache2.conf
 # Restart Apache Service
 service apache2 restart
 
@@ -120,7 +211,17 @@ if [ -z $DB_EXISTS ] || [ -z $DB_NOT_EMPTY ]; then
     openstack user create --domain default --password "$SERVICE_PASSWORD" "$SERVICE_USERNAME"
     openstack project create --domain default --description "Service Project" "$SERVICE_PROJECT"
     openstack role add --project "$SERVICE_PROJECT" --user "$SERVICE_USERNAME" admin
-    openstack role delete _member_
+fi
+
+if [ $LDAP_AUTHENTICATION_DOMAIN_NAME ]; then
+    if !(openstack domain list | grep -q $LDAP_AUTHENTICATION_DOMAIN_NAME); then
+        # Create domain in keystone for LDAP authentication
+        openstack domain create $LDAP_AUTHENTICATION_DOMAIN_NAME
+        # Restart Apache Service
+        service apache2 restart
+    fi
+       # Check periodically LDAP for updates
+       echo "0 1 * * * keystone-manage mapping_purge --domain-name $LDAP_AUTHENTICATION_DOMAIN_NAME; keystone-manage mapping_populate --domain-name $LDAP_AUTHENTICATION_DOMAIN_NAME" >> /var/spool/cron/crontabs/root
 fi
 
 while ps -ef | grep -v grep | grep -q apache2
index 5ee783f..a18bcc9 100644 (file)
@@ -140,7 +140,7 @@ ENV OSMLCM_VCA_JUJUPATH    /usr/local/bin/juju
 # ENV OSMLCM_GLOBAL_LOGLEVEL DEBUG
 
 HEALTHCHECK --start-period=120s --interval=30s --timeout=30s --retries=1 \
-  CMD python3 -m osm_lcm.lcm --health-check || exit 1
+  CMD python3 -m osm_lcm.lcm_hc || exit 1
 
 
 # Run app.py when the container launches
index b6eff1b..9505034 100644 (file)
@@ -84,6 +84,9 @@ ENV OSMMON_DATABASE_COMMONKEY changeme
 ENV OSMMON_COLLECTOR_INTERVAL 30
 ENV OSMMON_EVALUATOR_INTERVAL 30
 ENV OSMMON_PROMETHEUS_URL http://prometheus:9090
+ENV OSMMON_GRAFANA_URL http://grafana:3000
+ENV OSMMON_GRAFANA_USER admin
+ENV OSMMON_GRAFANA_PASSWORD admin
 
 EXPOSE 8000
 
index 80e9dc6..6d07229 100644 (file)
@@ -37,7 +37,8 @@ ARG IM_VERSION
 RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y python3-osm-ro${RO_VERSION} python3-osm-im${IM_VERSION} \
     python3-osm-roclient${RO_VERSION} \
     python3-osm-rosdn-tapi${RO_VERSION} python3-osm-rosdn-dynpac${RO_VERSION} python3-osm-rosdn-onosof${RO_VERSION} \
-    python3-osm-rosdn-onos-vpls${RO_VERSION} \
+    python3-osm-rosdn-onos-vpls${RO_VERSION} python3-osm-rosdn-floodlightof${RO_VERSION} \
+    python3-osm-rosdn-arista${RO_VERSION} python3-osm-rosdn-odlof${RO_VERSION} \
     python3-osm-rovim-vmware${RO_VERSION} python3-osm-rovim-openstack${RO_VERSION} \
     python3-osm-rovim-openvim${RO_VERSION} python3-osm-rovim-azure${RO_VERSION} \
     python3-osm-rovim-aws${RO_VERSION} python3-osm-rovim-fos${RO_VERSION} python3-osm-rovim-opennebula${RO_VERSION}
diff --git a/installers/60-lxd-production.conf b/installers/60-lxd-production.conf
new file mode 100644 (file)
index 0000000..1d1194f
--- /dev/null
@@ -0,0 +1,25 @@
+#   Copyright 2020 Canonical Ltd.
+#
+#   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.
+
+# Sysctl values for LXD in production
+fs.inotify.max_queued_events=1048576
+fs.inotify.max_user_instances=1048576
+fs.inotify.max_user_watches=1048576
+vm.max_map_count=262144
+kernel.dmesg_restrict=1
+net.ipv4.neigh.default.gc_thresh3=8192
+net.ipv6.neigh.default.gc_thresh3=8192
+net.core.bpf_jit_limit=3000000000
+kernel.keys.maxkeys=2000
+kernel.keys.maxbytes=2000000
diff --git a/installers/charm/README.md b/installers/charm/README.md
new file mode 100644 (file)
index 0000000..0fb31db
--- /dev/null
@@ -0,0 +1,169 @@
+<!--
+ Copyright 2020 Canonical Ltd.
+
+ 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.
+-->
+
+# OSM Charms and interfaces
+
+**Description**: This document describes the high-level view of the OSM Charms and interfaces. An important note is that these charms Kubernetes Charms, so they must be deployed on top of a Kubernetes Cloud using Juju.
+
+## Folder tree
+
+In the current directory, there is one folder "interfaces" that has all the interfaces of the OSM components, which are basically two: osm-nbi, and osm-ro.
+
+Additionally, we can see six folders that contain each OSM core components: lcm-k8s, mon-k8s, nbi-k8s, pol-k8s, ro-k8s, and ui-k8s.
+
+Then, we can see a folder "bundle" which has the templates for the OSM bundles in single instance and HA.
+
+The "layers" folder include one common layer for all the osm charms (osm-common)
+
+```txt
+
+├── bundles
+│   ├── osm
+│   └── osm-ha
+├── interfaces
+│   ├── osm-nbi
+│   └── osm-ro
+├── layers
+│   └── osm-common
+├── lcm-k8s
+├── mon-k8s
+├── nbi-k8s
+├── pol-k8s
+├── ro-k8s
+└── ui-k8s
+
+```
+
+## Charms
+
+All the charms have a very similar structure. This subsection explains the purpose of each file inside the charms, as well as basic steps to get started.
+
+The folder structure for each charm looks like this:
+
+```txt
+<charm>-k8s/
+├── config.yaml
+├── icon.svg
+├── layer.yaml
+├── metadata.yaml
+├── reactive
+│   ├── <charm>.py
+│   └── spec_template.yaml
+├── README.md
+├── .gitignore
+├── .yamllint.yaml
+└── tox.ini
+```
+
+Purpose of each file:
+
+- **config.yaml**: YAML file that include all the configurable options for the charm.
+- **icon.svg**: SVG icon. This is the icon that will appear in the Charm Store.
+- **layer.yaml**: YAML file with the layers that the charm needs. All the OSM Charms need at least the following layers: caas-base, status, leadership, and osm-common. If charms provide or require interfaces, which all of them do, those interfaces should be specified in this file too.
+- **metadata.yaml**: YAML file that describe the top level information of the charm: name, description, series, interfaces that provide/require, needed storage, and deployment type.
+- **reactive/\<charm>.py**: Python file that implements the actual logic to the charm.
+- **reactive/spec_template.yaml**: Pod spec template to be used by the pods.
+- **README.md**: This file describes how to build the charm, how to prepare the environment to test it with Microk8s.
+- **.gitignore**: Typical Git Ignore file, to avoid pushing unwanted files to upstream.
+- **.yamllint.yaml**: YAML file to specify the files to exclude from the yamllint test that tox.ini does.
+- **tox.ini**: Includes basic functions to build the charms, and check the linting.
+
+## Interfaces
+
+Each interface needs at least three files:
+
+- **interface.yaml:** Metadata of the interface: name, maintainer, and summary.
+- **provides.py:** Code for the charm that provides the interface.
+- **requires.py:** Code for the charm that requires the interface.
+
+Additionally, there are also files for copyright and a README that explains how to use the interface.
+
+# Steps for testing
+
+## Dependencies
+
+```bash
+sudo apt install tox -y
+```
+
+## Check the syntax of the charms
+
+```bash
+./lint.sh
+```
+
+## Build all the charms
+
+```bash
+./build.sh
+```
+
+## Generate bundle
+
+```bash
+# Generate bundle from built charms
+python3 generate_bundle.py --local --destination osm.yaml
+# Help
+python3 generate_bundle.py --help
+```
+
+## Install VCA
+
+```bash
+sudo snap install juju --classic
+juju bootstrap localhost osm-lxd
+```
+
+## Generate overlay
+
+> NOTE: This will be removed once the installer is merged.
+
+```bash
+sudo snap install osmclient
+sudo snap alias osmclient.osm osm
+sudo snap connect osmclient:juju-client-observe
+sudo snap connect osmclient:ssh-public-keys
+sudo snap connect osmclient:network-control
+osmclient.overlay  # Execute the commands printed by this command to enable native charms
+```
+
+## Bootstrap Juju controller in Microk8s
+
+```bash
+sudo snap install microk8s --classic
+sudo usermod -a -G microk8s ubuntu
+sudo chown -f -R ubuntu ~/.kube
+newgrp microk8s
+microk8s.status --wait-ready
+microk8s.enable storage dns  # (metallb) is optional
+juju bootstrap microk8s osm-k8s
+```
+
+## Deploy OSM with charms
+
+```bash
+juju add-model osm
+juju deploy ./osm.yaml --overlay vca-overlay.yaml
+```
+
+## Wait until Charms are deployed
+
+```bash
+watch -c juju status --color  # Wait until every application is in active state
+export OSM_HOSTNAME=<ip-nbi>
+osm ns-list
+# ...
+```
diff --git a/installers/charm/build.sh b/installers/charm/build.sh
new file mode 100755 (executable)
index 0000000..17eea94
--- /dev/null
@@ -0,0 +1,25 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+#!/bin/bash
+set -eux
+function build() {
+    cd $1 && tox -e build && cd ..
+}
+
+build 'lcm-k8s'
+build 'mon-k8s'
+build 'nbi-k8s'
+build 'pol-k8s'
+build 'ro-k8s'
+build 'ui-k8s'
diff --git a/installers/charm/bundles/osm-ha/bundle.yaml b/installers/charm/bundles/osm-ha/bundle.yaml
new file mode 100644 (file)
index 0000000..212a520
--- /dev/null
@@ -0,0 +1,230 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+description: A high-available OSM cluster.
+bundle: kubernetes
+applications:
+  zookeeper-k8s:
+    charm: "cs:~charmed-osm/zookeeper-k8s"
+    channel: "stable"
+    scale: 3
+    series: kubernetes
+    storage:
+      database: 100M
+    options:
+      # client-port: 2181
+      server-port: 2888
+      leader-election-port: 3888
+      zookeeper-units: 3
+    annotations:
+      gui-x: 0
+      gui-y: 1100
+  mariadb-k8s:
+    charm: "cs:~charmed-osm/mariadb-k8s"
+    channel: "stable"
+    scale: 3
+    series: kubernetes
+    storage:
+      database: 300M
+    options:
+      password: manopw
+      root_password: osm4u
+      user: mano
+      database: database
+      mysql_port: "3306"
+      query-cache-type: "OFF"
+      query-cache-size: 0
+      ha-mode: true
+    annotations:
+      gui-x: -500
+      gui-y: -400
+  kafka-k8s:
+    charm: "cs:~charmed-osm/kafka-k8s"
+    channel: "stable"
+    scale: 3
+    series: kubernetes
+    storage:
+      database: 200M
+    options:
+      advertised-hostname: "kafka-k8s"
+      advertised-port: 9092
+      kafka-units: 3
+      zookeeper-units: 3
+      zookeeper-service-name: zookeeper-k8s-endpoints
+    annotations:
+      gui-x: 0
+      gui-y: 600
+  mongodb-k8s:
+    charm: "cs:~charmed-osm/mongodb-k8s"
+    channel: "stable"
+    scale: 3
+    series: kubernetes
+    storage:
+      database: 300M
+    options:
+      advertised-port: 27017
+      replica-set: rs0
+      namespace: osm
+      service-name: mongodb-k8s-endpoints
+      cluster-domain: cluster.local
+      enable-sidecar: true
+    annotations:
+      gui-x: 0
+      gui-y: 100
+  nbi-k8s:
+    charm: "cs:~charmed-osm/nbi-k8s"
+    channel: "%(channel)s"
+    scale: 3
+    series: kubernetes
+    storage:
+      packages: 100M
+    options:
+      log_level: "INFO"
+      DATABASE_COMMONKEY: osm
+    annotations:
+      gui-x: 0
+      gui-y: -400
+  ro-k8s:
+    charm: "cs:~charmed-osm/ro-k8s"
+    channel: "%(channel)s"
+    scale: 3
+    series: kubernetes
+    storage:
+      log: 50M
+    options:
+      vim_database: "mano_vim_db"
+      ro_database: "mano_db"
+      OPENMANO_TENANT: "osm"
+    annotations:
+      gui-x: -500
+      gui-y: 600
+  ui-k8s:
+    charm: "cs:~charmed-osm/ui-k8s"
+    channel: "%(channel)s"
+    scale: 3
+    series: kubernetes
+    options:
+      mysql_database: lwui
+    annotations:
+      gui-x: 500
+      gui-y: -400
+  lcm-k8s:
+    charm: "cs:~charmed-osm/lcm-k8s"
+    channel: "%(channel)s"
+    scale: 3
+    series: kubernetes
+    storage:
+      packages: 100M
+    options:
+      vca_host: vca
+      vca_port: 17070
+      vca_user: admin
+      vca_password: secret
+      vca_pubkey: pubkey
+      vca_cacert: cacert
+      vca_apiproxy: apiproxy
+      use_external_vca: true
+      DATABASE_COMMONKEY: osm
+    annotations:
+      gui-x: -500
+      gui-y: 100
+  mon-k8s:
+    charm: "cs:~charmed-osm/mon-k8s"
+    channel: "%(channel)s"
+    scale: 3
+    series: kubernetes
+    storage:
+      database: 100M
+    options:
+      OSMMON_OPENSTACK_DEFAULT_GRANULARITY: 300
+      OSMMON_GLOBAL_REQUEST_TIMEOUT: 10
+      OSMMON_GLOBAL_LOGLEVEL: INFO
+      OSMMON_DATABASE_COMMONKEY: osm
+      OSMMON_COLLECTOR_INTERVAL: 30
+      OSMMON_EVALUATOR_INTERVAL: 30
+      vca_host: vca
+      vca_user: admin
+      vca_password: secret
+      vca_cacert: cacert
+      use_external_vca: true
+    annotations:
+      gui-x: 500
+      gui-y: 100
+  pol-k8s:
+    charm: "cs:~charmed-osm/pol-k8s"
+    channel: "%(channel)s"
+    scale: 3
+    series: kubernetes
+    storage:
+      database: 100M
+    options:
+      log_level: INFO
+    annotations:
+      gui-x: -500
+      gui-y: 1100
+  prometheus-k8s:
+    charm: "cs:~charmed-osm/prometheus-k8s"
+    channel: "stable"
+    scale: 3
+    series: kubernetes
+    storage:
+      database: 100M
+    options:
+      advertised-port: 9090
+      web-subpath: /
+      default-target: "mon-k8s:8000"
+    annotations:
+      gui-x: 500
+      gui-y: 600
+  grafana-k8s:
+    charm: "cs:~charmed-osm/grafana-k8s"
+    channel: "stable"
+    scale: 3
+    series: kubernetes
+    annotations:
+      gui-x: 500
+      gui-y: 1100
+
+relations:
+  - - "kafka-k8s:zookeeper"
+    - "zookeeper-k8s:zookeeper"
+  - - "ro-k8s:mysql"
+    - "mariadb-k8s:mysql"
+  - - "nbi-k8s:mongo"
+    - "mongodb-k8s:mongo"
+  - - "nbi-k8s:kafka"
+    - "kafka-k8s:kafka"
+  - - "lcm-k8s:kafka"
+    - "kafka-k8s:kafka"
+  - - "lcm-k8s:mongo"
+    - "mongodb-k8s:mongo"
+  - - "mon-k8s:kafka"
+    - "kafka-k8s:kafka"
+  - - "mon-k8s:mongo"
+    - "mongodb-k8s:mongo"
+  - - "pol-k8s:kafka"
+    - "kafka-k8s:kafka"
+  - - "pol-k8s:mongo"
+    - "mongodb-k8s:mongo"
+  - - "lcm-k8s:ro"
+    - "ro-k8s:ro"
+  - - "prometheus-k8s:prometheus"
+    - "mon-k8s:prometheus"
+  - - "grafana-k8s:prometheus"
+    - "prometheus-k8s:prometheus"
+  - - "ui-k8s:mysql"
+    - "mariadb-k8s:mysql"
+  - - "ui-k8s:nbi"
+    - "nbi-k8s:nbi"
+  - - "prometheus-k8s:prometheus"
+    - "nbi-k8s:prometheus"
diff --git a/installers/charm/bundles/osm/bundle.yaml b/installers/charm/bundles/osm/bundle.yaml
new file mode 100644 (file)
index 0000000..fc3dbcb
--- /dev/null
@@ -0,0 +1,230 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+description: Single instance OSM bundle
+bundle: kubernetes
+applications:
+  zookeeper-k8s:
+    charm: 'cs:~charmed-osm/zookeeper-k8s'
+    channel: 'stable'
+    scale: 1
+    series: kubernetes
+    storage:
+      database: 100M
+    options:
+      # client-port: 2181
+      server-port: 2888
+      leader-election-port: 3888
+      zookeeper-units: 1
+    annotations:
+      gui-x: 0
+      gui-y: 1100
+  mariadb-k8s:
+    charm: 'cs:~charmed-osm/mariadb-k8s'
+    channel: 'stable'
+    scale: 1
+    series: kubernetes
+    storage:
+      database: 50M
+    options:
+      password: manopw
+      root_password: osm4u
+      user: mano
+      database: database
+      mysql_port: "3306"
+      query-cache-type: "OFF"
+      query-cache-size: 0
+      ha-mode: false
+    annotations:
+      gui-x: -500
+      gui-y: -400
+  kafka-k8s:
+    charm: 'cs:~charmed-osm/kafka-k8s'
+    channel: 'stable'
+    scale: 1
+    series: kubernetes
+    storage:
+      database: 100M
+    options:
+      advertised-hostname: "kafka-k8s"
+      advertised-port: 9092
+      kafka-units: 1
+      zookeeper-units: 1
+      zookeeper-service-name: zookeeper-k8s-endpoints
+    annotations:
+      gui-x: 0
+      gui-y: 600
+  mongodb-k8s:
+    charm: 'cs:~charmed-osm/mongodb-k8s'
+    channel: 'stable'
+    scale: 1
+    series: kubernetes
+    storage:
+      database: 50M
+    options:
+      advertised-port: 27017
+      replica-set: rs0
+      namespace: osm
+      service-name: mongodb-k8s-endpoints
+      cluster-domain: cluster.local
+      enable-sidecar: false
+    annotations:
+      gui-x: 0
+      gui-y: 100
+  nbi-k8s:
+    charm: '%(prefix)s/nbi-k8s%(suffix)s'
+    channel: '%(channel)s'
+    scale: 1
+    series: kubernetes
+    storage:
+      packages: 50M
+    options:
+      log_level: "INFO"
+      DATABASE_COMMONKEY: osm
+    annotations:
+      gui-x: 0
+      gui-y: -400
+  ro-k8s:
+    charm: '%(prefix)s/ro-k8s%(suffix)s'
+    channel: '%(channel)s'
+    scale: 1
+    series: kubernetes
+    storage:
+      log: 50M
+    options:
+      vim_database: 'mano_vim_db'
+      ro_database: 'mano_db'
+      OPENMANO_TENANT: 'osm'
+    annotations:
+      gui-x: -500
+      gui-y: 600
+  ui-k8s:
+    charm: '%(prefix)s/ui-k8s%(suffix)s'
+    channel: '%(channel)s'
+    scale: 1
+    series: kubernetes
+    options:
+      mysql_database: lwui
+    annotations:
+      gui-x: 500
+      gui-y: -400
+  lcm-k8s:
+    charm: '%(prefix)s/lcm-k8s%(suffix)s'
+    channel: '%(channel)s'
+    scale: 1
+    series: kubernetes
+    storage:
+      packages: 50M
+    options:
+      vca_host: vca
+      vca_port: 17070
+      vca_user: admin
+      vca_password: secret
+      vca_pubkey: pubkey
+      vca_cacert: cacert
+      vca_apiproxy: apiproxy
+      use_external_vca: false
+      DATABASE_COMMONKEY: osm
+    annotations:
+      gui-x: -500
+      gui-y: 100
+  mon-k8s:
+    charm: '%(prefix)s/mon-k8s%(suffix)s'
+    channel: '%(channel)s'
+    scale: 1
+    series: kubernetes
+    storage:
+      database: 100M
+    options:
+      OSMMON_OPENSTACK_DEFAULT_GRANULARITY: 300
+      OSMMON_GLOBAL_REQUEST_TIMEOUT: 10
+      OSMMON_GLOBAL_LOGLEVEL: INFO
+      OSMMON_DATABASE_COMMONKEY: osm
+      OSMMON_COLLECTOR_INTERVAL: 30
+      OSMMON_EVALUATOR_INTERVAL: 30
+      vca_host: vca
+      vca_user: admin
+      vca_password: secret
+      vca_cacert: cacert
+      use_external_vca: false
+    annotations:
+      gui-x: 500
+      gui-y: 100
+  pol-k8s:
+    charm: '%(prefix)s/pol-k8s%(suffix)s'
+    channel: '%(channel)s'
+    scale: 1
+    series: kubernetes
+    storage:
+      database: 100M
+    options:
+      log_level: INFO
+    annotations:
+      gui-x: -500
+      gui-y: 1100
+  prometheus-k8s:
+    charm: 'cs:~charmed-osm/prometheus-k8s'
+    channel: 'stable'
+    scale: 1
+    series: kubernetes
+    storage:
+      database: 50M
+    options:
+      advertised-port: 9090
+      web-subpath: /
+      default-target: "mon-k8s:8000"
+    annotations:
+      gui-x: 500
+      gui-y: 600
+  grafana-k8s:
+    charm: 'cs:~charmed-osm/grafana-k8s'
+    channel: 'stable'
+    scale: 1
+    series: kubernetes
+    annotations:
+      gui-x: 500
+      gui-y: 1100
+
+relations:
+  - - 'kafka-k8s:zookeeper'
+    - 'zookeeper-k8s:zookeeper'
+  - - 'ro-k8s:mysql'
+    - 'mariadb-k8s:mysql'
+  - - 'nbi-k8s:mongo'
+    - 'mongodb-k8s:mongo'
+  - - 'nbi-k8s:kafka'
+    - 'kafka-k8s:kafka'
+  - - 'lcm-k8s:kafka'
+    - 'kafka-k8s:kafka'
+  - - 'lcm-k8s:mongo'
+    - 'mongodb-k8s:mongo'
+  - - 'mon-k8s:kafka'
+    - 'kafka-k8s:kafka'
+  - - 'mon-k8s:mongo'
+    - 'mongodb-k8s:mongo'
+  - - 'pol-k8s:kafka'
+    - 'kafka-k8s:kafka'
+  - - 'pol-k8s:mongo'
+    - 'mongodb-k8s:mongo'
+  - - 'lcm-k8s:ro'
+    - 'ro-k8s:ro'
+  - - 'prometheus-k8s:prometheus'
+    - 'mon-k8s:prometheus'
+  - - 'grafana-k8s:prometheus'
+    - 'prometheus-k8s:prometheus'
+  - - 'ui-k8s:mysql'
+    - 'mariadb-k8s:mysql'
+  - - 'ui-k8s:nbi'
+    - 'nbi-k8s:nbi'
+  - - 'prometheus-k8s:prometheus'
+    - 'nbi-k8s:prometheus'
diff --git a/installers/charm/generate_bundle.py b/installers/charm/generate_bundle.py
new file mode 100644 (file)
index 0000000..95ffeaa
--- /dev/null
@@ -0,0 +1,65 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+import json
+import argparse
+
+CHANNEL_LIST = [
+    "stable",
+    "candidate",
+    "edge",
+]
+BUNDLE_PREFIX = "cs:~charmed-osm"
+DEFAULT_BUNDLE = "bundles/osm/bundle.yaml"
+HA_BUNDLE = "bundles/osm-ha/bundle.yaml"
+
+parser = argparse.ArgumentParser(description="Process some arguments.")
+
+parser.add_argument("--channel", help="Channel from the Charm Store")
+parser.add_argument("--destination", help="Destination for the generated bundle")
+parser.add_argument("--ha", help="Select HA bundle", action="store_true")
+parser.add_argument("--local", help="Path to the bundle directory", action="store_true")
+parser.add_argument("--store", help="Path to the bundle directory", action="store_true")
+
+args = parser.parse_args()
+print(args)
+if not args.local and not args.store:
+    raise Exception("--local or --store must be specified")
+if args.local and args.store:
+    raise Exception("Both --local and --store cannot be specified. Please choose one.")
+if not args.destination:
+    raise Exception("--destination must be specified")
+if args.channel and not args.channel in CHANNEL_LIST:
+    raise Exception(
+        "Channel {} does not exist. Please choose one of these: {}".format(
+            args.channel, CHANNEL_LIST
+        )
+    )
+channel = args.channel if args.channel else "stable"
+path = HA_BUNDLE if args.ha else DEFAULT_BUNDLE
+destination = args.destination
+prefix = "." if args.local else BUNDLE_PREFIX
+suffix = "/release" if args.local else ""
+
+data = {
+    "channel": channel,
+    "prefix": prefix,
+    "suffix": suffix,
+}
+
+with open(path) as template:
+    bundle_template = template.read()
+    template.close()
+with open("{}".format(destination), "w") as text_file:
+    text_file.write(bundle_template % data)
+    text_file.close()
diff --git a/installers/charm/interfaces/osm-nbi/README.md b/installers/charm/interfaces/osm-nbi/README.md
new file mode 100644 (file)
index 0000000..8fb9523
--- /dev/null
@@ -0,0 +1,63 @@
+<!--
+Copyright 2020 Canonical Ltd.
+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. -->
+
+# Overview
+
+This interface layer handles communication between Mongodb and its clients.
+
+## Usage
+
+### Provides
+
+To implement this relation to offer an nbi:
+
+In your charm's metadata.yaml:
+
+```yaml
+provides:
+    nbi:
+        interface: osm-nbi
+```
+
+reactive/mynbi.py:
+
+```python
+@when('nbi.joined')
+def send_config(nbi):
+    nbi.send_connection(
+        unit_get('private-address'),
+        get_nbi_port()
+    )
+```
+
+### Requires
+
+If you would like to use an nbi from your charm:
+
+metadata.yaml:
+
+```yaml
+requires:
+    nbi:
+        interface: osm-nbi
+```
+
+reactive/mycharm.py:
+
+```python
+@when('nbi.ready')
+def nbi_ready():
+    nbi = endpoint_from_flag('nbi.ready')
+    if nbi:
+        for unit in nbi.nbis():
+            add_nbi(unit['host'], unit['port'])
+```
diff --git a/installers/charm/interfaces/osm-nbi/copyright b/installers/charm/interfaces/osm-nbi/copyright
new file mode 100644 (file)
index 0000000..dd9405e
--- /dev/null
@@ -0,0 +1,16 @@
+Format: http://dep.debian.net/deps/dep5/
+
+Files: *
+Copyright: Copyright 2020, Canonical Ltd., All Rights Reserved.
+License: Apache License 2.0
+ 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.
\ No newline at end of file
diff --git a/installers/charm/interfaces/osm-nbi/interface.yaml b/installers/charm/interfaces/osm-nbi/interface.yaml
new file mode 100644 (file)
index 0000000..ec8ee86
--- /dev/null
@@ -0,0 +1,16 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+name: osm-nbi
+summary: Interface for relating to a OSM Northbound Interface
+maintainer: '"Adam Israel" <adam@adamisrael.com>'
diff --git a/installers/charm/interfaces/osm-nbi/provides.py b/installers/charm/interfaces/osm-nbi/provides.py
new file mode 100644 (file)
index 0000000..7ff3199
--- /dev/null
@@ -0,0 +1,44 @@
+#!/usr/bin/python
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+
+from charms.reactive import RelationBase
+from charms.reactive import hook
+from charms.reactive import scopes
+
+
+class OsmNBIProvides(RelationBase):
+    scope = scopes.GLOBAL
+
+    @hook("{provides:osm-nbi}-relation-joined")
+    def joined(self):
+        self.set_state("{relation_name}.joined")
+
+    @hook("{provides:osm-nbi}-relation-changed")
+    def changed(self):
+        self.set_state("{relation_name}.ready")
+
+    @hook("{provides:osm-nbi}-relation-{broken,departed}")
+    def broken_departed(self):
+        self.remove_state("{relation_name}.ready")
+        self.remove_state("{relation_name}.joined")
+
+    @hook("{provides:osm-nbi}-relation-broken")
+    def broken(self):
+        self.set_state("{relation_name}.removed")
+
+    def send_connection(self, host, port=9999):
+        conv = self.conversation()
+        conv.set_remote("host", host)
+        conv.set_remote("port", port)
diff --git a/installers/charm/interfaces/osm-nbi/requires.py b/installers/charm/interfaces/osm-nbi/requires.py
new file mode 100644 (file)
index 0000000..a5e8e29
--- /dev/null
@@ -0,0 +1,56 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+
+from charms.reactive import RelationBase
+from charms.reactive import hook
+from charms.reactive import scopes
+
+
+class OsmNBIRequires(RelationBase):
+    scope = scopes.GLOBAL
+
+    @hook("{requires:osm-nbi}-relation-joined")
+    def joined(self):
+        conv = self.conversation()
+        conv.set_state("{relation_name}.joined")
+
+    @hook("{requires:osm-nbi}-relation-changed")
+    def changed(self):
+        conv = self.conversation()
+        if self.nbis():
+            conv.set_state("{relation_name}.ready")
+        else:
+            conv.remove_state("{relation_name}.ready")
+
+    @hook("{requires:osm-nbi}-relation-departed")
+    def departed(self):
+        conv = self.conversation()
+        conv.remove_state("{relation_name}.ready")
+        conv.remove_state("{relation_name}.joined")
+
+    def nbis(self):
+        """Return the NBI's host and port.
+
+        [{
+            'host': <host>,
+            'port': <port>,
+        }]
+        """
+        nbis = []
+        for conv in self.conversations():
+            port = conv.get_remote("port")
+            host = conv.get_remote("host") or conv.get_remote("private-address")
+            if host and port:
+                nbis.append({"host": host, "port": port})
+        return nbis
diff --git a/installers/charm/interfaces/osm-ro/README.md b/installers/charm/interfaces/osm-ro/README.md
new file mode 100644 (file)
index 0000000..eb6413a
--- /dev/null
@@ -0,0 +1,63 @@
+<!--
+Copyright 2020 Canonical Ltd.
+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. -->
+
+# Overview
+
+This interface layer handles communication between OSM's RO and its clients.
+
+## Usage
+
+### Provides
+
+To implement this relation to offer an ro:
+
+In your charm's metadata.yaml:
+
+```yaml
+provides:
+    ro:
+        interface: osm-ro
+```
+
+reactive/myro.py:
+
+```python
+@when('ro.joined')
+def send_config(ro):
+    ro.send_connection(
+        unit_get('private-address'),
+        get_ro_port()
+    )
+```
+
+### Requires
+
+If you would like to use a rodb from your charm:
+
+metadata.yaml:
+
+```yaml
+requires:
+    ro:
+        interface: osm-ro
+```
+
+reactive/mycharm.py:
+
+```python
+@when('ro.ready')
+def ro_ready():
+    ro = endpoint_from_flag('ro.ready')
+    if ro:
+        for unit in ro.ros():
+            add_ro(unit['host'], unit['port'])
+```
diff --git a/installers/charm/interfaces/osm-ro/copyright b/installers/charm/interfaces/osm-ro/copyright
new file mode 100644 (file)
index 0000000..9270d6c
--- /dev/null
@@ -0,0 +1,16 @@
+Format: http://dep.debian.net/deps/dep5/
+
+Files: *
+Copyright: Copyright 2020, Canonical Ltd., All Rights Reserved.
+License: Apache License 2.0
+ 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.
diff --git a/installers/charm/interfaces/osm-ro/interface.yaml b/installers/charm/interfaces/osm-ro/interface.yaml
new file mode 100644 (file)
index 0000000..9a12872
--- /dev/null
@@ -0,0 +1,16 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+name: osm-ro
+summary: Interface for relating to a OSM Resource Orchestrator
+maintainer: '"Adam Israel" <adam@adamisrael.com>'
diff --git a/installers/charm/interfaces/osm-ro/provides.py b/installers/charm/interfaces/osm-ro/provides.py
new file mode 100644 (file)
index 0000000..f577319
--- /dev/null
@@ -0,0 +1,44 @@
+#!/usr/bin/python
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+
+from charms.reactive import RelationBase
+from charms.reactive import hook
+from charms.reactive import scopes
+
+
+class OsmROProvides(RelationBase):
+    scope = scopes.GLOBAL
+
+    @hook("{provides:osm-ro}-relation-joined")
+    def joined(self):
+        self.set_state("{relation_name}.joined")
+
+    @hook("{provides:osm-ro}-relation-changed")
+    def changed(self):
+        self.set_state("{relation_name}.ready")
+
+    @hook("{provides:osm-ro}-relation-{broken,departed}")
+    def broken_departed(self):
+        self.remove_state("{relation_name}.ready")
+        self.remove_state("{relation_name}.joined")
+
+    @hook("{provides:osm-ro}-relation-broken")
+    def broken(self):
+        self.set_state("{relation_name}.removed")
+
+    def send_connection(self, host, port=9090):
+        conv = self.conversation()
+        conv.set_remote("host", host)
+        conv.set_remote("port", port)
diff --git a/installers/charm/interfaces/osm-ro/requires.py b/installers/charm/interfaces/osm-ro/requires.py
new file mode 100644 (file)
index 0000000..fc8f0f4
--- /dev/null
@@ -0,0 +1,56 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+
+from charms.reactive import RelationBase
+from charms.reactive import hook
+from charms.reactive import scopes
+
+
+class OsmRORequires(RelationBase):
+    scope = scopes.GLOBAL
+
+    @hook("{requires:osm-ro}-relation-joined")
+    def joined(self):
+        conv = self.conversation()
+        conv.set_state("{relation_name}.joined")
+
+    @hook("{requires:osm-ro}-relation-changed")
+    def changed(self):
+        conv = self.conversation()
+        if self.ros():
+            conv.set_state("{relation_name}.ready")
+        else:
+            conv.remove_state("{relation_name}.ready")
+
+    @hook("{requires:osm-ro}-relation-departed")
+    def departed(self):
+        conv = self.conversation()
+        conv.remove_state("{relation_name}.ready")
+        conv.remove_state("{relation_name}.joined")
+
+    def ros(self):
+        """Return the NBI's host and port.
+
+        [{
+            'host': <host>,
+            'port': <port>,
+        }]
+        """
+        ros = []
+        for conv in self.conversations():
+            port = conv.get_remote("port")
+            host = conv.get_remote("host") or conv.get_remote("private-address")
+            if host and port:
+                ros.append({"host": host, "port": port})
+        return ros
diff --git a/installers/charm/layers/osm-common/README.md b/installers/charm/layers/osm-common/README.md
new file mode 100644 (file)
index 0000000..c55b97b
--- /dev/null
@@ -0,0 +1,17 @@
+<!-- Copyright 2020 Canonical Ltd.
+
+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. -->
+
+# README
+
+WIP. Layer to share common functionality to write/deploy k8s charms for OSM demo
diff --git a/installers/charm/layers/osm-common/layer.yaml b/installers/charm/layers/osm-common/layer.yaml
new file mode 100644 (file)
index 0000000..6e8379a
--- /dev/null
@@ -0,0 +1,13 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
\ No newline at end of file
diff --git a/installers/charm/layers/osm-common/lib/charms/osm/k8s.py b/installers/charm/layers/osm-common/lib/charms/osm/k8s.py
new file mode 100644 (file)
index 0000000..9735517
--- /dev/null
@@ -0,0 +1,76 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+
+from charmhelpers.core.hookenv import (
+    network_get,
+    relation_id,
+    log,
+)
+
+
+def get_service_ip(endpoint):
+    try:
+        info = network_get(endpoint, relation_id())
+        if 'ingress-addresses' in info:
+            addr = info['ingress-addresses'][0]
+            if len(addr):
+                return addr
+        else:
+            log("No ingress-addresses: {}".format(info))
+    except Exception as e:
+        log("Caught exception checking for service IP: {}".format(e))
+
+    return None
+
+
+def is_pod_up(endpoint):
+    """Check to see if the pod of a relation is up.
+
+    application-vimdb: 19:29:10 INFO unit.vimdb/0.juju-log network info
+
+    In the example below:
+    - 10.1.1.105 is the address of the application pod.
+    - 10.152.183.199 is the service cluster ip
+
+    {
+        'bind-addresses': [{
+            'macaddress': '',
+            'interfacename': '',
+            'addresses': [{
+                'hostname': '',
+                'address': '10.1.1.105',
+                'cidr': ''
+            }]
+        }],
+        'egress-subnets': [
+            '10.152.183.199/32'
+        ],
+        'ingress-addresses': [
+            '10.152.183.199',
+            '10.1.1.105'
+        ]
+    }
+    """
+    try:
+        info = network_get(endpoint, relation_id())
+
+        # Check to see if the pod has been assigned it's internal and
+        # external ips
+        for ingress in info['ingress-addresses']:
+            if len(ingress) == 0:
+                return False
+    except:
+        return False
+
+    return True
diff --git a/installers/charm/layers/osm-common/metadata.yaml b/installers/charm/layers/osm-common/metadata.yaml
new file mode 100644 (file)
index 0000000..6e8379a
--- /dev/null
@@ -0,0 +1,13 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
\ No newline at end of file
diff --git a/installers/charm/layers/osm-common/reactive/osm_common.py b/installers/charm/layers/osm-common/reactive/osm_common.py
new file mode 100644 (file)
index 0000000..6e8379a
--- /dev/null
@@ -0,0 +1,13 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
\ No newline at end of file
diff --git a/installers/charm/lcm-k8s/.yamllint.yaml b/installers/charm/lcm-k8s/.yamllint.yaml
new file mode 100644 (file)
index 0000000..86049d2
--- /dev/null
@@ -0,0 +1,25 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+---
+
+extends: default
+
+yaml-files:
+  - '*.yaml'
+  - '*.yml'
+  - '.yamllint'
+ignore: |
+ reactive/
+ .tox
+ release/
diff --git a/installers/charm/lcm-k8s/README.md b/installers/charm/lcm-k8s/README.md
new file mode 100644 (file)
index 0000000..7b8d3fd
--- /dev/null
@@ -0,0 +1,100 @@
+<!--
+Copyright 2020 Canonical Ltd.
+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. -->
+
+# Overview
+
+LCM for Juju CAAS
+
+## Testing
+
+The tests of this charm are done using tox and Zaza.
+
+
+
+### Prepare environment
+
+The machine in which the tests are run needs access to a juju k8s controller. The easiest way to approach this is by executing the following commands:
+
+```
+sudo apt install tox -y
+sudo snap install microk8s --classic
+sudo snap install juju
+
+microk8s.status --wait-ready
+microk8s.enable storage dashboard dns
+
+juju bootstrap microk8s k8s-cloud
+```
+
+If /usr/bin/python does not exist, you should probably need to do this:
+
+```
+sudo ln -s /usr/bin/python3 /usr/bin/python
+```
+### Build Charm
+
+**Download dependencies:**
+
+```
+mkdir -p ~/charm/layers ~/charm/build ~/charm/interfaces
+git clone https://git.launchpad.net/canonical-osm ~/canonical-osm
+
+cd ~/charm/layers
+git clone https://git.launchpad.net/charm-osm-lcm lcm-k8s
+git clone https://git.launchpad.net/charm-osm-ro ro-k8s
+git clone https://git.launchpad.net/charm-k8s-kafka kafka-k8s ~/charm/interfaces
+git clone https://git.launchpad.net/charm-k8s-zookeeper zookeeper-k8s
+git clone https://git.launchpad.net/charm-k8s-mongodb mongodb-k8s
+git clone https://git.launchpad.net/charm-k8s-mariadb mariadb-k8s
+git clone https://git.launchpad.net/charm-osm-ro ro-k8s
+
+cd ~/charm/interfaces
+mv ~/canonical-osm/charms/interfaces/* .
+git clone https://git.launchpad.net/interface-mongodb mongodb
+git clone https://git.launchpad.net/interface-osm-ro osm-ro
+
+```
+
+**Charm structure:**
+
+```
+├── config.yaml
+├── icon.svg
+├── layer.yaml
+├── metadata.yaml
+├── reactive
+│   ├── spec_template.yaml
+│   └── lcm.py
+├── README.md
+└── tox.ini
+```
+
+**Setup environment variables:**
+
+```
+export CHARM_LAYERS_DIR=~/charm/layers
+export CHARM_BUILD_DIR=~/charm/build
+export CHARM_INTERFACES_DIR=~/charm/interfaces
+```
+
+**Build:**
+
+```
+mkdir ~/charm/layers/lcm-k8s/tests/build
+charm build ~/charm/layers/lcm-k8s
+charm build ~/charm/layers/kafka-k8s
+charm build ~/charm/layers/zookeeper-k8s
+charm build ~/charm/layers/mongodb-k8s
+charm build ~/charm/layers/mariadb-k8s
+charm build ~/charm/layers/ro-k8s
+mv ~/charm/build/* ~/charm/layers/lcm-k8s/tests/build/
+```
diff --git a/installers/charm/lcm-k8s/config.yaml b/installers/charm/lcm-k8s/config.yaml
new file mode 100644 (file)
index 0000000..c27377f
--- /dev/null
@@ -0,0 +1,64 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+options:
+  vca_host:
+    type: string
+    description: "The VCA host."
+    default: "admin"
+  vca_port:
+    type: int
+    description: "The VCA port."
+    default: 17070
+  vca_user:
+    type: string
+    description: "The VCA user name."
+    default: "admin"
+  vca_password:
+    type: string
+    description: "The VCA user password."
+    default: "secret"
+  vca_pubkey:
+    type: string
+    description: "The VCA public key."
+    default: "secret"
+  vca_cacert:
+    type: string
+    description: "The VCA cacert."
+    default: ""
+  vca_apiproxy:
+    type: string
+    description: "The VCA api proxy (native charms)"
+    default: ""
+  vca_cloud:
+    type: string
+    description: "The VCA lxd cloud name"
+    default: "localhost"
+  advertised-hostname:
+    description: LCM Hostname
+    type: string
+    default: "lcm-k8s"
+  use_external_vca:
+    description: |
+      Boolean to deside whether LCM should wait
+      for an external VCA or not (using osm-vca interface)
+    type: boolean
+    default: false
+  DATABASE_COMMONKEY:
+    description: Database COMMONKEY
+    type: string
+    default: osm
+  image:
+    type: string
+    description: OCI image
+    default: opensourcemano/lcm:7
diff --git a/installers/charm/lcm-k8s/icon.svg b/installers/charm/lcm-k8s/icon.svg
new file mode 100644 (file)
index 0000000..da31b4a
--- /dev/null
@@ -0,0 +1,118 @@
+<!--
+Copyright 2020 Canonical Ltd.
+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. -->
+
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="100px"
+   height="100px"
+   viewBox="0 0 100 100"
+   version="1.1"
+   id="svg18"
+   sodipodi:docname="template.svg"
+   inkscape:version="0.92.4 (f8dce91, 2019-08-02)">
+  <metadata
+     id="metadata22">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>eclispe-che</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="2880"
+     inkscape:window-height="1736"
+     id="namedview20"
+     showgrid="false"
+     inkscape:pagecheckerboard="true"
+     inkscape:zoom="2.36"
+     inkscape:cx="100.57842"
+     inkscape:cy="-9.2650043"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer2" />
+  <!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
+  <title
+     id="title2">eclispe-che</title>
+  <desc
+     id="desc4">Created with Sketch.</desc>
+  <defs
+     id="defs7">
+    <path
+       d="M50.0004412,4.04252804e-14 C22.3871247,4.04252804e-14 0,22.3848726 0,49.9995588 C0,77.6133626 22.3871247,100 50.0004412,100 C77.6137577,100 100,77.6133626 100,49.9995588 C100,22.3848726 77.6128753,3.55271368e-14 50.0004412,4.04252804e-14 Z"
+       id="path-1" />
+  </defs>
+  <g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="BACKGROUND">
+    <g
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-opacity:1"
+       id="Page-1">
+      <g
+         id="eclispe-che"
+         style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1">
+        <g
+           id="path3023-path"
+           style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1">
+          <use
+             xlink:href="#path-1"
+             id="use9"
+             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-opacity:1"
+             x="0"
+             y="0"
+             width="100%"
+             height="100%" />
+          <path
+             d="M 50.000441,0.5 C 22.662621,0.5 0.5,22.661661 0.5,49.999559 0.5,77.337051 22.663098,99.5 50.000441,99.5 77.337613,99.5 99.5,77.337222 99.5,49.999559 99.5,22.661796 77.337514,0.5 50.000441,0.5 Z"
+             id="path11"
+             style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="PLACE LOGO HERE">
+    <image
+       y="-9.851697"
+       x="-8.0254316"
+       id="image829"
+       xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApgAAAK8CAYAAABLDM/pAAAABHNCSVQICAgIfAhkiAAAIABJREFU eJzs3Xl4lOX1//E3mRkyZMhkCCEJIWwJ+yaJC6CIYhBFEBUQUNEiUpeqaGttbYtLrf3a6te2or/S 9mvBonVDEbAURFDECogCsexLMJAQSEJ2AjNMJvz+GCaGECDLJM/M5PO6rlxKMs/znEhMTu773OeA iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIhRWhkdgIhICLMAQ4DOQDmwCThkaEQiIiIiErQeBrKAUzXe VgADDIxLRERERIKMBfgnZyeW1d9KgFFGBSgi0tS0RS4ioaI9YD391ub0P6n2vpqcp998ik7/sxg4 CZQ1MI4ngOfr8LpCoBdQ0MDniIgELCWYIhKoOgEdgQSg6+l/xgFRQCzgOP1mP/3WFEpPvx0FcvHW UebhTUJzTr8/HzgCHDh9TXY94nkZeNSP8YqIBAQlmCJilEigNzAYSAa6nH7rCCQC4Q25qcVqA6B1 dPyZ77d9n/O5y0vPuu5k4RFOuU9S4XE35LE+Luoetwc4jPcAkIhISFGCKSJNrT2QAvQF+gHdgf54 k8jzsjpisXboRHT3zlijY7C2a094ZBStI+2E2x2ERzkItzto3TYSS0RbTOENyknP4izy7lqfPFaG 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 NCuTVT97iM1zf0f+ti2UHz6Au6yIipICCvbtJPvLT6sS1YYmhyZLGAc+W05pTi4DbpveuE8ywGWs WMyqR+/meN5BrI5Yrvn9XPpNmd7geu/sdWvYvfhNrI5Yhv/qeb/UjZvbRNA60k72l59yInsr7VNv JMwSmN+X/MHWqS+cOsWxA+kA44ANwH5jo5LmpC1yaQrJwDMAl//q+SZt6ZK/PZ1l901j5SN3Ubx3 C2aThYfih7Kp/0ye6nJNs7UaaqgyjwuACHMbgyORxhpm78KKftOZ32Miia3tlOdksPKRu1h237Qz tqmz161hye1jzui76lO9ufwp90k2z32RZfdNa9C2e7eRYzCbLJTnZJC/Pb0hn1LA87hcrPnVQ3z+ 5CzcznLiUkcw4b2PG90cf9+y9wFIun6cX3uf9r31Lhw9U3A7yzmy+kW/3TdQJYycQVzqCIBw4ANg gLERSXPSCqY0haVAUlzqCIb8+JdN8oDSrEzWvzCbr1565oytcN+KpTWs+U+qN8RRdzmv522mgymc ++IvMzocaSRTqzB6tYlhaswgTp06xeYTuZTlfMee99/kREkRAJ/+5B4q3M4L3ss3StSVl8ORbdvo deOEesUSZjZT9N1eijJ2Y7a2CaqJRHVRfdwjQOoDj5933GNdOYsKWPebn1N5qpKrnn3Z77svMX36 smfx25QfPkBk99SQGyNZU9vk4TiPbMVZeCQcGA8sQCMlWwStYIq/PQwMt1htXDn7Ob/f3FlUwIaX nmHxrWnsX7kU8M7s3jjg3qBYsaypuMKbaLTTCmZIiTJbearLNWwccC9pUclUeNzseGceKx+564xV yrqo8LjJ3byWnQsX1DuOHmMnAXBg7ef1vjaQ7Vy4gOX3TKQ8JwOrI5YbX1/K4BkP++Xe361aRoXH jaNnSpPsvnToP5h+U2cAcGjln6isOOn3ZwSSMHNrut78LFZHLEAisByINDYqaQ5KMMWfOgHPAVwy 6xd+/+acsWIxiyZfx4535lHhcZMWlcznA2YyJ2mcIQ3S/aGwQr/Ih7LE8Cje7j2FJX2mkdja3qh7 bfnbHDwuV72u6XjxMCxWW8hskzuLCljzq4dY/8JsKjxukkaPZ8J7H/u1Q8V/35wPQN9bJvrtnjUN nvEwVkcs5TkZHN38ryZ7TqAwR0SRfMcfsFhtAJcCfzE4JGkGSjDFn/4O2ONSR9RpDFtd+eosP39y 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 WYlWJEUkgilgikg4SbKdpDUAAAJjSURBVMK8LT0QRtcbQCL9m9luAB7ACziBVsABNANnu351dn3M C9Rjhkg3agckIiIiEnaqgPMDeNvQx+uk9nqzDWvVIiIiIhKynqD/4bIZc9VTRERERKRPqUAD/QuY /2ZRjSIiIiISZtZgrk5eLly+aFl1IiIiIhKWZgJbAT8XBssq4AsW1iUiMurpFrmIhLtMzH6aCUAt GpkoIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IhIR/j/m1Gy2udUkpAAAAABJRU5ErkJggg== "
+       style="image-rendering:optimizeQuality"
+       preserveAspectRatio="none"
+       height="120.55085"
+       width="113.50848" />
+  </g>
+</svg>
diff --git a/installers/charm/lcm-k8s/layer.yaml b/installers/charm/lcm-k8s/layer.yaml
new file mode 100644 (file)
index 0000000..56b1af9
--- /dev/null
@@ -0,0 +1,23 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+includes:
+  - "layer:caas-base"
+  - 'layer:status'
+  - 'layer:leadership'
+  - "layer:osm-common"
+  - 'interface:kafka'
+  - 'interface:mongodb'
+  - 'interface:osm-ro'
+
+repo: https://code.launchpad.net/osm-k8s-bundle
diff --git a/installers/charm/lcm-k8s/metadata.yaml b/installers/charm/lcm-k8s/metadata.yaml
new file mode 100644 (file)
index 0000000..b44074c
--- /dev/null
@@ -0,0 +1,37 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+name: "lcm-k8s"
+summary: "OSM LCM"
+maintainers:
+    - "SolutionsQA <solutionsqa@lists.canonical.com>"
+description: |
+  A CAAS charm to deploy OSM's LCM.
+tags:
+    - "application"
+series:
+    - "kubernetes"
+requires:
+    kafka:
+        interface: kafka
+    mongo:
+        interface: mongodb
+    ro:
+        interface: osm-ro
+storage:
+    packages:
+        type: filesystem
+        location: /app/storage
+deployment:
+    type: stateful
+    service: cluster
diff --git a/installers/charm/lcm-k8s/reactive/lcm.py b/installers/charm/lcm-k8s/reactive/lcm.py
new file mode 100644 (file)
index 0000000..85ec9c5
--- /dev/null
@@ -0,0 +1,134 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+from charms.layer.caas_base import pod_spec_set
+from charms.reactive import endpoint_from_flag
+from charms.reactive import when, when_not, hook
+from charms.reactive.flags import set_flag, clear_flag
+from charmhelpers.core.hookenv import (
+    log,
+    metadata,
+    config,
+)
+from charms import layer
+
+
+@hook("upgrade-charm")
+@when("leadership.is_leader")
+def upgrade():
+    clear_flag("lcm-k8s.configured")
+
+
+@when("config.changed")
+@when("leadership.is_leader")
+def restart():
+    clear_flag("lcm-k8s.configured")
+
+
+@when_not("kafka.ready")
+@when_not("lcm-k8s.configured")
+def waiting_for_kafka():
+    layer.status.waiting("Waiting for kafka to be ready")
+
+
+@when_not("mongo.ready")
+@when_not("lcm-k8s.configured")
+def waiting_for_mongo():
+    layer.status.waiting("Waiting for mongo to be ready")
+
+
+@when_not("ro.ready")
+@when_not("lcm-k8s.configured")
+def waiting_for_ro():
+    layer.status.waiting("Waiting for ro to be ready")
+
+
+@when("kafka.ready", "mongo.ready", "ro.ready")
+@when_not("lcm-k8s.configured")
+@when("leadership.is_leader")
+def configure():
+    layer.status.maintenance("Configuring lcm container")
+    try:
+        kafka = endpoint_from_flag("kafka.ready")
+        mongo = endpoint_from_flag("mongo.ready")
+        osm_ro = endpoint_from_flag("ro.ready")
+
+        if kafka and mongo and osm_ro:
+            kafka_units = kafka.kafkas()
+            kafka_unit = kafka_units[0]
+
+            mongo_uri = mongo.connection_string()
+            log("Mongo URI: {}".format(mongo_uri))
+
+            ros = osm_ro.ros()
+            ro_unit = ros[0]
+
+            if (
+                mongo_uri
+                and kafka_unit["host"]
+                and kafka_unit["port"]
+                and ro_unit["host"]
+                and ro_unit["port"]
+            ):
+                spec = make_pod_spec(
+                    ro_unit["host"],
+                    ro_unit["port"],
+                    kafka_unit["host"],
+                    kafka_unit["port"],
+                    mongo_uri,
+                )
+
+                log("set pod spec:\n{}".format(spec))
+                pod_spec_set(spec)
+                layer.status.active("creating container")
+                set_flag("lcm-k8s.configured")
+    except Exception as e:
+        layer.status.blocked("k8s spec failed to deploy: {}".format(e))
+
+
+@when("lcm-k8s.configured")
+def set_lcm_active():
+    layer.status.active("ready")
+
+
+def make_pod_spec(ro_host, ro_port, kafka_host, kafka_port, mongo_uri):
+    """Make pod specification for Kubernetes
+
+    Args:
+        ro_host (str): RO hostname or IP
+        ro_port (str): RO Port
+        kafka_host (str): Kafka hostname or IP
+        kafka_port (int): Kafka port
+        mongo_uri (str): Mongo URI
+    Returns:
+        pod_spec: Pod specification for Kubernetes
+    """
+
+    with open("reactive/spec_template.yaml") as spec_file:
+        pod_spec_template = spec_file.read()
+
+    cfg = config()
+    md = metadata()
+
+    data = {
+        "name": md.get("name"),
+        "docker_image": cfg.get("image"),
+        "ro_host": ro_host,
+        "ro_port": ro_port,
+        "kafka_host": kafka_host,
+        "kafka_port": kafka_port,
+        "mongo_uri": mongo_uri,
+    }
+    data.update(cfg)
+
+    return pod_spec_template % data
diff --git a/installers/charm/lcm-k8s/reactive/spec_template.yaml b/installers/charm/lcm-k8s/reactive/spec_template.yaml
new file mode 100644 (file)
index 0000000..1a27096
--- /dev/null
@@ -0,0 +1,49 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+version: 2
+containers:
+  - name: %(name)s
+    image: %(docker_image)s
+    ports:
+    # This is a fake port; lcm doesn't listen, since it's just reading
+    # and responding to the kafka bus. Fix this in post.
+    - containerPort: 9999
+      protocol: TCP
+    config:
+      ALLOW_ANONYMOUS_LOGIN: 'yes'
+      OSMLCM_RO_HOST: %(ro_host)s
+      OSMLCM_RO_PORT: %(ro_port)s
+      OSMLCM_RO_TENANT: osm
+
+      OSMLCM_MESSAGE_DRIVER: kafka
+      OSMLCM_MESSAGE_HOST: %(kafka_host)s
+      OSMLCM_MESSAGE_PORT: %(kafka_port)s
+      
+      OSMLCM_DATABASE_DRIVER: mongo
+      OSMLCM_DATABASE_URI: %(mongo_uri)s
+      OSMLCM_DATABASE_COMMONKEY: %(DATABASE_COMMONKEY)s
+
+      OSMLCM_STORAGE_DRIVER: mongo
+      OSMLCM_STORAGE_PATH: /app/storage
+      OSMLCM_STORAGE_COLLECTION: files
+      OSMLCM_STORAGE_URI: %(mongo_uri)s
+      
+      OSMLCM_VCA_HOST: %(vca_host)s
+      OSMLCM_VCA_PORT: %(vca_port)s
+      OSMLCM_VCA_USER: %(vca_user)s
+      OSMLCM_VCA_PUBKEY: %(vca_pubkey)s
+      OSMLCM_VCA_SECRET: %(vca_password)s
+      OSMLCM_VCA_CACERT: %(vca_cacert)s
+      OSMLCM_VCA_APIPROXY: %(vca_apiproxy)s
+      OSMLCM_VCA_CLOUD: %(vca_cloud)s
diff --git a/installers/charm/lcm-k8s/tox.ini b/installers/charm/lcm-k8s/tox.ini
new file mode 100644 (file)
index 0000000..43934c2
--- /dev/null
@@ -0,0 +1,64 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+[tox]
+envlist = pep8
+skipsdist = True
+
+[testenv]
+setenv = VIRTUAL_ENV={envdir}
+         PYTHONHASHSEED=0
+whitelist_externals = juju
+                      sleep
+passenv = HOME TERM CS_API_* OS_* AMULET_*
+install_command =
+  pip install {opts} {packages}
+
+[testenv:build]
+basepython = python3
+passenv=HTTP_PROXY HTTPS_PROXY NO_PROXY
+setenv = CHARM_LAYERS_DIR = ../layers
+         CHARM_INTERFACES_DIR = ../interfaces/
+whitelist_externals = git
+                      charm
+                      rm
+                      mv
+commands =
+    rm -rf release
+    rm -rf ../interfaces/mongodb
+    git clone https://git.launchpad.net/interface-mongodb ../interfaces/mongodb
+    charm build . --build-dir /tmp
+    mv /tmp/lcm-k8s/ release/
+
+[testenv:lint]
+basepython = python3
+deps =
+    black
+    yamllint
+    flake8
+commands =
+    black --check --diff . --exclude "release/|.tox/"
+    yamllint .
+    flake8 reactive/ --max-line-length=100
+
+[testenv:pep8]
+basepython = python3
+deps=charm-tools
+commands = charm-proof
+
+[testenv:func]
+basepython = python3
+commands = python -c "print('Done')"
+
+[testenv:venv]
+commands = {posargs}
diff --git a/installers/charm/lint.sh b/installers/charm/lint.sh
new file mode 100755 (executable)
index 0000000..1a4fa80
--- /dev/null
@@ -0,0 +1,27 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+#!/bin/bash
+set -eux
+function lint() {
+    cd $1
+    tox -e lint
+    cd ..
+}
+
+lint 'lcm-k8s'
+lint 'mon-k8s'
+lint 'nbi-k8s'
+lint 'pol-k8s'
+lint 'ro-k8s'
+lint 'ui-k8s'
diff --git a/installers/charm/mon-k8s/.yamllint.yaml b/installers/charm/mon-k8s/.yamllint.yaml
new file mode 100644 (file)
index 0000000..d24a69d
--- /dev/null
@@ -0,0 +1,24 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+---
+extends: default
+
+yaml-files:
+  - "*.yaml"
+  - "*.yml"
+  - ".yamllint"
+ignore: |
+  reactive/
+  .tox
+  release/
diff --git a/installers/charm/mon-k8s/README.md b/installers/charm/mon-k8s/README.md
new file mode 100644 (file)
index 0000000..9b09230
--- /dev/null
@@ -0,0 +1,95 @@
+<!--
+Copyright 2020 Canonical Ltd.
+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. -->
+
+# Overview
+
+MON for Juju CAAS
+
+## Testing
+
+The tests of this charm are done using tox and Zaza.
+
+
+
+### Prepare environment
+
+The machine in which the tests are run needs access to a juju k8s controller. The easiest way to approach this is by executing the following commands:
+
+```
+sudo apt install tox -y
+sudo snap install microk8s --classic
+sudo snap install juju
+
+microk8s.status --wait-ready
+microk8s.enable storage dashboard dns
+
+juju bootstrap microk8s k8s-cloud
+```
+
+If /usr/bin/python does not exist, you should probably need to do this:
+
+```
+sudo ln -s /usr/bin/python3 /usr/bin/python
+```
+### Build Charm
+
+**Download dependencies:**
+
+```
+mkdir -p ~/charm/layers ~/charm/build ~/charm/interfaces
+git clone https://git.launchpad.net/canonical-osm ~/canonical-osm
+
+cd ~/charm/layers
+git clone https://git.launchpad.net/charm-osm-mon mon-k8s
+git clone https://git.launchpad.net/charm-osm-ro ro-k8s
+git clone https://git.launchpad.net/charm-k8s-kafka kafka-k8s ~/charm/interfaces
+git clone https://git.launchpad.net/charm-k8s-zookeeper zookeeper-k8s
+git clone https://git.launchpad.net/charm-k8s-mongodb mongodb-k8s
+
+cd ~/charm/interfaces
+mv ~/canonical-osm/charms/interfaces/* .
+git clone https://git.launchpad.net/interface-mongodb mongodb
+
+```
+
+**Charm structure:**
+
+```
+├── config.yaml
+├── icon.svg
+├── layer.yaml
+├── metadata.yaml
+├── reactive
+│   ├── spec_template.yaml
+│   └── mon.py
+├── README.md
+└── tox.ini
+```
+
+**Setup environment variables:**
+
+```
+export CHARM_LAYERS_DIR=~/charm/layers
+export CHARM_BUILD_DIR=~/charm/build
+export CHARM_INTERFACES_DIR=~/charm/interfaces
+```
+
+**Build:**
+
+```
+mkdir ~/charm/layers/mon-k8s/tests/build
+charm build ~/charm/layers/mon-k8s
+charm build ~/charm/layers/kafka-k8s
+charm build ~/charm/layers/zookeeper-k8s
+charm build ~/charm/layers/mongodb-k8s
+mv ~/charm/build/* ~/charm/layers/mon-k8s/tests/build/
+```
diff --git a/installers/charm/mon-k8s/config.yaml b/installers/charm/mon-k8s/config.yaml
new file mode 100644 (file)
index 0000000..f8ea235
--- /dev/null
@@ -0,0 +1,70 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+options:
+  advertised-hostname:
+    description: MON Hostname
+    type: string
+    default: "mon-k8s"
+  advertised-port:
+    description: MON Port
+    type: int
+    default: 8000
+  OSMMON_OPENSTACK_DEFAULT_GRANULARITY:
+    description: Openstack default granularity
+    type: int
+    default: 300
+  OSMMON_GLOBAL_REQUEST_TIMEOUT:
+    description: Global request timeout
+    type: int
+    default: 10
+  OSMMON_GLOBAL_LOGLEVEL:
+    description: Global LOGLEVEL
+    type: string
+    default: INFO
+  OSMMON_DATABASE_COMMONKEY:
+    description: Database COMMONKEY
+    type: string
+    default: osm
+  OSMMON_COLLECTOR_INTERVAL:
+    description: Collector interval
+    type: int
+    default: 30
+  OSMMON_EVALUATOR_INTERVAL:
+    description: Evaluator interval
+    type: int
+    default: 30
+  vca_host:
+    type: string
+    description: "The VCA host."
+    default: "admin"
+  vca_user:
+    type: string
+    description: "The VCA user name."
+    default: "admin"
+  vca_password:
+    type: string
+    description: "The VCA user password."
+    default: "secret"
+  vca_cacert:
+    type: string
+    description: "The VCA cacert."
+    default: ""
+  use_external_vca:
+    description: Use an external VCA (deprecated)
+    type: boolean
+    default: false
+  image:
+    type: string
+    description: OCI image
+    default: opensourcemano/mon:7
diff --git a/installers/charm/mon-k8s/icon.svg b/installers/charm/mon-k8s/icon.svg
new file mode 100644 (file)
index 0000000..da31b4a
--- /dev/null
@@ -0,0 +1,118 @@
+<!--
+Copyright 2020 Canonical Ltd.
+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. -->
+
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="100px"
+   height="100px"
+   viewBox="0 0 100 100"
+   version="1.1"
+   id="svg18"
+   sodipodi:docname="template.svg"
+   inkscape:version="0.92.4 (f8dce91, 2019-08-02)">
+  <metadata
+     id="metadata22">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>eclispe-che</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="2880"
+     inkscape:window-height="1736"
+     id="namedview20"
+     showgrid="false"
+     inkscape:pagecheckerboard="true"
+     inkscape:zoom="2.36"
+     inkscape:cx="100.57842"
+     inkscape:cy="-9.2650043"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer2" />
+  <!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
+  <title
+     id="title2">eclispe-che</title>
+  <desc
+     id="desc4">Created with Sketch.</desc>
+  <defs
+     id="defs7">
+    <path
+       d="M50.0004412,4.04252804e-14 C22.3871247,4.04252804e-14 0,22.3848726 0,49.9995588 C0,77.6133626 22.3871247,100 50.0004412,100 C77.6137577,100 100,77.6133626 100,49.9995588 C100,22.3848726 77.6128753,3.55271368e-14 50.0004412,4.04252804e-14 Z"
+       id="path-1" />
+  </defs>
+  <g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="BACKGROUND">
+    <g
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-opacity:1"
+       id="Page-1">
+      <g
+         id="eclispe-che"
+         style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1">
+        <g
+           id="path3023-path"
+           style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1">
+          <use
+             xlink:href="#path-1"
+             id="use9"
+             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-opacity:1"
+             x="0"
+             y="0"
+             width="100%"
+             height="100%" />
+          <path
+             d="M 50.000441,0.5 C 22.662621,0.5 0.5,22.661661 0.5,49.999559 0.5,77.337051 22.663098,99.5 50.000441,99.5 77.337613,99.5 99.5,77.337222 99.5,49.999559 99.5,22.661796 77.337514,0.5 50.000441,0.5 Z"
+             id="path11"
+             style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="PLACE LOGO HERE">
+    <image
+       y="-9.851697"
+       x="-8.0254316"
+       id="image829"
+       xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApgAAAK8CAYAAABLDM/pAAAABHNCSVQICAgIfAhkiAAAIABJREFU eJzs3Xl4lOX1//E3mRkyZMhkCCEJIWwJ+yaJC6CIYhBFEBUQUNEiUpeqaGttbYtLrf3a6te2or/S 9mvBonVDEbAURFDECogCsexLMJAQSEJ2AjNMJvz+GCaGECDLJM/M5PO6rlxKMs/znEhMTu773OeA iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIhRWhkdgIhICLMAQ4DOQDmwCThkaEQiIiIiErQeBrKAUzXe VgADDIxLRERERIKMBfgnZyeW1d9KgFFGBSgi0tS0RS4ioaI9YD391ub0P6n2vpqcp998ik7/sxg4 CZQ1MI4ngOfr8LpCoBdQ0MDniIgELCWYIhKoOgEdgQSg6+l/xgFRQCzgOP1mP/3WFEpPvx0FcvHW UebhTUJzTr8/HzgCHDh9TXY94nkZeNSP8YqIBAQlmCJilEigNzAYSAa6nH7rCCQC4Q25qcVqA6B1 dPyZ77d9n/O5y0vPuu5k4RFOuU9S4XE35LE+Luoetwc4jPcAkIhISFGCKSJNrT2QAvQF+gHdgf54 k8jzsjpisXboRHT3zlijY7C2a094ZBStI+2E2x2ERzkItzto3TYSS0RbTOENyknP4izy7lqfPFaG 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 NCuTVT97iM1zf0f+ti2UHz6Au6yIipICCvbtJPvLT6sS1YYmhyZLGAc+W05pTi4DbpveuE8ywGWs WMyqR+/meN5BrI5Yrvn9XPpNmd7geu/sdWvYvfhNrI5Yhv/qeb/UjZvbRNA60k72l59yInsr7VNv JMwSmN+X/MHWqS+cOsWxA+kA44ANwH5jo5LmpC1yaQrJwDMAl//q+SZt6ZK/PZ1l901j5SN3Ubx3 C2aThYfih7Kp/0ye6nJNs7UaaqgyjwuACHMbgyORxhpm78KKftOZ32Miia3tlOdksPKRu1h237Qz tqmz161hye1jzui76lO9ufwp90k2z32RZfdNa9C2e7eRYzCbLJTnZJC/Pb0hn1LA87hcrPnVQ3z+ 5CzcznLiUkcw4b2PG90cf9+y9wFIun6cX3uf9r31Lhw9U3A7yzmy+kW/3TdQJYycQVzqCIBw4ANg gLERSXPSCqY0haVAUlzqCIb8+JdN8oDSrEzWvzCbr1565oytcN+KpTWs+U+qN8RRdzmv522mgymc ++IvMzocaSRTqzB6tYlhaswgTp06xeYTuZTlfMee99/kREkRAJ/+5B4q3M4L3ss3StSVl8ORbdvo deOEesUSZjZT9N1eijJ2Y7a2CaqJRHVRfdwjQOoDj5933GNdOYsKWPebn1N5qpKrnn3Z77svMX36 smfx25QfPkBk99SQGyNZU9vk4TiPbMVZeCQcGA8sQCMlWwStYIq/PQwMt1htXDn7Ob/f3FlUwIaX nmHxrWnsX7kU8M7s3jjg3qBYsaypuMKbaLTTCmZIiTJbearLNWwccC9pUclUeNzseGceKx+564xV yrqo8LjJ3byWnQsX1DuOHmMnAXBg7ef1vjaQ7Vy4gOX3TKQ8JwOrI5YbX1/K4BkP++Xe361aRoXH jaNnSpPsvnToP5h+U2cAcGjln6isOOn3ZwSSMHNrut78LFZHLEAisByINDYqaQ5KMMWfOgHPAVwy 6xd+/+acsWIxiyZfx4535lHhcZMWlcznA2YyJ2mcIQ3S/aGwQr/Ih7LE8Cje7j2FJX2mkdja3qh7 bfnbHDwuV72u6XjxMCxWW8hskzuLCljzq4dY/8JsKjxukkaPZ8J7H/u1Q8V/35wPQN9bJvrtnjUN nvEwVkcs5TkZHN38ryZ7TqAwR0SRfMcfsFhtAJcCfzE4JGkGSjDFn/4O2ONSR9RpDFtd+eosP39y Fs7iPAZGxLGkzzTe7j1Fk28kKAyzd2n0KrWzOI/Mz5bX6xpTeDidR6QB3l/Qgln+9nSWTJ/E/pVL MZssDPvZc1z921f9Oqkof3s65TkZWKw2eo2f4rf71mRt156Ue2cBcOSz/6PieEmTPStQWGO60H3q 7zCbLAC3o/ZFIU8JpvjLbcB1ZpPFb1vjvp52y++ZSO7mtdjD7cxOHMmKftMDpo9lYxWdXsGMtbQ1 OBJpSiUVzqpRk42R9cWqel/j2ybfv+Jf9V4BDRTp816p2hK3JSQz5u8f+PWXWB9fEt55RJpfD/fU ptf4KdgSknE7y8n76oMmfVagiOx6ER1HP+j743N4azIlRCnBFH9oD7wK3obq/tgaz1ixmHfHXVG1 HT41ZhBr+tzJrIRhWMJ0Nk2Cy47jeY2+h9lkofxocb2vS7z8aqyOWJzFeRzetL7RcTQnZ1EBy+6b xua5L1ZtiU96b0WTDG3wuFzsXfwuAP1vn+n3+9dkCg/nip97m67nf/lPnEcPNvkzA0HsZROIueQm 8B4yfgOdLA9ZSjDFH54Dom0JyQy8495G3ag0K7PW7fBgrrM8H18NZgeLzeBIpCk5/HD4rL6Hg6pL un4c8H37nWCQvW4NiyZfR+7mtVisNq76zRyu/u2rTbaymPnZctzOcmwJyc02dSzx8quJSx1BhcfN 0fV/a5ZnBoLO1z2Mo2cKgB1YjA79hCQlmNJYlwA/BLji5083+Ju/x+Vi58IFVf0BzSZLyG2HS8vl rzGgtpiGtczxjUrMWrs64LfJ/TnusT6+XeA93NP7pvq1g2qsy2b9FICCb9dTduDbZn22UWqcLE8G Xjc2ImkKSjClsf4MmJJGj29wn73SrEyW3D2Z9S/Mxu0sJy0qmY0D7m0R2+HFp1cwY8yN690ngS0x PKrRp8gB4gY3rFdqh/6Dq+r96ntQqDn5vhfseGce4B33eNP895p0WIPvub5BDX1uub1Jn1VTh/6D q+aU5305r1mfbSRzRBRdbn7Sd+hnAt4WdxJClGBKY8wELrVYbaTe/9MG3SB93issvjWN4r1bsIfb +UO3G3i795SQ3A6vzdGK40aHIM3k5uh+jbrebLLQfdTYBl/vW5lryEGh5pCxYjFLbh9D8d4tWB2x jH55AUMfe6bJD9sA7HjvdQC6pI3x66n0uhr6019jsdoo3ruFou2fNfvzjVLj0M8fgeEGhiN+pgRT GioSeBpg4N0/qvcKg6/W0le8nxaVzJo+dzIttnlqnwKNQ43WQ96MuIt9qzUNYo5sR1lOVoOvT7r2 RgAOrl7eoNGTTaWpxj3W5/n7V3h7UfpO3Dc3a7v29LzZ2xYpd139G+oHsxqHft7Ge2hUQoASTGmo XwKJDTnYU73WsiWuWtYmWglmSHNXepiXu6lRB3WcxXmsuP820ue90qDr7Z274eiZQoXHzXerljU4 Dn8qzcrk/cnXV03lSn3gccb+9c1mXUU8vGk9zuI8rI5YOl48rNmeW9PgGQ9XNcVvSauY4D30Y0tI Bu+kn5Zz2inEKcGUhugE/Bjqd7Cn+hQOX61lS161BMh3lxsdgjSxkgond+19n1ePeGdmD4yIq9f1 9nA7S/pMIy3KW0O5ee6LLLtvWoNWIZNGjQJg/6qV9b7W33YuXMDiW9Oqxj2OfnmB38Y91se3/3gN 8J60b47t+HNpyauYYebWdLvl16rHDDFKMKUhXgDC41JH1Hkby9dyxDeFY3biyBa/almdZpGHpp3H 8xi57TVWl2RgNlmY32Miqwfcwx+63XDB7XKzycLAiDjW9LmTYfYuvN17StV1uZvXsmjydWSvW1Ov eHzb5Lmb1xq2TV5z3GNzb4nXjCV381oA+k2e3uzPr6klr2JaY7pUr8d8EW+HEglioX1EV5rCJcCf gLBrnn8FW2z8BS9In/cK//nN41Q4yxkYEce7vSYzLrpPkwcaDOYe+Yo8dzk3R/ejV5sYo8MRP1pW uJtJe9+juOIEia3tLOlzB5fbuwIwyBbPlPYDsLQykXOylFLP962DzCYLI+3dmd3pKp7rei32aj00 B9niucHRk03HDpFTlkfGig9pZTbTod9gwszmC8YUHuUgZ9Mmyg8foG3HznTof5H/P/HzyN+ezoqH 7yEvfQNmk4Uhjz/L5T//NeY2xnRR2Pb23zn8zTriUkcw8I4ZhsRQnblNBCeKjpK/bQsni7OIubhp WzMFGlunvlSWZVB++IAZSAPmAycNDksa6MLfkUTO9Byn2xJdqBmxs6iA1U88UrVCMDVmEC91GxPy rYcaQjWYocNd6eH57M+rtsTTopL5S/JNRNVotp4YHsVTXa7hqS7XUFLhpMzjItIUftbrauobEcuK ftN5LHM57xz9L5vnvsihr74i7Xcv16l2MWnUaHI3r2Xnh00zbvFc0ue9wn//9icqPG5sCclc8z9/ bLaG5ueye8kiAPrcYszhntoMnvEwexe/W7WK2a7/SKNDalbxaY9Tsn8XzuK8ZOA3wKNGxyQNoy1y qY/hnJ43fqG2RNWncNjD7czvMZE5SeOUXNbgm0UuoaFmveVD8UN5u/eUCyaNUWYrieFRF3ydjyXM xJykcczvMRF7uJ3czWtZMn0S+dvTL3ht91FjMZssFO/dQmlWZp2e1xjNOe6xPrLXraE8JwOL1Ua3 kWMMjaW6llyLCd/3xzztEWCUgeFIIyjBlPp4HqDXrXeety1R+rxXqqZw+GrIxkb3bq4Yg0ppK+8/ /TFKUIxVW73lU12uadJnjo3uzUc9JzMwIo7ynAxW3H8bGSsWn/caa7v2tL/Ie1p6/ycfNWl8zT3u sT58YzN73jwlIOKprnotZkuZ7lNdZNeLfK2LwLtNrtZFQUgJptTVeGC4xWo750lPXz+7zXNfBLxb 4iv6TddBnvM4fnoF01+jBMUYywp3k7bzH2SfLCWxtZ3VfX/QbL9U9Y2IZVGfO6pOmX/+5Cw2vPTM ea/xbQn7toj9zahxj3XlLCoga+1qgICJqbrqq5gtabpPdTVaF80xOBxpACWYUlezwfvbfm11Xs6i ApbcPbnqlPgfut2gLfE68PVFVIIZnNyVHp49+Cl37/ugamDAZwNm0jcitlnjiDJbebv3FGYneuv1 drwzj2X3TTvn3PFuI8dUrZDVZVu9Powa91gf361ahttZjqNniuFb9efiO9V+bP82nEcPGhuMAcLM rek0uqr88na8ixwSRJRgSl2M4vRIyNpWL/O3p7No8nVV4x4/6DmlRfe2rKuSCqfRIUgj1FZvuaDn pDrXUTaFWQnDmN9jYlUroyV3T661ztIUHk7nEWkAF9xSr4/q4x4tVluzjnusj50ffgBA31smGhzJ udk7d6uaUZ771UKjwzFEZNeL6Dhiuu+P2ioPMkowpS6ehtpXL7PXrWHF/bedUW85zN7FiBiDmpFJ idTfueotA2HFfmx0bz7oOYXE1naK927hXzNqP/zjG4voG5PYGL4t8erjHm96a7khvS0vJH97OsV7 tzR6tntz8P0dlWxbRcXxEoOjMUb8ldN8W+XRaKs8qCjBlAsZzjlqLzNWLObTn9xTNZVnUZ87VG9Z D2Wnex82Zj61ND8j6y3rapi9C0v73snAiLiqEZM1m7J3vHgYFqsNZ3Feo7bJa26Jpz7wONfP+XtA bYlX51ux7ZI2pllHUjZE4uVXY0vw1tYWblttdDiGqGWrXKfKg4Txv25LoPsb0KPPpDvpds0NVe9M n/cKG154kspTlUyNGcRfkm8iwtTauCiD0KGTpbyet5m2rdsyK/4yo8OROnj24Kf86uAnVJ6qJC0q mff73B6wv1TZzVZuju7HjuN57CvP5cAn/6JtYleie3iHHISZzRRl7KIoYzcVx8vxuE9ycO0nHNmy kYoTJ7DFdrxg8/adCxfw2c/u53jeQayOWK75/Vx6jZ9Sp6bvRvC4XHz+y4eprHBz6axfBWwSXJ3J HEb2l59y8uh+YodONjocQ4Q74uHUKY4dSAe4AjVgDwqB+V1AAsUATve9rD5GbcNLz1StVjwUP7TJ W7GEquLTNZj2UwYHIhdUUuHk/owlrC7JALxf979IvCogtsTPJ8psZUHPSVVN2T9/chYny0rpe+td eFwurNHe6VH7Vy5l/8qlZ1xrNlnokjaGoT/99VkrfR6Xiy+efazqmrjUEXVu9G6kzM+W43aWY0tI Dsjt+9r0Gj+FLX+bg7M4r0U2XveJv3IaRf/9t68B+y+BXxgdk5yfEkypbjgwFugCuICe4N1Ksnfu hsflYsWse6om8/yh2w06zOMHmkMe2HYez+OOPe+RfbIUs8nC/3UfH3Bb4udjCTPxUjdvI/F3jv6X 9S/MpuTgfnI2baF475bzXntw9XKy1q5m5O/nViVk+dvT+fSXP6Y8x1t/OujeR8/ZuizQ7PrQ2/uy 900TDI6k7kzh4SRdP44d78yj8NvFLTbBDDO3JmHUg+x//2mAx4F/AtuMjUrORwmmAHQC/g5cV9sH Hcm9cRYV8O8HZ1QVxwfbD9lAVKgpPgFvWeFufvjdUio8bhJb2/lnr8nN3oLIH3yTf3pY2/Nc9mdV OxDn42uhhcfNpz+5h2v+8HeO7toacOMe66o0K7Pql+Oka280OJr66Td5OjvemUfx3i04jx7EGtMy D1K26z+SuP2ryd281gTMBa40OiY5Nx3ykfbA55wjuQTYPPdFFo4ffkYbIiWX/hNraWt0CFKLQOhv 6W8PxF9GYmt7va+r8LhZ+chdATfusT58U4viUkcERe1ldfbO3YhLHQFA4dZVBkdjrPi0x7FYbeDd cZtpcDhyHkow5W9A8oVe5HaWk9jazkc9J6sNkZ9oDnlgKqlwctvudwOqv6W/vHt0K9knSxt8vdlk YdjPnguYcY/1sePtfwDfTzEKNr64i/77b4MjMZY5Ior4kT/0/fH3qDdmwFKC2bIlA3UuRhpu7xb0 KziBqIPFZnQIclog97f0h/l5mxp9j05DR/ghkuaVvW4NzuI8rI5Yuo0cY3Q4DeKbvuQszmuR88mr i0kdV7035pMGhyPnoASzZbvhwi/53r/LMpsojJZJNZiBZVnhbm7c+15A97dsjGxXCVuP5zbqHhUe N4c2rPVTRM1n3zLv4Z6k68cF3cqrjyk8vGo+eeG2lr1NXqM35kPUYRdOmp8SzJYtoT4vLnWVaryh HxUrwQwYc3LWc/e+Dyh1lYZMvWVN35Yf8ct9Sg7u98t9mouzqICDq5cDnNFuLRglX38zAMVb/t1i J/v4RHa9yFeXagL+n8HhSC2UYLZs9foOZTZZQqIOLdDEmCOMDqHF8tVbPpf9GRBa9ZZNxVl41OgQ 6mXXh29R4XHj6JkSdId7aurQfzC2hGQqPO4WO9mnuphh9/omoV2HJvwEHCWYLdt/6vPiCo+bWfv/ RbarZf/m7C9HK44D4FAfTEPsPJ7HhF3/rKq3/EO3G0Kq3rI6d6WHaD98nZlNlqrm7MFi95JFAPS9 ZaLBkfiHr4dn4bcfUbT9M3I+m0fOZ/Mo2v4ZzqMHDY6ueVljutDhijt8f/wjoLm7AUR9MFu2/wBf A5fW9YJ3jv6X94t28kTH4TwQf1lI/jCW0LescDePZH1Cqas0qPtb1pUlzERnP4y0rPC4ieqS5IeI mkf+9nTKczKwWG30Gj/F6HD8IjKhMwDlORm+puOYTZaqvqW2hGQ6jX6UyK4XGRZjc4odMpGjGxfi dpYPAH4AvGZ0TOKlFUz5Ed6pPeeVFpXM5wNmMjAijgqPm+eyP2PIf+eyrHB3M4QYmvLd5QB+WVmS umsJ9Za1SQyPYmBEXKPuYTZZguoU+fa3vLlG5xFpQXu4x8fjcrHhpWf4/MlZZ32sqik+3sRzz+sP c2DZS1RWhP647hpti55Gq5gBQwmmOLlAgjk1ZhALek6ib0Qsqwfcw/weE0lsbSf7ZCl37/uAtG1/ Z31py9qakeCjeku4O/biRl3vGxsbDDwuF1lrvXWK/W8P/n7cXzz7WJ0mMPkc/WYJ3733eBNGFDhi UsdhdcQCJAL3GxyOnKYEs2XrBCwH7AMj4pid+P2M28TWdqbGDGJJn2nMSRp3xlb42OjefDXoAWYn jsRssrD1eC437XpT9Zn1lOc+BmgWeXPIdpW0mHrL85kSM7DBq/qhcrwAACAASURBVJgWq43U+3/q 54iazp6l7+J2lmNLSA6qiUO1SZ/3CvtXLq33dcV7t5C3cVETRBRYfHPKT3sGiDQuGvFRgtlytQdW AIkDI+JY1OcOfhCbUvXBrwY9wJykceec2mMJMzErYRgbB9zL1JhBgLc+87Jtf+PZg5+qnZEEjGWF u7l61xtsPZ5b1d9yWmxwJxwNZQkz8Y+ek7CH139c5OW/ej5oVi8B9q9aCXx/KCZYOYsK2Dr/zw2+ /vDK/9ciWhpF9b6ievP1XxocjqAEs6WKxLtyOSCxtZ1/nN4mrL5VeLzSfc6Lq0sMj2JO0jg+HzCT tChv+4xXj2xg5LbXeDMvvWmiDzGqwWw61estB0bEtZh6y/NJDI9iTZ87672SuevD95soIv8rzcok d/NazCYLfW653ehwGmXXh2/hdpY36h55X33gp2gCV5i5NXGX3+X744/RCEnDKcFseSzAQuBSe7id pX3vJLHa6VLfykaZ54Lnfs7QNyKWt3tPOaM+8yeZ/1Z95nn4ZpE7WlANYHOpWW85NWYQK/pNb1H1 lueTGB7Fin7TmZ048pyrmWaTpapMxmyykLt5LRteeqZ5A22gHe+9DnhrRq3tgjvP2L+qcVN7Kjxu ThxuGaMl2/Uf6VvFDAeCp54jRKlNUcvzOnCd2WThje7jz0guAeynoJT6J5g+Y6N7M9rRg7lHNjIn f1NVfWZaVDIvdrv+rOe1ZKWtjI4gNGW7SvjB3vfZejwXs8nCC52vbbFb4ufjK3N5IP4yvjl2iAxn YdX40kvbdqJfRGxVQv5/3cdz974P2PHOPDr0H1w1USYQeVwu9q/4FwA9xk4yOJrGO7Z/W6PvUZ61 xw+RBIe4y+/ytW/6EfC/QIGxEbVcWsFsWZ4HbjebLHzQc0qt9ZW+AyfFjaih9P3g2tR/JlNjBmE2 WVhdkqH6zBqOn/5hHmkK7vYpgWR96cEz6i0/6DlFyeUFWMJMDLN3YVrsYGYlDGNWwjCG2bucsdo7 Nro3D8UPBWDdb39B/vbALX/J/Gw5zuI8rI5YOl48zOhwGq16C6KGOuUO/XZFPtVWMe1455SLQZRg thwzgScAXuh87TkP7/gU+mFOdpTZypykcazu+4Mz6jMv3u6tz3RXehr9jGDm+8GhBNM/5uSs56Zd b1bVWy7te+cFv86l7p7qcg1pUcm4neV88uhMnEWBuTDkqxVNun5c0Pe+BHztdxrFHNnOD5EEj2q1 mD9BtZiGUYLZMowCXgVv77/zrejEWtr6/eG++swlfaYxMCKOUpe3PvP6Ha+32PrM6qu4EWHqC9wY 7koPs/b/66x6S5Vj+N9fkm9iYEQczuI8Vj/xiNHhnMVZVEDu5rUA9Js83dhg/MTaoVNA3COYaBUz MCjBDH3JwAdAeFpUMk91uaZOFxX5YQWzpmH2LqzoN50/dLsBe7i9qj7ztt3vtrj+mdVrXFtaL0Z/ ynaVcP2O13nn6H+r+lvW7Nsq/hNltvJq0o1Vh37S571idEhn2PXhWwDEpY4IqpZK5/P/2bvz8CbL dPHjX5ukSRuaLrRp6cZStrIjAoK4IChuA4ooriM6zjk6OjqjZ2bO/EYddZwzc8ZxZtxGjzqi44aK CyoiCIKIIiJbWVqWltIN2qZtkpKSNEn9/fH2DaF0y/pmeT7XxWVKk/e9QdreuZ/nue9hc+cGfA3z wR2Uv3kvLXvXx8V0HzilinkPoi+mIkSCGdtSgNV0NlL/94i+N7xnafRAcJbIu6NJUHGTcRLbxt7O 3Tlnx/3+TH/6EQoSsd9SGcXJRl4cOh+A7c89Ts03GxSNx9v+FVJT8dFXRf/hHtnoq25ArfJ/lUN+ rfngDiqW/57SZ2+gbv3LMd8bM33sbHl7QQawRNlo4pN4mx+7NMAHwNT8RAPvjLqedE3f/RZXtRxg T1s9E5JzOD91aMiC0yWoOT91KIsHjuOQvZnyEya+O17Dq817yUhIpDgpC9UZsfv+p7bdyisN28lS afnPnGlKhxMyNQ4LX1mP8FnLQba01rCltYaDJ5qodlhITtBg8LNt0FN1m/lZxUc43A7GJ2fzzqjr GasPbM620H8jkzKpdljY01ZP7bdfM+JHV6NOSlY0pppvNlD27stodHrO/f0TJKhjo0mKOimZHxIS OPr9N76/VqVh0MV3UTDvbtRJBhz1B2k/bub4kZ3Uf/MWHa3lnKEbiDYtJwSRR4AENdZD3wKMBJ5S OJq4ExtfgUJ3HqWzHdGzw05vR9STTHV4f0jka1N5a9RiNlureKDqc3a31XNf5acsbdjGY4V9H0aK VoGc0o90NQ4LL9dv48PmfdS0Wz0VlO5Ow+YnGrgyYwy3ZU/p179RZ4eb+ytXscxUAkj7LZ8YcqlY ElfAE0MuZW9bPbvN9az773u5/P9eVzSeQyulwz0jrlwcE4d7vE267efUbtni2V/aX2mTL8M4TZpk lDv7NnLOvQnL/q9p3vUh5oM7qN++kfrtG9GlGcmacQMZ4+agTo6dvcuZZ17BsfUv4rTbioD5gO/z NgW/ie/KsWk+8CzAv4qu4sK0on6/cJftGButlQzTZXBp+shQxXeaAm0qN2ROJD8xlc0n6qm2N7PM VML243WMTTZ6lu5jRY3DwjJTCYO1adxiPFPpcIKixmHhgaq1/PzwJ3x3vAZr5z7Tjh866Piho9vX tNHBt61V/F/9VqodFsYnZ/dY1axxWFi0/02+sFSgVmn46+BL+E3+eTFd6Y5kqjMSmJNaxL9MO2mt O8wZajU5k6crEou9pYlv/vAbOn7o4Oz/egS9MfYqciN/tBDLkXJayvf36/mDzltCwcV3nfJ7ZySo SDIOJWP8pWSMm8MPP7hxNtfQftyM9dC3NG1ZjqPVhEqrj4mq5hkJKtzOdo4f2QkwHHhR4ZDiikgw Y08R0r5L7d05Z/PTnKk+vfjgiSZWmw8yLjk7rAkmSD+wJuhzuCVzAj/88APbT9RTfsLE6027OWJv YWZKIbqE2Ci6l9iOsaK5lGzNgJhIMF9v2Mm1h96lxHbUp9d5J5572ur5l2kn2Wo9E/Sn/nDbbK1i waF3qbY3k59o4NXhV3N5xqigxC74z6DWka3Ws9p8kMYdW8mdcb4iyd3BT5ZTtWktaSMmc9advwz7 /cNlyJzLyBo3mabySuzNx7p9TtqIyRTO/x2Zky7t9Vrq5FTSRs4k6+xr0QzIwN3WiMNqoq1uP007 V2E9uJEOdwdJ2UWcEcUrBEnZw2jaspyOHzrygHVAfLYuUUD0/qsRuqMBPgcGj0/O5v+KrvS5ulNi O8Zq80GyNQNYlDkuJEH2pbv9mXva6nm1eS90uDlTnxv1VauDJ5pY0VzK+OQcxf6eg8HZ4eaXhz/l ibpNPVYpfdHxQwerzQepdliYm1qE6owEnqrbzD1HVnHCeULst4xAE/Q5bD9eR/kJE7XffUfxwuvD vv/xqz8+hL35GJNvv5ussRPDeu9wMxQMofjq6ym69Cqyxk0md+o5GCdM8ezRHPWTF0nKGtzv652R oEKfV0zmlCtJGXomZ6gTaa+vwGE1SVXNre9ht9Sjy8iPyuXzBI0OR6uUOAM64H2FQ4obIsGMLc8C Vxi0Blb081BPV9UOCyuaSxmgSlS8smZQ61iUOY5ZKYPZ2yYtm2+0VvKOaTf5iamMTMpUNL5AfNda w2rzQYbpMqI2wXR2uPnxweV83FIW9Gvvaaunrr2VVS0H+OexLXT80MF1mRN4bcQ1fv27FkLrorTh fNC0lybzMZxtNvJnXhC2ezfu3UnJy39HrdIw66HHFT9sFC7a1DQyho8ma+xEciZP5/CGDdibj6HP HU2S0b8Dmtq0HNJGziTzrCtJTM2m3VRB+3EzbXX7adz6PifqdnJGgg5tRl5UVTV1Gfk0bn0fpMM+ zwGhaZMinCJ6/oUIfbkeaRQk74y4xu8KT5OzjWWmkohaui3QpnKL8UwGaVLY21ZPTbuVFc2lUb0/ c4PlMButlUxPKQj7VoRg+WP1Bt5u2h2y6+9pq2dPWz0AfxtymdhvGcF0CWomJOewzFRC454dZI2b HLY+lLtfe57GPTsYctEVMTF73F+Wyv007tmBqnPpOxAJGh36vGKMZ19LytAzUSfYcDTU0WaqpWXf Bpq2vofb2Y4mZWBUVDXVyalYD27E2dqiBlqATUrHFA9EghkbxgGfAuoH8mcHVBGTD58knqGKuPY5 E/Q5XNdlf+YrDdv7PBwSiba01rDRWqnIXtdgWNm8n99VfR6Wez2QP9vnvcRC+BVoUznhdvLd8Rpq v/2aMYtvCflSudvh4Mv/93M6XE6m3vO7mGmu7g+H1cyR9as4AxeZU64M2nW1aTkYRl1I5llXkqDW 4rLUeVodeVc1/a2ahotKl0rLvg0Ao4G/KxtNfBDlgOiXArxF56SeOwNMCtM6kzTrGYEHFgqpah0P FV7Id+P+g+syJwCwzFTCtD0v8FTd5qiZb27ubGQf7rZQwWBx2XkwTMklwCsN2+KuAX+0ujd3JvmJ BuzmBrY+86eQ369y/Sqcdhv63KKwLstHoqyx0pABR31VSKb1qJNTyZ19G2PvXc6wRY+QNmIycLKB +94nF0V0A/fUUeeg0ekB8pE6rQghJhLM6PcXYFx+ooHnixYE3A8wRSX1j2sL0SSfYMnXpvLUsCs8 881dbieP1axneslzrGzuXxsPwT+vNuygpt0atvvVtFt5tWFH2O4n+C9VrePZYdLP7n3LXqZx786Q 3q/sA6n35agFC0N6n2hgKBiCLs2Iy+2k3dz9CfNgSR87m6IbnmTsXa8z6LwlaHR67OYGjm58hb1/ W0jNxw/QemRXSGPwVYI6kcxp18gf/kzJWOKFSDCj23zgDoBnh80nNQhLxHKC6XI7o6IaOMNQyLpx P2Hp8KvJTzRQ027l1kPvcf3+tylta1A6vB6ZXG0ApKmj68CKs8PNU43bwn7fpxq3RcW/R0H6mpRX F774f7/E7XCE5D7W6kpP4/HRV90QkntEm9RhowGwVnwflvvpMgvJnX0b4+5fwbBFj6DPLcLldlK/ fSMHXvk5ZS/eSsN370dMVTNjvGeu+zwgT8FQ4oJIMKNXHrAU4O6cs4M28cY7SW3rOH3ySqS6PGMU WybcyQP5sz3zzc/f8xL3VHxCjSMyvrnFgjXmQ1gd4ateyqwOK2vMh8J+X8E/fyicS36iAVtdObvf eCEk96j4/GMAss88D136wJDcI9oMHDkcgBONh8N63wR1IuljZzP6p0sZe9frZJ61AI1Oj62unOpV /2Df09dxZOUT2E3KtqDUZRZ6lvaBm5WMJR6IBDN6PQVkjE/O5rf55wf1wvJov1Z3aCoPoaJJUHFP 7oyo2J/Z6LQBkBFlFczV5oNxeW/BN6lqHX8ovAiAkhf+gbW6Muj32PfWqwCMvip+T453Je/DPFG3 R7EYdJmFDL78fsb8fBkFl/4CfW4RTrsN0/cr2PvsTZS9eCste9eHZJ9of2RM9ByAul2RAOKISDCj 0+3AQrVKwzPDfhT0Ocw5KinpibYEUybvz/xy3O0Rvz8zPcoSzE3Wyri8t+C7yzNGMSdVWjLd/vxf g3rtmm82YDc3oEszMmR27xNr4omcYLb3MOUnnNTJqRinLWT0T5cycsnTZJ95HmqVBltdORXLf8+e JxYoUtX0OuxTBMwK683jTGzM3YsvecATAP89aBbFycaQ3cgc5Sd3i5ONrBv3E1Y27+fBqs89+zPH J2fzWOFFQdtW4I8G53HF7u0vi8se1sM9XR1zn+Ceik96/HxPJ/J72ufatXosJ/vevy93VUhRaUlR aUlO0AT9DV0se6hgNl8er6JizUcMv3xR0E56H1opHe4ZdskVqLTaoFwzFuiNg1CrNDjtNlxtlojp UZkyeCIpgyeSM8dCw5b3aCn5FLu5AdP3KzB9v4K0EZPJmHglqaPOIUGdGNJYEtSJpI6bi+n7FQA3 InpihoxIMKPPvwDD+OTsgFsS9SRdnURNu5XmCD9J3l+XZ4zi4rThPHfsO/58dBO72+pZUPY612VO 4Nd555KvVe6bcDQtkdcpmFyCdPBsmanEs4Wj6+fCRa3SkKNK8iSkRs0AT7P/THUyaeokMtTS54fp 0klRacnWDIjLxLQ42cgdWVN45ti3fP2/j7DonRkBJ4T2liaq1q0CYMy1S4IQZexQabVoswtx1ZVz orGSlMGRNTZTbnWUO/s2Wvaup3nXh5gP7vD80qUZSZ9wGcbpV4c0Oc44mWDeAPwaaA3ZzeKYSDCj y/XAPLVKw6sjFoXsB5ZRMwCoD8m1lSLvz1w4cAx/qf2KZaYSlplKWN5Syh1ZU7g3d2ZQTuH3V0uM JO8KeN7ldh7p5vd7+mmU1sPvdy39673+qwWSOn9pgWSv38fldlLjdnpVc0//WlGrNKclvQatgcGq JE9COlw3kAx1EkW6DNLUOobrBsZkEnpv7kw+bN5HTeeBn0m3/Tyg65V98CYut5O0EeGbFhRNsseN paKunBP15RGXYHpLHzub9LGzsZuqaN69FtN373paHR3d+ArZZ55H6oRrQvJnSBk8EV2aEbu5wQBc gdRLWggykWBGj4HAMyAtjYej6haLSZC8P/POnGk8Wr2edZZynjn2LR827+O+3FncZJwU1njSomj6 UIR4FlDqBIMGMCAlremADshASj4zOx+nA1kut7Ow83m5SMmvyuqwshsrvb15805Ci5OyGKbLoEiX QYE2VdFKeyBS1Truy53FfZWfsnvpPxl91Q0Bnfrev+J9AIqvujpYIcYUXUYmEP6T5P6SWx3lnHsT lv1fe6qa9ds3Ur99I7o0I1kzbiBj3JygVjXTJ1zG0Y2vACxCJJghIRLM6PE4nafGQ7U0LpOX+2Jl ibw7xclG3hq1+JT9mfdVfsrShm1h2Z8ZqZOSurK47Oxra2Dr8Vo2tyrbYqRTi4L3dgJNnb98NRAY BOQAWcDgzscFnb+KgAzvJHSdpfyUC6hVGoq1GZ7kc8qAPIbp0qOi8nmTcRJLG7axu62enS8/zdn3 P+zXdRr37sRWV45Gp2fk/MXBDTJGpBYOA8BliYiv136TWx3JVc36Le9i2bMWu7mB6lX/4OiaZ0mb fBkZ4+YGpaqZMX6unGBejjQRTyyTB5lIMKPDXODWUJ0aj2fe+zOfatzm2Z85J7WIx4dcErKqkTwp SW5sHyksLjubrEfYdryWL62H2d0WUVslHECt0kH4SU5Me6u+pnAy8SxGSjoLgJHACJfbqZX+f5ya fMqJ59jkbIbrBlKky2CiPifiKp6PFV7EgrLXOfDua4y5dolfy9t733wJgILz5ojDPT1IyZPeHDtt yu6ZDoTc6qhj3s8xbf+E5l0fY6sr9xwK0ucWkTHxR2SeeYXfh4J0mYXoc4uw1ZVrEcvkISESzMin AZ4HuCNrSkhPjcvk07jmGK5gepP3Z95inMyDVWtZ3lLKOks50/a8EJL9mc4Ot2d/ntIJprPDzffH a/ncfIgvrYcpdTR3u3dw7KAJDErNZVvtLo6YFGv1tFWpG4dJK1ICugdY283ni4ChSMnnGGAcMMbl dmbsbqs/7c2AQWtgqi7LU+1UOumcYShkTmoR6yzlbH/+r1zwx2d8er3b4aB64zoAxt4gWhj2RE7c I6FVUaAS1IkYpy3EOG0hrUd20bxnLeYdn2KrK8dW9w+OrX+R1HFzyZ5+DbpM31edDMPPxVZXDnAL IsEMOpFgRr5HgaL8REPQG6r3RG7rIo8zjBepap20P7Pt1P2Z/27Zx8ODgrc/03tCUnLC6SeiQ620 rYHPzeVsbq3iy+NVpyWURkMeRRlDmZQ/hSEZQxmozzzl8wommN0lXfGkvPNX17+HgcBkpMRzMlLi OcHqsGrXOaynVDvzEw2MSspiRkohUwfkcdaAvLCuiDxUMJt1lnIq1nzE2BtuJ2vsJOwtTdRu+YrG vTtpOnAIR2srTpsVjd6ANiWFgSOHkzV2Eq111TjtNvS5RZ5+j8Lp9MZBABHXqihQcqujvNm307xn HY2b3wy41ZHXMvkFSF9H/mx/EXogEszINg74FcAfCi8SS+NhIu/P3Gyt4oGqz9ndVh/U/ZlyA3u1 Kjw9FeVl79Xmg2yyVp7Wy1KuUA7PGsm4QRNOSyi9TR88k/d3vRPqkHvyulI3jnBNSEmnd+KpASYC k4CZSInn+Jp2q6qm/WTSKS+vn28YypQBecwyDA5pN4XiZCPXZU5gmamEr/74ezKGFlC1blWvbabk eeOyweeF5412tFJptfIJ6ZhKMGVyA3e5qmkpeZemXZs9rY40Oj2Z064hY/zcXqua8ms7aYEtwCfA 00hv5IQARclRg7j1GTBvTmoRb40K34b21xt2cl/lp4T7vpHI2eHmbdNuHj66yTODO9D9maVtDZy/ 5yUMWgOHJt4dzHA9ahwWNlgOs7Jl/2lVSrVKwwjjOIqNI5iQO5n8tAKfrv3EhicoPboj2CH3ZTVw SbhvGmNSkJLOycDZwHlAPpzaVml8cjbnG4ZyUdrwkFQ4N1urWFD2eretnPorbcRkzv3dI6KS2YP3 b1iA+eAORi55OqJbFQWLq+3UBu4yuaqZPnb2Kc8/svIJuQ9mdxzA3cBLoYo3XogEM3LNB1aoVRq+ G/cfYd07tbJ5P7ceek8kmF4sLjtP1n3D843bcLmdqFUav/dnyglmfqKB7ZOCk2B23UvZ3X68s4ee Q1HmSIqzx5CcqO/hSn2rMVfz8KrfBhqyr85FTNwIhSJgNlKV87zOjz3UKg3nDyhkRkohF6UVBbwH fGXzfu6t/tzzZi0QapWGqff/nuJrfhzwtWLNyv+8ifrtGym49BcYpy1UOpyw8m7gLvNu4F67/qXe kktvNyD2ZQZEJJiRSQOUAkV355zNQ4UXhvXmcoVhfHI268b9JKz3jnQ1Dgu/qvzMs8Ro0Bp4eNAs FmeO77XS4+xws8Z8iNXmg+ztPJChVmlYlF7MvLQRXJw23OdKkfc1P22tPOWHdqBVyr78a/PzbK4M W763FLgtXDeLc3lIieZFdJNw5icamGUYwry0ET4vpz9Vt5nHatYHNViAYRfP9/nAUKzb8Lu7qVjz EYPOW0Lu7Pj80vFu4O6024DuByD0wgoMQ+zL9JtIMCPTz4Gn8hMNbJlwZ9j3XsoJZjArbLHGe38m 0Ot8c+9em13JYw9zVEk8O2x+n/s7LS47HzeXdbv0rdHpOStnMpPypwRcpeyLu8PFg6t+R4M15F2D ypGWdEWPOmWMQ6pwXg7MQGo0D5ysbl6ePooLUof2usoib7sJBbVKQ+GcS0WS6WXny0+z/bnHyTxr AYMvv1/pcBTV4WrHsv9r6r/5t3xi3Bc/RSyV+00c8ok8A4HHQLmDPfJ0mWhpBq6EGYZCPhuzxLM/ 07t/5kMFsz1LiY9WfcEzx77t8TpygljjdrKg7HUeyJ/NPbkzTnveyub9vN6487Sk0mjIY1LuBCbl TaEocziqhPB8SasS1AzUG0OdYDYDVyKSSyXJbZOeRlpZOR+YA1zjcjuL1lnKPdX88cnZLMgYw8KB Y05JNjdbq0KWXIL0NVSx5iPSikYFPIYyVmhTpL9/VYeScwkig3cD97IXb/U1yZyJSDD9JhLMyPMY YBifnM3lGaMUCUDuzdgWJ30w/aVJUHGTcRI/yhjt2Z+5zlLOl8erWJReTKY6udfksjuP1awnQ53E TcZJngNGf6vbdEr102jIY9bQc0Ky9N1fXx76Qj7o4wAa6TwsEiRuwALMQ7mxkMLpnJw8rf5bpOrm FcBCYKrci/OxmvWeZPOitCLuqvgoLMHtXvpP8qafKw7+AIkpUqHZ0Srem3lzt/n89xFbR/DDTCSY kWUcUkmexwovUiwIOcF0uZ04O9yiPVIfUtU6Hiq8kNuyp3j2Zy4zlfh9vV9Xf06FvZl/t+zz7KuU D+nMHHqeYkmlrMlm4q3tr8kf/gp4H/gAmBqkW+xGmg8sWoVENrm6+WekvZuXIv1/m7u7rV4lJ5vh 4rTb+O6pv3L5/4luVnKzdXtjtA6+Cg1Vcgp4nTLvh+pQxRIPEpQOQDjFI4DquswJIZ+F3Rvv5t/e TcGF3uVrU3lr1GJWjL7Js7fSHy63k2eOfYvVYcVoyOPmqbfx2BWPc+3kGxVPLt0dLv75zXPyMv1q pKXTWuAcpKpWIMeDHcDDwDREchltapGWEi8BspHeKIf91H/99o3UfLMh3LeNOFpDGgDuzsMtgsQw /FxfX/JJKOKIFyLBjByzgIVqlYY7c6YpGogmQeVJkOSm4EL/pal1fvf383bz1Nv4w6V/5PzhF4b0 wI4vVpd9Kk/ysQLeLQacSJWsMZ3/bfbhss3Ak0gnlh/pvJYQvZqQkk1FJi8dWrlcidtGFO9pPh2u doWjiRzG6Vej0fX7e+kmxPSwgIgEM3L8CWBRenFY5o33JblzXKRIMH237XhdUK4zyJAbtkM7/VFj ruajPR/IH96BVLXqqhapkpmD1Ormz0iVznKgpvNXeefv/bnzOTnAL3q4nhC9blbiplXrVmFvie/O Miqt1lMkaDdH/0zyYFEnp1Jwxa/789RmYEloo4l9kfPTK77NBWapVRp+nedzCT8kDD9IJSqzy650 KFGnOUiHo45a6xhpHB2UawXK3eHin18/I1dm36fvBsTeB0KE+FNElx6a4eJyOzGV7iZ/5gVK3D5i qFPScZkbcNpaeh2ZGG/Sx85m5IAMqj78wylTf7p4CrFNJ2AiwYwM/wNS9TKcE3t6k65O6rZvo9A3 cxASTLVKg639eBCiCY73dr0ttySqAf5D4XCEyKfoPp+azRviPsHUZeX1lkDFtZTBEym+600s+7/m RMNhnG0taJLTcba1yFN+Tu8VJ/hMJJjKmw9MjaTqJYBRMwCoD1o1Lp6kdW4vCITL7SQ7ZVAQognc gYYy1pStkj+8CzHZQujbSCVvbm82KXn7iKBNSQHAddyXAoXvWwAAIABJREFU7dDxw7s/psxuqpIT zAuQ+r6K/eABEHswlfcIwB1ZUyKmeumtRSSYPrsoLTgrg0MyhgblOoFoa7fx/Kan5A+fB8LT1FCI djlK3rz5sOguo8+UTpI7baLZen8lpuXIh4C0wESFw4l6IsFU1nxgklql4d7cmUrHcoosjXTSTlQw fReMfauDM0cxUJ8ZhGgC89a21+RenOVAv3bHC4IQOVw2s9IhRI0EdSL6Ak/xXSyTB0gkmMr6FUjV y9TO8YxC9KpxWLh+/9ssKAu80fNloy8JQkSB2Va9lc2Vm0CarHMdYmSj0H+Ktp+Ql4fjmS5D+Teo 0ShpkKdweYGCYcQEkWAqZxadJ8dvy56idCynyVQnA8E5sBLrLC47j1Z9wbQ9L3jmMl88+lIGZ/o3 6nPGkFlMKQjWUBz/NNlMvLF1qfzhH4DvFQxHiD6K9saRl4fjmS59IADONrFE7ouUYZ6fx8o2pI4B 4pCPcn4JkXVy3Jt8UMXkalM4ksi2snk/D1Z97jlxXzxoMosnXUt+WgFt7TYe+/xR+fR1n9QqDXnp w1gy/fZQhtwvr2x9VV4a30pnlwNB8ME+JW+eVuTfmztB0OcVyw/zkUagiv68fhIJpjLGAQsAxaf2 CP6pcVg8c8cBjIY8rp6w6JTKY3Kingcueoi3tr0mLzX36sIRc7l64mLFm6tvq95K6dEdIC1z3oY4 SSn47mukrRUqJW6eNz1yOnIoRZsiFS5UHaKC6YsEdSL63CJsdeUAUxAJpt9EgqmM+wDVnNSiiJja 052Mzgpmo1PMsvXm7HDz3LHv+PPRTbjcTtQqDfPHXcW80Zd1mxgmJ+r5yYw7OLfoAr4q38DeoyVy ZRAAg9bA2UPPYebQ8xSfMw7SqXGvpfE/AXsUDEeIXk3AZqStQGGlSzOSMby47yfGCUer2Drtq6Tc cXKCOQPROcNvIsEMvzzgBoB7BkXuIbX0IPRyjDWbrVU8UPU5u9vqAWk5fMnUW/p12nukcbRnKk9b u40TzhMkaZIiZsa4zOvU+E7E0rgQmFdRIMEcdskVqLTacN824iSmGJQOIWolZXlaxE1WMo5oJxLM 8Lsb0M5JLWKGIfLHdzU4I2eajFKcHW7+VPMlzxz7FpCqjgsmLOL84Rf6db3kRH3EJZYgNVT3OjX+ U8TSuBCYt4HfI+1lCwu1SsOYa5eE63ZCjErK9vQyVva0ZZQTCWZ4pQA/g8iuXsLJJfJ4b7Re2tbA 3RUfe6qWM4bM4vopN0dkghgId4eLV04ujT+DODUuBK4VaZDEi+G64chrbsZQMCRct4toWoPcaF2M /PWV10GfDGAgYnqZX0SCGV6LAcP45OyIr16mxXlfTrlq+XzjNlxuJwatgRun3qp4+6BQWV32qfes 8QcVDkeIHS8BtxCGpXJ9bhGTbvt5qG8jxIEuB30mA2sVDikqiQQzvO4FuNUYeX0vu0pRSXuYjrnj r4JZ47Bwy8HlMV+1lDXZTHy05wP5w18jGqoLwXUdUIJUDQoJtUrDhf/zd0/vR0EI1ICcPDnBPAuR YPpFJJjhMxcYp1Zp+FHGaKVj6ZOcYLrc8bUN7/WGnfy6+vO4qFrKPixZLv9/3gS8pXA4QuypBeYB 64CQnDy58G//ImvspFBcWohTidlnAhtB7MP0m0gww+dOiJ6xkMkJGs9ji8seFTEHwuKy82DVWpaZ SgDfTohHsy4He+5UOBwhdn0PzAFWE8RKpkanZ/b/Pkf+zAuCdcmYo9GL0+T+8DroM7G35wk9Ewlm eOTR2Vj9msxxCofSP5oEFWqVBpfbSavbEdMJZmlbAzceeMczjWfhxGu5bMx8haMKvW4O9oiel0Io fQ9MAP6FVNEMSNqIycz93yfFoZ4eOKxmpUOIWh2udpKyhsgfDgE0iK4aPhMJZnjcDKjGJ2dHbGP1 7iSrk7B2JpixquuS+B2z7vH0q4x14mCPoIBa4BLgdvxsYaRLMzL5P+5h5PzFot+lEBIJ6kQS1Ilo dHqcdpsKGIV4A+6zBKUDiBO3Q3Qc7vFm+EH6r9llVzaQEHB2uHm06gvuq/wUl9tJ8aDJPHbF43GT XLa12/h4/0r5w0cQB3uE8HoJGIY0dGI10ljS3riBZoDcaWdTfM2PRXLZh/ZWaUVGm5KicCTRKzEj R344TMk4opWoYIbeXKDIoDWwOHO80rH4JF2d5Fk2jiVdT4nHy5K4t0/2fojTbgPpXflLCocjxCcn 0qGyt5B6BE8ERiNtKdIBdqSKZyWwBamKtLV64zrsLU3ixLgQcl4nyccgRkb6TCSYoXcrwGUpQ9Ak qJSOxS/NMdRs3Xu/pUan5/azbo/5U+JdNdlMrClbJX/4SyVjEYROrUhdDDb18pzvgT1Ou23c4bUr Kb7mx+GJLEo5Wi0AuBPSFY4keiUMGEbnSfLBCocSlcQSeWilAFcD3JkzTeFQfGfUDACiY5qPs8Pd 53NWNu9nTumr1LRbMRryeOziP8ZdcgnwytZX5YerEf3dhOjyBkDpB+8pHUfEs7dIw2c0ySLB9FeS 0TOTfGhvzxO6JyqYobUY0Ebb4R5ZliZyG4s7O9y8bdrNypb9bLU3YnVYUas05KiSmGUYwp050075 O3+qbjOP1awHpBZEd868I2Ybp/fmQEMZpUd3gLSn7b8UDkcQfPUi8Jj54A6VtbpSnCDvhb3ZBIBa n6ZwJNFLPcDTUWusknFEK5FghtYtAAsyxigdR0AibYl8ZfN+Hqz6/LT9oS63kxq3k+UtpSwzlXBd 5gT+UDj3lP6WF4++lKsnLkaVEJ//9N/e9a788EXEqUgh+jQBK4CF+955hbPvf1jhcCKXzSS1KdLo RQXTX16tigYhWhX5TCyRh04eMANg4cDoTDAz1ckAmCMowXyqbjO3Hnqv18NH8vShZaYSinc97Uku b556G9dOvjFuk8tt1Vs5YtoP0ondxxQORxD89SpAxWefKB1HRHO0So0hvKpwgo/UyamoVRoAFRB9 y5AKEwlm6NwMqOakFpGvTVU6loCYXG1KhwBIPSvlZe7+kpPNO2fdy/nDLwxFWFHj07LP5Id/Rzqd KwjRaBVgtZsbaNy7U+lYIpbTFnsdQJSgTvFUgMU+TB+JBDN0FgJcnj5K6Tj8lqZOUjoED4vLzsNH eztg2rty04EgRhN9vKqXVuCvCocjCIFwAp8AlH/2ocKhRC5HfRUglsgDpcvKkx8WKBlHNBIJZmgU AVPVKg0/yojext0ZnQlmo9OmcCTwZN03WB3+vyP/4uBa2tqV/3Mowd3h4r2S5fKHf0PaxyYI0ext EMvkPbG3NHlWbxLTcvp4ttAbdWqh/FC0KvKRSDBD4xqA8wcURvUM7/QIqmB+2LwvoNe73E62Vm0J UjTRZVPFRnkkZDNSgikI0c6zTF7zzQaFQ4k8rXXVgDRWM0GdqHA0MUNk6j4SCWZoRP3yuLcG53FF 71/jsARlotChxvhbJnd3uFi9f7X84cOIkZBCbPAsk9ds3qBsJBHIYZFOkHst7wp+SsrybL3MUjKO aCQSzODLA6YCUb08DieXyJVW7bAE5TpmR/wtkXtVL2uAV5SNRhCCSiyT96C1Vtp/KeaQB85rD6uY TeojkWAG30KAOalFUb08DpDWGX80TPIRTtelevkXRPVSiC3rEafJu2WpqgDkUYdCILzaPIlysI9E ghl8lwPMSCns63kRL0WlBcB6hrJxjAnSFKQ0bXxN7hHVSyHGtSJOk3er6cAhQEzxCTLxl+kjkWAG 10BgLkRvc3VvngQzgNPbwZCq1pGfaAj4OsOzRgYhmuggqpdCnHgb4MjGL5WOI6IcPya1uU3KLlI4 kujntUQu9mD6SCSYwXUxoBqfnB31zdUBkhM0nscWl13BSGCJcUpAr1erNEwtnB6kaCJfl5Pjrygb jSCEzHrAbasrx1pdqXQsEcHtcIgemEHk1eZJizQuUugnkWAG10UA5xtio+G/JkElj8mi1e1QNJZb jJMDqmJeOGIuyYnxs0TuVb18HFG9FGJXK7AZoPbbjQqHEhlsDUdxuZ1odHp0mdG/VUtpXdo8iXGR PhAJZnBdBHBR2nCl4wia5M6T5EonmKlqHfflzvLrtYMzR3H1xMVBjihybave6l29fFbhcAQh1FYC VKxdo3QcEUGu5CZmiLaNwaLReYoT0X1yN8xEghk844B8tUrDWQNi57CZ4QelI5DUOCz8rc73UZFG Qx73n38fqgR1CKKKTF4zx59CVC+F2PcJQPO+bbgdyr4RjgRyi6IBObHzc0hpqpMJpthz4AORYAbP FSBN79EkqJSOJWjkaT5mBfdgWlx25pe+Rk27FaMhj1/PeQCjoX/fPJdMvTWulsYPNJTJM8cdwDMK hyMI4bAHqHHabRzdtlnpWBQnWhQFnyrZ009UVDB9IBLM4LkAYmd6T1fNCvXCtLjsLCx7w5NcPnDR Q4w0juYPl/6RO2fdy4whszAa8tDo9Bi0BgZnjuLi0ZdSPGgyAB/vW6lI3Erx+vM+j5g5LsQPMdWn U922HQAkGWPjLECEyej7KYIsftYNQ0tDZ4I5ZUCuspEEmVEzAKhXpNm6s8PNHeUr2N1Wj0Fr4P4L fuWpRqoS1EwpmMqUgqndvrbJZuJ3K/dQenQH26q39vi8WFJjrqb06A4AN9LhHkGIF6uAO45s/JKz 71c6FGXZqqWRuKJFUfBo9IG3yYtHooIZHNMBrUFroDhITcEFuL9yFess5ahVGu6YdQ8D9Zn9fu1A fSYXjpgLwHsly3F3uEIVZsRYXeqpXv4bqFUwFEEIt/WAI97bFVmrK3HabahVGu/2OkLwxM9+qyAQ CWZwzAG4LGWIwmEEX5ZG+noK9xL5U3WbWWYqAeCnM37GSKPvc92vGHslBq2BBmstmypiu4VJk83E 5spNIFUv/6ZwOIIQbq3ABojvdkVycq3NLuzaXkcQwk4kmMExA2DagHyl4wi6THUyAOYwJpgrm/fz WM16AG6eepvfy9vJiXoWTFgEwIqS5bS124IWY6T5sGS5/HAF0qEHQYg3GwDqd36ncBjKMZXtBiAp d5zCkQiCSDCDQUNnghlr+y+VUNrWwE8PfwTAxaMv5fzhFwZ0vVnDzsNoyMPqsPLJ3ticV9xkM7G1 eov84d+VjEUQFLQWoHrjOqXjUIy5fD8ASVnigE8waVM8p8jFErkPRIIZuImAIVb3X6Z1tikyudpC fi+Ly86NB97B5XZSPGhyUJqjqxLULJl6KwBfHFxLk80U8DUjzboDq3G5nQCbOn8JQjzaBViddhuN e3cqHYsi6r77FhAHfEIoSekAoolIMAM3A2CqLkvpOEIiozPBbHSGdnlZPjEutyO6c+YdQWuOPtI4 muJBk3G5nd5LyTGhrd3GFwfXyh8+omQsgqAwJ51VzNotXykcSvjZW5qwmxsASMoaomwwgoBIMIPh bIAZKbE581VutB5qf6r5knWWcjQ6PT875+6gN0dfPOlaADZXbuJAQ1lQr62kDYfWeVcv1/bxdEGI dRsAards6eNpscdUKu2/1KUZUSenKhyNIIgEMximA0yNofGQ3WlwHg/ZtVc27+eZY9LSzu1n3U5+ WkHQ75GfVsCMIdIs87d3vRv06ytl0+Gv5Yf/VDIOQYgQ6yE+x0bKB3wGDJ+hcCSCIBEJZmBSgCKA MTG4/xJOLpGHStdDPaFsiH79lJtRqzQcMe1nW/XWkN0nXA40lNFgrQWw0jnJRBDi3B6g2Wm30Xyo VOlYwkqu2ooDPsHnaG2VHyoz0i5KiQQzMNMB8hMNpKpjc0RpWuefKxSTfJwdbu6u+Dioh3p6k5yo Z/64q4DYaL7uNRZyKVIfQEEQ4DOIv32Yzfu2AWAYdpbCkcS02O11FwIiwQzMWQCjkmLzgI836xnB v+b9las8YyCDeainN/NGX+Zpvr667NOQ3y9UmmwmeSwkwNNKxiIIEWY9xNc+zMa9O3HabWh0enSZ sXkeQIg+IsEMzHiI3QM+ACkqLQBWhzWo1329YadnUs8ds+4J+qGe3tzY2bbo4/0ro7b5+roDq+WH q4FyBUMRhEjzLcTXPkzTPul7qb5gpMKRCMJJoS8ZxbYJENsHfLI1AzyPnR1uNAmqgK9Z47Dw6+rP AVg48Vq/xkD6S5WgZkrBVAZnjuKIaT+f7P2QayffGLb7B4O7w8W34nCPIPRE3oeZ0XyolKyxk5SO J+jcDgdHt23GVLYbe0sTRzZ+CYA6NXaLHREiOisSChEVTP9pgGKAAm3stoTwTijrg3CS3Nnh5paD y3G5nQzOHMW80ZcFfE1/LJ54DQBrylZRY65WJAZ/barYKFeUy4GPFA5HECLRBjhZ2Yslpe/+m7ev OIc19/6Y7c89zr5lL2OrkxYxzDs+Ze+Ti2jZu17hKGOL0+ZZwQv9xJEYIhJM/40CVAatgfwYTjAB DFpD0K71p5ovPfsufzbzzrDsu+yO3Hwd4O2d7ygSg782nqxevqRkHIIQwbZCbM0lt7c0sfI/b2Lz Xx7A1drS7XNcbid2cwMVy39PzccP0OFqD3OUscnd5jlDaVcyjmgjEkz/jYfYneDjzfCD9N9Wd2D7 mTZbqzz9Lm+ceisD9ZmBhhaQJVNvQa3SUHp0R9Q0Xz/QUMYR034AB/CiwuEIQqTaBCdHJ0Y7t8PB p3fdRv32jQDycIVe1W/fyOF3fiWSzOAyKx1ANBEJpv8mABTHwQlyeZqP2eX/mzdnh5u7KqTV3BlD ZoW032V/DdRncuGIuQC8snWpwtH0z1flG+SHS4Em5SIRhIi2BXDYzQ1YqyuVjiVgW5/5E+aDO/p+ Yhfmgzs49tXrIYgovrjtnq2Xog+mD0SC6b+RAMN0GUrHETbNAfTC/FPNl9S0WzFoDVw/5eYgRhWY K8Ze6Wlb9OWhL5QOp1dNNhNbqz2tV55VMhZBiHBOOpfJG/fuVDiUwFirKznw7mt+v77x6zdwtVmC GFH8cZ5MMEUF0wciwfTfSICiOEgwjV4nyf3RdWk8nC2J+pKcqGfu6EsAWFGyPKLbFm058o333PE9 CocjCJFuE0D1V2tp3LuTmm820Lh3Z9S1Ltr3ziv9WhLvicvtpGHLe0GMKL502WIg9hv4QLQp8t8I iO0T5F35M80nEpfGu5o3+jI2Hf6aBmstGw6t47Ix85UO6TTuDhdryz6TPxStiQShdxogDaBizUdU rDnZbEGt0jBw4gym3fNfUdHCqG6b70vj3tQqDdZDX5E7+7YgRRRf2s3H5IcOxMQ0n4gKpn/yAK1a pTmlT2SsytJIFUd/lsgjdWncmypBzdUTFgHw0Z4PaLKZFI7odDtrd8itiZqB5QqHIwiR7CygFLij u0+63E6adm3m4yXz+faJhyO+omlvrA3o9S63k/bmY30/UehLo9IBRBtRwfTPUIAcVVJQGo9Hukx1 MgBmHxPM0rYGnm+U5uNG2tJ4V97N1z8sWc5PZnT7s0kxG8o3yg9fQNpfJgjC6WYBK4Fee6vJS877 lr1M04FDXPLUv1BptWEIr3v2liZa66qxVlfSWleNvaWJpgOHOH6sFru5IeDr/+AUK7v+6HC147R5 WkKJ/Zc+EgmmfwogPmaQB+Luio9xuZ0UD5ockUvjXd06dQkPr/otmys3Ma/4cvLTCpQOCTht7rjo fSkI3csDVtBHctlV/faNbH3mT5x9/8MhCcrtcGBrOIq1uhKH1UxrXTXm8v3YTGaOH6vFUV/V4x5L tUoTlBhcbicl/3sp+oKRqFMLMQw5k6TsIhLTckhQJwblHrEoQZ2I63iz/GFgpeQ4JBJM/4yEk0vH sS6ts02RydX/IQavN+xkd1s9apWGJVNvCVVoQZWfVsCMIbPYXLmJpVtf4cGLHlQ6JEA63NNJzB0X hJ79BfDr1OW+ZS9TdMmVfu3J9E4gW2urcLRaPAmkpaKsXxVItUqDNruQATl56DPTSCsahTYllZS8 Qr575u9+tSjqymm3dV5nB6bvV5xy36TccSRlDSUpu4ikrCGok+PnbEFfvCqYoi2cj0SC6Z+RAMN1 A5WOIywyOhPM/rK47Dx8dBMA1595s+IN1X1x5YRFbK3ewhHTfrZVb42IyqvX4Z5XlYxDECJYHrA4 kAvsffMlLvjjM6f9vrx87bCYaa2twlJVgb3ZRPPhauyN/VvC9k4gB44cji59ICm5BRgKhqA1pGEo GNLja01lu9keYII5bNEjJGUXcaK+HGvldlyWKmzVB3Dabbjqyj2jJmW6NCO6rDySBk0kySglnrrM +Jxz7rJ5VsbFHkwfiQTTP4UQHy2KvDU6+9fC58GqtVgdVoyGPGYNOy/EUQWX3Hx9Tdkq3itZzqS8 yYqNs3R3uCg3HRKHewShbwuBgDbEV29cx86Xn/bsf3S0tnqSsL5odHr0BSPRpqSclkCm5BagS/e/ GDH6qhvYvfSf/YqjO7o0I6mjziFBnYgus5D0sbM9n3O1WWg9vJ0TDYfpOF7hqbjKv7wrp/Fa7XS2 eSqY3c/nFHokEkz/DAEYpktXOIzwkCf5NDiP9/nc0rYGlplKAFgy9VbFkrNAXD1xMd92ti3aVLGR 84dfqEgcqgS19+Se1xCHewShJ5MDvYDTbmP7c493+zm5opcxtABdRiaphcNIySvEUDCExAEpASWQ fdGlD2Tm7/7Elw/e49frc+fe1eM+S3VyKuljZ3uSznykgy222lJO1JdzovEwJ+r20N58rNdqZ+qw 0SQMGBaT1U6XpUp+KPZg+ij6fvorLwXp65DcRJ/2kkctX5bIH61eD0g9L0caR4cqpJBSJahZMGER r219mRUly5laOF2RE/Bt7TbvyT1i3psg9CwoZbTsM88jb/p0z/5HQ8EQ9MZBip4wByi65Eoa9+5k 37KXfXrdoPOWnFKx7I8EdSIpgyeSMnjiKb9vN1VJSWfDYU4c3eXZHmA3N2Df3gB4Ol14Krrq1EKS soZiGHZW1B4octqs8sNKBcOISiLB9J0RpOWCVLVO6VjCqq9G6yub97POUo5apeHKzr6S0WrWsPNY vX81DdZaPtn7IddOvjHsMWyt2iKfLt0JfB/2AAQhzkRy8/Wz738YXfrAHqus3tQqDYMuvgvjtIVB u78us7DbJfYTjZWnVDsd9VWnHCjyps8tYkBOHonZZ0bNErtXD1HRTNRHIsH03SCQemDGi7TORNp6 Rs/PcXa4ebDqcwDmj7sqqg72dEeVoGbJ1Fv5y7rH+OLgWuaMnBf2P9PGw1/LD30rWwhC/DkQjIto DWnBuEzIjL7qBkpe+AcutxONTn/avky1SkPa5MvInn5NWJap1cmpp1U7O1zttJuPdXugyOZZYj9Z 7ezuQFGkVDs7XO3ef8dHlIwlGokE03dx1wMzRSUtD7X1UsF87th3nok9FwyfE67QQmqkcTTFgyZT enRH2Juv15irOWLaD+AG3gzbjQUhOq0E/juQC+hzi3o9zR0Jyj54E5fbSdqIyQy99nFstaWePo3q ARno84oVT8zkw0Q9VTtbK7bRcbyC48dqsdWVR/SBIq8xkVbEmEifiQTTd9FdmvODnGC63E6cHe7T phdZXHae6pzYs2DCooie2OOrxZOu5eGjO9hcuYlziy4I277SkjrPN9sViP5rgtCXTUg9Yov8vcCE m24NXjQh4HY42PeW1KksY+KVnr2S0aKnaqf3gaL+tE8K5YGiDlc7pu2f0Lzr464N8K1I5y9EkukD kWD6LhegOI4qmN57Tds6nKR2STCfrPsmatsS9cW7+frbu94NW/N1r96XojWRIPTPfUhvyHymzy1i 5PyA2miGXOX6VdjNDZ62Q7GgPweKTmuf1MeBoqTsIr8quXZTFZUf/P60pLZTPtKG0iVIb2aEfhAJ pu/S4OR0m3ihVmlwuZ20uh2nJJwWl90zb/zqCYuisi1RX66fcjPfH9sRtubrBxrK5N6XVuCTkN5M EGLHR8CTwL2+vEij03Ph//xd8ZPifdn176UApE+4TPFl8FDrusSeT/8OFMk/p+DkgaKEAcNIGTal 1yX2Dlc75W/c11fT/CKkrRhnIiaq9UvsZQOhZwTfp9tEuxxVEjWdCaa3J+u+weV2MjhzVERMvQmF 5EQ9Pxp1Oe/veoc3ti4NefP1nbXb5IfvIZZkBMEXv+j8b7+STF2akYv+8VLEnhyXNe7difmglEAZ p1+tdDiK6OtAUdf2Sd4Hio5ufAU4tdrpPY/92Fev92siE9Kc+2eBS4L/J4w9IsH0nR5ONh+PN2aX 3fPYu3q5eOI1SoUUFvNGX8bass+wOqysLvuUy8bMD8l93B0uvj15elwc7hEE3/0CqfL/ONBt5qjR 6Sk4bw5n/9cjIW2SHix733wJgLTJl0V8W59w6utA0Yn6ctrrt3sOFPU0j91H85BGk4rG630QCabv siH+Kpjp6iRq2q00e50k965eRmtT9f5SJai5ceqtPLfpST7ev5ILhs8JyWGmLqMhvwz6DQQhPqxF mu5zFjAXuACYp0szMv3+B8ibfm5UJJYgzUKvWrcKgOzpsf1GPlhOrXZKvUDlaqe14vvTDhT5YQoi weyTSDB9l6J0AOFkcdnZZD3iabL+euNOyu3NTB2Q56leXjY6PlYLJuVNZnDmKI6Y9oes+brXaMh3 EKMhBSFQ33v9mqfLyqPokisVDsk3O19+2tOaKJZGMIabd7XTW+uRXRx45ee+Xi52WqWEkEgwfZcF J5uPxyqLy86Tdd/wfOM271YNrLOUs85ycn+z0ZAXs3svu1IlqFk88Rr+su4x1pStYubQ88hPKwja 9d0dLvYeLZE/fC9oFxYE4RiAvTG6ik72liYOfvg2AMZzblM4mtiUlDXEn5dVBzmMmJSgdABRSA8n e0PGotK2BmbveYlnjn17SnLZnQZrLe/seAN3hytM0SlrpHE0M4bMAuDtne8E9dpieVwQQqYFwNXa onQcPin74E2cdhv63KKo6nkZTdTJqehzfWqfagX0YEy1AAAgAElEQVS2hCicmCISTN9oABXEboJZ 2tbAjw6+Q027td+vWVO2ile2vBTCqCLLlRMWoVZpKD26gwMNZUG7rlgeF4SQaQBpWIS9JTrmFng3 Vs+e+WOFo4ltPv79/gnx/blfRILpG8+6eHKCzyfPIp6zw83dFR/LVTSfbK7cxLbqrSGIKvIM1Gdy 4Yi5ALyydWnQqrdieVwQQsaJVHmi/Xh0dP468NHbMddYPVKlj51N5lkL+vPU94EnQhxOzBAJpm8M 8oOu4xJjwdum3exuq/f79W8EMdmKdFeMvRKD1kCDtZZNFRv7fkEfvJqri+VxQQiNRgCH1ax0HH1y OxzseOEpALJm3BDzjdUjweDL76fg0l+g0fV4fscKXIeoXvabSDD9YNAa+n5SFFrasK3vJ/WizXWC nbU7+n5iDEhO1DO38/T8ipLltLX71erCw6u5+grENzBBCIVmAIcl8hNM7+pl5plXKB1O3DBOW8iY ny9j0HlLAKlf6qVT7pA/bcCryCT0TSSYvklXOoBQsbjsAVUvQdrfVG46EKSIIt+80ZdhNORhdVjZ cGhdQNfaWedZHv8w4MAEQeiOlGBGeAXT7XBQ8ro0FlJUL8NPnZyKWp8GQO6AfEbln43RkCd/erJi gUUhkWAKANT5cKinN9WWY0G5TjRQJai5esIiAD7a8wFNNpNf12mymWiw1gI4gPVBC1AQBG9NAO2t wfleFyoHPnobW125qF4qqL1+OwB5WeMBGKg3yp8qViai6CQSTD8YflA6guDzHgEZiDZnW1CuEy2m FExlcOYoXG4nH5Ys9+sae04e7tmAmD0uCKEi7cFstSgdR49E9TIyWCqk7iCpyZkApKd52hiJCqYP RIIpAMFrHJ87ICso14kmt05dAkgn6WvMvvff/b7Gs291ZdCCEgShqxYgotsUieql8lxtFuzmBgCG 5Uj5pJxoIhJMn4gE0zdpSgcQKsN1A1GrAm+9NCg1NwjRRJf8tAJP8/WlW1/x6bVt7TYONuyRP3w/ qIEJguCtGcDe7N9WllATJ8cjQ+thaXncaMhDo5b6XQ/KGC5/uhipH7bQDyLB9E1w1pEjkCZBxaL0 wLaXqFUaJuTG5xs8ufn6EdN+n/qBltbvk6cl7QGia46dIESXE0oH0BtxcjwyWCulBDM7fYTn9wzJ mXIBRguIgfD9JBJM38RsgglwZ860gF4/wjguqLO5o8lAfSbzx10FwHsly0/rB+rucFFjruZAQxnb qreyrXorBxrK2FnjaU/0SXgjFoS40wBgM0XeKXJRvYwcLksVAPmZo0/5/YyTB33Ghjei6KVWOgAh chQnG7k752yeOfatz69VqzQsnnRtCKKKHhcMn8Pass88zdenFk5na9UWvq/ZwcGGPX3NdZ8MzAdW IfpgCkIotAE4WiPvHN3uN14Q1csI0OFq53iFtGXJa1kckCqand0+xgAfhT24KCQSTD9Yz1A6gtD5 bf75lJ5oZJ2lvN+vUas0/HTGz+K2eilLTtSzYMIiXtv6Mm9tf423tr/WV1LpbV7nrxrgL8DziERT EILJDOC0RVabIu+Z47lz7xLVSwXZaktxuZ0YtAYMJw/2AJBy8uPxYQ8sSoklct9E9B6eYNAkqPj3 iEXcnXN2v55v0Bq474LfMKVgaogjiw4DtCmA1HTeh+TSWz7wFPAdMC54kQlC3GsBcLdFVgVTrl7q c4tIHztb6XDiWmuFtGVpcM6Zp33O6yT5iNM+KXRLVDB9YwdpJGIs0ySoeKjwQobpMriv8tNun2M0 5DFr6DlcMHwOyYk9zm6NG+4OF+/teps1ZauCdclJwPfArcBbwbqoIMQxO4CrtUXpODzsLU3sXvpP ALJn/ljhaATroa+A0/dfwilL5kWnfVLolkgwfSN9g/KvMhV1KuzNAMwYMot5xZdT33qMFG0KA/WZ DNRn9vHq+OHucPHKlpfYXLkp2JdWA292PhZJpiAExgrS92+3w4FKq1U6Hna+/DROu01ULyOAq82C rU7aGtZ1/yVAUmKK/DADGEjnZCihZyLB9I1n846zw40mQaVkLCHl7HDz75Z9AJxbdAH5aQVxv8ey J+/tejsUySWA/A9sKdIUkrWhuIkgxIlWwA2onG3HFU8wrdWVHHj3NQDyLv6ForEIp/a/7Lr/EkCj 1mLQGrA6rABDEQlmn8QeTN84kb5B0dYR21XM74/XYnVYMWgNFGWe/m5OkHx56ItgLov3RAu8h1ia EYRAWQDajyu/D3P783/F5XaSNmIyKYMnKh1O3Ouu/2VX6SmD5IdiH2Y/iATTdzaAVrdD6ThC6i2T NB/77KHnoEoQhe7utLXbWOHn/HE/GIBnw3UzQYhRLQAOq7K9MBv37qRijdTpJu/i+xWNRZAcP7QZ 6H7/pcyg9ySYg0MfUfQTCabvrBDbCaazw83yllIAJuVNUTiayPXWttfk5ZJwmQfMDecNBSHGnABw WJRLMN0OB1/8v18CkHnWAnSZYjCM0uymKuzmBtQqjWf+eHe8WhWJBLMfRILpOzOA2RW7Q33WmA/h cjsxGvIYaez53Vw8a2u3sbV6ixK3/r0SNxWEGKH4GJ/db7yAra4cjU5P3uzblQ5HAKwV3wOQlz7M M3+8O16tiow9PknwEAmm704ANMdwq6LXG3cCMGvoOQpHErk2HFqnVDeBWYi9mILgLxsot0Rura70 tCUquOLXqJNTFYlDOFXroS8ByMvqdw91ceK1H0SC6btqgJYYTTAtLjtfHpdmsU4fPFPhaCLXttpd St7+GiVvLghRzAbQ3qrMNJ+1v7kXp91G2ojJoi1RhHC1WTAf3AHA6PzeB4x4LZEP6u15gkQkmL6z QOxWMD9uLvMsj4tel91zd7iobalQMgQxNkkQ/KPY3qadLz+N+eAOaWlcHOyJGH21J/I2QJcmPzSE NqrYIBJM31kBzDGaYK5s2Q+I5fHeHLUeVbrZvuhpIgj+sQI4Wi3hvWl1JSUv/AOAnNk/FQd7Ikjz rg8BGJ43w5eXifF1/SASTN8dAzC52pSOI+icHW7P8viE3J5P0sW7+tZjSoeQpXQAghClzCCNaAyn tb+519Pz0jhtYVjvLfSsw9XO8Yo9QN/L43DKNB8VkNLLUwVEgukPE0Cj06Z0HEHnfXpcTO2JaAZA o3QQghCFwr5E7r00PvjKR8N9e6EXlv1fe37m9bU8DnQ9YZ4YssBihEgwfTMQmAnw5fEq5uz5F/dU fMJma5XCYQXHavNBACblTlA4EqEfdEoHIAhRqBnA3mwKy828l8bFqfHIY6tYB/i2PK5Wed7bi+/B fRAJZv/NByqAWwFcbie72+pZZiphQdnrPFr1Bc4Ot7IRBsDZ4ebT1kpANFePAg6kucqCIPgmbJvn 3Q7HKUvj4tR4ZHG1WWja1ff0nq7O0HgKl+nBjyq2iASzf+YC79PLybHnG7dxf2XIZ1KHzBrzIc/s cdFcvXdDMoYqHcJBpQMQhChlA7CZQt8Hc/cbL4il8QjWeni7Z3k8N2N4v1+X9IMqhFHFFpFg9k0D LEXa1Nsjl9vJMlNJ1C6Xy8vjZ4vT430aqM9Eo1P0EGGJkjcXhCgWls3zNd9sEEvjEc7P0+Pe0vp+ SnwTCWbfFgH5/X3yW6bo/Nm/yVoJQFHmSGUDiRLD0xX9e1qv5M0FIYq1AThaQ7fDpHHvTtb/5k5c bieZZy0QS+MRyJfm6l3ptOLweH+JBLNv0315spyoRZMah4WadmmyRXH2GIWjiQ4XFJ2n1K0dwAdK 3VwQopwdwGkLzSQfa3Uln//ids+0nsGXi4bqkahhy3sADM4c1a/T4z3ICFpAMUokmH3zqWO/9YxQ hRE6GyyHAemLLTlR9I/tj0l5kzFoFRnm8CYQ3iZ+ghA7Qrb50t7SxKq7b8VubkCfW8TQax8P1a2E ALWUfArAmMG+V5eTEgcEO5yYJRLMvtX78mSrw8qcPf/i0aov2GytioqT5d8drwFgVOYwhSOJHqoE NXNHXxLu27qBv4X7poIQQ04AtDcHd1iC2+Hg07tuw1ZXji7NyPAb/0GCWrRJjEStR3ZhNzeg0ekZ lhPQQBFRjemDWukAosA64L99ecHutnpKHc08c+xbDFoDU3VZXJ4+igtSh5KvjbzN3nvbpBxa7L/0 zbzRl7Hp8Nc0WGvDdcvHgT3hupkgxKCgN1p3Oxx8ds9PPCfGi278mzjUE8EsJe8CMDp7atfG6f2S rEmWH4oEsw8iwezbWmAnMKmvJ6pVGt4bsZhyezPfHa/h09ZKrA4r6xxW1lnKARifnM35hqFclDac swbkoUlQtuWBs8NNqaMZiIj2O1FFlaDmZ+fczWNrHgrHbPI9wEOhvokgxDhpD6Y9eIfJv3r0fuq3 b0St0jD0uj+LOeMRzLv3ZXHhrEAvlxRwQDFOJJj9swj4jj429f6l4CJmGAqZYSjkJuMknuhwc8je xOfmclY076PU0czutnp2t9XzzLFvUas0nD+gkBkphVyUVkRxsjE8fxovh+xNuNxONDo9A/V+b3aO W4MMg/jpjJ/x3KYnQ3mbGuBKIORZrCDEuHb5gdvhQKX1vYLl7dsnHqZizUeoVRoKr3qAlMETAw5Q CJ3mPev86n0p+EckmP1TDkwD3gKmdv2kQWvgyYKLuDxj1Cm/r0lQUZxspDjZyD25M7C47GyyHmG1 +SCbrJXUtEuVzXWWch6rWU9+ooFZhiHMSxvBLMNgUtWhmUS12VrF1uO1HLI3eZbH0xPTqDFXixnk PlIlqJlSMJWbp97Ga1tfDsUtaoBLkf4NCoIQGE9/Imfb8YASzJ0vP82+ZdLXfOFVD4h2RFGgcfOb AEwZ8SO/r6FO9Gx/EEvkfRAJZv/JSeZcYA7wM8DwQP7/Z+/Nw6Msz77/D5mZzCRDJiEMgSwQSEJC NAhhBwFRNhHqgqhVH57i1mLro1UeW/tUqa32tW/9adXWal8t2getFHeLoCyCyB4g7CGQBLInw5Bl khkymZn4++POPYRA1rlnzfU5Dg6SMHNdZ0Jm7u99Xud5fq/nR3HZ3RKD0WodC2Mz3EI0z2ZiU10h uxtK+LaxhLJmC2vMR1hjPoJapSFTG8stsVcplt3cbSnh6ZJNHLVd3rdkspTz7IZfkRmfzV1j7xRC s4dcl3YD/bVRvLX7r0oelx8DbgR8VuQpEPQBLIChubEB3YCBvVog78P/5eAbUpd4/MxlQlwGAbXH t9JUZ8KgNXjU3ONsrlcwqtBGCMyes7n1z3RgeqoutteZRnd2k6k4WlzsbyxnU10B31rOuI/Sj9qq eb5sKwatgZuihjOpf1KvmoVeq9jN82VbUas0nT4urzKX503HuHvcUq5Lu6FX31dfZfzQiQyPfZF3 c/5BXmWuJ0u5gL8AzyA8xwUCpXF68uSyXdvY/cenAUlcJlx/vxIxCbyM7NyTlTKvV809Mm0ymIIu EAKz9xwDphc21SiymCZM5a7fBGn4+bb6M3xZm09O0zksdgtr7FJ2E3rWLPSe6RDPl0nmL93Nrq3O WUV/bRTjh15WESDohIF6IytmreBAaQ7rT35FsTm/N8tYgT8jxKVA4A1sQKzd0vORmGW7tvHNEw8A MHjcTCEug4Qmcwl1p3NRqzQ9du4R9B7h2t57UoAFCeEGFnjBNtCg1nGNfghLjFk8HDee6wwjMKoj udDiwOSwYnJY2ddYxhrzEV6r3sf+hjKaWpzEqiMwtMmo5tlMLC38hJbvW7q9t/zYQ+UHmTp8OpHh kV08Q9CehOhErku9jnFDJxKrH0he9fHLHqNWaTBGxZMyZDzj025k/riHMNWept52XguMA94Duv8f JxAIumIgsBwwOG1Wqg7tw3zyKNbqStRaHdroju2lzx0/xOaf34fT0UTMyGyGLxGD1IOF8q1vY6vI 5+phM8kcOs2jtc5UHcJUfxZgP9IYQ0EHiAxm78mDizMkvUn77GZnzULAJc1C75071OuaQKfLwWdH PuKBqcsV+176GkkxQ4nQRPDJ4bWoVRoeWfQWDqcd4IrHNLOzH2L1d7/B0WSdDvwP8FvfRiwQhBwD gYeAu2gzbq5kywbg0lMdXUwcCZOmcPU9DzLo6ouT6dpaQAqXnuDCaaunLldy7lFgNJGgBwiB2Xvy APLsNThaXD6dZ9ndZqGPavM8bjjJKd3L3eOXCgtJDzhvNQMQqZbGpnVW/2OINDLn6qVsOPAmSDWY O5FqfgUCQc8YiPQaWg5c9qK70ntjU52Joo1fULTxC2JGZjPj178lKmHoJRaQwqUnuDDt/Riny0Gy MUOMJvIxQmD2nnKgxulyxBY0nffLDEuZ9s1CG+sKONBYzmc1JyhToKM5r/qEqMVUAJ02qluPy0ia Qpn5JEeLt6mAfwHXIDrJBYKecDPwOpDU2wXqTufy72U3o4uJo6nO5LaAFC49wUOLsxnzPsm5pze+ 4wLPEF7knpEDcKCxwt9xuNGEqVgYm8HKYTewLG68x+s5XQ4a7aLXxBMaWn9+EeH9u/2cmVl3E2dI BGm4/xqg8/Z/gUAg8xTwOR6Iy7Y01ZkAGHbrM0JcBhnmg+twNFmJMySSoXxzj+K2o6GGEJiecRKg SKFOcqWpc15QZB1rc6Mi6/RFXC1Ot0Bv42HbJRq1lkWTH0ej04M0EksUfQkEXfNC6x/FKd/4Ck6b mIEYLLQ4mxUZrN6eNnMw7YotGqIIgekZxwDyLpzzdxxXJEXXqbNlt9H3IPMmuBRVmNot0Hs6P02u x2zlMaRjP4FAcGUeRMpeegVrRSEF7/+cFmdz1w8W+B3zwXXu0gYls5diDmb3EQLTM7YCfNtYgqPF 5e9YLiNVIYGZahypyDp9FTmDGRXZc6/3jKQpTMtcIn+6GshSLDCBIHTIQjIn8Cr26hJKv/6zt7cR eEjb7OX1qYsVXbtNBtOq6MIhiBCYnlGI1OhDQdN5f8dyGRP6J5IUbvBoDYPWIGwjPaShybMa1knp i0g2ZgAYgM+QumMFAsFF3uAKneJK43Q5MO//nIbiw97eSuABcvbSU1vIK2Fz2BRdL5QRAtNzAq7R R0YTpvK40cdit/DStpcoqytVKKq+R51dutGN7kUGU2bR5Cfkpp9U4H1E049AIHMzUp2yzzDtXOXL 7QQ9oG328tqsezyyhewCs7cWDhWEwPSc3QD7Gsv8HccVeXjIJEZHDu7Vc+MMiahVGvIqc3l2w69Y m/s+tmZxKtBTlLjj1ai1zBpzn+wlPx/R9CMQyDzp6w3rTufSZC7x9baCbuDN7GU7xMWwC4TA9Jyd 4BtHn96gCVPxj5FLenxUHmdI5Om5K/n9whfJjJdepBtPbuDpdU/ybcE33gg1ZLnQ2uTTmxrMtiTE pjF37APyp48Bd3u0oEAQ/KTi4+ylTPXeD/2xraAT2mYvs1LmeSV7eeHiVBVxVt4FQmB6zl7AddRW Tb0zMMdiJWmj2Zr1ILOjU7v1+Mz4bJ6eu5LIcD0D9UZWzFrBL2Y/TZwhEYvdwuqcVTy36TlOmU56 OfLQoKm1yae/rmOf4+7SrunnHWCCx4sKBMHLTf7auLFgt7+2FnRA2+xldspcr+zRdHEudJ1XNggh hMD0nAZabSN3WIr9HErHRKt1fJBxF++k3c7s6FT5qNWNWqUhMz6bh6c/xopZKy6zhkyPG8VzC37P 0on3Y9AaKDbn88ctz/PStpfcVoiCK2OxWxRdb1L6IjmrrAW+BhIV3UAgCB5m+WvjpjqTmIsZQDht 9VRtfQvwbu2l7eJ86VqvbBBCCKtIZcgBsg40lrv9wQMV2cP80aJ1rDEfYd6oBUwbMZPYyNgu/cZV YWquS7uBicMms+74Z2w8uYG8ylx+/eUxbhg5h0VX3yo8y9vRtmY1Irx7VpHd4YZxyzn/3e8wWcpj ga+AaUg3OwJBXyLdn5tfOHeWqOQx/gxB0Er51re96doDgMNpb+thb/LKJiGEyGAqwyaAby1n/B1H t5FrRlON6STFDO2RMIwM13Nn9r08u+AFMuOzcboc7vrMA6U53go56FHyjlp2+jFoDSDNAPwQ0Vku 6HsM8+fmF6oL/bm9oJUmcwl1uesBmDXmPq/tc6HZfQ/vQtzQd4nIYCrDdoA8ew31ziai1Tp/x9Ml ta1p/iht77NqSTFDWTFrBQdKc/j4yEeYLOW8seNVko0Z3DXmDtLjRikVbtBywSH9nFstHxXFEGnk xkmP8smu/4vT5ZgPvAY8rPhGAkHg4tcjE6e1jiZzCerIaOFT7mWazCXUHN3MhcrDOKxS2VH/IYmE Dx5Hc/VBnC4HycYMEmLTfBGOqI3oBkJgKkM5UOh0OVJ3WIoD/pgcoMolCZ+Bes86mwHGD53I2MRs vj65ni+Ofequz5w6fDq3XrNEkT2CFVlgRnyv8sr6cmf5hgNvAiwHTgDCakTQV6gHlLEs6wWV29+l cvu7gFTHro4agCoyCo3egDYqClfYADSRA1DrY9DoB6DuL4Wq0Q8gPGYIYepwf4UeNDSZSyjf+BJ1 p3Mv+zdrRSGt+R0AJmfe4dVYGpvcfT2i/rIbCIGpHJuA1GCow6x3NrnrSGIiPO9sBqk+86arbmZy 8jQ+O/IRu8/uYPfZHeSU7uXmrNuYP+omVGF999dN50GmuCsykqZQbzOzK+8jgD8BxcAXXttQIAgc avGjwJRPJhxNVpwuB846E9R1XZqnVmlwuhzdFqUa/QDUkdGEhUf0KVHaUHyYM2uewtHUvZGTe/M+ ZNHkJ7zW4NNgcze0VnplgxCj717xlWc7sDwY6jArmqXjBYPWoLjoG6g38sDU5czPXMg7Oe9SbM7n k8Nr2XFmJ7dfs4TxQycqul+gIzf5RIT39+o+k9IX0WAzc7R4mwpYCywCNnt1U4HA/xQgzcL0C+kP /A2dcRgtzmZami/gtNXjsNbibKyR/rbW4bDVomqpxd7QgMNqwWVrwNkgJcB6Ikpl+ooobTKXULT6 ibZNNV1SbM5n3d6XvSYy6y8KTDFlvxsIgakcG5HmYarK7PUkaQO3HqeudV7ngKh4r+2RFDOUZ+Y+ w4HSHN7Pecddn5kZn81dY+/sM/7mDXbf1YHPHrsMZ3M9eZW5WuBj4FrgmM8CEAh8Ty6Ss5XP0ej0 6IxSj1GYOpwwdTjqyGj317qiN6LU6XL0SpRqdHpUOn3QiNIWZzNnP/1Nj8SlTLE5n9yiTUxKX+SF yNyc8+bioYIQmMpxHjgITNxWf4b/iBvr73g6pLCpBoBITaTX95LrMz8+/C++Ob1Zsp2szGXeqAV9 aqyRL37WII0vsu19mWJzvgHYAExBqhEWCEKRLcBT/tg49qrxHj1fFqVh4RE9EqXNdVU4rK0Z0G6K UkeTVTpmbiNK5WP6jmgvStXRUowdiVIlm5zq83e21lf2jl15H5GdMlfxLGZtnTsmMT6gGwiBqSxb gIn7GssCWmDWtHaQx2h9I+5UYWruzL6X2enz3fWZG09uYM+ZndxyzRKmp8zs0/WZSiKNL3qCD6UZ mUmIGZmC0GYzUAYk+XpjfcpsRdbpSaYwTB2Ozjis24IUpAHkbbOkQIeitLmmyl3veLkolZpsZJOO K4nTK4lSWZAC3Ral1bv+t9vfX0d4I4tpc7jdIQPXVSWAEFd1ZfkSeGp9w1leanGhCfNO57Cn1LUK zPjoBJ/uK9dnzkidxb8Of0ixOZ/VOav4Ov9rlk28LyTHGjX68IhcRp6R+dH232GxW7KA9UiWekJk CkKR14EXfLmhLiaO6Ixrfbllr5GFnJKi1Flf0vq1K4tSdUMtVpcDWZRCx8JUo9MTHjvkkqN7T7KX 8l5tso2KUdvg7u2pUHzxEEQITGXZAZRZ7Jak/Y3lTDX4dQZwh5id0l2Y3suNJx2RHjeK/5n9K3YU befz1vmZf9zyPJnx2Syb+KOQGmtkbW4EQB3u25pceUbmpzl/wtFknY40iP0HQM+LmgSCwOZ14El8 2E0+aOo9Qdk4012UEKVtBSmAs74Eh9WC2taAS86O0ipKPRSUl8XicnDeqqzRjsNpb2v7G/jdvAGA EJjKswm4b1NdQcAKzHMO6YXd34ujc7qive2kXJ8pbCeVIyE2jdsmPt52EPsa4IcIkSkILRqAR4B/ +mIzfUIqcZMW+2KroKKnorSzJid5tmivY1Epb2rWxsXHgtRzIegCYRWpPJ9BYNtGmhxSVs0TFx+l kG0nn573u8tsJ78t+Mbf4XmMP47I25IQm8biab+U33AXA3/za0ACgfJEAXN9sZFGp2f4bb/1xVYh T9uu+6jkMQy4+nriJi0mbvLtHq/tdDkYqI9TIMqLtBmyXqTowiGMEJjKswGwHLVVk2dTNkWvFLJN ZCBlCGXbyV/Mfpo4QyIWu4XVOat4btNznDKd9Hd4HhMV6b9jf9ntp1Vk3ge84rdgBAJlSUWaQXyf WqVBF6OsqGiLWqVh6KJf9OjYWNBz1JHR6BM8H206IEbZ8ahlZvd16ISiC4cwQmAqj4PWAdebvFBk rASyTWSEJsLPkVxOetwonlvwexaPuRONTu+2nfz77jc5bzV3vYDgimQkTWHu2AfkTx/Dx00RAoEX mAPsA8bqYuJIWfoyGQ/9nZiR2YpvpFZpGHbb0wy4+nrF1xZcjiFthsdrjEqaokAkF2nj4nNK0YVD GCEwvcMGgM9rAu9Gx9HiUtwmUmlk28mXFr7M1OHTAdh9dge//vJJ1p/4AleL088RBicZSVNYMH65 /OlTwG/8GI5A4AlPIY3gitUnpJLx0N+JSh6DOjKaEXe+iHHCLYptJItXIS59R9zk2902nL0hMz4b g8KnRharu4NcCMxuEphzdIKfYmCFyWENu9t4DQa1zt/xuKlsbuBv1TmoVRpuzgrsQnWNKpxxQycw buhEztSVUWs1kVd9nO0F32DsH0dCdKK/Q+yS41VHKTQXEKOPI2WI/2ejGg1JhIWpKTWfAJjV+uVv /ReRQNAjBgLvAf8FhBkn3ELKkudQtZnp26Bjys8AACAASURBVC9MRUz6NCIGDedCxQmc3fSxbo9a pSF2/A8YcftviRiUrEjwgu4RptHRLzwSS8GeHj9Xo9OzcOKjaBU2t9h94kPsLjvAHxBjirqFEJje 4QLScOu0QZr+TI4KHFvE8mYL75oO0j+8P/MzF/o7nG5h0EVzXep1JMYM5VR1Hha7hf0lezlcdZzU gSkYdIFry1lce5a86uMMjhkeEAITIHFguhCZgmBkOlL50WS1SkPijY+SeP0D9Otg3nBE3AiME25F 0z8Wl+0cjlb/766QhWXyrf+DcewCwjSBkyDoS+gTM3FYa7BV5Hf7OWqVhsVT/hujQdm5+xabmT2n /g3gQhqJ1azoBiGKGFPkPT4C5n9ec4JHE6b6OxY3sg+5LgA6yHuKbDv59cn1fHHsU4rN+Ty74VdM HT6du8cvDaimpUBHdrjYlfcRwLOAHenOXCAIRJ4CngdUupg4Uu99uVvNNmHqcKkzedJimswlWIr2 01x9kMaqclw2acJDW9cZw/BxRGdcG9IzLoOFFmczFyqOdfvxcYZEZo25j4TYNMVjadNBfhZhWNFt hMD0Hp8Cfzlqq9bm2UxkRnqvu7EvIddnTk6e5rad3H12B/urcvlBxkLmj7opIG0nnc31/g7hMtqJ TLnpR4hMQSAxEHgfmA8weNxMEhas7JUAvGixGNilQQKJ0q//jLWiEIPWwJKZKzlZtoeC8t2YLOXu x6hVGhIHpHBV8vVkKNzU05Y2HeSHvbZJCBJ4V+LQ4TywDZi/qa4wYASm7EMe4ScXH6W4ku3kJ4fX suPMzoCynfSXW1J3uYLI1AJi0J8gEJgOfIDkM+4auuDnKjHgvG/QUHwY8/7PAbg26x4MkUYmpS9i UvoiHE67e+h5RHgUGrXW+/Fc7CDP8fpmIYToIvcu/wB413TA33GELOlxo3hm7jMsnXg/Bq3BbTv5 0raXKKsr9Xd4brckm8Pm50g6ZlL6IqZlLpE/fRYxwkjgXzRIv4PbgCR9QipX/+w9IS77CE5bPSWf PQfA6ORZl2UmNWothkgjhkijT8QlQHXtafnDwBsNE8AIgeld1gGWsmYLuy0l/o4lpLku7QaeX/Qi 80YtQK3SkFeZy/MbV7I2931szb3rIlWSC62e5IFKO5H5FGIYu8A/pAI7kX4HVcYJt5B+39/EcPM+ QouzmeLPVtJUZyLOkMjMrLv9HRIOp73tsbzIFvUAITC9SwPwMcAH5iN+DiX0kW0nf7/wxYCxnRwc NQSAJj9bRnaHSemL2s7JfAx4AymbJBD4ggeB48BEjU5PypLfkrxwhWi46UNUffcedadz0ej0LJr8 uM8ylJ1xzuI+CSsDyjt5qKAdQmB6n1UA6xvO4mhx+TsWN4GeUfOEgXpjwNlOXugXOP/3ndFuGPty 4F2EyBR4l4FIN+JvAdqYkdlc9V9rxGDzPkbt8a1Ubn8XgDlXL1V8UHpvadPgs92fcQQjQmB6nx1A ocVu4V/mo/6OhVh14NlDegvZdnLpxPv9ZjsZGxkLgKOXw579gSwyW73L7wHWIESmoGPmIN1IFwBN gLP141Wt/9YZdyM5oyxWqzQMXfBzUu95FXVk4M62FShPk7mE0nV/BK5cd+lPai9aPvd86nsfRwhM 3/A2wJe13R8Y6y1iWl2FguHIVglUYWquS7uBlxa+zLxRC4CLtpO+qM+MDNfLQg2LLXi81GXv8tbY FwPfAME3PFXgTbKQvMA3Afch1U9qkQw8Ulu/tgn4rvXztshZy38i2z0ufwfRyNP3cNrqOfvpb3A0 WUk2ZgRE3WVbCmrdzpC7/RlHMCIEpm9YDbi21BeSZzP5LQhHi4solVTTEixHtkoh12c+u+CFy+oz D5R6d/JEZGvWuM2w3qAgI2kKi6f9UvYEno50RBT4/pwCXzAHqRlnYjceOx1JiE5o/fxm2mQt42cu E408fZjiz1a6510umvxEQNRdylhsZvn0yY6YgdljhFWkb2ig1Tqyf1g410WP8EsQqn5hWFx2/lad Q4vTwc2j+162wKCLZtrwaSTGDKWkrowam9nrtpP7yg5SbzvPsEFXKW5h5m2iImJJis2gtPoQdpd9 CHAL8CXQ1ndvAvCfwJLWf58ARCP59QpLtdAjC/gaMPTgORFIvx+Tgd8BEfqEVJIX/wbj2AUd2j0K QpuKrasw534F4Lpl2pNhMfrAmBctc7b6CAWV+0E6Hn/bz+EEHeJV7TuqgP886bDwcNx4VP38kzyO CNPwcsVOAOZkzEej6psdmgnRicxKu55wdTinzaeotZrYVrCFc40mkmOHExkeqdheBaY8yupKiIsZ TuLAdMXW9RVREbGkJkwkr+YQziZrLNKR+SbgGqRjzpVIGa0pSOJyFlJt3U+QTkn2Ai1+CF3gHdYB Kb14XgSQqVZpGDzjP0m+5dfoYkVCvK9Se3wrpRukaWgLxi8PGzH4Gj9HdDmHizZjqj8LUinHFv9G E3yII3LfsZkAaPbRhKkwaKXEQ42txm9xBAKy7eTvF77I1OHTgYv1metPfIGrxanIPlE6qXSxIYhq MNtjiDRyz8RfEGdIBMlZZT+SyBzbydNikQZm70McrYcKN9O9Y/EOiZ/3MxKuv1+MH+rDNBQfpuTT 5wGYlrkkoJp62lJcdVD+UIjLXiAEpm95G+AdPzv7JKukmsBAGEAeCMi2k7+Y/TTJxgycLgefHF7L Mxt+rUh95uCoeCAw/ch7giHSyB0zVso3KD0plBoLfIvU2CEIbn7k6QIXzp1RIg5BkNJkLuHMmqdw uhxkxme77WoDDYvNjMVuAan+cq+fwwlKhMD0LW8B9qO2ar86+8RpJH/shj7SSd5dZNvJh6c/5rad fGPHqx7bTsYbEgA4b/Vfg5dSFFXlym+6PSUV+H8KhyPwPZM8XeBCxTEl4hAEIU5bPYXvP4GjyUqc IZEbxi3v+kl+4mSZeypRDlIfhaCHCIHpW84D74B/nX0GafQANAqBeUXGD53Ii7e+dont5LMbftWr sUauFicD9dLA4JogF5gOp52dx/7pyRKLkTqKBcHLIE8XaK6pUiIOQZDR4mym4P2fu20g75ixMqA6 xtvTZv7ll/6MI5gRAtP3vA7wUW0eZXb/HJka1VIDS3VDpV/2DwZUYepLbCeBS2wnu1ufqQpTExMR g1qlwelyBNUszPZ4kL1sy+NKxCLwG4GrCAQBS4uzmTNrn2wzjigwbCA7o838yx3+jCOYEQLT9xwD djhdDlZV+6cWM6Z1LmNDk8hgdkVb28lkY4bbdvKZDb/utu2kKkxNbOv4jZNle6ioKQhKoXm2QpEy pFlKLCLwG2WeLhAeO0SJOARBRMWG31F3OhfAdeOkRwPGBrIjKmoK5PmXFkT9Za8RY4r8w3ng7pMO Cz8yXoMuTO3TzU9fOM/XdaeJihjItOHTfLp3sDJQb2T6iGsZEBnL2fOF1NjM7DyzndPnz5AxKL3D sUa2Ziub8r/isOkoLU4HlbWnOXp2G7lFGzlx9hscLS7iopNR+fh3oDfsO/VvrJ6XVUQALyPmYwYr E4DRniwQnTGTmHTxvtNXKP7yJc4d2IhapWH+uB8H5Dii9uSV7qLUfAJgG/C//o0meBEC0z/kA0vs LntctErH5KihPt3c6mpmjfkIYWEqZqfP9enewUxYvzCGx45gRuosXN+7KDQXYG6sYlvBFmzNVkYM TL1kruiB0hxe3fZHDpUfpMXpAKDl+4vjIO0uO6XmE+QWfU10ZFzAD2E/evYbJQQmSGUiIn0enFiQ hur3mqR5j6CNEVnMvkDF1lWYdv8LgPnjfhyw44jas+/kx9TbzgO8hjRmTdALxBG5//g/AO+aDuBo 8a1tY1/zI1eazmwnvy34BoD1J77gjR2vdqtm0elysOHAm+w7tc7boXtERHh/pZbyuJBT4BdSgf/2 ZIGYkdlEJY9RKBxBIFOxdRWV298FYMH45UEjLh1OO+W1RfKnn/gzlmBHCEz/8RFQVtbs+8HrCeHS oHWL3aLYMPG+SFLMUFbMWsHD0x8jzpDors/8ny9/ySeH1/Z4vX2nPif/4miMgMOgj1dimUJE9jLY GAi8AhwH5qtVGtmfvkdodHoS561QOjZBAGLa94lbXAbyIPUrUVSVi9PlAOm9qtzP4QQ1QmD6Dwfw R4CXK3b4NIsZrda53XwqLaKT3FPGD53Icwt+z+Ixd6LR6TFZevee5HQ52HnsnzicdoUjVIYk4ygl llmtxCICn6AB/gs4BTwGaGNGZpOx/B1G/PAPPRKZGp2eET/8AzrjMC+FKggUTPs+cVtATstcErCD 1DuizOxu3gzsI6UgQAhM//IuUOOPLKZw81EW2Xbyh6Pv8mgdi91CUVWuQlEpS0bSFNkq0hPeUyIW gdeZAxxEqkGL1cXEkb7sz6Te8yo64zCikseQ/sDfiBmZ3eVCMSOzSX/gb+JovA8Q7OISLrGHFALT Q0STj39pRhL5c47bqrk/bjyqfr7R/F/VnuaMvZYUYxrDY0f4ZM++wMdHPsHc6NkgaQ0u0hID80hp YHQyx0u2e7LEVGA94pg8UMlC6pr9LRCn0elJnPszkm/5FbrYS28u1JHRxI5eQNSIcfRTh9MPJ46G WgD0CalEZ8wkad4jDJmxDHVktM+/EYFvqdi6ivItbwLBKy4rago4WLQJpDrxnwEtnT9D0Bkig+l/ XscPWUzZzUcMW1eW8prCrh/kgzW8RUJsGtMyl/T4ecnGDPlIdSKwB2ncjSBwkOssD9FaZ2mccAtX /dca4iYtJkwd3uETo5LHkLxwBWn3vuL+2qiH3iF54QqRtewjtG3oCVZxCZccj29GKmMTeIAQmP6n AXgRfFuLmaYbKG0uhq0rigJON4qs4U0mpS9iwfjlqFWabj1+dPIsbrv2Vyyd8Vv5iD0JyR3jbi+G Kege7essVXKdZfLCFSLzKOiSUBGXAAXlu+UPN/gzjlBBCMzAwOdZzFRdLAAVjed8sl9fobuiy9tr eJuMpCn85w0vkGzMuOK/q1Uako0Z3DnjaWaPXQaAIdLIHTNWytabWuCfSFmzwP+GQ5O7gTxa6yz1 CamX1FkKBF1R/OVLISMuLTaz3KDpAj71czghQeDbh/QN5CzmCy9X7OAu42g0Yd4tj03RDQCgVhyR K0qsPq7XXeRt1wgGDJFGIjWSg9Ho5FnuLvOoSCODDEOv6DWsUWuZP+kxBpxax668j0DKmo0HfogY CeIrbgZ+j1RviS4mjkFT78E4blGnR+ECgUyLs5mKDb/DfFCqxw6mOZcdUVlTIH+4G8ltT+AhQmAG Dq8DPytrtiS9UbWPRxOmenWztrMwbc1WIsN7PtdOcDljE65howcCU63SMHjASAUj8i4FtacAyBw2 nYTYtG4/b1L6IqIjjWw+vhpHk3U6Ul3mfUi1TwLvMB14ofVvNDo9Q65/SAhLQY9ocTZzZu2T1J3O Ra3SMHfsA0EvLgFOFG+VP/zSn3GEEuKIPHBoQOrc5LVzB6h3Nnl1s7azMGtsNV7dqy8xbcRMj57v dDmYGCTHTBU1BTiarKhVmh6JS5mMpCnt6zK/QhJA4shcWSYg/Wy/A6arVRriZy7rVgOPQNAWp62e U+/8hLrTuQCuxdN+GRLisp17jxhPpBBCYAYW/wAKLXYLr1bs8vpmE3WDAKhu8GysjuAi8Yb4DusS u8Po5FkYIo0KRuQ95I7LkXFZvV5DrsscnTwLpLFpTwE7kWwJBZ4xAfgYyKFNZ/jVT3xCwvX3iwYe QY9oMpeQ/9YDWCsKMWgN3DnjaVVvbiwDkXbuPcf8HE7IIARmYOEAngB489wByuz1Xt1MjCpSFluz lVe2v0qxOb9Xz48zJDIzK3gaq8vPSQ1pA2I804IatZbZY5exYPxyOas+EWnId/D8MAKLtsJysSws RWe4oLc0FB/m1N9/QlOdiThDIktmruzVqUWgcrZir/zhh/6MI9QQAjPw+ALY4XQ5+GP5d17dSB5V VFlf4dV9+gJldaU8v+l35FVKdUlLJ97fo0xmsjGDRZMfv2JjTCDS9khplEJHZBlJU1g650X552ZA 6jJfBUQpskHoMx3pKDwHWAxcIixFZ7igN5j2fULR6idwNFlJNmZwx4yVQXPK0h0cTjunTe6kpai/ VBDR5BOYPA7krDEf4eEhk8iM9E5XsTyqqLDmjFfW7yscKM3hrd1/xelyEGdI5KfXPkJSzFCmp8zk 48P/4pvTm+Xjl8vQ6PRMHLGA7JS5QSMuAc5ZSnG6HBi0BkUvNhq1ltuu/RX7Tq1j36nPcboc9wEz gWVIszMFlzMH+G9gPkiNYgPHTMU49cdCVAp6TYuzmdKv/4x5/+eAVL4zM+vuoHqf6g5tjsdrEO8x iiIEZmCyHyl7c8/vSrfyQYZn/tYdMUY/BIAaqwlXixNVmPh16AmuFidfn1zPJ4fXApAZn83D05a7 O/JVYWruzL6XRVffSk7JXgrOnaLOLnm/nzYdw+lycNvEx4PyqEmuv0weMs4r609KX0SScRTbDr+D yVKeCmxDGuW1EuGwIXMz8CStXeFqlYaY7JsYPPkOISwFHuG01VP82Uq5mSfoZ1x2Rhv3nrX+jCMU EYoicPkFcPuW+kLtlzX5LIztfeNIRyRpo1GrNDhdDiotlSTFDFV8j1DF1mzljV1vklcpvQHPG7WA 28fcdUWRHhmu57q0G7gu7Qb31/6++012n91BmflkUApM2fFCnn3pDRJi07hjxkq2H/uAo8Xb5Aag G4GlKFuIrwHGAGMBIyAXKVYAxUhNR4EyF08D/AjpZ5EKQlgKlKXJXELh+0/QVGdCo9MH7U1wd3A4 7ZyszpE/fd+fsYQiQmAGLuVII1uefaZkE/Ni0rwyfD1TG8tRWzXVDVVCYHaT81YzL217EZOlHLVK w0NTf8r4oRN7tEbaoHR2n90hNcoEWWbA4bS7h8nHe/nCIzcAJRlHsfPYP7HYLWORMvzPAi/hWTZz DtLszUVINZ+dcQzpAvQW/hGbA4GHkDKWsSCVVxgn3UHc5NtF445AEWqPb6Xk0+fd5T6LJj8eUvWW 7SmqysXRZAVxPO4VhMAMbP4PsLSs2ZL6Qtm3rBx2Q5dP6CnXGUa0CkzRSd4dDpTm8Pb+t3E0WTFo DTxxw696Jcyz4q8BoNicj8NpD6q6pqIqKWsbZ0j02cUnI2kKKUOy+ebgm+RV5mqRbr4WA/fT82zm HKTj9rE9eE5W657PAm8Cz+EboZkF/AxJCGtBOO8IlKd9vWVmfDY3jFseVO9LvaHN8fhqf8YRqogu 8sDG62OLUlobffJMpxVfO9RYf+IL3tjxqrub8vlFL/Y66ztQb5QHjLsFW7Agvyn72nFItplcMH45 Gp0epHFG+5GOi7tDFFJX+iZ6Ji7bokWytzyFJFS9gQapvvI74CiwHNDqE1JJWfJbMn/2TzEgXaAY TeYSTr3zE7e4nJa5hPmTHgt5celw2skr2yl/+p4/YwlVRAYz8PkC+Nrpcsx/8uxXijf8yJ3k5TWF iq4bSrhanLy79212n5VOUDqrt+wJsq1kmflkULlhVNdKNyPerL/sjIykKcTHprH72Ptts5kLkTrN O/pFTkRy6OitsGxPLNJIoKeBPyi0ZiLwYOufJLjYER59zR1EJY9RaBuBQKL2+FZK1/3RfSJz46RH Q7besj1tusePId2oChRGCMzg4GfAcW80/EzoL2XRhCf5lWlfb3n3uKWXNOv0FleLk7GJ49l4cgPF VQeRtFHgY7GZ3T+LlCHZfovDEGlk/qTHGF62p62f+UEkwffndg8fCHyL8u5AKuD51o89EZk3IzXu 3NK6JrqYOAZcc5OorxR4hfZH4snGDGZnPxTS9ZbtaeM9Lpp7vIQQmMFBIW0afqYbkolW6xRZWBOm YnTkYI7aqsmrPtHjZpVQ5pTpJG/ueA2L3YJBa2D59EdJj1Mma6cKU5NqTEOt0mCxW6ioKQiKzEFl TQEAiQNSAuIITc5mbsl9i2JzvgF4DSmb+QBSo5wG2Iz3rCdVSK/NYuCDHjwvFfgP2mQrAWJGZhM7 5laiM64VR+ACr9BkLuHsp7/BWiEl+0N5BFFHWGzmto5rov7SSwiBGTy4G36eKdnMaynKvSFc3Sow C82nhMBs5duCb1idswqQ7u5/Ou1hBuqVvbtXhakZGZdFXmVu0Iwrki3VEgeN9nMkFzFEGrnt2l+R X7aHTYf+jtPlmA+cAFYA41HuWLwz3gT20fERPUg1oHchZSuny1/U6PREZ80RY4YEXqXF2UzVd+9x buf7bpOEvnQk3paTZXvkD79GuhEVeAEhMIMHB9I56ndrzEe423gNUw3KXIwm9U9ijfkI+eYiRdYL ZtrXW04dPp1lkx/02hD6CUnZ5FXmUlC+OyiyCAW1pwD/1V92xhWymW/5cHsD8C4wo93XNcACJGF5 O62d4CCylQLf0T5r2Ve6xDviWNFG+cO/+jOOUEcIzOBiB/AOcN/TJZv46qpliszGHN8/AYDy2qI+ 7ehz3mrmr7vecB+dLB5zJzdddbNX95w4bDKrc1ZhspRjsZkDugaqoqYAR5MVtUoTsFkPOZu579Q6 duV95OvtpyPVU24ArgPuQaqrjJUfoE9IxZA2Q9RWCnxCi7MZ88F1VG58HafLgUanZ87VS4OqqVBp 8sv2YLFbQJp9ucHP4YQ0fVNJBDdPAnOP2qqTlJqNmRkZh0FrwGK3UGguUKzOMJjwZr1lZ0SG60k2 ZlBszudk2Z6AzmLK44lGxmX5OZKu8WOG9XUgkjaiUhcTR/+0qcRmzRGd4AKf0T5r2Rcbea5Em+ae 1xC2s15FCMzg4zxSV/nnb547wB3GLDIj4zxedKJuEFvsFgrMp/qcwPy24Bs+OLja7V6xYtaTitdb dsb4xDEUm/MD3tWn/NxRAAbEeKtfRjnySvxmypEEQlQKPKPJXELN0c20NBZhb2gAQB09DMPwcV2W VLSvtRRZy4u0a+5525+x9AWEwAxOvgD+6XQ57nmk6N+KHJUvHJDBlvpC8kynuekqZYIMdFwtTj4+ /C82npROSaYOn87d45f6fFTT5ORpfHJ4LcXm/IA9Jnc47ZTXSjW6o4LgQiWNfvIP8TOXkXD9/X7b XxC8OG31VG15keqD26/wr7mY93+ORqdnyPUPETdp8WWPaCg+TMlnz9FUZwJE1rI9OafWyR9+gmju 8TpCYAYvjwI3HrVVxypxVC7XYZ42HesTdZi2ZisvffuyT+stO2Kg3hjwx+TnLKXuztNAv1hZbGa5 xsovOGy1fttbELw0FB/mzJqnZG/sDnE0WSnd8ArN1QdJWLCSMHX4ZcLUoDVwbdY9ImvZBovN3Na5 50/+jKWvENoqIrQ5j+RP/PlfqvYwNybNo67yvlSHWVZXysvfvIDFbkGj0/PghAf9Pp5JPiYP1G5y uf4yecg4P0fSNfKsTn9xoaKn1uiCvk6TuYSi1U/IzjLdovrgduwNTxKVdh1VW99yC9PRybOYmXV3 n+0Q74iTZXvkn++O1j8CLyO8yIObL5C6yvlZ0RfUO5s8WuymqOEAFJhPeRpXwHKgNIfnN67EYrcQ Z0jk+Xm/97u4BOmYHHB3kwcaBeW7gcAcTxRouGwN/g5BEES0OJs5++lveiQuZepO51K64RUcTVbi DIncOeNpZo9dJsRlOxxOOzln3A3jL/ozlr6EEJjBz2NAYVmzhWdKNnu00KT+kqHIgfLDCoQVWLha nKzNfZ83dryK0+UgMz6bp+eu9GkzT2cM1BvJjJesF9sMAQ4IHE47JotUrhQfoOOJ2lLvZ4Hu6uKI UyBoi/ngOnend2+ZlrmEe67/fcCOD/M3uUWb5AxvIVJiRuADhMAMfhqQBrC71piP8J7pUK8X+kGs lJ0qNudjaw6di6St2cor2191N/MsHnMnK2atCDjf9QlJksBsMwQ4ICiqygUgzpAY8PWXAkGwUXP4 3x6vES1elx3SLnv5jD9j6WsIgRka7ACeBvhF6SbK7PW9WiRarWN05GAA8qpPKBacPymrK+X5Tb8j rzIXtUrDw9Mf81szT1dMT5mJRqd3e5MHCnL95eABI/0cSffw98VWpQusGxdB4NLibPY4ewkXX6OC y2mXvfS5+0JfRgjM0OEl4Guny8GPTn+Eo8XVq0WuM4wA4FDZAQVD8w9yvaXJUk6cIZGn5/0uIOot O0IVpub64TMBOFrwpZ+juUh17WkgeOovo/woMNUqDbpBiX7bXxBcNNdVKbKOxVqpyDqhhsNpb3si 9AfEYHWfIgRm6OAAHgBqjtqqWXG2dw5Ydxgll5b9Vbm4WpzKRedj1p/44rJ6y6SYof4Oq0umjZAE 5mnTMRxOu5+jkUZ7mCzlqFUaUoZk+zucbpEQm4ZapfHL3k6Xg4h4MVhd0D0cVjHSypvkFm2SR5aV Af/wczh9DiEwQ4ty4C48qMfMjIwjKdyAo8lKoTlwjmm7i63ZykvbXuKTw2sBmDdqAT+f+VjA1Vt2 RFLMUJKNGThdDnKLNvk7HPfIn8QBKUHVmZo4IMUv+6pVGqJSxvtlb0HwETFouCLrRGoiFVknlGiX vfwtInvpc4TADD02A8+BVI+ZZzP1eIHphuEAfFe4TcGwvM95q/myess7s+8NuqHxM0dcC1wcDeRP zlbsBSBx0Gg/R9Izrkq+3i/7qqMGCGtIQbdRR0aji/Hc6jcY7Ft9jche+p/guvIKustvgalOl2P+ vafWsjXrQaLVum4/+W7jNawxH+F45RHvRagwB0pzeHv/2ziarBi0Bp644VdBcSR+JSYOm8yao//C ZCmnoqbAr6NHCmqlmajBUn8pkzIk220c4EtcTVYqtq4ibvLtqCOjfbq3wHs0FB+moegAFyoP03Su HFVkFBq9gai064jNmt2r/+uG4sOYdq5y2zp6wq68jyg/d5Srkq8X7j2I7GWg4JmBtSCQ2QDcbnHZ Y0/YTNwSm4mqX/cS1kM0/Xn7/FEshMywDgAAIABJREFUdgujBl8VMLMiO2L9iS9YnbOKFqeDZGMG T8/7TcDH3BkaVTi2JslRqdFWTeawGX6Jo6KmgKNFW1CrNMwes8wvMfQWVZgaR4uLUrNvpyG0OB00 Fh/i/N6PcNafpp9uINqYIT6NwV+0OOxU7/oAgIRZ9/k5GmVoMpdQ/NlKyr9ZRWPxIZpqqnA2WXE0 1NJUU4WlYA/n935Ei8uFfujV9Avr/JLa4mzm3P7PKV3/R6q+e5+mGqnJR63S0PJ9S69iNGgNuGih 1mqioHI/J85+g6PFRVx0ctCd3ijFgYKvKJDGqxUCDwG9++EKPEIIzNDlAvAN8B9n7LXaiuYGFgxI 79YTVf3CKLCZOGarpuX7FsYNneDVQHuLrdnK/+5bxaZ8qaFp3qgF/GTqcrQ9yNYGKkMMCWzO/4p6 23muGjYdrR9qrPJKd1FqPkHGkDGkJQZfViRxYDpFlTlY7d531lGrNMwf92NGJkzA4Wig1mrCWlnM +UMbqD38JYSp0Q5IIEwT/L+bHRFqArOh+DCFq3+OzVTS6eNavm+hsfgQDYU7icm8/or/x03mEkx7 P+bsR89Qe/I7HA21aHR6rk68lkWTHkGr6d+rmyGD1sCSmSsZM2IOEVoD9Q1lWOwWSs0nyC36mgZb Dbrw/kRFxPZ47WDF4bTzxd4/yYL9ESD0nEOCBCEwQxsTcAK485itOixeE8U1+u5lU2JUOtaYj2C5 UMecjPmEdTP76SvOW838329eIL/6OGqVhnsnLGPh1bcEXJy9JTI8ktPnz2BurMLpaiZlyFifx7Dv 5MfU286TPnQ6iQO7d3MSaCQPHsPR4q29zg51l6uHzWRi+iKMhiQyh83gqmHTcbqaqbWfo7mxzp3p CuWsZigJzIbiw5I3uKP79rvf2xq5UH2cmMzZ9AtT0eJspi5vOxWbX6H0q7/SWHyIFqcDXUwck0Ys YNH4n5KWMAGtJpLEgelYm+ow1Z/t9n5qlYYfTFmB0ZDkXiNr+A0YDUlYrJU0tK53vGQ7lefzCAvT YDQk9eKnEVxsO/IeVbVFAMeAn/o5nD6NEJihTz7QDMz5uu40V0XEkR7R9fHxUG00H5w7zLlmC0MH JJMQHTiz/U6ZTvKnrX+gxmbGoDXwXzNXBPR8y95ijIxl55nt1DSWk50y36fHXQ6nna3H3qfl+xbm Zt/vlwyqEmg1kURHxlFQud9reyQbM5g77seX/P9oNZGkDBlL9vA5GA1JV8xqOi80EjE4JWSymqEi MFuczRSufozmCz3LfLd83yIdoV+op/70bko//z+cP7LRfQyeGZ/NxIxbufGa+0gcmH7Z6zllyFjC wtRU1p7u8oYozpDIgomPXFafrQpTYzQkMXrEbIbFZdHiaKDuwvk+c3xusZnZcvgd+ef3ENL1T+An hMDsG+wAhgATvqwvYFr/oQzVdl2UXt3cyL7GMjRhmoA5Jl9/4gve3v0GdpedZGMGK67/BUMHDPN3 WF5hoN7I4arj1FpNaNQ6n2YRq+vOcvTsNgxaA1Myb/fZvt7AaEhiQP8hnDUdVjyTmWzMYNHkJzoc 4SRf8DOHzWBYXBZh/cLcWc3G4kNU7/qACxWH6BemQxub2GUNXyATKgLz3P7PqTm2pdfPb64uoqnq NE5HEwatgfHpP2Bu9v1c3Zpd7IzEgemMSprmzn63OC/tTYkzJDIz616mX/1DYvSdd59HRcSSljiF UUnT+szx+Y7ja+Xs5Q7gKT+H0+fp5+8ABD5DA6wBFhu0BraNWkpSJyLT0eKioOk81x17G7VKw8u3 /sWvsyRdLU7e3fs2u8/uAGDq8Oksm/xgSN6Ft+VAaQ5v7HgVjU7Pj2e/7LNZlPtOrWNX3keMTp7F 7LHLfLKnt6moKeCrfa8p1lne25+Nw2mnqCqXE8VbKTZfTLBodHqis+YQmzUnKEcdOW31HH7xBwCM /812P0fTewr/+Rh1p3M9WiPZmKFIR7fFZqaxqQ6AQYahHr3+5d+7A6f/jclSrnis/sZiM7Nq03/L n85AEpkCPxK8t8uCntKC1Fk+x+6yJ35Zm8/CARkYOmiIUfULY5BGz1e1p6hqtmDsH8fw2BE+DVjm vNXMy9v/xLEK6U1/6cT7uW3MHSFTb9kZCdGJ7CnZS4P1vE+zmN8e+QdWewPj024MmbqtqIhYsobf QFNzY49q3dqji4lj8cTHGTPihl49v21W86ph04nQGrA319NgPY+tIp/zhzZg3ruWpvpqVFp9wNdr Om31mHPXU3/0Y6yVxQA4rDU011UFXWNTi7OZsn//yeNM97BBo5mYvsjjeLSaSKIiYomKiPX4Zrr9 8XlYvzBqGssvOz6PiogNypKY9ftepd52HuAT4P/zczgChMDsazQjvfhut7jssbsaSrg19ip0nbxx 1TvtbLecpb7ZxnWp1/ksUBm53tLUUIFBa+CxWU+GZL1lZ6jDVBypyKWqsZjs4XO8nrV1OO1sO/ZP AGZm/TAoLzYdoQpTkzJkrLsJp6axvNtiQj6evPGa+xQ7VpSbM9pe9Gvt53A0WS8Tm9877AF1jO60 1VO68XVKP32eulO73OISwFaR3+MRPoGAvaac6r0feb7Q9w5Gj5jt+TpeIioilpQhY694fH60eGvQ HZ9X1BSw6+SnAC7gFkB4cAYAgf+KFyjNBeBj4E6Tw2rYVl/EPcYxHc7IHBUxiDdM+6m1mhg3dCIG ne+GR39b8A1v7f4rFxwXiDMk8ss5T4dsvWVnDI8d4dMsZkHFfgoq9xNnSGRC+g+8upe/cDfhpMzH aEgiIrw/ERotWrUOFf2I1hsxRiUwbNBo0hImMDf7fiak/8Cr2Vz5oj8pbeEVxWbtiW2Yd32Atewg zgsXUGn1fhvm3mQu4fS7P8NSdLBTgd6dET6BhNNWz7mcTzxeR681BLTAlJFvcLLTFjCg/xB3M1ow dZ87nHbW73tVHkf2Z+ADP4ckaEXUYPZdUoFtQNLs6FT+d+QSNB1kGO7O/xdb6guZN2oBd2bf6/XA XC1OPj78LzaelOZb9pV6y874tuAbVueswqA1sHTOi16txdxy6F2OFm8LqfrLYKaipoC8kh2crj9x meuLLiaO/mlTiRg0AkPKBHRG79+AOW315L/1QI8daPQJqaTd+0rAORw1mUuwFO2nufog9UUnFXHW yYzPZv6kxxSIzvfIv295ZTtxuqQmI4PWQFbKPEYlTcEQGVgmFnK9OFADDAe8P/hW0C1EBrPvUgts An54xl4bcdha1aHbT0SYhs9r8jjXYPL6TExbs5U/bn2RgyV7AFg85k7uGndvn6i37Aw5i1ljM3s9 i7kn78OQq78MZuTM5oThc901m2G4sNotNF9ocB9Hn8v5hNrDX9J87ghN9XW0OJvR9I9V/Gi64qvn qT/T86HgjoZaXM02YtKnKRpPT3Da6qk/tZva41sx7X6XsvWvUbX7X1gK9mCtLMbZZFVkn2CeHRtM x+cWm5n1+1+Xs+iPAnv8HJKgDSKDKZgAbAEMnWUyxx36C2XNFpZOvJ/r0nrX3NAVZXWlvPzNC1js FjQ6PQ9OeLDP1Vt2htxRrlZp+M8bXvBKJkHuxFSrNPzkxr/4rGtd0HMcTjvnLKWUmU9Sfu4o5bVF 7oxTW/QJqfQfkkhY/xQi4kYQMTi115nOJnMJx1//j17HrFZpyFj+jtczrU5bPRfOneVCdSEXzp3B WV+CtfQUjisISLVKQ+KAFBIHjSbJOIoy80k5I9Yr1CoNi6f98rIZlcFMftmey6YeyN3nKUOy/fY+ 8fW+V8mrzAWpY9w/nrqCDum7Z44Cmf3AQmDzlvpC7YqzG3hp+ILLROayuPE8X7aV7Wd2ekVgHijN 4a3df8XpchBnSGTFrCeD2k/cG4wfOpFkYwbF5nxyTq3zyvF1ZU0BAIkDUoS4DHA0ai0JsWmSkElf dIngrK0rpLymEIvdgrWiEGtFIbAdtUqD0+VArdKgHTzMLTzV+hg0+gFEDE5FHRnd4TF29d4PPYrZ 6XJQc3QzCdff79E6IIlIp62eC9WFOKy1biHZdK6802PuOEMigweMJMk4iqhI42VCcJBhKDlnNlxR jHaHkXFZISUuATKSppCRNOWS4/Nicz7F5ny/HZ/nl+2RxaULeNhnGwu6jchgCmTmAOsA7Q+N11wm Msvs9Uw69v9wuhw8u+AFkmKGKrJp+3rLzPhsHp623K8zNwOZU6aT/HHL817LYsoZgWmZS5ikwJgV gX+R5yiWmU/SYDNTXXuaGqvpipnOtqhVGtRRA1BFRqHRG1BHD0MTOYDaI+s9rlGMGZlN6j2vdvjv snB0WGtxNtZIf1vrcNhqUbXU0lhVTnNNVZcC0KA1MCAqHoM+3i0muztLMr9sDxsOvNnj702j07N0 xm8Drk5RaRxOO7lFmzhWtNE9V1at0jAyLovRaQu9LrAdTjurNz8p7/0H4Fde3VDQK4TAFLTlZmAt HYjMR4vWscZ8hKnDp/PA1OUeb2ZrtvLGrjflu1AWj7mTm6662eN1Q52Xtr1EXmWuVxoJXv/6Zzia rNw54+mQy8IILiILzwabmTLzSZzN9Zy3mmiyN1w2iF7OeiqFnD2VcdkacDVZ+d7R3ON9ZBEZqYlk QEwq0ZHGHgnJzmjTPNItNDo9t018vM+9bq50fB5nSGT8yB947fhcbkQEyoCrEI09AYkQmIL2dCgy d1tKuOXke6hVGn6/8EWPjrDL6kr5686/YLKUo1ZpeGjqT0W9ZTcpqyvl2Q3SDbuSQrCipoC130nZ 0UcWvaXImoLgw+G0c6G5wS1AAeptZhpsZvmi7gtcBq1BpdNGERHeH4M+nqjWrGB0pJH42DQiwqO8 XsaRX7aHzcdXd5ktjTMksmjy4yGfuewMX3Wfy+9TrcwFNiuysEBxhMAUXIm7gXe4gsiURxZ5km1s X2/502sfUezIva/w991vsvvsDuIMidxz/e8VWVPO2ATziBWBd1n11aMeW20atAauzbrHLRhl+uti fCIae4r8umifyZWPhIcnTA56m0Ul8ebxebuj8TcRtZcBjWjyEVyJDwArsHaN+YgWcIvM/xg0li31 hWw++RXzR93U49mUa3PfF/WWCnD3+KXsr8rFZCknv2yPIhe48nNHARgQk+rxWoLQJDE2FUulhz7d Q8YFlSCTXxeT0m8hO2UuF5ql09i+nK3sDI1ay6T0RUxKX3TJ8XleZS55lbk9Pj632MzuG4/txz6Q xWUh8Atvfy8CzxACU9ARXwB30k5kLozNICncQJndwo6i7d3uKG9fbzlv1AJuH3NXnx6e7gmR4Xp+ OPouVuesYvPx1R7XOjmcdspriwAYFUQXf4FvkLNS5TWFHq+VOWy6AhH5BovNTLE5H7VKw6ikKWjU 2oDLsAYyV+o+N1nK2XDgTTQ6PRNHLLji8XlHdZ0mSzlIXePLEHWXAY8YtC7ojCLgELD4mK1aXdHc wJzoVAwqHV/Xnaaq0cTs9LldLlJWV8pL216k+Pwpab7itf/F3Iwb+/zwdE8ZGjOUfaU5NFjP09Tc SMqQsb1eq7ruLEfPbsOgNTAl83YFoxQEMw6nnQMFX7H5wJsUVOVid9k9Wi/OkMi0q+5QKDrvs+P4 Wkz1Z8kYMoarh3tn/m9fQB7enp0yH41aR31DGRfsje7h7bV1Z4iMMBIVEcuWQ++yM+8j6m3nL1mj 1QoS4ADwjK+/B0HPEQJT0BktQD5whDYic/mQSfyj5jg1NjOjBl/VabPPgdIcXt31Cg3W8xi0Bn45 ZyWjBmf6Kv6QJqxfGENjhrLzzHZM9WcZFpfVa3eNvNJdlJpPkJ401SOhKggNZGH574OvU1x1GLvL ji4mjrlXL2Vc2o0cL9ne4zXVKg0LJj4SEA4w3WXboVXYXXYmZtwqXK0UQBWmvqL3ubmxiuMl2zlx 9htKz+d3tUwioEMyCBEEMEJgCrrDJZnMEzYTc6KGs6+xjLKGavjexYmqo1TUl6MOU2PQSUOa15/4 gtU5q2hxOkg2ZvD0vN+I4ekKM1Bv5FyjibK6Es7VFTJ6xOxerfPtkX8Ie0gBFpuZHcfX8tXBv1Fs OkaLU2rEm5l1Lzdecx9GQxJREbEM6D+Egsr9PVp7/rgfM2LwNV6KXHkqago4WLQJjU7PnGuWiXIe hTEaksgcNoNhcVmE9QujprGcC44L3X36VOATwHPjeIHXEK8YQXdw0KYmc0t9odbkaASg2JzPavOl d5yZ8dkAot7SR9w9finHK49gspSz79S6Hg9Idzjtcm0T8X1shp9AwmIzk3Nq3SUjZuRmjCs15Mhf 23nsn112lRu0Bm6c9GjQzYc8WvAlAKMGTxR1l17E7UYFPRmDpQLuRQxYD2jEFV/QE9wi86itusN3 3LzKXMkJRKXh7nFLveZdLpCIDNdzyzVLWJ2zin2nPu/xzLmiKulGIM6QKDpj+xhy80XbC3uyMYPJ mXd0KQgzkqaQMiSb3KJNFJTvdt+ktF0ncdBoslPmBp1AczjtnDYdA4KrKSmYsVgre/qUbG/EIVAO ITAFPWUDkntCp7Ns5BmX01Nm+iaqPs51aTew/YzkD7wl9y1uu7b7N/Zl5pMADB4w0lvhCQKMipoC jhZ86T5lgO4Ly7a0HUkjD2gHAnKeZU8oqsp1v4cFW+Y1WLnQ3NjTp4j5dgGOEJiCnrKELsSlTI3V xKHyXOHQ4yN+Ou1hfv3lkxSb83s0G7O69jQAScZR3gxPEABU1BSwN+/DS8a/ZMZnK+IfHUojfA6c /jcAaYlT/RxJ32GgPu6yLHgXnPZWLAJlEAJT0FOWdPeBTpeDQvMpITB9xEC9kZuzbuOTw2vZfHw1 8bFpXR55W2xmt11nyhBx4hSqXElYjk6excT0RaIsoh3yawLETFhfMjxh8iUZ9W7wmbdiESiDEJiC ntIjT8eNJzfwzenNxOrjGKiPI0arJ0oXxeCoePproxgcNYTYyFjh5qMQ80fdxIHyw90+Kq+sKQAg cUBKyGSfBBfJL9vDgdP/dgsmtUpDZtK1Qlh2wsmyPYCU2RU/I9+RkTTlkt/VLjiEVK4lCGCEwBT0 lB5PWna6HJgs5Zdc5Np6+soYtAYGRMWT0H8QUbqoVgEaT5Q2ioF6IzERMaITvQtUYWrum7iM5zeu 7NZR+dmKvQAkDhrtqxAFPkAIy95zrGgjIGXUBL6lm8fkZUgnaZdfRAQBhbhaC3rKAaDbbZXzRi1g dvp8zlvNNNgbqG6opNHeQGl9FTaHjdqGSveYE4vdgsVuueQYrz0GrQGdNsqdDY2PTkAf3p94QwKR 4XqRDQWSYoa6j8o3Hfr7ZUflcjNGRHgUBbWnpOeI+sugx+G0U1SVe8noINmOLxg7uf1BRU0BFrsF jU4vSkZ8zL5T6+QjchewGZh/hYd9AjwK9KhYU+AfhMAU9JS3gUfo5pD+aSNmMlBv7HTAuqvFSd2F OrcIbWwVog1NDVQ0nuNCcyM1VhNOl8MtQuW6QefZy29i1SoNsfo4IsL7u7Oh8pF8X8mG3nTVzeSZ TpNXmcuW3LeYnf0QJ8v2uMfJdJRFFgQfsk/4saKNbmFp0BrISpknhGUPEbMv/UNFTQH7Tn0uf/o4 8GekZtLrASNgBrYChX4JUNAr+vk7AEFQ8grwWGcPUKs03DByDndm36vYprZmKzW2GmzNViotFVib G6msr6DObuW81USTvaHLoc9ybE6Xw30kH6mJZGj0kJA7kj9vNfP0xl/jaLJ2S1Bmxmdzw7jl4sIa JMjCMufMBhxNVkAIS09wOO387atHcLoc3DnjaTGeyEc4nHY+/O538tH418CNfg5JoBDBe/X8/9u7 97io7zvf4y+BAQQZFAgqiHi/x2jU2KiJSVprc6ltskm6bbbbJO120z3dNrvdnt3utj3ZtNs07Wna pE2TnnRjWptkm6ZJk5porFFr8QqIdwRB7hfHAYaBGfgxM3j++DEEURQQ+M0M7+fjwcOAM8NHa+HN 9/L5iJW+DlwDfKavB2ROmDGk4RLMhuLB7e856Zfe0u29Ghrckg+uhja11OH1m+PIgquhAIV99Pi1 xScyIXb8RVvy4XBBKTUxjVkT5lBYV9Cv1crCugIa/vI4d638J53TC2Fur5NT1fs5WPzWRVN3Zkxa qmA5SOp9aY0dh54PhstqzOk8EiEUMGUwfJhfCH6LGTZvxNwyN4BcYE2Fs4hqVxVTxg/o0vlVi46K ueKWPJire22+Ns621F+wJR9cDQ1uyfvaPTjaPZc9eB6qW/Lvnnx7oG0/aPQ42Hzgx9x307cVVELM QMc5ysCcrNgJqPflSCqq3t/z3OWngQZrK5KhpC1yGSqpfPDF4WXgM9lpc/nWum9ZWNLVudSWfF8X lPrjUlvyw3VBqdpVxWNbBj+md9X8ewc801yGx6WCZXbaXBZk36pgOUTcXicv/ulfAHh43f/VCv4I cHud/HrHN4L/pr8BfN/ikmSIaQVThkrPnzz/N3BXhbPI/ueSHWE7i3wotuQvdUEJLr0lHxNtA7ig Z+hgt+TfK3xnkH9qU27ZFp3js5jb62Tf8ZevepyjXFmw92V22lyFyxHg8xtsPvDjYLh8D4XLiKSA KcOhBvgm8MxbR19nxdSVIXtO8Wr1d0s+uBoa3JLvfUGpqcPVfVGjZ8/QS4mJtpEQM7bPnqEJsYnk Vh24qj+Xr93DmfoCrZBZ4FJzwodqnKNcWrD35YLsWy2uZHToce6yEZ27jFgKmDJcngcedhvuJa/m b+LzNz5idT2WCq6GXu5MaqDTT5277opb8v6AD3fXiujleoZejZhoG9XOUwqYI2g454RL39T7cmT1 6nf5CXTuMmIpYMpw8QH/CPxlX3kON828pc9tZjFFR8V0B9D+bslfrmfo1VCPzJFTVL2fkxU7u4Ol pu6MLPW+HDlF1fvZW/h68N1HgBwLy5FhpoApwykH2Ag89FLuRr5z+3+FdV/JUNCfLfn8qlyey3l6 BKuSwdA4R+v5/AanHccBmD+13wPKZBCKqvezJf/54LvfxxzaIRFM3+1luH0d+ITDXZPy3ql3uWPB BqvriXgTkyYNyeskKeQMCwXL0KHelyOjV7h8GvPWuEQ4BUwZbg2YoyVfefv4m6zMXnXFCzFydaaM z8IeZx9QC6VLvo7mkw+pg8WbLxjnqDnh1lPvy+FX21jCnw7/d/DdjcCjFpYjI0gBU0bCq8Dn/AHf +pdyf8XXbvma1fVEvA9NX822U1sG/Xx7nF0rOkNAc8JDl9vr7D73Ok+X2YZFbWMJb+x9Mnim+xXg 7y0uSUaQAqaMlP8FnCisK4jLr8plWdYKq+uJaB+es56d5bu7Wx8N1OpFfU4BlX7QnPDQp96Xw8vt dbL14DPBcJkDPIh5+VNGCQVMGSmlwGPAEy/nbmT+xAUR2xszFKQmpvGF5V8Y1GWfa7NvUXuiQbrc nHD9nYYW9b4cPsFG6l2r9seBO1C4HHWirS5ARpUDwMeNgDHJ1ebi+qzlVtcT0SYmTWRCQgpHawc2 j3xWxnIyU+cMU1WRye11knPiNd4/spEKx3E6z3eSbs/k5kUPcOt1nyPNPsXqEqWH2sYSDp35E7b4 RD6y+EF1txhCPr/BjkPPU9FQDGYj9dWA09qqxAoKmDKSOoF84PPVrsqozPFZZCRnWl1TxIoaE8W0 lOnMm7iA0w2leIyWPh8bE21j7qTrcLbWU+U8yYRxkxSK+qFnsKxvOkPn+U6y0+ayav59CpYh7GDR 2ziay1mYuZpZGfpBdyhtz3s22EjdAG4DhmcahIQ8BUwZabXAWGBN8dlCbpp5C7boWKtrimipiWnc MutWsiZk4/F14GytJybaRlrSZKamzOL2+Xfw8MovsnbmWtr9bZQ6Syh3HGFK2gKSxqZYXX5Iqm0s Ye+xTfzpyK9xNJd3B8v1y77EDXM/oWAZwnx+g62HfkHn+U5uWfw3+jc+RHx+g7f3/ZASs6+oAdyF GqmPagqYYoXdwN1GwEjXVvnIiBoTRUZyJmkJKewp201W6mwe/9h3WDVtFdNSpneH/HkTF1DaWIHD XUOxI58pKXP1DbiHYLD884nXcLbWA+Y4x9uWfoEb5n5Cf1dhoKQ2j+Kag6TbM1m14D6ry4kIbq+T P+x9ktqmMvggXG63tiqxmg6eiBV8wKeBvH3lOXFLpizTrfIRUueuBSDBlnDJ34+OiuHRm7/KT3Y/ TWFdAW/m/pjP3vSfo/6Wbe854THRNmanL9Kc8DCk3pdDy+118kruD2h3O8A8c7keyLO2KgkFCphi lePAE8BjL+duZFrKdDVgHwGejlYAxsf1fYM/OiqGL616hO/+6XEc7hpe3/0499787VEZMjUnPLKo 9+XQqm0sYevBZ2g3b4tXA7dgdgwRIcrqAmRU+x6Q6zbcvJT7KwKdfqvriXitXRd9kuKTLvu4hNhE vrnu26TbM3Ebbl7f/Thu7+i5CFpUvZ9Xdv4HW/Kfp8JZREy0jWuzb+Fvb3uCDy95UOEyTKn35dAJ NlHv0YroQyhcSg86gylW6gR2AA86W+vjYmNimX3NXKtrimj7y/dS7apk1fSbmZYy/bKPtUXHsiRz KUfrjtHodVLjPEH2xOuI62N7Pdz5/AYltXlsy3+OI+U78RgtxETb+NC8e/jwdQ8yP2tVxP7ZR4v3 cn+GETBYNf8+XcS6CkXV+3lr/1N0nu8EeA/4GGpFJL1oi1ysVgo8ArzyxpHXmJU2hznpmoE9XGpb zwEwLu7yK5hBqYlpfO2Wr/OjXT/E4a5h84Efc9fKf4qo1Z9LjXPUnPDIU9tYgttwExNtY8akpVaX E7YOFm9mb+HrwXdfQRN6pA/aIpdQ8CqwEeD5nGfwdgxuvKFcWVvXGcykfgZM+CBk2uPs3SEzErbL fX6Dg8Wb2bT96+wtfB234cYeZ2fV/Hv54oef4oY5dylcRpDCSrNjzvwpq/W/6yC9f/ilnuHy+8AD KFxKH7RFLqFiB3C/ETBSyl33J8iHAAAgAElEQVQ1rJq2yup6ItLvDr9C5/lONlx7Dwmx/d/uTYhN YPnUlRytO4bDXUNpzX5mZqwIyy1jn98gv2Qrfzz0LBX1RzACBvY4O7cteYhbFv8tU69ZoMkuEUa9 L6+Oz2+wPe9ZTphnWAPAo5hn6EX6pIApoaID2At8ztlaHxMTHaPzmEMs0Onn7WNvALBh0d0DbnCf EJtwwZnM0pr9TEyZHTbfrINTd7Ye+oU5ztHv6x7nuO76vyPNPkXBMkKp9+XgBXtcdo1+NIB7gU3W ViXhQAFTQkktUA9sKDx7gnkTF6h10RBq8jayvWgrMdE27l48uG+yCbEJ3DhtFSfPncbRUhsWzdgv Nc5Rc8JHl78c20Szt4HrZqwnM3WO1eWEDbfXyeu7H6fRPBLTiDn6cae1VUm4UMCUUHMIyAaWHqs9 zPKpKwe0lSt9q3ZVsqdsN2lJk/nwnHWDfh1bdCwrspZz8txpGt11FNXsIzkhPeSCWl9zwtcv+xKr FugW8Wjh9jrZdfxVANYtfTgsj3VYobaxhN/ue4I2oxXMy5hrgRPWViXhRAFTQtG7wMeMgJF5uqGM NdNXEzVG99GuVnljGXmVB0hLymDtzLVX9Vq26FjWTF/dPVay3HEEiAqJ1aErzQkP5dVWGXpHynZQ 5TxJdtpclsxcb3U5YaGoej/v5P4Uv68dIBezgXqNpUVJ2FHAlFDUiRkyH2z2Noxt8Dg1r3wInD5X xNHaAhakzx+Sv8+oMVGsnHoDHQGD0+eKqHKexNPuYsakJUNQ7cDVNpaw/dAv2HvqTc0Jl25/PP5L /O0e9b7sp4PFm9l59NfBHpdvAPcALmurknCkE+0SqmqATwFb95XnRE9OzuCOBRusrimsBcdEXmmK z0BER8Vw/9IHGBeXxBtHXuNYxS7cnjruWvnPI9YKpveccDCD5Y2LHoiofp0ycLWNJbS7HOp92U/v H36JYxW7gu8+jXlbXGRQFDAllG0H/gl45o0jrzExaTLLslZYXVPYqmuuBfrfZH0g7liwgYlJk3lh 38+pcBbx33u+xYZrv0hGyqwLHhdsal5z7hhtHa00dbiYEDue1MR0pmWsZMakpf0OpkXV+8k//Ucc bnPnTnPCpTf1vuwfn99g84Gngj+kBTC/7v7U2qok3ClgSqj7KbAAeOSFfT9nYtLjTBmfZXVNYcll mA3sE2PHDcvrL8tawcSkx/n5np/hcNXwxt4nWbfk88yd8iHA3Ho7WPwW/sCFfZkd7R4c7hoK6wqw x9lZvegz3c+5FAVL6Q+f36Cweg8A86eusbia0OX2Otl84MfB/z8ZwP3A29ZWJZFAZzAlHGwDbug8 3znrUFWubpYP0vun36fZ28DqGTeTkZw5LJ/DHp/MjdNWUe6qweGuoaQuj6ioGI6XbqGgbAdRUdHB s12XZAQMSuryLjrLGZwT/nrBM5wq+zMeowVbfCIfmv0J7lrxj8zKWK7bwXKBYO/L+PHp3Dr/U1aX E5JqG0t4e+8P1IZIhoUCpoSDTuAt4ONGwEg/3VDGiqzlA24UPtq9deS3GAGDuxZ+Ent88rB9Hlt0 bPfln1JnCVXOk92Xbi4XLoNiom043VVAFOnJ2eSXbGV7/vOcqNqDv93zQbBc9g+auiN9Cva+vGH6 7SHR3SDUHCzezNb85zECBsBh4Cag6PLPEuk/fWWWcNECfBI4WOEsSnlu7/M8evNXFS4GwOtvA2Cs beywf67el38GIriFvrfwdY6f2YbbcANgj7OzaMZHWTpjnc7TyWW5vc7uS1/zLnPcYjTy+Q12HHqe wrqC4IdeAR7B/BorMmT03VnCSSmwHni/sK7A/tKBX/L5Gx+xuqaw4O3wdAe38WPHj9jnza85clXP dxvu7nOZA7kAJKPbKXNmNtlpc3Uut4faxhK2Hnwm+EObLvPIsFLAlHCTB/wVsHlfeU5cUnwS9y99 wOqaQl6jtxEwVwFHatW32lV1QeugwfrsR36oYCkDUlKzD4AF2bdaXEno6HXJrhq4G/Prqciw0HgU CUfbgYcAtp3awrsndeHxSrwd5g3y+GFoUdSXUufpIXmdc+6qIXkdGR1qG0twuGvU+7KL2+vkzT1P sLfw9WC4fANYgsKlDDOtYEq4ehVIo6tHZmLsONbOus3qmkJWi2Eer0pNTB+xz3m2pW5IXqfF64Re /TRF+qLelx8oqt7P9hOb8LV7wGxB9GXgl9ZWJaOFAqaEs58CGcC/bcp9EUAhsw/BsDc+LtHiSgYm JtpGs9lCReSK1PvS5PY62Xf85Z4XeXKBT2OeYxcZEQqYEu6+AYwFvrop90XGxSVp2s8ltHatYA7l mMgrmZg0+apfwx/wkaxLGtJPZ+oL8Ad82OPsF02RGi16rVoGgO8A3wN8l32iyBDTGUyJBI9izs3l uZynya/Ktbic0NPSbgbM4RgT2ZfJ9owheR2do5P+Ollh9ghfNOOjFlcy8oJnLbfkPx8Ml4cxz1r+ JwqXYgEFTIkUjwIbAV7Y93OFzF6CYyKHYlWxv+akzyPdfnUTg7LT5o76c3TSP6O59+XB4s38esc3 gn9+A3gMuAE4bmVdMropYEokeRjY6A/4FDJ7afA4AEgawRVMgPVz1w/6uTHRNsAMDiJXMhp7X9Y2 lvS+IZ4LLEerlhICNCpSIs27wJTO851L8yoPkDx2PNNSpltdk+XeOf4mRsBg3bzbh3VMZG/TUqZz uqGse1TkQHSe76TZ20BpzX4S4ieQZp8yDBVKpPjz0V/hMVpYNf++iP+34vMb7Dr6G3Ye/TXN3gYA N/B14O8Ah6XFiXRRwJRIE5xbPglYfrS2YNSHzECnn98f+S0A91x3/4jPcF+ScR0nz50OfiPslxun reELN36JMlc1jpZaSuryqGsoJDNtPnG2hGGsVsJRbWMJB0+/Q0y0jXVLPh/RI2SLqvezef9TVDV0 DzF4A7gLsz+wSMhQwJRI9Q4wAfjQ0doCYqJjmH3NXKtrskSTt5HtRVuJibZx9+L7Rvzz26JjWTN9 NR0Bg1JnyWUfGxNt45OL7+VT1z+APT6ZNdNXExsTy2lnMU0eB8cqdgJRpCdnR3SIkIE5WPQ2juZy Fk69mVkZy60uZ1i4vU52FbzAvuLNGAEDzGk8fwV8H80RlxCkgCmRbCsQD6wpPHti1IbMRm8Du0re Z1zsONbPv9OSGqLGRLFw8mKuz1pBbEwsLR1teLpaJ8VE2+g83wnAtz/2XyzLuuGC582+Zi43TltD jfssDncNVc6TVJwtINaWGPFboXJlPr/Be8c20un3ccvivyFpbIrVJQ0pn98gv2Qr7+Y9i8NdA2br oR8Afw2csrQ4kctQwJRI9z7mrcqPFJ49wblWB9dlLiFqzOi533b6XDF5lQeYNGEaa2eutbQWe3wy Cycv5sNz1nHnwg18dN7t3L34Po7Un6DZ20DWhOxLHmdIiE1g5dQbyJqQTfHZQhq9Tkrq8mh2V5A+ YZa2zUexkto8iqr2YY+zc/O1D1hdzpAKboeX1BcEfwh7D7gHc5JZh6XFiVyBAqaMBjlADXBntasy qrSxgpVTbxg1IfP0uSKO1haQkTyVVdNWWV1Ot6gxUd3nQT1GM4VnT+A7T581Ro2JIiM5k5tm3kLg fICKpgoc7hptm49yfzm2iWZvA8vmfJzM1DlWlzMkahtL2H7oF+SVvtdzO/yzwLfQJR4JEwqYMloc Ak4Ddzlb62OOnS1kRdbyEb/wYoWT9ccoPHuC2WmzuD4rNM+njbUlsKvkfVxtDdw+/67Lhn9bdCwL Jy9mSeYyylzVNHkcVDlPUlS5W7fNRxm318mu468CsG7pw2G/ku32Osk58VrP2+EGZqh8EDhmZW0i A6WAKaPJcWAXcG+ztyEuv6aAJZlLSYgN729KV1JQnUeps4Qbsj8UsmdQ7fHJ7Dq9nTZfG1kTsslI vnKDdnt8MmtnriVzfBaVrurubfMzdbmkJmdH3Fk8udiRsh1UOU+SnTaXJTMH33PVam6vkyNlO3g3 71nqm84EP/wK8HFgC9oOlzCkgCmjTSWwGdjgMVrsB8v3Mj11JqmJkduYeX/5XqpdlSyfujKk2zU1 t7sodZZgi7INaKU1IzmTW2bdSmxMLDWuKhq9Tk5U7qauoZDkcZMVNCNYuPe+DF7g2XLkBSrqjwTP WeZg3g7/GbodLmFMAVNGIwfwGnCbETAmHajcR1KcPaTD19V459QWmr0NrJ5xc79WBq0Q6PQTFxPP nrLduNtcA77tHrxt3vN8ZpPHQVHNPppcZboIFIHCufdlMFj+8dCzZrD0+8DcYfk74N+AWksLFBkC CpgyWrVgbkHN7TzfOf9obQHt/jbmTVwQcZd/3jv1Lh6jhdtmrwvZldqoMVGMHzue90r/RJvRyvVZ KwY1cSh4PvPGaWvwGK1UNpXjbK2n4Mw2PO0u0uxTFDQjRDj2vuwjWJYCXwb+ASi67AuIhBEFTBnN OjBXMuOBNaXOEkobK1iScV1EXf753eFX6DzfyYZr7wnp86ZRY6I466qh2lVJSmLqVZ0XTYhN4Pqs 5VyftYKznkacrfU4mss5VrGTFm+jgmaYC7fel8EzlpdYsXwU+GLXf4tEFAVMEbNXZjFdN8zzawqY mz5vRGd2Dxdvh4d3TrwFwIZFd4d8cG4x3BytLaChzcWH56y76tezxyezatqq7qDpcNfgaC6n4Mw2 mt0VJIxNC/lwIhcLl96XwVvh7x/ZSIXjeO+t8EdRsJQIpoApYjqOOfnnDo/RYt9TvZ/J4yaF7JnF /nK3uy0dEzlQ6ePS2VK4GY/RwuoZNw/ZimvPoGn4DapdlThb67svA0VF2cLykshoFeq9L4N9LHcd fxVHc3nw8k4u5jb4o2grXEYBBUyRD9QCvwZWdfp9U/MqD4T9ucxqVyV7ynaTljR5SFYEh5stOrZ7 qs9ke8aQX7yyxyd3b50bfoP6ljqaPA5K6vI4Wb4DX2dADdtDXKj2vvT5DUpq89iW/xwHT78T7GMZ AP6AuQ3+LRQsZRRRwBS5UBvwG8BG17nMcG7KXt5YRl7lAdKSMiwfE9lf/Znqc7WCQfPGaWuwx9up cVXhNtxUOU9ScOY9WryNxMeO0/Z5CAq13pe1jSUcLHqbrYd+QXHNQTxGC5gN0p/FnL7zPGZ7NJFR RQFT5GKdmOcyC4A7m70NcXvO7A7LfpnBMZEL0ueH7BSf3lISUtletBVXWwO3zV43rME+ITaB2dfM 5SNz1zMhIYXmDi9NHgeO5nJOVO7mTF0ubb42ksamhMxK2WgXCr0ve69W9tgGLwUeAx4A3gaaLClQ JAQoYIr0rQj4HWa/zPQ9ZbvDass80Omn8OwJCs+eYMGkhSycvNjqkvolITaB/ZUHaGl3MS115oic g40aE8W0lOmsnbmWeRMX0Hm+k2pXZcBjtERVOU9yrGInTa4yAuchOeEabaFbxOrel0XV+8k/9Xu2 HXmp92rla5jnK/8FOIgm74goYIpcQRPmlvkkYGlwy3zRpIUh3fIHzNC0u2Qn1a5Krsu8PmTHRF5K g8cxqKk+QyE1MY3rs5bzkbnro9LGpXevajpb6ympy6PgzHsKmxYJ9r6cO+k65mStHpHPGdwC33Lk BYqq9uFsrQ+uVh4Hvgs8hPk1QtvgIj3oK6PIlbUAD2Me1t9U4Syyf3Pbf/DX136KtbNus7i0y3MZ HgASY8dZXMnALMlcxrZTWzhRd5RAp9+SEJcQm8jaWbexdtZtVLuqOFpbQE7ZHhzuGgrrCiisKyAm 2sbs9EVMy1jJjElLscXEjXido4XPb3DqbC4A184a2KSngaptLKGwMoeK+kO4DXfP36rGDJMvoxZD IpelgCnSf28DC4D/8bV71mzKfZGSc8V8etlnSYhNtLq2S/L6vACMi0uyuJKBmZk2C3ucHbfhptRZ wpz0eZbWM2V8FlPGZ3HHgg1Uu6rYW7abw7VHLwqbmRNmsCD7VianzMKeEF7ndUPdmfoCfO0e7HF2 MlJmDelr+/wGZ+oLqHae4tTZXHztnp6/7QZ+jzn5a/uQfmKRCKaAKTIwNcBNmPOCv7uvPCf6RN1R HlnzFctD0KU0tdQBMDFpksWVDEx0VAwLJy9mX3kOh2vyQ+rvdsr4LO5f+gD3L32ge2Uzv+YIFc6i 7jeAdHsmszJvZEraPK6xZ2l1c4CKqvdzsmInta3VnPd9cKRx0YyPDsnr1zaWUO08Rc25Y9Q0ncEf 8PX87UbMc5W/B/4M+C71GiLStzFWFyASxpYD/wPMBLhx2pqQW8185LWH8Ad8PLnhJ2F3Az6/Kpfn cp4m3Z7J9+580upyrqjB4+RAxd7usNlTz610rW5ens9vsPnAUxf9HQbFRNu4Z9W/DngV0+11cqp6 P02uUkqainuvUoJ5A/x3mKEybxCli0gPCpgiVycJ+A7wVQB7nJ0HVjzEsqwV1laFOSbyK7//ewB+ 8amXwu4yirfDwz//4cv4Az4eu/0JpozPsrqkfvN2eCg8e5LD1fmcqDva+xwf6fZMJk6YzZS0eQqc vby554k+w2VP99/0zT5Dps9vcM5d1b1CWdtafalA6cbc8t4C7MQMmCIyRMLrO45I6GnBHP32OvCS 23DPfC7n6ZBYzWz0NgJm6A23cAnmJZvZ6YsorCvgaG1BWAXMhNhElmWt6P5Bo+dWek3TGXMmuruG YxW7gAsD52i+LFRUvb9f4RJg15GNfObW/wLM7e4Wr5Nq5ynONp3G4a651FMMYFfX23a0SikyrMLv u45IaMoB5gOPA18Pns38xOJ7Lbtp7u0wV2ziw+yCT0/LpyylsM4MZncs2GB1OYPW85JQcHWz1Fnc fVHI4a6h0ePoDpzx49OZnbyApIS0UXWG82TFzn4/1uGu4ZWd/0Gjx9H7/GRQNbAb2I+5QlmEzlKK jBgFTJGh4wO+gXmGa6PbcC/alPsiu8v28NCKB0d8Ba7OXQtAamL6iH7eobSoqzl8hbMIb4cnpM63 DlbP1c37lz5wycDZ7nJwzOUAzDOH/oCPdHsmqYnpTBg/k+SENJIS0iIueNY0nRnQ43usVLqBfZjT t/YB+ZgX8kTEIgqYIkMvD7ge+BrwWIWzKO67277NbbM/wl0LPzliIcnT0QrA+LjwDWWpiWlkp82l wllEbuWBkO87OhiXC5xVzfXUNJbiDvi6VzqpK7jg+THRNlIS00lNTCcmNpmkhLTuADoufnzIn+/0 +Q3aOlpobXf1tRJ5Oa8A30bnJ0VCjgKmyPDwAd/HvJX6rD/gW7/t1Bb2l+0ZsUtAreYYO5Liw3eL HGBZ5nVUOIsoOVcckQGzt97nN8E87lDtqqLOXcvZljqKnGdoaqnDbbjx9wyffLDiGRQTbSMhZiwT kiaTYEu4IIQC3UF0bKz572QgK6LBcAjQ2u7q/niL1wlAc9evLV4n/o5mvD4vbV0/+DR1uC518Wag dDlHJEQpYIoMr1LgY8AG4Fm34Z7yXM7TZKfNHfZt85Z28xt/uDVZ7ynQ6WdxxlLeOPIauVUHeHDl F8LywtLViouJY076vIv6gQY6/dS56/B2eLrDZ0t7C7Wt52hqqcPrb8Mf8OEO+C66yd6XmGgbY2yx AIw9f/E04bYxAc77Oi5abewdbPt67T4eE0i3Z0a3Gy39rrNL/w9tisiIGn1fqUWs8TbmN8N/B/6p wlkU99iWb3DjtDV8cvG9w9KjMjgmcmLS5CF/7ZESHRXDlPFZITXVxwp9herg3w9wyb+XQKcfV5uL Bo+TFqOFVqOlO4S6DA8NHgddoS4ARANmAOwKgT4+CIVXCpBjbLGkd533HRs7jgRbAuPjEkmKT2Jc XFL3uNJxcUkkxSWREJtISkIKcTFxREfFRBc7TvHbI78bSMB8Ba1eioQsBUyRkdOCeQnoZ8APgM/s K88ht+rAsJzPbPCYl0SSwngFMyhUp/qEuuioGFIT0/rzA0x0oNOP4Tdo87UBdP8KXHTBaqxtbPev XQFx0DVWu6r47eHXKPzgbKkBXGmfvhT4yqA/qYgMu4v3P0RkuLUAbwDvAAs6z3dOLXWWsOfMbuJt Y8kan0XUmKir/iTvHH8TI2Cwbt7t2OOTr/r1rHSe8+RVHuBci4P18++0upyIFDUmClt0LAmxCSTE JpAYm8j4sROwxyeTmpiGPT65+y34GFt07KD/rVa7qvhdwav8Jm8jztZ6gADwK+CTmBflbgXGXuKp bwCfABoG9YlFZERoBVPEOnmYc803AE+5DffMTbkv8l7Re6yfu541M24e9MpQoNPfvdWYkpAyZAVb ZUnmUmKibbgNN9WuqrBquh6uhuusa4PHyR+Ovs6+8pyeH34D+D/A8a73XwU2A3cBKzFXNCu6PnYc EQl5WsEUsV4R8BxwDljpMVrGHq0t4GBVLjFR0UxLmT7gF2zyNrK9aCsx0TbuXnzfUNc74qLGRFF0 rhRnaz0pianMvmau1SXJADV4nLya/2s25W2ksqk8+OH3gE8DPwEcvZ7SgRkmt2Ku9udc4jEiEqIU MEVCQydwEDNo1tEjaO6vPMD4sePJSM7s94s1ehvYVfI+42LHRcyWss/fztHaArwBP2tnrrW6HOmn 4Fb4xgP/j2pXJZ3nO8EMlg8B3wNqLS1QRIaFAqZIaOngg6DpBq73GC1j8yoPsL/yADFR0Zc9o5lf lcurBf/DW4Vv0un3EaATb4eHSfYMEmITRvCPMfTSx6WzpXAzzd4GVs+4Oez/PJGu2HGKl3J/xesF v6HaVRn8cM9gWdnnk0Uk7ClgioSmDswtwecwb9Ve7zFa4o7WFrC7ZAeB8wEyk6dgizb7FXo7PDzz l5+y5eQfcLbW0+k328l0nu+k1FnCwfK9pI1LH9AqaKixRcdypP4Ezd4GJtszBnV0QIZfMFi+dfS1 4OUdMM9Y/i1m9wQFS5FRQAFTJLR1AH8GnsXcOr/WCBj2wrMn2F62E2+7m0n2DJ7J+Skljr7vPhgB g8M1h5hzzbxh6bk5UjxGM4VnT+A7D6umrbK6HOkS6PRTUJ3Pfx98kXdPvNn7Vvh9wPNoK1xkVBlj dQEiMiA24F7Mhu2LBvLE4Mzq79355LAUNhKqXVU8tuUbxETbePbeF0blVJ9Q4u3wsKvkfbaf2tqz QbqBGSh/CNRYVpyIWEormCLhpRPzZu1zQAGQBUzt1xPPd+IxWpg3cUHYrmLa45PZX3mAlnYXWROy w3rLP5x1X9w5+AIn6o5hBAyARuBJ4K+BNzH7vYrIKKUf/0XC19vAFsxt9H6JibZR4iwO62k4SzIW s81dw+HqfJZlrbC6nFEj0Okn58xudpftocJZ1PO3DmOerXwdc7qkiIgCpkiYsw/kwZebJR0ulmQu Y9upLZyoO2p1KaNCseMUfyndRV59Ab52T/DDBvB7zJX0nD6fLCKjlgKmSHhrwGxnNKCgGc5mps3C Fp+Iu91NseNUWK/GhqoGj5MDFXvJKduDw33BMcpS4JfAC2hUo4hchs5gioS/FcD8/j648OwJ9lce wPC3kZKQGnb9JKPGRHHWVUO1q5LEuEQWTl5sdUkRwdvhYW9ZDpvyf8PrBS9TePYEHqMFzNXKTcBX gH/BXLFss7BUEQkDukUuEv6WA/vp3w+Mx4HZmLOdAchOm8uyzOtYmb0qbC7/5Ffl8lzO06TbM8P6 VrzVvB0ecisPkFddwGnH8d5HKHIw2wz9Fl3YEZEBUsAUiQz/CDxzhcccBm7u+u+7gM8BH6FHMA2G zcUZS5kyPmtYCh0K3g4P//yHL+MP+Hhyw0/CJhiHggaPk+N1R/sKlYcxA+Um1GJIRK6CAqZI5Pg0 8DMgpdfHA5ih4REuXolKBT4D3A/cSI+wmW7PZEnGYpZkLmNm2qyQ6zn5o10/orCugM+ueJi1s26z upyQVu2q4mhtAfk1R3rfAAdzVftl4HeYZyxFRK6aAqZIZEnCXJ1cDIzFDAzv0r/gkArcjdnI/YKV TXucnYWTF7NkyjLmT1xAQmzikBc+UO+efJs3jrzG/MlL+dotX7O6nJAS6PRzuKaAUmcxh2uP9r6o A5CLOb5RoVJEhoUCpohcSirwUcyw+jF6rYoGVzdnps2xLHA2eJz869uPEhNt46lP/iwkQq+Vih2n KHEWk19zhJqmM723vg1gF2avyi1o+1tEhpkCpohciQ1YCdyJGTaX9H5Adtpc5qbNGPHA+e/v/CsO dw33XHc/s9LmkJqYNirOY3o7PFS7qihxFlPoOE1JU3HPHpVB1Zi9KncAO9FFHREZQQqYIjJQwdXN m4F1wMzeD0i3ZzIzZTqzrpnDzLTZTLZPHvIznN4ODz/681MXnSlMt2fyV4vvjagpPw0eJ+WNZZfb 8gazH+p2zBXKnWjrW0QspIApIlcrEzNs3gysARb1fkBMtI3MCTOYmzaDiUmTmWzPYMr4rEGvdFa7 qnhqxxO4DXefj/novNu5f+kDg3p9qwQ6/dS56zjbUk+ps5iq5npqGkv7+nM2Ym577wL2AXkjV6mI yOUpYIrIUEsFVmPeSl+K2Qi+9812wFxtTE1MJyt5Ur+Dp7fDwzc3f/2y4TIoVG+YN3icNHictBgt nG2po665ltLGMho9jr7GeQaAY5j9TvPRCqWIhDgFTBEZCTOBhXwQOhcCU/p6cHDFM8GWQFbyJMbF JTExaTITkyaxt2w3205t6dcntcUn8qM7nxqxM6HeDg9tvrbu8NhqtODpaKWuuRaX4aHB47hciAwy gKOYQTIfszflESD8B8mLyKihgCkiVknFHHE5D3NbfR4wC5hGr6lEMdG2K4WyPn12xcMs6honOdY2 FoC4mLgLzoQGOv0YfqP7/TZfG22+Nrwd5sWZnmGx1Wihpb0Fl+HB6/PS1tFKu9GC1982kBoDQB1Q jtmH8iRQCJShlUkRiQAKmCISamzAVMxVzmwgo+v9qZjhs8+Vz5F0mdBrAOcwA2RV11sTZmugcswQ WYlWJEUkgilgikg4SbKdpDUAAAJjSURBVMK8LT0QRtcbQCL9m9luAB7ACziBVsABNANnu351dn3M C9Rjhkg3agckIiIiEnaqgPMDeNvQx+uk9nqzDWvVIiIiIhKynqD/4bIZc9VTRERERKRPqUAD/QuY /2ZRjSIiIiISZtZgrk5eLly+aFl1IiIiIhKWZgJbAT8XBssq4AsW1iUiMurpFrmIhLtMzH6aCUAt GpkoIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IhIR/j/m1Gy2udUkpAAAAABJRU5ErkJggg== "
+       style="image-rendering:optimizeQuality"
+       preserveAspectRatio="none"
+       height="120.55085"
+       width="113.50848" />
+  </g>
+</svg>
diff --git a/installers/charm/mon-k8s/layer.yaml b/installers/charm/mon-k8s/layer.yaml
new file mode 100644 (file)
index 0000000..060f454
--- /dev/null
@@ -0,0 +1,22 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+includes:
+  - "layer:caas-base"
+  - "layer:status"
+  - "layer:leadership"
+  - "layer:osm-common"
+  - "interface:kafka"
+  - "interface:mongodb"
+  - "interface:prometheus"
+repo: https://code.launchpad.net/osm-k8s-bundle
diff --git a/installers/charm/mon-k8s/metadata.yaml b/installers/charm/mon-k8s/metadata.yaml
new file mode 100644 (file)
index 0000000..41c33c5
--- /dev/null
@@ -0,0 +1,37 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+name: mon-k8s
+summary: "OSM Monitoring Interface (MON)"
+maintainers:
+  - "SolutionsQA <solutionsqa@lists.canonical.com>"
+description: |
+  A CAAS charm to deploy OSM's Monitoring Interface (MON)
+tags:
+  - "application"
+series:
+  - "kubernetes"
+requires:
+  kafka:
+    interface: kafka
+  mongo:
+    interface: mongodb
+  prometheus:
+    interface: prometheus
+storage:
+  database:
+    type: filesystem
+    location: /app/database
+deployment:
+  type: stateful
+  service: cluster
diff --git a/installers/charm/mon-k8s/reactive/mon_k8s.py b/installers/charm/mon-k8s/reactive/mon_k8s.py
new file mode 100644 (file)
index 0000000..9eae0b1
--- /dev/null
@@ -0,0 +1,115 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+from charms.reactive import endpoint_from_flag
+from charms.layer.caas_base import pod_spec_set
+from charms.reactive import when, when_not, hook
+from charms.reactive.flags import set_flag, clear_flag
+from charmhelpers.core.hookenv import log, metadata, config
+from charms import layer
+
+
+@hook("upgrade-charm")
+@when("leadership.is_leader")
+def upgrade():
+    clear_flag("mon-k8s.configured")
+
+
+@when("config.changed")
+@when("leadership.is_leader")
+def restart():
+    clear_flag("mon-k8s.configured")
+
+
+@when_not("kafka.ready")
+@when_not("mon-k8s.configured")
+def waiting_for_kafka():
+    layer.status.waiting("Waiting for kafka to be ready")
+
+
+@when_not("mongo.ready")
+@when_not("mon-k8s.configured")
+def waiting_for_mongo():
+    layer.status.waiting("Waiting for mongo to be ready")
+
+
+@when_not("endpoint.prometheus.available")
+@when_not("mon-k8s.configured")
+def waiting_for_prometheus():
+    layer.status.waiting("Waiting for prometheus to be ready")
+
+
+@when("kafka.ready", "mongo.ready", "endpoint.prometheus.available")
+@when_not("mon-k8s.configured")
+@when("leadership.is_leader")
+def configure():
+    layer.status.maintenance("Configuring mon container")
+    try:
+        kafka = endpoint_from_flag("kafka.ready")
+        mongo = endpoint_from_flag("mongo.ready")
+        prometheus = endpoint_from_flag("endpoint.prometheus.available")
+
+        if kafka and mongo and prometheus:
+            kafka_units = kafka.kafkas()
+            kafka_unit = kafka_units[0]
+
+            mongo_uri = mongo.connection_string()
+            log("Mongo URI: {}".format(mongo_uri))
+
+            prometheus_url = prometheus.targets()[0]["targets"][0]
+
+            if mongo_uri and kafka_unit["host"]:
+
+                spec = make_pod_spec(
+                    kafka_unit["host"], kafka_unit["port"], mongo_uri, prometheus_url
+                )
+
+                log("set pod spec:\n{}".format(spec))
+                pod_spec_set(spec)
+                set_flag("mon-k8s.configured")
+    except Exception as e:
+        layer.status.blocked("k8s spec failed to deploy: {}".format(e))
+
+
+@when("mon-k8s.configured")
+def set_mon_active():
+    layer.status.active("ready")
+
+
+def make_pod_spec(kafka_host, kafka_port, mongo_uri, prometheus_url):
+    """Make pod specification for Kubernetes
+
+    Args:
+        kafka_host (str): Kafka hostname or IP
+        kafka_port (int): Kafka port
+        mongo_uri (str): Mongo URI
+    Returns:
+        pod_spec: Pod specification for Kubernetes
+    """
+
+    with open("reactive/spec_template.yaml") as spec_file:
+        pod_spec_template = spec_file.read()
+
+    md = metadata()
+    cfg = config()
+
+    data = {
+        "name": md.get("name"),
+        "docker_image": cfg.get("image"),
+        "kafka_host": kafka_host,
+        "kafka_port": kafka_port,
+        "mongo_uri": mongo_uri,
+        "prometheus_url": prometheus_url,
+    }
+    data.update(cfg)
+    return pod_spec_template % data
diff --git a/installers/charm/mon-k8s/reactive/spec_template.yaml b/installers/charm/mon-k8s/reactive/spec_template.yaml
new file mode 100644 (file)
index 0000000..c81e5a1
--- /dev/null
@@ -0,0 +1,56 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+version: 2
+containers:
+  - name: %(name)s
+    image: %(docker_image)s
+    ports:
+    - containerPort: %(advertised-port)s
+      protocol: TCP
+    config:
+      ALLOW_ANONYMOUS_LOGIN: 'yes'
+      OSMMON_MESSAGE_DRIVER: kafka
+      OSMMON_MESSAGE_HOST: %(kafka_host)s
+      OSMMON_MESSAGE_PORT: %(kafka_port)s
+
+      OSMMON_DATABASE_DRIVER: mongo
+      OSMMON_DATABASE_URI: %(mongo_uri)s
+
+      OSMMON_OPENSTACK_DEFAULT_GRANULARITY: %(OSMMON_OPENSTACK_DEFAULT_GRANULARITY)s
+      OSMMON_GLOBAL_REQUEST_TIMEOUT: %(OSMMON_GLOBAL_REQUEST_TIMEOUT)s
+      OSMMON_GLOBAL_LOGLEVEL: %(OSMMON_GLOBAL_LOGLEVEL)s
+      OSMMON_VCA_HOST: %(vca_host)s
+      OSMMON_VCA_USER: %(vca_user)s
+      OSMMON_VCA_SECRET: %(vca_password)s
+      OSMMON_VCA_CACERT: %(vca_cacert)s
+      OSMMON_DATABASE_COMMONKEY: %(OSMMON_DATABASE_COMMONKEY)s
+      OSMMON_COLLECTOR_INTERVAL: %(OSMMON_COLLECTOR_INTERVAL)s
+      OSMMON_EVALUATOR_INTERVAL: %(OSMMON_EVALUATOR_INTERVAL)s
+      OSMMON_PROMETHEUS_URL: http://%(prometheus_url)s
+    kubernetes:
+      readinessProbe:
+        tcpSocket:
+          port: %(advertised-port)s
+        periodSeconds: 10
+        timeoutSeconds: 5
+        successThreshold: 1
+        failureThreshold: 3
+      livenessProbe:
+        tcpSocket:
+          port: %(advertised-port)s
+        initialDelaySeconds: 45
+        periodSeconds: 10
+        timeoutSeconds: 5
+        successThreshold: 1
+        failureThreshold: 3
\ No newline at end of file
diff --git a/installers/charm/mon-k8s/tox.ini b/installers/charm/mon-k8s/tox.ini
new file mode 100644 (file)
index 0000000..1954b2f
--- /dev/null
@@ -0,0 +1,60 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+[tox]
+envlist = pep8
+skipsdist = True
+
+[testenv]
+setenv = VIRTUAL_ENV={envdir}
+         PYTHONHASHSEED=0
+whitelist_externals = juju
+                      sleep
+passenv = HOME TERM CS_API_* OS_* AMULET_*
+install_command =
+  pip install {opts} {packages}
+
+[testenv:build]
+basepython = python3
+passenv=HTTP_PROXY HTTPS_PROXY NO_PROXY
+setenv = CHARM_LAYERS_DIR = ../layers
+         CHARM_INTERFACES_DIR = ../interfaces/
+whitelist_externals = git
+                      charm
+                      rm
+                      mv
+commands =
+    rm -rf release
+    rm -rf ../interfaces/mongodb
+    git clone https://git.launchpad.net/interface-mongodb ../interfaces/mongodb
+    charm build . --build-dir /tmp
+    mv /tmp/mon-k8s/ release/
+
+[testenv:lint]
+basepython = python3
+deps =
+    black
+    yamllint
+    flake8
+commands =
+    black --check --diff . --exclude "release/|.tox/"
+    yamllint .
+    flake8 reactive/ --max-line-length=100
+
+[testenv:pep8]
+basepython = python3
+deps=charm-tools
+commands = charm-proof
+
+[testenv:venv]
+commands = {posargs}
diff --git a/installers/charm/nbi-k8s/.yamllint.yaml b/installers/charm/nbi-k8s/.yamllint.yaml
new file mode 100644 (file)
index 0000000..d24a69d
--- /dev/null
@@ -0,0 +1,24 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+---
+extends: default
+
+yaml-files:
+  - "*.yaml"
+  - "*.yml"
+  - ".yamllint"
+ignore: |
+  reactive/
+  .tox
+  release/
diff --git a/installers/charm/nbi-k8s/README.md b/installers/charm/nbi-k8s/README.md
new file mode 100755 (executable)
index 0000000..b4dc3d2
--- /dev/null
@@ -0,0 +1,95 @@
+<!--
+Copyright 2020 Canonical Ltd.
+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. -->
+
+# Overview
+
+NBI for Juju CAAS
+
+## Testing
+
+The tests of this charm are done using tox and Zaza.
+
+
+
+### Prepare environment
+
+The machine in which the tests are run needs access to a juju k8s controller. The easiest way to approach this is by executing the following commands:
+
+```
+sudo apt install tox -y
+sudo snap install microk8s --classic
+sudo snap install juju
+
+microk8s.status --wait-ready
+microk8s.enable storage dashboard dns
+
+juju bootstrap microk8s k8s-cloud
+```
+
+If /usr/bin/python does not exist, you should probably need to do this:
+
+```
+sudo ln -s /usr/bin/python3 /usr/bin/python
+```
+### Build Charm
+
+**Download dependencies:**
+
+```
+mkdir -p ~/charm/layers ~/charm/build ~/charm/interfaces
+git clone https://git.launchpad.net/canonical-osm ~/canonical-osm
+
+cd ~/charm/layers
+git clone https://git.launchpad.net/charm-osm-nbi nbi-k8s
+git clone https://git.launchpad.net/charm-osm-ro ro-k8s
+git clone https://git.launchpad.net/charm-k8s-kafka kafka-k8s ~/charm/interfaces
+git clone https://git.launchpad.net/charm-k8s-zookeeper zookeeper-k8s
+git clone https://git.launchpad.net/charm-k8s-mongodb mongodb-k8s
+
+cd ~/charm/interfaces
+mv ~/canonical-osm/charms/interfaces/* .
+git clone https://git.launchpad.net/interface-mongodb mongodb
+
+```
+
+**Charm structure:**
+
+```
+├── config.yaml
+├── icon.svg
+├── layer.yaml
+├── metadata.yaml
+├── reactive
+│   ├── spec_template.yaml
+│   └── nbi.py
+├── README.md
+└── tox.ini
+```
+
+**Setup environment variables:**
+
+```
+export CHARM_LAYERS_DIR=~/charm/layers
+export CHARM_BUILD_DIR=~/charm/build
+export CHARM_INTERFACES_DIR=~/charm/interfaces
+```
+
+**Build:**
+
+```
+mkdir ~/charm/layers/nbi-k8s/tests/build
+charm build ~/charm/layers/nbi-k8s
+charm build ~/charm/layers/kafka-k8s
+charm build ~/charm/layers/zookeeper-k8s
+charm build ~/charm/layers/mongodb-k8s
+mv ~/charm/build/* ~/charm/layers/nbi-k8s/tests/build/
+```
diff --git a/installers/charm/nbi-k8s/config.yaml b/installers/charm/nbi-k8s/config.yaml
new file mode 100755 (executable)
index 0000000..129ff30
--- /dev/null
@@ -0,0 +1,38 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+options:
+  advertised-hostname:
+    description: NBI Hostname
+    type: string
+    default: "nbi-k8s"
+  advertised-port:
+    description: NBI Port
+    type: int
+    default: 9999
+  log_level:
+    description: "Log Level"
+    type: string
+    default: "DEBUG"
+  DATABASE_COMMONKEY:
+    description: Database COMMON KEY
+    type: string
+    default: osm
+  image:
+    type: string
+    description: OCI image
+    default: opensourcemano/nbi:7
+  auth-backend:
+    type: string
+    description: Authentication backend ('internal' or 'keystone')
+    default: internal
diff --git a/installers/charm/nbi-k8s/icon.svg b/installers/charm/nbi-k8s/icon.svg
new file mode 100644 (file)
index 0000000..da31b4a
--- /dev/null
@@ -0,0 +1,118 @@
+<!--
+Copyright 2020 Canonical Ltd.
+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. -->
+
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="100px"
+   height="100px"
+   viewBox="0 0 100 100"
+   version="1.1"
+   id="svg18"
+   sodipodi:docname="template.svg"
+   inkscape:version="0.92.4 (f8dce91, 2019-08-02)">
+  <metadata
+     id="metadata22">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>eclispe-che</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="2880"
+     inkscape:window-height="1736"
+     id="namedview20"
+     showgrid="false"
+     inkscape:pagecheckerboard="true"
+     inkscape:zoom="2.36"
+     inkscape:cx="100.57842"
+     inkscape:cy="-9.2650043"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer2" />
+  <!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
+  <title
+     id="title2">eclispe-che</title>
+  <desc
+     id="desc4">Created with Sketch.</desc>
+  <defs
+     id="defs7">
+    <path
+       d="M50.0004412,4.04252804e-14 C22.3871247,4.04252804e-14 0,22.3848726 0,49.9995588 C0,77.6133626 22.3871247,100 50.0004412,100 C77.6137577,100 100,77.6133626 100,49.9995588 C100,22.3848726 77.6128753,3.55271368e-14 50.0004412,4.04252804e-14 Z"
+       id="path-1" />
+  </defs>
+  <g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="BACKGROUND">
+    <g
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-opacity:1"
+       id="Page-1">
+      <g
+         id="eclispe-che"
+         style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1">
+        <g
+           id="path3023-path"
+           style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1">
+          <use
+             xlink:href="#path-1"
+             id="use9"
+             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-opacity:1"
+             x="0"
+             y="0"
+             width="100%"
+             height="100%" />
+          <path
+             d="M 50.000441,0.5 C 22.662621,0.5 0.5,22.661661 0.5,49.999559 0.5,77.337051 22.663098,99.5 50.000441,99.5 77.337613,99.5 99.5,77.337222 99.5,49.999559 99.5,22.661796 77.337514,0.5 50.000441,0.5 Z"
+             id="path11"
+             style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="PLACE LOGO HERE">
+    <image
+       y="-9.851697"
+       x="-8.0254316"
+       id="image829"
+       xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApgAAAK8CAYAAABLDM/pAAAABHNCSVQICAgIfAhkiAAAIABJREFU eJzs3Xl4lOX1//E3mRkyZMhkCCEJIWwJ+yaJC6CIYhBFEBUQUNEiUpeqaGttbYtLrf3a6te2or/S 9mvBonVDEbAURFDECogCsexLMJAQSEJ2AjNMJvz+GCaGECDLJM/M5PO6rlxKMs/znEhMTu773OeA iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIhRWhkdgIhICLMAQ4DOQDmwCThkaEQiIiIiErQeBrKAUzXe VgADDIxLRERERIKMBfgnZyeW1d9KgFFGBSgi0tS0RS4ioaI9YD391ub0P6n2vpqcp998ik7/sxg4 CZQ1MI4ngOfr8LpCoBdQ0MDniIgELCWYIhKoOgEdgQSg6+l/xgFRQCzgOP1mP/3WFEpPvx0FcvHW UebhTUJzTr8/HzgCHDh9TXY94nkZeNSP8YqIBAQlmCJilEigNzAYSAa6nH7rCCQC4Q25qcVqA6B1 dPyZ77d9n/O5y0vPuu5k4RFOuU9S4XE35LE+Luoetwc4jPcAkIhISFGCKSJNrT2QAvQF+gHdgf54 k8jzsjpisXboRHT3zlijY7C2a094ZBStI+2E2x2ERzkItzto3TYSS0RbTOENyknP4izy7lqfPFaG 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 NCuTVT97iM1zf0f+ti2UHz6Au6yIipICCvbtJPvLT6sS1YYmhyZLGAc+W05pTi4DbpveuE8ywGWs WMyqR+/meN5BrI5Yrvn9XPpNmd7geu/sdWvYvfhNrI5Yhv/qeb/UjZvbRNA60k72l59yInsr7VNv JMwSmN+X/MHWqS+cOsWxA+kA44ANwH5jo5LmpC1yaQrJwDMAl//q+SZt6ZK/PZ1l901j5SN3Ubx3 C2aThYfih7Kp/0ye6nJNs7UaaqgyjwuACHMbgyORxhpm78KKftOZ32Miia3tlOdksPKRu1h237Qz tqmz161hye1jzui76lO9ufwp90k2z32RZfdNa9C2e7eRYzCbLJTnZJC/Pb0hn1LA87hcrPnVQ3z+ 5CzcznLiUkcw4b2PG90cf9+y9wFIun6cX3uf9r31Lhw9U3A7yzmy+kW/3TdQJYycQVzqCIBw4ANg gLERSXPSCqY0haVAUlzqCIb8+JdN8oDSrEzWvzCbr1565oytcN+KpTWs+U+qN8RRdzmv522mgymc ++IvMzocaSRTqzB6tYlhaswgTp06xeYTuZTlfMee99/kREkRAJ/+5B4q3M4L3ss3StSVl8ORbdvo deOEesUSZjZT9N1eijJ2Y7a2CaqJRHVRfdwjQOoDj5933GNdOYsKWPebn1N5qpKrnn3Z77svMX36 smfx25QfPkBk99SQGyNZU9vk4TiPbMVZeCQcGA8sQCMlWwStYIq/PQwMt1htXDn7Ob/f3FlUwIaX nmHxrWnsX7kU8M7s3jjg3qBYsaypuMKbaLTTCmZIiTJbearLNWwccC9pUclUeNzseGceKx+564xV yrqo8LjJ3byWnQsX1DuOHmMnAXBg7ef1vjaQ7Vy4gOX3TKQ8JwOrI5YbX1/K4BkP++Xe361aRoXH jaNnSpPsvnToP5h+U2cAcGjln6isOOn3ZwSSMHNrut78LFZHLEAisByINDYqaQ5KMMWfOgHPAVwy 6xd+/+acsWIxiyZfx4535lHhcZMWlcznA2YyJ2mcIQ3S/aGwQr/Ih7LE8Cje7j2FJX2mkdja3qh7 bfnbHDwuV72u6XjxMCxWW8hskzuLCljzq4dY/8JsKjxukkaPZ8J7H/u1Q8V/35wPQN9bJvrtnjUN nvEwVkcs5TkZHN38ryZ7TqAwR0SRfMcfsFhtAJcCfzE4JGkGSjDFn/4O2ONSR9RpDFtd+eosP39y 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 WYlWJEUkgilgikg4SbKdpDUAAAJjSURBVMK8LT0QRtcbQCL9m9luAB7ACziBVsABNANnu351dn3M C9Rjhkg3agckIiIiEnaqgPMDeNvQx+uk9nqzDWvVIiIiIhKynqD/4bIZc9VTRERERKRPqUAD/QuY /2ZRjSIiIiISZtZgrk5eLly+aFl1IiIiIhKWZgJbAT8XBssq4AsW1iUiMurpFrmIhLtMzH6aCUAt GpkoIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IhIR/j/m1Gy2udUkpAAAAABJRU5ErkJggg== "
+       style="image-rendering:optimizeQuality"
+       preserveAspectRatio="none"
+       height="120.55085"
+       width="113.50848" />
+  </g>
+</svg>
diff --git a/installers/charm/nbi-k8s/layer.yaml b/installers/charm/nbi-k8s/layer.yaml
new file mode 100644 (file)
index 0000000..8bc365f
--- /dev/null
@@ -0,0 +1,25 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+includes:
+  - "layer:caas-base"
+  - "layer:status"
+  - "layer:leadership"
+  - "layer:osm-common"
+  - "interface:kafka"
+  - "interface:mongodb"
+  - "interface:osm-nbi"
+  - "interface:prometheus"
+  - "interface:keystone"
+
+repo: https://code.launchpad.net/osm-k8s-bundle
diff --git a/installers/charm/nbi-k8s/metadata.yaml b/installers/charm/nbi-k8s/metadata.yaml
new file mode 100755 (executable)
index 0000000..404cd2f
--- /dev/null
@@ -0,0 +1,42 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+name: "nbi-k8s"
+summary: "OSM Northbound Interface (NBI)"
+maintainers:
+  - "SolutionsQA <solutionsqa@lists.canonical.com>"
+description: |
+  A CAAS charm to deploy OSM's Northbound Interface (NBI).
+tags:
+  - "application"
+series:
+  - "kubernetes"
+requires:
+  kafka:
+    interface: kafka
+  mongo:
+    interface: mongodb
+  keystone:
+    interface: keystone
+  prometheus:
+    interface: prometheus
+provides:
+  nbi:
+    interface: osm-nbi
+storage:
+  packages:
+    type: filesystem
+    location: /app/storage
+deployment:
+  type: stateful
+  service: cluster
diff --git a/installers/charm/nbi-k8s/reactive/nbi.py b/installers/charm/nbi-k8s/reactive/nbi.py
new file mode 100644 (file)
index 0000000..edcdd4c
--- /dev/null
@@ -0,0 +1,226 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+from charms.layer.caas_base import pod_spec_set
+from charms.reactive import endpoint_from_flag
+from charms.reactive import when, when_not, hook
+from charms.reactive.flags import set_flag, clear_flag
+from charmhelpers.core.hookenv import (
+    log,
+    metadata,
+    config,
+)
+from charms import layer
+from charms.osm.k8s import get_service_ip
+import urllib.parse
+import yaml
+import traceback
+
+
+@hook("upgrade-charm")
+@when("leadership.is_leader")
+def upgrade():
+    clear_flag("nbi-k8s.configured")
+
+
+@when("config.changed")
+@when("leadership.is_leader")
+def restart():
+    clear_flag("nbi-k8s.configured")
+
+
+@when("config.changed.auth-backend")
+def clear_keystone_ready():
+    clear_flag("keystone.ready")
+
+
+@when_not("kafka.ready")
+@when_not("nbi-k8s.configured")
+def waiting_for_kafka():
+    layer.status.waiting("Waiting for kafka to be ready")
+
+
+@when_not("mongo.ready")
+@when_not("nbi-k8s.configured")
+def waiting_for_mongo():
+    layer.status.waiting("Waiting for mongo to be ready")
+
+
+@when_not("endpoint.prometheus.available")
+@when_not("nbi-k8s.configured")
+def waiting_for_prometheus():
+    layer.status.waiting("Waiting for prometheus to be ready")
+
+
+@when_not("keystone.ready")
+@when_not("nbi-k8s.configured")
+def waiting_for_keystone():
+    auth_backend = config().get("auth-backend")
+    if auth_backend == "keystone":
+        layer.status.waiting("Waiting for Keystone to be ready")
+    else:
+        set_flag("keystone.ready")
+
+
+@when("kafka.ready", "mongo.ready", "endpoint.prometheus.available", "keystone.ready")
+@when_not("nbi-k8s.configured")
+@when("leadership.is_leader")
+def configure():
+    layer.status.maintenance("Configuring nbi container")
+    try:
+        kafka = endpoint_from_flag("kafka.ready")
+        mongo = endpoint_from_flag("mongo.ready")
+        prometheus = endpoint_from_flag("endpoint.prometheus.available")
+
+        if kafka and mongo and prometheus:
+            kafka_units = kafka.kafkas()
+            kafka_unit = kafka_units[0]
+
+            mongo_uri = mongo.connection_string()
+            log("Mongo URI: {}".format(mongo_uri))
+
+            prometheus_uri = prometheus.targets()[0]["targets"][0]
+
+            if (
+                mongo_uri
+                and kafka_unit["host"]
+                and kafka_unit["port"]
+                and prometheus_uri
+            ):
+                spec = yaml.load(
+                    make_pod_spec(
+                        kafka_unit["host"],
+                        kafka_unit["port"],
+                        mongo_uri,
+                        prometheus_uri,
+                    )
+                )
+
+                auth_backend = config().get("auth-backend")
+
+                if auth_backend == "keystone":
+                    keystone = endpoint_from_flag("keystone.ready")
+                    if keystone:
+                        keystone_units = keystone.keystones()
+                        keystone_unit = keystone_units[0]
+                        if (
+                            keystone_unit["host"]
+                            and keystone_unit["port"]
+                            and keystone_unit["user_domain_name"]
+                            and keystone_unit["project_domain_name"]
+                            and keystone_unit["username"]
+                            and keystone_unit["password"]
+                            and keystone_unit["service"]
+                        ):
+                            auth_keystone = {
+                                "OSMNBI_AUTHENTICATION_BACKEND": "keystone",
+                                "OSMNBI_AUTHENTICATION_AUTH_URL": keystone_unit["host"],
+                                "OSMNBI_AUTHENTICATION_AUTH_PORT": keystone_unit[
+                                    "port"
+                                ],
+                                "OSMNBI_AUTHENTICATION_USER_DOMAIN_NAME": keystone_unit[
+                                    "user_domain_name"
+                                ],
+                                "OSMNBI_AUTHENTICATION_PROJECT_DOMAIN_NAME": keystone_unit[
+                                    "project_domain_name"
+                                ],
+                                "OSMNBI_AUTHENTICATION_SERVICE_USERNAME": keystone_unit[
+                                    "username"
+                                ],
+                                "OSMNBI_AUTHENTICATION_SERVICE_PASSWORD": keystone_unit[
+                                    "password"
+                                ],
+                                "OSMNBI_AUTHENTICATION_SERVICE_PROJECT": keystone_unit[
+                                    "service"
+                                ],
+                            }
+                            spec["containers"][0]["config"].update(auth_keystone)
+                elif auth_backend == "internal":
+                    spec["containers"][0]["config"][
+                        "OSMNBI_AUTHENTICATION_BACKEND"
+                    ] = auth_backend
+                else:
+                    layer.status.blocked(
+                        "Unknown authentication method: {}".format(auth_backend)
+                    )
+                    raise
+                log("set pod spec:\n{}".format(spec))
+                pod_spec_set(spec)
+                set_flag("nbi-k8s.configured")
+    except Exception as e:
+        layer.status.blocked("k8s spec failed to deploy: {}".format(e))
+        log("Error: {}".format(traceback.format_exc()))
+
+
+@when("nbi-k8s.configured")
+def set_nbi_active():
+    layer.status.active("ready")
+
+
+@when("nbi-k8s.configured", "nbi.joined")
+def send_config():
+    layer.status.maintenance("Sending NBI configuration")
+    try:
+        nbi = endpoint_from_flag("nbi.joined")
+        if nbi:
+            service_ip = get_service_ip("nbi")
+            if service_ip:
+                nbi.send_connection(service_ip, get_nbi_port())
+                clear_flag("nbi.joined")
+    except Exception as e:
+        log("Fail sending NBI configuration: {}".format(e))
+
+
+def make_pod_spec(kafka_host, kafka_port, mongo_uri, prometheus_uri):
+    """Make pod specification for Kubernetes
+
+    Args:
+        kafka_host (str): Kafka hostname or IP
+        kafka_port (int): Kafka port
+        mongo_uri (str): Mongo URI
+        prometheus_uri (str): Prometheus URI
+    Returns:
+        pod_spec: Pod specification for Kubernetes
+    """
+
+    with open("reactive/spec_template.yaml") as spec_file:
+        pod_spec_template = spec_file.read()
+
+    md = metadata()
+    cfg = config()
+    prometheus_host, prometheus_port = parse_hostport(prometheus_uri)
+    data = {
+        "name": md.get("name"),
+        "docker_image": cfg.get("image"),
+        "mongo_uri": mongo_uri,
+        "kafka_host": "{}".format(kafka_host),
+        "kafka_port": "{}".format(kafka_port),
+        "prometheus_host": "{}".format(prometheus_host),
+        "prometheus_port": "{}".format(prometheus_port),
+    }
+    data.update(cfg)
+
+    return pod_spec_template % data
+
+
+def parse_hostport(uri):
+    if "//" in uri:
+        uri = uri.split("//")[1]
+    result = urllib.parse.urlsplit("//" + uri)
+    return result.hostname, result.port
+
+
+def get_nbi_port():
+    """Returns NBI port"""
+    cfg = config()
+    return cfg.get("advertised-port")
diff --git a/installers/charm/nbi-k8s/reactive/spec_template.yaml b/installers/charm/nbi-k8s/reactive/spec_template.yaml
new file mode 100644 (file)
index 0000000..18adec4
--- /dev/null
@@ -0,0 +1,41 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+version: 2
+containers:
+  - name: %(name)s
+    image: %(docker_image)s
+    ports:
+    - containerPort: %(advertised-port)s
+      protocol: TCP
+    config:
+      ALLOW_ANONYMOUS_LOGIN: 'yes'
+
+      OSMNBI_MESSAGE_HOST: %(kafka_host)s
+      OSMNBI_MESSAGE_DRIVER: kafka
+      OSMNBI_MESSAGE_PORT: %(kafka_port)s
+
+      OSMNBI_DATABASE_DRIVER: mongo
+      OSMNBI_DATABASE_URI: %(mongo_uri)s
+      OSMNBI_DATABASE_COMMONKEY: %(DATABASE_COMMONKEY)s
+      
+      OSMNBI_STORAGE_DRIVER: mongo
+      OSMNBI_STORAGE_PATH: /app/storage
+      OSMNBI_STORAGE_COLLECTION: files
+      OSMNBI_STORAGE_URI: %(mongo_uri)s
+
+      OSMNBI_STATIC_DIR: /app/osm_nbi/html_public
+      
+      OSMNBI_PROMETHEUS_HOST: %(prometheus_host)s
+      OSMNBI_PROMETHEUS_PORT: %(prometheus_port)s
+      OSMNBI_LOG_LEVEL: %(log_level)s
\ No newline at end of file
diff --git a/installers/charm/nbi-k8s/tox.ini b/installers/charm/nbi-k8s/tox.ini
new file mode 100644 (file)
index 0000000..537014a
--- /dev/null
@@ -0,0 +1,60 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+[tox]
+envlist = pep8
+skipsdist = True
+
+[testenv]
+setenv = VIRTUAL_ENV={envdir}
+         PYTHONHASHSEED=0
+whitelist_externals = juju
+                      sleep
+passenv = HOME TERM CS_API_* OS_* AMULET_*
+install_command =
+  pip install {opts} {packages}
+
+[testenv:build]
+basepython = python3
+passenv=HTTP_PROXY HTTPS_PROXY NO_PROXY
+setenv = CHARM_LAYERS_DIR = ../layers
+         CHARM_INTERFACES_DIR = ../interfaces/
+whitelist_externals = git
+                      charm
+                      rm
+                      mv
+commands =
+    rm -rf release
+    rm -rf ../interfaces/mongodb
+    git clone https://git.launchpad.net/interface-mongodb ../interfaces/mongodb
+    charm build . --build-dir /tmp
+    mv /tmp/nbi-k8s/ release/
+
+[testenv:lint]
+basepython = python3
+deps =
+    black
+    yamllint
+    flake8
+commands =
+    black --check --diff . --exclude "release/|.tox/"
+    yamllint .
+    flake8 reactive/ --max-line-length=100
+
+[testenv:pep8]
+basepython = python3
+deps=charm-tools
+commands = charm-proof
+
+[testenv:venv]
+commands = {posargs}
diff --git a/installers/charm/nbi-k8s/wheelhouse.txt b/installers/charm/nbi-k8s/wheelhouse.txt
new file mode 100644 (file)
index 0000000..7c2badc
--- /dev/null
@@ -0,0 +1,14 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+PyYAML
\ No newline at end of file
diff --git a/installers/charm/pol-k8s/.yamllint.yaml b/installers/charm/pol-k8s/.yamllint.yaml
new file mode 100644 (file)
index 0000000..d24a69d
--- /dev/null
@@ -0,0 +1,24 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+---
+extends: default
+
+yaml-files:
+  - "*.yaml"
+  - "*.yml"
+  - ".yamllint"
+ignore: |
+  reactive/
+  .tox
+  release/
diff --git a/installers/charm/pol-k8s/README.md b/installers/charm/pol-k8s/README.md
new file mode 100644 (file)
index 0000000..a0227ac
--- /dev/null
@@ -0,0 +1,95 @@
+<!--
+Copyright 2020 Canonical Ltd.
+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. -->
+
+# Overview
+
+POL for Juju CAAS
+
+## Testing
+
+The tests of this charm are done using tox and Zaza.
+
+
+
+### Prepare environment
+
+The machine in which the tests are run needs access to a juju k8s controller. The easiest way to approach this is by executing the following commands:
+
+```
+sudo apt install tox -y
+sudo snap install microk8s --classic
+sudo snap install juju
+
+microk8s.status --wait-ready
+microk8s.enable storage dashboard dns
+
+juju bootstrap microk8s k8s-cloud
+```
+
+If /usr/bin/python does not exist, you should probably need to do this:
+
+```
+sudo ln -s /usr/bin/python3 /usr/bin/python
+```
+### Build Charm
+
+**Download dependencies:**
+
+```
+mkdir -p ~/charm/layers ~/charm/build ~/charm/interfaces
+git clone https://git.launchpad.net/canonical-osm ~/canonical-osm
+
+cd ~/charm/layers
+git clone https://git.launchpad.net/charm-osm-pol pol-k8s
+git clone https://git.launchpad.net/charm-osm-ro ro-k8s
+git clone https://git.launchpad.net/charm-k8s-kafka kafka-k8s ~/charm/interfaces
+git clone https://git.launchpad.net/charm-k8s-zookeeper zookeeper-k8s
+git clone https://git.launchpad.net/charm-k8s-mongodb mongodb-k8s
+
+cd ~/charm/interfaces
+mv ~/canonical-osm/charms/interfaces/* .
+git clone https://git.launchpad.net/interface-mongodb mongodb
+
+```
+
+**Charm structure:**
+
+```
+├── config.yaml
+├── icon.svg
+├── layer.yaml
+├── metadata.yaml
+├── reactive
+│   ├── spec_template.yaml
+│   └── pol.py
+├── README.md
+└── tox.ini
+```
+
+**Setup environment variables:**
+
+```
+export CHARM_LAYERS_DIR=~/charm/layers
+export CHARM_BUILD_DIR=~/charm/build
+export CHARM_INTERFACES_DIR=~/charm/interfaces
+```
+
+**Build:**
+
+```
+mkdir ~/charm/layers/pol-k8s/tests/build
+charm build ~/charm/layers/pol-k8s
+charm build ~/charm/layers/kafka-k8s
+charm build ~/charm/layers/zookeeper-k8s
+charm build ~/charm/layers/mongodb-k8s
+mv ~/charm/build/* ~/charm/layers/pol-k8s/tests/build/
+```
diff --git a/installers/charm/pol-k8s/config.yaml b/installers/charm/pol-k8s/config.yaml
new file mode 100644 (file)
index 0000000..59f9d68
--- /dev/null
@@ -0,0 +1,26 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+options:
+  advertised-hostname:
+    description: POL Hostname
+    type: string
+    default: "pol-k8s"
+  log_level:
+    description: "Log Level"
+    type: string
+    default: "INFO"
+  image:
+    type: string
+    description: OCI image
+    default: opensourcemano/pol:7
diff --git a/installers/charm/pol-k8s/icon.svg b/installers/charm/pol-k8s/icon.svg
new file mode 100644 (file)
index 0000000..da31b4a
--- /dev/null
@@ -0,0 +1,118 @@
+<!--
+Copyright 2020 Canonical Ltd.
+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. -->
+
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="100px"
+   height="100px"
+   viewBox="0 0 100 100"
+   version="1.1"
+   id="svg18"
+   sodipodi:docname="template.svg"
+   inkscape:version="0.92.4 (f8dce91, 2019-08-02)">
+  <metadata
+     id="metadata22">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>eclispe-che</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="2880"
+     inkscape:window-height="1736"
+     id="namedview20"
+     showgrid="false"
+     inkscape:pagecheckerboard="true"
+     inkscape:zoom="2.36"
+     inkscape:cx="100.57842"
+     inkscape:cy="-9.2650043"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer2" />
+  <!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
+  <title
+     id="title2">eclispe-che</title>
+  <desc
+     id="desc4">Created with Sketch.</desc>
+  <defs
+     id="defs7">
+    <path
+       d="M50.0004412,4.04252804e-14 C22.3871247,4.04252804e-14 0,22.3848726 0,49.9995588 C0,77.6133626 22.3871247,100 50.0004412,100 C77.6137577,100 100,77.6133626 100,49.9995588 C100,22.3848726 77.6128753,3.55271368e-14 50.0004412,4.04252804e-14 Z"
+       id="path-1" />
+  </defs>
+  <g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="BACKGROUND">
+    <g
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-opacity:1"
+       id="Page-1">
+      <g
+         id="eclispe-che"
+         style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1">
+        <g
+           id="path3023-path"
+           style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1">
+          <use
+             xlink:href="#path-1"
+             id="use9"
+             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-opacity:1"
+             x="0"
+             y="0"
+             width="100%"
+             height="100%" />
+          <path
+             d="M 50.000441,0.5 C 22.662621,0.5 0.5,22.661661 0.5,49.999559 0.5,77.337051 22.663098,99.5 50.000441,99.5 77.337613,99.5 99.5,77.337222 99.5,49.999559 99.5,22.661796 77.337514,0.5 50.000441,0.5 Z"
+             id="path11"
+             style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="PLACE LOGO HERE">
+    <image
+       y="-9.851697"
+       x="-8.0254316"
+       id="image829"
+       xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApgAAAK8CAYAAABLDM/pAAAABHNCSVQICAgIfAhkiAAAIABJREFU eJzs3Xl4lOX1//E3mRkyZMhkCCEJIWwJ+yaJC6CIYhBFEBUQUNEiUpeqaGttbYtLrf3a6te2or/S 9mvBonVDEbAURFDECogCsexLMJAQSEJ2AjNMJvz+GCaGECDLJM/M5PO6rlxKMs/znEhMTu773OeA iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIhRWhkdgIhICLMAQ4DOQDmwCThkaEQiIiIiErQeBrKAUzXe VgADDIxLRERERIKMBfgnZyeW1d9KgFFGBSgi0tS0RS4ioaI9YD391ub0P6n2vpqcp998ik7/sxg4 CZQ1MI4ngOfr8LpCoBdQ0MDniIgELCWYIhKoOgEdgQSg6+l/xgFRQCzgOP1mP/3WFEpPvx0FcvHW UebhTUJzTr8/HzgCHDh9TXY94nkZeNSP8YqIBAQlmCJilEigNzAYSAa6nH7rCCQC4Q25qcVqA6B1 dPyZ77d9n/O5y0vPuu5k4RFOuU9S4XE35LE+Luoetwc4jPcAkIhISFGCKSJNrT2QAvQF+gHdgf54 k8jzsjpisXboRHT3zlijY7C2a094ZBStI+2E2x2ERzkItzto3TYSS0RbTOENyknP4izy7lqfPFaG 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 NCuTVT97iM1zf0f+ti2UHz6Au6yIipICCvbtJPvLT6sS1YYmhyZLGAc+W05pTi4DbpveuE8ywGWs WMyqR+/meN5BrI5Yrvn9XPpNmd7geu/sdWvYvfhNrI5Yhv/qeb/UjZvbRNA60k72l59yInsr7VNv JMwSmN+X/MHWqS+cOsWxA+kA44ANwH5jo5LmpC1yaQrJwDMAl//q+SZt6ZK/PZ1l901j5SN3Ubx3 C2aThYfih7Kp/0ye6nJNs7UaaqgyjwuACHMbgyORxhpm78KKftOZ32Miia3tlOdksPKRu1h237Qz tqmz161hye1jzui76lO9ufwp90k2z32RZfdNa9C2e7eRYzCbLJTnZJC/Pb0hn1LA87hcrPnVQ3z+ 5CzcznLiUkcw4b2PG90cf9+y9wFIun6cX3uf9r31Lhw9U3A7yzmy+kW/3TdQJYycQVzqCIBw4ANg gLERSXPSCqY0haVAUlzqCIb8+JdN8oDSrEzWvzCbr1565oytcN+KpTWs+U+qN8RRdzmv522mgymc ++IvMzocaSRTqzB6tYlhaswgTp06xeYTuZTlfMee99/kREkRAJ/+5B4q3M4L3ss3StSVl8ORbdvo deOEesUSZjZT9N1eijJ2Y7a2CaqJRHVRfdwjQOoDj5933GNdOYsKWPebn1N5qpKrnn3Z77svMX36 smfx25QfPkBk99SQGyNZU9vk4TiPbMVZeCQcGA8sQCMlWwStYIq/PQwMt1htXDn7Ob/f3FlUwIaX nmHxrWnsX7kU8M7s3jjg3qBYsaypuMKbaLTTCmZIiTJbearLNWwccC9pUclUeNzseGceKx+564xV yrqo8LjJ3byWnQsX1DuOHmMnAXBg7ef1vjaQ7Vy4gOX3TKQ8JwOrI5YbX1/K4BkP++Xe361aRoXH jaNnSpPsvnToP5h+U2cAcGjln6isOOn3ZwSSMHNrut78LFZHLEAisByINDYqaQ5KMMWfOgHPAVwy 6xd+/+acsWIxiyZfx4535lHhcZMWlcznA2YyJ2mcIQ3S/aGwQr/Ih7LE8Cje7j2FJX2mkdja3qh7 bfnbHDwuV72u6XjxMCxWW8hskzuLCljzq4dY/8JsKjxukkaPZ8J7H/u1Q8V/35wPQN9bJvrtnjUN nvEwVkcs5TkZHN38ryZ7TqAwR0SRfMcfsFhtAJcCfzE4JGkGSjDFn/4O2ONSR9RpDFtd+eosP39y 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 WYlWJEUkgilgikg4SbKdpDUAAAJjSURBVMK8LT0QRtcbQCL9m9luAB7ACziBVsABNANnu351dn3M C9Rjhkg3agckIiIiEnaqgPMDeNvQx+uk9nqzDWvVIiIiIhKynqD/4bIZc9VTRERERKRPqUAD/QuY /2ZRjSIiIiISZtZgrk5eLly+aFl1IiIiIhKWZgJbAT8XBssq4AsW1iUiMurpFrmIhLtMzH6aCUAt GpkoIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IhIR/j/m1Gy2udUkpAAAAABJRU5ErkJggg== "
+       style="image-rendering:optimizeQuality"
+       preserveAspectRatio="none"
+       height="120.55085"
+       width="113.50848" />
+  </g>
+</svg>
diff --git a/installers/charm/pol-k8s/layer.yaml b/installers/charm/pol-k8s/layer.yaml
new file mode 100644 (file)
index 0000000..4ed526b
--- /dev/null
@@ -0,0 +1,21 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+includes:
+  - "layer:caas-base"
+  - "layer:status"
+  - "layer:leadership"
+  - "layer:osm-common"
+  - "interface:kafka"
+  - "interface:mongodb"
+repo: https://code.launchpad.net/osm-k8s-bundle
diff --git a/installers/charm/pol-k8s/metadata.yaml b/installers/charm/pol-k8s/metadata.yaml
new file mode 100644 (file)
index 0000000..9e8d646
--- /dev/null
@@ -0,0 +1,35 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+name: pol-k8s
+summary: "OSM Policy Module (POL)"
+maintainers:
+  - "SolutionsQA <solutionsqa@lists.canonical.com>"
+description: |
+  A CAAS charm to deploy OSM's Policy Module (POL)
+tags:
+  - "application"
+series:
+  - "kubernetes"
+requires:
+  kafka:
+    interface: kafka
+  mongo:
+    interface: mongodb
+storage:
+  database:
+    type: filesystem
+    location: /app/database
+deployment:
+  type: stateful
+  service: cluster
diff --git a/installers/charm/pol-k8s/reactive/pol_k8s.py b/installers/charm/pol-k8s/reactive/pol_k8s.py
new file mode 100644 (file)
index 0000000..c31a323
--- /dev/null
@@ -0,0 +1,101 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+from charms.reactive import endpoint_from_flag
+from charms.layer.caas_base import pod_spec_set
+from charms.reactive import when, when_not, hook
+from charms.reactive.flags import set_flag, clear_flag
+from charmhelpers.core.hookenv import log, metadata, config
+from charms import layer
+
+
+@hook("upgrade-charm")
+@when("leadership.is_leader")
+def upgrade():
+    clear_flag("pol-k8s.configured")
+
+
+@when("config.changed")
+@when("leadership.is_leader")
+def restart():
+    clear_flag("pol-k8s.configured")
+
+
+@when_not("kafka.ready")
+@when_not("pol-k8s.configured")
+def waiting_for_kafka():
+    layer.status.waiting("Waiting for kafka to be ready")
+
+
+@when_not("mongo.ready")
+@when_not("pol-k8s.configured")
+def waiting_for_mongo():
+    layer.status.waiting("Waiting for mongo to be ready")
+
+
+@when("kafka.ready", "mongo.ready")
+@when_not("pol-k8s.configured")
+@when("leadership.is_leader")
+def configure():
+    layer.status.maintenance("Configuring pol container")
+    try:
+        kafka = endpoint_from_flag("kafka.ready")
+        mongo = endpoint_from_flag("mongo.ready")
+
+        if kafka and mongo:
+            kafka_units = kafka.kafkas()
+            kafka_unit = kafka_units[0]
+
+            mongo_uri = mongo.connection_string()
+            log("Mongo URI: {}".format(mongo_uri))
+
+            if mongo_uri and kafka_unit["host"]:
+                spec = make_pod_spec(kafka_unit["host"], kafka_unit["port"], mongo_uri)
+
+                log("set pod spec:\n{}".format(spec))
+                pod_spec_set(spec)
+                set_flag("pol-k8s.configured")
+    except Exception as e:
+        layer.status.blocked("k8s spec failed to deploy: {}".format(e))
+
+
+@when("pol-k8s.configured")
+def set_pol_active():
+    layer.status.active("ready")
+
+
+def make_pod_spec(kafka_host, kafka_port, mongo_uri):
+    """Make pod specification for Kubernetes
+
+    Args:
+        kafka_host (str): Kafka hostname or IP
+        kafka_port (int): Kafka port
+        mongo_host (str): Mongo URI
+    Returns:
+        pod_spec: Pod specification for Kubernetes
+    """
+
+    with open("reactive/spec_template.yaml") as spec_file:
+        pod_spec_template = spec_file.read()
+
+    md = metadata()
+    cfg = config()
+    data = {
+        "name": md.get("name"),
+        "docker_image": cfg.get("image"),
+        "kafka_host": kafka_host,
+        "kafka_port": kafka_port,
+        "mongo_uri": mongo_uri,
+    }
+    data.update(cfg)
+    return pod_spec_template % data
diff --git a/installers/charm/pol-k8s/reactive/spec_template.yaml b/installers/charm/pol-k8s/reactive/spec_template.yaml
new file mode 100644 (file)
index 0000000..de7d4a2
--- /dev/null
@@ -0,0 +1,48 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+version: 2
+containers:
+  - name: %(name)s
+    image: %(docker_image)s
+    ports:
+    # This is a fake port; lcm doesn't listen, since it's just reading
+    # and responding to the kafka bus. Fix this in post.
+    - containerPort: 80
+      protocol: TCP
+    config:
+      ALLOW_ANONYMOUS_LOGIN: 'yes'
+      OSMPOL_MESSAGE_DRIVER: kafka
+      OSMPOL_MESSAGE_HOST: %(kafka_host)s
+      OSMPOL_MESSAGE_PORT: %(kafka_port)s
+
+      OSMPOL_DATABASE_DRIVER: mongo
+      OSMPOL_DATABASE_URI: %(mongo_uri)s
+
+      OSMPOL_GLOBAL_LOGLEVEL: %(log_level)s
+    # kubernetes:
+    # readinessProbe:
+    #   exec:
+    #     command: ["sh", "-c", "osm-pol-healthcheck || exit 1"]
+    #   periodSeconds: 10
+    #   timeoutSeconds: 5
+    #   successThreshold: 1
+    #   failureThreshold: 3
+    # livenessProbe:
+    #   exec:
+    #     command: ["sh", "-c", "osm-pol-healthcheck || exit 1"]
+    #   initialDelaySeconds: 45
+    #   periodSeconds: 10
+    #   timeoutSeconds: 5
+    #   successThreshold: 1
+    #   failureThreshold: 3
\ No newline at end of file
diff --git a/installers/charm/pol-k8s/tox.ini b/installers/charm/pol-k8s/tox.ini
new file mode 100644 (file)
index 0000000..f8f6990
--- /dev/null
@@ -0,0 +1,60 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+[tox]
+envlist = pep8
+skipsdist = True
+
+[testenv]
+setenv = VIRTUAL_ENV={envdir}
+         PYTHONHASHSEED=0
+whitelist_externals = juju
+                      sleep
+passenv = HOME TERM CS_API_* OS_* AMULET_*
+install_command =
+  pip install {opts} {packages}
+
+[testenv:build]
+basepython = python3
+passenv=HTTP_PROXY HTTPS_PROXY NO_PROXY
+setenv = CHARM_LAYERS_DIR = ../layers
+         CHARM_INTERFACES_DIR = ../interfaces/
+whitelist_externals = git
+                      charm
+                      rm
+                      mv
+commands =
+    rm -rf release
+    rm -rf ../interfaces/mongodb
+    git clone https://git.launchpad.net/interface-mongodb ../interfaces/mongodb
+    charm build . --build-dir /tmp
+    mv /tmp/pol-k8s/ release/
+
+[testenv:lint]
+basepython = python3
+deps =
+    black
+    yamllint
+    flake8
+commands =
+    black --check --diff . --exclude "release/|.tox/"
+    yamllint .
+    flake8 reactive/ --max-line-length=100
+
+[testenv:pep8]
+basepython = python3
+deps=charm-tools
+commands = charm-proof
+
+[testenv:venv]
+commands = {posargs}
diff --git a/installers/charm/ro-k8s/.yamllint.yaml b/installers/charm/ro-k8s/.yamllint.yaml
new file mode 100644 (file)
index 0000000..d24a69d
--- /dev/null
@@ -0,0 +1,24 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+---
+extends: default
+
+yaml-files:
+  - "*.yaml"
+  - "*.yml"
+  - ".yamllint"
+ignore: |
+  reactive/
+  .tox
+  release/
diff --git a/installers/charm/ro-k8s/README.md b/installers/charm/ro-k8s/README.md
new file mode 100755 (executable)
index 0000000..5571622
--- /dev/null
@@ -0,0 +1,91 @@
+<!--
+Copyright 2020 Canonical Ltd.
+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. -->
+
+# Overview
+
+OSM RO charm for Kubernetes
+
+## Testing
+
+The tests of this charm are done using tox and Zaza.
+
+
+
+### Prepare environment
+
+The machine in which the tests are run needs access to a juju k8s controller. The easiest way to approach this is by executing the following commands:
+
+```
+sudo apt install tox -y
+sudo snap install microk8s --classic
+sudo snap install juju
+
+microk8s.status --wait-ready
+microk8s.enable storage dashboard dns
+
+juju bootstrap microk8s k8s-cloud
+```
+
+If /usr/bin/python does not exist, you should probably need to do this:
+
+```
+sudo ln -s /usr/bin/python3 /usr/bin/python
+```
+
+### Build Charm
+
+**Download dependencies:**
+
+```
+mkdir -p ~/charm/layers ~/charm/build ~/charm/interfaces
+git clone https://git.launchpad.net/canonical-osm ~/canonical-osm
+
+cd ~/charm/layers
+git clone https://git.launchpad.net/charm-k8s-mariadb mariadb-k8s
+git clone https://git.launchpad.net/charm-osm-ro ro-k8s
+
+cd ~/charm/interfaces
+mv ~/canonical-osm/charms/interfaces/* .
+git clone https://git.launchpad.net/interface-osm-ro osm-ro
+
+```
+
+**Charm structure:**
+
+```
+├── config.yaml
+├── icon.svg
+├── layer.yaml
+├── metadata.yaml
+├── reactive
+│   ├── spec_template.yaml
+│   └── ui.py
+├── README.md
+└── tox.ini
+```
+
+**Setup environment variables:**
+
+```
+export CHARM_LAYERS_DIR=~/charm/layers
+export CHARM_BUILD_DIR=~/charm/build
+export CHARM_INTERFACES_DIR=~/charm/interfaces
+```
+
+**Build:**
+
+```
+mkdir ~/charm/layers/ro-k8s/tests/build
+charm build ~/charm/layers/mariadb-k8s
+charm build ~/charm/layers/ro-k8s
+mv ~/charm/build/* ~/charm/layers/ro-k8s/tests/build/
+```
diff --git a/installers/charm/ro-k8s/config.yaml b/installers/charm/ro-k8s/config.yaml
new file mode 100755 (executable)
index 0000000..c35d114
--- /dev/null
@@ -0,0 +1,34 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+options:
+  advertised-port:
+    description: RO port
+    type: int
+    default: 9090
+  vim_database:
+    type: string
+    description: "The database name."
+    default: "mano_vim_db"
+  ro_database:
+    type: string
+    description: "The database name."
+    default: "mano_db"
+  OPENMANO_TENANT:
+    type: string
+    description: "Openmano Tenant"
+    default: "osm"
+  image:
+    type: string
+    description: OCI image
+    default: opensourcemano/ro:7
diff --git a/installers/charm/ro-k8s/icon.svg b/installers/charm/ro-k8s/icon.svg
new file mode 100644 (file)
index 0000000..da31b4a
--- /dev/null
@@ -0,0 +1,118 @@
+<!--
+Copyright 2020 Canonical Ltd.
+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. -->
+
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="100px"
+   height="100px"
+   viewBox="0 0 100 100"
+   version="1.1"
+   id="svg18"
+   sodipodi:docname="template.svg"
+   inkscape:version="0.92.4 (f8dce91, 2019-08-02)">
+  <metadata
+     id="metadata22">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>eclispe-che</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="2880"
+     inkscape:window-height="1736"
+     id="namedview20"
+     showgrid="false"
+     inkscape:pagecheckerboard="true"
+     inkscape:zoom="2.36"
+     inkscape:cx="100.57842"
+     inkscape:cy="-9.2650043"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer2" />
+  <!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
+  <title
+     id="title2">eclispe-che</title>
+  <desc
+     id="desc4">Created with Sketch.</desc>
+  <defs
+     id="defs7">
+    <path
+       d="M50.0004412,4.04252804e-14 C22.3871247,4.04252804e-14 0,22.3848726 0,49.9995588 C0,77.6133626 22.3871247,100 50.0004412,100 C77.6137577,100 100,77.6133626 100,49.9995588 C100,22.3848726 77.6128753,3.55271368e-14 50.0004412,4.04252804e-14 Z"
+       id="path-1" />
+  </defs>
+  <g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="BACKGROUND">
+    <g
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-opacity:1"
+       id="Page-1">
+      <g
+         id="eclispe-che"
+         style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1">
+        <g
+           id="path3023-path"
+           style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1">
+          <use
+             xlink:href="#path-1"
+             id="use9"
+             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-opacity:1"
+             x="0"
+             y="0"
+             width="100%"
+             height="100%" />
+          <path
+             d="M 50.000441,0.5 C 22.662621,0.5 0.5,22.661661 0.5,49.999559 0.5,77.337051 22.663098,99.5 50.000441,99.5 77.337613,99.5 99.5,77.337222 99.5,49.999559 99.5,22.661796 77.337514,0.5 50.000441,0.5 Z"
+             id="path11"
+             style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="PLACE LOGO HERE">
+    <image
+       y="-9.851697"
+       x="-8.0254316"
+       id="image829"
+       xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApgAAAK8CAYAAABLDM/pAAAABHNCSVQICAgIfAhkiAAAIABJREFU eJzs3Xl4lOX1//E3mRkyZMhkCCEJIWwJ+yaJC6CIYhBFEBUQUNEiUpeqaGttbYtLrf3a6te2or/S 9mvBonVDEbAURFDECogCsexLMJAQSEJ2AjNMJvz+GCaGECDLJM/M5PO6rlxKMs/znEhMTu773OeA iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIhRWhkdgIhICLMAQ4DOQDmwCThkaEQiIiIiErQeBrKAUzXe VgADDIxLRERERIKMBfgnZyeW1d9KgFFGBSgi0tS0RS4ioaI9YD391ub0P6n2vpqcp998ik7/sxg4 CZQ1MI4ngOfr8LpCoBdQ0MDniIgELCWYIhKoOgEdgQSg6+l/xgFRQCzgOP1mP/3WFEpPvx0FcvHW UebhTUJzTr8/HzgCHDh9TXY94nkZeNSP8YqIBAQlmCJilEigNzAYSAa6nH7rCCQC4Q25qcVqA6B1 dPyZ77d9n/O5y0vPuu5k4RFOuU9S4XE35LE+Luoetwc4jPcAkIhISFGCKSJNrT2QAvQF+gHdgf54 k8jzsjpisXboRHT3zlijY7C2a094ZBStI+2E2x2ERzkItzto3TYSS0RbTOENyknP4izy7lqfPFaG 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 NCuTVT97iM1zf0f+ti2UHz6Au6yIipICCvbtJPvLT6sS1YYmhyZLGAc+W05pTi4DbpveuE8ywGWs WMyqR+/meN5BrI5Yrvn9XPpNmd7geu/sdWvYvfhNrI5Yhv/qeb/UjZvbRNA60k72l59yInsr7VNv JMwSmN+X/MHWqS+cOsWxA+kA44ANwH5jo5LmpC1yaQrJwDMAl//q+SZt6ZK/PZ1l901j5SN3Ubx3 C2aThYfih7Kp/0ye6nJNs7UaaqgyjwuACHMbgyORxhpm78KKftOZ32Miia3tlOdksPKRu1h237Qz tqmz161hye1jzui76lO9ufwp90k2z32RZfdNa9C2e7eRYzCbLJTnZJC/Pb0hn1LA87hcrPnVQ3z+ 5CzcznLiUkcw4b2PG90cf9+y9wFIun6cX3uf9r31Lhw9U3A7yzmy+kW/3TdQJYycQVzqCIBw4ANg gLERSXPSCqY0haVAUlzqCIb8+JdN8oDSrEzWvzCbr1565oytcN+KpTWs+U+qN8RRdzmv522mgymc ++IvMzocaSRTqzB6tYlhaswgTp06xeYTuZTlfMee99/kREkRAJ/+5B4q3M4L3ss3StSVl8ORbdvo deOEesUSZjZT9N1eijJ2Y7a2CaqJRHVRfdwjQOoDj5933GNdOYsKWPebn1N5qpKrnn3Z77svMX36 smfx25QfPkBk99SQGyNZU9vk4TiPbMVZeCQcGA8sQCMlWwStYIq/PQwMt1htXDn7Ob/f3FlUwIaX nmHxrWnsX7kU8M7s3jjg3qBYsaypuMKbaLTTCmZIiTJbearLNWwccC9pUclUeNzseGceKx+564xV yrqo8LjJ3byWnQsX1DuOHmMnAXBg7ef1vjaQ7Vy4gOX3TKQ8JwOrI5YbX1/K4BkP++Xe361aRoXH jaNnSpPsvnToP5h+U2cAcGjln6isOOn3ZwSSMHNrut78LFZHLEAisByINDYqaQ5KMMWfOgHPAVwy 6xd+/+acsWIxiyZfx4535lHhcZMWlcznA2YyJ2mcIQ3S/aGwQr/Ih7LE8Cje7j2FJX2mkdja3qh7 bfnbHDwuV72u6XjxMCxWW8hskzuLCljzq4dY/8JsKjxukkaPZ8J7H/u1Q8V/35wPQN9bJvrtnjUN nvEwVkcs5TkZHN38ryZ7TqAwR0SRfMcfsFhtAJcCfzE4JGkGSjDFn/4O2ONSR9RpDFtd+eosP39y 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 WYlWJEUkgilgikg4SbKdpDUAAAJjSURBVMK8LT0QRtcbQCL9m9luAB7ACziBVsABNANnu351dn3M C9Rjhkg3agckIiIiEnaqgPMDeNvQx+uk9nqzDWvVIiIiIhKynqD/4bIZc9VTRERERKRPqUAD/QuY /2ZRjSIiIiISZtZgrk5eLly+aFl1IiIiIhKWZgJbAT8XBssq4AsW1iUiMurpFrmIhLtMzH6aCUAt GpkoIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IhIR/j/m1Gy2udUkpAAAAABJRU5ErkJggg== "
+       style="image-rendering:optimizeQuality"
+       preserveAspectRatio="none"
+       height="120.55085"
+       width="113.50848" />
+  </g>
+</svg>
diff --git a/installers/charm/ro-k8s/layer.yaml b/installers/charm/ro-k8s/layer.yaml
new file mode 100644 (file)
index 0000000..73a7090
--- /dev/null
@@ -0,0 +1,22 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+includes:
+  - "layer:caas-base"
+  - "layer:status"
+  - "layer:leadership"
+  - "layer:osm-common"
+  - "interface:juju-relation-mysql"
+  - "interface:osm-ro"
+
+repo: https://code.launchpad.net/osm-k8s-bundle
diff --git a/installers/charm/ro-k8s/metadata.yaml b/installers/charm/ro-k8s/metadata.yaml
new file mode 100755 (executable)
index 0000000..3531e4b
--- /dev/null
@@ -0,0 +1,36 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+name: "ro-k8s"
+summary: "OSM Resource Orchestrator (RO)"
+maintainers:
+  - "SolutionsQA <solutionsqa@lists.canonical.com>"
+description: |
+  A CAAS charm to deploy OSM's Resource Orchestrator (RO).
+tags:
+  - "application"
+series:
+  - "kubernetes"
+provides:
+  ro:
+    interface: osm-ro
+requires:
+  mysql:
+    interface: mysql
+storage:
+  log:
+    type: filesystem
+    location: /var/log/osm
+deployment:
+  type: stateful
+  service: cluster
diff --git a/installers/charm/ro-k8s/reactive/ro.py b/installers/charm/ro-k8s/reactive/ro.py
new file mode 100644 (file)
index 0000000..afd7f45
--- /dev/null
@@ -0,0 +1,124 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+from charms.layer.caas_base import pod_spec_set
+from charms.reactive import endpoint_from_flag
+from charms.reactive import when, when_not, hook
+from charms.reactive.flags import set_flag, clear_flag
+from charmhelpers.core.hookenv import log, metadata, config
+from charms import layer
+from charms.osm.k8s import get_service_ip
+
+
+@hook("upgrade-charm")
+@when("leadership.is_leader")
+def upgrade():
+    clear_flag("ro-k8s.configured")
+
+
+@when("config.changed")
+@when("leadership.is_leader")
+def restart():
+    clear_flag("ro-k8s.configured")
+
+
+@when_not("mysql.available")
+@when_not("ro-k8s.configured")
+def waiting_for_mysql():
+    layer.status.waiting("Waiting for mysql to be ready")
+
+
+@when("mysql.available")
+@when_not("ro-k8s.configured")
+@when("leadership.is_leader")
+def configure():
+    layer.status.maintenance("Configuring ro container")
+    try:
+        mysql = endpoint_from_flag("mysql.available")
+
+        spec = make_pod_spec(
+            mysql.host(),
+            mysql.port(),
+            mysql.user(),
+            mysql.password(),
+            mysql.root_password(),
+        )
+
+        log("set pod spec:\n{}".format(spec))
+        pod_spec_set(spec)
+        layer.status.active("creating container")
+        set_flag("ro-k8s.configured")
+    except Exception as e:
+        layer.status.blocked("k8s spec failed to deploy: {}".format(e))
+
+
+@when("ro-k8s.configured")
+def set_ro_active():
+    layer.status.active("ready")
+
+
+@when("ro-k8s.configured", "ro.joined")
+def send_config():
+    layer.status.maintenance("Sending RO configuration")
+    try:
+        ro = endpoint_from_flag("ro.joined")
+        if ro:
+            service_ip = get_service_ip("ro")
+            if service_ip:
+                ro.send_connection(
+                    service_ip, get_ro_port(),
+                )
+                clear_flag("ro.joined")
+    except Exception as e:
+        log("Fail sending RO configuration: {}".format(e))
+
+
+def make_pod_spec(
+    mysql_host, mysql_port, mysql_user, mysql_password, mysql_root_password
+):
+    """Make pod specification for Kubernetes
+
+    Args:
+        mysql_name (str): RO DB name
+        mysql_host (str): RO DB host
+        mysql_port (int): RO DB port
+        mysql_user (str): RO DB user
+        mysql_password (str): RO DB password
+    Returns:
+        pod_spec: Pod specification for Kubernetes
+    """
+
+    with open("reactive/spec_template.yaml") as spec_file:
+        pod_spec_template = spec_file.read()
+
+    md = metadata()
+    cfg = config()
+
+    data = {
+        "name": md.get("name"),
+        "docker_image": cfg.get("image"),
+        "mysql_host": mysql_host,
+        "mysql_port": mysql_port,
+        "mysql_user": mysql_user,
+        "mysql_password": mysql_password,
+        "mysql_root_password": mysql_root_password,
+    }
+    data.update(cfg)
+
+    return pod_spec_template % data
+
+
+def get_ro_port():
+    """Returns RO port"""
+    cfg = config()
+    return cfg.get("advertised-port")
diff --git a/installers/charm/ro-k8s/reactive/spec_template.yaml b/installers/charm/ro-k8s/reactive/spec_template.yaml
new file mode 100644 (file)
index 0000000..f4f7c9c
--- /dev/null
@@ -0,0 +1,55 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+version: 2
+service:
+  scalePolicy: serial
+containers:
+  - name: %(name)s
+    image: %(docker_image)s
+    kubernetes:
+      readinessProbe:
+        httpGet:
+          path: /openmano/tenants
+          port: %(advertised-port)s
+        periodSeconds: 10
+        timeoutSeconds: 5
+        successThreshold: 1
+        failureThreshold: 3
+      livenessProbe:
+        tcpSocket:
+          port: %(advertised-port)s
+        initialDelaySeconds: 600
+        periodSeconds: 10
+        timeoutSeconds: 5
+        successThreshold: 1
+        failureThreshold: 3
+    ports:
+    - containerPort: %(advertised-port)s
+      protocol: TCP
+    config:
+        ALLOW_ANONYMOUS_LOGIN: 'yes'
+        RO_DB_HOST: %(mysql_host)s
+        RO_DB_PORT: %(mysql_port)s
+        RO_DB_NAME: %(ro_database)s
+        RO_DB_USER: %(mysql_user)s
+        RO_DB_ROOT_PASSWORD: %(mysql_root_password)s
+        RO_DB_PASSWORD: %(mysql_password)s
+
+        RO_DB_OVIM_PASSWORD: %(mysql_password)s
+        RO_DB_OVIM_HOST: %(mysql_host)s
+        RO_DB_OVIM_PORT: %(mysql_port)s
+        RO_DB_OVIM_USER: %(mysql_user)s
+        RO_DB_OVIM_ROOT_PASSWORD: %(mysql_root_password)s
+        RO_DB_OVIM_NAME: %(vim_database)s
+        OPENMANO_TENANT: %(OPENMANO_TENANT)s
diff --git a/installers/charm/ro-k8s/tox.ini b/installers/charm/ro-k8s/tox.ini
new file mode 100644 (file)
index 0000000..fef77c0
--- /dev/null
@@ -0,0 +1,63 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+[tox]
+envlist = pep8
+skipsdist = True
+
+[testenv]
+setenv = VIRTUAL_ENV={envdir}
+         PYTHONHASHSEED=0
+whitelist_externals = juju
+                      sleep
+passenv = HOME TERM CS_API_* OS_* AMULET_*
+install_command =
+  pip install {opts} {packages}
+
+
+[testenv:build]
+basepython = python3
+passenv=HTTP_PROXY HTTPS_PROXY NO_PROXY
+setenv = CHARM_LAYERS_DIR = ../layers
+         CHARM_INTERFACES_DIR = ../interfaces/
+whitelist_externals = git
+                      charm
+                      rm
+                      mv
+commands =
+    rm -rf release
+    rm -rf ../interfaces/juju-relation-mysql
+    rm -rf /tmp/canonical-osm
+    git clone https://git.launchpad.net/canonical-osm/ /tmp/canonical-osm
+    mv /tmp/canonical-osm/charms/interfaces/juju-relation-mysql ../interfaces/juju-relation-mysql
+    charm build . --build-dir /tmp
+    mv /tmp/ro-k8s/ release/
+
+[testenv:lint]
+basepython = python3
+deps =
+    black
+    yamllint
+    flake8
+commands =
+    black --check --diff . --exclude "release/|.tox/"
+    yamllint .
+    flake8 reactive/ --max-line-length=100
+
+[testenv:pep8]
+basepython = python3
+deps=charm-tools
+commands = charm-proof
+
+[testenv:venv]
+commands = {posargs}
diff --git a/installers/charm/ui-k8s/.yamllint.yaml b/installers/charm/ui-k8s/.yamllint.yaml
new file mode 100644 (file)
index 0000000..d24a69d
--- /dev/null
@@ -0,0 +1,24 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+---
+extends: default
+
+yaml-files:
+  - "*.yaml"
+  - "*.yml"
+  - ".yamllint"
+ignore: |
+  reactive/
+  .tox
+  release/
diff --git a/installers/charm/ui-k8s/README.md b/installers/charm/ui-k8s/README.md
new file mode 100755 (executable)
index 0000000..8cfa784
--- /dev/null
@@ -0,0 +1,117 @@
+<!--
+Copyright 2020 Canonical Ltd.
+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. -->
+
+# Overview
+
+UI for Juju CAAS
+
+## Testing
+
+The tests of this charm are done using tox and Zaza.
+
+
+
+### Prepare environment
+
+The machine in which the tests are run needs access to a juju k8s controller. The easiest way to approach this is by executing the following commands:
+
+```
+sudo apt install tox -y
+sudo snap install microk8s --classic
+sudo snap install juju
+
+microk8s.status --wait-ready
+microk8s.enable storage dashboard dns
+
+juju bootstrap microk8s k8s-cloud
+```
+
+If /usr/bin/python does not exist, you should probably need to do this:
+
+```
+sudo ln -s /usr/bin/python3 /usr/bin/python
+```
+
+### Build Charm
+
+**Download dependencies:**
+
+```
+mkdir -p ~/charm/layers ~/charm/build ~/charm/interfaces
+git clone --single-branch --branch master https://git.launchpad.net/canonical-osm ~/canonical-osm
+
+cd ~/charm/layers
+git clone --single-branch --branch=master https://git.launchpad.net/charm-osm-ui ui-k8s
+git clone --single-branch --branch=master https://git.launchpad.net/charm-k8s-grafana grafana-k8s
+git clone --single-branch --branch=master https://git.launchpad.net/charm-k8s-prometheus prometheus-k8s
+git clone --single-branch --branch=master https://git.launchpad.net/charm-k8s-mariadb mariadb-k8s
+git clone --single-branch --branch=master https://git.launchpad.net/charm-osm-lcm lcm-k8s
+git clone --single-branch --branch=master https://git.launchpad.net/charm-osm-mon mon-k8s
+git clone --single-branch --branch=master https://git.launchpad.net/charm-osm-nbi nbi-k8s
+git clone --single-branch --branch=master https://git.launchpad.net/charm-osm-pol pol-k8s
+git clone --single-branch --branch=master https://git.launchpad.net/charm-osm-ro ro-k8s
+git clone --single-branch --branch=master https://git.launchpad.net/charm-k8s-keystone keystone-k8s
+git clone --single-branch --branch=master https://git.launchpad.net/charm-k8s-kafka kafka-k8s ~/charm/interfaces
+git clone --single-branch --branch=master https://git.launchpad.net/charm-k8s-zookeeper zookeeper-k8s
+git clone --single-branch --branch=master https://git.launchpad.net/charm-k8s-mongodb mongodb-k8s
+
+cd ~/charm/interfaces
+mv ~/canonical-osm/charms/interfaces/* .
+git clone https://git.launchpad.net/interface-mongodb mongodb
+git clone https://git.launchpad.net/interface-osm-mon mon
+git clone https://git.launchpad.net/interface-osm-nbi osm-nbi
+git clone https://git.launchpad.net/interface-osm-ro osm-ro
+
+```
+
+**Charm structure:**
+
+```
+├── config.yaml
+├── icon.svg
+├── layer.yaml
+├── metadata.yaml
+├── reactive
+│   ├── spec_template.yaml
+│   └── ui.py
+├── README.md
+└── tox.ini
+```
+
+**Setup environment variables:**
+
+```
+export CHARM_LAYERS_DIR=~/charm/layers
+export CHARM_BUILD_DIR=~/charm/build
+export CHARM_INTERFACES_DIR=~/charm/interfaces
+```
+
+**Build:**
+
+```
+mkdir ~/charm/layers/ui-k8s/tests/build
+export https_proxy=\$PROXY
+charm build ~/charm/layers/ui-k8s
+charm build ~/charm/layers/grafana-k8s
+charm build ~/charm/layers/prometheus-k8s
+charm build ~/charm/layers/mariadb-k8s
+charm build ~/charm/layers/lcm-k8s
+charm build ~/charm/layers/mon-k8s
+charm build ~/charm/layers/nbi-k8s
+charm build ~/charm/layers/pol-k8s
+charm build ~/charm/layers/ro-k8s
+charm build ~/charm/layers/keystone-k8s
+charm build ~/charm/layers/kafka-k8s
+charm build ~/charm/layers/zookeeper-k8s
+charm build ~/charm/layers/mongodb-k8s
+mv ~/charm/build/* ~/charm/layers/ui-k8s/tests/build/
+```
diff --git a/installers/charm/ui-k8s/config.yaml b/installers/charm/ui-k8s/config.yaml
new file mode 100755 (executable)
index 0000000..1f6338e
--- /dev/null
@@ -0,0 +1,30 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+options:
+  advertised-hostname:
+    description: Advertised hostname
+    type: string
+    default: "ui"
+  advertised-port:
+    description: UI Port
+    type: int
+    default: 80
+  mysql_database:
+    description: Mysql Database for UI
+    type: string
+    default: lwui
+  image:
+    type: string
+    description: OCI image
+    default: opensourcemano/light-ui:7
diff --git a/installers/charm/ui-k8s/icon.svg b/installers/charm/ui-k8s/icon.svg
new file mode 100644 (file)
index 0000000..0177a69
--- /dev/null
@@ -0,0 +1,119 @@
+<!-- # Copyright 2020 Canonical Ltd.
+#
+# 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. -->
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="100px"
+   height="100px"
+   viewBox="0 0 100 100"
+   version="1.1"
+   id="svg18"
+   sodipodi:docname="template.svg"
+   inkscape:version="0.92.4 (f8dce91, 2019-08-02)">
+  <metadata
+     id="metadata22">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>eclispe-che</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="2880"
+     inkscape:window-height="1736"
+     id="namedview20"
+     showgrid="false"
+     inkscape:pagecheckerboard="true"
+     inkscape:zoom="2.36"
+     inkscape:cx="100.57842"
+     inkscape:cy="-9.2650043"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer2" />
+  <!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
+  <title
+     id="title2">eclispe-che</title>
+  <desc
+     id="desc4">Created with Sketch.</desc>
+  <defs
+     id="defs7">
+    <path
+       d="M50.0004412,4.04252804e-14 C22.3871247,4.04252804e-14 0,22.3848726 0,49.9995588 C0,77.6133626 22.3871247,100 50.0004412,100 C77.6137577,100 100,77.6133626 100,49.9995588 C100,22.3848726 77.6128753,3.55271368e-14 50.0004412,4.04252804e-14 Z"
+       id="path-1" />
+  </defs>
+  <g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="BACKGROUND">
+    <g
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-opacity:1"
+       id="Page-1">
+      <g
+         id="eclispe-che"
+         style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1">
+        <g
+           id="path3023-path"
+           style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1">
+          <use
+             xlink:href="#path-1"
+             id="use9"
+             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-opacity:1"
+             x="0"
+             y="0"
+             width="100%"
+             height="100%" />
+          <path
+             d="M 50.000441,0.5 C 22.662621,0.5 0.5,22.661661 0.5,49.999559 0.5,77.337051 22.663098,99.5 50.000441,99.5 77.337613,99.5 99.5,77.337222 99.5,49.999559 99.5,22.661796 77.337514,0.5 50.000441,0.5 Z"
+             id="path11"
+             style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="PLACE LOGO HERE">
+    <image
+       y="-9.851697"
+       x="-8.0254316"
+       id="image829"
+       xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApgAAAK8CAYAAABLDM/pAAAABHNCSVQICAgIfAhkiAAAIABJREFU eJzs3Xl4lOX1//E3mRkyZMhkCCEJIWwJ+yaJC6CIYhBFEBUQUNEiUpeqaGttbYtLrf3a6te2or/S 9mvBonVDEbAURFDECogCsexLMJAQSEJ2AjNMJvz+GCaGECDLJM/M5PO6rlxKMs/znEhMTu773OeA iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIhRWhkdgIhICLMAQ4DOQDmwCThkaEQiIiIiErQeBrKAUzXe VgADDIxLRERERIKMBfgnZyeW1d9KgFFGBSgi0tS0RS4ioaI9YD391ub0P6n2vpqcp998ik7/sxg4 CZQ1MI4ngOfr8LpCoBdQ0MDniIgELCWYIhKoOgEdgQSg6+l/xgFRQCzgOP1mP/3WFEpPvx0FcvHW UebhTUJzTr8/HzgCHDh9TXY94nkZeNSP8YqIBAQlmCJilEigNzAYSAa6nH7rCCQC4Q25qcVqA6B1 dPyZ77d9n/O5y0vPuu5k4RFOuU9S4XE35LE+Luoetwc4jPcAkIhISFGCKSJNrT2QAvQF+gHdgf54 k8jzsjpisXboRHT3zlijY7C2a094ZBStI+2E2x2ERzkItzto3TYSS0RbTOENyknP4izy7lqfPFaG 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 NCuTVT97iM1zf0f+ti2UHz6Au6yIipICCvbtJPvLT6sS1YYmhyZLGAc+W05pTi4DbpveuE8ywGWs WMyqR+/meN5BrI5Yrvn9XPpNmd7geu/sdWvYvfhNrI5Yhv/qeb/UjZvbRNA60k72l59yInsr7VNv JMwSmN+X/MHWqS+cOsWxA+kA44ANwH5jo5LmpC1yaQrJwDMAl//q+SZt6ZK/PZ1l901j5SN3Ubx3 C2aThYfih7Kp/0ye6nJNs7UaaqgyjwuACHMbgyORxhpm78KKftOZ32Miia3tlOdksPKRu1h237Qz tqmz161hye1jzui76lO9ufwp90k2z32RZfdNa9C2e7eRYzCbLJTnZJC/Pb0hn1LA87hcrPnVQ3z+ 5CzcznLiUkcw4b2PG90cf9+y9wFIun6cX3uf9r31Lhw9U3A7yzmy+kW/3TdQJYycQVzqCIBw4ANg gLERSXPSCqY0haVAUlzqCIb8+JdN8oDSrEzWvzCbr1565oytcN+KpTWs+U+qN8RRdzmv522mgymc ++IvMzocaSRTqzB6tYlhaswgTp06xeYTuZTlfMee99/kREkRAJ/+5B4q3M4L3ss3StSVl8ORbdvo deOEesUSZjZT9N1eijJ2Y7a2CaqJRHVRfdwjQOoDj5933GNdOYsKWPebn1N5qpKrnn3Z77svMX36 smfx25QfPkBk99SQGyNZU9vk4TiPbMVZeCQcGA8sQCMlWwStYIq/PQwMt1htXDn7Ob/f3FlUwIaX nmHxrWnsX7kU8M7s3jjg3qBYsaypuMKbaLTTCmZIiTJbearLNWwccC9pUclUeNzseGceKx+564xV yrqo8LjJ3byWnQsX1DuOHmMnAXBg7ef1vjaQ7Vy4gOX3TKQ8JwOrI5YbX1/K4BkP++Xe361aRoXH jaNnSpPsvnToP5h+U2cAcGjln6isOOn3ZwSSMHNrut78LFZHLEAisByINDYqaQ5KMMWfOgHPAVwy 6xd+/+acsWIxiyZfx4535lHhcZMWlcznA2YyJ2mcIQ3S/aGwQr/Ih7LE8Cje7j2FJX2mkdja3qh7 bfnbHDwuV72u6XjxMCxWW8hskzuLCljzq4dY/8JsKjxukkaPZ8J7H/u1Q8V/35wPQN9bJvrtnjUN nvEwVkcs5TkZHN38ryZ7TqAwR0SRfMcfsFhtAJcCfzE4JGkGSjDFn/4O2ONSR9RpDFtd+eosP39y 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 WYlWJEUkgilgikg4SbKdpDUAAAJjSURBVMK8LT0QRtcbQCL9m9luAB7ACziBVsABNANnu351dn3M C9Rjhkg3agckIiIiEnaqgPMDeNvQx+uk9nqzDWvVIiIiIhKynqD/4bIZc9VTRERERKRPqUAD/QuY /2ZRjSIiIiISZtZgrk5eLly+aFl1IiIiIhKWZgJbAT8XBssq4AsW1iUiMurpFrmIhLtMzH6aCUAt GpkoIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi IhIR/j/m1Gy2udUkpAAAAABJRU5ErkJggg== "
+       style="image-rendering:optimizeQuality"
+       preserveAspectRatio="none"
+       height="120.55085"
+       width="113.50848" />
+  </g>
+</svg>
diff --git a/installers/charm/ui-k8s/layer.yaml b/installers/charm/ui-k8s/layer.yaml
new file mode 100644 (file)
index 0000000..40a4a70
--- /dev/null
@@ -0,0 +1,22 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+includes:
+  - "layer:caas-base"
+  - "layer:status"
+  - "layer:leadership"
+  - "layer:osm-common"
+  - "interface:juju-relation-mysql"
+  - "interface:osm-nbi"
+
+repo: https://code.launchpad.net/osm-k8s-bundle
diff --git a/installers/charm/ui-k8s/metadata.yaml b/installers/charm/ui-k8s/metadata.yaml
new file mode 100755 (executable)
index 0000000..5c3fe9e
--- /dev/null
@@ -0,0 +1,31 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+name: "ui-k8s"
+summary: "OSM User Interface (UI)"
+maintainers:
+  - "SolutionsQA <solutionsqa@lists.canonical.com>"
+description: |
+  A CAAS charm to deploy OSM's Northbound Interface (NBI).
+tags:
+  - "application"
+series:
+  - "kubernetes"
+requires:
+  mysql:
+    interface: mysql
+  nbi:
+    interface: osm-nbi
+deployment:
+  type: stateless
+  service: cluster
diff --git a/installers/charm/ui-k8s/reactive/spec_template.yaml b/installers/charm/ui-k8s/reactive/spec_template.yaml
new file mode 100644 (file)
index 0000000..2bc6f23
--- /dev/null
@@ -0,0 +1,42 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+version: 2
+service:
+  scalePolicy: serial
+containers:
+  - name: %(name)s
+    image: %(docker_image)s
+    ports:
+    - containerPort: %(advertised-port)s
+      protocol: TCP
+    config:
+      ALLOW_ANONYMOUS_LOGIN: 'yes'
+      OSM_SERVER: %(nbi_host)s
+      OSMUI_SQL_DATABASE_URI: mysql://root:%(mysql_root_password)s@%(mysql_host)s:%(mysql_port)s/%(mysql_database)s
+    kubernetes:
+      readinessProbe:
+        tcpSocket:
+          port: %(advertised-port)s
+        periodSeconds: 10
+        timeoutSeconds: 5
+        successThreshold: 1
+        failureThreshold: 3
+      livenessProbe:
+        tcpSocket:
+          port: %(advertised-port)s
+        initialDelaySeconds: 30
+        periodSeconds: 10
+        timeoutSeconds: 5
+        successThreshold: 1
+        failureThreshold: 3
\ No newline at end of file
diff --git a/installers/charm/ui-k8s/reactive/ui.py b/installers/charm/ui-k8s/reactive/ui.py
new file mode 100644 (file)
index 0000000..46e5709
--- /dev/null
@@ -0,0 +1,122 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+#
+from charms.layer.caas_base import pod_spec_set
+from charms.reactive import endpoint_from_flag
+from charms.reactive import when, when_not, hook
+from charms.reactive.flags import set_flag, clear_flag
+from charmhelpers.core.hookenv import (
+    log,
+    metadata,
+    config,
+)
+from charms import layer
+
+
+@hook("upgrade-charm")
+@when("leadership.is_leader")
+def upgrade():
+    clear_flag("ui-k8s.configured")
+
+
+@when("config.changed")
+@when("leadership.is_leader")
+def restart():
+    clear_flag("ui-k8s.configured")
+
+
+@when_not("mysql.available")
+@when_not("ui-k8s.configured")
+def waiting_for_mysql():
+    layer.status.waiting("Waiting for mysql to be available")
+
+
+@when_not("nbi.ready")
+@when_not("ui-k8s.configured")
+def waiting_for_nbi():
+    layer.status.waiting("Waiting for nbi to be available")
+
+
+@when("mysql.available", "nbi.ready")
+@when_not("ui-k8s.configured")
+@when("leadership.is_leader")
+def configure():
+
+    layer.status.maintenance("Configuring ui container")
+    try:
+        mysql = endpoint_from_flag("mysql.available")
+        nbi = endpoint_from_flag("nbi.ready")
+        nbi_unit = nbi.nbis()[0]
+        nbi_host = "{}".format(nbi_unit["host"])
+        spec = make_pod_spec(
+            mysql.host(),
+            mysql.port(),
+            mysql.user(),
+            mysql.password(),
+            mysql.root_password(),
+            nbi_host,
+        )
+        log("set pod spec:\n{}".format(spec))
+        pod_spec_set(spec)
+        set_flag("ui-k8s.configured")
+    except Exception as e:
+        layer.status.blocked("k8s spec failed to deploy: {}".format(e))
+
+
+@when("ui-k8s.configured")
+def set_ui_active():
+    layer.status.active("ready")
+
+
+def make_pod_spec(
+    mysql_host, mysql_port, mysql_user, mysql_password, mysql_root_password, nbi_host
+):
+    """Make pod specification for Kubernetes
+
+    Args:
+        mysql_name (str): UI DB name
+        mysql_host (str): UI DB host
+        mysql_port (int): UI DB port
+        mysql_user (str): UI DB user
+        mysql_password (str): UI DB password
+        nbi_uri (str): NBI URI
+    Returns:
+        pod_spec: Pod specification for Kubernetes
+    """
+
+    with open("reactive/spec_template.yaml") as spec_file:
+        pod_spec_template = spec_file.read()
+
+    md = metadata()
+    cfg = config()
+
+    data = {
+        "name": md.get("name"),
+        "docker_image": cfg.get("image"),
+        "mysql_host": mysql_host,
+        "mysql_port": mysql_port,
+        "mysql_user": mysql_user,
+        "mysql_password": mysql_password,
+        "mysql_root_password": mysql_root_password,
+        "nbi_host": nbi_host,
+    }
+    data.update(cfg)
+
+    return pod_spec_template % data
+
+
+def get_ui_port():
+    """Returns UI port"""
+    cfg = config()
+    return cfg.get("advertised-port")
diff --git a/installers/charm/ui-k8s/tox.ini b/installers/charm/ui-k8s/tox.ini
new file mode 100644 (file)
index 0000000..50375f3
--- /dev/null
@@ -0,0 +1,62 @@
+# Copyright 2020 Canonical Ltd.
+#
+# 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.
+[tox]
+envlist = pep8
+skipsdist = True
+
+[testenv]
+setenv = VIRTUAL_ENV={envdir}
+         PYTHONHASHSEED=0
+whitelist_externals = juju
+                      sleep
+passenv = HOME TERM CS_API_* OS_* AMULET_*
+install_command =
+  pip install {opts} {packages}
+
+[testenv:build]
+basepython = python3
+passenv=HTTP_PROXY HTTPS_PROXY NO_PROXY
+setenv = CHARM_LAYERS_DIR = ../layers
+         CHARM_INTERFACES_DIR = ../interfaces/
+whitelist_externals = git
+                      charm
+                      rm
+                      mv
+commands =
+    rm -rf release
+    rm -rf ../interfaces/juju-relation-mysql
+    rm -rf /tmp/canonical-osm
+    git clone https://git.launchpad.net/canonical-osm/ /tmp/canonical-osm
+    mv /tmp/canonical-osm/charms/interfaces/juju-relation-mysql ../interfaces/juju-relation-mysql
+    charm build . --build-dir /tmp
+    mv /tmp/ui-k8s/ release/
+
+[testenv:lint]
+basepython = python3
+deps =
+    black
+    yamllint
+    flake8
+commands =
+    black --check --diff . --exclude "release/|.tox/"
+    yamllint .
+    flake8 reactive/ --max-line-length=100
+
+[testenv:pep8]
+basepython = python3
+deps=charm-tools
+commands = charm-proof
+
+[testenv:venv]
+commands = {posargs}
diff --git a/installers/charmed_install.sh b/installers/charmed_install.sh
new file mode 100755 (executable)
index 0000000..b89855f
--- /dev/null
@@ -0,0 +1,285 @@
+#! /bin/bash
+#
+#   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.
+#
+
+# set -eux
+
+K8S_CLOUD_NAME="k8s-cloud"
+IMAGES_OVERLAY_FILE=~/.osm/images-overlay.yaml
+function check_arguments(){
+    while [ $# -gt 0 ] ; do
+        case $1 in
+            --bundle) BUNDLE="$2" ;;
+            --kubeconfig) KUBECFG="$2" ;;
+            --controller) CONTROLLER="$2" ;;
+            --lxd-cloud) LXD_CLOUD="$2" ;;
+            --lxd-credentials) LXD_CREDENTIALS="$2" ;;
+            --microstack) MICROSTACK=y ;;
+            --tag) TAG="$2" ;;
+        esac
+        shift
+    done
+
+    # echo $BUNDLE $KUBECONFIG $LXDENDPOINT
+}
+function install_snaps(){
+    sudo snap install juju --classic
+    [ ! -v KUBECFG ] && sudo snap install microk8s --classic && sudo usermod -a -G microk8s ubuntu && mkdir -p ~/.kube && sudo chown -f -R `whoami` ~/.kube
+}
+
+function bootstrap_k8s_lxd(){
+    [ -v CONTROLLER ] && ADD_K8S_OPTS="--controller ${CONTROLLER}" && CONTROLLER_NAME=$CONTROLLER
+    [ ! -v CONTROLLER ] && ADD_K8S_OPTS="--client" && BOOTSTRAP_NEEDED="yes" && CONTROLLER_NAME="controller"
+
+    if [ -v KUBECFG ]; then
+        cat $KUBECFG | juju add-k8s $K8S_CLOUD_NAME $ADD_K8S_OPTS
+        [ -v BOOTSTRAP_NEEDED ] && juju bootstrap $K8S_CLOUD_NAME $CONTROLLER_NAME
+    else
+        sg microk8s -c "microk8s.enable storage dns"
+
+        [ ! -v BOOTSTRAP_NEEDED ] && sg microk8s -c "microk8s.config" | juju add-k8s $K8S_CLOUD_NAME $ADD_K8S_OPTS
+        [ -v BOOTSTRAP_NEEDED ] && sg microk8s -c "juju bootstrap microk8s $CONTROLLER_NAME" && K8S_CLOUD_NAME=microk8s
+    fi
+
+    if [ -v LXD_CLOUD ]; then
+        if [ ! -v LXD_CREDENTIALS ]; then
+            echo "The installer needs the LXD server certificate if the LXD is external"
+            exit 1
+        fi
+    else
+        LXDENDPOINT=$DEFAULT_IP
+        LXD_CLOUD=~/.osm/lxd-cloud.yaml
+        LXD_CREDENTIALS=~/.osm/lxd-credentials.yaml
+        # Apply sysctl production values for optimal performance
+        sudo cp /usr/share/osm-devops/installers/60-lxd-production.conf /etc/sysctl.d/60-lxd-production.conf
+        sudo sysctl --system
+        # Install LXD snap
+        sudo apt-get remove --purge -y liblxc1 lxc-common lxcfs lxd lxd-client
+        sudo snap install lxd
+        sudo apt-get install zfsutils-linux -y
+        # Configure LXD
+        sudo usermod -a -G lxd `whoami`
+        cat /usr/share/osm-devops/installers/lxd-preseed.conf | sed 's/^config: {}/config:\n  core.https_address: '$LXDENDPOINT':8443/' | sg lxd -c "lxd init --preseed"
+        sg lxd -c "lxd waitready"
+        DEFAULT_MTU=$(ip addr show $DEFAULT_IF | perl -ne 'if (/mtu\s(\d+)/) {print $1;}')
+        sg lxd -c "lxc profile device set default eth0 mtu $DEFAULT_MTU"
+
+        cat << EOF > $LXD_CLOUD
+clouds:
+  lxd-cloud:
+    type: lxd
+    auth-types: [certificate]
+    endpoint: "https://$LXDENDPOINT:8443"
+    config:
+      ssl-hostname-verification: false
+EOF
+        openssl req -nodes -new -x509 -keyout ~/.osm/client.key -out ~/.osm/client.crt -days 365 -subj "/C=FR/ST=Nice/L=Nice/O=ETSI/OU=OSM/CN=osm.etsi.org"
+        local server_cert=`cat /var/snap/lxd/common/lxd/server.crt | sed 's/^/        /'`
+        local client_cert=`cat ~/.osm/client.crt | sed 's/^/        /'`
+        local client_key=`cat ~/.osm/client.key | sed 's/^/        /'`
+
+        cat << EOF > $LXD_CREDENTIALS
+credentials:
+  lxd-cloud:
+    lxd-cloud:
+      auth-type: certificate
+      server-cert: |
+$server_cert
+      client-cert: |
+$client_cert
+      client-key: |
+$client_key
+EOF
+        lxc config trust add local: ~/.osm/client.crt
+    fi
+
+    juju add-cloud -c $CONTROLLER_NAME lxd-cloud $LXD_CLOUD --force
+    juju add-credential -c $CONTROLLER_NAME lxd-cloud -f $LXD_CREDENTIALS
+    sg lxd -c "lxd waitready"
+    juju add-model test lxd-cloud || true
+}
+
+function deploy_charmed_osm(){
+    create_overlay
+    echo "Creating OSM model"
+    if [ -v KUBECFG ]; then
+        juju add-model osm $K8S_CLOUD_NAME
+    else
+        sg microk8s -c "juju add-model osm $K8S_CLOUD_NAME"
+    fi
+    echo "Deploying OSM with charms"
+    # echo $BUNDLE
+    if [ -v BUNDLE ]; then
+        juju deploy $BUNDLE --overlay ~/.osm/vca-overlay.yaml
+    else
+        images_overlay=""
+        [ -v TAG ] && generate_images_overlay && images_overlay="--overlay $IMAGES_OVERLAY_FILE"
+        juju deploy osm --overlay ~/.osm/vca-overlay.yaml $images_overlay
+    fi
+    echo "Waiting for deployment to finish..."
+    check_osm_deployed &> /dev/null
+    echo "OSM with charms deployed"
+    sg microk8s -c "microk8s.enable ingress"
+    juju config ui-k8s juju-external-hostname=osm.$DEFAULT_IP.xip.io
+    juju expose ui-k8s
+}
+
+function check_osm_deployed() {
+    while true
+    do
+        pod_name=`sg microk8s -c "microk8s.kubectl -n osm get pods | grep ui-k8s | grep -v operator" | awk '{print $1}'`
+        if [[ `sg microk8s -c "microk8s.kubectl -n osm wait pod $pod_name --for condition=Ready"` ]]; then
+            if [[ `sg microk8s -c "microk8s.kubectl -n osm wait pod lcm-k8s-0 --for condition=Ready"` ]]; then
+                break
+            fi
+        fi
+        sleep 10
+    done
+}
+
+function create_overlay() {
+    sudo snap install jq
+    sudo apt install python3-pip -y
+    python3 -m pip install yq
+    PATH=$PATH:$HOME/.local/bin  # make yq command available
+    local HOME=/home/$USER
+    local vca_user=$(cat $HOME/.local/share/juju/accounts.yaml | yq --arg CONTROLLER_NAME $CONTROLLER_NAME '.controllers[$CONTROLLER_NAME].user')
+    local vca_password=$(cat $HOME/.local/share/juju/accounts.yaml | yq --arg CONTROLLER_NAME $CONTROLLER_NAME '.controllers[$CONTROLLER_NAME].password')
+    local vca_host=$(cat $HOME/.local/share/juju/controllers.yaml | yq --arg CONTROLLER_NAME $CONTROLLER_NAME '.controllers[$CONTROLLER_NAME]["api-endpoints"][0]' | cut -d ":" -f 1 | cut -d "\"" -f 2)
+    local vca_port=$(cat $HOME/.local/share/juju/controllers.yaml | yq --arg CONTROLLER_NAME $CONTROLLER_NAME '.controllers[$CONTROLLER_NAME]["api-endpoints"][0]' | cut -d ":" -f 2 | cut -d "\"" -f 1)
+    local vca_pubkey=\"$(cat $HOME/.local/share/juju/ssh/juju_id_rsa.pub)\"
+    local vca_cloud="lxd-cloud"
+    # Get the VCA Certificate
+    local vca_cacert=$(cat $HOME/.local/share/juju/controllers.yaml | yq --arg CONTROLLER_NAME $CONTROLLER_NAME '.controllers[$CONTROLLER_NAME]["ca-cert"]' | base64 | tr -d \\n)
+
+    # Calculate the default route of this machine
+    local DEFAULT_IF=`route -n |awk '$1~/^0.0.0.0/ {print $8}'`
+    local vca_apiproxy=`ip -o -4 a |grep ${DEFAULT_IF}|awk '{split($4,a,"/"); print a[1]}'`
+
+    # Generate a new overlay.yaml, overriding any existing one
+    cat << EOF > /tmp/vca-overlay.yaml
+applications:
+  lcm-k8s:
+    options:
+      vca_user: $vca_user
+      vca_password: $vca_password
+      vca_host: $vca_host
+      vca_port: $vca_port
+      vca_pubkey: $vca_pubkey
+      vca_cacert: $vca_cacert
+      vca_apiproxy: $vca_apiproxy
+      vca_cloud: $vca_cloud
+  mon-k8s:
+    options:
+      vca_user: $vca_user
+      vca_password: $vca_password
+      vca_host: $vca_host
+      vca_cacert: $vca_cacert
+EOF
+    mv /tmp/vca-overlay.yaml ~/.osm/
+    OSM_VCA_HOST=$vca_host
+}
+
+function generate_images_overlay(){
+    cat << EOF > /tmp/images-overlay.yaml
+applications:
+  lcm-k8s:
+    options:
+      image: opensourcemano/lcm:$TAG
+  mon-k8s:
+    options:
+      image: opensourcemano/mon:$TAG
+  ro-k8s:
+    options:
+      image: opensourcemano/ro:$TAG
+  nbi-k8s:
+    options:
+      image: opensourcemano/nbi:$TAG
+  pol-k8s:
+    options:
+      image: opensourcemano/pol:$TAG
+  ui-k8s:
+    options:
+      image: opensourcemano/light-ui:$TAG
+
+EOF
+    mv /tmp/images-overlay.yaml $IMAGES_OVERLAY_FILE
+}
+
+function install_osmclient() {
+    sudo snap install osmclient
+    sudo snap alias osmclient.osm osm
+}
+
+function create_iptables() {
+    check_install_iptables_persistent
+
+    if ! sudo iptables -t nat -C PREROUTING -p tcp -m tcp -d $DEFAULT_IP --dport 17070 -j DNAT --to-destination $OSM_VCA_HOST; then
+        sudo iptables -t nat -A PREROUTING -p tcp -m tcp -d $DEFAULT_IP --dport 17070 -j DNAT --to-destination $OSM_VCA_HOST
+        sudo netfilter-persistent save
+    fi
+}
+
+function check_install_iptables_persistent(){
+    echo -e "\nChecking required packages: iptables-persistent"
+    if ! dpkg -l iptables-persistent &>/dev/null; then
+        echo -e "    Not installed.\nInstalling iptables-persistent requires root privileges"
+        echo iptables-persistent iptables-persistent/autosave_v4 boolean true | sudo debconf-set-selections
+        echo iptables-persistent iptables-persistent/autosave_v6 boolean true | sudo debconf-set-selections
+        sudo apt-get -yq install iptables-persistent
+    fi
+}
+
+function install_microstack() {
+    sudo snap install microstack --classic --beta
+    sudo microstack.init --auto
+    wget https://cloud-images.ubuntu.com/releases/16.04/release/ubuntu-16.04-server-cloudimg-amd64-disk1.img -P ~/.osm/
+    microstack.openstack image create \
+    --public \
+    --disk-format qcow2 \
+    --container-format bare \
+    --file ~/.osm/ubuntu-16.04-server-cloudimg-amd64-disk1.img \
+    ubuntu1604
+    ssh-keygen -t rsa -N "" -f ~/.ssh/microstack
+    microstack.openstack keypair create --public-key ~/.ssh/microstack.pub microstack
+    export OSM_HOSTNAME=`juju status --format yaml | yq r - applications.nbi-k8s.address`
+    osm vim-create --name microstack-site \
+    --user admin \
+    --password keystone \
+    --auth_url http://10.20.20.1:5000/v3 \
+    --tenant admin \
+    --account_type openstack \
+    --config='{security_groups: default,
+        keypair: microstack,
+        project_name: admin,
+        user_domain_name: default,
+        region_name: microstack,
+        insecure: True,
+        availability_zone: nova,
+    version: 3}'
+}
+
+DEFAULT_IF=`route -n |awk '$1~/^0.0.0.0/ {print $8}'`
+DEFAULT_IP=`ip -o -4 a |grep ${DEFAULT_IF}|awk '{split($4,a,"/"); print a[1]}'`
+
+check_arguments $@
+mkdir -p ~/.osm
+install_snaps
+bootstrap_k8s_lxd
+deploy_charmed_osm
+[ ! -v CONTROLLER ] && create_iptables
+install_osmclient
+if [ -v MICROSTACK ]; then
+    install_microstack
+fi
diff --git a/installers/charmed_uninstall.sh b/installers/charmed_uninstall.sh
new file mode 100755 (executable)
index 0000000..6cee999
--- /dev/null
@@ -0,0 +1,39 @@
+#! /bin/bash
+#
+#   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.
+#
+function remove_iptables() {
+    stack=$1
+    if [ -z "$OSM_VCA_HOST" ]; then
+        OSM_VCA_HOST=`sg lxd -c "juju show-controller controller"|grep api-endpoints|awk -F\' '{print $2}'|awk -F\: '{print $1}'`
+        [ -z "$OSM_VCA_HOST" ] && FATAL "Cannot obtain juju controller IP address"
+    fi
+
+    if [ -z "$DEFAULT_IP" ]; then
+        DEFAULT_IF=`route -n |awk '$1~/^0.0.0.0/ {print $8}'`
+        [ -z "$DEFAULT_IF" ] && FATAL "Not possible to determine the interface with the default route 0.0.0.0"
+        DEFAULT_IP=`ip -o -4 a |grep ${DEFAULT_IF}|awk '{split($4,a,"/"); print a[1]}'`
+        [ -z "$DEFAULT_IP" ] && FATAL "Not possible to determine the IP address of the interface with the default route"
+    fi
+
+    if sudo iptables -t nat -C PREROUTING -p tcp -m tcp -d $DEFAULT_IP --dport 17070 -j DNAT --to-destination $OSM_VCA_HOST; then
+        sudo iptables -t nat -D PREROUTING -p tcp -m tcp -d $DEFAULT_IP --dport 17070 -j DNAT --to-destination $OSM_VCA_HOST
+        sudo netfilter-persistent save
+    fi
+}
+
+remove_iptables
+juju destroy-model osm-on-k8s --destroy-storage
+juju destroy-model test --destroy-storage
+sudo snap unalias osm
+sudo snap remove osmclient
index 104de48..3fdfbc1 100644 (file)
@@ -88,8 +88,11 @@ services:
     ports:
       - "${OSM_PROM_PORTS:-9091:9090}"
     volumes:
-      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
+      - ./prometheus/:/etc/prometheus/
       - prom_db:/prometheus
+    command:
+      - '--config.file=/etc/prometheus/prometheus.yml'
+      - '--web.enable-lifecycle'
     networks:
       - netOSM
     logging:
diff --git a/installers/docker/files/dashboards-osm.yml b/installers/docker/files/dashboards-osm.yml
deleted file mode 100644 (file)
index 535dc10..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-##
-# Copyright 2019 ETSI
-#
-# 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.
-##
-
-########################################################################
-# # config file version
-apiVersion: 1
-
-providers:
- - name: 'osm'
-   orgId: 1
-   folder: ''
-   type: file
-   options:
-     path: /etc/grafana/provisioning/dashboards/
diff --git a/installers/docker/files/datasource-prometheus.yml b/installers/docker/files/datasource-prometheus.yml
deleted file mode 100644 (file)
index abc34ee..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-##
-# Copyright 2019 ETSI
-#
-# 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.
-##
-
-########################################################################
-datasources:
--  access: 'proxy'                       # make grafana perform the requests
-   editable: true                        # whether it should be editable
-   is_default: true                      # whether this should be the default DS
-   name: 'osm_prometheus'                         # name of the datasource
-   org_id: 1                             # id of the organization to tie this datasource to
-   type: 'prometheus'                    # type of the data source
-   url: 'http://prometheus:9090'         # url of the prom instance
-   version: 1                            # well, versioning
diff --git a/installers/docker/files/node_exporter.service b/installers/docker/files/node_exporter.service
deleted file mode 100644 (file)
index 407772b..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-##
-# Copyright 2019 ETSI
-#
-# 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.
-##
-
-########################################################################
-[Unit]
-Description=Node Exporter
-Wants=network-online.target
-After=network-online.target
-
-[Service]
-User=node_exporter
-Group=node_exporter
-Type=simple
-ExecStart=/usr/local/bin/node_exporter
-
-[Install]
-WantedBy=multi-user.target
\ No newline at end of file
diff --git a/installers/docker/files/osm-sample-dashboard.json b/installers/docker/files/osm-sample-dashboard.json
deleted file mode 100644 (file)
index 415a7cd..0000000
+++ /dev/null
@@ -1,401 +0,0 @@
-{
-  "annotations": {
-    "list": [
-      {
-        "builtIn": 1,
-        "datasource": "-- Grafana --",
-        "enable": true,
-        "hide": true,
-        "iconColor": "rgba(0, 211, 255, 1)",
-        "name": "Annotations & Alerts",
-        "type": "dashboard"
-      }
-    ]
-  },
-  "editable": true,
-  "gnetId": null,
-  "graphTooltip": 0,
-  "links": [],
-  "panels": [
-    {
-      "aliasColors": {},
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "osm_prometheus",
-      "fill": 1,
-      "gridPos": {
-        "h": 8,
-        "w": 12,
-        "x": 0,
-        "y": 0
-      },
-      "id": 2,
-      "legend": {
-        "avg": false,
-        "current": false,
-        "max": false,
-        "min": false,
-        "show": true,
-        "total": false,
-        "values": false
-      },
-      "lines": true,
-      "linewidth": 1,
-      "links": [],
-      "nullPointMode": "null",
-      "percentage": false,
-      "pointradius": 5,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "osm_cpu_utilization",
-          "format": "time_series",
-          "interval": "",
-          "intervalFactor": 1,
-          "legendFormat": "NS {{ns_id}} - VNF {{vnf_member_index}} - VDU {{vdu_name}}",
-          "refId": "A"
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeShift": null,
-      "title": "VDU CPU Metric (VIM)",
-      "tooltip": {
-        "shared": true,
-        "sort": 0,
-        "value_type": "individual"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    },
-    {
-      "aliasColors": {},
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "osm_prometheus",
-      "fill": 1,
-      "gridPos": {
-        "h": 8,
-        "w": 12,
-        "x": 12,
-        "y": 0
-      },
-      "id": 4,
-      "legend": {
-        "avg": false,
-        "current": false,
-        "max": false,
-        "min": false,
-        "show": true,
-        "total": false,
-        "values": false
-      },
-      "lines": true,
-      "linewidth": 1,
-      "links": [],
-      "nullPointMode": "null",
-      "percentage": false,
-      "pointradius": 5,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "osm_average_memory_utilization",
-          "format": "time_series",
-          "interval": "",
-          "intervalFactor": 1,
-          "legendFormat": "NS {{ns_id}} - VNF {{vnf_member_index}} - VDU {{vdu_name}}",
-          "refId": "A"
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeShift": null,
-      "title": "VDU Memory Metric (VIM)",
-      "tooltip": {
-        "shared": true,
-        "sort": 0,
-        "value_type": "individual"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    },
-    {
-      "aliasColors": {},
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "osm_prometheus",
-      "fill": 1,
-      "gridPos": {
-        "h": 8,
-        "w": 12,
-        "x": 0,
-        "y": 8
-      },
-      "id": 3,
-      "legend": {
-        "avg": false,
-        "current": false,
-        "max": false,
-        "min": false,
-        "show": true,
-        "total": false,
-        "values": false
-      },
-      "lines": true,
-      "linewidth": 1,
-      "links": [],
-      "nullPointMode": "null",
-      "percentage": false,
-      "pointradius": 5,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "osm_load",
-          "format": "time_series",
-          "interval": "",
-          "intervalFactor": 1,
-          "legendFormat": "NS {{ns_id}} - VNF {{vnf_member_index}} - VDU {{vdu_name}}",
-          "refId": "A"
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeShift": null,
-      "title": "VDU Load Metric (VCA)",
-      "tooltip": {
-        "shared": true,
-        "sort": 0,
-        "value_type": "individual"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    },
-    {
-      "aliasColors": {},
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "osm_prometheus",
-      "fill": 1,
-      "gridPos": {
-        "h": 8,
-        "w": 12,
-        "x": 12,
-        "y": 8
-      },
-      "id": 5,
-      "legend": {
-        "avg": false,
-        "current": false,
-        "max": false,
-        "min": false,
-        "show": true,
-        "total": false,
-        "values": false
-      },
-      "lines": true,
-      "linewidth": 1,
-      "links": [],
-      "nullPointMode": "null",
-      "percentage": false,
-      "pointradius": 5,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "osm_users",
-          "format": "time_series",
-          "interval": "",
-          "intervalFactor": 1,
-          "legendFormat": "NS {{ns_id}} - VNF {{vnf_member_index}}  - VDU {{vdu_name}}",
-          "refId": "A"
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeShift": null,
-      "title": "VNF Users Metric (VCA)",
-      "tooltip": {
-        "shared": true,
-        "sort": 0,
-        "value_type": "individual"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    }
-  ],
-  "refresh": "5s",
-  "schemaVersion": 16,
-  "style": "dark",
-  "tags": [],
-  "templating": {
-    "list": []
-  },
-  "time": {
-    "from": "now-1m",
-    "to": "now"
-  },
-  "timepicker": {
-    "refresh_intervals": [
-      "5s",
-      "10s",
-      "30s",
-      "1m",
-      "5m",
-      "15m",
-      "30m",
-      "1h",
-      "2h",
-      "1d"
-    ],
-    "time_options": [
-      "5m",
-      "15m",
-      "1h",
-      "6h",
-      "12h",
-      "24h",
-      "2d",
-      "7d",
-      "30d"
-    ]
-  },
-  "timezone": "",
-  "title": "OSM Sample Dashboard",
-  "uid": "x5vtPXmik",
-  "version": 1
-}
\ No newline at end of file
diff --git a/installers/docker/files/osm-system-dashboard.json b/installers/docker/files/osm-system-dashboard.json
deleted file mode 100644 (file)
index f50b9a4..0000000
+++ /dev/null
@@ -1,1870 +0,0 @@
-{
-  "annotations": {
-    "list": [
-      {
-        "builtIn": 1,
-        "datasource": "-- Grafana --",
-        "enable": true,
-        "hide": true,
-        "iconColor": "rgba(0, 211, 255, 1)",
-        "name": "Annotations & Alerts",
-        "type": "dashboard"
-      }
-    ]
-  },
-  "description": "",
-  "editable": true,
-  "gnetId": 8321,
-  "graphTooltip": 1,
-  "id": null,
-  "links": [],
-  "panels": [
-    {
-      "collapsed": false,
-      "datasource": null,
-      "gridPos": {
-        "h": 1,
-        "w": 24,
-        "x": 0,
-        "y": 0
-      },
-      "id": 32,
-      "panels": [],
-      "title": "Host Metrics",
-      "type": "row"
-    },
-    {
-      "cacheTimeout": null,
-      "colorBackground": false,
-      "colorValue": true,
-      "colors": [
-        "#d44a3a",
-        "rgba(237, 129, 40, 0.89)",
-        "#299c46"
-      ],
-      "datasource": "osm_prometheus",
-      "format": "none",
-      "gauge": {
-        "maxValue": 100,
-        "minValue": 0,
-        "show": false,
-        "thresholdLabels": false,
-        "thresholdMarkers": true
-      },
-      "gridPos": {
-        "h": 3,
-        "w": 2,
-        "x": 0,
-        "y": 1
-      },
-      "id": 13,
-      "interval": null,
-      "links": [],
-      "mappingType": 1,
-      "mappingTypes": [
-        {
-          "name": "value to text",
-          "value": 1
-        },
-        {
-          "name": "range to text",
-          "value": 2
-        }
-      ],
-      "maxDataPoints": 100,
-      "nullPointMode": "connected",
-      "nullText": null,
-      "options": {},
-      "postfix": "",
-      "postfixFontSize": "50%",
-      "prefix": "",
-      "prefixFontSize": "50%",
-      "rangeMaps": [
-        {
-          "from": "null",
-          "text": "N/A",
-          "to": "null"
-        }
-      ],
-      "sparkline": {
-        "fillColor": "rgba(31, 118, 189, 0.18)",
-        "full": false,
-        "lineColor": "rgb(31, 120, 193)",
-        "show": false,
-        "ymax": null,
-        "ymin": null
-      },
-      "tableColumn": "",
-      "targets": [
-        {
-          "expr": "sum(count(node_cpu_seconds_total{mode='system'}) by (cpu))",
-          "instant": true,
-          "refId": "A"
-        }
-      ],
-      "thresholds": "1,2",
-      "timeFrom": null,
-      "timeShift": null,
-      "title": "CPU Cores",
-      "type": "singlestat",
-      "valueFontSize": "80%",
-      "valueMaps": [
-        {
-          "op": "=",
-          "text": "N/A",
-          "value": "null"
-        }
-      ],
-      "valueName": "avg"
-    },
-    {
-      "cacheTimeout": null,
-      "colorBackground": false,
-      "colorValue": true,
-      "colors": [
-        "rgba(245, 54, 54, 0.9)",
-        "rgba(237, 129, 40, 0.89)",
-        "rgba(50, 172, 45, 0.97)"
-      ],
-      "datasource": "osm_prometheus",
-      "decimals": 2,
-      "description": "",
-      "format": "bytes",
-      "gauge": {
-        "maxValue": 100,
-        "minValue": 0,
-        "show": false,
-        "thresholdLabels": false,
-        "thresholdMarkers": true
-      },
-      "gridPos": {
-        "h": 3,
-        "w": 2,
-        "x": 2,
-        "y": 1
-      },
-      "id": 16,
-      "interval": null,
-      "links": [],
-      "mappingType": 1,
-      "mappingTypes": [
-        {
-          "name": "value to text",
-          "value": 1
-        },
-        {
-          "name": "range to text",
-          "value": 2
-        }
-      ],
-      "maxDataPoints": 100,
-      "maxPerRow": 6,
-      "nullPointMode": "null",
-      "nullText": null,
-      "options": {},
-      "postfix": "",
-      "postfixFontSize": "70%",
-      "prefix": "",
-      "prefixFontSize": "50%",
-      "rangeMaps": [
-        {
-          "from": "null",
-          "text": "N/A",
-          "to": "null"
-        }
-      ],
-      "sparkline": {
-        "fillColor": "rgba(31, 118, 189, 0.18)",
-        "full": false,
-        "lineColor": "rgb(31, 120, 193)",
-        "show": false
-      },
-      "tableColumn": "",
-      "targets": [
-        {
-          "expr": "sum(node_memory_MemTotal_bytes)",
-          "format": "time_series",
-          "instant": true,
-          "intervalFactor": 1,
-          "legendFormat": "{{instance}}",
-          "refId": "A",
-          "step": 20
-        }
-      ],
-      "thresholds": "2,3",
-      "title": "Total RAM",
-      "type": "singlestat",
-      "valueFontSize": "80%",
-      "valueMaps": [
-        {
-          "op": "=",
-          "text": "N/A",
-          "value": "null"
-        }
-      ],
-      "valueName": "current"
-    },
-    {
-      "datasource": "osm_prometheus",
-      "gridPos": {
-        "h": 6,
-        "w": 10,
-        "x": 4,
-        "y": 1
-      },
-      "id": 20,
-      "options": {
-        "displayMode": "lcd",
-        "fieldOptions": {
-          "calcs": [
-            "last"
-          ],
-          "defaults": {
-            "mappings": [],
-            "max": 100,
-            "min": 0,
-            "thresholds": [
-              {
-                "color": "green",
-                "value": null
-              },
-              {
-                "color": "#EAB839",
-                "value": 60
-              },
-              {
-                "color": "red",
-                "value": 80
-              }
-            ],
-            "title": "",
-            "unit": "percent"
-          },
-          "override": {},
-          "values": false
-        },
-        "orientation": "horizontal"
-      },
-      "pluginVersion": "6.4.4",
-      "targets": [
-        {
-          "expr": "100 - (avg(irate(node_cpu_seconds_total{mode=\"idle\"}[30m])) * 100)",
-          "instant": true,
-          "legendFormat": "CPU Busy",
-          "refId": "A"
-        },
-        {
-          "expr": "avg(irate(node_cpu_seconds_total{mode=\"iowait\"}[30m])) * 100",
-          "hide": true,
-          "instant": true,
-          "legendFormat": "Busy Iowait",
-          "refId": "C"
-        },
-        {
-          "expr": "(1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes)))* 100",
-          "instant": true,
-          "legendFormat": "Used RAM Memory",
-          "refId": "B"
-        },
-        {
-          "expr": "100 - ((node_filesystem_avail_bytes{mountpoint=\"$maxmount\",fstype=~\"ext4|xfs\"} * 100) / node_filesystem_size_bytes {mountpoint=\"$maxmount\",fstype=~\"ext4|xfs\"})",
-          "hide": false,
-          "instant": true,
-          "legendFormat": "Used Max Mount($maxmount)",
-          "refId": "D"
-        },
-        {
-          "expr": "(1 - (node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes)) * 100",
-          "instant": true,
-          "legendFormat": "Used SWAP",
-          "refId": "E"
-        }
-      ],
-      "timeFrom": null,
-      "timeShift": null,
-      "title": "",
-      "type": "bargauge"
-    },
-    {
-      "columns": [],
-      "datasource": "osm_prometheus",
-      "fontSize": "110%",
-      "gridPos": {
-        "h": 6,
-        "w": 10,
-        "x": 14,
-        "y": 1
-      },
-      "id": 22,
-      "links": [],
-      "options": {},
-      "pageSize": null,
-      "scroll": true,
-      "showHeader": true,
-      "sort": {
-        "col": 6,
-        "desc": false
-      },
-      "styles": [
-        {
-          "alias": "Mounted on",
-          "colorMode": null,
-          "colors": [
-            "rgba(50, 172, 45, 0.97)",
-            "rgba(237, 129, 40, 0.89)",
-            "rgba(245, 54, 54, 0.9)"
-          ],
-          "dateFormat": "YYYY-MM-DD HH:mm:ss",
-          "decimals": 2,
-          "mappingType": 1,
-          "pattern": "mountpoint",
-          "thresholds": [
-            ""
-          ],
-          "type": "string",
-          "unit": "bytes"
-        },
-        {
-          "alias": "Avail",
-          "colorMode": "value",
-          "colors": [
-            "rgba(245, 54, 54, 0.9)",
-            "rgba(237, 129, 40, 0.89)",
-            "rgba(50, 172, 45, 0.97)"
-          ],
-          "dateFormat": "YYYY-MM-DD HH:mm:ss",
-          "decimals": 2,
-          "mappingType": 1,
-          "pattern": "Value #A",
-          "thresholds": [
-            "10000000000",
-            "20000000000"
-          ],
-          "type": "number",
-          "unit": "bytes"
-        },
-        {
-          "alias": "Used",
-          "colorMode": "cell",
-          "colors": [
-            "rgba(50, 172, 45, 0.97)",
-            "rgba(237, 129, 40, 0.89)",
-            "rgba(245, 54, 54, 0.9)"
-          ],
-          "dateFormat": "YYYY-MM-DD HH:mm:ss",
-          "decimals": 2,
-          "mappingType": 1,
-          "pattern": "Value #B",
-          "thresholds": [
-            "0.6",
-            "0.8"
-          ],
-          "type": "number",
-          "unit": "percentunit"
-        },
-        {
-          "alias": "Size",
-          "colorMode": null,
-          "colors": [
-            "rgba(245, 54, 54, 0.9)",
-            "rgba(237, 129, 40, 0.89)",
-            "rgba(50, 172, 45, 0.97)"
-          ],
-          "dateFormat": "YYYY-MM-DD HH:mm:ss",
-          "decimals": 1,
-          "link": false,
-          "mappingType": 1,
-          "pattern": "Value #C",
-          "thresholds": [],
-          "type": "number",
-          "unit": "bytes"
-        },
-        {
-          "alias": "Filesystem",
-          "colorMode": null,
-          "colors": [
-            "rgba(245, 54, 54, 0.9)",
-            "rgba(237, 129, 40, 0.89)",
-            "rgba(50, 172, 45, 0.97)"
-          ],
-          "dateFormat": "YYYY-MM-DD HH:mm:ss",
-          "decimals": 2,
-          "link": false,
-          "mappingType": 1,
-          "pattern": "fstype",
-          "thresholds": [],
-          "type": "string",
-          "unit": "short"
-        },
-        {
-          "alias": "IP",
-          "colorMode": null,
-          "colors": [
-            "rgba(245, 54, 54, 0.9)",
-            "rgba(237, 129, 40, 0.89)",
-            "rgba(50, 172, 45, 0.97)"
-          ],
-          "dateFormat": "YYYY-MM-DD HH:mm:ss",
-          "decimals": 2,
-          "link": false,
-          "mappingType": 1,
-          "pattern": "instance",
-          "preserveFormat": false,
-          "sanitize": false,
-          "thresholds": [],
-          "type": "string",
-          "unit": "short"
-        },
-        {
-          "alias": "",
-          "colorMode": null,
-          "colors": [
-            "rgba(245, 54, 54, 0.9)",
-            "rgba(237, 129, 40, 0.89)",
-            "rgba(50, 172, 45, 0.97)"
-          ],
-          "decimals": 2,
-          "pattern": "/.*/",
-          "preserveFormat": true,
-          "sanitize": false,
-          "thresholds": [],
-          "type": "hidden",
-          "unit": "short"
-        }
-      ],
-      "targets": [
-        {
-          "expr": "node_filesystem_size_bytes{fstype=~\"ext4|xfs\"}-0",
-          "format": "table",
-          "hide": false,
-          "instant": true,
-          "intervalFactor": 1,
-          "legendFormat": "",
-          "refId": "C"
-        },
-        {
-          "expr": "node_filesystem_avail_bytes {fstype=~\"ext4|xfs\"}-0",
-          "format": "table",
-          "hide": false,
-          "instant": true,
-          "interval": "10s",
-          "intervalFactor": 1,
-          "legendFormat": "",
-          "refId": "A"
-        },
-        {
-          "expr": "1-(node_filesystem_free_bytes{fstype=~\"ext4|xfs\"} / node_filesystem_size_bytes{fstype=~\"ext4|xfs\"})",
-          "format": "table",
-          "hide": false,
-          "instant": true,
-          "intervalFactor": 1,
-          "legendFormat": "",
-          "refId": "B"
-        }
-      ],
-      "title": "Disk Space Used Basic(EXT4/XFS)",
-      "transform": "table",
-      "type": "table"
-    },
-    {
-      "cacheTimeout": null,
-      "colorBackground": false,
-      "colorPostfix": false,
-      "colorPrefix": false,
-      "colorValue": true,
-      "colors": [
-        "rgba(245, 54, 54, 0.9)",
-        "rgba(237, 129, 40, 0.89)",
-        "rgba(50, 172, 45, 0.97)"
-      ],
-      "datasource": "osm_prometheus",
-      "decimals": 1,
-      "description": "",
-      "format": "s",
-      "gauge": {
-        "maxValue": 100,
-        "minValue": 0,
-        "show": false,
-        "thresholdLabels": false,
-        "thresholdMarkers": true
-      },
-      "gridPos": {
-        "h": 3,
-        "w": 4,
-        "x": 0,
-        "y": 4
-      },
-      "hideTimeOverride": true,
-      "id": 18,
-      "interval": null,
-      "links": [],
-      "mappingType": 1,
-      "mappingTypes": [
-        {
-          "name": "value to text",
-          "value": 1
-        },
-        {
-          "name": "range to text",
-          "value": 2
-        }
-      ],
-      "maxDataPoints": 100,
-      "nullPointMode": "null",
-      "nullText": null,
-      "options": {},
-      "pluginVersion": "6.4.2",
-      "postfix": "",
-      "postfixFontSize": "50%",
-      "prefix": "",
-      "prefixFontSize": "50%",
-      "rangeMaps": [
-        {
-          "from": "null",
-          "text": "N/A",
-          "to": "null"
-        }
-      ],
-      "sparkline": {
-        "fillColor": "rgba(31, 118, 189, 0.18)",
-        "full": false,
-        "lineColor": "rgb(31, 120, 193)",
-        "show": false
-      },
-      "tableColumn": "",
-      "targets": [
-        {
-          "expr": "sum(time() - node_boot_time_seconds)",
-          "format": "time_series",
-          "hide": false,
-          "instant": true,
-          "intervalFactor": 1,
-          "refId": "A",
-          "step": 40
-        }
-      ],
-      "thresholds": "1,2",
-      "title": "System Uptime",
-      "type": "singlestat",
-      "valueFontSize": "100%",
-      "valueMaps": [
-        {
-          "op": "=",
-          "text": "N/A",
-          "value": "null"
-        }
-      ],
-      "valueName": "current"
-    },
-    {
-      "aliasColors": {
-        "192.168.200.241:9100_Total": "dark-red",
-        "Idle - Waiting for something to happen": "#052B51",
-        "guest": "#9AC48A",
-        "idle": "#052B51",
-        "iowait": "#EAB839",
-        "irq": "#BF1B00",
-        "nice": "#C15C17",
-        "sdb_每秒I/O操作%": "#d683ce",
-        "softirq": "#E24D42",
-        "steal": "#FCE2DE",
-        "system": "#508642",
-        "user": "#5195CE",
-        "磁盘花费在I/O操作占比": "#ba43a9"
-      },
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "osm_prometheus",
-      "decimals": 2,
-      "description": "",
-      "fill": 1,
-      "fillGradient": 0,
-      "gridPos": {
-        "h": 8,
-        "w": 8,
-        "x": 0,
-        "y": 7
-      },
-      "id": 24,
-      "legend": {
-        "alignAsTable": true,
-        "avg": true,
-        "current": true,
-        "hideEmpty": true,
-        "hideZero": true,
-        "max": true,
-        "min": false,
-        "rightSide": false,
-        "show": true,
-        "sideWidth": null,
-        "sort": "current",
-        "sortDesc": true,
-        "total": false,
-        "values": true
-      },
-      "lines": true,
-      "linewidth": 2,
-      "links": [],
-      "maxPerRow": 6,
-      "nullPointMode": "null",
-      "options": {
-        "dataLinks": []
-      },
-      "percentage": false,
-      "pointradius": 5,
-      "points": false,
-      "renderer": "flot",
-      "repeat": null,
-      "seriesOverrides": [
-        {
-          "alias": "/.*_Total/",
-          "color": "#C4162A",
-          "fill": 0
-        }
-      ],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "avg(irate(node_cpu_seconds_total{mode=\"system\"}[30m])) by (instance)",
-          "format": "time_series",
-          "hide": false,
-          "instant": false,
-          "interval": "",
-          "intervalFactor": 1,
-          "legendFormat": "{{instance}}_System",
-          "refId": "A",
-          "step": 20
-        },
-        {
-          "expr": "avg(irate(node_cpu_seconds_total{mode=\"user\"}[30m])) by (instance)",
-          "format": "time_series",
-          "hide": false,
-          "intervalFactor": 1,
-          "legendFormat": "{{instance}}_User",
-          "refId": "B",
-          "step": 240
-        },
-        {
-          "expr": "avg(irate(node_cpu_seconds_total{mode=\"iowait\"}[30m])) by (instance)",
-          "format": "time_series",
-          "hide": false,
-          "instant": false,
-          "intervalFactor": 1,
-          "legendFormat": "{{instance}}_Iowait",
-          "refId": "D",
-          "step": 240
-        },
-        {
-          "expr": "1 - avg(irate(node_cpu_seconds_total{mode=\"idle\"}[30m])) by (instance)",
-          "format": "time_series",
-          "hide": false,
-          "intervalFactor": 1,
-          "legendFormat": "{{instance}}_Total",
-          "refId": "F",
-          "step": 240
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeRegions": [],
-      "timeShift": null,
-      "title": "CPU Basic",
-      "tooltip": {
-        "shared": true,
-        "sort": 2,
-        "value_type": "individual"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "decimals": 2,
-          "format": "percentunit",
-          "label": "",
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": false
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    },
-    {
-      "aliasColors": {
-        "192.168.200.241:9100_总内存": "dark-red",
-        "内存_Avaliable": "#6ED0E0",
-        "内存_Cached": "#EF843C",
-        "内存_Free": "#629E51",
-        "内存_Total": "#6d1f62",
-        "内存_Used": "#eab839",
-        "可用": "#9ac48a",
-        "总内存": "#bf1b00"
-      },
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "osm_prometheus",
-      "decimals": 2,
-      "fill": 1,
-      "fillGradient": 0,
-      "gridPos": {
-        "h": 8,
-        "w": 8,
-        "x": 8,
-        "y": 7
-      },
-      "height": "300",
-      "id": 26,
-      "legend": {
-        "alignAsTable": true,
-        "avg": false,
-        "current": true,
-        "max": false,
-        "min": false,
-        "rightSide": false,
-        "show": true,
-        "sort": "current",
-        "sortDesc": true,
-        "total": false,
-        "values": true
-      },
-      "lines": true,
-      "linewidth": 2,
-      "links": [],
-      "nullPointMode": "null",
-      "options": {
-        "dataLinks": []
-      },
-      "percentage": false,
-      "pointradius": 5,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [
-        {
-          "alias": "/.*_Total/",
-          "color": "#C4162A",
-          "fill": 0
-        }
-      ],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "node_memory_MemTotal_bytes",
-          "format": "time_series",
-          "hide": false,
-          "instant": false,
-          "intervalFactor": 1,
-          "legendFormat": "{{instance}}_Total",
-          "refId": "A",
-          "step": 4
-        },
-        {
-          "expr": "node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes",
-          "format": "time_series",
-          "hide": false,
-          "intervalFactor": 1,
-          "legendFormat": "{{instance}}_Used",
-          "refId": "B",
-          "step": 4
-        },
-        {
-          "expr": "node_memory_MemAvailable_bytes",
-          "format": "time_series",
-          "hide": false,
-          "interval": "",
-          "intervalFactor": 1,
-          "legendFormat": "{{instance}}_Avaliable",
-          "refId": "F",
-          "step": 4
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeRegions": [],
-      "timeShift": null,
-      "title": "Memory Basic",
-      "tooltip": {
-        "shared": true,
-        "sort": 2,
-        "value_type": "individual"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "bytes",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": "0",
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    },
-    {
-      "aliasColors": {
-        "192.168.10.227:9100_em1_in下载": "super-light-green",
-        "192.168.10.227:9100_em1_out上传": "dark-blue"
-      },
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "osm_prometheus",
-      "fill": 1,
-      "fillGradient": 3,
-      "gridPos": {
-        "h": 8,
-        "w": 8,
-        "x": 16,
-        "y": 7
-      },
-      "height": "300",
-      "id": 28,
-      "legend": {
-        "alignAsTable": true,
-        "avg": false,
-        "current": true,
-        "hideEmpty": true,
-        "hideZero": true,
-        "max": true,
-        "min": false,
-        "rightSide": false,
-        "show": true,
-        "sort": "current",
-        "sortDesc": true,
-        "total": false,
-        "values": true
-      },
-      "lines": true,
-      "linewidth": 2,
-      "links": [],
-      "nullPointMode": "null",
-      "options": {
-        "dataLinks": []
-      },
-      "percentage": false,
-      "pointradius": 2,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [
-        {
-          "alias": "/.*_transmit$/",
-          "transform": "negative-Y"
-        }
-      ],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "irate(node_network_receive_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[30m])*8",
-          "format": "time_series",
-          "intervalFactor": 1,
-          "legendFormat": "{{instance}}_{{device}}_receive",
-          "refId": "A",
-          "step": 4
-        },
-        {
-          "expr": "irate(node_network_transmit_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[30m])*8",
-          "format": "time_series",
-          "intervalFactor": 1,
-          "legendFormat": "{{instance}}_{{device}}_transmit",
-          "refId": "B",
-          "step": 4
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeRegions": [],
-      "timeShift": null,
-      "title": "Network Traffic Basic",
-      "tooltip": {
-        "shared": true,
-        "sort": 2,
-        "value_type": "individual"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "bps",
-          "label": "transmit(-)/receive(+)",
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": false
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    },
-    {
-      "collapsed": false,
-      "datasource": null,
-      "gridPos": {
-        "h": 1,
-        "w": 24,
-        "x": 0,
-        "y": 15
-      },
-      "id": 30,
-      "panels": [],
-      "repeat": null,
-      "title": "Docker Metrics",
-      "type": "row"
-    },
-    {
-      "cacheTimeout": null,
-      "colorBackground": false,
-      "colorValue": true,
-      "colors": [
-        "rgba(245, 54, 54, 0.9)",
-        "rgba(237, 129, 40, 0.89)",
-        "rgba(50, 172, 45, 0.97)"
-      ],
-      "datasource": "osm_prometheus",
-      "decimals": null,
-      "editable": true,
-      "error": false,
-      "format": "none",
-      "gauge": {
-        "maxValue": 100,
-        "minValue": 0,
-        "show": false,
-        "thresholdLabels": false,
-        "thresholdMarkers": true
-      },
-      "gridPos": {
-        "h": 3,
-        "w": 8,
-        "x": 0,
-        "y": 16
-      },
-      "height": "20",
-      "id": 7,
-      "interval": null,
-      "isNew": true,
-      "links": [],
-      "mappingType": 2,
-      "mappingTypes": [
-        {
-          "name": "value to text",
-          "value": 1
-        },
-        {
-          "name": "range to text",
-          "value": 2
-        }
-      ],
-      "maxDataPoints": 100,
-      "nullPointMode": "connected",
-      "nullText": null,
-      "options": {},
-      "postfix": "",
-      "postfixFontSize": "50%",
-      "prefix": "",
-      "prefixFontSize": "50%",
-      "rangeMaps": [
-        {
-          "from": "1",
-          "text": "Failing",
-          "to": "13"
-        },
-        {
-          "from": "14",
-          "text": "OK",
-          "to": "20"
-        }
-      ],
-      "sparkline": {
-        "fillColor": "rgba(31, 118, 189, 0.18)",
-        "full": false,
-        "lineColor": "rgb(31, 120, 193)",
-        "show": false
-      },
-      "tableColumn": "",
-      "targets": [
-        {
-          "expr": "count(container_last_seen{container_label_com_docker_swarm_service_name=~\"osm.+\"})",
-          "instant": true,
-          "intervalFactor": 2,
-          "legendFormat": "",
-          "metric": "container_last_seen",
-          "refId": "A",
-          "step": 240
-        }
-      ],
-      "thresholds": "13.1,13.2,100",
-      "title": "OSM Containers Status",
-      "transparent": true,
-      "type": "singlestat",
-      "valueFontSize": "80%",
-      "valueMaps": [
-        {
-          "op": "=",
-          "text": "Failing",
-          "value": "*"
-        },
-        {
-          "op": "=",
-          "text": "OK",
-          "value": "14"
-        }
-      ],
-      "valueName": "avg"
-    },
-    {
-      "cacheTimeout": null,
-      "colorBackground": false,
-      "colorValue": false,
-      "colors": [
-        "rgba(245, 54, 54, 0.9)",
-        "rgba(237, 129, 40, 0.89)",
-        "rgba(50, 172, 45, 0.97)"
-      ],
-      "datasource": "osm_prometheus",
-      "editable": true,
-      "error": false,
-      "format": "mbytes",
-      "gauge": {
-        "maxValue": 100,
-        "minValue": 0,
-        "show": false,
-        "thresholdLabels": false,
-        "thresholdMarkers": true
-      },
-      "gridPos": {
-        "h": 3,
-        "w": 8,
-        "x": 8,
-        "y": 16
-      },
-      "height": "20",
-      "id": 5,
-      "interval": null,
-      "isNew": true,
-      "links": [],
-      "mappingType": 1,
-      "mappingTypes": [
-        {
-          "name": "value to text",
-          "value": 1
-        },
-        {
-          "name": "range to text",
-          "value": 2
-        }
-      ],
-      "maxDataPoints": 100,
-      "nullPointMode": "connected",
-      "nullText": null,
-      "options": {},
-      "postfix": "",
-      "postfixFontSize": "50%",
-      "prefix": "",
-      "prefixFontSize": "50%",
-      "rangeMaps": [
-        {
-          "from": "null",
-          "text": "N/A",
-          "to": "null"
-        }
-      ],
-      "sparkline": {
-        "fillColor": "rgba(31, 118, 189, 0.18)",
-        "full": false,
-        "lineColor": "rgb(31, 120, 193)",
-        "show": false
-      },
-      "tableColumn": "",
-      "targets": [
-        {
-          "expr": "sum(container_memory_usage_bytes{container_label_com_docker_swarm_service_name=~\"osm.+\"})/1024/1024",
-          "intervalFactor": 2,
-          "legendFormat": "",
-          "metric": "container_memory_usage_bytes",
-          "refId": "A",
-          "step": 240
-        }
-      ],
-      "thresholds": "",
-      "title": "Total Memory Usage",
-      "transparent": true,
-      "type": "singlestat",
-      "valueFontSize": "80%",
-      "valueMaps": [
-        {
-          "op": "=",
-          "text": "N/A",
-          "value": "null"
-        }
-      ],
-      "valueName": "current"
-    },
-    {
-      "cacheTimeout": null,
-      "colorBackground": false,
-      "colorValue": true,
-      "colors": [
-        "rgba(50, 172, 45, 0.97)",
-        "rgba(237, 129, 40, 0.89)",
-        "rgba(245, 54, 54, 0.9)"
-      ],
-      "datasource": "osm_prometheus",
-      "editable": true,
-      "error": false,
-      "format": "percent",
-      "gauge": {
-        "maxValue": 100,
-        "minValue": 0,
-        "show": false,
-        "thresholdLabels": false,
-        "thresholdMarkers": true
-      },
-      "gridPos": {
-        "h": 3,
-        "w": 8,
-        "x": 16,
-        "y": 16
-      },
-      "height": "20",
-      "id": 6,
-      "interval": null,
-      "isNew": true,
-      "links": [],
-      "mappingType": 1,
-      "mappingTypes": [
-        {
-          "name": "value to text",
-          "value": 1
-        },
-        {
-          "name": "range to text",
-          "value": 2
-        }
-      ],
-      "maxDataPoints": 100,
-      "nullPointMode": "connected",
-      "nullText": null,
-      "options": {},
-      "postfix": "",
-      "postfixFontSize": "50%",
-      "prefix": "",
-      "prefixFontSize": "50%",
-      "rangeMaps": [
-        {
-          "from": "null",
-          "text": "N/A",
-          "to": "null"
-        }
-      ],
-      "sparkline": {
-        "fillColor": "rgba(31, 118, 189, 0.18)",
-        "full": false,
-        "lineColor": "rgb(31, 120, 193)",
-        "show": false
-      },
-      "tableColumn": "",
-      "targets": [
-        {
-          "expr": "sum(rate(container_cpu_user_seconds_total{container_label_com_docker_swarm_service_name=~\"osm.+\"}[5m]) * 100)",
-          "intervalFactor": 2,
-          "legendFormat": "",
-          "metric": "container_memory_usage_bytes",
-          "refId": "A",
-          "step": 240
-        }
-      ],
-      "thresholds": "40,70,100",
-      "title": "Total CPU Usage",
-      "transparent": true,
-      "type": "singlestat",
-      "valueFontSize": "80%",
-      "valueMaps": [
-        {
-          "op": "=",
-          "text": "N/A",
-          "value": "null"
-        }
-      ],
-      "valueName": "current"
-    },
-    {
-      "aliasColors": {},
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "osm_prometheus",
-      "decimals": 2,
-      "editable": true,
-      "error": false,
-      "fill": 1,
-      "fillGradient": 0,
-      "grid": {},
-      "gridPos": {
-        "h": 7,
-        "w": 24,
-        "x": 0,
-        "y": 19
-      },
-      "id": 2,
-      "isNew": true,
-      "legend": {
-        "alignAsTable": true,
-        "avg": true,
-        "current": true,
-        "max": false,
-        "min": false,
-        "rightSide": true,
-        "show": true,
-        "sort": "current",
-        "sortDesc": true,
-        "total": false,
-        "values": true
-      },
-      "lines": true,
-      "linewidth": 2,
-      "links": [],
-      "nullPointMode": "connected",
-      "options": {
-        "dataLinks": []
-      },
-      "percentage": false,
-      "pointradius": 5,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "rate(container_cpu_user_seconds_total{container_label_com_docker_swarm_service_name=~\"osm.+\"}[5m]) * 100",
-          "intervalFactor": 2,
-          "legendFormat": "{{name}}",
-          "metric": "cpu",
-          "refId": "A",
-          "step": 10
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeRegions": [],
-      "timeShift": null,
-      "title": "CPU Usage (5m)",
-      "tooltip": {
-        "msResolution": false,
-        "shared": true,
-        "sort": 0,
-        "value_type": "cumulative"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "percent",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    },
-    {
-      "aliasColors": {},
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "osm_prometheus",
-      "decimals": 2,
-      "editable": true,
-      "error": false,
-      "fill": 1,
-      "fillGradient": 0,
-      "grid": {},
-      "gridPos": {
-        "h": 7,
-        "w": 24,
-        "x": 0,
-        "y": 26
-      },
-      "id": 1,
-      "isNew": true,
-      "legend": {
-        "alignAsTable": true,
-        "avg": true,
-        "current": true,
-        "max": false,
-        "min": false,
-        "rightSide": true,
-        "show": true,
-        "sort": "current",
-        "sortDesc": true,
-        "total": false,
-        "values": true
-      },
-      "lines": true,
-      "linewidth": 2,
-      "links": [],
-      "nullPointMode": "connected",
-      "options": {
-        "dataLinks": []
-      },
-      "percentage": false,
-      "pointradius": 5,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "container_memory_usage_bytes{container_label_com_docker_swarm_service_name=~\"osm.+\"}",
-          "hide": false,
-          "intervalFactor": 2,
-          "legendFormat": "{{name}}",
-          "metric": "container_memory_usage_bytes",
-          "refId": "A",
-          "step": 10
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeRegions": [],
-      "timeShift": null,
-      "title": "Memory Usage",
-      "tooltip": {
-        "msResolution": false,
-        "shared": true,
-        "sort": 0,
-        "value_type": "cumulative"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "bytes",
-          "label": "",
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": false
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    },
-    {
-      "aliasColors": {},
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "osm_prometheus",
-      "editable": true,
-      "error": false,
-      "fill": 1,
-      "fillGradient": 0,
-      "grid": {},
-      "gridPos": {
-        "h": 7,
-        "w": 12,
-        "x": 0,
-        "y": 33
-      },
-      "id": 3,
-      "isNew": true,
-      "legend": {
-        "avg": false,
-        "current": false,
-        "max": false,
-        "min": false,
-        "show": true,
-        "total": false,
-        "values": false
-      },
-      "lines": true,
-      "linewidth": 2,
-      "links": [],
-      "nullPointMode": "connected",
-      "options": {
-        "dataLinks": []
-      },
-      "percentage": false,
-      "pointradius": 5,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "irate(container_network_receive_bytes_total{container_label_com_docker_swarm_service_name=~\"osm.+\"}[5m])",
-          "instant": false,
-          "intervalFactor": 2,
-          "legendFormat": "{{name}}",
-          "metric": "container_network_receive_bytes_total",
-          "refId": "A",
-          "step": 20
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeRegions": [],
-      "timeShift": null,
-      "title": "Network Rx",
-      "tooltip": {
-        "msResolution": false,
-        "shared": true,
-        "sort": 0,
-        "value_type": "cumulative"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "Bps",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    },
-    {
-      "aliasColors": {},
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "osm_prometheus",
-      "editable": true,
-      "error": false,
-      "fill": 1,
-      "fillGradient": 0,
-      "grid": {},
-      "gridPos": {
-        "h": 7,
-        "w": 12,
-        "x": 12,
-        "y": 33
-      },
-      "id": 4,
-      "isNew": true,
-      "legend": {
-        "avg": false,
-        "current": false,
-        "max": false,
-        "min": false,
-        "show": true,
-        "total": false,
-        "values": false
-      },
-      "lines": true,
-      "linewidth": 2,
-      "links": [],
-      "nullPointMode": "connected",
-      "options": {
-        "dataLinks": []
-      },
-      "percentage": false,
-      "pointradius": 5,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "irate(container_network_transmit_bytes_total{container_label_com_docker_swarm_service_name=~\"osm.+\"}[5m])",
-          "intervalFactor": 2,
-          "legendFormat": "{{name}}",
-          "refId": "A",
-          "step": 20
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeRegions": [],
-      "timeShift": null,
-      "title": "Network Tx",
-      "tooltip": {
-        "msResolution": false,
-        "shared": true,
-        "sort": 0,
-        "value_type": "cumulative"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "Bps",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    },
-    {
-      "aliasColors": {},
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "osm_prometheus",
-      "editable": true,
-      "error": false,
-      "fill": 1,
-      "fillGradient": 0,
-      "grid": {},
-      "gridPos": {
-        "h": 7,
-        "w": 12,
-        "x": 0,
-        "y": 40
-      },
-      "id": 8,
-      "isNew": true,
-      "legend": {
-        "avg": false,
-        "current": false,
-        "max": false,
-        "min": false,
-        "show": true,
-        "total": false,
-        "values": false
-      },
-      "lines": true,
-      "linewidth": 2,
-      "links": [],
-      "nullPointMode": "connected",
-      "options": {
-        "dataLinks": []
-      },
-      "percentage": false,
-      "pointradius": 5,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "irate(container_fs_reads_bytes_total{container_label_com_docker_swarm_service_name=~\"osm.+\"}[5m])",
-          "intervalFactor": 2,
-          "legendFormat": "{{name}}",
-          "metric": "container_fs_reads_bytes_total",
-          "refId": "A",
-          "step": 20
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeRegions": [],
-      "timeShift": null,
-      "title": "I/O Rx",
-      "tooltip": {
-        "msResolution": false,
-        "shared": true,
-        "sort": 0,
-        "value_type": "cumulative"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "Bps",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    },
-    {
-      "aliasColors": {},
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "osm_prometheus",
-      "editable": true,
-      "error": false,
-      "fill": 1,
-      "fillGradient": 0,
-      "grid": {},
-      "gridPos": {
-        "h": 7,
-        "w": 12,
-        "x": 12,
-        "y": 40
-      },
-      "id": 9,
-      "isNew": true,
-      "legend": {
-        "avg": false,
-        "current": false,
-        "max": false,
-        "min": false,
-        "show": true,
-        "total": false,
-        "values": false
-      },
-      "lines": true,
-      "linewidth": 2,
-      "links": [],
-      "nullPointMode": "connected",
-      "options": {
-        "dataLinks": []
-      },
-      "percentage": false,
-      "pointradius": 5,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "irate(container_fs_writes_bytes_total{container_label_com_docker_swarm_service_name=~\"osm.+\"}[5m])",
-          "intervalFactor": 2,
-          "legendFormat": "{{name}}",
-          "metric": "container_fs_writes_bytes_total",
-          "refId": "A",
-          "step": 20
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeRegions": [],
-      "timeShift": null,
-      "title": "I/O Tx",
-      "tooltip": {
-        "msResolution": false,
-        "shared": true,
-        "sort": 0,
-        "value_type": "cumulative"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "Bps",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    }
-  ],
-  "refresh": "10s",
-  "schemaVersion": 20,
-  "style": "dark",
-  "tags": [],
-  "templating": {
-    "list": []
-  },
-  "time": {
-    "from": "now-5m",
-    "to": "now"
-  },
-  "timepicker": {
-    "refresh_intervals": [
-      "5s",
-      "10s",
-      "30s",
-      "1m",
-      "5m",
-      "15m",
-      "30m",
-      "1h",
-      "2h",
-      "1d"
-    ],
-    "time_options": [
-      "5m",
-      "15m",
-      "1h",
-      "6h",
-      "12h",
-      "24h",
-      "2d",
-      "7d",
-      "30d"
-    ]
-  },
-  "timezone": "browser",
-  "title": "OSM System Metrics",
-  "uid": null,
-  "version": 1
-}
\ No newline at end of file
diff --git a/installers/docker/files/prometheus.yml b/installers/docker/files/prometheus.yml
deleted file mode 100644 (file)
index a36a241..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2018 The Prometheus Authors
-# Copyright 2018 Whitestack
-# Copyright 2018 Telefonica Investigacion y Desarrollo, S.A.U.
-#
-# 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.
-
-# my global config
-global:
-  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
-  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
-  # scrape_timeout is set to the global default (10s).
-
-# Alertmanager configuration
-alerting:
-  alertmanagers:
-  - static_configs:
-    - targets:
-      # - alertmanager:9093
-
-# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
-rule_files:
-  # - "first_rules.yml"
-  # - "second_rules.yml"
-
-# A scrape configuration containing exactly one endpoint to scrape:
-# Here it's Prometheus itself.
-scrape_configs:
-  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
-  - job_name: 'prometheus'
-    static_configs:
-    - targets: ['mon:8000']
-  - job_name: 'node_exporter'
-    static_configs:
-      - targets: ['172.18.0.1:9100']
-  - job_name: 'cadvisor'
-    static_configs:
-      - targets: ['prometheus-cadvisor:8080']
\ No newline at end of file
diff --git a/installers/docker/grafana/dashboards-osm.yml b/installers/docker/grafana/dashboards-osm.yml
new file mode 100644 (file)
index 0000000..535dc10
--- /dev/null
@@ -0,0 +1,27 @@
+##
+# Copyright 2019 ETSI
+#
+# 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.
+##
+
+########################################################################
+# # config file version
+apiVersion: 1
+
+providers:
+ - name: 'osm'
+   orgId: 1
+   folder: ''
+   type: file
+   options:
+     path: /etc/grafana/provisioning/dashboards/
diff --git a/installers/docker/grafana/datasource-prometheus.yml b/installers/docker/grafana/datasource-prometheus.yml
new file mode 100644 (file)
index 0000000..abc34ee
--- /dev/null
@@ -0,0 +1,26 @@
+##
+# Copyright 2019 ETSI
+#
+# 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.
+##
+
+########################################################################
+datasources:
+-  access: 'proxy'                       # make grafana perform the requests
+   editable: true                        # whether it should be editable
+   is_default: true                      # whether this should be the default DS
+   name: 'osm_prometheus'                         # name of the datasource
+   org_id: 1                             # id of the organization to tie this datasource to
+   type: 'prometheus'                    # type of the data source
+   url: 'http://prometheus:9090'         # url of the prom instance
+   version: 1                            # well, versioning
diff --git a/installers/docker/grafana/osm-sample-dashboard.json b/installers/docker/grafana/osm-sample-dashboard.json
new file mode 100644 (file)
index 0000000..415a7cd
--- /dev/null
@@ -0,0 +1,401 @@
+{
+  "annotations": {
+    "list": [
+      {
+        "builtIn": 1,
+        "datasource": "-- Grafana --",
+        "enable": true,
+        "hide": true,
+        "iconColor": "rgba(0, 211, 255, 1)",
+        "name": "Annotations & Alerts",
+        "type": "dashboard"
+      }
+    ]
+  },
+  "editable": true,
+  "gnetId": null,
+  "graphTooltip": 0,
+  "links": [],
+  "panels": [
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "osm_prometheus",
+      "fill": 1,
+      "gridPos": {
+        "h": 8,
+        "w": 12,
+        "x": 0,
+        "y": 0
+      },
+      "id": 2,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "osm_cpu_utilization",
+          "format": "time_series",
+          "interval": "",
+          "intervalFactor": 1,
+          "legendFormat": "NS {{ns_id}} - VNF {{vnf_member_index}} - VDU {{vdu_name}}",
+          "refId": "A"
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeShift": null,
+      "title": "VDU CPU Metric (VIM)",
+      "tooltip": {
+        "shared": true,
+        "sort": 0,
+        "value_type": "individual"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "osm_prometheus",
+      "fill": 1,
+      "gridPos": {
+        "h": 8,
+        "w": 12,
+        "x": 12,
+        "y": 0
+      },
+      "id": 4,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "osm_average_memory_utilization",
+          "format": "time_series",
+          "interval": "",
+          "intervalFactor": 1,
+          "legendFormat": "NS {{ns_id}} - VNF {{vnf_member_index}} - VDU {{vdu_name}}",
+          "refId": "A"
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeShift": null,
+      "title": "VDU Memory Metric (VIM)",
+      "tooltip": {
+        "shared": true,
+        "sort": 0,
+        "value_type": "individual"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "osm_prometheus",
+      "fill": 1,
+      "gridPos": {
+        "h": 8,
+        "w": 12,
+        "x": 0,
+        "y": 8
+      },
+      "id": 3,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "osm_load",
+          "format": "time_series",
+          "interval": "",
+          "intervalFactor": 1,
+          "legendFormat": "NS {{ns_id}} - VNF {{vnf_member_index}} - VDU {{vdu_name}}",
+          "refId": "A"
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeShift": null,
+      "title": "VDU Load Metric (VCA)",
+      "tooltip": {
+        "shared": true,
+        "sort": 0,
+        "value_type": "individual"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "osm_prometheus",
+      "fill": 1,
+      "gridPos": {
+        "h": 8,
+        "w": 12,
+        "x": 12,
+        "y": 8
+      },
+      "id": 5,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 1,
+      "links": [],
+      "nullPointMode": "null",
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "osm_users",
+          "format": "time_series",
+          "interval": "",
+          "intervalFactor": 1,
+          "legendFormat": "NS {{ns_id}} - VNF {{vnf_member_index}}  - VDU {{vdu_name}}",
+          "refId": "A"
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeShift": null,
+      "title": "VNF Users Metric (VCA)",
+      "tooltip": {
+        "shared": true,
+        "sort": 0,
+        "value_type": "individual"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    }
+  ],
+  "refresh": "5s",
+  "schemaVersion": 16,
+  "style": "dark",
+  "tags": [],
+  "templating": {
+    "list": []
+  },
+  "time": {
+    "from": "now-1m",
+    "to": "now"
+  },
+  "timepicker": {
+    "refresh_intervals": [
+      "5s",
+      "10s",
+      "30s",
+      "1m",
+      "5m",
+      "15m",
+      "30m",
+      "1h",
+      "2h",
+      "1d"
+    ],
+    "time_options": [
+      "5m",
+      "15m",
+      "1h",
+      "6h",
+      "12h",
+      "24h",
+      "2d",
+      "7d",
+      "30d"
+    ]
+  },
+  "timezone": "",
+  "title": "OSM Sample Dashboard",
+  "uid": "x5vtPXmik",
+  "version": 1
+}
\ No newline at end of file
diff --git a/installers/docker/grafana/osm-system-dashboard.json b/installers/docker/grafana/osm-system-dashboard.json
new file mode 100644 (file)
index 0000000..f50b9a4
--- /dev/null
@@ -0,0 +1,1870 @@
+{
+  "annotations": {
+    "list": [
+      {
+        "builtIn": 1,
+        "datasource": "-- Grafana --",
+        "enable": true,
+        "hide": true,
+        "iconColor": "rgba(0, 211, 255, 1)",
+        "name": "Annotations & Alerts",
+        "type": "dashboard"
+      }
+    ]
+  },
+  "description": "",
+  "editable": true,
+  "gnetId": 8321,
+  "graphTooltip": 1,
+  "id": null,
+  "links": [],
+  "panels": [
+    {
+      "collapsed": false,
+      "datasource": null,
+      "gridPos": {
+        "h": 1,
+        "w": 24,
+        "x": 0,
+        "y": 0
+      },
+      "id": 32,
+      "panels": [],
+      "title": "Host Metrics",
+      "type": "row"
+    },
+    {
+      "cacheTimeout": null,
+      "colorBackground": false,
+      "colorValue": true,
+      "colors": [
+        "#d44a3a",
+        "rgba(237, 129, 40, 0.89)",
+        "#299c46"
+      ],
+      "datasource": "osm_prometheus",
+      "format": "none",
+      "gauge": {
+        "maxValue": 100,
+        "minValue": 0,
+        "show": false,
+        "thresholdLabels": false,
+        "thresholdMarkers": true
+      },
+      "gridPos": {
+        "h": 3,
+        "w": 2,
+        "x": 0,
+        "y": 1
+      },
+      "id": 13,
+      "interval": null,
+      "links": [],
+      "mappingType": 1,
+      "mappingTypes": [
+        {
+          "name": "value to text",
+          "value": 1
+        },
+        {
+          "name": "range to text",
+          "value": 2
+        }
+      ],
+      "maxDataPoints": 100,
+      "nullPointMode": "connected",
+      "nullText": null,
+      "options": {},
+      "postfix": "",
+      "postfixFontSize": "50%",
+      "prefix": "",
+      "prefixFontSize": "50%",
+      "rangeMaps": [
+        {
+          "from": "null",
+          "text": "N/A",
+          "to": "null"
+        }
+      ],
+      "sparkline": {
+        "fillColor": "rgba(31, 118, 189, 0.18)",
+        "full": false,
+        "lineColor": "rgb(31, 120, 193)",
+        "show": false,
+        "ymax": null,
+        "ymin": null
+      },
+      "tableColumn": "",
+      "targets": [
+        {
+          "expr": "sum(count(node_cpu_seconds_total{mode='system'}) by (cpu))",
+          "instant": true,
+          "refId": "A"
+        }
+      ],
+      "thresholds": "1,2",
+      "timeFrom": null,
+      "timeShift": null,
+      "title": "CPU Cores",
+      "type": "singlestat",
+      "valueFontSize": "80%",
+      "valueMaps": [
+        {
+          "op": "=",
+          "text": "N/A",
+          "value": "null"
+        }
+      ],
+      "valueName": "avg"
+    },
+    {
+      "cacheTimeout": null,
+      "colorBackground": false,
+      "colorValue": true,
+      "colors": [
+        "rgba(245, 54, 54, 0.9)",
+        "rgba(237, 129, 40, 0.89)",
+        "rgba(50, 172, 45, 0.97)"
+      ],
+      "datasource": "osm_prometheus",
+      "decimals": 2,
+      "description": "",
+      "format": "bytes",
+      "gauge": {
+        "maxValue": 100,
+        "minValue": 0,
+        "show": false,
+        "thresholdLabels": false,
+        "thresholdMarkers": true
+      },
+      "gridPos": {
+        "h": 3,
+        "w": 2,
+        "x": 2,
+        "y": 1
+      },
+      "id": 16,
+      "interval": null,
+      "links": [],
+      "mappingType": 1,
+      "mappingTypes": [
+        {
+          "name": "value to text",
+          "value": 1
+        },
+        {
+          "name": "range to text",
+          "value": 2
+        }
+      ],
+      "maxDataPoints": 100,
+      "maxPerRow": 6,
+      "nullPointMode": "null",
+      "nullText": null,
+      "options": {},
+      "postfix": "",
+      "postfixFontSize": "70%",
+      "prefix": "",
+      "prefixFontSize": "50%",
+      "rangeMaps": [
+        {
+          "from": "null",
+          "text": "N/A",
+          "to": "null"
+        }
+      ],
+      "sparkline": {
+        "fillColor": "rgba(31, 118, 189, 0.18)",
+        "full": false,
+        "lineColor": "rgb(31, 120, 193)",
+        "show": false
+      },
+      "tableColumn": "",
+      "targets": [
+        {
+          "expr": "sum(node_memory_MemTotal_bytes)",
+          "format": "time_series",
+          "instant": true,
+          "intervalFactor": 1,
+          "legendFormat": "{{instance}}",
+          "refId": "A",
+          "step": 20
+        }
+      ],
+      "thresholds": "2,3",
+      "title": "Total RAM",
+      "type": "singlestat",
+      "valueFontSize": "80%",
+      "valueMaps": [
+        {
+          "op": "=",
+          "text": "N/A",
+          "value": "null"
+        }
+      ],
+      "valueName": "current"
+    },
+    {
+      "datasource": "osm_prometheus",
+      "gridPos": {
+        "h": 6,
+        "w": 10,
+        "x": 4,
+        "y": 1
+      },
+      "id": 20,
+      "options": {
+        "displayMode": "lcd",
+        "fieldOptions": {
+          "calcs": [
+            "last"
+          ],
+          "defaults": {
+            "mappings": [],
+            "max": 100,
+            "min": 0,
+            "thresholds": [
+              {
+                "color": "green",
+                "value": null
+              },
+              {
+                "color": "#EAB839",
+                "value": 60
+              },
+              {
+                "color": "red",
+                "value": 80
+              }
+            ],
+            "title": "",
+            "unit": "percent"
+          },
+          "override": {},
+          "values": false
+        },
+        "orientation": "horizontal"
+      },
+      "pluginVersion": "6.4.4",
+      "targets": [
+        {
+          "expr": "100 - (avg(irate(node_cpu_seconds_total{mode=\"idle\"}[30m])) * 100)",
+          "instant": true,
+          "legendFormat": "CPU Busy",
+          "refId": "A"
+        },
+        {
+          "expr": "avg(irate(node_cpu_seconds_total{mode=\"iowait\"}[30m])) * 100",
+          "hide": true,
+          "instant": true,
+          "legendFormat": "Busy Iowait",
+          "refId": "C"
+        },
+        {
+          "expr": "(1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes)))* 100",
+          "instant": true,
+          "legendFormat": "Used RAM Memory",
+          "refId": "B"
+        },
+        {
+          "expr": "100 - ((node_filesystem_avail_bytes{mountpoint=\"$maxmount\",fstype=~\"ext4|xfs\"} * 100) / node_filesystem_size_bytes {mountpoint=\"$maxmount\",fstype=~\"ext4|xfs\"})",
+          "hide": false,
+          "instant": true,
+          "legendFormat": "Used Max Mount($maxmount)",
+          "refId": "D"
+        },
+        {
+          "expr": "(1 - (node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes)) * 100",
+          "instant": true,
+          "legendFormat": "Used SWAP",
+          "refId": "E"
+        }
+      ],
+      "timeFrom": null,
+      "timeShift": null,
+      "title": "",
+      "type": "bargauge"
+    },
+    {
+      "columns": [],
+      "datasource": "osm_prometheus",
+      "fontSize": "110%",
+      "gridPos": {
+        "h": 6,
+        "w": 10,
+        "x": 14,
+        "y": 1
+      },
+      "id": 22,
+      "links": [],
+      "options": {},
+      "pageSize": null,
+      "scroll": true,
+      "showHeader": true,
+      "sort": {
+        "col": 6,
+        "desc": false
+      },
+      "styles": [
+        {
+          "alias": "Mounted on",
+          "colorMode": null,
+          "colors": [
+            "rgba(50, 172, 45, 0.97)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(245, 54, 54, 0.9)"
+          ],
+          "dateFormat": "YYYY-MM-DD HH:mm:ss",
+          "decimals": 2,
+          "mappingType": 1,
+          "pattern": "mountpoint",
+          "thresholds": [
+            ""
+          ],
+          "type": "string",
+          "unit": "bytes"
+        },
+        {
+          "alias": "Avail",
+          "colorMode": "value",
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "dateFormat": "YYYY-MM-DD HH:mm:ss",
+          "decimals": 2,
+          "mappingType": 1,
+          "pattern": "Value #A",
+          "thresholds": [
+            "10000000000",
+            "20000000000"
+          ],
+          "type": "number",
+          "unit": "bytes"
+        },
+        {
+          "alias": "Used",
+          "colorMode": "cell",
+          "colors": [
+            "rgba(50, 172, 45, 0.97)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(245, 54, 54, 0.9)"
+          ],
+          "dateFormat": "YYYY-MM-DD HH:mm:ss",
+          "decimals": 2,
+          "mappingType": 1,
+          "pattern": "Value #B",
+          "thresholds": [
+            "0.6",
+            "0.8"
+          ],
+          "type": "number",
+          "unit": "percentunit"
+        },
+        {
+          "alias": "Size",
+          "colorMode": null,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "dateFormat": "YYYY-MM-DD HH:mm:ss",
+          "decimals": 1,
+          "link": false,
+          "mappingType": 1,
+          "pattern": "Value #C",
+          "thresholds": [],
+          "type": "number",
+          "unit": "bytes"
+        },
+        {
+          "alias": "Filesystem",
+          "colorMode": null,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "dateFormat": "YYYY-MM-DD HH:mm:ss",
+          "decimals": 2,
+          "link": false,
+          "mappingType": 1,
+          "pattern": "fstype",
+          "thresholds": [],
+          "type": "string",
+          "unit": "short"
+        },
+        {
+          "alias": "IP",
+          "colorMode": null,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "dateFormat": "YYYY-MM-DD HH:mm:ss",
+          "decimals": 2,
+          "link": false,
+          "mappingType": 1,
+          "pattern": "instance",
+          "preserveFormat": false,
+          "sanitize": false,
+          "thresholds": [],
+          "type": "string",
+          "unit": "short"
+        },
+        {
+          "alias": "",
+          "colorMode": null,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "decimals": 2,
+          "pattern": "/.*/",
+          "preserveFormat": true,
+          "sanitize": false,
+          "thresholds": [],
+          "type": "hidden",
+          "unit": "short"
+        }
+      ],
+      "targets": [
+        {
+          "expr": "node_filesystem_size_bytes{fstype=~\"ext4|xfs\"}-0",
+          "format": "table",
+          "hide": false,
+          "instant": true,
+          "intervalFactor": 1,
+          "legendFormat": "",
+          "refId": "C"
+        },
+        {
+          "expr": "node_filesystem_avail_bytes {fstype=~\"ext4|xfs\"}-0",
+          "format": "table",
+          "hide": false,
+          "instant": true,
+          "interval": "10s",
+          "intervalFactor": 1,
+          "legendFormat": "",
+          "refId": "A"
+        },
+        {
+          "expr": "1-(node_filesystem_free_bytes{fstype=~\"ext4|xfs\"} / node_filesystem_size_bytes{fstype=~\"ext4|xfs\"})",
+          "format": "table",
+          "hide": false,
+          "instant": true,
+          "intervalFactor": 1,
+          "legendFormat": "",
+          "refId": "B"
+        }
+      ],
+      "title": "Disk Space Used Basic(EXT4/XFS)",
+      "transform": "table",
+      "type": "table"
+    },
+    {
+      "cacheTimeout": null,
+      "colorBackground": false,
+      "colorPostfix": false,
+      "colorPrefix": false,
+      "colorValue": true,
+      "colors": [
+        "rgba(245, 54, 54, 0.9)",
+        "rgba(237, 129, 40, 0.89)",
+        "rgba(50, 172, 45, 0.97)"
+      ],
+      "datasource": "osm_prometheus",
+      "decimals": 1,
+      "description": "",
+      "format": "s",
+      "gauge": {
+        "maxValue": 100,
+        "minValue": 0,
+        "show": false,
+        "thresholdLabels": false,
+        "thresholdMarkers": true
+      },
+      "gridPos": {
+        "h": 3,
+        "w": 4,
+        "x": 0,
+        "y": 4
+      },
+      "hideTimeOverride": true,
+      "id": 18,
+      "interval": null,
+      "links": [],
+      "mappingType": 1,
+      "mappingTypes": [
+        {
+          "name": "value to text",
+          "value": 1
+        },
+        {
+          "name": "range to text",
+          "value": 2
+        }
+      ],
+      "maxDataPoints": 100,
+      "nullPointMode": "null",
+      "nullText": null,
+      "options": {},
+      "pluginVersion": "6.4.2",
+      "postfix": "",
+      "postfixFontSize": "50%",
+      "prefix": "",
+      "prefixFontSize": "50%",
+      "rangeMaps": [
+        {
+          "from": "null",
+          "text": "N/A",
+          "to": "null"
+        }
+      ],
+      "sparkline": {
+        "fillColor": "rgba(31, 118, 189, 0.18)",
+        "full": false,
+        "lineColor": "rgb(31, 120, 193)",
+        "show": false
+      },
+      "tableColumn": "",
+      "targets": [
+        {
+          "expr": "sum(time() - node_boot_time_seconds)",
+          "format": "time_series",
+          "hide": false,
+          "instant": true,
+          "intervalFactor": 1,
+          "refId": "A",
+          "step": 40
+        }
+      ],
+      "thresholds": "1,2",
+      "title": "System Uptime",
+      "type": "singlestat",
+      "valueFontSize": "100%",
+      "valueMaps": [
+        {
+          "op": "=",
+          "text": "N/A",
+          "value": "null"
+        }
+      ],
+      "valueName": "current"
+    },
+    {
+      "aliasColors": {
+        "192.168.200.241:9100_Total": "dark-red",
+        "Idle - Waiting for something to happen": "#052B51",
+        "guest": "#9AC48A",
+        "idle": "#052B51",
+        "iowait": "#EAB839",
+        "irq": "#BF1B00",
+        "nice": "#C15C17",
+        "sdb_每秒I/O操作%": "#d683ce",
+        "softirq": "#E24D42",
+        "steal": "#FCE2DE",
+        "system": "#508642",
+        "user": "#5195CE",
+        "磁盘花费在I/O操作占比": "#ba43a9"
+      },
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "osm_prometheus",
+      "decimals": 2,
+      "description": "",
+      "fill": 1,
+      "fillGradient": 0,
+      "gridPos": {
+        "h": 8,
+        "w": 8,
+        "x": 0,
+        "y": 7
+      },
+      "id": 24,
+      "legend": {
+        "alignAsTable": true,
+        "avg": true,
+        "current": true,
+        "hideEmpty": true,
+        "hideZero": true,
+        "max": true,
+        "min": false,
+        "rightSide": false,
+        "show": true,
+        "sideWidth": null,
+        "sort": "current",
+        "sortDesc": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 2,
+      "links": [],
+      "maxPerRow": 6,
+      "nullPointMode": "null",
+      "options": {
+        "dataLinks": []
+      },
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "repeat": null,
+      "seriesOverrides": [
+        {
+          "alias": "/.*_Total/",
+          "color": "#C4162A",
+          "fill": 0
+        }
+      ],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "avg(irate(node_cpu_seconds_total{mode=\"system\"}[30m])) by (instance)",
+          "format": "time_series",
+          "hide": false,
+          "instant": false,
+          "interval": "",
+          "intervalFactor": 1,
+          "legendFormat": "{{instance}}_System",
+          "refId": "A",
+          "step": 20
+        },
+        {
+          "expr": "avg(irate(node_cpu_seconds_total{mode=\"user\"}[30m])) by (instance)",
+          "format": "time_series",
+          "hide": false,
+          "intervalFactor": 1,
+          "legendFormat": "{{instance}}_User",
+          "refId": "B",
+          "step": 240
+        },
+        {
+          "expr": "avg(irate(node_cpu_seconds_total{mode=\"iowait\"}[30m])) by (instance)",
+          "format": "time_series",
+          "hide": false,
+          "instant": false,
+          "intervalFactor": 1,
+          "legendFormat": "{{instance}}_Iowait",
+          "refId": "D",
+          "step": 240
+        },
+        {
+          "expr": "1 - avg(irate(node_cpu_seconds_total{mode=\"idle\"}[30m])) by (instance)",
+          "format": "time_series",
+          "hide": false,
+          "intervalFactor": 1,
+          "legendFormat": "{{instance}}_Total",
+          "refId": "F",
+          "step": 240
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "CPU Basic",
+      "tooltip": {
+        "shared": true,
+        "sort": 2,
+        "value_type": "individual"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "decimals": 2,
+          "format": "percentunit",
+          "label": "",
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": false
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {
+        "192.168.200.241:9100_总内存": "dark-red",
+        "内存_Avaliable": "#6ED0E0",
+        "内存_Cached": "#EF843C",
+        "内存_Free": "#629E51",
+        "内存_Total": "#6d1f62",
+        "内存_Used": "#eab839",
+        "可用": "#9ac48a",
+        "总内存": "#bf1b00"
+      },
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "osm_prometheus",
+      "decimals": 2,
+      "fill": 1,
+      "fillGradient": 0,
+      "gridPos": {
+        "h": 8,
+        "w": 8,
+        "x": 8,
+        "y": 7
+      },
+      "height": "300",
+      "id": 26,
+      "legend": {
+        "alignAsTable": true,
+        "avg": false,
+        "current": true,
+        "max": false,
+        "min": false,
+        "rightSide": false,
+        "show": true,
+        "sort": "current",
+        "sortDesc": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 2,
+      "links": [],
+      "nullPointMode": "null",
+      "options": {
+        "dataLinks": []
+      },
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [
+        {
+          "alias": "/.*_Total/",
+          "color": "#C4162A",
+          "fill": 0
+        }
+      ],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "node_memory_MemTotal_bytes",
+          "format": "time_series",
+          "hide": false,
+          "instant": false,
+          "intervalFactor": 1,
+          "legendFormat": "{{instance}}_Total",
+          "refId": "A",
+          "step": 4
+        },
+        {
+          "expr": "node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes",
+          "format": "time_series",
+          "hide": false,
+          "intervalFactor": 1,
+          "legendFormat": "{{instance}}_Used",
+          "refId": "B",
+          "step": 4
+        },
+        {
+          "expr": "node_memory_MemAvailable_bytes",
+          "format": "time_series",
+          "hide": false,
+          "interval": "",
+          "intervalFactor": 1,
+          "legendFormat": "{{instance}}_Avaliable",
+          "refId": "F",
+          "step": 4
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Memory Basic",
+      "tooltip": {
+        "shared": true,
+        "sort": 2,
+        "value_type": "individual"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "bytes",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": "0",
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {
+        "192.168.10.227:9100_em1_in下载": "super-light-green",
+        "192.168.10.227:9100_em1_out上传": "dark-blue"
+      },
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "osm_prometheus",
+      "fill": 1,
+      "fillGradient": 3,
+      "gridPos": {
+        "h": 8,
+        "w": 8,
+        "x": 16,
+        "y": 7
+      },
+      "height": "300",
+      "id": 28,
+      "legend": {
+        "alignAsTable": true,
+        "avg": false,
+        "current": true,
+        "hideEmpty": true,
+        "hideZero": true,
+        "max": true,
+        "min": false,
+        "rightSide": false,
+        "show": true,
+        "sort": "current",
+        "sortDesc": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 2,
+      "links": [],
+      "nullPointMode": "null",
+      "options": {
+        "dataLinks": []
+      },
+      "percentage": false,
+      "pointradius": 2,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [
+        {
+          "alias": "/.*_transmit$/",
+          "transform": "negative-Y"
+        }
+      ],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "irate(node_network_receive_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[30m])*8",
+          "format": "time_series",
+          "intervalFactor": 1,
+          "legendFormat": "{{instance}}_{{device}}_receive",
+          "refId": "A",
+          "step": 4
+        },
+        {
+          "expr": "irate(node_network_transmit_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[30m])*8",
+          "format": "time_series",
+          "intervalFactor": 1,
+          "legendFormat": "{{instance}}_{{device}}_transmit",
+          "refId": "B",
+          "step": 4
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Network Traffic Basic",
+      "tooltip": {
+        "shared": true,
+        "sort": 2,
+        "value_type": "individual"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "bps",
+          "label": "transmit(-)/receive(+)",
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": false
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "collapsed": false,
+      "datasource": null,
+      "gridPos": {
+        "h": 1,
+        "w": 24,
+        "x": 0,
+        "y": 15
+      },
+      "id": 30,
+      "panels": [],
+      "repeat": null,
+      "title": "Docker Metrics",
+      "type": "row"
+    },
+    {
+      "cacheTimeout": null,
+      "colorBackground": false,
+      "colorValue": true,
+      "colors": [
+        "rgba(245, 54, 54, 0.9)",
+        "rgba(237, 129, 40, 0.89)",
+        "rgba(50, 172, 45, 0.97)"
+      ],
+      "datasource": "osm_prometheus",
+      "decimals": null,
+      "editable": true,
+      "error": false,
+      "format": "none",
+      "gauge": {
+        "maxValue": 100,
+        "minValue": 0,
+        "show": false,
+        "thresholdLabels": false,
+        "thresholdMarkers": true
+      },
+      "gridPos": {
+        "h": 3,
+        "w": 8,
+        "x": 0,
+        "y": 16
+      },
+      "height": "20",
+      "id": 7,
+      "interval": null,
+      "isNew": true,
+      "links": [],
+      "mappingType": 2,
+      "mappingTypes": [
+        {
+          "name": "value to text",
+          "value": 1
+        },
+        {
+          "name": "range to text",
+          "value": 2
+        }
+      ],
+      "maxDataPoints": 100,
+      "nullPointMode": "connected",
+      "nullText": null,
+      "options": {},
+      "postfix": "",
+      "postfixFontSize": "50%",
+      "prefix": "",
+      "prefixFontSize": "50%",
+      "rangeMaps": [
+        {
+          "from": "1",
+          "text": "Failing",
+          "to": "13"
+        },
+        {
+          "from": "14",
+          "text": "OK",
+          "to": "20"
+        }
+      ],
+      "sparkline": {
+        "fillColor": "rgba(31, 118, 189, 0.18)",
+        "full": false,
+        "lineColor": "rgb(31, 120, 193)",
+        "show": false
+      },
+      "tableColumn": "",
+      "targets": [
+        {
+          "expr": "count(container_last_seen{container_label_com_docker_swarm_service_name=~\"osm.+\"})",
+          "instant": true,
+          "intervalFactor": 2,
+          "legendFormat": "",
+          "metric": "container_last_seen",
+          "refId": "A",
+          "step": 240
+        }
+      ],
+      "thresholds": "13.1,13.2,100",
+      "title": "OSM Containers Status",
+      "transparent": true,
+      "type": "singlestat",
+      "valueFontSize": "80%",
+      "valueMaps": [
+        {
+          "op": "=",
+          "text": "Failing",
+          "value": "*"
+        },
+        {
+          "op": "=",
+          "text": "OK",
+          "value": "14"
+        }
+      ],
+      "valueName": "avg"
+    },
+    {
+      "cacheTimeout": null,
+      "colorBackground": false,
+      "colorValue": false,
+      "colors": [
+        "rgba(245, 54, 54, 0.9)",
+        "rgba(237, 129, 40, 0.89)",
+        "rgba(50, 172, 45, 0.97)"
+      ],
+      "datasource": "osm_prometheus",
+      "editable": true,
+      "error": false,
+      "format": "mbytes",
+      "gauge": {
+        "maxValue": 100,
+        "minValue": 0,
+        "show": false,
+        "thresholdLabels": false,
+        "thresholdMarkers": true
+      },
+      "gridPos": {
+        "h": 3,
+        "w": 8,
+        "x": 8,
+        "y": 16
+      },
+      "height": "20",
+      "id": 5,
+      "interval": null,
+      "isNew": true,
+      "links": [],
+      "mappingType": 1,
+      "mappingTypes": [
+        {
+          "name": "value to text",
+          "value": 1
+        },
+        {
+          "name": "range to text",
+          "value": 2
+        }
+      ],
+      "maxDataPoints": 100,
+      "nullPointMode": "connected",
+      "nullText": null,
+      "options": {},
+      "postfix": "",
+      "postfixFontSize": "50%",
+      "prefix": "",
+      "prefixFontSize": "50%",
+      "rangeMaps": [
+        {
+          "from": "null",
+          "text": "N/A",
+          "to": "null"
+        }
+      ],
+      "sparkline": {
+        "fillColor": "rgba(31, 118, 189, 0.18)",
+        "full": false,
+        "lineColor": "rgb(31, 120, 193)",
+        "show": false
+      },
+      "tableColumn": "",
+      "targets": [
+        {
+          "expr": "sum(container_memory_usage_bytes{container_label_com_docker_swarm_service_name=~\"osm.+\"})/1024/1024",
+          "intervalFactor": 2,
+          "legendFormat": "",
+          "metric": "container_memory_usage_bytes",
+          "refId": "A",
+          "step": 240
+        }
+      ],
+      "thresholds": "",
+      "title": "Total Memory Usage",
+      "transparent": true,
+      "type": "singlestat",
+      "valueFontSize": "80%",
+      "valueMaps": [
+        {
+          "op": "=",
+          "text": "N/A",
+          "value": "null"
+        }
+      ],
+      "valueName": "current"
+    },
+    {
+      "cacheTimeout": null,
+      "colorBackground": false,
+      "colorValue": true,
+      "colors": [
+        "rgba(50, 172, 45, 0.97)",
+        "rgba(237, 129, 40, 0.89)",
+        "rgba(245, 54, 54, 0.9)"
+      ],
+      "datasource": "osm_prometheus",
+      "editable": true,
+      "error": false,
+      "format": "percent",
+      "gauge": {
+        "maxValue": 100,
+        "minValue": 0,
+        "show": false,
+        "thresholdLabels": false,
+        "thresholdMarkers": true
+      },
+      "gridPos": {
+        "h": 3,
+        "w": 8,
+        "x": 16,
+        "y": 16
+      },
+      "height": "20",
+      "id": 6,
+      "interval": null,
+      "isNew": true,
+      "links": [],
+      "mappingType": 1,
+      "mappingTypes": [
+        {
+          "name": "value to text",
+          "value": 1
+        },
+        {
+          "name": "range to text",
+          "value": 2
+        }
+      ],
+      "maxDataPoints": 100,
+      "nullPointMode": "connected",
+      "nullText": null,
+      "options": {},
+      "postfix": "",
+      "postfixFontSize": "50%",
+      "prefix": "",
+      "prefixFontSize": "50%",
+      "rangeMaps": [
+        {
+          "from": "null",
+          "text": "N/A",
+          "to": "null"
+        }
+      ],
+      "sparkline": {
+        "fillColor": "rgba(31, 118, 189, 0.18)",
+        "full": false,
+        "lineColor": "rgb(31, 120, 193)",
+        "show": false
+      },
+      "tableColumn": "",
+      "targets": [
+        {
+          "expr": "sum(rate(container_cpu_user_seconds_total{container_label_com_docker_swarm_service_name=~\"osm.+\"}[5m]) * 100)",
+          "intervalFactor": 2,
+          "legendFormat": "",
+          "metric": "container_memory_usage_bytes",
+          "refId": "A",
+          "step": 240
+        }
+      ],
+      "thresholds": "40,70,100",
+      "title": "Total CPU Usage",
+      "transparent": true,
+      "type": "singlestat",
+      "valueFontSize": "80%",
+      "valueMaps": [
+        {
+          "op": "=",
+          "text": "N/A",
+          "value": "null"
+        }
+      ],
+      "valueName": "current"
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "osm_prometheus",
+      "decimals": 2,
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "fillGradient": 0,
+      "grid": {},
+      "gridPos": {
+        "h": 7,
+        "w": 24,
+        "x": 0,
+        "y": 19
+      },
+      "id": 2,
+      "isNew": true,
+      "legend": {
+        "alignAsTable": true,
+        "avg": true,
+        "current": true,
+        "max": false,
+        "min": false,
+        "rightSide": true,
+        "show": true,
+        "sort": "current",
+        "sortDesc": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 2,
+      "links": [],
+      "nullPointMode": "connected",
+      "options": {
+        "dataLinks": []
+      },
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "rate(container_cpu_user_seconds_total{container_label_com_docker_swarm_service_name=~\"osm.+\"}[5m]) * 100",
+          "intervalFactor": 2,
+          "legendFormat": "{{name}}",
+          "metric": "cpu",
+          "refId": "A",
+          "step": 10
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "CPU Usage (5m)",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "percent",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "osm_prometheus",
+      "decimals": 2,
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "fillGradient": 0,
+      "grid": {},
+      "gridPos": {
+        "h": 7,
+        "w": 24,
+        "x": 0,
+        "y": 26
+      },
+      "id": 1,
+      "isNew": true,
+      "legend": {
+        "alignAsTable": true,
+        "avg": true,
+        "current": true,
+        "max": false,
+        "min": false,
+        "rightSide": true,
+        "show": true,
+        "sort": "current",
+        "sortDesc": true,
+        "total": false,
+        "values": true
+      },
+      "lines": true,
+      "linewidth": 2,
+      "links": [],
+      "nullPointMode": "connected",
+      "options": {
+        "dataLinks": []
+      },
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "container_memory_usage_bytes{container_label_com_docker_swarm_service_name=~\"osm.+\"}",
+          "hide": false,
+          "intervalFactor": 2,
+          "legendFormat": "{{name}}",
+          "metric": "container_memory_usage_bytes",
+          "refId": "A",
+          "step": 10
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Memory Usage",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "bytes",
+          "label": "",
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": false
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "osm_prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "fillGradient": 0,
+      "grid": {},
+      "gridPos": {
+        "h": 7,
+        "w": 12,
+        "x": 0,
+        "y": 33
+      },
+      "id": 3,
+      "isNew": true,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 2,
+      "links": [],
+      "nullPointMode": "connected",
+      "options": {
+        "dataLinks": []
+      },
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "irate(container_network_receive_bytes_total{container_label_com_docker_swarm_service_name=~\"osm.+\"}[5m])",
+          "instant": false,
+          "intervalFactor": 2,
+          "legendFormat": "{{name}}",
+          "metric": "container_network_receive_bytes_total",
+          "refId": "A",
+          "step": 20
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Network Rx",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "Bps",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "osm_prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "fillGradient": 0,
+      "grid": {},
+      "gridPos": {
+        "h": 7,
+        "w": 12,
+        "x": 12,
+        "y": 33
+      },
+      "id": 4,
+      "isNew": true,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 2,
+      "links": [],
+      "nullPointMode": "connected",
+      "options": {
+        "dataLinks": []
+      },
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "irate(container_network_transmit_bytes_total{container_label_com_docker_swarm_service_name=~\"osm.+\"}[5m])",
+          "intervalFactor": 2,
+          "legendFormat": "{{name}}",
+          "refId": "A",
+          "step": 20
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "Network Tx",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "Bps",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "osm_prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "fillGradient": 0,
+      "grid": {},
+      "gridPos": {
+        "h": 7,
+        "w": 12,
+        "x": 0,
+        "y": 40
+      },
+      "id": 8,
+      "isNew": true,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 2,
+      "links": [],
+      "nullPointMode": "connected",
+      "options": {
+        "dataLinks": []
+      },
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "irate(container_fs_reads_bytes_total{container_label_com_docker_swarm_service_name=~\"osm.+\"}[5m])",
+          "intervalFactor": 2,
+          "legendFormat": "{{name}}",
+          "metric": "container_fs_reads_bytes_total",
+          "refId": "A",
+          "step": 20
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "I/O Rx",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "Bps",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    },
+    {
+      "aliasColors": {},
+      "bars": false,
+      "dashLength": 10,
+      "dashes": false,
+      "datasource": "osm_prometheus",
+      "editable": true,
+      "error": false,
+      "fill": 1,
+      "fillGradient": 0,
+      "grid": {},
+      "gridPos": {
+        "h": 7,
+        "w": 12,
+        "x": 12,
+        "y": 40
+      },
+      "id": 9,
+      "isNew": true,
+      "legend": {
+        "avg": false,
+        "current": false,
+        "max": false,
+        "min": false,
+        "show": true,
+        "total": false,
+        "values": false
+      },
+      "lines": true,
+      "linewidth": 2,
+      "links": [],
+      "nullPointMode": "connected",
+      "options": {
+        "dataLinks": []
+      },
+      "percentage": false,
+      "pointradius": 5,
+      "points": false,
+      "renderer": "flot",
+      "seriesOverrides": [],
+      "spaceLength": 10,
+      "stack": false,
+      "steppedLine": false,
+      "targets": [
+        {
+          "expr": "irate(container_fs_writes_bytes_total{container_label_com_docker_swarm_service_name=~\"osm.+\"}[5m])",
+          "intervalFactor": 2,
+          "legendFormat": "{{name}}",
+          "metric": "container_fs_writes_bytes_total",
+          "refId": "A",
+          "step": 20
+        }
+      ],
+      "thresholds": [],
+      "timeFrom": null,
+      "timeRegions": [],
+      "timeShift": null,
+      "title": "I/O Tx",
+      "tooltip": {
+        "msResolution": false,
+        "shared": true,
+        "sort": 0,
+        "value_type": "cumulative"
+      },
+      "type": "graph",
+      "xaxis": {
+        "buckets": null,
+        "mode": "time",
+        "name": null,
+        "show": true,
+        "values": []
+      },
+      "yaxes": [
+        {
+          "format": "Bps",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        },
+        {
+          "format": "short",
+          "label": null,
+          "logBase": 1,
+          "max": null,
+          "min": null,
+          "show": true
+        }
+      ],
+      "yaxis": {
+        "align": false,
+        "alignLevel": null
+      }
+    }
+  ],
+  "refresh": "10s",
+  "schemaVersion": 20,
+  "style": "dark",
+  "tags": [],
+  "templating": {
+    "list": []
+  },
+  "time": {
+    "from": "now-5m",
+    "to": "now"
+  },
+  "timepicker": {
+    "refresh_intervals": [
+      "5s",
+      "10s",
+      "30s",
+      "1m",
+      "5m",
+      "15m",
+      "30m",
+      "1h",
+      "2h",
+      "1d"
+    ],
+    "time_options": [
+      "5m",
+      "15m",
+      "1h",
+      "6h",
+      "12h",
+      "24h",
+      "2d",
+      "7d",
+      "30d"
+    ]
+  },
+  "timezone": "browser",
+  "title": "OSM System Metrics",
+  "uid": null,
+  "version": 1
+}
\ No newline at end of file
diff --git a/installers/docker/osm_pla/docker-compose.yaml b/installers/docker/osm_pla/docker-compose.yaml
new file mode 100644 (file)
index 0000000..93699ef
--- /dev/null
@@ -0,0 +1,29 @@
+##
+# Copyright 2019 ETSI
+#
+# 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.
+##
+
+########################################################################
+
+version: '3'
+services:
+  pla:
+    image: ${DOCKER_USER:-opensourcemano}/pla:${TAG:-7}
+    networks:
+      - netOSM
+    logging:
+      driver: "json-file"
+      options:
+        max-file: 5
+        max-size: 10m
diff --git a/installers/docker/osm_pla/pla.yaml b/installers/docker/osm_pla/pla.yaml
new file mode 100644 (file)
index 0000000..c5bdd50
--- /dev/null
@@ -0,0 +1,50 @@
+# Copyright 2020 Arctos Labs Scandinavia AB
+#
+# 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.
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: pla
+  labels:
+    app: pla
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: pla
+  template:
+    metadata:
+      labels:
+        app: pla
+    spec:
+      initContainers:
+       - name: kafka-mongo-test
+         image: alpine:latest
+         command: ["sh", "-c", "until (nc -zvw1 kafka 9092 && nc -zvw1 mongo 27017 ); do sleep 3; done; exit 0"]
+      containers:
+      - name: pla
+        image: opensourcemano/pla:7
+        env:
+        - name: OSMPLA_DATABASE_HOST
+          value: mongo
+        - name: OSMPLA_MESSAGE_HOST
+          value: kafka
+        volumeMounts:
+        - name: osm-packages
+          mountPath: /app/storage
+      volumes:
+      - name: osm-packages
+        hostPath:
+         path: /var/lib/osm/osm_osm_packages/_data
index 7152059..1d1dc91 100644 (file)
@@ -19,6 +19,7 @@ kind: Service
 metadata:
   name: keystone
 spec:
+  clusterIP: None
   ports:
   - port: 5000
     protocol: TCP
index cdfd94d..b6ab986 100644 (file)
@@ -53,7 +53,7 @@ data:
     # Here it's Prometheus itself.
     scrape_configs:
       # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
-      - job_name: 'prometheus'
+      - job_name: 'mon_exporter'
 
         # metrics_path defaults to '/metrics'
         # scheme defaults to 'http'.
@@ -84,6 +84,9 @@ spec:
       containers:
       - name: prometheus
         image: prom/prometheus:v2.4.3
+        args:
+        - --config.file=/etc/prometheus/prometheus.yml
+        - --web.enable-lifecycle
         ports:
         - containerPort: 9090
           protocol: TCP
diff --git a/installers/docker/prometheus/prometheus.yml b/installers/docker/prometheus/prometheus.yml
new file mode 100644 (file)
index 0000000..8d37837
--- /dev/null
@@ -0,0 +1,47 @@
+# Copyright 2018 The Prometheus Authors
+# Copyright 2018 Whitestack
+# Copyright 2018 Telefonica Investigacion y Desarrollo, S.A.U.
+#
+# 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.
+
+# my global config
+global:
+  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
+  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
+  # scrape_timeout is set to the global default (10s).
+
+# Alertmanager configuration
+alerting:
+  alertmanagers:
+  - static_configs:
+    - targets:
+      # - alertmanager:9093
+
+# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
+rule_files:
+  # - "first_rules.yml"
+  # - "second_rules.yml"
+
+# A scrape configuration containing exactly one endpoint to scrape:
+# Here it's Prometheus itself.
+scrape_configs:
+  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
+  - job_name: 'mon_exporter'
+    static_configs:
+    - targets: ['mon:8000']
+  - job_name: 'node_exporter'
+    static_configs:
+      - targets: ['172.18.0.1:9100']
+  - job_name: 'cadvisor'
+    static_configs:
+      - targets: ['prometheus-cadvisor:8080']
\ No newline at end of file
diff --git a/installers/docker/prometheus_exporters/node_exporter.service b/installers/docker/prometheus_exporters/node_exporter.service
new file mode 100644 (file)
index 0000000..407772b
--- /dev/null
@@ -0,0 +1,30 @@
+##
+# Copyright 2019 ETSI
+#
+# 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.
+##
+
+########################################################################
+[Unit]
+Description=Node Exporter
+Wants=network-online.target
+After=network-online.target
+
+[Service]
+User=node_exporter
+Group=node_exporter
+Type=simple
+ExecStart=/usr/local/bin/node_exporter
+
+[Install]
+WantedBy=multi-user.target
\ No newline at end of file
index ed4d2a4..ae2e1e9 100755 (executable)
@@ -35,11 +35,15 @@ function usage(){
     echo -e "     -A <VCA apiproxy> use VCA/juju API proxy"
     echo -e "     --vimemu:       additionally deploy the VIM emulator as a docker container"
     echo -e "     --elk_stack:    additionally deploy an ELK docker stack for event logging"
-    echo -e "     -m <MODULE>:    install OSM but only rebuild the specified docker images (LW-UI, NBI, LCM, RO, MON, POL, KAFKA, MONGO, PROMETHEUS, PROMETHEUS-CADVISOR, KEYSTONE-DB, NONE)"
+    echo -e "     --pla:          install the PLA module for placement support"
+    echo -e "     -m <MODULE>:    install OSM but only rebuild the specified docker images (LW-UI, NBI, LCM, RO, MON, POL, KAFKA, MONGO, PROMETHEUS, PROMETHEUS-CADVISOR, KEYSTONE-DB, PLA, NONE)"
     echo -e "     -o <ADDON>:     ONLY (un)installs one of the addons (vimemu, elk_stack)"
     echo -e "     -D <devops path> use local devops installation path"
     echo -e "     -w <work dir>   Location to store runtime installation"
     echo -e "     -t <docker tag> specify osm docker tag (default is latest)"
+    echo -e "     -l:             LXD cloud yaml file"
+    echo -e "     -L:             LXD credentials yaml file"
+    echo -e "     -K:             Specifies the name of the controller to use - The controller must be already bootstrapped"
     echo -e "     --nolxd:        do not install and configure LXD, allowing unattended installations (assumes LXD is already installed and confifured)"
     echo -e "     --nodocker:     do not install docker, do not initialize a swarm (assumes docker is already installed and a swarm has been initialized)"
     echo -e "     --nojuju:       do not juju, assumes already installed"
@@ -49,41 +53,22 @@ function usage(){
     echo -e "     --uninstall:    uninstall OSM: remove the containers and delete NAT rules"
     echo -e "     --source:       install OSM from source code using the latest stable tag"
     echo -e "     --develop:      (deprecated, use '-b master') install OSM from source code using the master branch"
-    echo -e "     --soui:         install classic build of OSM (Rel THREE v3.1, based on LXD containers, with SO and UI)"
-    echo -e "     --lxdimages:    (only for Rel THREE with --soui) download lxd images from OSM repository instead of creating them from scratch"
     echo -e "     --pullimages:   pull/run osm images from docker.io/opensourcemano"
     echo -e "     --k8s_monitor:  install the OSM kubernetes moitoring with prometheus and grafana"
-    echo -e "     -l <lxd_repo>:  (only for Rel THREE with --soui) use specified repository url for lxd images"
-    echo -e "     -p <path>:      (only for Rel THREE with --soui) use specified repository path for lxd images"
 #    echo -e "     --reconfigure:  reconfigure the modules (DO NOT change NAT rules)"
-    echo -e "     --nat:          (only for Rel THREE with --soui) install only NAT rules"
-    echo -e "     --noconfigure:  (only for Rel THREE with --soui) DO NOT install osmclient, DO NOT install NAT rules, DO NOT configure modules"
 #    echo -e "     --update:       update to the latest stable release or to the latest commit if using a specific branch"
     echo -e "     --showopts:     print chosen options and exit (only for debugging)"
     echo -e "     -y:             do not prompt for confirmation, assumes yes"
     echo -e "     -h / --help:    print this help"
-}
+    echo -e "     --charmed:                       install OSM with charms"
+    echo -e "     --bundle <bundle path>:          Specify with which bundle to deploy OSM with charms (--charmed option)"
+    echo -e "     --kubeconfig <kubeconfig path>:  Specify with which kubernetes to deploy OSM with charms (--charmed option)"
+    echo -e "     --controller <name>:             Specifies the name of the controller to use - The controller must be already bootstrapped (--charmed option)" 
+    echo -e "     --lxd-cloud <yaml path>:         Takes a YAML file as a parameter with the LXD Cloud information (--charmed option)" 
+    echo -e "     --lxd-credentials <yaml path>:   Takes a YAML file as a parameter with the LXD Credentials information (--charmed option)"
+    echo -e "     --microstack:                    Installs microstack as a vim. (--charmed option)"
+    echo -e "     --tag:                           Docker image tag"
 
-#Uninstall OSM: remove containers
-function uninstall(){
-    echo -e "\nUninstalling OSM"
-    if [ $RC_CLONE ] || [ -n "$TEST_INSTALLER" ]; then
-        $OSM_DEVOPS/jenkins/host/clean_container RO
-        $OSM_DEVOPS/jenkins/host/clean_container VCA
-        $OSM_DEVOPS/jenkins/host/clean_container MON
-        $OSM_DEVOPS/jenkins/host/clean_container SO
-        #$OSM_DEVOPS/jenkins/host/clean_container UI
-    else
-        lxc stop RO && lxc delete RO
-        lxc stop VCA && lxc delete VCA
-        lxc stop MON && lxc delete MON
-        lxc stop SO-ub && lxc delete SO-ub
-    fi
-    echo -e "\nDeleting imported lxd images if they exist"
-    lxc image show osm-ro &>/dev/null && lxc image delete osm-ro
-    lxc image show osm-vca &>/dev/null && lxc image delete osm-vca
-    lxc image show osm-soui &>/dev/null && lxc image delete osm-soui
-    return 0
 }
 
 # takes a juju/accounts.yaml file and returns the password specific
@@ -140,7 +125,8 @@ function remove_iptables() {
     fi
 
     if [ -z "$DEFAULT_IP" ]; then
-        DEFAULT_IF=`route -n |awk '$1~/^0.0.0.0/ {print $8}'`
+        DEFAULT_IF=$(ip route list|awk '$1=="default" {print $5}')
+        [ -z "$DEFAULT_IF" ] && DEFAULT_IF=$(route -n |awk '$1~/^0.0.0.0/ {print $8}')
         [ -z "$DEFAULT_IF" ] && FATAL "Not possible to determine the interface with the default route 0.0.0.0"
         DEFAULT_IP=`ip -o -4 a |grep ${DEFAULT_IF}|awk '{split($4,a,"/"); print a[1]}'`
         [ -z "$DEFAULT_IP" ] && FATAL "Not possible to determine the IP address of the interface with the default route"
@@ -181,6 +167,12 @@ function remove_k8s_namespace() {
     kubectl delete ns $1
 }
 
+#Uninstall osmclient
+function uninstall_osmclient() {
+    sudo apt-get remove --purge -y python-osmclient
+    sudo apt-get remove --purge -y python3-osmclient
+}
+
 #Uninstall lightweight OSM: remove dockers
 function uninstall_lightweight() {
     if [ -n "$INSTALL_ONLY" ]; then
@@ -192,7 +184,7 @@ function uninstall_lightweight() {
     else
         echo -e "\nUninstalling OSM"
         if [ -n "$KUBERNETES" ]; then
-            if [ -n "$K8S_MONITOR" ]; then
+            if [ -n "$INSTALL_K8S_MONITOR" ]; then
                 # uninstall OSM MONITORING
                 uninstall_k8s_monitoring
             fi
@@ -211,6 +203,7 @@ function uninstall_lightweight() {
         docker image rm ${DOCKER_USER}/nbi:${OSM_DOCKER_TAG}
         docker image rm ${DOCKER_USER}/mon:${OSM_DOCKER_TAG}
         docker image rm ${DOCKER_USER}/pol:${OSM_DOCKER_TAG}
+        docker image rm ${DOCKER_USER}/pla:${OSM_DOCKER_TAG}
         docker image rm ${DOCKER_USER}/osmclient:${OSM_DOCKER_TAG}
 EONG
 
@@ -221,21 +214,32 @@ EONG
             remove_volumes $OSM_STACK_NAME
             remove_network $OSM_STACK_NAME
         fi
-        remove_iptables $OSM_STACK_NAME
+        [ -z "$CONTROLLER_NAME" ] && remove_iptables $OSM_STACK_NAME
         echo "Removing $OSM_DOCKER_WORK_DIR"
         $WORKDIR_SUDO rm -rf $OSM_DOCKER_WORK_DIR
-        sg lxd -c "juju destroy-controller --destroy-all-models --yes $OSM_STACK_NAME"
+        [ -z "$CONTROLLER_NAME" ] && sg lxd -c "juju destroy-controller --destroy-all-models --yes $OSM_STACK_NAME"
     fi
+    uninstall_osmclient
     echo "Some docker images will be kept in case they are used by other docker stacks"
     echo "To remove them, just run 'docker image prune' in a terminal"
     return 0
 }
 
+#Safe unattended install of iptables-persistent
+function check_install_iptables_persistent(){
+    echo -e "\nChecking required packages: iptables-persistent"
+    if dpkg -l iptables-persistent &>/dev/null; then
+        echo -e "    Not installed.\nInstalling iptables-persistent requires root privileges"
+        echo iptables-persistent iptables-persistent/autosave_v4 boolean true | sudo debconf-set-selections
+        echo iptables-persistent iptables-persistent/autosave_v6 boolean true | sudo debconf-set-selections
+        sudo apt-get -yq install iptables-persistent
+    fi
+}
+
 #Configure NAT rules, based on the current IP addresses of containers
 function nat(){
-    echo -e "\nChecking required packages: iptables-persistent"
-    dpkg -l iptables-persistent &>/dev/null || ! echo -e "    Not installed.\nInstalling iptables-persistent requires root privileges" || \
-    sudo apt-get -yq install iptables-persistent
+    check_install_iptables_persistent
+    
     echo -e "\nConfiguring NAT rules"
     echo -e "   Required root privileges"
     sudo $OSM_DEVOPS/installers/nat_osm
@@ -246,304 +250,24 @@ function FATAL(){
     exit 1
 }
 
-#Update RO, SO and UI:
-function update(){
-    echo -e "\nUpdating components"
-
-    echo -e "     Updating RO"
-    CONTAINER="RO"
-    MDG="RO"
-    INSTALL_FOLDER="/opt/openmano"
-    echo -e "     Fetching the repo"
-    lxc exec $CONTAINER -- git -C $INSTALL_FOLDER fetch --all
-    BRANCH=""
-    BRANCH=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status -sb | head -n1 | sed -n 's/^## \(.*\).*/\1/p'|awk '{print $1}' |sed 's/\(.*\)\.\.\..*/\1/'`
-    [ -z "$BRANCH" ] && FATAL "Could not find the current branch in use in the '$MDG'"
-    CURRENT=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status |head -n1`
-    CURRENT_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse HEAD`
-    echo "         FROM: $CURRENT ($CURRENT_COMMIT_ID)"
-    # COMMIT_ID either was  previously set with -b option, or is an empty string
-    CHECKOUT_ID=$COMMIT_ID
-    [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" == "HEAD" ] && CHECKOUT_ID="tags/$LATEST_STABLE_DEVOPS"
-    [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" != "HEAD" ] && CHECKOUT_ID="$BRANCH"
-    if [[ $CHECKOUT_ID == "tags/"* ]]; then
-        REMOTE_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-list -n 1 $CHECKOUT_ID`
-    else
-        REMOTE_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse origin/$CHECKOUT_ID`
-    fi
-    echo "         TO: $CHECKOUT_ID ($REMOTE_COMMIT_ID)"
-    if [ "$CURRENT_COMMIT_ID" == "$REMOTE_COMMIT_ID" ]; then
-        echo "         Nothing to be done."
-    else
-        echo "         Update required."
-        lxc exec $CONTAINER -- service osm-ro stop
-        lxc exec $CONTAINER -- git -C /opt/openmano stash
-        lxc exec $CONTAINER -- git -C /opt/openmano pull --rebase
-        lxc exec $CONTAINER -- git -C /opt/openmano checkout $CHECKOUT_ID
-        lxc exec $CONTAINER -- git -C /opt/openmano stash pop
-        lxc exec $CONTAINER -- /opt/openmano/database_utils/migrate_mano_db.sh
-        lxc exec $CONTAINER -- service osm-ro start
-    fi
-    echo
-
-    echo -e "     Updating SO and UI"
-    CONTAINER="SO-ub"
-    MDG="SO"
-    INSTALL_FOLDER=""   # To be filled in
-    echo -e "     Fetching the repo"
-    lxc exec $CONTAINER -- git -C $INSTALL_FOLDER fetch --all
-    BRANCH=""
-    BRANCH=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status -sb | head -n1 | sed -n 's/^## \(.*\).*/\1/p'|awk '{print $1}' |sed 's/\(.*\)\.\.\..*/\1/'`
-    [ -z "$BRANCH" ] && FATAL "Could not find the current branch in use in the '$MDG'"
-    CURRENT=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status |head -n1`
-    CURRENT_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse HEAD`
-    echo "         FROM: $CURRENT ($CURRENT_COMMIT_ID)"
-    # COMMIT_ID either was  previously set with -b option, or is an empty string
-    CHECKOUT_ID=$COMMIT_ID
-    [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" == "HEAD" ] && CHECKOUT_ID="tags/$LATEST_STABLE_DEVOPS"
-    [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" != "HEAD" ] && CHECKOUT_ID="$BRANCH"
-    if [[ $CHECKOUT_ID == "tags/"* ]]; then
-        REMOTE_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-list -n 1 $CHECKOUT_ID`
-    else
-        REMOTE_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse origin/$CHECKOUT_ID`
-    fi
-    echo "         TO: $CHECKOUT_ID ($REMOTE_COMMIT_ID)"
-    if [ "$CURRENT_COMMIT_ID" == "$REMOTE_COMMIT_ID" ]; then
-        echo "         Nothing to be done."
-    else
-        echo "         Update required."
-        # Instructions to be added
-        # lxc exec SO-ub -- ...
-    fi
-    echo
-    echo -e "Updating MON Container"
-    CONTAINER="MON"
-    MDG="MON"
-    INSTALL_FOLDER="/root/MON"
-    echo -e "     Fetching the repo"
-    lxc exec $CONTAINER -- git -C $INSTALL_FOLDER fetch --all
-    BRANCH=""
-    BRANCH=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status -sb | head -n1 | sed -n 's/^## \(.*\).*/\1/p'|awk '{print $1}' |sed 's/\(.*\)\.\.\..*/\1/'`
-    [ -z "$BRANCH" ] && FATAL "Could not find the current branch in use in the '$MDG'"
-    CURRENT=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER status |head -n1`
-    CURRENT_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse HEAD`
-    echo "         FROM: $CURRENT ($CURRENT_COMMIT_ID)"
-    # COMMIT_ID either was  previously set with -b option, or is an empty string
-    CHECKOUT_ID=$COMMIT_ID
-    [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" == "HEAD" ] && CHECKOUT_ID="tags/$LATEST_STABLE_DEVOPS"
-    [ -z "$CHECKOUT_ID" ] && [ "$BRANCH" != "HEAD" ] && CHECKOUT_ID="$BRANCH"
-    if [[ $CHECKOUT_ID == "tags/"* ]]; then
-        REMOTE_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-list -n 1 $CHECKOUT_ID`
-    else
-        REMOTE_COMMIT_ID=`lxc exec $CONTAINER -- git -C $INSTALL_FOLDER rev-parse origin/$CHECKOUT_ID`
-    fi
-    echo "         TO: $CHECKOUT_ID ($REMOTE_COMMIT_ID)"
-    if [ "$CURRENT_COMMIT_ID" == "$REMOTE_COMMIT_ID" ]; then
-        echo "         Nothing to be done."
-    else
-        echo "         Update required."
-    fi
-    echo
-}
-
-function so_is_up() {
-    if [ -n "$1" ]; then
-        SO_IP=$1
-    else
-        SO_IP=`lxc list SO-ub -c 4|grep eth0 |awk '{print $2}'`
-    fi
-    time=0
-    step=5
-    timelength=300
-    while [ $time -le $timelength ]
-    do
-        if [[ `curl -k -X GET   https://$SO_IP:8008/api/operational/vcs/info \
-                -H 'accept: application/vnd.yang.data+json' \
-                -H 'authorization: Basic YWRtaW46YWRtaW4=' \
-                -H 'cache-control: no-cache' 2> /dev/null | jq  '.[].components.component_info[] | select(.component_name=="RW.Restconf")' 2>/dev/null | grep "RUNNING" | wc -l` -eq 1 ]]
-        then
-            echo "RW.Restconf running....SO is up"
-            return 0
-        fi
-
-        sleep $step
-        echo -n "."
-        time=$((time+step))
-    done
-
-    FATAL "OSM Failed to startup. SO failed to startup"
-}
-
-function vca_is_up() {
-    if [[ `lxc exec VCA -- juju status | grep "osm" | wc -l` -eq 1 ]]; then
-            echo "VCA is up and running"
-            return 0
-    fi
-
-    FATAL "OSM Failed to startup. VCA failed to startup"
-}
-
-function mon_is_up() {
-    if [[ `curl http://$RO_IP:9090/openmano/ | grep "works" | wc -l` -eq 1 ]]; then
-            echo "MON is up and running"
-            return 0
-    fi
-
-    FATAL "OSM Failed to startup. MON failed to startup"
-}
-
-function ro_is_up() {
-    if [ -n "$1" ]; then
-        RO_IP=$1
-    else
-        RO_IP=`lxc list RO -c 4|grep eth0 |awk '{print $2}'`
-    fi
-    time=0
-    step=2
-    timelength=20
-    while [ $time -le $timelength ]; do
-        if [[ `curl http://$RO_IP:9090/openmano/ | grep "works" | wc -l` -eq 1 ]]; then
-            echo "RO is up and running"
-            return 0
-        fi
-        sleep $step
-        echo -n "."
-        time=$((time+step))
-    done
-
-    FATAL "OSM Failed to startup. RO failed to startup"
-}
-
-
-function configure_RO(){
-    . $OSM_DEVOPS/installers/export_ips
-    echo -e "       Configuring RO"
-    lxc exec RO -- sed -i -e "s/^\#\?log_socket_host:.*/log_socket_host: $SO_CONTAINER_IP/g" /etc/osm/openmanod.cfg
-    lxc exec RO -- service osm-ro restart
-
-    ro_is_up
-
-    lxc exec RO -- openmano tenant-delete -f osm >/dev/null
-    lxc exec RO -- openmano tenant-create osm > /dev/null
-    lxc exec RO -- sed -i '/export OPENMANO_TENANT=osm/d' .bashrc
-    lxc exec RO -- sed -i '$ i export OPENMANO_TENANT=osm' .bashrc
-    lxc exec RO -- sh -c 'echo "export OPENMANO_TENANT=osm" >> .bashrc'
-}
-
-function configure_VCA(){
-    echo -e "       Configuring VCA"
-    JUJU_PASSWD=$(generate_secret)
-    echo -e "$JUJU_PASSWD\n$JUJU_PASSWD" | lxc exec VCA -- juju change-user-password
-}
-
-function configure_SOUI(){
-    . $OSM_DEVOPS/installers/export_ips
-    JUJU_CONTROLLER_IP=`lxc exec VCA -- lxc list -c 4 |grep eth0 |awk '{print $2}'`
-    RO_TENANT_ID=`lxc exec RO -- openmano tenant-list osm |awk '{print $1}'`
-
-    echo -e " Configuring MON"
-    #Information to be added about SO socket for logging
-
-    echo -e "       Configuring SO"
-    sudo route add -host $JUJU_CONTROLLER_IP gw $VCA_CONTAINER_IP
-    sudo ip route add 10.44.127.0/24 via $VCA_CONTAINER_IP
-    sudo sed -i "$ i route add -host $JUJU_CONTROLLER_IP gw $VCA_CONTAINER_IP" /etc/rc.local
-    sudo sed -i "$ i ip route add 10.44.127.0/24 via $VCA_CONTAINER_IP" /etc/rc.local
-    # make journaling persistent
-    lxc exec SO-ub -- mkdir -p /var/log/journal
-    lxc exec SO-ub -- systemd-tmpfiles --create --prefix /var/log/journal
-    lxc exec SO-ub -- systemctl restart systemd-journald
-
-    echo RIFT_EXTERNAL_ADDRESS=$DEFAULT_IP | lxc exec SO-ub -- tee -a /usr/rift/etc/default/launchpad
-
-    lxc exec SO-ub -- systemctl restart launchpad
-
-    so_is_up $SO_CONTAINER_IP
-
-    #delete existing config agent (could be there on reconfigure)
-    curl -k --request DELETE \
-      --url https://$SO_CONTAINER_IP:8008/api/config/config-agent/account/osmjuju \
-      --header 'accept: application/vnd.yang.data+json' \
-      --header 'authorization: Basic YWRtaW46YWRtaW4=' \
-      --header 'cache-control: no-cache' \
-      --header 'content-type: application/vnd.yang.data+json' &> /dev/null
-
-    result=$(curl -k --request POST \
-      --url https://$SO_CONTAINER_IP:8008/api/config/config-agent \
-      --header 'accept: application/vnd.yang.data+json' \
-      --header 'authorization: Basic YWRtaW46YWRtaW4=' \
-      --header 'cache-control: no-cache' \
-      --header 'content-type: application/vnd.yang.data+json' \
-      --data '{"account": [ { "name": "osmjuju", "account-type": "juju", "juju": { "ip-address": "'$JUJU_CONTROLLER_IP'", "port": "17070", "user": "admin", "secret": "'$JUJU_PASSWD'" }  }  ]}')
-    [[ $result =~ .*success.* ]] || FATAL "Failed config-agent configuration: $result"
-
-    #R1/R2 config line
-    #result=$(curl -k --request PUT \
-    #  --url https://$SO_CONTAINER_IP:8008/api/config/resource-orchestrator \
-    #  --header 'accept: application/vnd.yang.data+json' \
-    #  --header 'authorization: Basic YWRtaW46YWRtaW4=' \
-    #  --header 'cache-control: no-cache' \
-    #  --header 'content-type: application/vnd.yang.data+json' \
-    #  --data '{ "openmano": { "host": "'$RO_CONTAINER_IP'", "port": "9090", "tenant-id": "'$RO_TENANT_ID'" }, "name": "osmopenmano", "account-type": "openmano" }')
-
-    result=$(curl -k --request PUT \
-      --url https://$SO_CONTAINER_IP:8008/api/config/project/default/ro-account/account \
-      --header 'accept: application/vnd.yang.data+json' \
-      --header 'authorization: Basic YWRtaW46YWRtaW4=' \
-      --header 'cache-control: no-cache'   \
-      --header 'content-type: application/vnd.yang.data+json' \
-      --data '{"rw-ro-account:account": [ { "openmano": { "host": "'$RO_CONTAINER_IP'", "port": "9090", "tenant-id": "'$RO_TENANT_ID'"}, "name": "osmopenmano", "ro-account-type": "openmano" }]}')
-    [[ $result =~ .*success.* ]] || FATAL "Failed resource-orchestrator configuration: $result"
-
-    result=$(curl -k --request PATCH \
-      --url https://$SO_CONTAINER_IP:8008/v2/api/config/openidc-provider-config/rw-ui-client/redirect-uri \
-      --header 'accept: application/vnd.yang.data+json' \
-      --header 'authorization: Basic YWRtaW46YWRtaW4=' \
-      --header 'cache-control: no-cache'   \
-      --header 'content-type: application/vnd.yang.data+json' \
-      --data '{"redirect-uri": "https://'$DEFAULT_IP':8443/callback" }')
-    [[ $result =~ .*success.* ]] || FATAL "Failed redirect-uri configuration: $result"
-
-    result=$(curl -k --request PATCH \
-      --url https://$SO_CONTAINER_IP:8008/v2/api/config/openidc-provider-config/rw-ui-client/post-logout-redirect-uri \
-      --header 'accept: application/vnd.yang.data+json' \
-      --header 'authorization: Basic YWRtaW46YWRtaW4=' \
-      --header 'cache-control: no-cache'   \
-      --header 'content-type: application/vnd.yang.data+json' \
-      --data '{"post-logout-redirect-uri": "https://'$DEFAULT_IP':8443/?api_server=https://'$DEFAULT_IP'" }')
-    [[ $result =~ .*success.* ]] || FATAL "Failed post-logout-redirect-uri configuration: $result"
-
-    lxc exec SO-ub -- tee /etc/network/interfaces.d/60-rift.cfg <<EOF
-auto lo:1
-iface lo:1 inet static
-        address  $DEFAULT_IP
-        netmask 255.255.255.255
-EOF
-    lxc exec SO-ub ifup lo:1
-}
-
-#Configure RO, VCA, and SO with the initial configuration:
-#  RO -> tenant:osm, logs to be sent to SO
-#  VCA -> juju-password
-#  SO -> route to Juju Controller, add RO account, add VCA account
-function configure(){
-    #Configure components
-    echo -e "\nConfiguring components"
-    configure_RO
-    configure_VCA
-    configure_SOUI
-}
-
 function install_lxd() {
-    sudo apt-get update
-    sudo apt-get install -y lxd
-    newgrp lxd
-    lxd init --auto
-    lxd waitready
-    lxc network create lxdbr0 ipv4.address=auto ipv4.nat=true ipv6.address=none ipv6.nat=false
-    DEFAULT_INTERFACE=$(route -n | awk '$1~/^0.0.0.0/ {print $8}')
+    # Apply sysctl production values for optimal performance
+    sudo cp /usr/share/osm-devops/installers/60-lxd-production.conf /etc/sysctl.d/60-lxd-production.conf
+    sudo sysctl --system
+
+    # Install LXD snap
+    sudo apt-get remove --purge -y liblxc1 lxc-common lxcfs lxd lxd-client
+    sudo snap install lxd
+    sudo apt-get install zfsutils-linux -y
+
+    # Configure LXD
+    sudo usermod -a -G lxd `whoami`
+    cat /usr/share/osm-devops/installers/lxd-preseed.conf | sed 's/^config: {}/config:\n  core.https_address: '$DEFAULT_IP':8443/' | sg lxd -c "lxd init --preseed"
+    sg lxd -c "lxd waitready"
+    DEFAULT_INTERFACE=$(ip route list|awk '$1=="default" {print $5}')
+    [ -z "$DEFAULT_INTERFACE" ] && DEFAULT_INTERFACE=$(route -n |awk '$1~/^0.0.0.0/ {print $8}')
     DEFAULT_MTU=$(ip addr show $DEFAULT_INTERFACE | perl -ne 'if (/mtu\s(\d+)/) {print $1;}')
-    lxc profile device set default eth0 mtu $DEFAULT_MTU
+    sg lxd -c "lxc profile device set default eth0 mtu $DEFAULT_MTU"
     #sudo systemctl stop lxd-bridge
     #sudo systemctl --system daemon-reload
     #sudo systemctl enable lxd-bridge
@@ -564,19 +288,6 @@ function ask_user(){
     done
 }
 
-function launch_container_from_lxd(){
-    export OSM_MDG=$1
-    OSM_load_config
-    export OSM_BASE_IMAGE=$2
-    if ! container_exists $OSM_BUILD_CONTAINER; then
-        CONTAINER_OPTS=""
-        [[ "$OSM_BUILD_CONTAINER_PRIVILEGED" == yes ]] && CONTAINER_OPTS="$CONTAINER_OPTS -c security.privileged=true"
-        [[ "$OSM_BUILD_CONTAINER_ALLOW_NESTED" == yes ]] && CONTAINER_OPTS="$CONTAINER_OPTS -c security.nesting=true"
-        create_container $OSM_BASE_IMAGE $OSM_BUILD_CONTAINER $CONTAINER_OPTS
-        wait_container_up $OSM_BUILD_CONTAINER
-    fi
-}
-
 function install_osmclient(){
     CLIENT_RELEASE=${RELEASE#"-R "}
     CLIENT_REPOSITORY_KEY="OSM%20ETSI%20Release%20Key.gpg"
@@ -620,12 +331,12 @@ function install_prometheus_nodeexporter(){
                 echo "Creating user node_exporter"
                 sudo useradd --no-create-home --shell /bin/false node_exporter
             fi
-            sudo wget -q https://github.com/prometheus/node_exporter/releases/download/v$PROMETHEUS_NODE_EXPORTER_TAG/node_exporter-$PROMETHEUS_NODE_EXPORTER_TAG.linux-amd64.tar.gz  -P /tmp/
+            wget -q https://github.com/prometheus/node_exporter/releases/download/v$PROMETHEUS_NODE_EXPORTER_TAG/node_exporter-$PROMETHEUS_NODE_EXPORTER_TAG.linux-amd64.tar.gz  -P /tmp/
             sudo tar -C /tmp -xf /tmp/node_exporter-$PROMETHEUS_NODE_EXPORTER_TAG.linux-amd64.tar.gz
             sudo cp /tmp/node_exporter-$PROMETHEUS_NODE_EXPORTER_TAG.linux-amd64/node_exporter /usr/local/bin
             sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
-            sudo rm -rf node_exporter-$PROMETHEUS_NODE_EXPORTER_TAG.linux-amd64*
-            sudo cp ${OSM_DEVOPS}/installers/docker/files/node_exporter.service /etc/systemd/system/node_exporter.service
+            sudo rm -rf /tmp/node_exporter-$PROMETHEUS_NODE_EXPORTER_TAG.linux-amd64*
+            sudo cp ${OSM_DEVOPS}/installers/docker/prometheus/node_exporter.service /etc/systemd/system/node_exporter.service
             sudo systemctl daemon-reload
             sudo systemctl restart node_exporter
             sudo systemctl enable node_exporter
@@ -644,41 +355,6 @@ function uninstall_prometheus_nodeexporter(){
     return 0
 }
 
-function install_from_lxdimages(){
-    LXD_RELEASE=${RELEASE#"-R "}
-    if [ -n "$LXD_REPOSITORY_PATH" ]; then
-        LXD_IMAGE_DIR="$LXD_REPOSITORY_PATH"
-    else
-        LXD_IMAGE_DIR="$(mktemp -d -q --tmpdir "osmimages.XXXXXX")"
-        trap 'rm -rf "$LXD_IMAGE_DIR"' EXIT
-    fi
-    echo -e "\nDeleting previous lxd images if they exist"
-    lxc image show osm-ro &>/dev/null && lxc image delete osm-ro
-    lxc image show osm-vca &>/dev/null && lxc image delete osm-vca
-    lxc image show osm-soui &>/dev/null && lxc image delete osm-soui
-    echo -e "\nImporting osm-ro"
-    [ -z "$LXD_REPOSITORY_PATH" ] && wget -O $LXD_IMAGE_DIR/osm-ro.tar.gz $LXD_REPOSITORY_BASE/$LXD_RELEASE/osm-ro.tar.gz
-    lxc image import $LXD_IMAGE_DIR/osm-ro.tar.gz --alias osm-ro
-    rm -f $LXD_IMAGE_DIR/osm-ro.tar.gz
-    echo -e "\nImporting osm-vca"
-    [ -z "$LXD_REPOSITORY_PATH" ] && wget -O $LXD_IMAGE_DIR/osm-vca.tar.gz $LXD_REPOSITORY_BASE/$LXD_RELEASE/osm-vca.tar.gz
-    lxc image import $LXD_IMAGE_DIR/osm-vca.tar.gz --alias osm-vca
-    rm -f $LXD_IMAGE_DIR/osm-vca.tar.gz
-    echo -e "\nImporting osm-soui"
-    [ -z "$LXD_REPOSITORY_PATH" ] && wget -O $LXD_IMAGE_DIR/osm-soui.tar.gz $LXD_REPOSITORY_BASE/$LXD_RELEASE/osm-soui.tar.gz
-    lxc image import $LXD_IMAGE_DIR/osm-soui.tar.gz --alias osm-soui
-    rm -f $LXD_IMAGE_DIR/osm-soui.tar.gz
-    launch_container_from_lxd RO osm-ro
-    ro_is_up && track RO
-    launch_container_from_lxd VCA osm-vca
-    vca_is_up && track VCA
-    launch_container_from_lxd MON osm-mon
-    mon_is_up && track MON
-    launch_container_from_lxd SO osm-soui
-    #so_is_up && track SOUI
-    track SOUI
-}
-
 function install_docker_ce() {
     # installs and configures Docker CE
     echo "Installing Docker CE ..."
@@ -710,7 +386,6 @@ function install_docker_compose() {
 function install_juju() {
     echo "Installing juju"
     sudo snap install juju --classic
-    [ -z "$INSTALL_NOLXD" ] && sudo dpkg-reconfigure -p medium lxd
     [[ ":$PATH": != *":/snap/bin:"* ]] && PATH="/snap/bin:${PATH}"
     echo "Finished installation of juju"
     return 0
@@ -720,15 +395,13 @@ function juju_createcontroller() {
     if ! juju show-controller $OSM_STACK_NAME &> /dev/null; then
         # Not found created, create the controller
         sudo usermod -a -G lxd ${USER}
-        sg lxd -c "juju bootstrap --bootstrap-series=xenial localhost $OSM_STACK_NAME"
+    sg lxd -c "juju bootstrap $OSM_VCA_CLOUDNAME $OSM_STACK_NAME"
     fi
     [ $(juju controllers | awk "/^${OSM_STACK_NAME}[\*| ]/{print $1}"|wc -l) -eq 1 ] || FATAL "Juju installation failed"
 }
 
 function juju_createproxy() {
-    echo -e "\nChecking required packages: iptables-persistent"
-    dpkg -l iptables-persistent &>/dev/null || ! echo -e "    Not installed.\nInstalling iptables-persistent requires root privileges" || \
-    sudo apt-get -yq install iptables-persistent
+    check_install_iptables_persistent
 
     if ! sudo iptables -t nat -C PREROUTING -p tcp -m tcp -d $DEFAULT_IP --dport 17070 -j DNAT --to-destination $OSM_VCA_HOST; then
         sudo iptables -t nat -A PREROUTING -p tcp -m tcp -d $DEFAULT_IP --dport 17070 -j DNAT --to-destination $OSM_VCA_HOST
@@ -793,6 +466,14 @@ function generate_docker_images() {
         sg docker -c "docker build ${LWTEMPDIR}/POL -f ${LWTEMPDIR}/POL/docker/Dockerfile -t ${DOCKER_USER}/pol --no-cache" || FATAL "cannot build POL docker image"
     fi
 
+    if [ -n "$PULL_IMAGES" -a -n "$INSTALL_PLA" ]; then
+        sg docker -c "docker pull ${DOCKER_USER}/pla:${OSM_DOCKER_TAG}" || FATAL "cannot pull PLA docker image"
+    elif [ -z "$TO_REBUILD" -a -n "$INSTALL_PLA" ] || echo $TO_REBUILD | grep -q PLA ; then
+        git -C ${LWTEMPDIR} clone https://osm.etsi.org/gerrit/osm/PLA
+        git -C ${LWTEMPDIR}/PLA checkout ${COMMIT_ID}
+        sg docker -c "docker build ${LWTEMPDIR}/PLA -f ${LWTEMPDIR}/PLA/docker/Dockerfile -t ${DOCKER_USER}/pla --no-cache" || FATAL "cannot build PLA docker image"
+    fi
+
     if [ -n "$PULL_IMAGES" ]; then
         sg docker -c "docker pull ${DOCKER_USER}/nbi:${OSM_DOCKER_TAG}" || FATAL "cannot pull NBI docker image"
         sg docker -c "docker pull ${DOCKER_USER}/keystone:${OSM_DOCKER_TAG}" || FATAL "cannot pull KEYSTONE docker image"
@@ -871,13 +552,24 @@ function generate_docker_env_files() {
     else
         # Docker-compose
         $WORKDIR_SUDO cp -b ${OSM_DEVOPS}/installers/docker/docker-compose.yaml $OSM_DOCKER_WORK_DIR/docker-compose.yaml
+        if [ -n "$INSTALL_PLA" ]; then
+            $WORKDIR_SUDO cp -b ${OSM_DEVOPS}/installers/docker/osm_pla/docker-compose.yaml $OSM_DOCKER_WORK_DIR/osm_pla/docker-compose.yaml
+        fi
+
+        # Prometheus files
+        $WORKDIR_SUDO mkdir -p $OSM_DOCKER_WORK_DIR/prometheus
+        $WORKDIR_SUDO cp -b ${OSM_DEVOPS}/installers/docker/prometheus/prometheus.yml $OSM_DOCKER_WORK_DIR/prometheus/prometheus.yml
 
-        # Prometheus
-        $WORKDIR_SUDO cp -b ${OSM_DEVOPS}/installers/docker/files/prometheus.yml $OSM_DOCKER_WORK_DIR/prometheus.yml
+        # Grafana files
+        $WORKDIR_SUDO mkdir -p $OSM_DOCKER_WORK_DIR/grafana
+        $WORKDIR_SUDO cp -b ${OSM_DEVOPS}/installers/docker/grafana/dashboards-osm.yml $OSM_DOCKER_WORK_DIR/grafana/dashboards-osm.yml
+        $WORKDIR_SUDO cp -b ${OSM_DEVOPS}/installers/docker/grafana/datasource-prometheus.yml $OSM_DOCKER_WORK_DIR/grafana/datasource-prometheus.yml
+        $WORKDIR_SUDO cp -b ${OSM_DEVOPS}/installers/docker/grafana/osm-sample-dashboard.json $OSM_DOCKER_WORK_DIR/grafana/osm-sample-dashboard.json
+        $WORKDIR_SUDO cp -b ${OSM_DEVOPS}/installers/docker/grafana/osm-system-dashboard.json $OSM_DOCKER_WORK_DIR/grafana/osm-system-dashboard.json
 
-        # Grafana & Prometheus Exporter files
-        $WORKDIR_SUDO mkdir -p $OSM_DOCKER_WORK_DIR/files
-        $WORKDIR_SUDO cp -b ${OSM_DEVOPS}/installers/docker/files/* $OSM_DOCKER_WORK_DIR/files/
+        # Prometheus Exporters files
+        $WORKDIR_SUDO mkdir -p $OSM_DOCKER_WORK_DIR/prometheus_exporters
+        $WORKDIR_SUDO cp -b ${OSM_DEVOPS}/installers/docker/prometheus_exporters/node_exporter.service $OSM_DOCKER_WORK_DIR/prometheus_exporters/node_exporter.service
     fi
 
     # LCM
@@ -923,6 +615,12 @@ function generate_docker_env_files() {
         echo "# OSMLCM_VCA_APTMIRROR=http://archive.ubuntu.com/ubuntu/" | $WORKDIR_SUDO tee -a $OSM_DOCKER_WORK_DIR/lcm.env
     fi
 
+    if ! grep -Fq "OSMLCM_VCA_CLOUD" $OSM_DOCKER_WORK_DIR/lcm.env; then
+        echo "OSMLCM_VCA_CLOUD=${OSM_VCA_CLOUDNAME}" | $WORKDIR_SUDO tee -a $OSM_DOCKER_WORK_DIR/lcm.env
+    else
+        $WORKDIR_SUDO sed -i "s|OSMLCM_VCA_CLOUD.*|OSMLCM_VCA_CLOUD=${OSM_VCA_CLOUDNAME}|g" $OSM_DOCKER_WORK_DIR/lcm.env
+    fi
+
     # RO
     MYSQL_ROOT_PASSWORD=$(generate_secret)
     if [ ! -f $OSM_DOCKER_WORK_DIR/ro-db.env ]; then
@@ -1054,6 +752,15 @@ function deploy_osm_services() {
     kubectl apply -n $OSM_STACK_NAME -f $OSM_K8S_WORK_DIR
 }
 
+function deploy_osm_pla_service() {
+    # corresponding to parse_yaml
+    [ ! $OSM_DOCKER_TAG == "7" ] && $WORKDIR_SUDO sed -i "s/opensourcemano\/pla:.*/opensourcemano\/pla:$OSM_DOCKER_TAG/g" $OSM_DOCKER_WORK_DIR/osm_pla/pla.yaml
+    # corresponding to namespace_vol
+    $WORKDIR_SUDO  sed -i "s#path: /var/lib/osm#path: $OSM_NAMESPACE_VOL#g" $OSM_DOCKER_WORK_DIR/osm_pla/pla.yaml
+    # corresponding to deploy_osm_services
+    kubectl apply -n $OSM_STACK_NAME -f $OSM_DOCKER_WORK_DIR/osm_pla
+}
+
 function parse_yaml() {
     osm_services="nbi lcm ro pol mon light-ui keystone"
     TAG=$1
@@ -1134,7 +841,11 @@ function deploy_lightweight() {
     echo "export GRAFANA_TAG=${GRAFANA_TAG}" | $WORKDIR_SUDO tee --append $OSM_DOCKER_WORK_DIR/osm_ports.sh
 
     pushd $OSM_DOCKER_WORK_DIR
-    sg docker -c ". ./osm_ports.sh; docker stack deploy -c $OSM_DOCKER_WORK_DIR/docker-compose.yaml $OSM_STACK_NAME"
+    if [ -n "$INSTALL_PLA" ]; then
+        sg docker -c ". ./osm_ports.sh; docker stack deploy -c $OSM_DOCKER_WORK_DIR/docker-compose.yaml -c $OSM_DOCKER_WORK_DIR/osm_pla/docker-compose.yaml $OSM_STACK_NAME"
+    else
+        sg docker -c ". ./osm_ports.sh; docker stack deploy -c $OSM_DOCKER_WORK_DIR/docker-compose.yaml $OSM_STACK_NAME"
+    fi
     popd
 
     echo "Finished deployment of lightweight build"
@@ -1194,6 +905,7 @@ function install_lightweight() {
     [ "${OSM_STACK_NAME}" == "osm" ] || OSM_DOCKER_WORK_DIR="$OSM_WORK_DIR/stack/$OSM_STACK_NAME"
     [ -n "$KUBERNETES" ] && OSM_K8S_WORK_DIR="$OSM_DOCKER_WORK_DIR/osm_pods" && OSM_NAMESPACE_VOL="${OSM_HOST_VOL}/${OSM_STACK_NAME}"
     [ ! -d "$OSM_DOCKER_WORK_DIR" ] && $WORKDIR_SUDO mkdir -p $OSM_DOCKER_WORK_DIR
+    [ ! -d "$OSM_DOCKER_WORK_DIR/osm_pla" -a -n "$INSTALL_PLA" ] && $WORKDIR_SUDO mkdir -p $OSM_DOCKER_WORK_DIR/osm_pla
     [ -n "$KUBERNETES" ] && $WORKDIR_SUDO cp -b $OSM_DEVOPS/installers/docker/cluster-config.yaml $OSM_DOCKER_WORK_DIR/cluster-config.yaml
 
     track checkingroot
@@ -1218,15 +930,16 @@ function install_lightweight() {
     echo "Installing lightweight build of OSM"
     LWTEMPDIR="$(mktemp -d -q --tmpdir "installosmlight.XXXXXX")"
     trap 'rm -rf "${LWTEMPDIR}"' EXIT
-    DEFAULT_IF=`route -n |awk '$1~/^0.0.0.0/ {print $8}'`
+    DEFAULT_IF=$(ip route list|awk '$1=="default" {print $5}')
+    [ -z "$DEFAULT_IF" ] && DEFAULT_IF=$(route -n |awk '$1~/^0.0.0.0/ {print $8}')
     [ -z "$DEFAULT_IF" ] && FATAL "Not possible to determine the interface with the default route 0.0.0.0"
     DEFAULT_IP=`ip -o -4 a |grep ${DEFAULT_IF}|awk '{split($4,a,"/"); print a[1]}'`
     [ -z "$DEFAULT_IP" ] && FATAL "Not possible to determine the IP address of the interface with the default route"
     DEFAULT_MTU=$(ip addr show ${DEFAULT_IF} | perl -ne 'if (/mtu\s(\d+)/) {print $1;}')
 
     # if no host is passed in, we need to install lxd/juju, unless explicilty asked not to
-    if [ -z "$OSM_VCA_HOST" ] && [ -z "$INSTALL_NOLXD" ]; then
-        need_packages_lw="lxd snapd"
+    if [ -z "$OSM_VCA_HOST" ] && [ -z "$INSTALL_NOLXD" ] && [ -z "$LXD_CLOUD_FILE" ]; then
+        need_packages_lw="snapd"
         echo -e "Checking required packages: $need_packages_lw"
         dpkg -l $need_packages_lw &>/dev/null \
           || ! echo -e "One or several required packages are not installed. Updating apt cache requires root privileges." \
@@ -1236,21 +949,70 @@ function install_lightweight() {
           || ! echo -e "Installing $need_packages_lw requires root privileges." \
           || sudo apt-get install -y $need_packages_lw \
           || FATAL "failed to install $need_packages_lw"
+        install_lxd
     fi
+
     track prereqok
 
     [ -z "$INSTALL_NOJUJU" ] && install_juju
     track juju_install
 
     if [ -z "$OSM_VCA_HOST" ]; then
-        juju_createcontroller
-        OSM_VCA_HOST=`sg lxd -c "juju show-controller $OSM_STACK_NAME"|grep api-endpoints|awk -F\' '{print $2}'|awk -F\: '{print $1}'`
+        if [ -z "$CONTROLLER_NAME" ]; then
+            if [ -n "$LXD_CLOUD_FILE" ]; then
+                [ -z "$LXD_CRED_FILE" ] && FATAL "The installer needs the LXD credential yaml if the LXD is external"
+                OSM_VCA_CLOUDNAME="lxd-cloud"
+                juju add-cloud $OSM_VCA_CLOUDNAME $LXD_CLOUD_FILE --force || juju update-cloud $OSM_VCA_CLOUDNAME --client -f $LXD_CLOUD_FILE
+                juju add-credential $OSM_VCA_CLOUDNAME -f $LXD_CRED_FILE || juju update-credential $OSM_VCA_CLOUDNAME lxd-cloud-creds -f $LXD_CRED_FILE
+            fi
+            juju_createcontroller
+        else
+            OSM_VCA_CLOUDNAME="lxd-cloud"
+            if [ -n "$LXD_CLOUD_FILE" ]; then
+                [ -z "$LXD_CRED_FILE" ] && FATAL "The installer needs the LXD credential yaml if the LXD is external"
+                juju add-cloud -c $CONTROLLER_NAME $OSM_VCA_CLOUDNAME $LXD_CLOUD_FILE --force || juju update-cloud lxd-cloud -c $CONTROLLER_NAME -f $LXD_CLOUD_FILE
+                juju add-credential -c $CONTROLLER_NAME $OSM_VCA_CLOUDNAME -f $LXD_CRED_FILE || juju update-credential lxd-cloud -c $CONTROLLER_NAME -f $LXD_CRED_FILE
+            else
+                mkdir -p ~/.osm
+                cat << EOF > ~/.osm/lxd-cloud.yaml
+clouds:
+  lxd-cloud:
+    type: lxd
+    auth-types: [certificate]
+    endpoint: "https://$DEFAULT_IP:8443"
+    config:
+      ssl-hostname-verification: false
+EOF
+                openssl req -nodes -new -x509 -keyout ~/.osm/client.key -out ~/.osm/client.crt -days 365 -subj "/C=FR/ST=Nice/L=Nice/O=ETSI/OU=OSM/CN=osm.etsi.org"
+                local server_cert=`cat /var/snap/lxd/common/lxd/server.crt | sed 's/^/        /'`
+                local client_cert=`cat ~/.osm/client.crt | sed 's/^/        /'`
+                local client_key=`cat ~/.osm/client.key | sed 's/^/        /'`
+                cat << EOF > ~/.osm/lxd-credentials.yaml
+credentials:
+  lxd-cloud:
+    lxd-cloud:
+      auth-type: certificate
+      server-cert: |
+$server_cert
+      client-cert: |
+$client_cert
+      client-key: |
+$client_key
+EOF
+                lxc config trust add local: ~/.osm/client.crt
+                juju add-cloud -c $CONTROLLER_NAME $OSM_VCA_CLOUDNAME ~/.osm/lxd-cloud.yaml --force || juju update-cloud lxd-cloud -c $CONTROLLER_NAME -f ~/.osm/lxd-cloud.yaml
+                juju add-credential -c $CONTROLLER_NAME $OSM_VCA_CLOUDNAME -f ~/.osm/lxd-credentials.yaml || juju update-credential lxd-cloud -c $CONTROLLER_NAME -f ~/.osm/lxd-credentials.yaml
+            fi
+        fi
+        [ -z "$CONTROLLER_NAME" ] && OSM_VCA_HOST=`sg lxd -c "juju show-controller $OSM_STACK_NAME"|grep api-endpoints|awk -F\' '{print $2}'|awk -F\: '{print $1}'`
+        [ -n "$CONTROLLER_NAME" ] && OSM_VCA_HOST=`juju show-controller $CONTROLLER_NAME |grep api-endpoints|awk -F\' '{print $2}'|awk -F\: '{print $1}'`
         [ -z "$OSM_VCA_HOST" ] && FATAL "Cannot obtain juju controller IP address"
     fi
     track juju_controller
 
     if [ -z "$OSM_VCA_SECRET" ]; then
-        OSM_VCA_SECRET=$(parse_juju_password $OSM_STACK_NAME)
+        [ -z "$CONTROLLER_NAME" ] && OSM_VCA_SECRET=$(parse_juju_password $OSM_STACK_NAME)
+        [ -n "$CONTROLLER_NAME" ] && OSM_VCA_SECRET=$(parse_juju_password $CONTROLLER_NAME)
         [ -z "$OSM_VCA_SECRET" ] && FATAL "Cannot obtain juju secret"
     fi
     if [ -z "$OSM_VCA_PUBKEY" ]; then
@@ -1258,7 +1020,8 @@ function install_lightweight() {
         [ -z "$OSM_VCA_PUBKEY" ] && FATAL "Cannot obtain juju public key"
     fi
     if [ -z "$OSM_VCA_CACERT" ]; then
-       OSM_VCA_CACERT=$(juju controllers --format json | jq -r '.controllers["osm"]["ca-cert"]' | base64 | tr -d \\n)
+        [ -z "$CONTROLLER_NAME" ] && OSM_VCA_CACERT=$(juju controllers --format json | jq -r --arg controller $OSM_STACK_NAME '.controllers[$controller]["ca-cert"]' | base64 | tr -d \\n)
+        [ -n "$CONTROLLER_NAME" ] && OSM_VCA_CACERT=$(juju controllers --format json | jq -r --arg controller $CONTROLLER_NAME '.controllers[$controller]["ca-cert"]' | base64 | tr -d \\n)
        [ -z "$OSM_VCA_CACERT" ] && FATAL "Cannot obtain juju CA certificate"
     fi
     if [ -z "$OSM_VCA_APIPROXY" ]; then
@@ -1295,7 +1058,7 @@ function install_lightweight() {
     generate_docker_env_files
 
     if [ -n "$KUBERNETES" ]; then
-        if [ -n "$K8S_MONITOR" ]; then
+        if [ -n "$INSTALL_K8S_MONITOR" ]; then
             # uninstall OSM MONITORING
             uninstall_k8s_monitoring
             track uninstall_k8s_monitoring
@@ -1307,8 +1070,12 @@ function install_lightweight() {
         [ ! $OSM_DOCKER_TAG == "7" ] && parse_yaml $OSM_DOCKER_TAG
         namespace_vol
         deploy_osm_services
+        if [ -n "$INSTALL_PLA"]; then
+            # optional PLA install
+            deploy_osm_pla_service
+        fi
         track deploy_osm_services_k8s
-        if [ -n "$K8S_MONITOR" ]; then
+        if [ -n "$INSTALL_K8S_MONITOR" ]; then
             # install OSM MONITORING
             install_k8s_monitoring
             track install_k8s_monitoring
@@ -1338,6 +1105,8 @@ function install_vimemu() {
     echo "\nInstalling vim-emu"
     EMUTEMPDIR="$(mktemp -d -q --tmpdir "installosmvimemu.XXXXXX")"
     trap 'rm -rf "${EMUTEMPDIR}"' EXIT
+    # install prerequisites (OVS is a must for the emulator to work)
+    sudo apt-get install openvswitch-switch
     # clone vim-emu repository (attention: branch is currently master only)
     echo "Cloning vim-emu repository ..."
     git clone https://osm.etsi.org/gerrit/osm/vim-emu.git $EMUTEMPDIR
@@ -1380,19 +1149,17 @@ function dump_vars(){
     echo "DEVELOP=$DEVELOP"
     echo "INSTALL_FROM_SOURCE=$INSTALL_FROM_SOURCE"
     echo "UNINSTALL=$UNINSTALL"
-    echo "NAT=$NAT"
     echo "UPDATE=$UPDATE"
     echo "RECONFIGURE=$RECONFIGURE"
     echo "TEST_INSTALLER=$TEST_INSTALLER"
     echo "INSTALL_VIMEMU=$INSTALL_VIMEMU"
+    echo "INSTALL_PLA=$INSTALL_PLA"
     echo "INSTALL_LXD=$INSTALL_LXD"
-    echo "INSTALL_FROM_LXDIMAGES=$INSTALL_FROM_LXDIMAGES"
-    echo "LXD_REPOSITORY_BASE=$LXD_REPOSITORY_BASE"
-    echo "LXD_REPOSITORY_PATH=$LXD_REPOSITORY_PATH"
     echo "INSTALL_LIGHTWEIGHT=$INSTALL_LIGHTWEIGHT"
     echo "INSTALL_ONLY=$INSTALL_ONLY"
     echo "INSTALL_ELK=$INSTALL_ELK"
     #echo "INSTALL_PERFMON=$INSTALL_PERFMON"
+    echo "INSTALL_K8S_MONITOR=$INSTALL_K8S_MONITOR"
     echo "TO_REBUILD=$TO_REBUILD"
     echo "INSTALL_NOLXD=$INSTALL_NOLXD"
     echo "INSTALL_NODOCKER=$INSTALL_NODOCKER"
@@ -1401,7 +1168,6 @@ function dump_vars(){
     echo "REPOSITORY=$REPOSITORY"
     echo "REPOSITORY_BASE=$REPOSITORY_BASE"
     echo "REPOSITORY_KEY=$REPOSITORY_KEY"
-    echo "NOCONFIGURE=$NOCONFIGURE"
     echo "OSM_DEVOPS=$OSM_DEVOPS"
     echo "OSM_VCA_HOST=$OSM_VCA_HOST"
     echo "OSM_VCA_SECRET=$OSM_VCA_SECRET"
@@ -1435,7 +1201,6 @@ function track(){
 
 UNINSTALL=""
 DEVELOP=""
-NAT=""
 UPDATE=""
 RECONFIGURE=""
 TEST_INSTALLER=""
@@ -1447,7 +1212,7 @@ INSTALL_FROM_SOURCE=""
 RELEASE="ReleaseSEVEN"
 REPOSITORY="stable"
 INSTALL_VIMEMU=""
-INSTALL_FROM_LXDIMAGES=""
+INSTALL_PLA=""
 LXD_REPOSITORY_BASE="https://osm-download.etsi.org/repository/osm/lxd"
 LXD_REPOSITORY_PATH=""
 INSTALL_LIGHTWEIGHT="y"
@@ -1458,15 +1223,14 @@ INSTALL_NOLXD=""
 INSTALL_NODOCKER=""
 INSTALL_NOJUJU=""
 KUBERNETES=""
-K8S_MONITOR=""
+INSTALL_K8S_MONITOR=""
 INSTALL_NOHOSTCLIENT=""
-NOCONFIGURE=""
-RELEASE_DAILY=""
 SESSION_ID=`date +%s`
 OSM_DEVOPS=
 OSM_VCA_HOST=
 OSM_VCA_SECRET=
 OSM_VCA_PUBKEY=
+OSM_VCA_CLOUDNAME="localhost"
 OSM_STACK_NAME=osm
 NO_HOST_PORTS=""
 DOCKER_NOBUILD=""
@@ -1494,7 +1258,7 @@ POD_NETWORK_CIDR=10.244.0.0/16
 K8S_MANIFEST_DIR="/etc/kubernetes/manifests"
 RE_CHECK='^[a-z0-9]([-a-z0-9]*[a-z0-9])?$'
 
-while getopts ":b:r:c:k:u:R:l:p:D:o:m:H:S:s:w:t:U:P:A:-: hy" o; do
+while getopts ":b:r:c:k:u:R:D:o:m:H:S:s:w:t:U:P:A:l:L:K:-: hy" o; do
     case "${o}" in
         b)
             COMMIT_ID=${OPTARG}
@@ -1522,12 +1286,6 @@ while getopts ":b:r:c:k:u:R:l:p:D:o:m:H:S:s:w:t:U:P:A:-: hy" o; do
             RELEASE="${OPTARG}"
             REPO_ARGS+=(-R "$RELEASE")
             ;;
-        l)
-            LXD_REPOSITORY_BASE="${OPTARG}"
-            ;;
-        p)
-            LXD_REPOSITORY_PATH="${OPTARG}"
-            ;;
         D)
             OSM_DEVOPS="${OPTARG}"
             ;;
@@ -1535,6 +1293,7 @@ while getopts ":b:r:c:k:u:R:l:p:D:o:m:H:S:s:w:t:U:P:A:-: hy" o; do
             INSTALL_ONLY="y"
             [ "${OPTARG}" == "vimemu" ] && INSTALL_VIMEMU="y" && continue
             [ "${OPTARG}" == "elk_stack" ] && INSTALL_ELK="y" && continue
+            [ "${OPTARG}" == "k8s_monitor" ] && INSTALL_K8S_MONITOR="y" && continue
             ;;
         m)
             [ "${OPTARG}" == "LW-UI" ] && TO_REBUILD="$TO_REBUILD LW-UI" && continue
@@ -1550,6 +1309,7 @@ while getopts ":b:r:c:k:u:R:l:p:D:o:m:H:S:s:w:t:U:P:A:-: hy" o; do
             [ "${OPTARG}" == "KEYSTONE-DB" ] && TO_REBUILD="$TO_REBUILD KEYSTONE-DB" && continue
             [ "${OPTARG}" == "GRAFANA" ] && TO_REBUILD="$TO_REBUILD GRAFANA" && continue
             [ "${OPTARG}" == "NONE" ] && TO_REBUILD="$TO_REBUILD NONE" && continue
+            [ "${OPTARG}" == "PLA" ] && TO_REBUILD="$TO_REBUILD PLA" && continue
             ;;
         H)
             OSM_VCA_HOST="${OPTARG}"
@@ -1577,32 +1337,44 @@ while getopts ":b:r:c:k:u:R:l:p:D:o:m:H:S:s:w:t:U:P:A:-: hy" o; do
         A)
             OSM_VCA_APIPROXY="${OPTARG}"
             ;;
+        l)
+            LXD_CLOUD_FILE="${OPTARG}"
+            ;;
+        L)
+            LXD_CRED_FILE="${OPTARG}"
+            ;;
+        K)
+            CONTROLLER_NAME="${OPTARG}"
+            ;;
         -)
             [ "${OPTARG}" == "help" ] && usage && exit 0
             [ "${OPTARG}" == "source" ] && INSTALL_FROM_SOURCE="y" && PULL_IMAGES="" && continue
             [ "${OPTARG}" == "develop" ] && DEVELOP="y" && continue
             [ "${OPTARG}" == "uninstall" ] && UNINSTALL="y" && continue
-            [ "${OPTARG}" == "nat" ] && NAT="y" && continue
             [ "${OPTARG}" == "update" ] && UPDATE="y" && continue
             [ "${OPTARG}" == "reconfigure" ] && RECONFIGURE="y" && continue
             [ "${OPTARG}" == "test" ] && TEST_INSTALLER="y" && continue
             [ "${OPTARG}" == "lxdinstall" ] && INSTALL_LXD="y" && continue
             [ "${OPTARG}" == "nolxd" ] && INSTALL_NOLXD="y" && continue
             [ "${OPTARG}" == "nodocker" ] && INSTALL_NODOCKER="y" && continue
-            [ "${OPTARG}" == "lxdimages" ] && INSTALL_FROM_LXDIMAGES="y" && continue
             [ "${OPTARG}" == "lightweight" ] && INSTALL_LIGHTWEIGHT="y" && continue
-            [ "${OPTARG}" == "soui" ] && INSTALL_LIGHTWEIGHT="" && RELEASE="-R ReleaseTHREE" && REPOSITORY="-r stable" && continue
             [ "${OPTARG}" == "vimemu" ] && INSTALL_VIMEMU="y" && continue
             [ "${OPTARG}" == "elk_stack" ] && INSTALL_ELK="y" && continue
-            [ "${OPTARG}" == "noconfigure" ] && NOCONFIGURE="y" && continue
             [ "${OPTARG}" == "showopts" ] && SHOWOPTS="y" && continue
-            [ "${OPTARG}" == "daily" ] && RELEASE_DAILY="y" && continue
             [ "${OPTARG}" == "nohostports" ] && NO_HOST_PORTS="y" && continue
             [ "${OPTARG}" == "nojuju" ] && INSTALL_NOJUJU="y" && continue
             [ "${OPTARG}" == "nodockerbuild" ] && DOCKER_NOBUILD="y" && continue
             [ "${OPTARG}" == "nohostclient" ] && INSTALL_NOHOSTCLIENT="y" && continue
             [ "${OPTARG}" == "pullimages" ] && continue
-            [ "${OPTARG}" == "k8s_monitor" ] && K8S_MONITOR="y" && continue
+            [ "${OPTARG}" == "k8s_monitor" ] && INSTALL_K8S_MONITOR="y" && continue
+            [ "${OPTARG}" == "charmed" ] && CHARMED="y" && continue
+            [ "${OPTARG}" == "bundle" ] && continue
+            [ "${OPTARG}" == "kubeconfig" ] && continue
+            [ "${OPTARG}" == "lxdendpoint" ] && continue
+            [ "${OPTARG}" == "lxdcert" ] && continue
+            [ "${OPTARG}" == "microstack" ] && continue
+            [ "${OPTARG}" == "tag" ] && continue
+            [ "${OPTARG}" == "pla" ] && INSTALL_PLA="y" && continue
             echo -e "Invalid option: '--$OPTARG'\n" >&2
             usage && exit 1
             ;;
@@ -1626,26 +1398,44 @@ while getopts ":b:r:c:k:u:R:l:p:D:o:m:H:S:s:w:t:U:P:A:-: hy" o; do
     esac
 done
 
-[ -n "$INSTALL_FROM_LXDIMAGES" ] && [ -n "$INSTALL_LIGHTWEIGHT" ] && FATAL "Incompatible options: --lxd can only be used with --soui"
-[ -n "$NAT" ] && [ -n "$INSTALL_LIGHTWEIGHT" ] && FATAL "Incompatible options: --nat can only be used with --soui"
-[ -n "$NOCONFIGURE" ] && [ -n "$INSTALL_LIGHTWEIGHT" ] && FATAL "Incompatible options: --noconfigure can only be used with --soui"
-[ -n "$RELEASE_DAILY" ] && [ -n "$INSTALL_LIGHTWEIGHT" ] && FATAL "Incompatible options: --daily can only be used with --soui"
-[ -n "$INSTALL_NOLXD" ] && [ -z "$INSTALL_LIGHTWEIGHT" ] && FATAL "Incompatible option: --nolxd cannot be used with --soui"
-[ -n "$INSTALL_NODOCKER" ] && [ -z "$INSTALL_LIGHTWEIGHT" ] && FATAL "Incompatible option: --nodocker cannot be used with --soui"
-[ -n "$TO_REBUILD" ] && [ -z "$INSTALL_LIGHTWEIGHT" ] && FATAL "Incompatible option: -m cannot be used with --soui"
 [ -n "$TO_REBUILD" ] && [ "$TO_REBUILD" != " NONE" ] && echo $TO_REBUILD | grep -q NONE && FATAL "Incompatible option: -m NONE cannot be used with other -m options"
+[ -n "$TO_REBUILD" ] && [ "$TO_REBUILD" == " PLA" ] && [ -z "$INSTALL_PLA" ] && FATAL "Incompatible option: -m PLA cannot be used without --pla option"
 
 if [ -n "$SHOWOPTS" ]; then
     dump_vars
     exit 0
 fi
 
-[ -n "$RELEASE_DAILY" ] && echo -e "\nInstalling from daily build repo" && RELEASE="-R ReleaseTHREE-daily" && REPOSITORY="-r testing" && COMMIT_ID="master"
+if [ -n "$CHARMED" ]; then
+     if [ -n "$UNINSTALL" ]; then
+        /usr/share/osm-devops/installers/charmed_uninstall.sh -R $RELEASE -r $REPOSITORY -u $REPOSITORY_BASE -D /usr/share/osm-devops -t $DOCKER_TAG "$@"
+     else
+        /usr/share/osm-devops/installers/charmed_install.sh -R $RELEASE -r $REPOSITORY -u $REPOSITORY_BASE -D /usr/share/osm-devops -t $DOCKER_TAG "$@"
+     fi
+
+     echo "Your installation is now complete, follow these steps for configuring the osmclient:"
+     echo
+     echo "1. Get the NBI IP with the following command:"
+     echo
+     echo "juju status --format yaml | yq r - applications.nbi-k8s.address"
+     echo
+     echo "2. Create the OSM_HOSTNAME environment variable with the NBI IP"
+     echo
+     echo "export OSM_HOSTNAME=<NBI-IP>"
+     echo
+     echo "3. Add the previous command to your .bashrc for other Shell sessions"
+     echo
+     echo "export OSM_HOSTNAME=<previous-IP> >> ~/.bashrc"
+     echo
+     echo "DONE"
+
+     exit 0
+fi
 
 # if develop, we force master
 [ -z "$COMMIT_ID" ] && [ -n "$DEVELOP" ] && COMMIT_ID="master"
 
-need_packages="git jq wget curl tar"
+need_packages="git wget curl tar"
 echo -e "Checking required packages: $need_packages"
 dpkg -l $need_packages &>/dev/null \
   || ! echo -e "One or several required packages are not installed. Updating apt cache requires root privileges." \
@@ -1655,7 +1445,7 @@ dpkg -l $need_packages &>/dev/null \
   || ! echo -e "Installing $need_packages requires root privileges." \
   || sudo apt-get install -y $need_packages \
   || FATAL "failed to install $need_packages"
-
+sudo snap install jq
 if [ -z "$OSM_DEVOPS" ]; then
     if [ -n "$TEST_INSTALLER" ]; then
         echo -e "\nUsing local devops repo for OSM installation"
@@ -1684,13 +1474,10 @@ fi
 . $OSM_DEVOPS/common/all_funcs
 
 [ -n "$INSTALL_LIGHTWEIGHT" ] && [ -n "$UNINSTALL" ] && uninstall_lightweight && echo -e "\nDONE" && exit 0
-[ -n "$UNINSTALL" ] && uninstall && echo -e "\nDONE" && exit 0
-[ -n "$NAT" ] && nat && echo -e "\nDONE" && exit 0
-[ -n "$UPDATE" ] && update && echo -e "\nDONE" && exit 0
-[ -n "$RECONFIGURE" ] && configure && echo -e "\nDONE" && exit 0
 [ -n "$INSTALL_ONLY" ] && [ -n "$INSTALL_ELK" ] && deploy_elk
 #[ -n "$INSTALL_ONLY" ] && [ -n "$INSTALL_PERFMON" ] && deploy_perfmon
 [ -n "$INSTALL_ONLY" ] && [ -n "$INSTALL_VIMEMU" ] && install_vimemu
+[ -n "$INSTALL_ONLY" ] && [ -n "$INSTALL_K8S_MONITOR" ] && install_k8s_monitoring
 [ -n "$INSTALL_ONLY" ] && echo -e "\nDONE" && exit 0
 
 #Installation starts here
@@ -1709,43 +1496,8 @@ lxd --version &>/dev/null || FATAL "lxd not present, exiting."
 
 # use local devops for containers
 export OSM_USE_LOCAL_DEVOPS=true
-if [ -n "$INSTALL_FROM_SOURCE" ]; then #install from source
-    echo -e "\nCreating the containers and building from source ..."
-    $OSM_DEVOPS/jenkins/host/start_build RO --notest checkout $COMMIT_ID || FATAL "RO container build failed (refspec: '$COMMIT_ID')"
-    ro_is_up && track RO
-    $OSM_DEVOPS/jenkins/host/start_build VCA || FATAL "VCA container build failed"
-    vca_is_up && track VCA
-    $OSM_DEVOPS/jenkins/host/start_build MON || FATAL "MON install failed"
-    mon_is_up && track MON
-    $OSM_DEVOPS/jenkins/host/start_build SO checkout $COMMIT_ID || FATAL "SO container build failed (refspec: '$COMMIT_ID')"
-    $OSM_DEVOPS/jenkins/host/start_build UI checkout $COMMIT_ID || FATAL "UI container build failed (refspec: '$COMMIT_ID')"
-    #so_is_up && track SOUI
-    track SOUI
-elif [ -n "$INSTALL_FROM_LXDIMAGES" ]; then #install from LXD images stored in OSM repo
-    echo -e "\nInstalling from lxd images ..."
-    install_from_lxdimages
-else #install from binaries
-    echo -e "\nCreating the containers and installing from binaries ..."
-    $OSM_DEVOPS/jenkins/host/install RO ${REPO_ARGS[@]} || FATAL "RO install failed"
-    ro_is_up && track RO
-    $OSM_DEVOPS/jenkins/host/start_build VCA || FATAL "VCA install failed"
-    vca_is_up && track VCA
-    $OSM_DEVOPS/jenkins/host/install MON || FATAL "MON build failed"
-    mon_is_up && track MON
-    $OSM_DEVOPS/jenkins/host/install SO ${REPO_ARGS[@]} || FATAL "SO install failed"
-    $OSM_DEVOPS/jenkins/host/install UI ${REPO_ARGS[@]} || FATAL "UI install failed"
-    #so_is_up && track SOUI
-    track SOUI
-fi
-
-#Install iptables-persistent and configure NAT rules
-[ -z "$NOCONFIGURE" ] && nat
-
-#Configure components
-[ -z "$NOCONFIGURE" ] && configure
 
 #Install osmclient
-[ -z "$NOCONFIGURE" ] && install_osmclient
 
 #Install vim-emu (optional)
 [ -n "$INSTALL_VIMEMU" ] && install_docker_ce && install_vimemu
@@ -1753,3 +1505,4 @@ fi
 wget -q -O- https://osm-download.etsi.org/ftp/osm-7.0-seven/README2.txt &> /dev/null
 track end
 echo -e "\nDONE"
+
index 01d96e9..740ce4c 100755 (executable)
@@ -38,12 +38,16 @@ function usage(){
     echo -e "     -A <VCA apiproxy> use VCA/juju API proxy"
     echo -e "     --vimemu:       additionally deploy the VIM emulator as a docker container"
     echo -e "     --elk_stack:    additionally deploy an ELK docker stack for event logging"
+    echo -e "     --pla:          install the PLA module for placement support"
     echo -e "     --pm_stack:     additionally deploy a Prometheus+Grafana stack for performance monitoring (PM)"
-    echo -e "     -m <MODULE>:    install OSM but only rebuild the specified docker images (LW-UI, NBI, LCM, RO, MON, POL, KAFKA, MONGO, PROMETHEUS, KEYSTONE-DB, NONE)"
+    echo -e "     -m <MODULE>:    install OSM but only rebuild the specified docker images (LW-UI, NBI, LCM, RO, MON, POL, KAFKA, MONGO, PROMETHEUS, KEYSTONE-DB, PLA, NONE)"
     echo -e "     -o <ADDON>:     ONLY (un)installs one of the addons (vimemu, elk_stack, pm_stack)"
     echo -e "     -D <devops path> use local devops installation path"
     echo -e "     -w <work dir>   Location to store runtime installation"
     echo -e "     -t <docker tag> specify osm docker tag (default is latest)"
+    echo -e "     -l:             LXD cloud yaml file"
+    echo -e "     -L:             LXD credentials yaml file"
+    echo -e "     -K:             Specifies the name of the controller to use - The controller must be already bootstrapped"
     echo -e "     --nolxd:        do not install and configure LXD, allowing unattended installations (assumes LXD is already installed and confifured)"
     echo -e "     --nodocker:     do not install docker, do not initialize a swarm (assumes docker is already installed and a swarm has been initialized)"
     echo -e "     --nojuju:       do not juju, assumes already installed"
@@ -64,6 +68,12 @@ function usage(){
     #echo -e "     --clean_volumes To clear all the mounted volumes from docker swarm"
     echo -e "     -y:             do not prompt for confirmation, assumes yes"
     echo -e "     -h / --help:    print this help"
+    echo -e "     --charmed:                       install OSM with charms"
+    echo -e "     --bundle <bundle path>:          Specify with which bundle to deploy OSM with charms (--charmed option)"
+    echo -e "     --kubeconfig <kubeconfig path>:  Specify with which kubernetes to deploy OSM with charms (--charmed option)"
+    echo -e "     --controller <name>:             Specifies the name of the controller to use - The controller must be already bootstrapped (--charmed option)" 
+    echo -e "     --lxd-cloud <yaml path>:         Takes a YAML file as a parameter with the LXD Cloud information (--charmed option)" 
+    echo -e "     --lxd-credentials <yaml path>:   Takes a YAML file as a parameter with the LXD Credentials information (--charmed option)"
 }
 
 add_repo() {
@@ -99,7 +109,7 @@ if [ $? -eq 0 ]; then
 fi
 }
 
-while getopts ":b:r:c:k:u:R:l:p:D:o:m:H:S:s:w:t:U:P:A:-: hy" o; do
+while getopts ":b:r:c:k:u:R:l:L:K:p:D:o:m:H:S:s:w:t:U:P:A:-: hy" o; do
     case "${o}" in
         r)
             REPOSITORY="${OPTARG}"
@@ -115,7 +125,7 @@ while getopts ":b:r:c:k:u:R:l:p:D:o:m:H:S:s:w:t:U:P:A:-: hy" o; do
             ;;
         -)
             [ "${OPTARG}" == "help" ] && usage && exit 0
-           ;;
+            ;;
         :)
             echo "Option -$OPTARG requires an argument" >&2
             usage && exit 1
diff --git a/installers/lxd-preseed.conf b/installers/lxd-preseed.conf
new file mode 100644 (file)
index 0000000..82ed8dc
--- /dev/null
@@ -0,0 +1,44 @@
+#   Copyright 2020 Canonical Ltd.
+#
+#   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.
+
+config: {}
+networks:
+- config:
+    ipv4.address: auto
+    ipv6.address: none
+  description: ""
+  managed: false
+  name: lxdbr0
+  type: ""
+storage_pools:
+- config:
+    size: 100GB
+  description: ""
+  name: default
+  driver: zfs
+profiles:
+- config: {}
+  description: ""
+  devices:
+    eth0:
+      name: eth0
+      nictype: bridged
+      parent: lxdbr0
+      type: nic
+    root:
+      path: /
+      pool: default
+      type: disk
+  name: default
+cluster: null
diff --git a/robot-systest/README.md b/robot-systest/README.md
new file mode 100644 (file)
index 0000000..99e957d
--- /dev/null
@@ -0,0 +1,52 @@
+<!--
+ 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.
+-->
+
+# Robot Framework: Test usage
+
+## Requirements
+
+- OSM client installed (<https://osm.etsi.org/docs/user-guide/03-installing-osm.html#installing-standalone-osm-client>)
+- devops repository cloned in home (<https://osm.etsi.org/gerrit/#/admin/projects/osm/devops>)
+- The descriptor packages used on each test are expected to be in `${PACKAGES_FOLDER}`.
+- A set of environment variables (there is an example file located at devops/robot-systest/environment.rc):
+  - `OSM_HOSTNAME`: IP address of target OSM.
+  - `OS_CLOUD`: Cloud credentialss.
+  - `VIM_TARGET`: VIM where tests will be run.
+  - `VIM_MGMT_NET`: VIM management network, reachable from robot.
+  - `PACKAGES_FOLDER`: Where descriptor packages are located.
+  - `ROBOT_DEVOPS_FOLDER`: Where the devops repository is located.
+  - `ROBOT_REPORT_FOLDER`: Where robot outpul will be placed.
+
+## Installation
+
+```bash
+sudo -H python3 -m pip install --ignore-installed haikunator requests pyvcloud progressbar pathlib robotframework robotframework-seleniumlibrary robotframework-requests robotframework-SSHLibrary
+curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
+sudo add-apt-repository -y "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main"
+sudo apt-get install -y google-chrome-stable chromium-chromedriver
+sudo apt-get install -y python3-openstackclient  # Installs Queens by default
+```
+
+## Usage
+
+Example using hackfest basic test. 
+
+```bash
+
+# Set your environment variables in environment.rc as specified in requirements
+source environment.rc
+
+cd ~/devops/robot-systest
+robot -d ${ROBOT_REPORT_FOLDER} testsuite/hackfest_basic.robot
+```
diff --git a/robot-systest/README_Robot_Test.md b/robot-systest/README_Robot_Test.md
deleted file mode 100644 (file)
index 083e1dd..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-<!--
-Copyright 2019 Tech Mahindra Limited
-
-All Rights Reserved.
-
-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.
--->
-
-
-# Step to run robot framework test standalone linux environment
-
-All installation commands run using root user(`sudo su`)
-## Step 1: Install python packages
-Install below python packages using pip
->pip install python-magic pyangbind haikunator requests pyvcloud progressbar pathlib robotframework robotframework-seleniumlibrary robotframework-requests robotframework-jsonlibrary
-
-## Step 2: Install linux packages
-Install below linux packages
->curl http://osm-download.etsi.org/repository/osm/debian/ReleaseSIX/OSM%20ETSI%20Release%20Key.gpg | apt-key add -
-
->add-apt-repository -y "deb http://osm-download.etsi.org/repository/osm/debian/ReleaseSIX stable devops osmclient IM" && apt update
-
->curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
-
->echo "deb [arch=amd64]  http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list
-
-> apt-get install -y python-osmclient python-osm-im google-chrome-stable chromium-chromedriver
-
->./git-repo/devops/tools/OVF_converter/install.sh
-
-## Step 3: checkout robot seed code
-Checkout devops from gerrit
-> git clone "https://osm.etsi.org/gerrit/osm/devops"
-
-If robot seed code not merged to to master, pull it
-> git pull "https://osm.etsi.org/gerrit/osm/devops" refs/changes/52/7852/4
-
-## Step 4: Set environmet
-for build test need to create env-file and provide below details and for Standalone testing export them
-```
-export OSM_HOSTNAME=<OSM server IP>
-```
-
-OpenStack Details
-```
-export OS_AUTH_URL=<auth url>
-export OS_PASSWORD=<password>
-export OS_PROJECT_NAME=<project name>
-export OS_VIM_CONFIG=<config value>
-```
-
-VCD Details
-```
-export VCD_AUTH_URL=<VCD auth url>
-export VCD_USERNAME=<VCD username>
-export VCD_PASSWORD=<VCD password>
-export VCD_TENANT_NAME=<VCD Tenant name>
-export VCD_ORGANIZATION=<VCD Org name>
-export VCD_VIM_CONFIG=<config value>
-```
-
-Note:- Optional
-```
-export NS_CONFIG=<NS Config Details>
-e.g. export NS_CONFIG="'{vld: [ {name: mgmtnet, vim-network-name: mgmt}]}'"
-```
-
-## Step 5: Run Test
-There are two ways to run the test-case:
-* use `devops/robot-systest/run_test.sh` file and provide test-name(vim/smoke/sanity/comprehensive).
-  > ./devops/robot-systest/run_test.sh -t smoke
-
-* use `robot` command
-  > robot -d path/to/report/dir -i test-tag-to-be-included -e test-tag-to-be-excluded path/to/testsuiet
-  
-  > robot -d devops/robot-systest/reports -i comprehensive devops/robot-systest/testsuite
\ No newline at end of file
diff --git a/robot-systest/deprecated/README_Robot_Test.md b/robot-systest/deprecated/README_Robot_Test.md
new file mode 100644 (file)
index 0000000..083e1dd
--- /dev/null
@@ -0,0 +1,86 @@
+<!--
+Copyright 2019 Tech Mahindra Limited
+
+All Rights Reserved.
+
+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.
+-->
+
+
+# Step to run robot framework test standalone linux environment
+
+All installation commands run using root user(`sudo su`)
+## Step 1: Install python packages
+Install below python packages using pip
+>pip install python-magic pyangbind haikunator requests pyvcloud progressbar pathlib robotframework robotframework-seleniumlibrary robotframework-requests robotframework-jsonlibrary
+
+## Step 2: Install linux packages
+Install below linux packages
+>curl http://osm-download.etsi.org/repository/osm/debian/ReleaseSIX/OSM%20ETSI%20Release%20Key.gpg | apt-key add -
+
+>add-apt-repository -y "deb http://osm-download.etsi.org/repository/osm/debian/ReleaseSIX stable devops osmclient IM" && apt update
+
+>curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
+
+>echo "deb [arch=amd64]  http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list
+
+> apt-get install -y python-osmclient python-osm-im google-chrome-stable chromium-chromedriver
+
+>./git-repo/devops/tools/OVF_converter/install.sh
+
+## Step 3: checkout robot seed code
+Checkout devops from gerrit
+> git clone "https://osm.etsi.org/gerrit/osm/devops"
+
+If robot seed code not merged to to master, pull it
+> git pull "https://osm.etsi.org/gerrit/osm/devops" refs/changes/52/7852/4
+
+## Step 4: Set environmet
+for build test need to create env-file and provide below details and for Standalone testing export them
+```
+export OSM_HOSTNAME=<OSM server IP>
+```
+
+OpenStack Details
+```
+export OS_AUTH_URL=<auth url>
+export OS_PASSWORD=<password>
+export OS_PROJECT_NAME=<project name>
+export OS_VIM_CONFIG=<config value>
+```
+
+VCD Details
+```
+export VCD_AUTH_URL=<VCD auth url>
+export VCD_USERNAME=<VCD username>
+export VCD_PASSWORD=<VCD password>
+export VCD_TENANT_NAME=<VCD Tenant name>
+export VCD_ORGANIZATION=<VCD Org name>
+export VCD_VIM_CONFIG=<config value>
+```
+
+Note:- Optional
+```
+export NS_CONFIG=<NS Config Details>
+e.g. export NS_CONFIG="'{vld: [ {name: mgmtnet, vim-network-name: mgmt}]}'"
+```
+
+## Step 5: Run Test
+There are two ways to run the test-case:
+* use `devops/robot-systest/run_test.sh` file and provide test-name(vim/smoke/sanity/comprehensive).
+  > ./devops/robot-systest/run_test.sh -t smoke
+
+* use `robot` command
+  > robot -d path/to/report/dir -i test-tag-to-be-included -e test-tag-to-be-excluded path/to/testsuiet
+  
+  > robot -d devops/robot-systest/reports -i comprehensive devops/robot-systest/testsuite
\ No newline at end of file
diff --git a/robot-systest/deprecated/lib/api/common.robot b/robot-systest/deprecated/lib/api/common.robot
new file mode 100644 (file)
index 0000000..4724016
--- /dev/null
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com
+##
+
+
+*** Variables ***
+${token}=  ${EMPTY}
+${HOST}=  ${EMPTY}
+
+
+*** Keywords ***
+Get Auth Token
+    [Tags]  auth_token
+
+    ${nbi_host}=    Get Environment Variable    OSM_HOSTNAME
+    ${passed}=    Run Keyword And Return Status    Should Contain    ${nbi_host}    :
+    Run Keyword If    ${passed}    Set Dockerized Host    ${nbi_host}
+    ...    ELSE    Set Standalone Host    ${nbi_host}
+
+    Create Session    osmhit    ${HOST}    verify=${FALSE}    debug=1    headers=${HEADERS}
+
+    Log Many    ${auth_token_uri}    @{data}    ${data}
+
+    ${resp}=    Post Request    osmhit    ${auth_token_uri}    data=${data}
+    log    ${resp}
+
+    Pass Execution If   ${resp.status_code} in ${success_status_code_list}   Get Auth Token completed
+
+    ${content}=     To Json   ${resp.content}
+    ${t}=    Get From Dictionary       ${content}          _id
+
+    Set Suite Variable     ${token}   ${t}
+
+
+Set Dockerized Host
+    [Arguments]  ${env_host}
+
+    Set Suite Variable     ${HOST}   https://${env_host}
+
+
+Set Standalone Host
+    [Arguments]  ${env_host}
+
+    Set Suite Variable     ${HOST}   https://${env_host}:9999
diff --git a/robot-systest/deprecated/lib/api/vim_lib.robot b/robot-systest/deprecated/lib/api/vim_lib.robot
new file mode 100644 (file)
index 0000000..a52354f
--- /dev/null
@@ -0,0 +1,60 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-sep-2019
+##
+
+
+*** Keywords ***
+Create Vim
+    [Arguments]  ${vim_name}     ${account_type}     ${auth_url}     ${user}     ${password}     ${tenant}       ${description}
+
+    &{request_data}=        Create Dictionary      vim_user=${user}    vim_password=${password}    vim_url=${auth_url}     vim_tenant_name=${tenant}   vim_type=${account_type}    description=${description}  name=${vim_name}
+
+    &{headers}=    Create Dictionary     Authorization=Bearer ${token}      Content-Type=application/json   Accept=application/json
+
+    Create Session    osmvim    ${HOST}    verify=${FALSE}    headers=${headers}
+
+    LOG   ${request_data}
+    ${res}=     Post Request    osmvim  ${create_vim_uri}   data=${request_data}
+    log    ${res.content}
+    Pass Execution If   ${res.status_code} in ${success_status_code_list}   Create Vim Request completed
+    Get Vim ID      ${res.content}
+
+
+Delete Vim
+    [Arguments]  ${vim_id}
+
+    ${uri} =   Catenate        SEPARATOR=/     ${create_vim_uri}      ${vim_id}
+    ${resp}=    Delete Request   osmvim   ${uri}
+
+    log   ${resp.content}
+    Pass Execution If      ${resp.status_code} in ${success_status_code_list}   Delete Vim Request completed
+
+
+Get Vim ID
+    [Arguments]  ${res}
+
+#    log to console      ${res}
+    ${content}=     To Json     ${res}
+    ${id}=      Get From Dictionary     ${content}         id
+    Set Suite Variable     ${vim_id}   ${id}
+    log   Vim Id is ${vim_id}
diff --git a/robot-systest/deprecated/lib/cli/network_slicing_lib.robot b/robot-systest/deprecated/lib/cli/network_slicing_lib.robot
new file mode 100644 (file)
index 0000000..9a3ff37
--- /dev/null
@@ -0,0 +1,118 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 08-nov-2019
+##
+
+*** Variables ***
+${success_return_code}    0
+${delete_max_wait_time}    1min
+${delete_pol_time}    15sec
+${ns_launch_max_wait_time}    5min
+${ns_launch_pol_time}    30sec
+
+
+*** Keywords ***
+Create NST
+    [Documentation]  Create nst at osm
+    [Arguments]  ${nst_pkg}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm nst-create ${nst_pkg}
+    log     ${stdout}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    [Return]  ${stdout}
+
+
+Delete NST
+    [Documentation]  delete nst at osm
+    [Arguments]  ${nst}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm nst-delete ${nst}
+    log     ${stdout}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    [Return]  ${stdout}
+
+
+Launch Network Slice Instance
+    [Arguments]  ${vim_name}    ${nst_name}    ${ns_config}=''
+
+    ${nsi_name}=    GENERATE NAME
+    Run Keyword If   ${ns_config}!=''   Create Network Slice With Config    ${nsi_name}    ${nst_name}    ${vim_name}    ${ns_config}
+    ...    ELSE    Create Network Slice Without Config    ${nsi_name}    ${nst_name}    ${vim_name}
+
+    WAIT UNTIL KEYWORD SUCCEEDS     ${ns_launch_max_wait_time}   ${ns_launch_pol_time}   Check For Network Slice Instance To Configured   ${nsi_name}
+    Check For Network Slice Instance For Failure    ${nsi_name}
+
+
+Create Network Slice With Config
+    [Arguments]  ${nsi_name}    ${nst_name}    ${vim}    ${config}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-create --nsi_name ${nsi_name} --nst_name ${nst_name} --vim_account ${vim} --config ${config}
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    Append To List     ${nsi_list}       ${nsi_name}
+
+
+Create Network Slice Without Config
+    [Arguments]  ${nsi_name}    ${nst_name}    ${vim}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-create --nsi_name ${nsi_name} --nst_name ${nst_name} --vim_account ${vim}
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    Append To List     ${nsi_list}       ${nsi_name}
+
+
+Check For Network Slice Instance For Failure
+    [Arguments]  ${nsi_name}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-list --filter name="${nsi_name}"
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    Should Not Contain      ${stdout}   failed
+
+
+Check For Network Slice Instance To Configured
+    [Arguments]  ${nsi_name}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-list --filter name="${nsi_name}"
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    Should Contain Any      ${stdout}   configured    failed
+
+
+Delete Network Slice Instance
+    [Documentation]  Delete ns
+    [Arguments]  ${nsi}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-delete ${nsi}
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+
+    WAIT UNTIL KEYWORD SUCCEEDS  ${delete_max_wait_time}   ${delete_pol_time}   Check For NSI Instance To Be Delete   ${nsi}
+
+
+Check For NSI Instance To Be Delete
+    [Arguments]  ${nsi}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-list
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    Should Not Contain      ${stdout}   ${nsi}
diff --git a/robot-systest/deprecated/lib/cli/ns_lib.robot b/robot-systest/deprecated/lib/cli/ns_lib.robot
new file mode 100644 (file)
index 0000000..e0eb0c2
--- /dev/null
@@ -0,0 +1,193 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
+##
+
+
+*** Variables ***
+${success_return_code}    0
+${ns_launch_max_wait_time}    5min
+${ns_launch_pol_time}    30sec
+${ns_delete_max_wait_time}    1min
+${ns_delete_pol_time}    15sec
+${nsconfig}
+
+*** Keywords ***
+Get NS List
+    [Documentation]  Get ns instance list
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+
+
+Get NS Instance ID
+    [Arguments]    ${ns_name}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list --filter name="${ns_name}" | awk 'NR==4{print $4}'
+    log     ${stdout}
+    [Return]    ${stdout}
+
+
+Verify All JUJU Applications Status
+    [Arguments]    ${ns}    ${api_ip}    ${api_port}    ${username}    ${password}    ${api_cert_path}
+
+    ${juju_model}=    Get NS Instance ID    ${ns}
+
+    Import Library    robot_juju.JujuLibrary    ${api_ip}    ${api_port}    ${juju_model}    ${username}    ${password}    ${api_cert_path}
+    Assert status of applications is  ${status_active}
+
+
+Launch Network Services and Return
+    [Arguments]  ${vim_name}  ${ns_config}=''
+    [Documentation]  Get Configuration parameter to create Newtork service
+
+    Run Keyword If    ${ns_config}==''    Get NS Config
+    ...  ELSE  Set NS Config    ${ns_config}
+    Log To Console    \n${nsconfig}
+    Should Not Be Empty    ${nsd_ids}    There are no NS descriptors to launch the NS
+    :FOR    ${nsd}    IN    @{nsd_ids}
+    \    ${ns_name}=    GENERATE NAME
+    \    Append To List     ${ns_ids}       ${ns_name}
+    \    Create Network Service    ${nsd}   ${vim_name}    ${ns_name}    ${nsconfig}
+
+
+Set NS Config
+    [Arguments]   ${ns_config}
+    [Documentation]  Set NS Configuration variable
+
+    ${nsconfig}=    Get Variable Value    ${ns_config}    ''
+    Set Test Variable    ${nsconfig}
+
+
+Get NS Config
+    [Documentation]  Get NS Configuration from Environment Variable
+
+    ${nsconfig}=    Get Environment Variable    NS_CONFIG    ''
+    Set Test Variable    ${nsconfig}
+
+
+Create Network Service
+    [Documentation]  Create ns at osm
+    [Arguments]  ${nsd}   ${vim_name}    ${ns_name}    ${ns_config}
+
+    Run Keyword If   ${ns_config}!=''   Create Network Service With Config    ${nsd}    ${vim_name}    ${ns_name}    ${ns_config}
+    ...    ELSE    Create Network Service Without Config    ${nsd}   ${vim_name}    ${ns_name}
+
+    WAIT UNTIL KEYWORD SUCCEEDS     ${ns_launch_max_wait_time}   ${ns_launch_pol_time}   Check For NS Instance To Configured   ${ns_name}
+    Check For NS Instance For Failure    ${ns_name}
+
+
+Create Network Service Without Config
+    [Documentation]  Create ns at osm
+    [Arguments]  ${nsd}   ${vim_name}    ${ns_name}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-create --ns_name ${ns_name} --nsd_name ${nsd} --vim_account ${vim_name}
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+
+
+Create Network Service With Config
+    [Documentation]  Create ns at osm
+    [Arguments]  ${nsd}   ${vim_name}    ${ns_name}    ${ns_config}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-create --ns_name ${ns_name} --nsd_name ${nsd} --vim_account ${vim_name} --config ${ns_config}
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+
+
+Delete NS
+    [Documentation]  Delete ns
+    [Arguments]  ${ns}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-delete ${ns}
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+
+    WAIT UNTIL KEYWORD SUCCEEDS  ${ns_delete_max_wait_time}   ${ns_delete_pol_time}   Check For NS Instance To Be Delete   ${ns}
+
+
+Check For NS Instance To Configured
+    [Arguments]  ${ns_name}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list --filter name="${ns_name}"
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    Should Contain Any      ${stdout}   READY    BROKEN
+
+
+Check For NS Instance For Failure
+    [Arguments]  ${ns_name}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list --filter name="${ns_name}"
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    Should Not Contain      ${stdout}   BROKEN
+
+
+Check For NS Instance To Be Delete
+    [Arguments]  ${ns}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    Should Not Contain      ${stdout}   ${ns}
+
+
+Force Delete NS
+    [Documentation]  Forcely Delete ns
+    [Arguments]  ${ns}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-delete ${ns}
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    WAIT UNTIL KEYWORD SUCCEEDS    ${ns_delete_max_wait_time}   ${ns_delete_pol_time}   Check For NS Instance To Be Delete   ${ns}
+
+
+Perform VNF Scale-in Operation
+    [Arguments]  ${ns}    ${vnf_member}    ${scaling_group}
+
+    ${rc}    ${nsr}=    Run and Return RC and Output    osm ns-show ${ns} --literal
+    ${scaled_vnf}=    Get Scaled Vnf    ${nsr}
+    log to console  Scaled VNF befor scale-in operation is ${scaled_vnf}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm vnf-scale --scale-in --scaling-group ${scaling_group} ${ns} ${vnf_member}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    log     ${stdout}
+    Sleep    1m    Waiting for scale-in operation to complete
+    ${rc}    ${nsr}=    Run and Return RC and Output    osm ns-show ${ns} --literal
+    ${scaled_vnf}=    Get Scaled Vnf    ${nsr}
+    log to console  Scaled VNF after scale-in operation is ${scaled_vnf}
+
+
+Perform VNF Scale-out Operation
+    [Arguments]  ${ns}    ${vnf_member}    ${scaling_group}
+
+    ${rc}    ${nsr}=    Run and Return RC and Output    osm ns-show ${ns} --literal
+    ${scaled_vnf}=    Get Scaled Vnf    ${nsr}
+    log to console  Scaled VNF befor scale-out operation is ${scaled_vnf}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm vnf-scale --scale-out --scaling-group ${scaling_group} ${ns} ${vnf_member}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    log     ${stdout}
+    Sleep    1m    Waiting for scale-out operation to complete
+    ${rc}    ${nsr}=    Run and Return RC and Output    osm ns-show ${ns} --literal
+    ${scaled_vnf}=    Get Scaled Vnf    ${nsr}
+    log to console  Scaled VNF befor scale-out operation is ${scaled_vnf}
diff --git a/robot-systest/deprecated/lib/cli/nsd_lib.robot b/robot-systest/deprecated/lib/cli/nsd_lib.robot
new file mode 100644 (file)
index 0000000..da27b4f
--- /dev/null
@@ -0,0 +1,85 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-sep-2019
+##
+
+*** Variables ***
+${success_return_code}    0
+${delete_max_wait_time}    1min
+${delete_pol_time}    15sec
+
+
+*** Keywords ***
+Get NSDs List
+    [Documentation]  Get nsds list
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm nsd-list
+    log     ${stdout}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+
+
+Create NSD
+    [Documentation]  Create nsd at osm
+    [Arguments]  ${nsd_pkg}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm nsd-create ${nsd_pkg}
+    log     ${stdout}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    [Return]  ${stdout}
+
+
+Delete NSD
+    [Documentation]  Delete nsd
+    [Arguments]  ${nsd_id}
+
+    # For timebeing exception thrown by nsd-delete api was ignor because nsd was deleted successfully. The cause of exception is need to debug further
+    ${rc}   ${stdout}=      Run Keyword And Continue On Failure    Run and Return RC and Output            osm nsd-delete ${nsd_id}
+    log     ${stdout}
+#    Should Be Equal As Integers       ${rc}     ${success_return_code}
+    WAIT UNTIL KEYWORD SUCCEEDS    ${delete_max_wait_time}   ${delete_pol_time}   Check For NSD   ${nsd_id}
+
+
+Check For NSD
+    [Arguments]  ${nsd_id}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm nsd-list
+    log     ${stdout}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    Should Not Contain      ${stdout}   ${nsd_id}
+
+
+Force Delete NSD
+    [Documentation]  Forcely Delete nsd
+    [Arguments]  ${nsd_id}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm nsd-delete ${nsd_id}
+    log     ${stdout}
+    Should Be Equal As Integers        ${rc}   ${success_return_code}
+
+
+Build NS Descriptor
+    [Documentation]  Build NS Descriptor from the descriptor-packages
+    [Arguments]  ${nsd path}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           make -C '${CURDIR}${/}../../..${nsd path}'
+    log     ${stdout}
+    Should Be Equal As Integers        ${rc}   ${success_return_code}
diff --git a/robot-systest/deprecated/lib/cli/osm_package_tools_lib.robot b/robot-systest/deprecated/lib/cli/osm_package_tools_lib.robot
new file mode 100644 (file)
index 0000000..c8a864c
--- /dev/null
@@ -0,0 +1,88 @@
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 18-Dec-2019
+##
+
+*** Keywords ***
+Create OSM NS Package
+    [Arguments]  ${pkg_name}
+    ${ns_pkg}=    Catenate     SEPARATOR=_     ${pkg_name}      ns
+    ${ns_yaml}=   Catenate     SEPARATOR=_     ${pkg_name}      nsd
+    ${ns_yaml}=   Catenate     SEPARATOR=.     ${ns_yaml}      yaml
+    ${nsd_path}=    Join Path    ${ns_pkg}    ${ns_yaml}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm package-create ns ${pkg_name}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    File Should Exist    ${nsd_path}
+    log  ${stdout}
+
+
+Create OSM VNF Package
+    [Arguments]  ${pkg_name}
+    ${vnf_pkg}=    Catenate    SEPARATOR=_     ${pkg_name}      vnf
+    ${vnf_yaml}=   Catenate       SEPARATOR=_     ${pkg_name}      vnfd
+    ${vnf_yaml}=   Catenate       SEPARATOR=.     ${vnf_yaml}      yaml
+    ${vnfd_path}=    Join Path    ${vnf_pkg}    ${vnf_yaml}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm package-create vnf ${pkg_name}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    File Should Exist    ${vnfd_path}
+    log  ${stdout}
+
+
+Validate OSM NS Package
+    [Arguments]  ${pkg_name}
+    ${ns_pkg}=    Catenate     SEPARATOR=_     ${pkg_name}      ns
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm package-validate ${ns_pkg}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    Verify Package Validation Result    ${ns_pkg}
+    log  ${stdout}
+
+
+Validate OSM VNF Package
+    [Arguments]  ${pkg_name}
+    ${vnf_pkg}=        Catenate        SEPARATOR=_     ${pkg_name}      vnf
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm package-validate ${vnf_pkg}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    Verify Package Validation Result    ${vnf_pkg}
+    log  ${stdout}
+
+
+Verify Package Validation Result
+    [Arguments]  ${pkg}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm package-validate ${pkg} | awk 'NR==6{print $6}'
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    Should Not Contain    ${stdout}    ERROR
+    log  ${stdout}
+
+
+Build OSM VNF Package
+    [Arguments]  ${pkg_name}
+    ${vnf_pkg}=        Catenate        SEPARATOR=_     ${pkg_name}      vnf
+    ${vnf_pkg_tar}=    Catenate        SEPARATOR=.     ${vnf_pkg}      tar    gz
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm package-build ${vnf_pkg}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    File Should Exist    ${vnf_pkg_tar}
+    log  ${stdout}
+
+
+Build OSM NS Package
+    [Arguments]  ${pkg_name}
+    ${ns_pkg}=           Catenate        SEPARATOR=_     ${pkg_name}      ns
+    ${ns_pkg_tar}=       Catenate        SEPARATOR=.     ${ns_pkg}      tar    gz
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm package-build ${ns_pkg}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    File Should Exist    ${ns_pkg_tar}
+    log  ${stdout}
diff --git a/robot-systest/deprecated/lib/cli/osm_platform_resiliancy_recovery_lib.robot b/robot-systest/deprecated/lib/cli/osm_platform_resiliancy_recovery_lib.robot
new file mode 100644 (file)
index 0000000..fb86768
--- /dev/null
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 08-nov-2019
+##
+
+
+*** Variables ***
+${success_return_code}    0
+${er_replicas}    0/1
+
+
+*** Keywords ***
+Check If OSM Working
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm vnfpkg-list
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm vim-list
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+
+
+Check All Service Are Running
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    docker service ls
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    Should Not Contain      ${stdout}   ${er_replicas}
+
+
+Kill Docker Container
+    [Arguments]  ${name}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    docker rm -f \$(docker ps |grep -i ${name}|awk '{print $1}')
+    log     ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
\ No newline at end of file
diff --git a/robot-systest/deprecated/lib/cli/rbac_lib.robot b/robot-systest/deprecated/lib/cli/rbac_lib.robot
new file mode 100644 (file)
index 0000000..bbf717a
--- /dev/null
@@ -0,0 +1,245 @@
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 21-nov-2019
+##
+
+*** Keywords ***
+Configure NBI For RBAC
+    ${rc}   ${stdout}=      Run and Return RC and Output    docker service update osm_nbi --force --env-add OSMNBI_AUTHENTICATION_BACKEND=keystone --env-add OSMNBI_AUTHENTICATION_AUTH_URL=keystone --env-add OSMNBI_AUTHENTICATION_AUTH_PORT=5000 --env-add OSMNBI_AUTHENTICATION_USER_DOMAIN_NAME=default --env-add OSMNBI_AUTHENTICATION_PROJECT_DOMAIN_NAME=default --env-add OSMNBI_AUTHENTICATION_SERVICE_USERNAME=nbi --env-add OSMNBI_AUTHENTICATION_SERVICE_PROJECT=service
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    Sleep    30s    Wait for NBI service to be update
+
+
+Create User
+    [Arguments]  ${user}    ${password}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-create ${user} --password ${password}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log     ${stdout}
+    [Return]    ${stdout}
+
+
+List User
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-list
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log     ${stdout}
+    [Return]    ${stdout}
+
+
+List User And Check For The Created User
+    [Arguments]  ${user}
+    ${user list}=    List User
+    Should Contain    ${user list}    ${user}
+
+
+Get User Info By Name
+    [Arguments]  ${user_name}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-show ${user_name}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log     ${stdout}
+
+
+Get User Info By ID
+    [Arguments]  ${user_id}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-show ${user_id}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log     ${stdout}
+
+
+Update User
+    [Arguments]  ${user}    ${field}    ${value}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-update ${field} ${value} ${user}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log     ${stdout}
+
+
+Update User And Verify Info
+    [Arguments]    ${user}  @{args}
+    FOR    ${arg}    IN    @{args}
+        ${fields}=    Get Dictionary Items    ${arg}
+        Update User    ${user}    ${fields[0]}    ${fields[1]}
+    END
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-show ${user}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log     ${stdout}
+
+
+Login With User And Perform Operation
+    [Arguments]  ${user}    ${password}    ${project}
+    ${rc}   ${stdout}=      Run and Return RC and Output    export OSM_USER=${user}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    ${rc}   ${stdout}=      Run and Return RC and Output    export OSM_PROJECT=${project}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    ${rc}   ${stdout}=      Run and Return RC and Output    export OSM_PASSWORD=${password}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log    ${stdout}
+    Logout and Login With Admin
+
+
+Logout and Login With Admin
+    ${rc}   ${stdout}=      Run and Return RC and Output    export OSM_USER=admin
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    ${rc}   ${stdout}=      Run and Return RC and Output    export OSM_PASSWORD=admin
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+
+
+Delete User
+    [Arguments]  ${user}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-delete ${user}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+
+
+Delete User And Check
+    [Arguments]  ${user}
+    Delete User    ${user}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-list
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    Should Not Contain      ${stdout}   ${user}
+
+
+Create Project
+    [Arguments]  ${project}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-create ${project}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log  ${stdout}
+    [Return]  ${stdout}
+
+
+List Project
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-list
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log  ${stdout}
+    [Return]  ${stdout}
+
+
+List Project And Verify
+    [Arguments]  ${project}
+    ${project list}=    List Project
+    Should Contain    ${project list}    ${project}
+
+
+Get Project Info By Name
+    [Arguments]  ${project_name}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-show ${project_name}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log  ${stdout}
+    [Return]  ${stdout}
+
+
+Get Project Info By ID
+    [Arguments]  ${project_id}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-show ${project_id}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log  ${stdout}
+    [Return]  ${stdout}
+
+
+Update Project
+    [Arguments]  ${project}    ${feild}    ${value}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-update ${feild} ${value} ${project}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log  ${stdout}
+
+
+Update Project Name And Verify
+    [Arguments]  ${old_name}    ${new_name}
+    Update Project    ${old_name}    --name    ${new_name}
+    List Project And Verify    ${new_name}
+
+
+Delete Project
+    [Arguments]  ${project}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-delete ${project}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+
+
+Delete Project And Verify
+    [Arguments]  ${project}
+    Delete Project    ${project}
+    ${project_list}=    List Project
+    Should Not Contain    ${project_list}    ${project}
+
+
+Create Role
+    [Arguments]  ${role}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-create ${role}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log  ${stdout}
+    [Return]  ${stdout}
+
+
+List Roles
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-list
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log  ${stdout}
+    [Return]  ${stdout}
+
+
+List Roles And Verify
+    [Arguments]  ${role}
+    ${role_list}=    List Roles
+    Should Contain    ${role_list}    ${role}
+
+
+Get Role Info By Name
+    [Arguments]  ${role}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-show ${role}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log  ${stdout}
+    [Return]  ${stdout}
+
+
+Get Role Info By ID
+    [Arguments]  ${role_id}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-show ${role_id}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log  ${stdout}
+    [Return]  ${stdout}
+
+
+Update Role
+    [Arguments]  ${role}    ${feild}    ${value}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-update ${feild} ${value} ${role}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    log  ${stdout}
+
+
+Add Role And Verify
+    [Arguments]  ${role}    ${role_to_add}
+    Update Role    ${role}    --add    ${role_to_add}
+    ${role_info}=    Get Role Info By Name    ${role}
+#    Should Contain    ${role_info}    ${role_to_add}
+
+
+Delete Role
+    [Arguments]  ${role}
+    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-delete ${role}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+
+
+Delete Role And Verify
+    [Arguments]  ${role}
+    Delete Role    ${role}
+    ${role_list}=    List Roles
+    Should Not Contain    ${role_list}    ${role}
diff --git a/robot-systest/deprecated/lib/cli/sdnc_account_lib.robot b/robot-systest/deprecated/lib/cli/sdnc_account_lib.robot
new file mode 100644 (file)
index 0000000..71680b8
--- /dev/null
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+
+*** Variables ***
+${success_return_code}    0
+${name}     "OpenSite"
+${user}     "admin"
+${password}     "admin"
+${ip}      "1.1.1.1"
+${type}     "onos"
+${port}     "5858"
+${dpid}   "a7:2f:aa:be:C3:c1:fe:C9"
+
+
+*** Keywords ***
+Create SDNC Account
+    [Documentation]  create new sdnc account
+
+     ${rc}    ${stdout}=      Run and Return RC and Output      osm sdnc-create --name ${name} --type ${type} --ip_address ${ip} --user ${user} --password ${password} --port ${port} --switch_dpid ${dpid}
+    log  ${rc}
+    log  ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+
+
+Get SDNC List
+    [Documentation]  Get a sdnc account list
+
+    ${rc}    ${stdout}=      Run and Return RC and Output       osm sdnc-list
+    log     ${stdout}
+
+
+Show SDNC Account
+    [Documentation]  Get sdnc account details
+
+    ${rc}    ${stdout}=      Run and Return RC and Output       osm sdnc-show ${name}
+    log  ${rc}
+    log  ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+
+
+Delete SDNC Account
+    [Documentation]  Get sdnc account details
+
+    ${rc}    ${stdout}=      Run and Return RC and Output       osm sdnc-delete ${name}
+    log  ${rc}
+    log  ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
\ No newline at end of file
diff --git a/robot-systest/deprecated/lib/cli/vim_account_lib.robot b/robot-systest/deprecated/lib/cli/vim_account_lib.robot
new file mode 100644 (file)
index 0000000..c3c8242
--- /dev/null
@@ -0,0 +1,136 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-sep-2019
+##
+
+*** Settings ***
+Library     OperatingSystem
+Library     String
+Library     Collections
+Library     ../custom_lib.py
+
+
+*** Variables ***
+${success_return_code}    0
+${user}     "robottest"
+${password}     "fred"
+${authurl}      "https://127.0.0.1/"
+${type}     "openstack"
+${desc}     "a test vim"
+${tenant}   "robottest2"
+
+
+*** Keywords ***
+Create Vim Account
+    [Documentation]   Create a new vim account
+
+    ${vim-name}=     Generate Random String  8  [NUMBERS]
+    ${vim-name}=     Catenate  SEPARATOR=  vim_  ${vim-name}
+    set global variable  ${vim-name}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm vim-create --name ${vim-name} --user ${user} --password ${password} --auth_url ${authurl} --tenant ${tenant} --account_type ${type} --description ${desc}
+    log  ${stdout}
+    Should Be Equal As Integers        ${rc}    ${success_return_code}
+
+
+Get Vim List
+    [Documentation]  Get a vim account list
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm vim-list
+    log     ${stdout}
+    Log To Console  ${stdout}
+    Should Be Equal As Integers        ${rc}    ${success_return_code}
+
+
+Delete Vim Account
+    [Documentation]  delete vim account details
+    [Arguments]  ${vim_name}=${vim-name}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm vim-delete ${vim_name}
+    log  ${stdout}
+    Should Be Equal As Integers        ${rc}    ${success_return_code}
+
+
+VIM Setup To Launch Network Services
+    [Documentation]  Setup a VIM to launch network services
+
+    set global variable    @{vim}
+    ${vmware_url}=  Get Environment Variable    VCD_AUTH_URL   ${EMPTY}
+    ${openstack_url}=   Get Environment Variable    OS_AUTH_URL   ${EMPTY}
+    ${vmware_vim}=    Run Keyword And Return If   '${vmware_url}'!='${EMPTY}'   Setup Vmware Vim   ${vmware_url}   'vmware'      'pytest system test'
+    ${openstack_vim}=    Run Keyword And Return If   '${openstack_url}'!='${EMPTY}'   Setup Openstack Vim    ${openstack_url}    'openstack'   'pytest system test'
+    Should Not Be Empty    ${vim}    VIM details not provided
+    Log Many   @{vim}
+
+
+Setup Openstack Vim
+    [Documentation]  Openstack Vim Account Setup
+    [Tags]    vim-setup
+    [Arguments]  ${authurl}  ${type}     ${desc}
+
+    ${user}=  Get Environment Variable    OS_USERNAME   ''
+    ${password}=  Get Environment Variable    OS_PASSWORD   ''
+    ${tenant}=  Get Environment Variable    OS_PROJECT_NAME   ''
+    ${vim-config}=  Get Environment Variable    OS_VIM_CONFIG   ''
+    ${vim_name}=    GENERATE NAME
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm vim-create --name ${vim_name} --user ${user} --password ${password} --auth_url ${authurl} --tenant ${tenant} --account_type ${type} --description ${desc} --config ${vim-config}
+    log  ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    Sleep    30s    Wait for to get vim ready
+    ${rc}   ${vim_detail}=      Run and Return RC and Output    osm vim-show ${vim_name}
+    Should Contain    ${vim_detail}    "operationalState": "ENABLED"    msg=Openstack vim is not available    values=False
+    Append To List     ${vim}       ${stdout}
+
+    [Return]  ${stdout}
+
+
+Setup Vmware Vim
+    [Documentation]  Vmware Vim Account Setup
+    [Tags]    vim-setup
+    [Arguments]  ${authurl}  ${type}     ${desc}
+
+    ${user}=  Get Environment Variable    VCD_USERNAME   ''
+    ${password}=  Get Environment Variable    VCD_PASSWORD   ''
+    ${tenant}=  Get Environment Variable    VCD_TENANT_NAME   ''
+    ${vcd-org}=  Get Environment Variable    VCD_ORGANIZATION   ''
+    ${vim-config}=  Get Environment Variable    VCD_VIM_CONFIG   ''
+    ${vim_name}=    GENERATE NAME
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm vim-create --name ${vim_name} --user ${user} --password ${password} --auth_url ${authurl} --tenant ${tenant} --account_type ${type} --description ${desc} --config ${vim-config}
+    log  ${stdout}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+    Sleep    30s    Wait for to get vim ready
+    ${rc}   ${vim_detail}=      Run and Return RC and Output    osm vim-show ${vim_name}
+    Should Contain    ${vim_detail}    "operationalState": "ENABLED"    msg=VMWare VCD vim is not available    values=False
+    Append To List     ${vim}       ${stdout}
+
+    [Return]  ${stdout}
+
+
+Force Delete Vim Account
+    [Documentation]  delete vim account details
+    [Arguments]  ${vim_name}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm vim-delete ${vim_name}
+    log  ${stdout}
+    Should Be Equal As Integers        ${rc}    ${success_return_code}
diff --git a/robot-systest/deprecated/lib/cli/vnfd_lib.robot b/robot-systest/deprecated/lib/cli/vnfd_lib.robot
new file mode 100644 (file)
index 0000000..1b99f43
--- /dev/null
@@ -0,0 +1,85 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-sep-2019
+##
+
+*** Variables ***
+${success_return_code}    0
+${delete_max_wait_time}    1min
+${delete_pol_time}    15sec
+
+
+*** Keywords ***
+Get VNFDs List
+    [Documentation]  Get vnfds list
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm vnfd-list
+    log     ${stdout}
+    log     ${rc}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+
+
+Create VNFD
+    [Documentation]  Create vnfd at osm
+    [Arguments]  ${vnfd_pkg}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm vnfd-create ${vnfd_pkg}
+    log     ${stdout}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    [Return]  ${stdout}
+
+
+Delete VNFD
+    [Documentation]  Delete vnfd
+    [Arguments]  ${vnfd_id}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm vnfd-delete ${vnfd_id}
+    log     ${stdout}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    WAIT UNTIL KEYWORD SUCCEEDS    ${delete_max_wait_time}   ${delete_pol_time}   Check For VNFD   ${vnfd_id}
+
+
+Check For VNFD
+    [Arguments]  ${vnfd_id}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm vnfd-list
+    log     ${stdout}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    Should Not Contain      ${stdout}   ${vnfd_id}
+
+
+Force Delete VNFD
+    [Documentation]  Forcely Delete vnfd
+    [Arguments]  ${vnfd_id}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           osm vnfd-delete ${vnfd_id}
+    log     ${stdout}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+
+
+Build VNF Descriptor
+    [Documentation]  Build VNF Descriptor from the descriptor-packages
+    [Arguments]  ${vnfd path}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output           make -C '${CURDIR}${/}../../..${vnfd path}'
+    log     ${stdout}
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
diff --git a/robot-systest/deprecated/lib/client_lib/client_lib.py b/robot-systest/deprecated/lib/client_lib/client_lib.py
new file mode 100644 (file)
index 0000000..c9390ae
--- /dev/null
@@ -0,0 +1,69 @@
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+
+from osmclient import client
+from robot.api import logger
+import json
+
+
+class ClientLib:
+    def __init__(self, host="127.0.0.1", user=None, password=None, project=None):
+
+        kwargs = {}
+        if user is not None:
+            kwargs['user'] = user
+        if password is not None:
+            kwargs['password'] = password
+        if project is not None:
+            kwargs['project'] = project
+        self.client = client.Client(host=host, sol005=True, **kwargs)
+
+    def get_vim_list(self):
+        resp = self.client.vim.list()
+        logger.info('VIM List: {}'.format(resp))
+        return json.dumps(resp)
+
+    def create_vim_account(self, name, vim_type, user, password, auth_url, tenant, desc='', config=None):
+        vim_access = {}
+        if config is not None:
+            vim_access['config'] = config
+        vim_access['vim-type'] = vim_type
+        vim_access['vim-username'] = user
+        vim_access['vim-password'] = password
+        vim_access['vim-url'] = auth_url
+        vim_access['vim-tenant-name'] = tenant
+        vim_access['description'] = desc
+
+        resp = self.client.vim.create(name, vim_access)
+        logger.info('Create VIM Account: {}'.format(resp))
+        return json.dumps(resp)
+
+    def delete_vim_account(self, name):
+        resp = self.client.vim.delete(name)
+        return json.dumps(resp)
+
+    def get_vnfd_list(self):
+        resp = self.client.vnfd.list()
+        logger.info('VNF Descriptor List: {}'.format(resp))
+        return json.dumps(resp)
+
+    def get_nsd_list(self):
+        resp = self.client.nsd.list()
+        logger.info('NS Descriptor List: {}'.format(resp))
+        return json.dumps(resp)
diff --git a/robot-systest/deprecated/lib/custom_lib.py b/robot-systest/deprecated/lib/custom_lib.py
new file mode 100644 (file)
index 0000000..2a3d23f
--- /dev/null
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com
+##̥
+
+
+import random
+from haikunator import Haikunator
+import yaml
+from os.path import basename
+import hashlib
+
+from robot.api import logger
+from robot.api.deco import keyword
+
+
+def generate_name():
+    haikunator = Haikunator()
+    name = haikunator.haikunate(delimiter='_', token_length=2)
+    return name
+
+
+def get_random_item_from_list(l):
+    assert isinstance(l, list), "List should be provided"
+    return random.choice(l)
+
+
+def get_scaled_vnf(nsr):
+    nsr = yaml.load(nsr)
+    if 'scaling-group' in nsr['_admin']:
+        return nsr['_admin']['scaling-group'][0]['nb-scale-op']
+    else:
+        return 0
+
+
+@keyword('Get File Name From Path')
+def get_filename(path):
+    filename = basename(path)
+    return filename, filename.split('.')[0]
+
+
+@keyword('Generate MD5')
+def generate_md5(fpath):
+    hash_md5 = hashlib.md5()
+    with open(fpath, "rb") as f:
+        for chunk in iter(lambda: f.read(1024), b""):
+            hash_md5.update(chunk)
+    return hash_md5.hexdigest()
diff --git a/robot-systest/deprecated/lib/gui/login_gui.robot b/robot-systest/deprecated/lib/gui/login_gui.robot
new file mode 100644 (file)
index 0000000..c125664
--- /dev/null
@@ -0,0 +1,87 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
+##
+
+
+*** Variables ***
+${DESIRED_CAPABILITIES}    desired_capabilities
+${BROWSER}        Chrome
+${DELAY}          0
+${VALID USER}     admin
+${VALID PASSWORD}    admin
+${LOGIN URL}      /auth/
+${WELCOME URL}    /projects/
+${NS LIST URL}    /packages/ns/list
+${VNF LIST URL}    /packages/vnf/list
+
+
+*** Keywords ***
+Set Server URL
+    ${env_host}=    Get Environment Variable    OSM_HOSTNAME
+    ${passed}=    Run Keyword And Return Status    Should Contain    ${env_host}    :
+    Run Keyword If    ${passed}    Set Dockerized Host
+    ...    ELSE    Set Standalone Host    ${env_host}
+
+
+Open Browser To Login Page
+    ${chrome_options} =     Evaluate    sys.modules['selenium.webdriver'].ChromeOptions()    sys, selenium.webdriver
+    Call Method    ${chrome_options}   add_argument    headless
+    Call Method    ${chrome_options}   add_argument    disable-gpu
+    Call Method    ${chrome_options}   add_argument    no-sandbox
+    ${options}=     Call Method     ${chrome_options}    to_capabilities
+    Open Browser    ${SERVER}${LOGIN URL}    ${BROWSER}    desired_capabilities=${options}
+    Maximize Browser Window
+    Set Selenium Speed    ${DELAY}
+    Login Page Should Be Open
+
+
+Login Page Should Be Open
+    Element Text Should Be    //*[@id="main_content"]/div/div[2]/p    Sign in to start your session
+
+
+Enter Credentials
+    [Arguments]    ${username}    ${password}
+    Input Text    name:username    ${username}
+    Input Password    name:password    ${password}
+
+
+Submit Credentials
+    Click Button    //*[@id="main_content"]/div/div[2]/form/div[3]/div[2]/button
+
+
+Home Page Should Be Open
+    Location Should Be    ${SERVER}${WELCOME URL}
+#    Element Should Contain    id:title_header    6e3a8415-9014-4100-9727-90e0150263be    ignore_case=True
+    Element Attribute Value Should Be    //*[@id="main_content"]/div/div[2]/div[1]/div[1]/div/a    href    ${SERVER}${NS LIST URL}
+    Element Attribute Value Should Be    //*[@id="main_content"]/div/div[2]/div[1]/div[2]/div/a    href    ${SERVER}${VNF LIST URL}
+
+
+Set Dockerized Host
+
+    Set Suite Variable     ${SERVER}   http://light-ui
+
+
+Set Standalone Host
+    [Arguments]  ${env_host}
+
+    Set Suite Variable     ${SERVER}   http://${env_host}
diff --git a/robot-systest/deprecated/resource/api/common.robot b/robot-systest/deprecated/resource/api/common.robot
new file mode 100644 (file)
index 0000000..9342316
--- /dev/null
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com
+##
+
+
+*** Variables ***
+&{HEADERS}     Content-Type=application/json       Accept=application/json
+&{data}        username=admin      password=admin      project-id=admin
+@{success_status_code_list}     200     201     202    204
+
+${descriptor_content_type_gzip}   application/gzip
+
+${auth_token_uri}   /osm/admin/v1/tokens
+
+${get_all_vnfd_uri}   /osm/vnfpkgm/v1/vnf_packages
+${create_vnfd_uri}   /osm/vnfpkgm/v1/vnf_packages_content
+${delete_vnfd_uri}   /osm/vnfpkgm/v1/vnf_packages
+
+${get_all_nsd_uri}   /osm/nsd/v1/ns_descriptors
+${create_nsd_uri}   /osm/nsd/v1/ns_descriptors_content
+${delete_nsd_uri}   /osm/nsd/v1/ns_descriptors
+
+${base_ns_uri}   /osm/nslcm/v1/ns_instances_content
+${create_ns_uri}   /osm/nslcm/v1/ns_instances_content
+
+${create_vim_uri}   /osm/admin/v1/vim_accounts
diff --git a/robot-systest/deprecated/resource/api/variables.py b/robot-systest/deprecated/resource/api/variables.py
new file mode 100644 (file)
index 0000000..a97763a
--- /dev/null
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-sep-2019
+##
+
+
+# Create/Delete Vim Account
+vim_name = 'API-TEST-VIM'
+account_type = 'openstack'
+auth_url = 'http://127.0.0.1:5000/v3'
+user = 'admin'
+password = 'admin'
+tenant = 'admin'
+description = 'Test OpenStack Vim Account'
diff --git a/robot-systest/deprecated/resource/cli/disable_port_security_ns_data.py b/robot-systest/deprecated/resource/cli/disable_port_security_ns_data.py
new file mode 100644 (file)
index 0000000..e1383bd
--- /dev/null
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2020 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+# Author: Mrityunjay Yadav < MY00514913@techmahindra.com >, Jayant Madavi
+##
+
+
+# VNFD Details
+vnfdPckgPath = "/descriptor-packages/vnfd/hackfest_basic_vnf"
+vnfdPckg = '/build/hackfest_basic_vnf.tar.gz'
+
+# NSD Details
+nsdPckgPath = "/descriptor-packages/nsd/no_port_security_ns"
+nsdPckg = '/build/no_port_security_ns.tar.gz'
diff --git a/robot-systest/deprecated/resource/cli/hackfest_basic_ns_data.py b/robot-systest/deprecated/resource/cli/hackfest_basic_ns_data.py
new file mode 100644 (file)
index 0000000..8b8054b
--- /dev/null
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
+##
+
+
+# VNFD Details
+vnfdPckgPath = "/descriptor-packages/vnfd/hackfest_basic_vnf"
+vnfdPckg = '/build/hackfest_basic_vnf.tar.gz'
+
+# NSD Details
+nsdPckgPath = "/descriptor-packages/nsd/hackfest_basic_ns"
+nsdPckg = '/build/hackfest_basic_ns.tar.gz'
diff --git a/robot-systest/deprecated/resource/cli/hackfest_cloudinit_ns_data.py b/robot-systest/deprecated/resource/cli/hackfest_cloudinit_ns_data.py
new file mode 100644 (file)
index 0000000..d725a36
--- /dev/null
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
+##
+
+
+# VNFD Details
+vnfdPckgPath = "/descriptor-packages/vnfd/hackfest_cloudinit_vnf"
+vnfdPckg = '/build/hackfest_cloudinit_vnf.tar.gz'
+
+# NSD Details
+nsdPckgPath = "/descriptor-packages/nsd/hackfest_cloudinit_ns"
+nsdPckg = '/build/hackfest_cloudinit_ns.tar.gz'
diff --git a/robot-systest/deprecated/resource/cli/hackfest_epa_ns_data.py b/robot-systest/deprecated/resource/cli/hackfest_epa_ns_data.py
new file mode 100644 (file)
index 0000000..8975e31
--- /dev/null
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
+##
+
+
+# VNFD Details
+vnfdPckgPath = "/descriptor-packages/vnfd/hackfest_epasriov_vnf"
+vnfdPckg = '/build/hackfest_epasriov_vnf.tar.gz'
+
+# NSD Details
+nsdPckgPath = "/descriptor-packages/nsd/hackfest_epasriov_ns"
+nsdPckg = '/build/hackfest_epasriov_ns.tar.gz'
diff --git a/robot-systest/deprecated/resource/cli/hackfest_multivdu_ns_data.py b/robot-systest/deprecated/resource/cli/hackfest_multivdu_ns_data.py
new file mode 100644 (file)
index 0000000..5ecb9e8
--- /dev/null
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
+##
+
+
+# VNFD Details
+vnfdPckgPath = "/descriptor-packages/vnfd/hackfest_multivdu_vnf"
+vnfdPckg = '/build/hackfest_multivdu_vnf.tar.gz'
+
+# NSD Details
+nsdPckgPath = "/descriptor-packages/nsd/hackfest_multivdu_ns"
+nsdPckg = '/build/hackfest_multivdu_ns.tar.gz'
diff --git a/robot-systest/deprecated/resource/cli/hackfest_simplecharm_ns_data.py b/robot-systest/deprecated/resource/cli/hackfest_simplecharm_ns_data.py
new file mode 100644 (file)
index 0000000..5ffcd35
--- /dev/null
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
+##
+
+
+# VNFD Details
+vnfdPckgPath = "/descriptor-packages/vnfd/hackfest_simplecharm_vnf"
+vnfdPckg = '/build/hackfest_simplecharm_vnf.tar.gz'
+
+# NSD Details
+nsdPckgPath = "/descriptor-packages/nsd/hackfest_simplecharm_ns"
+nsdPckg = '/build/hackfest_simplecharm_ns.tar.gz'
diff --git a/robot-systest/deprecated/resource/cli/test_vnf_data.py b/robot-systest/deprecated/resource/cli/test_vnf_data.py
new file mode 100644 (file)
index 0000000..02ee065
--- /dev/null
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com
+##
+
+
+# VNFD Details
+vnfdPckgPath = "/descriptor-packages/vnfd/cirros_vnf"
+vnfdPckg = '/build/cirros_vnf.tar.gz'
+
+# NSD Details
+nsdPckgPath = "/descriptor-packages/nsd/cirros_ns"
+nsdPckg = '/build/cirros_ns.tar.gz'
diff --git a/robot-systest/deprecated/resource/cli/ubuntu-cloudinit_ns_data.py b/robot-systest/deprecated/resource/cli/ubuntu-cloudinit_ns_data.py
new file mode 100644 (file)
index 0000000..ce68037
--- /dev/null
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 TATA ELXSI
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+##
+# Author: Ragavi D (ragavi.d@tataelxsi.co.in)
+
+# VNFD Details
+vnfdPckgPath = "/descriptor-packages/vnfd/ubuntu-cloudinit_vnf"
+vnfdPckg = '/build/ubuntu-cloudinit_vnf.tar.gz'
+
+# NSD Details
+nsdPckgPath = "/descriptor-packages/nsd/ubuntu-cloudinit_ns"
+nsdPckg = '/build/ubuntu-cloudinit_ns.tar.gz'
diff --git a/robot-systest/deprecated/run_test.sh b/robot-systest/deprecated/run_test.sh
new file mode 100644 (file)
index 0000000..3f86ff9
--- /dev/null
@@ -0,0 +1,109 @@
+#!/usr/bin/env bash
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+#   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.
+##
+
+## Change log:
+# 1. Feature 7829: Mrityunjay Yadav, Jayant Madavi : MY00514913@techmahindra.com : 06-Sep-2019
+# Entry script to start the vim, smoke, openstack_stage_4 and comprehensive test using Robot Framework as a Automation Test Framework
+##
+
+BASEDIR=$(dirname "$0")
+TOPDIR=$(dirname "$BASEDIR")
+DESCRIPTOR_DIR=$TOPDIR/descriptor-packages
+
+
+robot_prerequisite(){
+    echo -e "\nInstalling robot requirements"
+    # installing python packages
+    pip install haikunator requests robotframework robotframework-seleniumlibrary robotframework-requests robotframework-jsonlibrary
+}
+
+while getopts ":t:-:" o; do
+    case "${o}" in
+        t)
+            TEST=${OPTARG}
+            ;;
+        -)
+            [[ "${OPTARG}" == "do_install" ]] && robot_prerequisite && continue
+            ;;
+        \?)
+            echo -e "Invalid option: '-$OPTARG'\n" >&2
+            exit 1
+            ;;
+    esac
+done
+
+if [[ -z $TEST ]]; then
+    printf "Test not provided. \nRunning default test: smoke\n"
+    TEST="smoke"
+fi
+
+if [[ "$TEST" == "vim" ]]; then
+    echo "Robot Framework Vim Test"
+    robot -d $BASEDIR/reports -i vim $BASEDIR/testsuite/
+    exit 0
+elif [[ "$TEST" == "smoke" ]]; then
+    echo "Robot Framework SMOKE test"
+    robot --removekeywords tag:vim-setup --removekeywords WUKS -d $BASEDIR/reports -i smoke $BASEDIR/testsuite/
+    exit 0
+elif [[ "$TEST" == "sanity" ]]; then
+    echo "Robot Framework Cirros VNF Test"
+    mkdir -p $BASEDIR/images/cache
+    if [[ ! -z $OS_AUTH_URL ]]; then
+        (openstack image show cirros-0.3.5-x86_64-disk.img) || (wget -r -nc http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-disk.img -O $BASEDIR/images/cache/cirros-0.3.5-x86_64-disk.img && make $BASEDIR/images/cache/cirros-0.3.5-x86_64-disk.img && openstack image create --file $BASEDIR/images/cache/cirros-0.3.5-x86_64-disk.img cirros-0.3.5-x86_64-disk.img)
+    fi
+    if [[ ! -z $VCD_AUTH_URL ]]; then
+#        TODO: Check for image over VIM before downloading
+        if [[ ! -s $BASEDIR/images/cache/cirros-0.3.5-x86_64-disk.img ]]; then
+            wget -r -nc http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-disk.img -O $BASEDIR/images/cache/cirros-0.3.5-x86_64-disk.img
+        fi
+        ovf_converter $BASEDIR/images/cache/cirros-0.3.5-x86_64-disk.img -n cirros
+        python $TOPDIR/tools/vmware_ovf_upload.py $VCD_AUTH_URL $VCD_USERNAME $VCD_PASSWORD $VCD_ORGANIZATION $BASEDIR/images/cache/cirros.ovf
+    fi
+    robot --removekeywords tag:vim-setup --removekeywords WUKS -d $BASEDIR/reports -i sanity $BASEDIR/testsuite/
+    exit 0
+elif [[ "$TEST" == "comprehensive" ]]; then
+    echo "Robot Framework Comprehensive Test"
+    echo "Installing chrome driver and chrome for UI testing"
+    # installing chrome driver and chrome for UI testing
+    curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
+    echo "deb [arch=amd64]  http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list
+    apt-get update && apt-get -y install google-chrome-stable chromium-chromedriver
+    echo "Checking of image over VIMs"
+    mkdir -p $BASEDIR/images/cache
+    if [[ ! -z $OS_AUTH_URL ]]; then
+        (openstack image show ubuntu1604) || (wget -r -nc https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img -O $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img && make $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img && openstack image create --file $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img ubuntu1604)
+        (openstack image show hackfest3-mgmt) || (wget -r -nc https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img -O $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img && make $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img && openstack image create --file $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img hackfest3-mgmt)
+    fi
+    if [[ ! -z $VCD_AUTH_URL ]]; then
+#        TODO: Check for image over VIM before downloading
+        if [[ ! -s $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img ]]; then
+            wget -r -nc https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img -O $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img
+        fi
+        ovf_converter $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img -n ubuntu1604
+        python $TOPDIR/tools/vmware_ovf_upload.py $VCD_AUTH_URL $VCD_USERNAME $VCD_PASSWORD $VCD_ORGANIZATION $BASEDIR/images/cache/ubuntu1604.ovf
+    fi
+    robot --removekeywords tag:vim-setup --removekeywords WUKS -d $BASEDIR/reports -i comprehensive $BASEDIR/testsuite/
+    exit 0
+else
+    echo "wrong test provided"
+    exit 1
+fi
+
+exit 1
diff --git a/robot-systest/deprecated/testsuite/api/TS01__Vim_Account.robot b/robot-systest/deprecated/testsuite/api/TS01__Vim_Account.robot
new file mode 100644 (file)
index 0000000..be04c3f
--- /dev/null
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
+##
+
+
+*** Settings ***
+Documentation    Test Suite to create and delete vim account
+Library     Collections
+Library     RequestsLibrary
+Library     OperatingSystem
+Resource    ../../lib/api/common.robot
+Resource    ../../lib/api/vim_lib.robot
+Resource    ../../resource/api/common.robot
+Variables   ../../resource/api/variables.py
+
+Suite Setup     Get Auth Token
+Suite Teardown  Delete All Sessions
+
+
+*** Variables ***
+${vim_id}   ${EMPTY}
+
+
+*** Test Cases ***
+Create Vim Account
+    [Tags]    comprehensive   api_vim_test
+    [Template]  Create Vim
+    ${vim name}     ${account type}     ${auth url}     ${user}     ${password}     ${tenant}       ${description}
+
+
+Delete Vim Account
+    [Tags]    comprehensive   api_vim_test
+    [Template]  Delete Vim
+    ${vim_id}
diff --git a/robot-systest/deprecated/testsuite/cli/TS008__Test_SDNC.robot b/robot-systest/deprecated/testsuite/cli/TS008__Test_SDNC.robot
new file mode 100644 (file)
index 0000000..3b2b21a
--- /dev/null
@@ -0,0 +1,45 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+
+*** Settings ***
+Documentation    Test suiet to create/delete sdnc account via osmclient
+Library     OperatingSystem
+Library     Collections
+Resource    ../../lib/cli/sdnc_account_lib.robot
+
+
+*** Test Cases ***
+Create SDNC Account Test
+    [Tags]  sdnc
+
+    Create SDNC Account
+
+
+Get SDNC Accounts List Test
+    [Tags]  sdnc
+
+    Get SDNC List
+
+
+Delete SDNC Account Test
+    [Tags]  sdnc
+
+    Delete SDNC Account
diff --git a/robot-systest/deprecated/testsuite/cli/TS009__Feature_6283_Network_Slicing_Test.robot b/robot-systest/deprecated/testsuite/cli/TS009__Feature_6283_Network_Slicing_Test.robot
new file mode 100644 (file)
index 0000000..fa8c44a
--- /dev/null
@@ -0,0 +1,117 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 08-nov-2019 : network slicing test library
+##
+
+
+*** Settings ***
+Documentation    Test Suite to create hackfest basic nestwork service
+Library     OperatingSystem
+Library     String
+Library     Collections
+Resource    ../../lib/cli/vnfd_lib.robot
+Resource    ../../lib/cli/nsd_lib.robot
+Resource    ../../lib/cli/vim_account_lib.robot
+Resource    ../../lib/cli/network_slicing_lib.robot
+Library     ../../lib/custom_lib.py
+
+Suite Teardown     Run Keyword And Ignore Error    Test Cleanup
+
+
+*** Variables ***
+${vnfd_id}
+@{vnfd_ids}
+${nsd_id}
+@{nsd_ids}
+${nst_id}
+@{nsi_list}
+${vnfdPckg}    slice_hackfest_vnfd.tar.gz
+${nsdPckg}    slice_hackfest_nsd.tar.gz
+${nstPckg}    slice_hackfest_nst.yaml
+${vnfdftpPath}    https://osm-download.etsi.org/ftp/osm-5.0-five/6th-hackfest/packages/slice_hackfest_vnfd.tar.gz
+${nsdftpPath}    https://osm-download.etsi.org/ftp/osm-5.0-five/6th-hackfest/packages/slice_hackfest_nsd.tar.gz
+${nstftpPath}    https://osm-download.etsi.org/ftp/osm-5.0-five/6th-hackfest/packages/slice_hackfest_nst.yaml
+${nst_config}    '{netslice-vld: [{name: mgmtnet, vim-network-name: mgmt}]}'
+
+
+*** Test Cases ***
+Create Slice Hackfest VNF Descriptor
+    [Tags]   slice_hackfest    comprehensive
+    [Documentation]  Create Slice Hackfest VNF Descriptor Test
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    wget -P '${CURDIR}${/}../../resource/cli/slice/' ${vnfdftpPath}
+    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../resource/cli/slice${/}${vnfdPckg}'
+    Append To List     ${vnfd_ids}       ${vnfd_id}
+
+
+Create Slice Hackfest NS Descriptor
+    [Tags]   slice_hackfest    comprehensive
+    [Documentation]  Create Slice Hackfest NS Descriptor Test
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    wget -P '${CURDIR}${/}../../resource/cli/slice/' ${nsdftpPath}
+    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../resource/cli/slice${/}${nsdPckg}'
+    Append To List     ${nsd_ids}       ${nsd_id}
+
+
+Create Slice Hackfest Network Slice Template
+    [Tags]   slice_hackfest    comprehensive
+    [Documentation]  Create Slice Hackfest Network Slice Template Test
+
+#    set suite variable    ${nst_id}
+    ${rc}   ${stdout}=      Run and Return RC and Output    wget -P '${CURDIR}${/}../../resource/cli/slice/' ${nstftpPath}
+    ${nst_id}=    Create NST    '${CURDIR}${/}../../resource/cli/slice${/}${nstPckg}'
+    Set Suite Variable    ${nst_id}
+
+
+Instanciate Network Slice
+    [Tags]  slice_hackfest    comprehensive
+    [Documentation]  Instantiate Network Slice Test
+
+    :FOR    ${vim_name}    IN    @{vim}
+    \    Launch Network Slice Instance    ${vim_name}    ${nst_id}    ${nst_config}
+
+
+Terminate Network Slice Instance
+    [Tags]  slice_hackfest    comprehensive
+    [Documentation]  Terminate Network Slice Instance Test
+
+    :FOR    ${nsi}    IN    @{nsi_list}
+    \    Delete Network Slice Instance    ${nsi}
+
+
+*** Keywords ***
+Test Cleanup
+    [Documentation]  Test Suit Cleanup: delete NST, NSD and VNFD
+
+    Delete NST    ${nst_id}
+
+#    :FOR    ${nsi}    IN    @{nsi_list}
+#    \    Delete Network Slice Instance    ${nsi}
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+    :FOR    ${vnfd}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd}
+
+#    :FOR    ${vim_id}  IN   @{vim}
+#    \   Delete Vim Account    ${vim_id}
diff --git a/robot-systest/deprecated/testsuite/cli/TS010__OSM_Platform_Resiliency_and_Recovery_Test.robot b/robot-systest/deprecated/testsuite/cli/TS010__OSM_Platform_Resiliency_and_Recovery_Test.robot
new file mode 100644 (file)
index 0000000..2475e74
--- /dev/null
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 08-nov-2019 : network slicing test library
+##
+
+
+*** Settings ***
+Library     OperatingSystem
+Library     String
+Library     Collections
+Resource    ../../lib/cli/osm_platform_resiliancy_recovery_lib.robot
+Library     ../../lib/custom_lib.py
+
+
+*** Variables ***
+${max_wait_time}    5min
+${pol_time}    30sec
+@{components}    osm_keystone.1    osm_lcm.1    osm_light-ui.1    osm_mon.1    osm_mongo.1    osm_nbi.1    osm_pol.1    osm_prometheus.1    osm_ro.1    osm_kafka.1    osm_zookeeper.1    osm_mysql.1
+
+
+*** Test Cases ***
+Feature 1413 - OSM platform resiliency to single component failure
+    [Tags]  platform    resiliency
+    [Documentation]  OSM platform resiliency test
+
+    ${name}=    Get Random Item From List    ${components}
+    Check If OSM Working
+    WAIT UNTIL KEYWORD SUCCEEDS     2x   30sec   Check All Service Are Running
+    Kill Docker Container    ${name}
+    WAIT UNTIL KEYWORD SUCCEEDS     ${max_wait_time}   ${pol_time}   Check All Service Are Running
+    Check If OSM Working
+
+
+Feature 1412 - OSM platform recovery after major failure
+    [Tags]  platform    recovery
+    [Documentation]  OSM platform recovery
+
+    Check If OSM Working
+    WAIT UNTIL KEYWORD SUCCEEDS     2x   30sec   Check All Service Are Running
+    :FOR    ${component}    IN    @{components}
+    \    Kill Docker Container    ${component}
+    WAIT UNTIL KEYWORD SUCCEEDS     ${max_wait_time}   ${pol_time}   Check All Service Are Running
+    Check If OSM Working
diff --git a/robot-systest/deprecated/testsuite/cli/TS011__Feature_1415_RBAC_For_Platform_Test.robot b/robot-systest/deprecated/testsuite/cli/TS011__Feature_1415_RBAC_For_Platform_Test.robot
new file mode 100644 (file)
index 0000000..c8e44e1
--- /dev/null
@@ -0,0 +1,106 @@
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 21-nov-2019
+##
+
+*** Settings ***
+Documentation    Test RBAC for platform using CRUD operations over users, projects and roles
+Library     OperatingSystem
+Library     String
+Library     Collections
+Resource    ../../lib/cli/rbac_lib.robot
+
+#Suite Setup    Configure NBI For RBAC
+Suite Teardown  Run Keyword And Ignore Error    Test Cleanup
+
+
+*** Variables ***
+${success_return_code}    0
+# Test data for Users Operations test
+${user_id}    ${EMPTY}
+&{update_field1}    --set-project=admin,system_admin,project_admin      #project,role1,role2...
+&{update_field2}    --add-project-role=admin,project_user     #project,role1,role2...
+&{update_field3}    --add-project-role=service,account_manager       #project,role1,role2...
+@{update_user}    ${update_field1}    ${update_field2}    ${update_field3}
+# Test data for Project Operations test
+${project_id}    ${EMPTY}
+# Test data for Role Operations test
+${role_id}    ${EMPTY}
+${role_to_add}    "vims: true"
+
+
+*** Test Cases ***
+Test User Operations
+    [Documentation]  Test RBAC using CRUD operation over users
+    [Tags]  rabc    rabc_users    comprehensive
+
+    ${user-name}=     Generate Random String    8    [NUMBERS]
+    ${user-name}=     Catenate  SEPARATOR=  user_  ${user-name}
+    set global variable  ${user-name}
+    ${user-password}=     Generate Random String    8    [NUMBERS]
+    set global variable  ${user-password}
+    ${user_id}=    Create User    ${user-name}    ${user-password}
+    List User And Check For The Created User    ${user-name}
+    Get User Info By Name    ${user-name}
+    Get User Info By ID    ${user_id}
+    Update User And Verify Info    ${user-name}    @{update_user}
+    Login With User And Perform Operation    ${user-name}    ${user-password}    admin
+    Delete User And Check    ${user-name}
+
+
+Test Project Operatios
+    [Documentation]  Test RBAC using CRUD operation over projects
+    [Tags]  rabc    rabc_projects    comprehensive
+
+    ${project-name}=     Generate Random String    8    [NUMBERS]
+    ${project-name}=     Catenate  SEPARATOR=  project_  ${project-name}
+    set global variable  ${project-name}
+    ${project_id}=    Create Project    ${project-name}
+    List Project And Verify    ${project-name}
+    Get Project Info By Name    ${project-name}
+    Get Project Info By ID    ${project_id}
+    ${new-project-name}=     Generate Random String    8    [NUMBERS]
+    ${new-project-name}=     Catenate  SEPARATOR=  project_  ${new-project-name}
+    set global variable  ${new-project-name}
+    Update Project Name And Verify    ${project-name}    ${new-project-name}
+    Delete Project And Verify    ${new-project-name}
+
+
+Test Role Operations
+    [Documentation]  Test RBAC using CRUD operation over roles
+    [Tags]  rabc    rabc_roles    comprehensive
+
+    ${role-name}=     Generate Random String    8    [NUMBERS]
+    ${role-name}=     Catenate  SEPARATOR=  project_  ${role-name}
+    set global variable  ${role-name}
+    ${role_id}=    Create Role    ${role-name}
+    List Roles And Verify    ${role-name}
+    Get Role Info By Name    ${role-name}
+    Get Role Info By ID    ${role_id}
+    Add Role And Verify    ${role-name}    ${role_to_add}
+    Delete Role And Verify    ${role-name}
+
+
+*** Keywords ***
+Test Cleanup
+    Delete User    ${user-name}
+    Delete Project    ${project-name}
+    Delete Project    ${new-project-name}
+    Delete Role    ${role-name}
\ No newline at end of file
diff --git a/robot-systest/deprecated/testsuite/cli/TS012__Feature_7181_Allow_Instantiation_Parameters_in_CloudInit.robot b/robot-systest/deprecated/testsuite/cli/TS012__Feature_7181_Allow_Instantiation_Parameters_in_CloudInit.robot
new file mode 100644 (file)
index 0000000..c5e1c75
--- /dev/null
@@ -0,0 +1,87 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 TATA ELXSI
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Author: Ragavi D (ragavi.d@tataelxsi.co.in)
+
+*** Settings ***
+Documentation     Test Suite to create hackfest basic nestwork service
+Suite Teardown    Run Keyword And Ignore Error    Test Cleanup
+Library           OperatingSystem
+Library           String
+Library           Collections
+Resource          ../../lib/cli/vnfd_lib.robot
+Resource          ../../lib/cli/nsd_lib.robot
+Resource          ../../lib/cli/ns_lib.robot
+Resource          ../../lib/cli/vim_account_lib.robot
+Library           ../../lib/custom_lib.py
+Variables         ../../resource/cli/ubuntu-cloudinit_ns_data.py
+
+*** Variables ***
+@{vnfd_ids}
+${nsd_id}         ${EMPTY}
+@{nsd_ids}
+@{ns_ids}
+${ns_config}      '{vld: [ {name: mgmtnet, vim-network-name: osm-ext} ], additionalParamsForVnf: [ { member-vnf-index: "1", additionalParams: { password: "PASSWORD" } } ] }'
+
+*** Test Cases ***
+Create Ubuntu CloudInit VNF Descriptor
+    [Tags]    comprehensive    ubuntu-cloudinit_ns
+    Build VNF Descriptor    ${vnfdPckgPath}
+    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../..${vnfdPckgPath}${vnfdPckg}'
+    Append To List    ${vnfd_ids}    ${vnfd_id}
+
+Create Ubuntu CloudInit NS Descriptor
+    [Tags]    comprehensive    ubuntu-cloudinit_ns
+    Build NS Descriptor    ${nsdPckgPath}
+    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../..${nsdPckgPath}${nsdPckg}'
+    Append To List    ${nsd_ids}    ${nsd_id}
+
+Network Service Instance Test
+    [Documentation]    Launch and terminate network services
+    [Tags]    comprehensive    ubuntu-cloudinit_ns
+    : FOR    ${vim_name}    IN    @{vim}
+    \    Launch Network Services and Return    ${vim_name}    ${ns_config}
+
+Delete NS Instance Test
+    [Tags]    comprehensive    ubuntu-cloudinit_ns
+    : FOR    ${ns}    IN    @{ns_ids}
+    \    Delete NS    ${ns}
+
+Delete NS Descriptor Test
+    [Tags]    comprehensive    ubuntu-cloudinit_ns
+    : FOR    ${nsd}    IN    @{nsd_ids}
+    \    Delete NSD    ${nsd}
+
+Delete VNF Descriptor Test
+    [Tags]    comprehensive    ubuntu-cloudinit_ns
+    : FOR    ${vnfd_id}    IN    @{vnfd_ids}
+    \    Delete VNFD    ${vnfd_id}
+
+*** Keywords ***
+Test Cleanup
+    [Documentation]    Test Suit Cleanup: Deliting Descriptor, instance and vim
+    : FOR    ${ns}    IN    @{ns_ids}
+    \    Delete NS    ${ns}
+    : FOR    ${nsd}    IN    @{nsd_ids}
+    \    Delete NSD    ${nsd}
+    : FOR    ${vnfd}    IN    @{vnfd_ids}
+    \    Delete VNFD    ${vnfd}
+    #    :FOR    ${vim_id}    IN    @{vim}
+    #    Delete Vim Account    ${vim_id}
diff --git a/robot-systest/deprecated/testsuite/cli/TS013__Feature_1415_RBAC_Visibility_Of_Packages_And_Instances.robot b/robot-systest/deprecated/testsuite/cli/TS013__Feature_1415_RBAC_Visibility_Of_Packages_And_Instances.robot
new file mode 100644 (file)
index 0000000..4302951
--- /dev/null
@@ -0,0 +1,144 @@
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 18-Dec-2019
+##
+
+*** Settings ***
+Documentation    Test RBAC for platform - Visibility of packages and instances test
+Library     OperatingSystem
+Library     String
+Library     Collections
+Resource    ../../lib/cli/rbac_lib.robot
+Resource    ../../lib/cli/vnfd_lib.robot
+Resource    ../../lib/cli/nsd_lib.robot
+Resource    ../../lib/cli/ns_lib.robot
+Resource    ../../lib/cli/vim_account_lib.robot
+Library     ../../lib/custom_lib.py
+
+Suite Setup    Prerequisite For Test
+Suite Teardown  Run Keyword And Ignore Error    Test Cleanup
+
+
+*** Variables ***
+${success_return_code}    0
+
+@{vim}
+@{vnfd_ids}
+${nsd_id}
+@{nsd_ids}
+@{ns_ids}
+${vnfdPckg}    hackfest_basic_vnf.tar.gz
+${nsdPckg}    hackfest_basic_ns.tar.gz
+${vnfdftpPath}    https://osm-download.etsi.org/ftp/osm-5.0-five/6th-hackfest/packages/hackfest_basic_vnf.tar.gz
+${nsdftpPath}    https://osm-download.etsi.org/ftp/osm-5.0-five/6th-hackfest/packages/hackfest_basic_ns.tar.gz
+
+# Test data for Users Operations test
+${user_id}    ${EMPTY}
+
+# Test data for Project Operations test
+${project_id}    ${EMPTY}
+
+
+*** Test Cases ***
+Create VIM Account For New User
+    [Documentation]  Test to create VIM account for newly created user
+    [Tags]  rabc    rabc_vim    comprehensive    nbi
+
+    Wait Until Keyword Succeeds    2x    30sec    VIM Setup To Launch Network Services
+
+
+Create VNF Descriptor For New User
+    [Documentation]  Test to create vnfd for new user
+    [Tags]  rabc    rabc_vnfd    comprehensive    nbi
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    wget -P '${CURDIR}${/}../../resource/cli/rbac/' ${vnfdftpPath}
+    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../resource/cli/rbac${/}${vnfdPckg}'
+    Append To List     ${vnfd_ids}       ${vnfd_id}
+
+
+Create NS Descriptor For New User
+    [Documentation]  Test to create nsd for new user
+    [Tags]  rabc    rabc_nsd    comprehensive    nbi
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    wget -P '${CURDIR}${/}../../resource/cli/rbac/' ${nsdftpPath}
+    ${nsd_id}=    Create VNFD    '${CURDIR}${/}../../resource/cli/rbac${/}${nsdPckg}'
+    Append To List     ${nsd_ids}       ${nsd_id}
+
+
+Instanciate Network Service For New User
+    [Documentation]  Launch network services for new user
+    [Tags]   rabc    rabc_ns    comprehensive    nbi
+
+    :FOR    ${vim_name}    IN    @{vim}
+    \    Launch Network Services and Return    ${vim_name}
+
+
+Delete NS Instance Test
+    [Tags]    rabc    rabc_ns    comprehensive    nbi
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+
+Delete NS Descriptor Test
+    [Tags]   rabc    rabc_nsd    comprehensive    nbi
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+
+Delete VNF Descriptor Test
+    [Tags]   rabc    rabc_vnfd    comprehensive    nbi
+
+    :FOR    ${vnfd_id}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd_id}
+
+
+*** Keywords ***
+Prerequisite For Test
+    ${user-name}=     Generate Random String    8    [NUMBERS]
+    ${user-name}=     Catenate  SEPARATOR=  user_  ${user-name}
+    set global variable  ${user-name}
+    ${user-password}=     Generate Random String    8    [NUMBERS]
+    set global variable  ${user-password}
+    ${user_id}=    Create User    ${user-name}    ${user-password}
+
+    ${project-name}=     Generate Random String    8    [NUMBERS]
+    ${project-name}=     Catenate  SEPARATOR=  project_  ${project-name}
+    set global variable  ${project-name}
+    ${project_id}=    Create Project    ${project-name}
+
+    &{update_field1}=    Create Dictionary    --add-project-role=admin,project_user
+    &{update_field2}=    Create Dictionary    --add-project-role=${project-name},account_manager
+    @{update_user}=    Create List    ${update_field1}    ${update_field2}
+    Update User And Verify Info    ${user-name}    @{update_user}
+    Login With User And Perform Operation    ${user-name}    ${user-password}    ${project-name}
+
+
+Test Cleanup
+    [Documentation]  Test Suit Cleanup: Deliting Descriptor, instance and vim
+
+#    :FOR    ${vim_id}  IN   @{vim}
+#    \   Delete Vim Account    ${vim_id}
+
+    Logout and Login With Admin
+
+    Delete User    ${user-name}
+    Delete Project    ${project-name}
diff --git a/robot-systest/deprecated/testsuite/cli/TS014__Feature_7921_MongoDB_Filesystem_Test.robot b/robot-systest/deprecated/testsuite/cli/TS014__Feature_7921_MongoDB_Filesystem_Test.robot
new file mode 100644 (file)
index 0000000..3070d41
--- /dev/null
@@ -0,0 +1,124 @@
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 18-Dec-2019
+##
+
+*** Settings ***
+Library     OperatingSystem
+Library     String
+Library     Collections
+Resource    ../../lib/cli/vnfd_lib.robot
+Resource    ../../lib/cli/nsd_lib.robot
+Resource    ../../lib/cli/ns_lib.robot
+Resource    ../../lib/cli/vim_account_lib.robot
+Library     ../../lib/custom_lib.py
+
+Suite Setup    Prerequisite For Test
+Suite Teardown  Run Keyword And Ignore Error    Test Cleanup
+
+
+*** Variables ***
+${success_return_code}    0
+
+@{vim}
+@{vnfd_ids}
+${nsd_id}
+@{nsd_ids}
+@{ns_ids}
+${vnfdPckg}    hackfest_basic_vnf.tar.gz
+${nsdPckg}    hackfest_basic_ns.tar.gz
+${vnfdftpPath}    https://osm-download.etsi.org/ftp/osm-5.0-five/6th-hackfest/packages/hackfest_basic_vnf.tar.gz
+${nsdftpPath}    https://osm-download.etsi.org/ftp/osm-5.0-five/6th-hackfest/packages/hackfest_basic_ns.tar.gz
+
+
+*** Test Cases ***
+Create VNF Descriptor Test
+    [Tags]  comprehensive    feature7921
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    wget -P '${CURDIR}${/}../../resource/' ${vnfdftpPath}
+    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../resource${/}${vnfdPckg}'
+    Append To List     ${vnfd_ids}       ${vnfd_id}
+
+
+Create NS Descriptor Test
+    [Tags]  comprehensive    feature7921
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    wget -P '${CURDIR}${/}../../resource/' ${nsdftpPath}
+    ${nsd_id}=    Create VNFD    '${CURDIR}${/}../../resource${/}${nsdPckg}'
+    Append To List     ${nsd_ids}       ${nsd_id}
+
+
+Instanciate Network Service Test
+    [Tags]  comprehensive    feature7921
+    [Setup]  Wait Until Keyword Succeeds    2x    30sec    VIM Setup To Launch Network Services
+
+    :FOR    ${vim_name}    IN    @{vim}
+    \    Launch Network Services and Return    ${vim_name}
+
+
+Delete NS Instance Test
+    [Tags]  comprehensive    feature7921
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+
+Delete NS Descriptor Test
+    [Tags]  comprehensive    feature7921
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+
+Delete VNF Descriptor Test
+    [Tags]  comprehensive    feature7921
+
+    :FOR    ${vnfd_id}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd_id}
+
+
+*** Keywords ***
+Prerequisite For Test
+    [Documentation]  Update docker service to use mongodb as file system
+
+    Update NBI Service
+    Update LCM Service
+
+
+Update NBI Service
+    ${rc}   ${stdout}=      Run and Return RC and Output    docker service update osm_nbi --force --env-add OSMNBI_STORAGE_DRIVER=mongo --env-add OSMNBI_STORAGE_PATH=/app/storage --env-add OSMNBI_STORAGE_COLLECTION=files --env-add OSMNBI_STORAGE_URI=mongodb://mongo:27017
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    Sleep    30s    Wait for NBI service to be update
+
+
+Update LCM Service
+    ${rc}   ${stdout}=      Run and Return RC and Output    docker service update osm_lcm --force --env-add OSMLCM_STORAGE_DRIVER=mongo --env-add OSMLCM_STORAGE_PATH=/app/storage --env-add OSMLCM_STORAGE_COLLECTION=files --env-add OSMLCM_STORAGE_URI=mongodb://mongo:27017
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    Sleep    30s    Wait for LCM service to be update
+
+
+Test Cleanup
+#    :FOR    ${vim_id}  IN   @{vim}
+#    \   Delete Vim Account    ${vim_id}
+
+    ${rc}   ${stdout}=      Run and Return RC and Output    docker service rollback osm_nbi
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
+    ${rc}   ${stdout}=      Run and Return RC and Output    docker service rollback osm_lcm
+    Should Be Equal As Integers        ${rc}     ${success_return_code}
diff --git a/robot-systest/deprecated/testsuite/cli/TS015__Feature_8047_OSMClient_Package_Creation_And_Validation.robot b/robot-systest/deprecated/testsuite/cli/TS015__Feature_8047_OSMClient_Package_Creation_And_Validation.robot
new file mode 100644 (file)
index 0000000..e717c10
--- /dev/null
@@ -0,0 +1,84 @@
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 18-Dec-2019
+##
+
+*** Settings ***
+Documentation    Test Suite to test OSMClient Package Createtion and Validation Tool
+Library     OperatingSystem
+Library     String
+Library     Collections
+Resource    ../../lib/cli/osm_package_tools_lib.robot
+
+Suite Setup    Prerequisite For Test
+Suite Teardown    Test Cleanup
+
+
+*** Variables ***
+${success_return_code}    0
+${base_dir}    ${EXECDIR}
+${pkg_dir}    ${CURDIR}${/}../../resource/cli/packages
+${ns_pkg}    vEPC
+${vnf_pkg}    vEPC
+
+
+*** Test Cases ***
+Test OSM NS Package Create
+    [Tags]  comprehensive   feature8047
+    Create OSM NS Package    ${ns_pkg}
+
+
+Test OSM VNF Package Create
+    [Tags]  comprehensive   feature8047
+    Create OSM VNF Package    ${vnf_pkg}
+
+
+Test OSM NS Package Validate
+    [Tags]  comprehensive   feature8047
+    Validate OSM NS Package    ${ns_pkg}
+
+
+Test OSM VNF Package Validate
+    [Tags]  comprehensive   feature8047
+    Validate OSM VNF Package    ${vnf_pkg}
+
+
+Test OSM VNF Package Build
+    [Tags]  comprehensive   feature8047
+    Build OSM VNF Package    ${vnf_pkg}
+
+
+Test OSM NS Package Build
+    [Tags]  comprehensive   feature8047
+    Build OSM NS Package    ${ns_pkg}
+
+
+*** Keywords ***
+Prerequisite For Test
+    Create Directory    ${pkg_dir}
+    ${rc}   ${stdout}=      Run and Return RC and Output    cd ${pkg_dir}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+
+
+Test Cleanup
+    ${rc}   ${stdout}=      Run and Return RC and Output    cd ${base_dir}
+    Should Be Equal As Integers    ${rc}    ${success_return_code}
+
+    Remove Directory    ${pkg_dir}    recursive=${TRUE}
\ No newline at end of file
diff --git a/robot-systest/deprecated/testsuite/cli/TS016__Manual_VNF_VDU_Scaling_Test.robot b/robot-systest/deprecated/testsuite/cli/TS016__Manual_VNF_VDU_Scaling_Test.robot
new file mode 100644 (file)
index 0000000..3f7bce8
--- /dev/null
@@ -0,0 +1,129 @@
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Mrityunjay Yadav, Jayant Madavi : MY00514913@techmahindra.com : 27-Nov-19
+##
+
+*** Settings ***
+Documentation    Test Suite to test manual scale-in/out cirros VNF and NS using osm-client
+Library     OperatingSystem
+Library     String
+Library     Collections
+Resource    ../../lib/cli/vnfd_lib.robot
+Resource    ../../lib/cli/nsd_lib.robot
+Resource    ../../lib/cli/ns_lib.robot
+Resource    ../../lib/cli/vim_account_lib.robot
+Library     ../../lib/custom_lib.py
+
+Suite Teardown     Run Keyword And Ignore Error    Test Cleanup
+
+
+*** Variables ***
+# VNFD Details
+@{vnfd_ids}
+${vnfdPckgPath}    /descriptor-packages/vnfd/cirros_vnf
+${vnfdPckg}    /build/cirros_vnf.tar.gz
+
+# NSD Details
+@{nsd_ids}
+${nsdPckgPath}    /descriptor-packages/nsd/cirros_ns
+${nsdPckg}    /build/cirros_ns.tar.gz
+${scaling_group}    scaling_cirros_vnf
+${vnf_member_index}    1
+
+@{ns_ids}
+
+
+*** Test Cases ***
+Create VNF Descriptor Test
+    [Documentation]  Build and onboard cirros VNF package with scaling parameter
+    [Tags]    comprehensive   manual_scaling
+
+    Build VNF Descriptor    ${vnfdPckgPath}
+    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../..${vnfdPckgPath}${vnfdPckg}'
+    Append To List     ${vnfd_ids}       ${vnfd_id}
+
+
+Create NS Descriptor Test
+    [Documentation]  Build and onboard cirros NS package with scaling parameter
+    [Tags]    comprehensive   manual_scaling
+
+    Build NS Descriptor    ${nsdPckgPath}
+    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../..${nsdPckgPath}${nsdPckg}'
+    Append To List     ${nsd_ids}       ${nsd_id}
+
+
+Network Service Instance Test
+    [Documentation]  Launch cirros ns with scaling parameter
+    [Tags]    comprehensive   manual_scaling
+
+    :FOR    ${vim_name}    IN    @{vim}
+    \    Launch Network Services and Return    ${vim_name}
+
+
+Perform VNF/VDU Scaling-out Operation Over Launched NS Test
+    [Documentation]  scale-out cirros ns
+    [Tags]    comprehensive   manual_scaling
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Perform VNF Scale-out Operation   ${ns}    ${vnf_member_index}    ${scaling_group}
+
+
+Perform VNF/VDU Scaling-in Operation Over Launched NS Test
+    [Documentation]  scale-in cirros ns
+    [Tags]    comprehensive   manual_scaling
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Perform VNF Scale-in Operation   ${ns}    ${vnf_member_index}    ${scaling_group}
+
+
+Delete NS Instance Test
+    [Tags]    comprehensive   manual_scaling
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+
+Delete NS Descriptor Test
+    [Tags]    comprehensive   manual_scaling
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+
+Delete VNF Descriptor Test
+    [Tags]    comprehensive   manual_scaling
+
+    :FOR    ${vnfd}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd}
+
+
+*** Keywords ***
+Test Cleanup
+    [Documentation]  Test Suit Cleanup: Deliting Descriptor, instance and vim
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+    :FOR    ${vnfd}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd}
+
+#    :FOR    ${vim_id}  IN   @{vim}
+#    \   Delete Vim Account    ${vim_id}
diff --git a/robot-systest/deprecated/testsuite/cli/TS017__Feature_7326_Disable_Port_Security_at_Network_level.robot b/robot-systest/deprecated/testsuite/cli/TS017__Feature_7326_Disable_Port_Security_at_Network_level.robot
new file mode 100644 (file)
index 0000000..562dc15
--- /dev/null
@@ -0,0 +1,122 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2020 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+#
+# Author: Mrityunjay Yadav <MY00514913@techmahindra.com>, Jayant Madavi
+##
+
+
+*** Settings ***
+Documentation    Test Suite to test disable network port security NS
+Library     OperatingSystem
+Library     String
+Library     Collections
+Resource    ../../lib/cli/vnfd_lib.robot
+Resource    ../../lib/cli/nsd_lib.robot
+Resource    ../../lib/cli/ns_lib.robot
+Resource    ../../lib/cli/vim_account_lib.robot
+Library     ../../lib/custom_lib.py
+Variables   ../../resource/cli/disable_port_security_ns_data.py
+
+Suite Teardown     Run Keyword And Ignore Error    Test Cleanup
+
+
+*** Variables ***
+@{vnfd_ids}
+${nsd_id}
+@{nsd_ids}
+@{ns_ids}
+
+
+*** Test Cases ***
+Create VNF Descriptor
+    [Tags]   disable_port_security    comprehensive
+
+    Build VNF Descriptor    ${vnfdPckgPath}
+    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../..${vnfdPckgPath}${vnfdPckg}'
+    Append To List     ${vnfd_ids}       ${vnfd_id}
+
+
+Create NS Descriptor
+    [Tags]   disable_port_security    comprehensive
+
+    Build NS Descriptor    ${nsdPckgPath}
+    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../..${nsdPckgPath}${nsdPckg}'
+    Append To List     ${nsd_ids}       ${nsd_id}
+
+
+Network Service Instance Test
+    [Documentation]  Launch and terminate network services
+    [Tags]   disable_port_security    comprehensive
+
+    :FOR    ${vim_name}    IN    @{vim}
+    \    Launch Network Services and Return    ${vim_name}
+
+
+Verify Port Security
+    [Tags]   disable_port_security    comprehensive
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Check For Network Port Security   ${ns}
+
+
+Delete NS Instance Test
+    [Tags]    disable_port_security   comprehensive
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+
+Delete NS Descriptor Test
+    [Tags]   disable_port_security    comprehensive
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+
+Delete VNF Descriptor Test
+    [Tags]   disable_port_security    comprehensive
+
+    :FOR    ${vnfd_id}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd_id}
+
+
+*** Keywords ***
+Check For Network Port Security
+    [Arguments]    ${ns_name}
+    ${rc}   ${network_id}=      Run and Return RC and Output    openstack network list | grep ${ns_name} | awk '{print $2}'
+    Log    ${network_id}
+    ${rc}   ${stdout}=      Run and Return RC and Output    openstack network show ${network_id} -f json | jq '.port_security_enabled'
+    Log    ${stdout}
+    Should Be Equal As Strings    ${stdout}    true
+
+
+Test Cleanup
+    [Documentation]  Test Suit Cleanup: Deliting Descriptor, instance and vim
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+    :FOR    ${vnfd}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd}
+
+#    :FOR    ${vim_id}  IN   @{vim}
+#    \   Delete Vim Account    ${vim_id}
diff --git a/robot-systest/deprecated/testsuite/cli/TS01__Test_VNF.robot b/robot-systest/deprecated/testsuite/cli/TS01__Test_VNF.robot
new file mode 100644 (file)
index 0000000..84e1f92
--- /dev/null
@@ -0,0 +1,107 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Mrityunjay Yadav, Jayant Madavi : MY00514913@techmahindra.com : 06-aug-2019
+##
+
+
+*** Settings ***
+Documentation    Test Suite to test basic cirros VNF and NS using osm-client
+Library     OperatingSystem
+Library     String
+Library     Collections
+Resource    ../../lib/cli/vnfd_lib.robot
+Resource    ../../lib/cli/nsd_lib.robot
+Resource    ../../lib/cli/ns_lib.robot
+Resource    ../../lib/cli/vim_account_lib.robot
+Library     ../../lib/custom_lib.py
+Variables   ../../resource/cli/test_vnf_data.py
+
+Suite Teardown     Run Keyword And Ignore Error    Test Cleanup
+
+
+*** Variables ***
+@{vnfd_ids}
+@{nsd_ids}
+@{ns_ids}
+
+
+*** Test Cases ***
+Create VNF Descriptor Test
+    [Tags]    sanity    smoke
+
+    Build VNF Descriptor    ${vnfdPckgPath}
+    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../..${vnfdPckgPath}${vnfdPckg}'
+    Append To List     ${vnfd_ids}       ${vnfd_id}
+
+
+Create NS Descriptor Test
+    [Tags]    sanity     smoke
+
+    Build NS Descriptor    ${nsdPckgPath}
+    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../..${nsdPckgPath}${nsdPckg}'
+    Append To List     ${nsd_ids}       ${nsd_id}
+
+
+Network Service Instance Test
+    [Documentation]  Launch and terminate network services
+    [Tags]    sanity
+
+    :FOR    ${vim_name}    IN    @{vim}
+    \    Launch Network Services and Return    ${vim_name}
+
+
+Delete NS Instance Test
+    [Tags]    sanity
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+
+Delete NS Descriptor Test
+    [Tags]    sanity     smoke
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+
+Delete VNF Descriptor Test
+    [Tags]    sanity    smoke
+
+    :FOR    ${vnfd}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd}
+
+
+*** Keywords ***
+Test Cleanup
+    [Documentation]  Test Suit Cleanup: Deliting Descriptor, instance and vim
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+    :FOR    ${vnfd}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd}
+
+#    :FOR    ${vim_id}  IN   @{vim}
+#    \   Delete Vim Account    ${vim_id}
diff --git a/robot-systest/deprecated/testsuite/cli/TS02__Test_Vim.robot b/robot-systest/deprecated/testsuite/cli/TS02__Test_Vim.robot
new file mode 100644 (file)
index 0000000..18f2a50
--- /dev/null
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
+##
+
+
+*** Settings ***
+Documentation    Test suiet to create/delete vim account via osmclient
+Library     OperatingSystem
+Library     Collections
+Resource    ../../lib/cli/vim_account_lib.robot
+
+
+*** Test Cases ***
+Create Vim Account Test
+    [Tags]  smoke    vim
+
+    Create Vim Account
+
+
+Get Vim Accounts List Test
+    [Tags]  vim
+
+    Get Vim List
+
+
+Delete Vim Account Test
+    [Tags]  smoke    vim
+
+    Delete Vim Account
diff --git a/robot-systest/deprecated/testsuite/cli/TS03__Hackfest_Basic_NS.robot b/robot-systest/deprecated/testsuite/cli/TS03__Hackfest_Basic_NS.robot
new file mode 100644 (file)
index 0000000..40492f7
--- /dev/null
@@ -0,0 +1,108 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Mrityunjay Yadav, Jayant Madavi : MY00514913@techmahindra.com : 06-aug-2019
+##
+
+
+*** Settings ***
+Documentation    Test Suite to create hackfest basic nestwork service
+Library     OperatingSystem
+Library     String
+Library     Collections
+Resource    ../../lib/cli/vnfd_lib.robot
+Resource    ../../lib/cli/nsd_lib.robot
+Resource    ../../lib/cli/ns_lib.robot
+Resource    ../../lib/cli/vim_account_lib.robot
+Library     ../../lib/custom_lib.py
+Variables   ../../resource/cli/hackfest_basic_ns_data.py
+
+Suite Teardown     Run Keyword And Ignore Error    Test Cleanup
+
+
+*** Variables ***
+@{vnfd_ids}
+${nsd_id}
+@{nsd_ids}
+@{ns_ids}
+
+
+*** Test Cases ***
+Create Hackfest Basic VNF Descriptor
+    [Tags]   comprehensive   hackfest_basic_ns
+
+    Build VNF Descriptor    ${vnfdPckgPath}
+    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../..${vnfdPckgPath}${vnfdPckg}'
+    Append To List     ${vnfd_ids}       ${vnfd_id}
+
+
+Create Hackfest Basic NS Descriptor
+    [Tags]   comprehensive   hackfest_basic_ns
+
+    Build NS Descriptor    ${nsdPckgPath}
+    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../..${nsdPckgPath}${nsdPckg}'
+    Append To List     ${nsd_ids}       ${nsd_id}
+
+
+Network Service Instance Test
+    [Documentation]  Launch and terminate network services
+    [Tags]   comprehensive   hackfest_basic_ns
+
+    :FOR    ${vim_name}    IN    @{vim}
+    \    Launch Network Services and Return    ${vim_name}
+
+
+Delete NS Instance Test
+    [Tags]    comprehensive   hackfest_basic_ns
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+
+Delete NS Descriptor Test
+    [Tags]   comprehensive   hackfest_basic_ns
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+
+Delete VNF Descriptor Test
+    [Tags]   comprehensive   hackfest_basic_ns
+
+    :FOR    ${vnfd_id}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd_id}
+
+
+*** Keywords ***
+Test Cleanup
+    [Documentation]  Test Suit Cleanup: Deliting Descriptor, instance and vim
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+    :FOR    ${vnfd}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd}
+
+#    :FOR    ${vim_id}  IN   @{vim}
+#    \   Delete Vim Account    ${vim_id}
diff --git a/robot-systest/deprecated/testsuite/cli/TS04__Hackfest_Simplecharm_NS.robot b/robot-systest/deprecated/testsuite/cli/TS04__Hackfest_Simplecharm_NS.robot
new file mode 100644 (file)
index 0000000..2a22478
--- /dev/null
@@ -0,0 +1,113 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Mrityunjay Yadav, Jayant Madavi : MY00514913@techmahindra.com : 06-aug-2019
+##
+
+
+*** Settings ***
+Documentation    Test Suite to create hackfest simplecharm ns
+Library     OperatingSystem
+Library     String
+Library     Collections
+Resource    ../../lib/cli/vnfd_lib.robot
+Resource    ../../lib/cli/nsd_lib.robot
+Resource    ../../lib/cli/ns_lib.robot
+Resource    ../../lib/cli/vim_account_lib.robot
+Library     ../../lib/custom_lib.py
+Variables   ../../resource/cli/hackfest_simplecharm_ns_data.py
+
+Suite Teardown     Run Keyword And Ignore Error    Test Cleanup
+
+
+*** Variables ***
+@{vnfd_ids}
+${nsd_id}
+@{nsd_ids}
+@{ns_ids}
+${vnfdftpPath}    https://osm-download.etsi.org/ftp/osm-6.0-six/7th-hackfest/packages/hackfest_simplecharm_vnf.tar.gz
+${nsdftpPath}    https://osm-download.etsi.org/ftp/osm-6.0-six/7th-hackfest/packages/hackfest_simplecharm_ns.tar.gz
+
+
+*** Test Cases ***
+Create Hackfest Simple Charm VNF Descriptor
+    [Tags]   hackfest_simplecharm    comprehensive
+
+    #Build VNF Descriptor    ${vnfdPckgPath}
+    #Workarround for charm build issue
+    ${rc}   ${stdout}=      Run and Return RC and Output    wget -P '${CURDIR}${/}../../..${vnfdPckgPath}${/}build/' ${vnfdftpPath}
+    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../..${vnfdPckgPath}${vnfdPckg}'
+    Append To List     ${vnfd_ids}       ${vnfd_id}
+
+
+Create Hackfest Simple Charm NS Descriptor
+    [Tags]   hackfest_simplecharm    comprehensive
+
+    #Build NS Descriptor    ${nsdPckgPath}
+    ${rc}   ${stdout}=      Run and Return RC and Output    wget -P '${CURDIR}${/}../../..${nsdPckgPath}${/}build/' ${nsdftpPath}
+    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../..${nsdPckgPath}${nsdPckg}'
+    Append To List     ${nsd_ids}       ${nsd_id}
+
+
+Network Service Instance Test
+    [Documentation]  Launch and terminate network services
+    [Tags]   hackfest_simplecharm    comprehensive
+
+    :FOR    ${vim_name}    IN    @{vim}
+    \    Launch Network Services and Return    ${vim_name}
+
+
+Delete NS Instance Test
+    [Tags]    comprehensive   hackfest_simplecharm
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+
+Delete NS Descriptor Test
+    [Tags]   hackfest_simplecharm    comprehensive
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+
+Delete VNF Descriptor Test
+    [Tags]   hackfest_simplecharm    comprehensive
+
+    :FOR    ${vnfd_id}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd_id}
+
+
+*** Keywords ***
+Test Cleanup
+    [Documentation]  Test Suit Cleanup: Deliting Descriptor, instance and vim
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+    :FOR    ${vnfd}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd}
+
+#    :FOR    ${vim_id}  IN   @{vim}
+#    \   Delete Vim Account    ${vim_id}
diff --git a/robot-systest/deprecated/testsuite/cli/TS05__Hackfest_Multivdu_NS.robot b/robot-systest/deprecated/testsuite/cli/TS05__Hackfest_Multivdu_NS.robot
new file mode 100644 (file)
index 0000000..e3cc440
--- /dev/null
@@ -0,0 +1,108 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Mrityunjay Yadav, Jayant Madavi : MY00514913@techmahindra.com : 06-aug-2019
+##
+
+
+*** Settings ***
+Documentation    Test Suite to create hackfest multivdu ns
+Library     OperatingSystem
+Library     String
+Library     Collections
+Resource    ../../lib/cli/vnfd_lib.robot
+Resource    ../../lib/cli/nsd_lib.robot
+Resource    ../../lib/cli/ns_lib.robot
+Resource    ../../lib/cli/vim_account_lib.robot
+Library     ../../lib/custom_lib.py
+Variables   ../../resource/cli/hackfest_multivdu_ns_data.py
+
+Suite Teardown     Run Keyword And Ignore Error    Test Cleanup
+
+
+*** Variables ***
+@{vnfd_ids}
+${nsd_id}
+@{nsd_ids}
+@{ns_ids}
+
+
+*** Test Cases ***
+Create Hackfest Multivdu VNF Descriptor
+    [Tags]   comprehensive   hackfest_multivdu
+
+    Build VNF Descriptor    ${vnfdPckgPath}
+    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../..${vnfdPckgPath}${vnfdPckg}'
+    Append To List     ${vnfd_ids}       ${vnfd_id}
+
+
+Create Hackfest Multivdu NS Descriptor
+    [Tags]   comprehensive   hackfest_multivdu
+
+    Build NS Descriptor    ${nsdPckgPath}
+    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../..${nsdPckgPath}${nsdPckg}'
+    Append To List     ${nsd_ids}       ${nsd_id}
+
+
+Network Service Instance Test
+    [Documentation]  Launch and terminate network services
+    [Tags]   comprehensive   hackfest_multivdu
+
+    :FOR    ${vim_name}    IN    @{vim}
+    \    Launch Network Services and Return    ${vim_name}
+
+
+Delete NS Instance Test
+    [Tags]    comprehensive   hackfest_multivdu
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+
+Delete NS Descriptor Test
+    [Tags]   comprehensive   hackfest_multivdu
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+
+Delete VNF Descriptor Test
+    [Tags]   comprehensive   hackfest_multivdu
+
+    :FOR    ${vnfd_id}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd_id}
+
+
+*** Keywords ***
+Test Cleanup
+    [Documentation]  Test Suit Cleanup: Deliting Descriptor, instance and vim
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+    :FOR    ${vnfd}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd}
+
+#    :FOR    ${vim_id}  IN   @{vim}
+#    \   Delete Vim Account    ${vim_id}
diff --git a/robot-systest/deprecated/testsuite/cli/TS06__Hackfest_Cloudinit_NS.robot b/robot-systest/deprecated/testsuite/cli/TS06__Hackfest_Cloudinit_NS.robot
new file mode 100644 (file)
index 0000000..87bf22f
--- /dev/null
@@ -0,0 +1,108 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Mrityunjay Yadav, Jayant Madavi : MY00514913@techmahindra.com : 06-aug-2019
+##
+
+
+*** Settings ***
+Documentation    Test Suite to create hackfest cloudinit ns
+Library     OperatingSystem
+Library     String
+Library     Collections
+Resource    ../../lib/cli/vnfd_lib.robot
+Resource    ../../lib/cli/nsd_lib.robot
+Resource    ../../lib/cli/ns_lib.robot
+Resource    ../../lib/cli/vim_account_lib.robot
+Library     ../../lib/custom_lib.py
+Variables   ../../resource/cli/hackfest_cloudinit_ns_data.py
+
+Suite Teardown     Run Keyword And Ignore Error    Test Cleanup
+
+
+*** Variables ***
+@{vnfd_ids}
+${nsd_id}
+@{nsd_ids}
+@{ns_ids}
+
+
+*** Test Cases ***
+Create Hackfest Cloudinit VNF Descriptor
+    [Tags]   comprehensive   hackfest_cloudinit
+
+    Build VNF Descriptor    ${vnfdPckgPath}
+    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../..${vnfdPckgPath}${vnfdPckg}'
+    Append To List     ${vnfd_ids}       ${vnfd_id}
+
+
+Create Hackfest Cloudinit NS Descriptor
+    [Tags]   comprehensive   hackfest_cloudinit
+
+    Build NS Descriptor    ${nsdPckgPath}
+    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../..${nsdPckgPath}${nsdPckg}'
+    Append To List     ${nsd_ids}       ${nsd_id}
+
+
+Network Service Instance Test
+    [Documentation]  Launch and terminate network services
+    [Tags]   comprehensive   hackfest_cloudinit
+
+    :FOR    ${vim_name}    IN    @{vim}
+    \    Launch Network Services and Return    ${vim_name}
+
+
+Delete NS Instance Test
+    [Tags]    comprehensive   hackfest_cloudinit
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+
+Delete NS Descriptor Test
+    [Tags]   comprehensive   hackfest_cloudinit
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+
+Delete VNF Descriptor Test
+    [Tags]   comprehensive   hackfest_cloudinit
+
+    :FOR    ${vnfd_id}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd_id}
+
+
+*** Keywords ***
+Test Cleanup
+    [Documentation]  Test Suit Cleanup: Deliting Descriptor, instance and vim
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+    :FOR    ${vnfd}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd}
+
+#    :FOR    ${vim_id}  IN   @{vim}
+#    \   Delete Vim Account    ${vim_id}
diff --git a/robot-systest/deprecated/testsuite/cli/TS07__Hackfest_EPA_NS.robot b/robot-systest/deprecated/testsuite/cli/TS07__Hackfest_EPA_NS.robot
new file mode 100644 (file)
index 0000000..5316598
--- /dev/null
@@ -0,0 +1,108 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Mrityunjay Yadav, Jayant Madavi : MY00514913@techmahindra.com : 06-aug-2019
+##
+
+
+*** Settings ***
+Documentation    Test Suite to create hackfest epa ns
+Library     OperatingSystem
+Library     String
+Library     Collections
+Resource    ../../lib/cli/vnfd_lib.robot
+Resource    ../../lib/cli/nsd_lib.robot
+Resource    ../../lib/cli/ns_lib.robot
+Resource    ../../lib/cli/vim_account_lib.robot
+Library     ../../lib/custom_lib.py
+Variables   ../../resource/cli/hackfest_epa_ns_data.py
+
+Suite Teardown     Run Keyword And Ignore Error    Test Cleanup
+
+
+*** Variables ***
+@{vnfd_ids}
+${nsd_id}
+@{nsd_ids}
+@{ns_ids}
+
+
+*** Test Cases ***
+Create Hackfest EPA VNF Descriptor
+    [Tags]     hackfest_epa
+
+    Build VNF Descriptor    ${vnfdPckgPath}
+    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../..${vnfdPckgPath}${vnfdPckg}'
+    Append To List     ${vnfd_ids}       ${vnfd_id}
+
+
+Create Hackfest EPA NS Descriptor
+    [Tags]     hackfest_epa
+
+    Build NS Descriptor    ${nsdPckgPath}
+    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../..${nsdPckgPath}${nsdPckg}'
+    Append To List     ${nsd_ids}       ${nsd_id}
+
+
+Network Service Instance Test
+    [Documentation]  Launch and terminate network services
+    [Tags]    hackfest_epa
+
+    :FOR    ${vim_name}    IN    @{vim}
+    \    Launch Network Services and Return    ${vim_name}
+
+
+Delete NS Instance Test
+    [Tags]    hackfest_epa
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+
+Delete NS Descriptor Test
+    [Tags]    hackfest_epa
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+
+Delete VNF Descriptor Test
+    [Tags]    hackfest_epa
+
+    :FOR    ${vnfd_id}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd_id}
+
+
+*** Keywords ***
+Test Cleanup
+    [Documentation]  Test Suit Cleanup: Deliting Descriptor, instance and vim
+
+    :FOR    ${ns}  IN   @{ns_ids}
+    \   Delete NS   ${ns}
+
+    :FOR    ${nsd}  IN   @{nsd_ids}
+    \   Delete NSD      ${nsd}
+
+    :FOR    ${vnfd}  IN   @{vnfd_ids}
+    \   Delete VNFD     ${vnfd}
+
+#    :FOR    ${vim_id}  IN   @{vim}
+#    \   Delete Vim Account    ${vim_id}
diff --git a/robot-systest/deprecated/testsuite/cli/__init__.robot b/robot-systest/deprecated/testsuite/cli/__init__.robot
new file mode 100644 (file)
index 0000000..2d959da
--- /dev/null
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+*** Settings ***
+Library     OperatingSystem
+Library     String
+Library     Collections
+Library     ../../lib/custom_lib.py
+Resource    ../../lib/cli/vim_account_lib.robot
+
+Suite Setup     Wait Until Keyword Succeeds    2x    30sec    VIM Setup To Launch Network Services
+Suite Teardown     Run Keyword And Ignore Error    Suite Cleanup
+
+
+*** Variables ***
+@{vim}
+
+
+*** Keywords ***
+Suite Cleanup
+    :FOR    ${vim_id}  IN   @{vim}
+    \   Force Delete Vim Account    ${vim_id}
\ No newline at end of file
diff --git a/robot-systest/deprecated/testsuite/client_library/TS01__OSMClient_Library_Test.robot b/robot-systest/deprecated/testsuite/client_library/TS01__OSMClient_Library_Test.robot
new file mode 100644 (file)
index 0000000..88d8b5c
--- /dev/null
@@ -0,0 +1,82 @@
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+
+*** Settings ***
+Documentation    Test suite to test osmclient python library
+Library     OperatingSystem
+
+Suite Setup    Setup OSM Client
+
+
+*** Variables ***
+${name}     helloworld-os
+${user}     robottest
+${password}     fred
+${authurl}      https://169.254.169.245/
+${type}     openstack
+${desc}     a test vim
+${tenant}    robottest
+
+
+*** Test Cases ***
+Get VIM Account List Test
+    [Tags]    comprehensive    osmclient_lib
+    [Documentation]    Using python's osmclient library to get vim account list
+
+    ${vim_list}=    osmclient.get_vim_list
+    log to console    ${vim_list}
+    log  ${vim_list}
+
+
+Get VNF Descriptor List Test
+    [Tags]    comprehensive    osmclient_lib
+    [Documentation]    Using python's osmclient library to get vnfd list
+
+    ${vnfd_list}=    osmclient.get_vnfd_list
+    log to console    ${vnfd_list}
+    log  ${vnfd_list}
+
+
+Get NS Descriptor List Test
+    [Tags]    comprehensive    osmclient_lib
+    [Documentation]    Using python's osmclient library to get nsd list
+
+    ${nsd_list}=    osmclient.get_nsd_list
+    log to console    ${nsd_list}
+    log  ${nsd_list}
+
+
+Create Vim Account Test
+    [Tags]    comprehensive    osmclient_lib
+    [Documentation]    Using python's osmclient library to create vim account
+    [Template]    osmclient.create_vim_account
+    ${name}  ${type}  ${user}  ${password}  ${authurl}  ${tenant}  ${desc}
+
+
+Delete Vim Account Test
+    [Tags]    comprehensive    osmclient_lib
+    [Documentation]    Using python's osmclient library to delete vim account
+    osmclient.delete_vim_account    ${name}
+
+
+*** Keywords ***
+Setup OSM Client
+    evaluate    sys.path.append('${CURDIR}${/}../../lib/client_lib')    modules=sys
+    ${host}=    Get Environment Variable    OSM_HOSTNAME    127.0.0.1
+    Import Library    client_lib.ClientLib    host=${host}    WITH NAME    osmclient
diff --git a/robot-systest/deprecated/testsuite/gui/TS01__Test_GUI_Login.robot b/robot-systest/deprecated/testsuite/gui/TS01__Test_GUI_Login.robot
new file mode 100644 (file)
index 0000000..4f20a18
--- /dev/null
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com
+##
+
+
+*** Settings ***
+Documentation    Suite description
+Library          SeleniumLibrary
+Library          OperatingSystem
+Resource         ../../lib/gui/login_gui.robot
+
+
+*** Test Cases ***
+Valid Login
+    [Tags]    comprehensive   gui_login_test
+    [Setup]    Set Server URL
+    Open Browser To Login Page
+    Enter Credentials    admin    admin
+    Submit Credentials
+    Home Page Should Be Open
+    [Teardown]    Close Browser
diff --git a/robot-systest/environment.rc b/robot-systest/environment.rc
new file mode 100644 (file)
index 0000000..a459e47
--- /dev/null
@@ -0,0 +1,20 @@
+#   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.
+
+echo "Please set your environment variables."
+# export OSM_HOSTNAME=<OSM_HOSTNAME>
+# export OS_CLOUD=<OS_CLOUD>
+# export VIM_TARGET=<VIM_TARGET>
+# export VIM_MGMT_NET=<VIM_MGMT_NET>
+# export PACKAGES_FOLDER=<PACKAGES_FOLDER=>
+# export ROBOT_DEVOPS_FOLDER=<ROBOT_DEVOPS_FOLDER>
+# export ROBOT_REPORT_FOLDER=<ROBOT_REPORT_FOLDER>
diff --git a/robot-systest/lib/api/common.robot b/robot-systest/lib/api/common.robot
deleted file mode 100644 (file)
index 4724016..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com
-##
-
-
-*** Variables ***
-${token}=  ${EMPTY}
-${HOST}=  ${EMPTY}
-
-
-*** Keywords ***
-Get Auth Token
-    [Tags]  auth_token
-
-    ${nbi_host}=    Get Environment Variable    OSM_HOSTNAME
-    ${passed}=    Run Keyword And Return Status    Should Contain    ${nbi_host}    :
-    Run Keyword If    ${passed}    Set Dockerized Host    ${nbi_host}
-    ...    ELSE    Set Standalone Host    ${nbi_host}
-
-    Create Session    osmhit    ${HOST}    verify=${FALSE}    debug=1    headers=${HEADERS}
-
-    Log Many    ${auth_token_uri}    @{data}    ${data}
-
-    ${resp}=    Post Request    osmhit    ${auth_token_uri}    data=${data}
-    log    ${resp}
-
-    Pass Execution If   ${resp.status_code} in ${success_status_code_list}   Get Auth Token completed
-
-    ${content}=     To Json   ${resp.content}
-    ${t}=    Get From Dictionary       ${content}          _id
-
-    Set Suite Variable     ${token}   ${t}
-
-
-Set Dockerized Host
-    [Arguments]  ${env_host}
-
-    Set Suite Variable     ${HOST}   https://${env_host}
-
-
-Set Standalone Host
-    [Arguments]  ${env_host}
-
-    Set Suite Variable     ${HOST}   https://${env_host}:9999
diff --git a/robot-systest/lib/api/vim_lib.robot b/robot-systest/lib/api/vim_lib.robot
deleted file mode 100644 (file)
index a52354f..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-sep-2019
-##
-
-
-*** Keywords ***
-Create Vim
-    [Arguments]  ${vim_name}     ${account_type}     ${auth_url}     ${user}     ${password}     ${tenant}       ${description}
-
-    &{request_data}=        Create Dictionary      vim_user=${user}    vim_password=${password}    vim_url=${auth_url}     vim_tenant_name=${tenant}   vim_type=${account_type}    description=${description}  name=${vim_name}
-
-    &{headers}=    Create Dictionary     Authorization=Bearer ${token}      Content-Type=application/json   Accept=application/json
-
-    Create Session    osmvim    ${HOST}    verify=${FALSE}    headers=${headers}
-
-    LOG   ${request_data}
-    ${res}=     Post Request    osmvim  ${create_vim_uri}   data=${request_data}
-    log    ${res.content}
-    Pass Execution If   ${res.status_code} in ${success_status_code_list}   Create Vim Request completed
-    Get Vim ID      ${res.content}
-
-
-Delete Vim
-    [Arguments]  ${vim_id}
-
-    ${uri} =   Catenate        SEPARATOR=/     ${create_vim_uri}      ${vim_id}
-    ${resp}=    Delete Request   osmvim   ${uri}
-
-    log   ${resp.content}
-    Pass Execution If      ${resp.status_code} in ${success_status_code_list}   Delete Vim Request completed
-
-
-Get Vim ID
-    [Arguments]  ${res}
-
-#    log to console      ${res}
-    ${content}=     To Json     ${res}
-    ${id}=      Get From Dictionary     ${content}         id
-    Set Suite Variable     ${vim_id}   ${id}
-    log   Vim Id is ${vim_id}
diff --git a/robot-systest/lib/cli/network_slicing_lib.robot b/robot-systest/lib/cli/network_slicing_lib.robot
deleted file mode 100644 (file)
index 8ed3e63..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 08-nov-2019
-##
-
-*** Variables ***
-${success_return_code}    0
-${delete_max_wait_time}    1min
-${delete_pol_time}    15sec
-${ns_launch_max_wait_time}    5min
-${ns_launch_pol_time}    30sec
-
-
-*** Keywords ***
-Create NST
-    [Documentation]  Create nst at osm
-    [Arguments]  ${nst_pkg}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm nst-create ${nst_pkg}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log     ${stdout}
-    [Return]  ${stdout}
-
-
-Delete NST
-    [Documentation]  delete nst at osm
-    [Arguments]  ${nst}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm nst-delete ${nst}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log     ${stdout}
-    [Return]  ${stdout}
-
-
-Launch Network Slice Instance
-    [Arguments]  ${vim_name}    ${nst_name}    ${ns_config}=''
-
-    ${nsi_name}=    GENERATE NAME
-    Run Keyword If   ${ns_config}!=''   Create Network Slice With Config    ${nsi_name}    ${nst_name}    ${vim_name}    ${ns_config}
-    ...    ELSE    Create Network Slice Without Config    ${nsi_name}    ${nst_name}    ${vim_name}
-
-    WAIT UNTIL KEYWORD SUCCEEDS     ${ns_launch_max_wait_time}   ${ns_launch_pol_time}   Check For Network Slice Instance To Configured   ${nsi_name}
-    Check For Network Slice Instance For Failure    ${nsi_name}
-
-
-Create Network Slice With Config
-    [Arguments]  ${nsi_name}    ${nst_name}    ${vim}    ${config}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-create --nsi_name ${nsi_name} --nst_name ${nst_name} --vim_account ${vim} --config ${config}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    log     ${stdout}
-    Append To List     ${nsi_list}       ${nsi_name}
-
-
-Create Network Slice Without Config
-    [Arguments]  ${nsi_name}    ${nst_name}    ${vim}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-create --nsi_name ${nsi_name} --nst_name ${nst_name} --vim_account ${vim}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    log     ${stdout}
-    Append To List     ${nsi_list}       ${nsi_name}
-
-
-Check For Network Slice Instance For Failure
-    [Arguments]  ${nsi_name}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-list --filter name="${nsi_name}"
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    log     ${stdout}
-    Should Not Contain      ${stdout}   failed
-
-
-Check For Network Slice Instance To Configured
-    [Arguments]  ${nsi_name}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-list --filter name="${nsi_name}"
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    log     ${stdout}
-    Should Contain Any      ${stdout}   configured    failed
-
-
-Delete Network Slice Instance
-    [Documentation]  Delete ns
-    [Arguments]  ${nsi}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-delete ${nsi}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    log     ${stdout}
-
-    WAIT UNTIL KEYWORD SUCCEEDS  ${delete_max_wait_time}   ${delete_pol_time}   Check For NSI Instance To Be Delete   ${nsi}
-
-
-Check For NSI Instance To Be Delete
-    [Arguments]  ${nsi}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-list
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    log     ${stdout}
-    Should Not Contain      ${stdout}   ${nsi}
diff --git a/robot-systest/lib/cli/ns_lib.robot b/robot-systest/lib/cli/ns_lib.robot
deleted file mode 100644 (file)
index 254bc6a..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
-##
-
-
-*** Variables ***
-${success_return_code}    0
-${ns_launch_max_wait_time}    5min
-${ns_launch_pol_time}    30sec
-${ns_delete_max_wait_time}    1min
-${ns_delete_pol_time}    15sec
-${nsconfig}
-
-*** Keywords ***
-Get NS List
-    [Documentation]  Get ns instance list
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-
-
-Launch Network Services and Return
-    [Arguments]  ${vim_name}  ${ns_config}=''
-    [Documentation]  Get Configuration parameter to create Newtork service
-
-    Run Keyword If    ${ns_config}==''    Get NS Config
-    ...  ELSE  Set NS Config    ${ns_config}
-    Log To Console    \n${nsconfig}
-    Should Not Be Empty    ${nsd_ids}    There are no NS descriptors to launch the NS
-    :FOR    ${nsd}    IN    @{nsd_ids}
-    \    ${ns_name}=    GENERATE NAME
-    \    Append To List     ${ns_ids}       ${ns_name}
-    \    Create Network Service    ${nsd}   ${vim_name}    ${ns_name}    ${nsconfig}
-
-
-Set NS Config
-    [Arguments]   ${ns_config}
-    [Documentation]  Set NS Configuration variable
-
-    ${nsconfig}=    Get Variable Value    ${ns_config}    ''
-    Set Test Variable    ${nsconfig}
-
-
-Get NS Config
-    [Documentation]  Get NS Configuration from Environment Variable
-
-    ${nsconfig}=    Get Environment Variable    NS_CONFIG    ''
-    Set Test Variable    ${nsconfig}
-
-
-Create Network Service
-    [Documentation]  Create ns at osm
-    [Arguments]  ${nsd}   ${vim_name}    ${ns_name}    ${ns_config}
-
-    Run Keyword If   ${ns_config}!=''   Create Network Service With Config    ${nsd}    ${vim_name}    ${ns_name}    ${ns_config}
-    ...    ELSE    Create Network Service Without Config    ${nsd}   ${vim_name}    ${ns_name}
-
-    WAIT UNTIL KEYWORD SUCCEEDS     ${ns_launch_max_wait_time}   ${ns_launch_pol_time}   Check For NS Instance To Configured   ${ns_name}
-    Check For NS Instance For Failure    ${ns_name}
-
-
-Create Network Service Without Config
-    [Documentation]  Create ns at osm
-    [Arguments]  ${nsd}   ${vim_name}    ${ns_name}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-create --ns_name ${ns_name} --nsd_name ${nsd} --vim_account ${vim_name}
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-
-
-Create Network Service With Config
-    [Documentation]  Create ns at osm
-    [Arguments]  ${nsd}   ${vim_name}    ${ns_name}    ${ns_config}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-create --ns_name ${ns_name} --nsd_name ${nsd} --vim_account ${vim_name} --config ${ns_config}
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-
-
-Delete NS
-    [Documentation]  Delete ns
-    [Arguments]  ${ns}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-delete ${ns}
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-
-    WAIT UNTIL KEYWORD SUCCEEDS  ${ns_delete_max_wait_time}   ${ns_delete_pol_time}   Check For NS Instance To Be Delete   ${ns}
-
-
-Check For NS Instance To Configured
-    [Arguments]  ${ns_name}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list --filter name="${ns_name}"
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Should Contain Any      ${stdout}   READY    BROKEN
-
-
-Check For NS Instance For Failure
-    [Arguments]  ${ns_name}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list --filter name="${ns_name}"
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Should Not Contain      ${stdout}   BROKEN
-
-
-Check For NS Instance To Be Delete
-    [Arguments]  ${ns}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Should Not Contain      ${stdout}   ${ns}
-
-
-Force Delete NS
-    [Documentation]  Forcely Delete ns
-    [Arguments]  ${ns}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-delete ${ns}
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    WAIT UNTIL KEYWORD SUCCEEDS    ${ns_delete_max_wait_time}   ${ns_delete_pol_time}   Check For NS Instance To Be Delete   ${ns}
diff --git a/robot-systest/lib/cli/nsd_lib.robot b/robot-systest/lib/cli/nsd_lib.robot
deleted file mode 100644 (file)
index da27b4f..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-sep-2019
-##
-
-*** Variables ***
-${success_return_code}    0
-${delete_max_wait_time}    1min
-${delete_pol_time}    15sec
-
-
-*** Keywords ***
-Get NSDs List
-    [Documentation]  Get nsds list
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm nsd-list
-    log     ${stdout}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-
-
-Create NSD
-    [Documentation]  Create nsd at osm
-    [Arguments]  ${nsd_pkg}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm nsd-create ${nsd_pkg}
-    log     ${stdout}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    [Return]  ${stdout}
-
-
-Delete NSD
-    [Documentation]  Delete nsd
-    [Arguments]  ${nsd_id}
-
-    # For timebeing exception thrown by nsd-delete api was ignor because nsd was deleted successfully. The cause of exception is need to debug further
-    ${rc}   ${stdout}=      Run Keyword And Continue On Failure    Run and Return RC and Output            osm nsd-delete ${nsd_id}
-    log     ${stdout}
-#    Should Be Equal As Integers       ${rc}     ${success_return_code}
-    WAIT UNTIL KEYWORD SUCCEEDS    ${delete_max_wait_time}   ${delete_pol_time}   Check For NSD   ${nsd_id}
-
-
-Check For NSD
-    [Arguments]  ${nsd_id}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm nsd-list
-    log     ${stdout}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    Should Not Contain      ${stdout}   ${nsd_id}
-
-
-Force Delete NSD
-    [Documentation]  Forcely Delete nsd
-    [Arguments]  ${nsd_id}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm nsd-delete ${nsd_id}
-    log     ${stdout}
-    Should Be Equal As Integers        ${rc}   ${success_return_code}
-
-
-Build NS Descriptor
-    [Documentation]  Build NS Descriptor from the descriptor-packages
-    [Arguments]  ${nsd path}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           make -C '${CURDIR}${/}../../..${nsd path}'
-    log     ${stdout}
-    Should Be Equal As Integers        ${rc}   ${success_return_code}
diff --git a/robot-systest/lib/cli/osm_platform_resiliancy_recovery_lib.robot b/robot-systest/lib/cli/osm_platform_resiliancy_recovery_lib.robot
deleted file mode 100644 (file)
index fb86768..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 08-nov-2019
-##
-
-
-*** Variables ***
-${success_return_code}    0
-${er_replicas}    0/1
-
-
-*** Keywords ***
-Check If OSM Working
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm vnfpkg-list
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm vim-list
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-
-
-Check All Service Are Running
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    docker service ls
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Should Not Contain      ${stdout}   ${er_replicas}
-
-
-Kill Docker Container
-    [Arguments]  ${name}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    docker rm -f \$(docker ps |grep -i ${name}|awk '{print $1}')
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
\ No newline at end of file
diff --git a/robot-systest/lib/cli/rbac_lib.robot b/robot-systest/lib/cli/rbac_lib.robot
deleted file mode 100644 (file)
index bbf717a..0000000
+++ /dev/null
@@ -1,245 +0,0 @@
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 21-nov-2019
-##
-
-*** Keywords ***
-Configure NBI For RBAC
-    ${rc}   ${stdout}=      Run and Return RC and Output    docker service update osm_nbi --force --env-add OSMNBI_AUTHENTICATION_BACKEND=keystone --env-add OSMNBI_AUTHENTICATION_AUTH_URL=keystone --env-add OSMNBI_AUTHENTICATION_AUTH_PORT=5000 --env-add OSMNBI_AUTHENTICATION_USER_DOMAIN_NAME=default --env-add OSMNBI_AUTHENTICATION_PROJECT_DOMAIN_NAME=default --env-add OSMNBI_AUTHENTICATION_SERVICE_USERNAME=nbi --env-add OSMNBI_AUTHENTICATION_SERVICE_PROJECT=service
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    Sleep    30s    Wait for NBI service to be update
-
-
-Create User
-    [Arguments]  ${user}    ${password}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-create ${user} --password ${password}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log     ${stdout}
-    [Return]    ${stdout}
-
-
-List User
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-list
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log     ${stdout}
-    [Return]    ${stdout}
-
-
-List User And Check For The Created User
-    [Arguments]  ${user}
-    ${user list}=    List User
-    Should Contain    ${user list}    ${user}
-
-
-Get User Info By Name
-    [Arguments]  ${user_name}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-show ${user_name}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log     ${stdout}
-
-
-Get User Info By ID
-    [Arguments]  ${user_id}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-show ${user_id}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log     ${stdout}
-
-
-Update User
-    [Arguments]  ${user}    ${field}    ${value}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-update ${field} ${value} ${user}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log     ${stdout}
-
-
-Update User And Verify Info
-    [Arguments]    ${user}  @{args}
-    FOR    ${arg}    IN    @{args}
-        ${fields}=    Get Dictionary Items    ${arg}
-        Update User    ${user}    ${fields[0]}    ${fields[1]}
-    END
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-show ${user}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log     ${stdout}
-
-
-Login With User And Perform Operation
-    [Arguments]  ${user}    ${password}    ${project}
-    ${rc}   ${stdout}=      Run and Return RC and Output    export OSM_USER=${user}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    ${rc}   ${stdout}=      Run and Return RC and Output    export OSM_PROJECT=${project}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    ${rc}   ${stdout}=      Run and Return RC and Output    export OSM_PASSWORD=${password}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log    ${stdout}
-    Logout and Login With Admin
-
-
-Logout and Login With Admin
-    ${rc}   ${stdout}=      Run and Return RC and Output    export OSM_USER=admin
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    ${rc}   ${stdout}=      Run and Return RC and Output    export OSM_PASSWORD=admin
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-
-
-Delete User
-    [Arguments]  ${user}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-delete ${user}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-
-
-Delete User And Check
-    [Arguments]  ${user}
-    Delete User    ${user}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-list
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    Should Not Contain      ${stdout}   ${user}
-
-
-Create Project
-    [Arguments]  ${project}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-create ${project}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log  ${stdout}
-    [Return]  ${stdout}
-
-
-List Project
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-list
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log  ${stdout}
-    [Return]  ${stdout}
-
-
-List Project And Verify
-    [Arguments]  ${project}
-    ${project list}=    List Project
-    Should Contain    ${project list}    ${project}
-
-
-Get Project Info By Name
-    [Arguments]  ${project_name}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-show ${project_name}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log  ${stdout}
-    [Return]  ${stdout}
-
-
-Get Project Info By ID
-    [Arguments]  ${project_id}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-show ${project_id}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log  ${stdout}
-    [Return]  ${stdout}
-
-
-Update Project
-    [Arguments]  ${project}    ${feild}    ${value}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-update ${feild} ${value} ${project}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log  ${stdout}
-
-
-Update Project Name And Verify
-    [Arguments]  ${old_name}    ${new_name}
-    Update Project    ${old_name}    --name    ${new_name}
-    List Project And Verify    ${new_name}
-
-
-Delete Project
-    [Arguments]  ${project}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-delete ${project}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-
-
-Delete Project And Verify
-    [Arguments]  ${project}
-    Delete Project    ${project}
-    ${project_list}=    List Project
-    Should Not Contain    ${project_list}    ${project}
-
-
-Create Role
-    [Arguments]  ${role}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-create ${role}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log  ${stdout}
-    [Return]  ${stdout}
-
-
-List Roles
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-list
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log  ${stdout}
-    [Return]  ${stdout}
-
-
-List Roles And Verify
-    [Arguments]  ${role}
-    ${role_list}=    List Roles
-    Should Contain    ${role_list}    ${role}
-
-
-Get Role Info By Name
-    [Arguments]  ${role}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-show ${role}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log  ${stdout}
-    [Return]  ${stdout}
-
-
-Get Role Info By ID
-    [Arguments]  ${role_id}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-show ${role_id}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log  ${stdout}
-    [Return]  ${stdout}
-
-
-Update Role
-    [Arguments]  ${role}    ${feild}    ${value}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-update ${feild} ${value} ${role}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    log  ${stdout}
-
-
-Add Role And Verify
-    [Arguments]  ${role}    ${role_to_add}
-    Update Role    ${role}    --add    ${role_to_add}
-    ${role_info}=    Get Role Info By Name    ${role}
-#    Should Contain    ${role_info}    ${role_to_add}
-
-
-Delete Role
-    [Arguments]  ${role}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-delete ${role}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-
-
-Delete Role And Verify
-    [Arguments]  ${role}
-    Delete Role    ${role}
-    ${role_list}=    List Roles
-    Should Not Contain    ${role_list}    ${role}
diff --git a/robot-systest/lib/cli/sdnc_account_lib.robot b/robot-systest/lib/cli/sdnc_account_lib.robot
deleted file mode 100644 (file)
index 71680b8..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-
-*** Variables ***
-${success_return_code}    0
-${name}     "OpenSite"
-${user}     "admin"
-${password}     "admin"
-${ip}      "1.1.1.1"
-${type}     "onos"
-${port}     "5858"
-${dpid}   "a7:2f:aa:be:C3:c1:fe:C9"
-
-
-*** Keywords ***
-Create SDNC Account
-    [Documentation]  create new sdnc account
-
-     ${rc}    ${stdout}=      Run and Return RC and Output      osm sdnc-create --name ${name} --type ${type} --ip_address ${ip} --user ${user} --password ${password} --port ${port} --switch_dpid ${dpid}
-    log  ${rc}
-    log  ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-
-
-Get SDNC List
-    [Documentation]  Get a sdnc account list
-
-    ${rc}    ${stdout}=      Run and Return RC and Output       osm sdnc-list
-    log     ${stdout}
-
-
-Show SDNC Account
-    [Documentation]  Get sdnc account details
-
-    ${rc}    ${stdout}=      Run and Return RC and Output       osm sdnc-show ${name}
-    log  ${rc}
-    log  ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-
-
-Delete SDNC Account
-    [Documentation]  Get sdnc account details
-
-    ${rc}    ${stdout}=      Run and Return RC and Output       osm sdnc-delete ${name}
-    log  ${rc}
-    log  ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
\ No newline at end of file
diff --git a/robot-systest/lib/cli/vim_account_lib.robot b/robot-systest/lib/cli/vim_account_lib.robot
deleted file mode 100644 (file)
index 8d01b39..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-sep-2019
-##
-
-*** Settings ***
-Library     OperatingSystem
-Library     String
-Library     Collections
-Library     ../custom_lib.py
-
-
-*** Variables ***
-${success_return_code}    0
-${user}     "robottest"
-${password}     "fred"
-${authurl}      "https://127.0.0.1/"
-${type}     "openstack"
-${desc}     "a test vim"
-${tenant}   "robottest2"
-
-
-*** Keywords ***
-Create Vim Account
-    [Documentation]   Create a new vim account
-
-    ${vim-name}=     Generate Random String  8  [NUMBERS]
-    ${vim-name}=     Catenate  SEPARATOR=  vim_  ${vim-name}
-    set global variable  ${vim-name}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm vim-create --name ${vim-name} --user ${user} --password ${password} --auth_url ${authurl} --tenant ${tenant} --account_type ${type} --description ${desc}
-    log  ${stdout}
-    Should Be Equal As Integers        ${rc}    ${success_return_code}
-
-
-Get Vim List
-    [Documentation]  Get a vim account list
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm vim-list
-    log     ${stdout}
-    Log To Console  ${stdout}
-    Should Be Equal As Integers        ${rc}    ${success_return_code}
-
-
-Delete Vim Account
-    [Documentation]  delete vim account details
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm vim-delete ${vim-name}
-    log  ${stdout}
-    Should Be Equal As Integers        ${rc}    ${success_return_code}
-
-
-VIM Setup To Launch Network Services
-    [Documentation]  Setup a VIM to launch network services
-
-    set global variable    @{vim}
-    ${vmware_url}=  Get Environment Variable    VCD_AUTH_URL   ${EMPTY}
-    ${openstack_url}=   Get Environment Variable    OS_AUTH_URL   ${EMPTY}
-    ${vmware_vim}=    Run Keyword And Return If   '${vmware_url}'!='${EMPTY}'   Setup Vmware Vim   ${vmware_url}   'vmware'      'pytest system test'
-    ${openstack_vim}=    Run Keyword And Return If   '${openstack_url}'!='${EMPTY}'   Setup Openstack Vim    ${openstack_url}    'openstack'   'pytest system test'
-    Should Not Be Empty    ${vim}    VIM details not provided
-    Log Many   @{vim}
-
-
-Setup Openstack Vim
-    [Documentation]  Openstack Vim Account Setup
-    [Tags]    vim-setup
-    [Arguments]  ${authurl}  ${type}     ${desc}
-
-    ${user}=  Get Environment Variable    OS_USERNAME   ''
-    ${password}=  Get Environment Variable    OS_PASSWORD   ''
-    ${tenant}=  Get Environment Variable    OS_PROJECT_NAME   ''
-    ${vim-config}=  Get Environment Variable    OS_VIM_CONFIG   ''
-    ${vim_name}=    GENERATE NAME
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm vim-create --name ${vim_name} --user ${user} --password ${password} --auth_url ${authurl} --tenant ${tenant} --account_type ${type} --description ${desc} --config ${vim-config}
-    log  ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Sleep    30s    Wait for to get vim ready
-    ${rc}   ${vim_detail}=      Run and Return RC and Output    osm vim-show ${vim_name}
-    Should Contain    ${vim_detail}    "operationalState": "ENABLED"    msg=Openstack vim is not available    values=False
-    Append To List     ${vim}       ${stdout}
-
-    [Return]  ${stdout}
-
-
-Setup Vmware Vim
-    [Documentation]  Vmware Vim Account Setup
-    [Tags]    vim-setup
-    [Arguments]  ${authurl}  ${type}     ${desc}
-
-    ${user}=  Get Environment Variable    VCD_USERNAME   ''
-    ${password}=  Get Environment Variable    VCD_PASSWORD   ''
-    ${tenant}=  Get Environment Variable    VCD_TENANT_NAME   ''
-    ${vcd-org}=  Get Environment Variable    VCD_ORGANIZATION   ''
-    ${vim-config}=  Get Environment Variable    VCD_VIM_CONFIG   ''
-    ${vim_name}=    GENERATE NAME
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm vim-create --name ${vim_name} --user ${user} --password ${password} --auth_url ${authurl} --tenant ${tenant} --account_type ${type} --description ${desc} --config ${vim-config}
-    log  ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Sleep    30s    Wait for to get vim ready
-    ${rc}   ${vim_detail}=      Run and Return RC and Output    osm vim-show ${vim_name}
-    Should Contain    ${vim_detail}    "operationalState": "ENABLED"    msg=VMWare VCD vim is not available    values=False
-    Append To List     ${vim}       ${stdout}
-
-    [Return]  ${stdout}
-
-
-Force Delete Vim Account
-    [Documentation]  delete vim account details
-    [Arguments]  ${vim_name}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm vim-delete ${vim_name}
-    log  ${stdout}
-    Should Be Equal As Integers        ${rc}    ${success_return_code}
diff --git a/robot-systest/lib/cli/vnfd_lib.robot b/robot-systest/lib/cli/vnfd_lib.robot
deleted file mode 100644 (file)
index 1b99f43..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-sep-2019
-##
-
-*** Variables ***
-${success_return_code}    0
-${delete_max_wait_time}    1min
-${delete_pol_time}    15sec
-
-
-*** Keywords ***
-Get VNFDs List
-    [Documentation]  Get vnfds list
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm vnfd-list
-    log     ${stdout}
-    log     ${rc}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-
-
-Create VNFD
-    [Documentation]  Create vnfd at osm
-    [Arguments]  ${vnfd_pkg}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm vnfd-create ${vnfd_pkg}
-    log     ${stdout}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    [Return]  ${stdout}
-
-
-Delete VNFD
-    [Documentation]  Delete vnfd
-    [Arguments]  ${vnfd_id}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm vnfd-delete ${vnfd_id}
-    log     ${stdout}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    WAIT UNTIL KEYWORD SUCCEEDS    ${delete_max_wait_time}   ${delete_pol_time}   Check For VNFD   ${vnfd_id}
-
-
-Check For VNFD
-    [Arguments]  ${vnfd_id}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm vnfd-list
-    log     ${stdout}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-    Should Not Contain      ${stdout}   ${vnfd_id}
-
-
-Force Delete VNFD
-    [Documentation]  Forcely Delete vnfd
-    [Arguments]  ${vnfd_id}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           osm vnfd-delete ${vnfd_id}
-    log     ${stdout}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
-
-
-Build VNF Descriptor
-    [Documentation]  Build VNF Descriptor from the descriptor-packages
-    [Arguments]  ${vnfd path}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output           make -C '${CURDIR}${/}../../..${vnfd path}'
-    log     ${stdout}
-    Should Be Equal As Integers        ${rc}     ${success_return_code}
diff --git a/robot-systest/lib/client_lib/client_lib.py b/robot-systest/lib/client_lib/client_lib.py
deleted file mode 100644 (file)
index c9390ae..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-
-from osmclient import client
-from robot.api import logger
-import json
-
-
-class ClientLib:
-    def __init__(self, host="127.0.0.1", user=None, password=None, project=None):
-
-        kwargs = {}
-        if user is not None:
-            kwargs['user'] = user
-        if password is not None:
-            kwargs['password'] = password
-        if project is not None:
-            kwargs['project'] = project
-        self.client = client.Client(host=host, sol005=True, **kwargs)
-
-    def get_vim_list(self):
-        resp = self.client.vim.list()
-        logger.info('VIM List: {}'.format(resp))
-        return json.dumps(resp)
-
-    def create_vim_account(self, name, vim_type, user, password, auth_url, tenant, desc='', config=None):
-        vim_access = {}
-        if config is not None:
-            vim_access['config'] = config
-        vim_access['vim-type'] = vim_type
-        vim_access['vim-username'] = user
-        vim_access['vim-password'] = password
-        vim_access['vim-url'] = auth_url
-        vim_access['vim-tenant-name'] = tenant
-        vim_access['description'] = desc
-
-        resp = self.client.vim.create(name, vim_access)
-        logger.info('Create VIM Account: {}'.format(resp))
-        return json.dumps(resp)
-
-    def delete_vim_account(self, name):
-        resp = self.client.vim.delete(name)
-        return json.dumps(resp)
-
-    def get_vnfd_list(self):
-        resp = self.client.vnfd.list()
-        logger.info('VNF Descriptor List: {}'.format(resp))
-        return json.dumps(resp)
-
-    def get_nsd_list(self):
-        resp = self.client.nsd.list()
-        logger.info('NS Descriptor List: {}'.format(resp))
-        return json.dumps(resp)
diff --git a/robot-systest/lib/connectivity_lib.robot b/robot-systest/lib/connectivity_lib.robot
new file mode 100644 (file)
index 0000000..7b86593
--- /dev/null
@@ -0,0 +1,19 @@
+#   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.
+
+*** Keywords ***
+Test Connectivity
+    [Arguments]  ${host}
+
+    ${result}  Run Process  ping -c 5 -W 1 ${host} > /dev/null && echo OK  shell=True
+    Log     all output: ${result.stdout}
+    Should Contain  ${result.stdout}  OK
diff --git a/robot-systest/lib/custom_lib.py b/robot-systest/lib/custom_lib.py
deleted file mode 100644 (file)
index 4603f44..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
-##
-
-import random
-from haikunator import Haikunator
-
-
-def generate_name():
-    haikunator = Haikunator()
-    name = haikunator.haikunate(delimiter='_', token_length=2)
-    return name
-
-
-def get_random_item_from_list(l):
-    assert isinstance(l, list), "List should be provided"
-    return random.choice(l)
diff --git a/robot-systest/lib/gui/login_gui.robot b/robot-systest/lib/gui/login_gui.robot
deleted file mode 100644 (file)
index c125664..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
-##
-
-
-*** Variables ***
-${DESIRED_CAPABILITIES}    desired_capabilities
-${BROWSER}        Chrome
-${DELAY}          0
-${VALID USER}     admin
-${VALID PASSWORD}    admin
-${LOGIN URL}      /auth/
-${WELCOME URL}    /projects/
-${NS LIST URL}    /packages/ns/list
-${VNF LIST URL}    /packages/vnf/list
-
-
-*** Keywords ***
-Set Server URL
-    ${env_host}=    Get Environment Variable    OSM_HOSTNAME
-    ${passed}=    Run Keyword And Return Status    Should Contain    ${env_host}    :
-    Run Keyword If    ${passed}    Set Dockerized Host
-    ...    ELSE    Set Standalone Host    ${env_host}
-
-
-Open Browser To Login Page
-    ${chrome_options} =     Evaluate    sys.modules['selenium.webdriver'].ChromeOptions()    sys, selenium.webdriver
-    Call Method    ${chrome_options}   add_argument    headless
-    Call Method    ${chrome_options}   add_argument    disable-gpu
-    Call Method    ${chrome_options}   add_argument    no-sandbox
-    ${options}=     Call Method     ${chrome_options}    to_capabilities
-    Open Browser    ${SERVER}${LOGIN URL}    ${BROWSER}    desired_capabilities=${options}
-    Maximize Browser Window
-    Set Selenium Speed    ${DELAY}
-    Login Page Should Be Open
-
-
-Login Page Should Be Open
-    Element Text Should Be    //*[@id="main_content"]/div/div[2]/p    Sign in to start your session
-
-
-Enter Credentials
-    [Arguments]    ${username}    ${password}
-    Input Text    name:username    ${username}
-    Input Password    name:password    ${password}
-
-
-Submit Credentials
-    Click Button    //*[@id="main_content"]/div/div[2]/form/div[3]/div[2]/button
-
-
-Home Page Should Be Open
-    Location Should Be    ${SERVER}${WELCOME URL}
-#    Element Should Contain    id:title_header    6e3a8415-9014-4100-9727-90e0150263be    ignore_case=True
-    Element Attribute Value Should Be    //*[@id="main_content"]/div/div[2]/div[1]/div[1]/div/a    href    ${SERVER}${NS LIST URL}
-    Element Attribute Value Should Be    //*[@id="main_content"]/div/div[2]/div[1]/div[2]/div/a    href    ${SERVER}${VNF LIST URL}
-
-
-Set Dockerized Host
-
-    Set Suite Variable     ${SERVER}   http://light-ui
-
-
-Set Standalone Host
-    [Arguments]  ${env_host}
-
-    Set Suite Variable     ${SERVER}   http://${env_host}
diff --git a/robot-systest/lib/ns_lib.robot b/robot-systest/lib/ns_lib.robot
new file mode 100644 (file)
index 0000000..cc252fb
--- /dev/null
@@ -0,0 +1,82 @@
+#   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.
+
+*** Variables ***
+${success_return_code}   0
+${ns_launch_max_wait_time}   5min
+${ns_launch_pol_time}   30sec
+${ns_delete_max_wait_time}   1min
+${ns_delete_pol_time}   15sec
+
+*** Keywords ***
+Create Network Service
+    [Arguments]   ${nsd}   ${vim_name}   ${ns_name}   ${ns_config}   ${publickey}
+
+    ${config_attr}   Set Variable If   '${ns_config}'!='${EMPTY}'   --config '${ns_config}'   \
+    ${sshkeys_attr}   Set Variable If   '${publickey}'!='${EMPTY}'   --ssh_keys ${publickey}   \
+
+    ${ns_id}=   Instantiate Network Service   ${ns_name}   ${nsd}   ${vim_name}   ${config_attr} ${sshkeys_attr}
+    log   ${ns_id}
+
+    WAIT UNTIL KEYWORD SUCCEEDS   ${ns_launch_max_wait_time}   ${ns_launch_pol_time}   Check For NS Instance To Configured   ${ns_name}
+    Check For NS Instance For Failure   ${ns_name}
+    [Return]  ${ns_id}
+
+Instantiate Network Service
+    [Arguments]   ${ns_name}   ${nsd}   ${vim_name}   ${ns_extra_args}
+
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-create --ns_name ${ns_name} --nsd_name ${nsd} --vim_account ${vim_name} ${ns_extra_args}
+    log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    [Return]  ${stdout}
+
+Get Vnf Management Ip Address
+    [Arguments]   ${ns_id}   ${vnf_member_index}
+
+    Should Not Be Empty   ${ns_id}
+    Should Not Be Empty   ${vnf_member_index}
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-list --filter member-vnf-index-ref=${vnf_member_index} | grep ${ns_id} | awk '{print $14}' 2>&1
+    log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    [Return]  ${stdout}
+
+Check For NS Instance To Configured
+    [Arguments]  ${ns_name}
+
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-list --filter name="${ns_name}"
+    log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    Should Contain Any   ${stdout}   READY   BROKEN
+
+Check For NS Instance For Failure
+    [Arguments]  ${ns_name}
+
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-list --filter name="${ns_name}"
+    log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    Should Not Contain   ${stdout}   BROKEN
+
+Check For NS Instance To Be Deleted
+    [Arguments]  ${ns}
+
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-list | awk '{print $2}' | grep ${ns}
+    Should Not Be Equal As Strings   ${stdout}   ${ns}
+
+Delete NS
+    [Documentation]  Delete ns
+    [Arguments]  ${ns}
+
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-delete ${ns}
+    log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${success_return_code}
+
+    WAIT UNTIL KEYWORD SUCCEEDS  ${ns_delete_max_wait_time}   ${ns_delete_pol_time}   Check For NS Instance To Be Deleted   ${ns}
diff --git a/robot-systest/lib/nsd_lib.robot b/robot-systest/lib/nsd_lib.robot
new file mode 100644 (file)
index 0000000..8af1379
--- /dev/null
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-sep-2019
+##
+
+*** Variables ***
+${success_return_code}   0
+${delete_max_wait_time}   1min
+${delete_pol_time}   15sec
+
+
+*** Keywords ***
+Get NSDs List
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm nsd-list
+    log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${success_return_code}
+
+
+Create NSD
+    [Arguments]   ${nsd_pkg}
+
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm nsd-create ${nsd_pkg}
+    log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    [Return]  ${stdout}
+
+
+Delete NSD
+    [Arguments]   ${nsd_id}
+
+    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run and Return RC and Output   osm nsd-delete ${nsd_id}
+    log   ${stdout}
+    WAIT UNTIL KEYWORD SUCCEEDS   ${delete_max_wait_time}   ${delete_pol_time}   Check For NSD   ${nsd_id}
+
+
+Check For NSD
+    [Arguments]   ${nsd_id}
+
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm nsd-list | awk '{print $2}' | grep ${nsd_id}
+    Should Not Be Equal As Strings   ${stdout}   ${nsd_id}
diff --git a/robot-systest/lib/ssh_lib.robot b/robot-systest/lib/ssh_lib.robot
new file mode 100644 (file)
index 0000000..3d2d708
--- /dev/null
@@ -0,0 +1,54 @@
+#   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.
+
+*** Keywords ***
+Test SSH Connection
+    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}
+
+    Open Connection     ${host}
+    Run Keyword If   '${password}'!='${EMPTY}'   Login   ${username}   ${password}
+    ...   ELSE   Login With Public Key   ${username}   ${privatekey}
+    Execute Command   hostname
+    Close All Connections
+
+Check If remote File Exists
+    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${file}
+
+    Open Connection   ${host}
+    Run Keyword If   '${password}'!='${EMPTY}'  Login  ${username}  ${password}
+    ...   ELSE   Login With Public Key  ${username}  ${privatekey}
+    ${rc}=   Execute Command   ls ${file} >& /dev/null   return_stdout=False   return_rc=True
+    Close All Connections
+    Should Be Equal As Integers   ${rc}   0
+
+Get Remote File Content
+    [Arguments]  ${host}  ${username}  ${password}  ${privatekey}   ${file}
+
+    Open Connection     ${host}
+    Run Keyword If   '${password}'!='${EMPTY}'  Login  ${username}  ${password}
+    ...   ELSE   Login With Public Key  ${username}  ${privatekey}
+    ${output}=   Execute Command   cat ${file}
+    Close All Connections
+    [Return]   ${output}
+
+Execute Remote Command Check Rc Return Output
+    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${command}
+
+    Open Connection   ${host}
+    Run Keyword If   '${password}'!='${EMPTY}'  Login  ${username}  ${password}
+    ...   ELSE   Login With Public Key  ${username}  ${privatekey}
+    ${stdout}   ${rc}=   Execute Command   ${command}   return_rc=True   return_stdout=True
+    log   ${rc}
+    log   ${stdout}
+    Close All Connections
+    Should Be Equal As Integers   ${rc}   0
+    [Return]   ${stdout}
\ No newline at end of file
diff --git a/robot-systest/lib/vnfd_lib.robot b/robot-systest/lib/vnfd_lib.robot
new file mode 100644 (file)
index 0000000..828ea0a
--- /dev/null
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# 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.
+##
+
+## Change log:
+# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-sep-2019
+##
+
+*** Variables ***
+${success_return_code}   0
+${delete_max_wait_time}   1min
+${delete_pol_time}   15sec
+
+
+*** Keywords ***
+Get VNFDs List
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfd-list
+    log   ${stdout}
+    log   ${rc}
+    Should Be Equal As Integers   ${rc}   ${success_return_code}
+
+
+Create VNFD
+    [Arguments]   ${vnfd_pkg}
+
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfd-create ${vnfd_pkg}
+    log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    [Return]  ${stdout}
+
+
+Delete VNFD
+    [Arguments]   ${vnfd_id}
+
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfd-delete ${vnfd_id}
+    log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    WAIT UNTIL KEYWORD SUCCEEDS   ${delete_max_wait_time}   ${delete_pol_time}   Check For VNFD   ${vnfd_id}
+
+
+Check For VNFD
+    [Arguments]   ${vnfd_id}
+
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfd-list | awk '{print $2}' | grep ${vnfd_id}
+    Should Not Be Equal As Strings   ${stdout}   ${vnfd_id}
diff --git a/robot-systest/resource/api/common.robot b/robot-systest/resource/api/common.robot
deleted file mode 100644 (file)
index 9342316..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com
-##
-
-
-*** Variables ***
-&{HEADERS}     Content-Type=application/json       Accept=application/json
-&{data}        username=admin      password=admin      project-id=admin
-@{success_status_code_list}     200     201     202    204
-
-${descriptor_content_type_gzip}   application/gzip
-
-${auth_token_uri}   /osm/admin/v1/tokens
-
-${get_all_vnfd_uri}   /osm/vnfpkgm/v1/vnf_packages
-${create_vnfd_uri}   /osm/vnfpkgm/v1/vnf_packages_content
-${delete_vnfd_uri}   /osm/vnfpkgm/v1/vnf_packages
-
-${get_all_nsd_uri}   /osm/nsd/v1/ns_descriptors
-${create_nsd_uri}   /osm/nsd/v1/ns_descriptors_content
-${delete_nsd_uri}   /osm/nsd/v1/ns_descriptors
-
-${base_ns_uri}   /osm/nslcm/v1/ns_instances_content
-${create_ns_uri}   /osm/nslcm/v1/ns_instances_content
-
-${create_vim_uri}   /osm/admin/v1/vim_accounts
diff --git a/robot-systest/resource/api/variables.py b/robot-systest/resource/api/variables.py
deleted file mode 100644 (file)
index a97763a..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-sep-2019
-##
-
-
-# Create/Delete Vim Account
-vim_name = 'API-TEST-VIM'
-account_type = 'openstack'
-auth_url = 'http://127.0.0.1:5000/v3'
-user = 'admin'
-password = 'admin'
-tenant = 'admin'
-description = 'Test OpenStack Vim Account'
diff --git a/robot-systest/resource/cli/hackfest_basic_ns_data.py b/robot-systest/resource/cli/hackfest_basic_ns_data.py
deleted file mode 100644 (file)
index 8b8054b..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
-##
-
-
-# VNFD Details
-vnfdPckgPath = "/descriptor-packages/vnfd/hackfest_basic_vnf"
-vnfdPckg = '/build/hackfest_basic_vnf.tar.gz'
-
-# NSD Details
-nsdPckgPath = "/descriptor-packages/nsd/hackfest_basic_ns"
-nsdPckg = '/build/hackfest_basic_ns.tar.gz'
diff --git a/robot-systest/resource/cli/hackfest_cloudinit_ns_data.py b/robot-systest/resource/cli/hackfest_cloudinit_ns_data.py
deleted file mode 100644 (file)
index d725a36..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
-##
-
-
-# VNFD Details
-vnfdPckgPath = "/descriptor-packages/vnfd/hackfest_cloudinit_vnf"
-vnfdPckg = '/build/hackfest_cloudinit_vnf.tar.gz'
-
-# NSD Details
-nsdPckgPath = "/descriptor-packages/nsd/hackfest_cloudinit_ns"
-nsdPckg = '/build/hackfest_cloudinit_ns.tar.gz'
diff --git a/robot-systest/resource/cli/hackfest_epa_ns_data.py b/robot-systest/resource/cli/hackfest_epa_ns_data.py
deleted file mode 100644 (file)
index 8975e31..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
-##
-
-
-# VNFD Details
-vnfdPckgPath = "/descriptor-packages/vnfd/hackfest_epasriov_vnf"
-vnfdPckg = '/build/hackfest_epasriov_vnf.tar.gz'
-
-# NSD Details
-nsdPckgPath = "/descriptor-packages/nsd/hackfest_epasriov_ns"
-nsdPckg = '/build/hackfest_epasriov_ns.tar.gz'
diff --git a/robot-systest/resource/cli/hackfest_multivdu_ns_data.py b/robot-systest/resource/cli/hackfest_multivdu_ns_data.py
deleted file mode 100644 (file)
index 5ecb9e8..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
-##
-
-
-# VNFD Details
-vnfdPckgPath = "/descriptor-packages/vnfd/hackfest_multivdu_vnf"
-vnfdPckg = '/build/hackfest_multivdu_vnf.tar.gz'
-
-# NSD Details
-nsdPckgPath = "/descriptor-packages/nsd/hackfest_multivdu_ns"
-nsdPckg = '/build/hackfest_multivdu_ns.tar.gz'
diff --git a/robot-systest/resource/cli/hackfest_simplecharm_ns_data.py b/robot-systest/resource/cli/hackfest_simplecharm_ns_data.py
deleted file mode 100644 (file)
index 5ffcd35..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
-##
-
-
-# VNFD Details
-vnfdPckgPath = "/descriptor-packages/vnfd/hackfest_simplecharm_vnf"
-vnfdPckg = '/build/hackfest_simplecharm_vnf.tar.gz'
-
-# NSD Details
-nsdPckgPath = "/descriptor-packages/nsd/hackfest_simplecharm_ns"
-nsdPckg = '/build/hackfest_simplecharm_ns.tar.gz'
diff --git a/robot-systest/resource/cli/test_vnf_data.py b/robot-systest/resource/cli/test_vnf_data.py
deleted file mode 100644 (file)
index 02ee065..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com
-##
-
-
-# VNFD Details
-vnfdPckgPath = "/descriptor-packages/vnfd/cirros_vnf"
-vnfdPckg = '/build/cirros_vnf.tar.gz'
-
-# NSD Details
-nsdPckgPath = "/descriptor-packages/nsd/cirros_ns"
-nsdPckg = '/build/cirros_ns.tar.gz'
diff --git a/robot-systest/resource/cli/ubuntu-cloudinit_ns_data.py b/robot-systest/resource/cli/ubuntu-cloudinit_ns_data.py
deleted file mode 100644 (file)
index ce68037..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 TATA ELXSI
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-##
-# Author: Ragavi D (ragavi.d@tataelxsi.co.in)
-
-# VNFD Details
-vnfdPckgPath = "/descriptor-packages/vnfd/ubuntu-cloudinit_vnf"
-vnfdPckg = '/build/ubuntu-cloudinit_vnf.tar.gz'
-
-# NSD Details
-nsdPckgPath = "/descriptor-packages/nsd/ubuntu-cloudinit_ns"
-nsdPckg = '/build/ubuntu-cloudinit_ns.tar.gz'
diff --git a/robot-systest/resources/hackfest_basic_ns_data.py b/robot-systest/resources/hackfest_basic_ns_data.py
new file mode 100644 (file)
index 0000000..5d3b856
--- /dev/null
@@ -0,0 +1,27 @@
+#   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.
+
+from pathlib import Path
+
+# Get ${HOME} from local machine
+home = str(Path.home())
+# NS and VNF descriptor package files
+vnfd_pkg = 'hackfest_basic_vnf.tar.gz'
+nsd_pkg = 'hackfest_basic_ns.tar.gz'
+# NS and VNF descriptor package files
+vnfd_name = 'hackfest_basic-vnf'
+nsd_name = 'hackfest_basic-ns'
+# NS instance name
+ns_name = 'hfbasic'
+# SSH keys to be used
+publickey = home + '/.ssh/id_rsa.pub'
+privatekey = home + '/.ssh/id_rsa'
diff --git a/robot-systest/resources/hackfest_cloudinit_ns_data.py b/robot-systest/resources/hackfest_cloudinit_ns_data.py
new file mode 100644 (file)
index 0000000..6d2994b
--- /dev/null
@@ -0,0 +1,27 @@
+#   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.
+
+from pathlib import Path
+
+# Get ${HOME} from local machine
+home = str(Path.home())
+# NS and VNF descriptor package files
+vnfd_pkg = 'hackfest_cloudinit_vnf.tar.gz'
+nsd_pkg = 'hackfest_cloudinit_ns.tar.gz'
+# NS and VNF descriptor package files
+vnfd_name = 'hackfest_cloudinit-vnf'
+nsd_name = 'hackfest_cloudinit-ns'
+# NS instance name
+ns_name = 'hfcloudinit'
+# SSH keys to be used
+publickey = home + '/.ssh/id_rsa.pub'
+privatekey = home + '/.ssh/id_rsa'
diff --git a/robot-systest/resources/hackfest_multivdu_ns_data.py b/robot-systest/resources/hackfest_multivdu_ns_data.py
new file mode 100644 (file)
index 0000000..b8bc7fb
--- /dev/null
@@ -0,0 +1,27 @@
+#   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.
+
+from pathlib import Path
+
+# Get ${HOME} from local machine
+home = str(Path.home())
+# NS and VNF descriptor package files
+vnfd_pkg = 'hackfest_multivdu_vnf.tar.gz'
+nsd_pkg = 'hackfest_multivdu_ns.tar.gz'
+# NS and VNF descriptor package files
+vnfd_name = 'hackfest_multivdu-vnf'
+nsd_name = 'hackfest_multivdu-ns'
+# NS instance name
+ns_name = 'hfmultivdu'
+# SSH keys to be used
+publickey = home + '/.ssh/id_rsa.pub'
+privatekey = home + '/.ssh/id_rsa'
diff --git a/robot-systest/run_test.sh b/robot-systest/run_test.sh
deleted file mode 100644 (file)
index 3f86ff9..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/usr/bin/env bash
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-#   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.
-##
-
-## Change log:
-# 1. Feature 7829: Mrityunjay Yadav, Jayant Madavi : MY00514913@techmahindra.com : 06-Sep-2019
-# Entry script to start the vim, smoke, openstack_stage_4 and comprehensive test using Robot Framework as a Automation Test Framework
-##
-
-BASEDIR=$(dirname "$0")
-TOPDIR=$(dirname "$BASEDIR")
-DESCRIPTOR_DIR=$TOPDIR/descriptor-packages
-
-
-robot_prerequisite(){
-    echo -e "\nInstalling robot requirements"
-    # installing python packages
-    pip install haikunator requests robotframework robotframework-seleniumlibrary robotframework-requests robotframework-jsonlibrary
-}
-
-while getopts ":t:-:" o; do
-    case "${o}" in
-        t)
-            TEST=${OPTARG}
-            ;;
-        -)
-            [[ "${OPTARG}" == "do_install" ]] && robot_prerequisite && continue
-            ;;
-        \?)
-            echo -e "Invalid option: '-$OPTARG'\n" >&2
-            exit 1
-            ;;
-    esac
-done
-
-if [[ -z $TEST ]]; then
-    printf "Test not provided. \nRunning default test: smoke\n"
-    TEST="smoke"
-fi
-
-if [[ "$TEST" == "vim" ]]; then
-    echo "Robot Framework Vim Test"
-    robot -d $BASEDIR/reports -i vim $BASEDIR/testsuite/
-    exit 0
-elif [[ "$TEST" == "smoke" ]]; then
-    echo "Robot Framework SMOKE test"
-    robot --removekeywords tag:vim-setup --removekeywords WUKS -d $BASEDIR/reports -i smoke $BASEDIR/testsuite/
-    exit 0
-elif [[ "$TEST" == "sanity" ]]; then
-    echo "Robot Framework Cirros VNF Test"
-    mkdir -p $BASEDIR/images/cache
-    if [[ ! -z $OS_AUTH_URL ]]; then
-        (openstack image show cirros-0.3.5-x86_64-disk.img) || (wget -r -nc http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-disk.img -O $BASEDIR/images/cache/cirros-0.3.5-x86_64-disk.img && make $BASEDIR/images/cache/cirros-0.3.5-x86_64-disk.img && openstack image create --file $BASEDIR/images/cache/cirros-0.3.5-x86_64-disk.img cirros-0.3.5-x86_64-disk.img)
-    fi
-    if [[ ! -z $VCD_AUTH_URL ]]; then
-#        TODO: Check for image over VIM before downloading
-        if [[ ! -s $BASEDIR/images/cache/cirros-0.3.5-x86_64-disk.img ]]; then
-            wget -r -nc http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-disk.img -O $BASEDIR/images/cache/cirros-0.3.5-x86_64-disk.img
-        fi
-        ovf_converter $BASEDIR/images/cache/cirros-0.3.5-x86_64-disk.img -n cirros
-        python $TOPDIR/tools/vmware_ovf_upload.py $VCD_AUTH_URL $VCD_USERNAME $VCD_PASSWORD $VCD_ORGANIZATION $BASEDIR/images/cache/cirros.ovf
-    fi
-    robot --removekeywords tag:vim-setup --removekeywords WUKS -d $BASEDIR/reports -i sanity $BASEDIR/testsuite/
-    exit 0
-elif [[ "$TEST" == "comprehensive" ]]; then
-    echo "Robot Framework Comprehensive Test"
-    echo "Installing chrome driver and chrome for UI testing"
-    # installing chrome driver and chrome for UI testing
-    curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
-    echo "deb [arch=amd64]  http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list
-    apt-get update && apt-get -y install google-chrome-stable chromium-chromedriver
-    echo "Checking of image over VIMs"
-    mkdir -p $BASEDIR/images/cache
-    if [[ ! -z $OS_AUTH_URL ]]; then
-        (openstack image show ubuntu1604) || (wget -r -nc https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img -O $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img && make $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img && openstack image create --file $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img ubuntu1604)
-        (openstack image show hackfest3-mgmt) || (wget -r -nc https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img -O $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img && make $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img && openstack image create --file $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img hackfest3-mgmt)
-    fi
-    if [[ ! -z $VCD_AUTH_URL ]]; then
-#        TODO: Check for image over VIM before downloading
-        if [[ ! -s $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img ]]; then
-            wget -r -nc https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img -O $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img
-        fi
-        ovf_converter $BASEDIR/images/cache/xenial-server-cloudimg-amd64-disk1.img -n ubuntu1604
-        python $TOPDIR/tools/vmware_ovf_upload.py $VCD_AUTH_URL $VCD_USERNAME $VCD_PASSWORD $VCD_ORGANIZATION $BASEDIR/images/cache/ubuntu1604.ovf
-    fi
-    robot --removekeywords tag:vim-setup --removekeywords WUKS -d $BASEDIR/reports -i comprehensive $BASEDIR/testsuite/
-    exit 0
-else
-    echo "wrong test provided"
-    exit 1
-fi
-
-exit 1
diff --git a/robot-systest/testsuite/api/TS01__Vim_Account.robot b/robot-systest/testsuite/api/TS01__Vim_Account.robot
deleted file mode 100644 (file)
index be04c3f..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
-##
-
-
-*** Settings ***
-Documentation    Test Suite to create and delete vim account
-Library     Collections
-Library     RequestsLibrary
-Library     OperatingSystem
-Resource    ../../lib/api/common.robot
-Resource    ../../lib/api/vim_lib.robot
-Resource    ../../resource/api/common.robot
-Variables   ../../resource/api/variables.py
-
-Suite Setup     Get Auth Token
-Suite Teardown  Delete All Sessions
-
-
-*** Variables ***
-${vim_id}   ${EMPTY}
-
-
-*** Test Cases ***
-Create Vim Account
-    [Tags]    comprehensive   api_vim_test
-    [Template]  Create Vim
-    ${vim name}     ${account type}     ${auth url}     ${user}     ${password}     ${tenant}       ${description}
-
-
-Delete Vim Account
-    [Tags]    comprehensive   api_vim_test
-    [Template]  Delete Vim
-    ${vim_id}
diff --git a/robot-systest/testsuite/cli/TS008__Test_SDNC.robot b/robot-systest/testsuite/cli/TS008__Test_SDNC.robot
deleted file mode 100644 (file)
index 3b2b21a..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-
-*** Settings ***
-Documentation    Test suiet to create/delete sdnc account via osmclient
-Library     OperatingSystem
-Library     Collections
-Resource    ../../lib/cli/sdnc_account_lib.robot
-
-
-*** Test Cases ***
-Create SDNC Account Test
-    [Tags]  sdnc
-
-    Create SDNC Account
-
-
-Get SDNC Accounts List Test
-    [Tags]  sdnc
-
-    Get SDNC List
-
-
-Delete SDNC Account Test
-    [Tags]  sdnc
-
-    Delete SDNC Account
diff --git a/robot-systest/testsuite/cli/TS009__Feature_6283_Network_Slicing_Test.robot b/robot-systest/testsuite/cli/TS009__Feature_6283_Network_Slicing_Test.robot
deleted file mode 100644 (file)
index fa8c44a..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 08-nov-2019 : network slicing test library
-##
-
-
-*** Settings ***
-Documentation    Test Suite to create hackfest basic nestwork service
-Library     OperatingSystem
-Library     String
-Library     Collections
-Resource    ../../lib/cli/vnfd_lib.robot
-Resource    ../../lib/cli/nsd_lib.robot
-Resource    ../../lib/cli/vim_account_lib.robot
-Resource    ../../lib/cli/network_slicing_lib.robot
-Library     ../../lib/custom_lib.py
-
-Suite Teardown     Run Keyword And Ignore Error    Test Cleanup
-
-
-*** Variables ***
-${vnfd_id}
-@{vnfd_ids}
-${nsd_id}
-@{nsd_ids}
-${nst_id}
-@{nsi_list}
-${vnfdPckg}    slice_hackfest_vnfd.tar.gz
-${nsdPckg}    slice_hackfest_nsd.tar.gz
-${nstPckg}    slice_hackfest_nst.yaml
-${vnfdftpPath}    https://osm-download.etsi.org/ftp/osm-5.0-five/6th-hackfest/packages/slice_hackfest_vnfd.tar.gz
-${nsdftpPath}    https://osm-download.etsi.org/ftp/osm-5.0-five/6th-hackfest/packages/slice_hackfest_nsd.tar.gz
-${nstftpPath}    https://osm-download.etsi.org/ftp/osm-5.0-five/6th-hackfest/packages/slice_hackfest_nst.yaml
-${nst_config}    '{netslice-vld: [{name: mgmtnet, vim-network-name: mgmt}]}'
-
-
-*** Test Cases ***
-Create Slice Hackfest VNF Descriptor
-    [Tags]   slice_hackfest    comprehensive
-    [Documentation]  Create Slice Hackfest VNF Descriptor Test
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    wget -P '${CURDIR}${/}../../resource/cli/slice/' ${vnfdftpPath}
-    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../resource/cli/slice${/}${vnfdPckg}'
-    Append To List     ${vnfd_ids}       ${vnfd_id}
-
-
-Create Slice Hackfest NS Descriptor
-    [Tags]   slice_hackfest    comprehensive
-    [Documentation]  Create Slice Hackfest NS Descriptor Test
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    wget -P '${CURDIR}${/}../../resource/cli/slice/' ${nsdftpPath}
-    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../resource/cli/slice${/}${nsdPckg}'
-    Append To List     ${nsd_ids}       ${nsd_id}
-
-
-Create Slice Hackfest Network Slice Template
-    [Tags]   slice_hackfest    comprehensive
-    [Documentation]  Create Slice Hackfest Network Slice Template Test
-
-#    set suite variable    ${nst_id}
-    ${rc}   ${stdout}=      Run and Return RC and Output    wget -P '${CURDIR}${/}../../resource/cli/slice/' ${nstftpPath}
-    ${nst_id}=    Create NST    '${CURDIR}${/}../../resource/cli/slice${/}${nstPckg}'
-    Set Suite Variable    ${nst_id}
-
-
-Instanciate Network Slice
-    [Tags]  slice_hackfest    comprehensive
-    [Documentation]  Instantiate Network Slice Test
-
-    :FOR    ${vim_name}    IN    @{vim}
-    \    Launch Network Slice Instance    ${vim_name}    ${nst_id}    ${nst_config}
-
-
-Terminate Network Slice Instance
-    [Tags]  slice_hackfest    comprehensive
-    [Documentation]  Terminate Network Slice Instance Test
-
-    :FOR    ${nsi}    IN    @{nsi_list}
-    \    Delete Network Slice Instance    ${nsi}
-
-
-*** Keywords ***
-Test Cleanup
-    [Documentation]  Test Suit Cleanup: delete NST, NSD and VNFD
-
-    Delete NST    ${nst_id}
-
-#    :FOR    ${nsi}    IN    @{nsi_list}
-#    \    Delete Network Slice Instance    ${nsi}
-
-    :FOR    ${nsd}  IN   @{nsd_ids}
-    \   Delete NSD      ${nsd}
-
-    :FOR    ${vnfd}  IN   @{vnfd_ids}
-    \   Delete VNFD     ${vnfd}
-
-#    :FOR    ${vim_id}  IN   @{vim}
-#    \   Delete Vim Account    ${vim_id}
diff --git a/robot-systest/testsuite/cli/TS010__OSM_Platform_Resiliency_and_Recovery_Test.robot b/robot-systest/testsuite/cli/TS010__OSM_Platform_Resiliency_and_Recovery_Test.robot
deleted file mode 100644 (file)
index 2475e74..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 08-nov-2019 : network slicing test library
-##
-
-
-*** Settings ***
-Library     OperatingSystem
-Library     String
-Library     Collections
-Resource    ../../lib/cli/osm_platform_resiliancy_recovery_lib.robot
-Library     ../../lib/custom_lib.py
-
-
-*** Variables ***
-${max_wait_time}    5min
-${pol_time}    30sec
-@{components}    osm_keystone.1    osm_lcm.1    osm_light-ui.1    osm_mon.1    osm_mongo.1    osm_nbi.1    osm_pol.1    osm_prometheus.1    osm_ro.1    osm_kafka.1    osm_zookeeper.1    osm_mysql.1
-
-
-*** Test Cases ***
-Feature 1413 - OSM platform resiliency to single component failure
-    [Tags]  platform    resiliency
-    [Documentation]  OSM platform resiliency test
-
-    ${name}=    Get Random Item From List    ${components}
-    Check If OSM Working
-    WAIT UNTIL KEYWORD SUCCEEDS     2x   30sec   Check All Service Are Running
-    Kill Docker Container    ${name}
-    WAIT UNTIL KEYWORD SUCCEEDS     ${max_wait_time}   ${pol_time}   Check All Service Are Running
-    Check If OSM Working
-
-
-Feature 1412 - OSM platform recovery after major failure
-    [Tags]  platform    recovery
-    [Documentation]  OSM platform recovery
-
-    Check If OSM Working
-    WAIT UNTIL KEYWORD SUCCEEDS     2x   30sec   Check All Service Are Running
-    :FOR    ${component}    IN    @{components}
-    \    Kill Docker Container    ${component}
-    WAIT UNTIL KEYWORD SUCCEEDS     ${max_wait_time}   ${pol_time}   Check All Service Are Running
-    Check If OSM Working
diff --git a/robot-systest/testsuite/cli/TS011__Feature_1415_RBAC_For_Platform_Test.robot b/robot-systest/testsuite/cli/TS011__Feature_1415_RBAC_For_Platform_Test.robot
deleted file mode 100644 (file)
index c8e44e1..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 21-nov-2019
-##
-
-*** Settings ***
-Documentation    Test RBAC for platform using CRUD operations over users, projects and roles
-Library     OperatingSystem
-Library     String
-Library     Collections
-Resource    ../../lib/cli/rbac_lib.robot
-
-#Suite Setup    Configure NBI For RBAC
-Suite Teardown  Run Keyword And Ignore Error    Test Cleanup
-
-
-*** Variables ***
-${success_return_code}    0
-# Test data for Users Operations test
-${user_id}    ${EMPTY}
-&{update_field1}    --set-project=admin,system_admin,project_admin      #project,role1,role2...
-&{update_field2}    --add-project-role=admin,project_user     #project,role1,role2...
-&{update_field3}    --add-project-role=service,account_manager       #project,role1,role2...
-@{update_user}    ${update_field1}    ${update_field2}    ${update_field3}
-# Test data for Project Operations test
-${project_id}    ${EMPTY}
-# Test data for Role Operations test
-${role_id}    ${EMPTY}
-${role_to_add}    "vims: true"
-
-
-*** Test Cases ***
-Test User Operations
-    [Documentation]  Test RBAC using CRUD operation over users
-    [Tags]  rabc    rabc_users    comprehensive
-
-    ${user-name}=     Generate Random String    8    [NUMBERS]
-    ${user-name}=     Catenate  SEPARATOR=  user_  ${user-name}
-    set global variable  ${user-name}
-    ${user-password}=     Generate Random String    8    [NUMBERS]
-    set global variable  ${user-password}
-    ${user_id}=    Create User    ${user-name}    ${user-password}
-    List User And Check For The Created User    ${user-name}
-    Get User Info By Name    ${user-name}
-    Get User Info By ID    ${user_id}
-    Update User And Verify Info    ${user-name}    @{update_user}
-    Login With User And Perform Operation    ${user-name}    ${user-password}    admin
-    Delete User And Check    ${user-name}
-
-
-Test Project Operatios
-    [Documentation]  Test RBAC using CRUD operation over projects
-    [Tags]  rabc    rabc_projects    comprehensive
-
-    ${project-name}=     Generate Random String    8    [NUMBERS]
-    ${project-name}=     Catenate  SEPARATOR=  project_  ${project-name}
-    set global variable  ${project-name}
-    ${project_id}=    Create Project    ${project-name}
-    List Project And Verify    ${project-name}
-    Get Project Info By Name    ${project-name}
-    Get Project Info By ID    ${project_id}
-    ${new-project-name}=     Generate Random String    8    [NUMBERS]
-    ${new-project-name}=     Catenate  SEPARATOR=  project_  ${new-project-name}
-    set global variable  ${new-project-name}
-    Update Project Name And Verify    ${project-name}    ${new-project-name}
-    Delete Project And Verify    ${new-project-name}
-
-
-Test Role Operations
-    [Documentation]  Test RBAC using CRUD operation over roles
-    [Tags]  rabc    rabc_roles    comprehensive
-
-    ${role-name}=     Generate Random String    8    [NUMBERS]
-    ${role-name}=     Catenate  SEPARATOR=  project_  ${role-name}
-    set global variable  ${role-name}
-    ${role_id}=    Create Role    ${role-name}
-    List Roles And Verify    ${role-name}
-    Get Role Info By Name    ${role-name}
-    Get Role Info By ID    ${role_id}
-    Add Role And Verify    ${role-name}    ${role_to_add}
-    Delete Role And Verify    ${role-name}
-
-
-*** Keywords ***
-Test Cleanup
-    Delete User    ${user-name}
-    Delete Project    ${project-name}
-    Delete Project    ${new-project-name}
-    Delete Role    ${role-name}
\ No newline at end of file
diff --git a/robot-systest/testsuite/cli/TS012__Feature_7181_Allow_Instantiation_Parameters_in_CloudInit.robot b/robot-systest/testsuite/cli/TS012__Feature_7181_Allow_Instantiation_Parameters_in_CloudInit.robot
deleted file mode 100644 (file)
index 68f98fa..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-# -*- coding: utf-8 -*-\r
-\r
-##\r
-# Copyright 2019 TATA ELXSI\r
-#\r
-# All Rights Reserved.\r
-#\r
-# Licensed under the Apache License, Version 2.0 (the "License"); you may\r
-# not use this file except in compliance with the License. You may obtain\r
-# a copy of the License at\r
-#\r
-#         http://www.apache.org/licenses/LICENSE-2.0\r
-#\r
-# Unless required by applicable law or agreed to in writing, software\r
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\r
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\r
-# License for the specific language governing permissions and limitations\r
-# under the License.\r
-##\r
-\r
-## Author: Ragavi D (ragavi.d@tataelxsi.co.in)\r
-\r
-*** Settings ***\r
-Documentation     Test Suite to create hackfest basic nestwork service\r
-Suite Teardown    Run Keyword And Ignore Error    Test Cleanup\r
-Library           OperatingSystem\r
-Library           String\r
-Library           Collections\r
-Resource          ../../lib/cli/vnfd_lib.robot\r
-Resource          ../../lib/cli/nsd_lib.robot\r
-Resource          ../../lib/cli/ns_lib.robot\r
-Resource          ../../lib/cli/vim_account_lib.robot\r
-Library           ../../lib/custom_lib.py\r
-Variables         ../../resource/cli/ubuntu-cloudinit_ns_data.py\r
-\r
-*** Variables ***\r
-@{vnfd_ids}\r
-${nsd_id}         ${EMPTY}\r
-@{nsd_ids}\r
-@{ns_ids}\r
-${ns_config}      '{vld: [ {name: mgmtnet, vim-network-name: osm-ext} ], additionalParamsForVnf: [ { member-vnf-index: "1", additionalParams: { password: "PASSWORD" } } ] }'\r
-\r
-*** Test Cases ***\r
-Create Ubuntu CloudInit VNF Descriptor\r
-    [Tags]    comprehensive    ubuntu-cloudinit_ns\r
-    Build VNF Descriptor    ${vnfdPckgPath}\r
-    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../..${vnfdPckgPath}${vnfdPckg}'\r
-    Append To List    ${vnfd_ids}    ${vnfd_id}\r
-\r
-Create Ubuntu CloudInit NS Descriptor\r
-    [Tags]    comprehensive    ubuntu-cloudinit_ns\r
-    Build NS Descriptor    ${nsdPckgPath}\r
-    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../..${nsdPckgPath}${nsdPckg}'\r
-    Append To List    ${nsd_ids}    ${nsd_id}\r
-\r
-Network Service Instance Test\r
-    [Documentation]    Launch and terminate network services\r
-    [Tags]    comprehensive    ubuntu-cloudinit_ns\r
-    : FOR    ${vim_name}    IN    @{vim}\r
-    \    Launch Network Services and Return    ${vim_name}    ${ns_config}\r
-\r
-Delete NS Instance Test\r
-    [Tags]    comprehensive    ubuntu-cloudinit_ns\r
-    : FOR    ${ns}    IN    @{ns_ids}\r
-    \    Delete NS    ${ns}\r
-\r
-Delete NS Descriptor Test\r
-    [Tags]    comprehensive    ubuntu-cloudinit_ns\r
-    : FOR    ${nsd}    IN    @{nsd_ids}\r
-    \    Delete NSD    ${nsd}\r
-\r
-Delete VNF Descriptor Test\r
-    [Tags]    comprehensive    ubuntu-cloudinit_ns\r
-    : FOR    ${vnfd_id}    IN    @{vnfd_ids}\r
-    \    Delete VNFD    ${vnfd_id}\r
-\r
-*** Keywords ***\r
-Test Cleanup\r
-    [Documentation]    Test Suit Cleanup: Deliting Descriptor, instance and vim\r
-    : FOR    ${ns}    IN    @{ns_ids}\r
-    \    Delete NS    ${ns}\r
-    : FOR    ${nsd}    IN    @{nsd_ids}\r
-    \    Delete NSD    ${nsd}\r
-    : FOR    ${vnfd}    IN    @{vnfd_ids}\r
-    \    Delete VNFD    ${vnfd}\r
-    #    :FOR    ${vim_id}    IN    @{vim}\r
-    #    Delete Vim Account    ${vim_id}\r
diff --git a/robot-systest/testsuite/cli/TS01__Test_VNF.robot b/robot-systest/testsuite/cli/TS01__Test_VNF.robot
deleted file mode 100644 (file)
index 84e1f92..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Mrityunjay Yadav, Jayant Madavi : MY00514913@techmahindra.com : 06-aug-2019
-##
-
-
-*** Settings ***
-Documentation    Test Suite to test basic cirros VNF and NS using osm-client
-Library     OperatingSystem
-Library     String
-Library     Collections
-Resource    ../../lib/cli/vnfd_lib.robot
-Resource    ../../lib/cli/nsd_lib.robot
-Resource    ../../lib/cli/ns_lib.robot
-Resource    ../../lib/cli/vim_account_lib.robot
-Library     ../../lib/custom_lib.py
-Variables   ../../resource/cli/test_vnf_data.py
-
-Suite Teardown     Run Keyword And Ignore Error    Test Cleanup
-
-
-*** Variables ***
-@{vnfd_ids}
-@{nsd_ids}
-@{ns_ids}
-
-
-*** Test Cases ***
-Create VNF Descriptor Test
-    [Tags]    sanity    smoke
-
-    Build VNF Descriptor    ${vnfdPckgPath}
-    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../..${vnfdPckgPath}${vnfdPckg}'
-    Append To List     ${vnfd_ids}       ${vnfd_id}
-
-
-Create NS Descriptor Test
-    [Tags]    sanity     smoke
-
-    Build NS Descriptor    ${nsdPckgPath}
-    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../..${nsdPckgPath}${nsdPckg}'
-    Append To List     ${nsd_ids}       ${nsd_id}
-
-
-Network Service Instance Test
-    [Documentation]  Launch and terminate network services
-    [Tags]    sanity
-
-    :FOR    ${vim_name}    IN    @{vim}
-    \    Launch Network Services and Return    ${vim_name}
-
-
-Delete NS Instance Test
-    [Tags]    sanity
-
-    :FOR    ${ns}  IN   @{ns_ids}
-    \   Delete NS   ${ns}
-
-
-Delete NS Descriptor Test
-    [Tags]    sanity     smoke
-
-    :FOR    ${nsd}  IN   @{nsd_ids}
-    \   Delete NSD      ${nsd}
-
-
-Delete VNF Descriptor Test
-    [Tags]    sanity    smoke
-
-    :FOR    ${vnfd}  IN   @{vnfd_ids}
-    \   Delete VNFD     ${vnfd}
-
-
-*** Keywords ***
-Test Cleanup
-    [Documentation]  Test Suit Cleanup: Deliting Descriptor, instance and vim
-
-    :FOR    ${ns}  IN   @{ns_ids}
-    \   Delete NS   ${ns}
-
-    :FOR    ${nsd}  IN   @{nsd_ids}
-    \   Delete NSD      ${nsd}
-
-    :FOR    ${vnfd}  IN   @{vnfd_ids}
-    \   Delete VNFD     ${vnfd}
-
-#    :FOR    ${vim_id}  IN   @{vim}
-#    \   Delete Vim Account    ${vim_id}
diff --git a/robot-systest/testsuite/cli/TS02__Test_Vim.robot b/robot-systest/testsuite/cli/TS02__Test_Vim.robot
deleted file mode 100644 (file)
index 18f2a50..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-aug-2019 : Improvement to the code, robot framework initial seed code.
-##
-
-
-*** Settings ***
-Documentation    Test suiet to create/delete vim account via osmclient
-Library     OperatingSystem
-Library     Collections
-Resource    ../../lib/cli/vim_account_lib.robot
-
-
-*** Test Cases ***
-Create Vim Account Test
-    [Tags]  smoke    vim
-
-    Create Vim Account
-
-
-Get Vim Accounts List Test
-    [Tags]  vim
-
-    Get Vim List
-
-
-Delete Vim Account Test
-    [Tags]  smoke    vim
-
-    Delete Vim Account
diff --git a/robot-systest/testsuite/cli/TS03__Hackfest_Basic_NS.robot b/robot-systest/testsuite/cli/TS03__Hackfest_Basic_NS.robot
deleted file mode 100644 (file)
index 40492f7..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Mrityunjay Yadav, Jayant Madavi : MY00514913@techmahindra.com : 06-aug-2019
-##
-
-
-*** Settings ***
-Documentation    Test Suite to create hackfest basic nestwork service
-Library     OperatingSystem
-Library     String
-Library     Collections
-Resource    ../../lib/cli/vnfd_lib.robot
-Resource    ../../lib/cli/nsd_lib.robot
-Resource    ../../lib/cli/ns_lib.robot
-Resource    ../../lib/cli/vim_account_lib.robot
-Library     ../../lib/custom_lib.py
-Variables   ../../resource/cli/hackfest_basic_ns_data.py
-
-Suite Teardown     Run Keyword And Ignore Error    Test Cleanup
-
-
-*** Variables ***
-@{vnfd_ids}
-${nsd_id}
-@{nsd_ids}
-@{ns_ids}
-
-
-*** Test Cases ***
-Create Hackfest Basic VNF Descriptor
-    [Tags]   comprehensive   hackfest_basic_ns
-
-    Build VNF Descriptor    ${vnfdPckgPath}
-    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../..${vnfdPckgPath}${vnfdPckg}'
-    Append To List     ${vnfd_ids}       ${vnfd_id}
-
-
-Create Hackfest Basic NS Descriptor
-    [Tags]   comprehensive   hackfest_basic_ns
-
-    Build NS Descriptor    ${nsdPckgPath}
-    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../..${nsdPckgPath}${nsdPckg}'
-    Append To List     ${nsd_ids}       ${nsd_id}
-
-
-Network Service Instance Test
-    [Documentation]  Launch and terminate network services
-    [Tags]   comprehensive   hackfest_basic_ns
-
-    :FOR    ${vim_name}    IN    @{vim}
-    \    Launch Network Services and Return    ${vim_name}
-
-
-Delete NS Instance Test
-    [Tags]    comprehensive   hackfest_basic_ns
-
-    :FOR    ${ns}  IN   @{ns_ids}
-    \   Delete NS   ${ns}
-
-
-Delete NS Descriptor Test
-    [Tags]   comprehensive   hackfest_basic_ns
-
-    :FOR    ${nsd}  IN   @{nsd_ids}
-    \   Delete NSD      ${nsd}
-
-
-Delete VNF Descriptor Test
-    [Tags]   comprehensive   hackfest_basic_ns
-
-    :FOR    ${vnfd_id}  IN   @{vnfd_ids}
-    \   Delete VNFD     ${vnfd_id}
-
-
-*** Keywords ***
-Test Cleanup
-    [Documentation]  Test Suit Cleanup: Deliting Descriptor, instance and vim
-
-    :FOR    ${ns}  IN   @{ns_ids}
-    \   Delete NS   ${ns}
-
-    :FOR    ${nsd}  IN   @{nsd_ids}
-    \   Delete NSD      ${nsd}
-
-    :FOR    ${vnfd}  IN   @{vnfd_ids}
-    \   Delete VNFD     ${vnfd}
-
-#    :FOR    ${vim_id}  IN   @{vim}
-#    \   Delete Vim Account    ${vim_id}
diff --git a/robot-systest/testsuite/cli/TS04__Hackfest_Simplecharm_NS.robot b/robot-systest/testsuite/cli/TS04__Hackfest_Simplecharm_NS.robot
deleted file mode 100644 (file)
index 2a22478..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Mrityunjay Yadav, Jayant Madavi : MY00514913@techmahindra.com : 06-aug-2019
-##
-
-
-*** Settings ***
-Documentation    Test Suite to create hackfest simplecharm ns
-Library     OperatingSystem
-Library     String
-Library     Collections
-Resource    ../../lib/cli/vnfd_lib.robot
-Resource    ../../lib/cli/nsd_lib.robot
-Resource    ../../lib/cli/ns_lib.robot
-Resource    ../../lib/cli/vim_account_lib.robot
-Library     ../../lib/custom_lib.py
-Variables   ../../resource/cli/hackfest_simplecharm_ns_data.py
-
-Suite Teardown     Run Keyword And Ignore Error    Test Cleanup
-
-
-*** Variables ***
-@{vnfd_ids}
-${nsd_id}
-@{nsd_ids}
-@{ns_ids}
-${vnfdftpPath}    https://osm-download.etsi.org/ftp/osm-6.0-six/7th-hackfest/packages/hackfest_simplecharm_vnf.tar.gz
-${nsdftpPath}    https://osm-download.etsi.org/ftp/osm-6.0-six/7th-hackfest/packages/hackfest_simplecharm_ns.tar.gz
-
-
-*** Test Cases ***
-Create Hackfest Simple Charm VNF Descriptor
-    [Tags]   hackfest_simplecharm    comprehensive
-
-    #Build VNF Descriptor    ${vnfdPckgPath}
-    #Workarround for charm build issue
-    ${rc}   ${stdout}=      Run and Return RC and Output    wget -P '${CURDIR}${/}../../..${vnfdPckgPath}${/}build/' ${vnfdftpPath}
-    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../..${vnfdPckgPath}${vnfdPckg}'
-    Append To List     ${vnfd_ids}       ${vnfd_id}
-
-
-Create Hackfest Simple Charm NS Descriptor
-    [Tags]   hackfest_simplecharm    comprehensive
-
-    #Build NS Descriptor    ${nsdPckgPath}
-    ${rc}   ${stdout}=      Run and Return RC and Output    wget -P '${CURDIR}${/}../../..${nsdPckgPath}${/}build/' ${nsdftpPath}
-    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../..${nsdPckgPath}${nsdPckg}'
-    Append To List     ${nsd_ids}       ${nsd_id}
-
-
-Network Service Instance Test
-    [Documentation]  Launch and terminate network services
-    [Tags]   hackfest_simplecharm    comprehensive
-
-    :FOR    ${vim_name}    IN    @{vim}
-    \    Launch Network Services and Return    ${vim_name}
-
-
-Delete NS Instance Test
-    [Tags]    comprehensive   hackfest_simplecharm
-
-    :FOR    ${ns}  IN   @{ns_ids}
-    \   Delete NS   ${ns}
-
-
-Delete NS Descriptor Test
-    [Tags]   hackfest_simplecharm    comprehensive
-
-    :FOR    ${nsd}  IN   @{nsd_ids}
-    \   Delete NSD      ${nsd}
-
-
-Delete VNF Descriptor Test
-    [Tags]   hackfest_simplecharm    comprehensive
-
-    :FOR    ${vnfd_id}  IN   @{vnfd_ids}
-    \   Delete VNFD     ${vnfd_id}
-
-
-*** Keywords ***
-Test Cleanup
-    [Documentation]  Test Suit Cleanup: Deliting Descriptor, instance and vim
-
-    :FOR    ${ns}  IN   @{ns_ids}
-    \   Delete NS   ${ns}
-
-    :FOR    ${nsd}  IN   @{nsd_ids}
-    \   Delete NSD      ${nsd}
-
-    :FOR    ${vnfd}  IN   @{vnfd_ids}
-    \   Delete VNFD     ${vnfd}
-
-#    :FOR    ${vim_id}  IN   @{vim}
-#    \   Delete Vim Account    ${vim_id}
diff --git a/robot-systest/testsuite/cli/TS05__Hackfest_Multivdu_NS.robot b/robot-systest/testsuite/cli/TS05__Hackfest_Multivdu_NS.robot
deleted file mode 100644 (file)
index e3cc440..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Mrityunjay Yadav, Jayant Madavi : MY00514913@techmahindra.com : 06-aug-2019
-##
-
-
-*** Settings ***
-Documentation    Test Suite to create hackfest multivdu ns
-Library     OperatingSystem
-Library     String
-Library     Collections
-Resource    ../../lib/cli/vnfd_lib.robot
-Resource    ../../lib/cli/nsd_lib.robot
-Resource    ../../lib/cli/ns_lib.robot
-Resource    ../../lib/cli/vim_account_lib.robot
-Library     ../../lib/custom_lib.py
-Variables   ../../resource/cli/hackfest_multivdu_ns_data.py
-
-Suite Teardown     Run Keyword And Ignore Error    Test Cleanup
-
-
-*** Variables ***
-@{vnfd_ids}
-${nsd_id}
-@{nsd_ids}
-@{ns_ids}
-
-
-*** Test Cases ***
-Create Hackfest Multivdu VNF Descriptor
-    [Tags]   comprehensive   hackfest_multivdu
-
-    Build VNF Descriptor    ${vnfdPckgPath}
-    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../..${vnfdPckgPath}${vnfdPckg}'
-    Append To List     ${vnfd_ids}       ${vnfd_id}
-
-
-Create Hackfest Multivdu NS Descriptor
-    [Tags]   comprehensive   hackfest_multivdu
-
-    Build NS Descriptor    ${nsdPckgPath}
-    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../..${nsdPckgPath}${nsdPckg}'
-    Append To List     ${nsd_ids}       ${nsd_id}
-
-
-Network Service Instance Test
-    [Documentation]  Launch and terminate network services
-    [Tags]   comprehensive   hackfest_multivdu
-
-    :FOR    ${vim_name}    IN    @{vim}
-    \    Launch Network Services and Return    ${vim_name}
-
-
-Delete NS Instance Test
-    [Tags]    comprehensive   hackfest_multivdu
-
-    :FOR    ${ns}  IN   @{ns_ids}
-    \   Delete NS   ${ns}
-
-
-Delete NS Descriptor Test
-    [Tags]   comprehensive   hackfest_multivdu
-
-    :FOR    ${nsd}  IN   @{nsd_ids}
-    \   Delete NSD      ${nsd}
-
-
-Delete VNF Descriptor Test
-    [Tags]   comprehensive   hackfest_multivdu
-
-    :FOR    ${vnfd_id}  IN   @{vnfd_ids}
-    \   Delete VNFD     ${vnfd_id}
-
-
-*** Keywords ***
-Test Cleanup
-    [Documentation]  Test Suit Cleanup: Deliting Descriptor, instance and vim
-
-    :FOR    ${ns}  IN   @{ns_ids}
-    \   Delete NS   ${ns}
-
-    :FOR    ${nsd}  IN   @{nsd_ids}
-    \   Delete NSD      ${nsd}
-
-    :FOR    ${vnfd}  IN   @{vnfd_ids}
-    \   Delete VNFD     ${vnfd}
-
-#    :FOR    ${vim_id}  IN   @{vim}
-#    \   Delete Vim Account    ${vim_id}
diff --git a/robot-systest/testsuite/cli/TS06__Hackfest_Cloudinit_NS.robot b/robot-systest/testsuite/cli/TS06__Hackfest_Cloudinit_NS.robot
deleted file mode 100644 (file)
index 87bf22f..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Mrityunjay Yadav, Jayant Madavi : MY00514913@techmahindra.com : 06-aug-2019
-##
-
-
-*** Settings ***
-Documentation    Test Suite to create hackfest cloudinit ns
-Library     OperatingSystem
-Library     String
-Library     Collections
-Resource    ../../lib/cli/vnfd_lib.robot
-Resource    ../../lib/cli/nsd_lib.robot
-Resource    ../../lib/cli/ns_lib.robot
-Resource    ../../lib/cli/vim_account_lib.robot
-Library     ../../lib/custom_lib.py
-Variables   ../../resource/cli/hackfest_cloudinit_ns_data.py
-
-Suite Teardown     Run Keyword And Ignore Error    Test Cleanup
-
-
-*** Variables ***
-@{vnfd_ids}
-${nsd_id}
-@{nsd_ids}
-@{ns_ids}
-
-
-*** Test Cases ***
-Create Hackfest Cloudinit VNF Descriptor
-    [Tags]   comprehensive   hackfest_cloudinit
-
-    Build VNF Descriptor    ${vnfdPckgPath}
-    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../..${vnfdPckgPath}${vnfdPckg}'
-    Append To List     ${vnfd_ids}       ${vnfd_id}
-
-
-Create Hackfest Cloudinit NS Descriptor
-    [Tags]   comprehensive   hackfest_cloudinit
-
-    Build NS Descriptor    ${nsdPckgPath}
-    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../..${nsdPckgPath}${nsdPckg}'
-    Append To List     ${nsd_ids}       ${nsd_id}
-
-
-Network Service Instance Test
-    [Documentation]  Launch and terminate network services
-    [Tags]   comprehensive   hackfest_cloudinit
-
-    :FOR    ${vim_name}    IN    @{vim}
-    \    Launch Network Services and Return    ${vim_name}
-
-
-Delete NS Instance Test
-    [Tags]    comprehensive   hackfest_cloudinit
-
-    :FOR    ${ns}  IN   @{ns_ids}
-    \   Delete NS   ${ns}
-
-
-Delete NS Descriptor Test
-    [Tags]   comprehensive   hackfest_cloudinit
-
-    :FOR    ${nsd}  IN   @{nsd_ids}
-    \   Delete NSD      ${nsd}
-
-
-Delete VNF Descriptor Test
-    [Tags]   comprehensive   hackfest_cloudinit
-
-    :FOR    ${vnfd_id}  IN   @{vnfd_ids}
-    \   Delete VNFD     ${vnfd_id}
-
-
-*** Keywords ***
-Test Cleanup
-    [Documentation]  Test Suit Cleanup: Deliting Descriptor, instance and vim
-
-    :FOR    ${ns}  IN   @{ns_ids}
-    \   Delete NS   ${ns}
-
-    :FOR    ${nsd}  IN   @{nsd_ids}
-    \   Delete NSD      ${nsd}
-
-    :FOR    ${vnfd}  IN   @{vnfd_ids}
-    \   Delete VNFD     ${vnfd}
-
-#    :FOR    ${vim_id}  IN   @{vim}
-#    \   Delete Vim Account    ${vim_id}
diff --git a/robot-systest/testsuite/cli/TS07__Hackfest_EPA_NS.robot b/robot-systest/testsuite/cli/TS07__Hackfest_EPA_NS.robot
deleted file mode 100644 (file)
index 5316598..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Mrityunjay Yadav, Jayant Madavi : MY00514913@techmahindra.com : 06-aug-2019
-##
-
-
-*** Settings ***
-Documentation    Test Suite to create hackfest epa ns
-Library     OperatingSystem
-Library     String
-Library     Collections
-Resource    ../../lib/cli/vnfd_lib.robot
-Resource    ../../lib/cli/nsd_lib.robot
-Resource    ../../lib/cli/ns_lib.robot
-Resource    ../../lib/cli/vim_account_lib.robot
-Library     ../../lib/custom_lib.py
-Variables   ../../resource/cli/hackfest_epa_ns_data.py
-
-Suite Teardown     Run Keyword And Ignore Error    Test Cleanup
-
-
-*** Variables ***
-@{vnfd_ids}
-${nsd_id}
-@{nsd_ids}
-@{ns_ids}
-
-
-*** Test Cases ***
-Create Hackfest EPA VNF Descriptor
-    [Tags]     hackfest_epa
-
-    Build VNF Descriptor    ${vnfdPckgPath}
-    ${vnfd_id}=    Create VNFD    '${CURDIR}${/}../../..${vnfdPckgPath}${vnfdPckg}'
-    Append To List     ${vnfd_ids}       ${vnfd_id}
-
-
-Create Hackfest EPA NS Descriptor
-    [Tags]     hackfest_epa
-
-    Build NS Descriptor    ${nsdPckgPath}
-    ${nsd_id}=    Create NSD    '${CURDIR}${/}../../..${nsdPckgPath}${nsdPckg}'
-    Append To List     ${nsd_ids}       ${nsd_id}
-
-
-Network Service Instance Test
-    [Documentation]  Launch and terminate network services
-    [Tags]    hackfest_epa
-
-    :FOR    ${vim_name}    IN    @{vim}
-    \    Launch Network Services and Return    ${vim_name}
-
-
-Delete NS Instance Test
-    [Tags]    hackfest_epa
-
-    :FOR    ${ns}  IN   @{ns_ids}
-    \   Delete NS   ${ns}
-
-
-Delete NS Descriptor Test
-    [Tags]    hackfest_epa
-
-    :FOR    ${nsd}  IN   @{nsd_ids}
-    \   Delete NSD      ${nsd}
-
-
-Delete VNF Descriptor Test
-    [Tags]    hackfest_epa
-
-    :FOR    ${vnfd_id}  IN   @{vnfd_ids}
-    \   Delete VNFD     ${vnfd_id}
-
-
-*** Keywords ***
-Test Cleanup
-    [Documentation]  Test Suit Cleanup: Deliting Descriptor, instance and vim
-
-    :FOR    ${ns}  IN   @{ns_ids}
-    \   Delete NS   ${ns}
-
-    :FOR    ${nsd}  IN   @{nsd_ids}
-    \   Delete NSD      ${nsd}
-
-    :FOR    ${vnfd}  IN   @{vnfd_ids}
-    \   Delete VNFD     ${vnfd}
-
-#    :FOR    ${vim_id}  IN   @{vim}
-#    \   Delete Vim Account    ${vim_id}
diff --git a/robot-systest/testsuite/cli/__init__.robot b/robot-systest/testsuite/cli/__init__.robot
deleted file mode 100644 (file)
index 2d959da..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-*** Settings ***
-Library     OperatingSystem
-Library     String
-Library     Collections
-Library     ../../lib/custom_lib.py
-Resource    ../../lib/cli/vim_account_lib.robot
-
-Suite Setup     Wait Until Keyword Succeeds    2x    30sec    VIM Setup To Launch Network Services
-Suite Teardown     Run Keyword And Ignore Error    Suite Cleanup
-
-
-*** Variables ***
-@{vim}
-
-
-*** Keywords ***
-Suite Cleanup
-    :FOR    ${vim_id}  IN   @{vim}
-    \   Force Delete Vim Account    ${vim_id}
\ No newline at end of file
diff --git a/robot-systest/testsuite/client_library/TS01__OSMClient_Library_Test.robot b/robot-systest/testsuite/client_library/TS01__OSMClient_Library_Test.robot
deleted file mode 100644 (file)
index 88d8b5c..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-
-*** Settings ***
-Documentation    Test suite to test osmclient python library
-Library     OperatingSystem
-
-Suite Setup    Setup OSM Client
-
-
-*** Variables ***
-${name}     helloworld-os
-${user}     robottest
-${password}     fred
-${authurl}      https://169.254.169.245/
-${type}     openstack
-${desc}     a test vim
-${tenant}    robottest
-
-
-*** Test Cases ***
-Get VIM Account List Test
-    [Tags]    comprehensive    osmclient_lib
-    [Documentation]    Using python's osmclient library to get vim account list
-
-    ${vim_list}=    osmclient.get_vim_list
-    log to console    ${vim_list}
-    log  ${vim_list}
-
-
-Get VNF Descriptor List Test
-    [Tags]    comprehensive    osmclient_lib
-    [Documentation]    Using python's osmclient library to get vnfd list
-
-    ${vnfd_list}=    osmclient.get_vnfd_list
-    log to console    ${vnfd_list}
-    log  ${vnfd_list}
-
-
-Get NS Descriptor List Test
-    [Tags]    comprehensive    osmclient_lib
-    [Documentation]    Using python's osmclient library to get nsd list
-
-    ${nsd_list}=    osmclient.get_nsd_list
-    log to console    ${nsd_list}
-    log  ${nsd_list}
-
-
-Create Vim Account Test
-    [Tags]    comprehensive    osmclient_lib
-    [Documentation]    Using python's osmclient library to create vim account
-    [Template]    osmclient.create_vim_account
-    ${name}  ${type}  ${user}  ${password}  ${authurl}  ${tenant}  ${desc}
-
-
-Delete Vim Account Test
-    [Tags]    comprehensive    osmclient_lib
-    [Documentation]    Using python's osmclient library to delete vim account
-    osmclient.delete_vim_account    ${name}
-
-
-*** Keywords ***
-Setup OSM Client
-    evaluate    sys.path.append('${CURDIR}${/}../../lib/client_lib')    modules=sys
-    ${host}=    Get Environment Variable    OSM_HOSTNAME    127.0.0.1
-    Import Library    client_lib.ClientLib    host=${host}    WITH NAME    osmclient
diff --git a/robot-systest/testsuite/gui/TS01__Test_GUI_Login.robot b/robot-systest/testsuite/gui/TS01__Test_GUI_Login.robot
deleted file mode 100644 (file)
index 4f20a18..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# 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.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com
-##
-
-
-*** Settings ***
-Documentation    Suite description
-Library          SeleniumLibrary
-Library          OperatingSystem
-Resource         ../../lib/gui/login_gui.robot
-
-
-*** Test Cases ***
-Valid Login
-    [Tags]    comprehensive   gui_login_test
-    [Setup]    Set Server URL
-    Open Browser To Login Page
-    Enter Credentials    admin    admin
-    Submit Credentials
-    Home Page Should Be Open
-    [Teardown]    Close Browser
diff --git a/robot-systest/testsuite/hackfest_basic.robot b/robot-systest/testsuite/hackfest_basic.robot
new file mode 100644 (file)
index 0000000..7e5d331
--- /dev/null
@@ -0,0 +1,103 @@
+#   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.
+
+*** Settings ***
+Library   OperatingSystem
+Library   String
+Library   Collections
+Library   Process
+Library   SSHLibrary
+
+Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
+Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
+Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
+Resource   %{ROBOT_DEVOPS_FOLDER}/lib/connectivity_lib.robot
+Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+
+Variables   %{ROBOT_DEVOPS_FOLDER}/resources/hackfest_basic_ns_data.py
+
+Suite Teardown   Run Keyword And Ignore Error   Test Cleanup
+
+
+*** Variables ***
+${ns_id}   ${EMPTY}
+${username}   ubuntu
+${password}   ${EMPTY}
+${vnf_member_index}   1
+${vnf_ip_addr}   ${EMPTY}
+${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+# ${ns_config}   ${EMPTY}
+
+*** Test Cases ***
+Create Hackfest Basic VNF Descriptor
+    [Tags]   hackfest_basic
+
+    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
+
+
+Create Hackfest Basic NS Descriptor
+    [Tags]   hackfest_basic
+
+    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+
+Network Service Instance Test
+    [Tags]   hackfest_basic
+
+    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
+    Set Suite Variable   ${ns_id}   ${id}
+
+
+Get Vnf Ip Address
+    [Tags]   hackfest_basic
+
+    ${ip_addr}  Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index}
+    log   ${ip_addr}
+    Set Suite Variable   ${vnf_ip_addr}   ${ip_addr}
+
+Test Ping
+    [Tags]   hackfest_basic
+    Test Connectivity  ${vnf_ip_addr}
+
+Test SSH Access
+    [Tags]   hackfest_basic
+    Sleep   30s   Waiting ssh daemon to be up
+    Test SSH Connection  ${vnf_ip_addr}  ${username}  ${password}  ${privatekey} 
+
+Delete NS Instance Test
+    [Tags]   hackfest_basic   cleanup
+
+    Delete NS   ${ns_name}
+
+
+Delete NS Descriptor Test
+    [Tags]   hackfest_basic   cleanup
+
+    Delete NSD   ${nsd_name}
+
+
+Delete VNF Descriptor Test
+    [Tags]   hackfest_basic   cleanup
+
+    Delete VNFD   ${vnfd_name}
+
+
+*** Keywords ***
+Test Cleanup
+    [Documentation]  Test Suit Cleanup: Deleting Descriptor, instance and vim
+
+    Run Keyword If Test Failed  Delete NS   ${ns_name}
+
+    Run Keyword If Test Failed  Delete NSD   ${nsd_name}
+
+    Run Keyword If Test Failed  Delete VNFD   ${vnfd_name}
+
+
diff --git a/robot-systest/testsuite/hackfest_cloudinit.robot b/robot-systest/testsuite/hackfest_cloudinit.robot
new file mode 100644 (file)
index 0000000..fff6975
--- /dev/null
@@ -0,0 +1,110 @@
+#   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.
+
+*** Settings ***
+Library   OperatingSystem
+Library   String
+Library   Collections
+Library   Process
+Library   SSHLibrary
+
+Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
+Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
+Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
+Resource   %{ROBOT_DEVOPS_FOLDER}/lib/connectivity_lib.robot
+Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+
+Variables   %{ROBOT_DEVOPS_FOLDER}/resources/hackfest_cloudinit_ns_data.py
+
+Suite Teardown   Run Keyword And Ignore Error   Test Cleanup
+
+
+*** Variables ***
+${ns_id}   ${EMPTY}
+${username}   ubuntu
+${password}   ${EMPTY}
+${vnf_member_index}   1
+${vnf_ip_addr}   ${EMPTY}
+${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+# ${ns_config}   ${EMPTY}
+
+*** Test Cases ***
+Create Hackfest Cloudinit VNF Descriptor
+    [Tags]   hackfest_cloudinit
+
+    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
+
+
+Create Hackfest Cloudinit NS Descriptor
+    [Tags]   hackfest_cloudinit
+
+    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+
+
+Network Service Instance Test
+    [Tags]   hackfest_cloudinit
+
+    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
+    Set Suite Variable   ${ns_id}   ${id}
+
+
+Get Vnf Ip Address
+    [Tags]   hackfest_cloudinit
+
+    ${ip_addr}  Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index}
+    log   ${ip_addr}
+    Set Suite Variable   ${vnf_ip_addr}   ${ip_addr}
+
+
+Test SSH Access
+    [Tags]   hackfest_cloudinit
+
+    Sleep   30s   Waiting ssh daemon to be up
+    Test SSH Connection   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}
+
+
+Check Remote File Injected Via Cloud-init
+    [Tags]   hackfest_cloudinit
+
+    ${stdout}=   Execute Remote Command Check Rc Return Output   ${vnf_ip_addr}   ${username}   ${password}   ${privatekey}   sudo cat /root/helloworld.txt
+    log   ${stdout}
+
+
+Delete NS Instance Test
+    [Tags]   hackfest_cloudinit   cleanup
+
+    Delete NS   ${ns_name}
+
+
+Delete NS Descriptor Test
+    [Tags]   hackfest_cloudinit   cleanup
+
+    Delete NSD   ${nsd_name}
+
+
+Delete VNF Descriptor Test
+    [Tags]   hackfest_cloudinit   cleanup
+
+    Delete VNFD   ${vnfd_name}
+
+
+*** Keywords ***
+Test Cleanup
+    [Documentation]  Test Suit Cleanup: Deleting Descriptor, instance and vim
+
+    Run Keyword If Test Failed  Delete NS   ${ns_name}
+
+    Run Keyword If Test Failed  Delete NSD   ${nsd_name}
+
+    Run Keyword If Test Failed  Delete VNFD   ${vnfd_name}
+
+
diff --git a/robot-systest/testsuite/hackfest_multivdu.robot b/robot-systest/testsuite/hackfest_multivdu.robot
new file mode 100644 (file)
index 0000000..508d11f
--- /dev/null
@@ -0,0 +1,105 @@
+#   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.
+
+*** Settings ***
+Library   OperatingSystem
+Library   String
+Library   Collections
+Library   Process
+Library   SSHLibrary
+
+Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vnfd_lib.robot
+Resource   %{ROBOT_DEVOPS_FOLDER}/lib/nsd_lib.robot
+Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ns_lib.robot
+Resource   %{ROBOT_DEVOPS_FOLDER}/lib/connectivity_lib.robot
+Resource   %{ROBOT_DEVOPS_FOLDER}/lib/ssh_lib.robot
+
+Variables   %{ROBOT_DEVOPS_FOLDER}/resources/hackfest_multivdu_ns_data.py
+
+Suite Teardown   Run Keyword And Ignore Error   Test Cleanup
+
+
+*** Variables ***
+${ns_id}   ${EMPTY}
+${username}   osm
+${password}   osm4u
+${vnf_member_index}   1
+${vnf_ip_addr}   ${EMPTY}
+${ns_config}   {vld: [ {name: mgmtnet, vim-network-name: %{VIM_MGMT_NET}} ] }
+# ${ns_config}   ${EMPTY}
+
+*** Test Cases ***
+Create Hackfest multivdu VNF Descriptor
+    [Tags]   hackfest_multivdu
+
+    Create VNFD   '%{PACKAGES_FOLDER}/${vnfd_pkg}'
+
+
+Create Hackfest Multivdu NS Descriptor
+    [Tags]   hackfest_multivdu
+
+    Create NSD   '%{PACKAGES_FOLDER}/${nsd_pkg}'
+
+Network Service Instance Test
+    [Tags]   hackfest_multivdu
+
+    ${status}   ${message}=   Run Keyword And Ignore Error  Variable Should Exist   ${publickey}
+        Run Keyword If   "${status}" == "FAIL"   Set Global Variable   ${publickey}   ${EMPTY}
+    ${id}=   Create Network Service   ${nsd_name}   %{VIM_TARGET}   ${ns_name}   ${ns_config}   ${publickey}
+    Set Suite Variable   ${ns_id}   ${id}
+
+
+Get Vnf Ip Address
+    [Tags]   hackfest_multivdu
+
+    ${ip_addr}  Get Vnf Management Ip Address   ${ns_id}   ${vnf_member_index}
+    log   ${ip_addr}
+    Set Suite Variable   ${vnf_ip_addr}   ${ip_addr}
+
+Test Ping
+    [Tags]   hackfest_multivdu
+    Test Connectivity   ${vnf_ip_addr}
+
+Test SSH Access
+    [Tags]   hackfest_multivdu
+    Sleep   30s   Waiting ssh daemon to be up
+    ${status}   ${message}=   Run Keyword And Ignore Error  Variable Should Exist   ${privatekey}
+        Run Keyword If   "${status}" == "FAIL"   Set Global Variable   ${privatekey}   ${EMPTY}
+    Test SSH Connection   ${vnf_ip_addr}  ${username}  ${password}  ${privatekey} 
+
+Delete NS Instance Test
+    [Tags]   hackfest_multivdu   cleanup
+
+    Delete NS   ${ns_name}
+
+
+Delete NS Descriptor Test
+    [Tags]   hackfest_multivdu   cleanup
+
+    Delete NSD   ${nsd_name}
+
+
+Delete VNF Descriptor Test
+    [Tags]   hackfest_multivdu   cleanup
+
+    Delete VNFD   ${vnfd_name}
+
+
+*** Keywords ***
+Test Cleanup
+    [Documentation]  Test Suit Cleanup: Deleting Descriptor, instance and vim
+
+    Run Keyword If Test Failed  Delete NS   ${ns_name}
+
+    Run Keyword If Test Failed  Delete NSD   ${nsd_name}
+
+    Run Keyword If Test Failed  Delete VNFD   ${vnfd_name}
index 35b6144..a354994 100644 (file)
@@ -19,7 +19,7 @@ from osmclient import client
 
 class Osm():
     def __init__(self,osmhost,sol005=None,ro_host=None,descriptors_dir=None,vnfd_descriptors_list=None,nsd_descriptors_list=None,ns_name_prefix=None):
-        self._OsmApi=client.Client(host=osmhost,sol005=sol005,ro_host=ro_host)
+        self._OsmApi=client.Client(host=osmhost,sol005=sol005,ro_host=ro_host, verbose=2)
         self._descriptors_dir = descriptors_dir
         self.vnfd_descriptors_list = vnfd_descriptors_list
         self.nsd_descriptors_list  = nsd_descriptors_list 
index ab3a162..58fc240 100644 (file)
@@ -116,13 +116,13 @@ class TestClass(object):
 
             time.sleep(10)
 
-            assert not osm.get_api().ns.delete(ns_name)
+            assert not osm.get_api().ns.delete(ns_name, wait=True)
 
             #wait for the ns to delete
-            try:
-                utils.wait_for_value( lambda: osm.get_api().ns.get(ns_name), result=False, wait_time=180)
-            except:
-                print("Exception: Failed to get NAME after NS DELETE ... ")
+            #try:
+            #    utils.wait_for_value( lambda: osm.get_api().ns.get(ns_name), result=False, wait_time=180)
+            #except:
+            #    print("Exception: Failed to get NAME after NS DELETE ... ")
             
             #TODO find the reason for 502 exception from osmclient/nbi            
             try:
index 71d283f..5af31df 100755 (executable)
@@ -19,7 +19,7 @@
 # 1. Bug 722 : Jayant Madavi : JM00553988@techmahindra.com : Enhancement to use new fossology server. Had to change the variable name at #    couple of places, while scanning the variable name was adding curl as a license.
 # 2. Bug 542 : Jayant Madavi, Mrityunjay Yadav : JM00553988@techmahindra.com : 24-jul-2019 : Enhancement to raise exit in case files modified or added does #    not contain license.
 # 3. Bug 542  : Jayant Madavi, Mrityunjay Yadav : JM00553988@techmahindra.com :add exception list. for now as inLine. later need to create a variable for exception_list
+
 echo GERRIT BRANCH is $GERRIT_BRANCH
 dpkg -l wget &>/dev/null ||sudo apt-get install -y wget
 dpkg -l curl &>/dev/null ||sudo apt-get install -y curl
@@ -29,7 +29,7 @@ dpkg -l curl &>/dev/null ||sudo apt-get install -y curl
 apache=0
 nolicense=0
 other=0
-exception_list="':(exclude)*.pdf' ':(exclude)*.png' ':(exclude)*.jpeg' ':(exclude)*.jpg' ':(exclude)*.gif' ':(exclude)*.json'"
+exception_list="':(exclude)*.pdf' ':(exclude)*.png' ':(exclude)*.jpeg' ':(exclude)*.jpg' ':(exclude)*.gif' ':(exclude)*.json' ':(exclude)*.ico'"
 git fetch
 
 RE="FATAL: your file did not get passed through"