Commit c29571ff authored by garciadeblas's avatar garciadeblas
Browse files

Add scripts and README to setup SLICES Hackfest environment

parent f293be5e
Loading
Loading
Loading
Loading
Loading
+175 −0
Original line number Diff line number Diff line
# Preparation for a hackfest or workshop

## Prepare VMs for OSM and the workstation

```bash
export OS_CLOUD="..."
source environment-slices.rc
export FLAVOR_NAME=osm.sanity
export INSTANCE_PREFIX="osm-slices-"
./openstack-create-vms.sh 1 4
export INSTANCE_PREFIX="slices-workstation-"
./openstack-create-vms.sh 1 1
openstack server list
```

## Create users and projects in Openstack

```bash
export OS_CLOUD="..."
source environment-slices.rc
# If you want to change the env variables:
# export USERNAME_PREFIX="slices"
# export PROJECT_PREFIX="slices"
# export PASSWORD_PREFIX="slices"
# export PASSWORD_SUFFIX="Feb24!"
./openstack-create-users-projects.sh 1 40
```

## Install OSM

Connect to all OSM VMs with `ssh ubuntu@<IP_ADDRESS>` and run:

```bash
wget https://osm-download.etsi.org/ftp/osm-15.0-fifteen/install_osm.sh
chmod +x install_osm.sh
./install_osm.sh -y 2>&1 | tee osm_install_log.txt
```

## Configure OSM

### Set environment variables

```bash
export OS_CLOUD="..."
source environment-slices.rc
openstack server list |grep -i "${INSTANCE_PREFIX}"
declare -A -x OSM_VMS
export OSM_VMS
OSM_VMS["osm-slices-1"]="172.21.248.69"
OSM_VMS["osm-slices-2"]="172.21.249.74"
OSM_VMS["osm-slices-3"]="172.21.248.242"
OSM_VMS["osm-slices-4"]="172.21.249.60"
echo ${!OSM_VMS[@]}
```

### Update admin user and store credentials for admin users in all OSM

These commands need to be run from a machine where osmclient is present.

```bash
echo ${!OSM_VMS[@]}
for c in "${!OSM_VMS[@]}"; do
    # Change admin password
    ./osm-update-admin-user.sh ${OSM_VMS[$c]}
    # Create admin credentials
    ./osm-create-admin-creds.sh ${c} ${OSM_VMS[$c]}
done
# Credentials are stored in osm-creds folder
ls ./osm-creds
```

### Create users and projects in all OSM and store credentials for users

For instance, if there are 4 OSM instances and we want 10 users and projects on each instance:

```bash
echo ${!OSM_VMS[@]}
n_ini=1
n_osm_projects=10
for c in $(for x in ${!OSM_VMS[@]}; do echo $x; done | sort); do
    echo "Creating ${n_osm_projects} users in OSM ${c} (${OSM_VMS[$c]}) starting from ${n_ini}"
    source ./osm-creds/admin-${c}.rc
    ./osm-create-users-projects.sh ${n_ini} ${n_osm_projects}
    ./osm-create-creds.sh ${n_ini} ${n_osm_projects}
    n_ini=$((n_ini + n_osm_projects))
done
```

## Configure workstation

Check that workstation is reachable:

```bash
export OS_CLOUD="..."
source environment-slices.rc
openstack server list | grep -i workstation
ssh ubuntu@<IP_ADDRESS>
logout
```

Copy files to workstation:

```bash
scp environment-slices.rc workstation* ubuntu@<IP_ADDRESS>:
```

Add keys from instructors:

```bash
ssh ubuntu@<IP_ADDRESS>
ssh-import-id-gh gerardo-garcia
```

### Install SW

```bash
ssh ubuntu@<IP_ADDRESS>
./workstation-install-helm-kubectl.sh
./workstation-install-osmclient.sh
```

### Create users

```bash
ssh ubuntu@<IP_ADDRESS>
source environment-slices.rc
./workstation-create-users.sh 1 40
# This step will also copy the authorized_keys from ubuntu user to all new users

# If needed, you can delete the users
# ./workstation-delete-users.sh 1 40
```

### Allow SSH authentication

Update file `/etc/ssh/sshd_config`in the workstation to allow SSH access with user and password.

