From 38bd734407f45aa4ce98395925a9f91c7a7c8606 Mon Sep 17 00:00:00 2001 From: ramonsalguer Date: Wed, 8 Apr 2020 19:44:07 +0200 Subject: [PATCH] Initial contribution: Sandbox for Robot tests Change-Id: I8e49b402afcfc4fd92e94ac01ef5d99eb158f618 Signed-off-by: ramonsalguer --- .gitignore | 2 + README.md | 91 ++++---- osm-tests/.gitignore | 13 ++ osm-tests/README.md | 208 ++++++++++++++++++ osm-tests/Vagrantfile | 112 ++++++++++ .../2020406 Vagrant sandbox for Robot.pptx | Bin 0 -> 43122 bytes .../2020406 Vagrant sandbox for Robot.svg | 1 + osm-tests/assets/image-20200406234414818.png | Bin 0 -> 53501 bytes osm-tests/baseconfig/.void | 0 osm-tests/baseconfig/patchconfig.rc | 21 ++ osm-tests/baseconfig/seedconfig.rc | 42 ++++ osm-tests/images/.void | 0 osm-tests/images/download_images.sh | 16 ++ osm-tests/localconfig/.void | 0 osm-tests/localconfig/TEMPLATE-envconfig.rc | 34 +++ .../localconfig/TEMPLATE-envprovisioning.sh | 22 ++ osm-tests/packages/.void | 0 osm-tests/packages/download_packages.sh | 16 ++ osm-tests/provisioner.sh | 135 ++++++++++++ osm-tests/results/.void | 0 20 files changed, 659 insertions(+), 54 deletions(-) create mode 100644 .gitignore create mode 100644 osm-tests/.gitignore create mode 100644 osm-tests/README.md create mode 100644 osm-tests/Vagrantfile create mode 100644 osm-tests/assets/2020406 Vagrant sandbox for Robot.pptx create mode 100644 osm-tests/assets/2020406 Vagrant sandbox for Robot.svg create mode 100644 osm-tests/assets/image-20200406234414818.png create mode 100644 osm-tests/baseconfig/.void create mode 100644 osm-tests/baseconfig/patchconfig.rc create mode 100644 osm-tests/baseconfig/seedconfig.rc create mode 100644 osm-tests/images/.void create mode 100644 osm-tests/images/download_images.sh create mode 100644 osm-tests/localconfig/.void create mode 100644 osm-tests/localconfig/TEMPLATE-envconfig.rc create mode 100644 osm-tests/localconfig/TEMPLATE-envprovisioning.sh create mode 100644 osm-tests/packages/.void create mode 100644 osm-tests/packages/download_packages.sh create mode 100644 osm-tests/provisioner.sh create mode 100644 osm-tests/results/.void diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea9b9a1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*/.vagrant +*.log diff --git a/README.md b/README.md index 9f14b6f..6e4c37f 100644 --- a/README.md +++ b/README.md @@ -1,79 +1,62 @@ - -# Project Title - -One Paragraph of project description goes here +limitations under the License. -## Getting Started +## Goal -These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system. +The goal is adopting a methodology for local testing that is fully repeatable and well-known by the Depops MDL team in OSM. -### Prerequisites +This means that: -What things you need to install the software and how to install them +- Local testers should use (and rebuild regularly) the appropriate sandbox to perform tests and/or contributions to test plans, so that potential issues can be reliably diagnosed and solved. +- This means that all known changes in the installation procedures of any sandbox will be captured in the companion "provisioner" script (typically, `provisioner.sh`), so that the exact procedure can be well-known and testable by everyone. +- In case something that was known to work in a sandbox started to fail: + - It should be reported as a bug if there were no further contributions to the sandbox, since it is likely to be a gap in the knowledge/testing of the corresponding provisioning procedure, that might have changed over time (e.g new dependencies, change of repositories, hardcoded locations, etc.) + - In case new contributions (e.g. new tests, new patches, etc.) were not functional in the corresponding sandbox, the contributor should review them locally first, since they are likely to have issues. -``` -Give examples -``` +## Pre-requirements -### Installing +- VirtualBox and Vagrant locally installed. +- Host properly configured to use SSH and Git with OSM. + - NOTE: In the case of a Windows host, this means: + - Having your SSH keys (public and private in the `%userprofile%/.ssh` folder (the one equivalent to `~/.ssh` in Linux/Mac), + - Having Git installed and properly configured in Windows, i.e. check that `%userprofile%/.gitconfig` exists and has the proper configuration. + - In particular, it is required that the `user.name` there contains your EOL account name (i.e. avoid using a full name there). Beware that only the global profile is supported. -A step by step series of examples that tell you how to get a development env running +## Basic use of Vagrant -Say what the step will be +To build a sandbox from scratch: +```bash +cd folder_of_the_sandbox +vagrant up ``` -Give the example -``` - -And repeat - -``` -until finished -``` - -End with an example of getting some data out of the system or using it for a little demo -## Running the tests +NOTE: All the examples that follow are suppossed to be run in the same sandbox's folder. -Explain how to run the automated tests for this system +To access the VM via SSH: +```bash +vagrant ssh ``` -Give an example -``` - -## Deployment - -Add additional notes about how to deploy this on a live system - -## Built With - -* [Python](www.python.org/) - The language used -## Contributing +To destroy the VM: -Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us. - -## Versioning - -We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://osm.etsi.org/gitweb/?p=osm/sandboxes.git;a=tags). - -## License +```bash +vagrant destroy +``` -This project is licensed under the Apache2 License - see the [LICENSE.md](LICENSE) file for details +To rebuild and reprovision the VM: -## Acknowledgments +```bash +vagrant destroy && vagrant up +``` diff --git a/osm-tests/.gitignore b/osm-tests/.gitignore new file mode 100644 index 0000000..9fae18b --- /dev/null +++ b/osm-tests/.gitignore @@ -0,0 +1,13 @@ +packages/*.gz +packages/*.tgz +packages/*.yaml +packages/*.yml +images/*.qcow +images/*.qcow2 +images/*.img +images/*.raw +results/*.html +results/*.xml +localconfig/*.rc +localconfig/*.sh +!localconfig/TEMPLATE* diff --git a/osm-tests/README.md b/osm-tests/README.md new file mode 100644 index 0000000..39ed936 --- /dev/null +++ b/osm-tests/README.md @@ -0,0 +1,208 @@ +# README: Vagrant sandbox for Robot tests + +Copyright 2020 Telefónica Investigación 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. + +## HOW TO USE IT (TL;DR) + +1. Prepare your local environment: + 1. Upload all required images to your VIM (e.g. `openstack image create ...`). + - Hint: you can download first all relevant testing images from OSM by: + ```bash + cd images + ./download_images.sh + ``` + 2. Add the corresponding VIM target to your OSM (`osm vim-create ...`). + 3. Copy all packages (NF, NS, NSI) required for the tests to the `packages/` folder. Hint: + ```bash + cd packages + ./download_packages.sh + ``` +2. Provide credentials for your VIM+OSM environment: + - Create/Edit `localconfig/envconfig.rc` (and `localconfig/envprovisioning.sh` if needed). + - HINT: First time, use `localconfig/TEMPLATE-envconfig.rc` and (if needed) `localconfig/TEMPLATE-envprovisioning.sh` as templates. +3. (OPTIONAL) In case you needed to apply a specific Devops patch-set, define it at `baseconfig/patchconfig.rc`. +4. Start the sandbox for its first time provisioning with `vagrant up`. +5. Do `vagrant ssh` to enter in the VM. +6. Run your first test: + ```bash + cd robot + robot -d /vagrant/results testsuite/hackfest_basic.robot + ``` + +## INTRODUCTION + +This Vagrant sandbox provides a simple self-contained environment suitable for running consistently E2E tests with OSM. + +Using this sandbox for local E2E testing has a number of advantages: + +- It enables the end user to run and validate easily in your local environment the set of Robot tests available in ETSI OSM and enables you to contribute back more easily. +- It provides a well-known software environment, with all the required dependencies properly pre-validated. +- It guarantees that there are no hardcoded dependencies with the local tester environment or with OSM's CI/CD in terms of versions, destinations, paths, credentials, etc. All the test conditions can be completely defined using environment variables if needed. +- Its provisioner script (`provisioner.sh`) can be used as-is for provisioning other types of environments, such as a Docker containers. +- Likewise, the provisioner script can serve as documentation/validation of different installation processes maintained by OSM (client, Robot, etc.). + +Here is the sandbox what Vagrant creates for you: + +![Diagram of the functionality of the Sandbox](assets/image-20200406234414818.png) + +As it can be seen, the provisioning of the sandbox installs several pieces of software: + +- OSM Client. +- Robot Framework and all library dependencies required to run the full test suite. +- Other complementary utilities to perform the tests or ease troubleshooting. + +In addition, the provision of the sandbox requires a number of inputs: + +- The collection of E2E Robot tests for OSM. +- Details of OSM instance(s) available for testing, part of the DUT. +- Details of VIM(s) available for testing, part of the DUT. +- Location of VNF and NS packages required to run the tests. +- Location of VM images required to run the tests (future use). + +## PRE-REQUIREMENTS + +### Available infrastructure (DUT) + +- There is at least one VIM available and reachable. +- There is at least one OSM instance available and reachable. +- The OSM instance(s) has (have) at least one target added per VIM. + +### Software pre-requirements already covered by Vagrant + +- `authorized_keys` at `~/.ssh` with proper permissions. +- `id_rsa`, `id_rsa.pub` at `~/.ssh` with proper permissions. +- A functional `.gitconfig` file at `~` with proper permissions. +- Base configuration files at `${BASE_CONFIG_FOLDER}` (for Vagrant, `~/baseconfig`): + - `seedconfig.rc`, where most basic configuration is made. + - `patchconfig.rc`, where a Gerrit patch-set for Devops is selected. This file is optional. +- Local environment configuration files at `${LOCAL_CONFIG_FOLDER}` (for Vagrant, `~/localconfig`) + - `envprovisioning.sh`, where local provisioning tasks are scripted. This file is optional. + - `envconfig.rc`, where the DUT (VIM and OSM) are defined with environment variables. +- All packages required for the tests are already placed at `${PACKAGES_FOLDER}`. + - In Vagrant, `/vagrant/packages`. +- All images required for the tests are already placed at `${IMAGES_FOLDER}`. + - In Vagrant, `/vagrant/images`. + - This folder is intended for future use, but not relevant for the current test suite. + +### Software pre-requirements to be fulfilled by the user + +Users **should edit** the information about the DUT (local VIM and available OSM) before provisioning the sandbox. + +In the case of Vagrant, the `localconfig` sub-folder of the Vagrant sandbox definition (i.e. at the host) contains the relevant files to be edited: + +1. `envprovisioning.sh` is used as "provisioner" to retrieve some the local environment data, i.e. it is a script intended to retrieve information from some well-known locations, such as local Git repos, that will be referred lated by `envconfig.rc`. +2. `envconfig.rc` contains the minimal set of environment variables required to run successfully the suite of Robot tests. + +Once the vagrant sandbox is created, these files will be automatically copied into the VM to `${LOCAL_CONFIG_FOLDER}`) so that they can complete the configuration of the test environment. + +## Configuration setup + +### Tester setup and test suite configuration + +Setup of testing conditions, independent from the local environment. This configuration is defined in two configuration files, stored at `${BASE_CONFIG_FOLDER}` (for Vagrant, `~/baseconfig`). + +#### Base configuration: `seedconfig.rc` + +This file contains common base configuration for the test suite, independent of the environment. + +This repo provides a configuration customized for Vagrant sandboxes. If that is your case, please do not edit. However, the existing file can be used as template for creating a `seedconfig.rc` for other types of environments (e.g. Docker). + +Hare is the sample of `seedconfig.rc` for Vagrant with the environment variables commented: + +```bash +# Base folder for all operations +export BASE_FOLDER=/home/vagrant +# EOL account for SSH operations. Required for password-less operations with Git. +# Comment to undefine and it will use HTTP instead +export ETSIUSERNAME=$(git config user.name) +# Folder where Robot tests are stored +export ROBOT_DEVOPS_FOLDER="${HOME}/devops/robot-systest" +# Folder to save alternative DUT environments (optional) +export ENVIRONMENTS_FOLDER=environments +# Folder where all required packages are stored +export PACKAGES_FOLDER="/vagrant/packages" +# Folder where all required images are stored (intended for future use) +#export IMAGES_FOLDER="/vagrant/images" +# Folder where test results should be exported +export ROBOT_REPORT_FOLDER="/vagrant/results" +``` + +#### Devops patch configuration (optional): `patchconfig.rc` + +This file, when exists, defines an optional Gerrit patch-set to be applied over the current Devops master. + +This configuration is optional and mostly intended for OSM developers. Do not use if you plan to run community-approved test suites. + +Here is the sample of `patchconfig.rc` with the environment variable commented: + +```bash +# URL to be used in a subsequent `pull` command to apply the patchset +export DEVOPS_PATCH=refs/changes/51/8751/1 +``` + +### DUT configuration (local environment) + +Setup of the local environment for the tests. This configuration is defined in configuration files stored at `${LOCAL_CONFIG_FOLDER}` (for Vagrant, `~/localconfig`). + +#### Local environment provisioning (optional): `envprovisioning.sh` + +This file, which is optional, is intended to be used as a script to retrieve information about the local environment, which might include cloning repositories, downloading credential files, etc. Typically, this is used to fetch sensitive information. There are two typical cases: + +- `openstack.rc` + - The provisioner, besides fetching it, would append the info to `${LOCAL_CONFIG_FOLDER}/envconfig.rc`. +- `clouds.yaml` + - The provisioner, besides fetching it, should copy the file to `${BASE_FOLDER}`. + +Here is an example of `envprovisioning.sh` with relevant operations commented: + +```bash +ssh-keyscan mygit.com >> ~/.ssh/known_hosts # Often needed for non public repos +git clone git@mygit.com:local-environment-data/vim-and-infra.git +cp vim-and-infra/openstack/clouds.yaml "${BASE_FOLDER}"/ # Copy of credentials to base folder +``` + +#### Local environment configuration: `envconfig.rc` + +This file, which is **mandatory**, is where the local DUT is completely defined with environment variables. + +```bash +# VIM setup +export OS_USERNAME=username +export OS_PASSWORD=password +export OS_TENANT_NAME=projectName +export OS_AUTH_URL=https://identityHost:portNumber/v2.0 +export OS_TENANT_ID=tenantIDString +export OS_REGION_NAME=regionName +export OS_CACERT=/path/to/cacertFile +# OSM location +export OSM_HOSTNAME="192.168.1.22" +# Details of the VIM target for OSM +export VIM_TARGET="vim002-fortville-physnet" +export VIM_MGMT_NET="management" +# Optional: location of alternative `envconfig.rc`-like files +export ENVIRONMENTS_FOLDER=environments +``` + +Alternatively, here is another example `envconfig.rc` where the VIM is defined with a credentials file, `clouds.yaml`: + +```bash +# VIM setup +export CLOUDS_PATH=${BASE_FOLDER} # Location of `clouds.yaml` +export OS_CLOUD=vim-002 +# OSM location +export OSM_HOSTNAME="192.168.1.22" +# Details of the VIM target for OSM +export VIM_TARGET="vim002-fortville-physnet" +export VIM_MGMT_NET="management" +# Optional: location of alternative `envconfig.rc`-like files +export ENVIRONMENTS_FOLDER=environments +``` diff --git a/osm-tests/Vagrantfile b/osm-tests/Vagrantfile new file mode 100644 index 0000000..ff4e717 --- /dev/null +++ b/osm-tests/Vagrantfile @@ -0,0 +1,112 @@ +# Copyright 2020 Telefónica Investigación 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. + +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# All Vagrant configuration is done below. The "2" in Vagrant.configure +# configures the configuration version (we support older styles for +# backwards compatibility). Please don't change it unless you know what +# you're doing. +Vagrant.configure("2") do |config| + # The most common configuration options are documented and commented below. + # For a complete reference, please see the online documentation at + # https://docs.vagrantup.com. + + # Every Vagrant development environment requires a box. You can search for + # boxes at https://vagrantcloud.com/search. + config.vm.box = "ubuntu/bionic64" + + # Disable automatic box update checking. If you disable this, then + # boxes will only be checked for updates when the user runs + # `vagrant box outdated`. This is not recommended. + # config.vm.box_check_update = false + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine. In the example below, + # accessing "localhost:8080" will access port 80 on the guest machine. + # NOTE: This will enable public access to the opened port + # config.vm.network "forwarded_port", guest: 80, host: 8080 + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine and only allow access + # via 127.0.0.1 to disable public access + # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1" + + # Create a private network, which allows host-only access to the machine + # using a specific IP. + # config.vm.network "private_network", ip: "192.168.33.10" + + # Create a public network, which generally matched to bridged network. + # Bridged networks make the machine appear as another physical device on + # your network. + # config.vm.network "public_network" + + # Share an additional folder to the guest VM. The first argument is + # the path on the host to the actual folder. The second argument is + # the path on the guest to mount the folder. And the optional third + # argument is a set of non-required options. + # config.vm.synced_folder "../data", "/vagrant_data" + + # Provider-specific configuration so you can fine-tune various + # backing providers for Vagrant. These expose provider-specific options. + # Example for VirtualBox: + # + # config.vm.provider "virtualbox" do |vb| + # # Display the VirtualBox GUI when booting the machine + # vb.gui = true + # + # # Customize the amount of memory on the VM: + # vb.memory = "1024" + # end + # + # View the documentation for the provider you are using for more + # information on available options. + + # Enable provisioning with a shell script. Additional provisioners such as + # Ansible, Chef, Docker, Puppet and Salt are also available. Please see the + # documentation for more information about their specific syntax and use. + # config.vm.provision "shell", inline: <<-SHELL + # apt-get update + # apt-get install -y apache2 + # SHELL + + # Feeds some configuration from the host to `vagrant` user in VM: + # - Private key + # - Public key + # - Public key in `authorized_keys` + # - Git configuration + #-------------------------------------------------------------- + config.vm.provision "shell", privileged: false, inline: <<-SHELL + echo -e '#{File.read("#{Dir.home}/.ssh/id_rsa")}' > '/home/vagrant/.ssh/id_rsa' + echo -e '#{File.read("#{Dir.home}/.ssh/id_rsa.pub")}' > '/home/vagrant/.ssh/id_rsa.pub' + echo -e '#{File.read("#{Dir.home}/.ssh/id_rsa.pub")}' >> '/home/vagrant/.ssh/authorized_keys' + echo -e '#{File.read("#{Dir.home}/.gitconfig")}' > '/home/vagrant/.gitconfig' + chmod 600 /home/vagrant/.ssh/id_rsa /home/vagrant/.ssh/id_rsa.pub /home/vagrant/.gitconfig + SHELL + + # Feeds config files for setting up Robot tests and local environment into the VM + config.vm.provision "shell", privileged: false, inline: <<-SHELL + sudo apt-get update -y + sudo apt-get install dos2unix + cp -r /vagrant/baseconfig /home/vagrant/ + cp -r /vagrant/localconfig /home/vagrant/ + dos2unix /home/vagrant/baseconfig/*.rc + dos2unix /home/vagrant/localconfig/*.rc + dos2unix /home/vagrant/localconfig/*.sh + SHELL + + # Performs the provision of the Vagrant Sandbox for Robot tests + config.vm.provision :shell, privileged: false, path: "provisioner.sh" +end diff --git a/osm-tests/assets/2020406 Vagrant sandbox for Robot.pptx b/osm-tests/assets/2020406 Vagrant sandbox for Robot.pptx new file mode 100644 index 0000000000000000000000000000000000000000..298e3cd0270dc485e50527cd0bb4f072169b637c GIT binary patch literal 43122 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 T(O%OSM ClientRobot FrameworkOther utilities (OpenStack client, yq, etc.)Robot tests for OSMVM / Docker / LXCOSM instance detailsVNF and NS Packages(location)VIM credentialsVM images(location)DUT \ No newline at end of file diff --git a/osm-tests/assets/image-20200406234414818.png b/osm-tests/assets/image-20200406234414818.png new file mode 100644 index 0000000000000000000000000000000000000000..58811f19f048a3f203fcb27801ef39d852c6caef GIT binary patch literal 53501 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 C&h(f7 literal 0 HcmV?d00001 diff --git a/osm-tests/baseconfig/.void b/osm-tests/baseconfig/.void new file mode 100644 index 0000000..e69de29 diff --git a/osm-tests/baseconfig/patchconfig.rc b/osm-tests/baseconfig/patchconfig.rc new file mode 100644 index 0000000..46787cf --- /dev/null +++ b/osm-tests/baseconfig/patchconfig.rc @@ -0,0 +1,21 @@ +# Copyright 2020 Telefónica Investigación 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. + +####################################################################################################### +# patchconfig.rc +####################################################################################################### +# (OPTIONAL) Additional configuration to add optional Devops patches (only if needed) + +# URL to be used in a subsequent `pull` command to apply the patchset +#export DEVOPS_PATCH=refs/changes/51/8751/7 diff --git a/osm-tests/baseconfig/seedconfig.rc b/osm-tests/baseconfig/seedconfig.rc new file mode 100644 index 0000000..7fcf884 --- /dev/null +++ b/osm-tests/baseconfig/seedconfig.rc @@ -0,0 +1,42 @@ +# Copyright 2020 Telefónica Investigación 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. + +####################################################################################################### +# seedconfig.rc: COMMON BASE CONFIGURATION FOR THE ENVIRONMENT +####################################################################################################### +# This configuration is customized for Vagrant sandboxes. If that is your case, please do not edit. +# This file can be used as template for creating a `seedconfig.rc` +# for other types of environments (e.g. Docker) + +# Base folder for all operations +export BASE_FOLDER=/home/vagrant + +# EOL account for SSH operations. Required for password-less operations with Git. +# Comment to undefine and it will use HTTP instead +export ETSIUSERNAME=$(git config user.name) + +# Folder where Robot tests are stored +export ROBOT_DEVOPS_FOLDER="${HOME}/devops/robot-systest" + +# Folder to save alternative DUT environments (optional) +export ENVIRONMENTS_FOLDER=environments + +# Folder where all required packages are stored +export PACKAGES_FOLDER="/vagrant/packages" + +# Folder where all required images are stored (intended for future use) +export IMAGES_FOLDER="/vagrant/images" + +# Folder where test results should be exported +export ROBOT_REPORT_FOLDER="/vagrant/results" diff --git a/osm-tests/images/.void b/osm-tests/images/.void new file mode 100644 index 0000000..e69de29 diff --git a/osm-tests/images/download_images.sh b/osm-tests/images/download_images.sh new file mode 100644 index 0000000..a6dfc0d --- /dev/null +++ b/osm-tests/images/download_images.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# Copyright 2020 Telefónica Investigación 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. + +wget -nd -r -P . -A qcow,qcow2,img,raw https://osm-download.etsi.org/ftp/osm-3.0-three/1st-hackfest/images/ diff --git a/osm-tests/localconfig/.void b/osm-tests/localconfig/.void new file mode 100644 index 0000000..e69de29 diff --git a/osm-tests/localconfig/TEMPLATE-envconfig.rc b/osm-tests/localconfig/TEMPLATE-envconfig.rc new file mode 100644 index 0000000..ae215ff --- /dev/null +++ b/osm-tests/localconfig/TEMPLATE-envconfig.rc @@ -0,0 +1,34 @@ +# Copyright 2020 Telefónica Investigación 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. + +####################################################################################################### +# envconfig.rc +####################################################################################################### +# Local environment configuration: VIM(s), OSM(s), etc. + +# VIM setup +export OS_USERNAME=username +export OS_PASSWORD=password +export OS_TENANT_NAME=projectName +export OS_AUTH_URL=https://identityHost:portNumber/v2.0 +export OS_TENANT_ID=tenantIDString +export OS_REGION_NAME=regionName +export OS_CACERT=/path/to/cacertFile # Only if required for the VIM +# OSM location +export OSM_HOSTNAME="192.168.1.22" +# Details of the VIM target for OSM +export VIM_TARGET="vim002-physnet1" +export VIM_MGMT_NET="management" +# Optional: location of other alternative `envconfig.rc`-like files +export ENVIRONMENTS_FOLDER=environments diff --git a/osm-tests/localconfig/TEMPLATE-envprovisioning.sh b/osm-tests/localconfig/TEMPLATE-envprovisioning.sh new file mode 100644 index 0000000..c2d67d7 --- /dev/null +++ b/osm-tests/localconfig/TEMPLATE-envprovisioning.sh @@ -0,0 +1,22 @@ +# Copyright 2020 Telefónica Investigación 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. + +####################################################################################################### +# envprovisioning.sh +####################################################################################################### +# (OPTIONAL) Local environment provisioning (e.g. cloning of local repos and credentials) + +ssh-keyscan mylocalgitserver.com >> ~/.ssh/known_hosts # Often needed for non public repos +git clone git@mylocalgitserver.com:local-environment-data/local-infra-info.git +cp local-infra-info/openstack/clouds.yaml "${BASE_FOLDER}"/ # Copy credentials to base folder diff --git a/osm-tests/packages/.void b/osm-tests/packages/.void new file mode 100644 index 0000000..e69de29 diff --git a/osm-tests/packages/download_packages.sh b/osm-tests/packages/download_packages.sh new file mode 100644 index 0000000..946ceb9 --- /dev/null +++ b/osm-tests/packages/download_packages.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# Copyright 2020 Telefónica Investigación 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. + +wget -nd -r -P . -A gz,tgz,yaml,yml -R *qcow*,*fedora20* https://osm-download.etsi.org/ftp/osm-5.0-five/6th-hackfest/packages/ diff --git a/osm-tests/provisioner.sh b/osm-tests/provisioner.sh new file mode 100644 index 0000000..650d366 --- /dev/null +++ b/osm-tests/provisioner.sh @@ -0,0 +1,135 @@ +#!/usr/bin/env bash + +# Copyright 2020 Telefónica Investigación 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. + +####################################################################################################### +# PRE-REQUIREMENTS FOR THE ENVIRONMENT: +####################################################################################################### +# - There is at least one VIM available and reachable. +# - There is at least one OSM instance available and reachable. +# - The OSM instance(s) has (have) already at least one target added per VIM. + +####################################################################################################### +# SOFTWARE PRE-REQUIREMENTS: (already covered for Vagrant) +####################################################################################################### +# - `authorized_keys` at `~/.ssh` with proper permissions +# - `id_rsa`, `id_rsa.pub` at `~/.ssh` with proper permissions +# - A functional `.gitconfig` file at `~` with proper permissions +# - `seedconfig.rc` and `patchconfig.rc` copied to `~/baseconfig` +# - `envprovisioning.sh` and `envconfig.rc` copied to `~/localconfig` + +####################################################################################################### +# CONFIGURATION SEEDING +####################################################################################################### + +# Folders where configuration is stored +BASE_CONFIG_FOLDER=baseconfig +LOCAL_CONFIG_FOLDER=localconfig # Default path. It can be reset dinamically by `seedconfig.rc` or `envprovisioning.sh` if needed + +# Base configuration +if [ -f ${BASE_CONFIG_FOLDER}/seedconfig.rc ] +then + cat ${BASE_CONFIG_FOLDER}/seedconfig.rc >> defaultenv.rc + source ${BASE_CONFIG_FOLDER}/seedconfig.rc +else + >&2 echo ################################################################################ + >&2 echo ERROR: Base configuration file ${BASE_CONFIG_FOLDER}/seedconfig.rc is missing. + >&2 echo Please check README.md for details. + >&2 echo Once fixed, rebuild your environment. E.g. for Vagrant: + >&2 echo vagrant destroy && vagrant up + >&2 echo ################################################################################ + exit 1 +fi + +# (OPTIONAL) Devops patch configuration +if [ -f ${BASE_CONFIG_FOLDER}/patchconfig.rc ] +then + cat ${BASE_CONFIG_FOLDER}/patchconfig.rc >> defaultenv.rc + source ${BASE_CONFIG_FOLDER}/patchconfig.rc +fi + +# (OPTIONAL) Local environment provisioning (e.g. cloning of local repos) +if [ -f ${LOCAL_CONFIG_FOLDER}/envprovisioning.sh ] +then + source ${LOCAL_CONFIG_FOLDER}/envprovisioning.sh +fi + +# Local environment configuration: VIM(s), OSM(s), credentials, etc. +if [ -f ${LOCAL_CONFIG_FOLDER}/envconfig.rc ] +then + cat ${LOCAL_CONFIG_FOLDER}/envconfig.rc >> defaultenv.rc + source ${LOCAL_CONFIG_FOLDER}/envconfig.rc +else + >&2 echo ################################################################################ + >&2 echo WARNING: Local configuration file ${BASE_CONFIG_FOLDER}/envconfig.rc is missing. + >&2 echo Please check README.md for details. + >&2 echo If it is an error, once fixed, rebuild your environment. E.g. for Vagrant: + >&2 echo vagrant destroy && vagrant up + >&2 echo Otherwise, you should add manually the appropriate environment variables later. + >&2 echo ################################################################################ +fi + +#------------------------------------------------------------------------------------------------------ + +# Installs OSM client +sudo sed -i "/osm-download.etsi.org/d" /etc/apt/sources.list +wget -qO - https://osm-download.etsi.org/repository/osm/debian/ReleaseSEVEN/OSM%20ETSI%20Release%20Key.gpg | sudo apt-key add - +sudo add-apt-repository -y "deb [arch=amd64] https://osm-download.etsi.org/repository/osm/debian/ReleaseSEVEN stable devops IM osmclient" +sudo apt-get update +sudo apt-get install -y python3-pip +sudo -H python3 -m pip install python-magic pyangbind verboselogs +sudo apt-get install -y python3-osmclient + +# Installs OpenStack client +##For Train version, uncomment the following two lines: +##sudo add-apt-repository -y cloud-archive:train +##sudo apt-get update +sudo apt-get install -y python3-openstackclient # Installs Queens by default + +# Installs Robot and all dependencies required for the tests + +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 +ln -s ${ROBOT_DEVOPS_FOLDER} robot + +# Clones Devops repo to retrieve all Robot tests from OSM community +ssh-keyscan -p 29418 osm.etsi.org >> ~/.ssh/known_hosts +if [ -n "${ETSIUSERNAME}" ] # If possible, uses ETSI's user name to make further contributions easier +then + git clone "ssh://${ETSIUSERNAME}@osm.etsi.org:29418/osm/devops" && \ + (cd "devops" && curl https://osm.etsi.org/gerrit/tools/hooks/commit-msg > .git/hooks/commit-msg ; chmod +x .git/hooks/commit-msg) +else + git clone "https://osm.etsi.org/gerrit/osm/devops" +fi + +# if applicable, adds additional patches to devops repo (refer to `patchconfig.rc`) +[ -n "${DEVOPS_PATCH}" ] && git -C devops pull https://osm.etsi.org/gerrit/osm/devops ${DEVOPS_PATCH} + +# Installs some additional packages to ease interactive troubleshooting +sudo apt-get install -y osm-devops +sudo snap install charm --classic +sudo snap install yq + +# Copies VIM credentials in `clouds.yaml` (if applicable) to a proper location +if [ -f ${CLOUDS_PATH}/clouds.yaml ]; then + sudo mkdir -p /etc/openstack + sudo cp ${CLOUDS_PATH}/clouds.yaml /etc/openstack/ + rm ${CLOUDS_PATH}/clouds.yaml +fi + +# Sets default environment to load automatically in `.bashrc` +cat defaultenv.rc >> ~/.bashrc diff --git a/osm-tests/results/.void b/osm-tests/results/.void new file mode 100644 index 0000000..e69de29 -- 2.25.1