User Tools

Site Tools


Sidebar

cn:ccr:cloud:infn_cc:project_networking

Setup delle reti di progetto

La gestione delle reti interne al progetto è demandata agli utenti del middleware cloud.

Perché le VM associate ad un progetto possano collegarsi in rete sono necessarie le seguenti operazioni propedeutiche:

  • creare una rete interna
  • creare una subnet ed associarla alla rete interna
  • creare un router da collegare alla rete interna ed alla rete pubblica

Queste operazioni possono essere eseguite attraverso la dashboard, ma può essere utile usare questo script per rendere l'operazione più semplice e veloce.

#!/bin/bash

REGION=$OS_REGION_NAME
DOMAIN=$OS_USER_DOMAIN_NAME
PROJECT=$OS_PROJECT_NAME

while getopts "p:d:r:h" opt; do
    case "$opt" in
    p)  PROJECT=$OPTARG
        OS_PROJECT_NAME=$PROJECT
        ;;
    d)  DOMAIN=$OPTARG
        OS_USER_DOMAIN_NAME=$DOMAIN
        ;;
    r)  REGION=$OPTARG
        OS_REGION_NAME=$REGION
        ;;
    h)  echo "This script is intended for easing the setup of a basic network environment for OpenStack projects."
        echo "Enter the dashboard, on the top right corner click on you username and download the \"OpenStack RC file V3\"."
        echo "Execute the downloaded file in a terminal - you will be prompted for you password -, and execute this script."
        echo "Make sure you close the terminal immediately after finishing in order to avoid you password being kept in memory." 
        echo "Project, region and domain names can be overridden with -p, -r and -d."
  	exit 1
        ;;
    esac
done

#if [[ -z "$PROJECT" ]] || [[ -z "$DOMAIN" ]]
#then
#  echo "Project and domain name must be set with -p and -d"
#  exit 1
#fi

# The names of the new network, subnet and router are obtained from the project name
NETWORK=$PROJECT-net
SUBNET=$PROJECT-subnet
ROUTER=$PROJECT-router

echo ""

# Get the public net id of the selected region
PUBLIC_NET_ID=`openstack network show public -f value -c id`

if [[ -z "$PUBLIC_NET_ID" ]]
then
  echo ""
  echo "Could not obtain public network id"
  echo "Make sure you have all the necessary variables correctly set before retrying"
  echo ""
  exit 1
fi

# Verify that the project exists
PROJECT_ID=`openstack project show $PROJECT -f value -c id`

if [[ -z "$PROJECT_ID" ]]
then
  echo ""
#  echo "Could not find project $PROJECT in domain $DOMAIN"
  echo "Make sure you have all the necessary variables correctly set before retrying"
  echo ""
  exit 1
fi

# Generate a random network address (192.168.xxx.0/24). Avoid 192.168.0.0/24, 192.168.1.0/24 and some more because they may conflict when doing VPN from home networks
FLOOR=10
RANGE=250
NUMBER=0

while [ "$NUMBER" -le "$FLOOR" ]
do
  NUMBER=$RANDOM
  let "NUMBER %= $RANGE"  # Scales $number down within $RANGE.
done

GATEWAY=192.168.$NUMBER.1
NET=192.168.$NUMBER
CIDR=192.168.$NUMBER.0/24
NETWORK_ID=`openstack network show $NETWORK -f value -c id 2>/dev/null`

echo ""
echo "Will try to create network \"$NETWORK\" for project \"$PROJECT\" in domain \"$DOMAIN\" and region \"$REGION\"."
echo "The associate subnet will use the following class C network: $CIDR."
echo ""

read -r -p "Are you sure? [Y/n]" response
 response=${response,,} # tolower
 if [[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]; then
   /bin/true
 else
   echo "Exiting"
   echo ""
   exit
 fi

if [ $? -eq 0 ]
then
  echo "Network $NETWORK ($NETWORK_ID) exists already"
else
  echo "Creating network $NETWORK"

# Create a new private network for the project

  NETWORK_ID=`openstack network create \
    -f value -c id \
    --project $PROJECT \
    --project-domain $DOMAIN \
    --description "Private network for the $PROJECT project" \
    --enable \
    --enable-port-security \
    --internal \
    --provider-network-type vxlan \
    --no-share \
    $NETWORK`

  echo "Network $NETWORK ($NETWORK_ID) created"

fi

SUBNET_ID=`openstack subnet show $SUBNET -f value -c id 2>/dev/null`

if [ $? -eq 0 ]
then
  echo "Subnet $SUBNET ($SUBNET_ID) exists already"
else
  echo "Creating subnet $SUBNET"

# Create a new subnet for the project

  SUBNET_ID=`openstack subnet create \
    -f value -c id \
    --project $PROJECT \
    --project-domain $DOMAIN \
    --description "Subnet for the $PROJECT project" \
    --network $NETWORK \
    --dhcp \
    --ip-version 4 \
    --gateway $GATEWAY \
    --allocation-pool start=$NET.10,end=$NET.250 \
    --subnet-range $CIDR \
    $SUBNET`

echo "Subnet $SUBNET ($SUBNET_ID) created"

fi

ROUTER_ID=`openstack router show $ROUTER -f value -c id 2>/dev/null`

if [ $? -eq 0 ]
then
  echo "Router $ROUTER ($ROUTER_ID) exists already"
else
  echo "Creating router $ROUTER"

# Create a new router for the project

  ROUTER_ID=`openstack router create \
    -f value -c id \
    --project $PROJECT \
    --project-domain $DOMAIN \
    --description "Router for the $PROJECT project" \
    --enable \
    $ROUTER`

  echo "Router $ROUTER ($ROUTER_ID) created"

# Connect the router to the external network and to the internal subnet
  openstack router set \
    --external-gateway $PUBLIC_NET_ID \
    $ROUTER_ID

  openstack router add subnet \
    $ROUTER_ID $SUBNET_ID

fi

In più è necessario

  • associare dei floating IP alle VM che devono poter essere accedute dall'esterno
  • associare dei security group alle VM con floating ip associati
cn/ccr/cloud/infn_cc/project_networking.txt · Last modified: 2019/07/09 07:51 by stalio@infn.it