```bash
ssh ubuntu@<IP_ADDRESS>
cat /etc/ssh/sshd_config | grep PasswordAuthentication
sudo sed -i "s/^PasswordAuthentication no/PasswordAuthentication yes/" /etc/ssh/sshd_config
cat /etc/ssh/sshd_config | grep PasswordAuthentication
sudo systemctl restart ssh
```

### (REMOTE) copy kubeconfig, clouds.yaml and osm.rc files

```bash
source environment-slices.rc
./workstation-copy-files-users.sh <IP_ADDRESS> 1 40
```

## Clean

Clean Openstack projects:

```bash
export OS_CLOUD="..."
source environment-slices.rc
openstack user list
./openstack-clean-projects.sh 1 40
./openstack-delete-users-projects.sh 1 40
```

Delete OSM VMs and workstation:

```bash
export OS_CLOUD="..."
source environment-slices.rc
export INSTANCE_PREFIX="osm-slices-"
./openstack-delete-vms.sh 1 4
export INSTANCE_PREFIX="slices-workstation-"
./openstack-delete-vms.sh 1 1
openstack server list
```
+30 −0
Original line number Diff line number Diff line
# Variables for VM creation
export FLAVOR_NAME="osm.slices"
export IMAGE_NAME="ubuntu22.04"
export NETWORK_NAME="osm-ext"
export KEYPAIR_NAME="niv2020"
export INSTANCE_PREFIX="osm-slices-"
export INSTANCE_CPU=8
export INSTANCE_MEMORY=16384
export INSTANCE_DISK=120

# Variables for users and projects
export USERNAME_PREFIX="slices"
export PROJECT_PREFIX="slices"
export PASSWORD_PREFIX=
export PASSWORD_SUFFIX=

# Quotas for Openstack projects
export QUOTA_INSTANCES=10
export QUOTA_RAM=20480
export QUOTA_CPU=10
export QUOTA_DISK=200
export QUOTA_NETWORKS=10
export QUOTA_FIP=3

# Variables for OSM creation
export OSM_ADMIN_PASSWORD=

# Whitemist K8s cluster variables
export WHITEMIST_KUBECONFIG_LOCAL_FILE="$HOME/hive/kubeconfig.yaml"
+130 −0
Original line number Diff line number Diff line
#!/bin/bash
if [ $# -gt 2 -o $# -lt 1 ]; then
    echo "Usage $0 <initial_number> [<number_of_users/projects>]"
    echo "Example: $0 7         -> Will clean project number 7 in Openstack"
    echo "Example: $0 1 4       -> Will clean 4 projects in Openstack starting from 1"
    echo
    echo "Only those VMs created more than 6 hours ago will be deleted"
    exit 1
fi

set -eux

# GLOBAL OPTIONS
# DELETE_FLAG=""
DELETE_FLAG="y"
MIN_HOURS_TO_DELETE=0

NETWORKS_TO_BE_KEPT=()

# MAIN
current_time=$(date +%s)
min_secs_to_delete=$((MIN_HOURS_TO_DELETE * 3600))

n_ini=$1
n_projects=${2:-1}
n_fin=$((n_ini + n_projects - 1))

for i in $(seq $n_ini $n_fin); do
    project_name="${PROJECT_PREFIX}${i}"
    project_domain="$(openstack project show ${project_name} -c domain_id -f value)"
    echo "Cleaning VM instances, networks, ports and volumes in project $project_name"

    if [ $(openstack server list --project ${project_name} --project-domain $project_domain -c ID -f value|wc -l) -gt 0 ]; then
        echo "There are VMs in project $project_name"
        echo "Before cleaning VM instances:"
        openstack server list --project ${project_name} --project-domain $project_domain
        # for server_id in $(openstack server list -c ID -f value); do
        for server_id in $(openstack server list -c ID -f value --project ${project_name} --project-domain $project_domain); do
            server_name=$(openstack server show $server_id -c name -f value)
            echo "Checking VM $server_name ($server_id)"
            tobekept=$(openstack server show $server_id -c properties | grep -o "keep='true'" | wc -w)
            if [ $tobekept -eq 0 ]; then
                created_time=$(openstack server show $server_id -c created -f value)
                created_time_epoch=$(date -d "$created_time" +%s)
                diff_time=$((current_time - created_time_epoch))
                if [ $diff_time -gt $min_secs_to_delete ]; then
                    echo ">> VM to be deleted: $server_name ($server_id)"
                    if [ -n "$DELETE_FLAG" ]; then
                        echo ">>>> Deleting VM $server_name ($server_id)"
                        openstack server delete $server_id
                    fi
                fi
            else
                echo "Skipping VM $server_name ($server_id), in the list of VMs to be kept"
            fi
        done
        echo "After cleaning VM instances:"
        openstack server list --project ${project_name} --project-domain $project_domain
    fi

    echo "Cleaning no-shared networks in $project_name"
    echo "Before cleaning networks:"
    openstack network list --no-share --project ${project_name} --project-domain $project_domain
    # for net in $(openstack network list --no-share -c ID -f value); do
    for net_id in $(openstack network list --project ${project_name} --project-domain $project_domain --no-share -c ID -f value); do
        net_name=$(openstack network show $net_id -c name -f value)
        echo "Checking network $net_name ($net_id)"
        inarray=$(echo ${NETWORKS_TO_BE_KEPT[@]} | grep -o "$net_name" | wc -w)
        if [ $inarray -eq 0 ]; then
            created_time=$(openstack network show $net_id -c created_at -f value)
            created_time_epoch=$(date -d "$created_time" +%s)
            diff_time=$((current_time - created_time_epoch))
            if [ $diff_time -gt $min_secs_to_delete ]; then
                for port_id in $(openstack port list --project ${project_name} --project-domain $project_domain --network $net_id -c ID -f value); do
                    device_owner=$(openstack port show $port_id -c device_owner -f value)
                    if [ "$device_owner" != "network:dhcp" ]; then
                        echo ">> Port to be deleted in in network $net_name ($net_id): $port_id"
                        if [ -n "$DELETE_FLAG" ]; then
                            echo ">>>> Deleting port $port_id"
                            openstack port delete $port_id
                        fi
                    fi
                done
                echo ">> Network to be deleted: $net_name ($net_id)"
                if [ -n "$DELETE_FLAG" ]; then
                    echo ">>>> Deleting network $net_name ($net_id)"
                    openstack network delete $net_id
                fi
            fi
        else
            echo "Skipping network $net_name ($net_id), in the list of networks to be kept"
        fi
    done

    echo "After cleaning no-shared networks:"
    openstack network list --no-share --project ${project_name} --project-domain $project_domain

    echo "Cleaning remaining ports in shared networks in $project_name"
    echo "Shared networks:"
    openstack network list --share
    for net_id in $(openstack network list --share -c ID -f value); do
        net_name=$(openstack network show $net_id -c name -f value)
        echo "Checking network $net_name ($net_id)"
        inarray=$(echo ${NETWORKS_TO_BE_KEPT[@]} | grep -o "$net_name" | wc -w)
        if [ $inarray -eq 0 ]; then
            for port_id in $(openstack port list --project ${project_name} --project-domain $project_domain --network $net_id -c ID -f value); do
                created_time=$(openstack port show $port_id -c created_at -f value)
                created_time_epoch=$(date -d "$created_time" +%s)
                diff_time=$((current_time - created_time_epoch))
                if [ $diff_time -gt $min_secs_to_delete ]; then
                    device_owner=$(openstack port show $port_id -c device_owner -f value)
                    if [ "$device_owner" != "network:dhcp" ]; then
                        echo ">> Port to be deleted in in network $net_name ($net_id): $port_id"
                        if [ -n "$DELETE_FLAG" ]; then
                            echo ">>>> Deleting port $port_id"
                            openstack port delete $port_id
                        fi
                    fi
                fi
            done
        fi
    done

done
exit 0

# TODO
# echo "Cleaning volumes in $project_name"
# openstack volume list --project ${project_name} --project-domain $project_domain
+49 −0
Original line number Diff line number Diff line
#!/bin/bash
if [ $# -gt 2 -o $# -lt 1 ]; then
    echo "Usage $0 <initial_number> [<number_of_users/projects>]"
    echo "Example: $0 7         -> Will create 1 user and project (with the number 7) in Openstack"
    echo "Example: $0 1 4          -> Will create 4 users and projects in Openstack starting from 1"
    exit 1
fi

set -eux

n_ini=$1
n_projects=${2:-1}
n_fin=$((n_ini + n_projects - 1))

DEFAULT_USER_DOMAIN="Default"
DEFAULT_PROJECT_DOMAIN="Default"

echo "Checking users and projects"
openstack user list
openstack project list

echo "Creating ${n_fin} users and projects in Opentack"
for i in $(seq $n_ini $n_fin); do
    user_name="${USERNAME_PREFIX}${i}"
    project_name="${PROJECT_PREFIX}${i}"
    user_password="${PASSWORD_PREFIX}${i}${PASSWORD_SUFFIX}"
    openstack project show ${project_name} >/dev/null 2>&1 || \
    openstack project create --description "${project_name}" --domain $DEFAULT_PROJECT_DOMAIN ${project_name}
    openstack user show ${user_name} >/dev/null 2>&1 || \
    openstack user create --project ${project_name} --password ${user_password} --domain $DEFAULT_USER_DOMAIN --project-domain $DEFAULT_PROJECT_DOMAIN ${user_name}
    openstack role add --user ${user_name} --project ${project_name} "_member_"
    openstack role add --user ${user_name} --project ${project_name} "admin"
    openstack quota set --instances ${QUOTA_INSTANCES} --fixed-ips -1 --ram ${QUOTA_RAM} --cores ${QUOTA_CPU} --gigabytes ${QUOTA_DISK} --volumes -1 \
                    --snapshots -1 --ports -1 --subnets ${QUOTA_NETWORKS} --networks ${QUOTA_NETWORKS} --floating-ips ${QUOTA_FIP} \
                    --secgroups -1 --secgroup-rules -1 --routers -1 --rbac-policies -1 ${project_name}
    # Security groups for new project
    sec_group_id=`openstack security group list --project ${project_name} --project-domain $DEFAULT_PROJECT_DOMAIN -f value |grep default|awk '{print $1}'`
    [ -n "${sec_group_id}" ] || \
    openstack security group create --project ${project_name} --project-domain $DEFAULT_PROJECT_DOMAIN default
    sec_group_id=`openstack security group list --project ${project_name} --project-domain $DEFAULT_PROJECT_DOMAIN -f value |grep default|awk '{print $1}'`
    openstack security group rule list ${sec_group_id} | awk -F\| '$3 ~ "icmp" && $4 ~ "0.0.0.0/0" {print "OK"}' | grep -q "OK" >/dev/null 2>&1 || \
    openstack security group rule create --proto icmp --remote-ip 0.0.0.0/0 ${sec_group_id}
    openstack security group rule list ${sec_group_id} | awk -F\| '$3 ~ tcp && $4 ~ "0.0.0.0/0" && $5 ~ "22:22" {print "OK"}' | grep -q "OK" >/dev/null 2>&1 || \
    openstack security group rule create --proto tcp --remote-ip 0.0.0.0/0 --dst-port 22 ${sec_group_id}
done

echo "Checking users and projects"
openstack user list
openstack project list
+30 −0
Original line number Diff line number Diff line
#!/bin/bash
set -eux

if [ $# -gt 2 -o $# -lt 1 ]; then
    echo "Usage $0 <initial_number> <number_of_instances>"
    echo "Example: $0 1 4          -> Will create 4 instances from ${INSTANCE_PREFIX}1 to ${INSTANCE_PREFIX}4"
    echo "Example: $0 7            -> Will create 1 instance called ${INSTANCE_PREFIX}7"
    exit 1
fi

n_ini=$1
n_vms=${2:-1}
n_fin=$((n_ini + n_vms - 1))

echo "Creating Openstack flavor for instances: ${FLAVOR_NAME}"
openstack flavor show ${FLAVOR_NAME} >/dev/null 2>&1 || \
openstack flavor create --disk ${INSTANCE_CPU} --ram ${INSTANCE_MEMORY} --vcpus ${INSTANCE_CPU} ${FLAVOR_NAME}

echo "Listing Openstack instances before creating new ones ..."
openstack server list

for i in $(seq $n_ini $n_fin); do
    server_name="${INSTANCE_PREFIX}${i}"
    echo "Creating Openstack VM: ${server_name}"
    openstack server create --flavor ${FLAVOR_NAME} --image ${IMAGE_NAME} --key-name ${KEYPAIR_NAME} --nic net-id=${NETWORK_NAME} ${server_name}
done

echo "Listing Openstack instances after creating new ones ..."
openstack server list
Loading