Ejemplo n.º 1
0
def remove_from_cloud():
    """
    Implementation of 'remove-from-cloud' action.

    This action is preparation for clean removal of nova-compute unit from
    juju model. If this action succeeds , user can run `juju remove-unit`
    command.

    Steps performed by this action:
      - Checks that this nova-compute unit can be removed from the cloud
        - If not, action fails
      - Stops nova-compute system service
      - Unregisters nova-compute service from the nova cloud controller
    """
    nova = cloud_utils.nova_client()

    if cloud_utils.running_vms(nova) > 0:
        raise RuntimeError("This unit can not be removed from the "
                           "cloud because it's still running VMs. Please "
                           "remove these VMs or migrate them to another "
                           "nova-compute unit")
    nova_service_id = cloud_utils.nova_service_id(nova)

    log("Stopping nova-compute service", DEBUG)
    service_pause('nova-compute')
    log("Deleting nova service '{}'".format(nova_service_id), DEBUG)
    nova.services.delete(nova_service_id)

    status_set(WORKLOAD_STATES.BLOCKED, UNIT_REMOVED_MSG)
    function_set({'message': UNIT_REMOVED_MSG})
Ejemplo n.º 2
0
def osd_in_out(action):
    """Pause/Resume the ceph OSDs unit ont the local machine only.

    :param action: Either IN or OUT (see global constants)
    :type action: string
    :raises RuntimeError: if a supported action is not used
    :raises subprocess.CalledProcessError: if the ceph commands fails
    :raises OSError: if the unit can't get the local osd ids
    """
    if action not in (IN, OUT):
        raise RuntimeError("Unknown action \"{}\"".format(action))

    osds = parse_osds_arguments()
    osds, failed_osds = check_osd_id(osds)

    if failed_osds:
        function_fail("invalid ceph OSD device id: "
                      "{}".format(",".join(failed_osds)))
        return

    outputs = []
    for osd_id in osds:
        output = ceph_osd_upgrade(action, str(osd_id))
        outputs.append(output)

    function_set({
        "message":
        "osd-{action} action was successfully executed for ceph "
        "OSD devices [{osds}]".format(action=action, osds=",".join(osds)),
        "outputs":
        os.linesep.join(outputs)
    })

    assess_status()
Ejemplo n.º 3
0
def list_computes():
    """Implementation of `list-compute-nodes` action."""
    nova = cloud_utils.nova_client()
    function_set({'node-name': cloud_utils.service_hostname()})
    computes = [service.to_dict()
                for service in nova.services.list(binary='nova-compute')]
    function_set({'compute-nodes': json.dumps(computes)})
Ejemplo n.º 4
0
def delete_node_from_ring(args):
    """Delete a node from the corosync ring."""

    node = function_get('node')
    if not node:
        function_fail('node is a required parameter')
        return

    if not is_leader():
        function_fail('only the Juju leader can run this action')
        return

    # Delete the node from the live corosync env
    try:
        pcmk.set_node_status_to_maintenance(node)
        pcmk.delete_node(node, failure_is_fatal=True)
    except subprocess.CalledProcessError as e:
        function_fail(
            "Removing {} from the cluster failed. {} output={}".format(
                node, e, e.output))

    # Notify the cluster
    _trigger_corosync_update()

    function_set({'result': 'success'})
Ejemplo n.º 5
0
def prepare_flexran_build():
    vduHelper.beginBlock('prepare_flexran_build')
    try:

        # ====== Get FlexRAN parameters ===========================================
        # For a documentation of the installation procedure, see:
        # https://gitlab.eurecom.fr/mosaic5g/mosaic5g/-/wikis/tutorials/slicing

        gitRepository = function_get('flexran-git-repository')
        gitCommit = function_get('flexran-git-commit')
        gitDirectory = 'mosaic5g'

        flexranService_IPv4Interface = IPv4Interface(
            function_get('flexran-service-ipv4-interface'))
        flexranService_IPv4Gateway = IPv4Address(
            function_get('flexran-service-ipv4-gateway'))
        if function_get('flexran-service-ipv6-interface') != '':
            flexranService_IPv6Interface = IPv6Interface(
                function_get('flexran-service-ipv6-interface'))
        else:
            flexranService_IPv6Interface = None
        if function_get('flexran-service-ipv6-gateway') != '':
            flexranService_IPv6Gateway = IPv6Address(
                function_get('flexran-service-ipv6-gateway'))
        else:
            flexranService_IPv6Gateway = None

        # Prepare network configuration:
        flexranService_IfName = 'ens4'
        configurationService = vduHelper.makeInterfaceConfiguration(
            flexranService_IfName, flexranService_IPv4Interface,
            flexranService_IPv4Gateway, flexranService_IPv6Interface,
            flexranService_IPv6Gateway)

        # ====== Prepare system ===============================================
        vduHelper.beginBlock('Preparing system')
        vduHelper.configureInterface(flexranService_IfName,
                                     configurationService, 61)
        vduHelper.testNetworking()
        vduHelper.waitForPackageUpdatesToComplete()
        vduHelper.endBlock()

        # ====== Prepare sources ==============================================
        vduHelper.beginBlock('Preparing sources')
        vduHelper.fetchGitRepository(gitDirectory, gitRepository, gitCommit)
        vduHelper.executeFromString("""\
cd /home/nornetpp/src/{gitDirectory} && \\
git submodule init && \\
git submodule update flexran
""".format(gitDirectory=gitDirectory))
        vduHelper.endBlock()

        message = vduHelper.endBlock()
        function_set({'outout': message})
        set_flag('flexrancharm.prepared-flexran-build')
    except:
        message = vduHelper.endBlockInException()
        function_fail(message)
    finally:
        clear_flag('actions.prepare-flexran-build')
Ejemplo n.º 6
0
def configure_cassandra():
    vduHelper.beginBlock('configure_cassandra')
    try:

        # ====== Get HSS parameters ===========================================
        # For a documentation of the installation procedure, see:
        # https://github.com/simula/openairinterface-openair-cn/wiki/OpenAirSoftwareSupport#install-hss

        gitDirectory = 'openair-hss'
        cassandraServerIP = function_get('cassandra-server-ip')

        # ====== Build Cassandra ==============================================
        vduHelper.beginBlock('Building Cassandra')
        vduHelper.executeFromString("""\
export MAKEFLAGS="-j`nproc`" && \\
cd /home/nornetpp/src/{gitDirectory}/scripts && \\
mkdir -p logs && \\
sudo rm -f /etc/apt/sources.list.d/cassandra.sources.list && \\
./build_cassandra --cassandra-server-ip {cassandraServerIP} --check-installed-software --force >logs/build_cassandra.log 2>&1
""".format(gitDirectory=gitDirectory, cassandraServerIP=cassandraServerIP))
        vduHelper.endBlock()

        # ====== Configure Cassandra ==========================================
        vduHelper.beginBlock('Configuring Cassandra')
        vduHelper.executeFromString("""\
cd /home/nornetpp/src/{gitDirectory}/scripts && \\
sudo update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java && \\
sudo service cassandra stop && \\
sudo rm -rf /var/lib/cassandra/data/system/* && \\
sudo rm -rf /var/lib/cassandra/commitlog/* && \\
sudo rm -rf /var/lib/cassandra/data/system_traces/* && \\
sudo rm -rf /var/lib/cassandra/saved_caches/* && \\
sudo yq w -i /etc/cassandra/cassandra.yaml "cluster_name" "HSS Cluster" && \\
sudo yq w -i /etc/cassandra/cassandra.yaml "seed_provider[0].class_name" "org.apache.cassandra.locator.SimpleSeedProvider" && \\
sudo yq w -i /etc/cassandra/cassandra.yaml "seed_provider[0].parameters[0].seeds" "{cassandraServerIP}" && \\
sudo yq w -i /etc/cassandra/cassandra.yaml "listen_address" "{cassandraServerIP}" && \\
sudo yq w -i /etc/cassandra/cassandra.yaml "rpc_address" "{cassandraServerIP}" && \\
sudo yq w -i /etc/cassandra/cassandra.yaml "endpoint_snitch" "GossipingPropertyFileSnitch" && \\
sudo service cassandra start && \\
sleep 60 && \\
sudo service cassandra status | cat && \\
cqlsh --file ../src/hss_rel14/db/oai_db.cql {cassandraServerIP} >logs/oai_db.log 2>&1 && \\
cqlsh -e "SELECT COUNT(*) FROM vhss.users_imsi;" {cassandraServerIP} >/dev/null && echo "Cassandra is okay!" || echo "Cassandra seems to be unavailable!"
""".format(gitDirectory=gitDirectory, cassandraServerIP=cassandraServerIP))
        vduHelper.endBlock()

        message = vduHelper.endBlock()
        function_set({'outout': message})
        set_flag('hsscharm.configured-cassandra')
    except:
        message = vduHelper.endBlockInException()
        function_fail(message)
    finally:
        clear_flag('actions.configure-cassandra')
Ejemplo n.º 7
0
def get_lbaasv2_lb(args):
    """Implementation of 'show-loadbalancers' action."""
    neutron = get_neutron()
    agent_list = get_network_agents_on_host(socket.gethostname(), neutron,
                                            "Loadbalancerv2 agent")
    list_func = neutron.list_loadbalancers_on_lbaas_agent
    lb_list = get_resource_list_on_agents(agent_list, list_func,
                                          "loadbalancers")

    clean_data = clean_resource_list(lb_list,
                                     allowed_keys=["id", "status", "name"])

    function_set({"load-balancers": format_status_output(clean_data)})
Ejemplo n.º 8
0
def get_dhcp_networks(args):
    """Implementation of 'show-dhcp-networks' action."""
    neutron = get_neutron()
    agent_list = get_network_agents_on_host(socket.gethostname(), neutron,
                                            "DHCP agent")
    list_func = neutron.list_networks_on_dhcp_agent
    dhcp_network_list = get_resource_list_on_agents(agent_list, list_func,
                                                    "networks")

    clean_data = clean_resource_list(dhcp_network_list,
                                     allowed_keys=["id", "status", "name"])

    function_set({"dhcp-networks": format_status_output(clean_data)})
Ejemplo n.º 9
0
def get_routers(args):
    """Implementation of 'show-routers' action."""
    neutron = get_neutron()
    agent_list = get_network_agents_on_host(socket.gethostname(), neutron,
                                            "L3 agent")
    router_list = get_resource_list_on_agents(agent_list,
                                              neutron.list_routers_on_l3_agent,
                                              "routers")

    clean_data = clean_resource_list(
        router_list, allowed_keys=["id", "status", "ha", "name"])

    function_set({"router-list": format_status_output(clean_data)})
Ejemplo n.º 10
0
def status(args):
    """Show hacluster status."""
    try:
        health_status = pcmk.cluster_status(
            resources=bool(function_get("resources")),
            history=bool(function_get("history")))
        function_set({"result": json.dumps(health_status)})
    except subprocess.CalledProcessError as error:
        log("ERROR: Failed call to crm status. output: {}. return-code: {}"
            "".format(error.output, error.returncode))
        log(traceback.format_exc())
        function_set({"result": "failure"})
        function_fail("failed to get cluster health")
Ejemplo n.º 11
0
def restart_spgwu():
   vduHelper.beginBlock('restart_spgwu')
   try:

      vduHelper.runInShell('sudo service spgwu restart')

      message = vduHelper.endBlock()
      function_set( { 'outout': message } )
   except:
      message = vduHelper.endBlockInException()
      function_fail(message)
   finally:
      clear_flag('actions.restart-spgwu')
Ejemplo n.º 12
0
def restart_p4ovs():
    vduHelper.beginBlock('restart_p4ovs')
    try:

        # !!! FIXME! !!!
        # vduHelper.runInShell('sudo service p4ovs restart')

        message = vduHelper.endBlock()
        function_set({'outout': message})
    except:
        message = vduHelper.endBlockInException()
        function_fail(message)
    finally:
        clear_flag('actions.restart-p4ovs')
Ejemplo n.º 13
0
def prepare_spgwc_build():
   vduHelper.beginBlock('prepare_spgwc_build')
   try:

      # ====== Get SPGW-C parameters ========================================
      # For a documentation of the installation procedure, see:
      # https://github.com/OPENAIRINTERFACE/openair-cn-cups/wiki/OpenAirSoftwareSupport#install-spgw-c

      gitRepository     = function_get('spgwc-git-repository')
      gitCommit         = function_get('spgwc-git-commit')
      gitDirectory      = 'openair-spgwc'

      # Prepare network configurations:
      spgwcS11_IfName   = 'ens5'
      spgwcSXab_IfName  = 'ens4'
      configurationS11  = vduHelper.makeInterfaceConfiguration(spgwcS11_IfName,  IPv4Interface('0.0.0.0/0'))
      configurationSXab = vduHelper.makeInterfaceConfiguration(spgwcSXab_IfName, IPv4Interface('0.0.0.0/0'))

      # S5S8 dummy interfaces:
      spgwcS5S8_SGW_IfName  = 'dummy0'
      configurationS5S8_SGW = vduHelper.makeInterfaceConfiguration(spgwcS5S8_SGW_IfName, IPv4Interface('172.58.58.102/24'), createDummy = True)
      spgwcS5S8_PGW_IfName  = 'dummy1'
      configurationS5S8_PGW = vduHelper.makeInterfaceConfiguration(spgwcS5S8_PGW_IfName, IPv4Interface('172.58.58.101/24'), createDummy = True)

      # ====== Prepare system ===============================================
      vduHelper.beginBlock('Preparing system')
      vduHelper.configureInterface(spgwcS11_IfName,       configurationS11,       61)
      vduHelper.configureInterface(spgwcSXab_IfName,      configurationSXab,      62)
      vduHelper.configureInterface(spgwcS5S8_SGW_IfName,  configurationS5S8_SGW,  63)
      vduHelper.configureInterface(spgwcS5S8_PGW_IfName,  configurationS5S8_PGW,  64)
      vduHelper.testNetworking()
      vduHelper.waitForPackageUpdatesToComplete()
      vduHelper.endBlock()

      # ====== Prepare sources ==============================================
      vduHelper.beginBlock('Preparing sources')
      vduHelper.fetchGitRepository(gitDirectory, gitRepository, gitCommit)
      vduHelper.endBlock()


      message = vduHelper.endBlock()
      function_set( { 'outout': message } )
      set_flag('spgwccharm.prepared-spgwc-build')
   except:
      message = vduHelper.endBlockInException()
      function_fail(message)
   finally:
      clear_flag('actions.prepare-spgwc-build')
Ejemplo n.º 14
0
def list_backups():
    """Implementation of  easyrsa 'list-backups' action."""
    file_list = []

    try:
        file_list = os.listdir(PKI_BACKUP)
    except FileNotFoundError:
        pass

    if file_list:
        message = "Available backup files:"
        for file in file_list:
            message += "\n{}".format(file)
    else:
        message = "There are no available backup files."

    function_set({"message": message})
Ejemplo n.º 15
0
def touch():

    vduHelper.beginBlock('Touch')
    try:
        vduHelper.touchFile('/tmp/touch1')
        vduHelper.testNetworking('8.8.4.4', 2)
        vduHelper.testNetworking('8.8.8.8', 2)
        vduHelper.touchFile('/tmp/touch2')

        fileName = function_get('filename')
        vduHelper.touchFile(fileName)

        message = vduHelper.endBlock()
        function_set({'outout': message})
    except:
        message = vduHelper.endBlockInException()
        function_fail(message)
    finally:
        clear_flag('actions.touch')
Ejemplo n.º 16
0
def prepare_cassandra_hss_build():
    vduHelper.beginBlock('prepare_cassandra_hss_build')
    try:

        # ====== Get HSS parameters ===========================================
        # For a documentation of the installation procedure, see:
        # https://github.com/OPENAIRINTERFACE/openair-cn/wiki/OpenAirSoftwareSupport#install-hss

        gitRepository = function_get('hss-git-repository')
        gitCommit = function_get('hss-git-commit')
        gitDirectory = 'openair-hss'

        # Prepare network configuration:
        hssS6a_IfName = 'ens4'
        configurationS6a = vduHelper.makeInterfaceConfiguration(
            hssS6a_IfName, IPv4Interface('0.0.0.0/0'))

        # ====== Prepare system ===============================================
        vduHelper.beginBlock('Preparing system')
        vduHelper.configureInterface(hssS6a_IfName, configurationS6a, 61)
        vduHelper.testNetworking()
        vduHelper.waitForPackageUpdatesToComplete()
        vduHelper.executeFromString(
            """if [ "`find /etc/apt/sources.list.d -name 'rmescandon-ubuntu-yq-*.list'`" == "" ] ; then sudo add-apt-repository -y ppa:rmescandon/yq ; fi"""
        )
        vduHelper.aptInstallPackages(['yq'])
        vduHelper.endBlock()

        # ====== Prepare sources ==============================================
        vduHelper.beginBlock('Preparing sources')
        vduHelper.fetchGitRepository(gitDirectory, gitRepository, gitCommit)
        vduHelper.endBlock()

        message = vduHelper.endBlock()
        function_set({'outout': message})
        set_flag('hsscharm.prepared-cassandra-hss-build')
    except:
        message = vduHelper.endBlockInException()
        function_fail(message)
    finally:
        clear_flag('actions.prepare-cassandra-hss-build')
Ejemplo n.º 17
0
def register_to_cloud():
    """
    Implementation of `register-to-cloud` action.

    This action reverts `remove-from-cloud` action. It starts nova-comptue
    system service which will trigger its re-registration in the cloud.
    """
    log("Starting nova-compute service", DEBUG)
    service_resume('nova-compute')
    current_status = status_get()
    if current_status[0] == WORKLOAD_STATES.BLOCKED.value and \
            current_status[1] == UNIT_REMOVED_MSG:
        status_set(WORKLOAD_STATES.ACTIVE, 'Unit is ready')

    nova_compute_hooks.update_status()
    function_set({
        'command': 'openstack compute service list',
        'message': "Nova compute service started. It should get registered "
                   "with the cloud controller in a short time. Use the "
                   "'openstack' command to verify that it's registered."
    })
Ejemplo n.º 18
0
def backup():
    """
    Implementation of easyrsa 'backup' action.

    Currently deployed pki is packed into tarball and stored in the
    backups directory.
    """
    _ensure_backup_dir_exists()

    timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
    backup_name = "easyrsa-{}.tar.gz".format(timestamp)
    backup_path = os.path.join(PKI_BACKUP, backup_name)
    with tarfile.open(backup_path, mode="w:gz") as pki_tar:
        pki_tar.add(os.path.join(easyrsa_directory, "pki"), "pki")

    log("Backup created and saved to '{}'".format(backup_path), hookenv.DEBUG)
    function_set(
        {
            "command": "juju scp {}:{} .".format(local_unit(), backup_path),
            "message": "Backup archive created successfully. Use the juju scp "
            "command to copy it to your local machine.",
        }
    )
Ejemplo n.º 19
0
def update_ring(args):
    """Update corosync.conf list of nodes (generally after unit removal)."""
    if not function_get('i-really-mean-it'):
        function_fail('i-really-mean-it is a required parameter')
        return

    if not is_leader():
        function_fail('only the Juju leader can run this action')
        return

    diff_nodes = update_node_list()
    log("Unexpected node(s) found and removed: {}".format(",".join(
        list(diff_nodes))))
    if not diff_nodes:
        # No differences between discovered Pacemaker nodes and
        # Juju nodes (ie. no node removal)
        function_set({'result': 'No changes required.'})
        return

    # Notify the cluster
    _trigger_corosync_update()

    function_set(
        {"result": "Nodes removed: {}".format(" ".join(list(diff_nodes)))})
Ejemplo n.º 20
0
def configure_spgwu():
   vduHelper.beginBlock('configure_spgwu')
   try:

      # ====== Get SPGW-U parameters ========================================
      # For a documentation of the installation procedure, see:
      # https://github.com/OPENAIRINTERFACE/openair-cn-cups/wiki/OpenAirSoftwareSupport#install-spgw-u

      gitDirectory     = 'openair-spgwu-tiny'

      spgwuSXab_IfName = 'ens4'
      spgwuS1U_IfName  = 'ens5'
      spgwuSGi_IfName  = 'ens6'

      spgwcListString  = function_get('spgwu-spgwc-list').split(',')
      spgwcList        = ''
      for spgwc in spgwcListString:
         spgwcAddress = IPv4Address(spgwc)
         if len(spgwcList) > 0:
            spgwcList = spgwcList + ', '
         spgwcList = spgwcList + '{{ IPV4_ADDRESS=\\\\\\"{spgwcAddress}\\\\\\"; }}'.format(spgwcAddress = str(spgwcAddress))


      # ====== Build SPGW-U dependencies ====================================
      vduHelper.beginBlock('Building SPGW-U dependencies')
      vduHelper.executeFromString("""\
export MAKEFLAGS="-j`nproc`" && \\
cd /home/nornetpp/src/{gitDirectory}/build/scripts && \\
mkdir -p logs && \\
./build_spgwu -I -f >logs/build_spgwu-1.log 2>&1""".format(gitDirectory = gitDirectory))
      vduHelper.endBlock()

      # ====== Build SPGW-U itself ==========================================
      vduHelper.beginBlock('Building SPGW-U itself')
      vduHelper.executeFromString("""\
export MAKEFLAGS="-j`nproc`" && \\
cd /home/nornetpp/src/{gitDirectory}/build/scripts && \\
./build_spgwu -c -V -b Debug -j >logs/build_spgwu-2.log 2>&1""".format(gitDirectory = gitDirectory))
      vduHelper.endBlock()

      # ====== Configure SPGW-U =============================================
      vduHelper.beginBlock('Configuring SPGW-U')
      vduHelper.executeFromString("""\
cd /home/nornetpp/src/{gitDirectory}/build/scripts && \\
INSTANCE=1 && \\
PREFIX='/usr/local/etc/oai' && \\
sudo mkdir -m 0777 -p $PREFIX && \\
sudo cp ../../etc/spgw_u.conf  $PREFIX && \\
declare -A SPGWU_CONF && \\
SPGWU_CONF[@INSTANCE@]=$INSTANCE && \\
SPGWU_CONF[@PREFIX@]=$PREFIX && \\
SPGWU_CONF[@PID_DIRECTORY@]='/var/run' && \\
SPGWU_CONF[@SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP@]='{spgwuS1U_IfName}' && \\
SPGWU_CONF[@SGW_INTERFACE_NAME_FOR_SX@]='{spgwuSXab_IfName}' && \\
SPGWU_CONF[@SGW_INTERFACE_NAME_FOR_SGI@]='{spgwuSGi_IfName}' && \\
for K in "${{!SPGWU_CONF[@]}}"; do sudo egrep -lRZ "$K" $PREFIX | xargs -0 -l sudo sed -i -e "s|$K|${{SPGWU_CONF[$K]}}|g" ; ret=$?;[[ ret -ne 0 ]] && echo "Tried to replace $K with ${{SPGWU_CONF[$K]}}" || true ; done && \\
sudo sed -e "s/{{.*IPV4_ADDRESS=\\"192.168.160.100|\\".*;.*}}\|{{.*IPV4_ADDRESS=\\"@SPGWC0_IP_ADDRESS@\\".*;.*}}/{spgwcList}/g" -i /usr/local/etc/oai/spgw_u.conf""".format(
         gitDirectory      = gitDirectory,
         spgwuSXab_IfName  = spgwuSXab_IfName,
         spgwuS1U_IfName   = spgwuS1U_IfName,
         spgwuSGi_IfName   = spgwuSGi_IfName,
         spgwcList         = spgwcList
      ))
      vduHelper.endBlock()


      # ====== Configure HENCSAT QoS Setup ==================================
      vduHelper.beginBlock('Configuring QoS Setup')
      vduHelper.runInShell('sudo mkdir -p /etc/hencsat')
      vduHelper.createFileFromString('/etc/hencsat/hencsat-router.conf',
"""# HENCSAT Router Configuration

ROUTER_INTERFACE_LEFT=ens6
ROUTER_INTERFACE_RIGHT=pdn
""")
      vduHelper.aptInstallPackages([ 'hencsat-router' ], False)
      vduHelper.endBlock()


      # ====== Set up SPGW-U service ========================================
      vduHelper.beginBlock('Setting up SPGW-U service')
      vduHelper.configureSystemInfo('SPGW-U', 'This is the SPGW-U of the SimulaMet OAI VNF!')
      vduHelper.createFileFromString('/lib/systemd/system/spgwu.service', """\
[Unit]
Description=Serving and Packet Data Network Gateway -- User Plane (SPGW-U)
After=ssh.target

[Service]
ExecStart=/bin/sh -c 'exec /usr/local/bin/spgwu -c /usr/local/etc/oai/spgw_u.conf -o >>/var/log/spgwu.log 2>&1'
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
WorkingDirectory=/home/nornetpp/src/{gitDirectory}/build/scripts

[Install]
WantedBy=multi-user.target
""".format(gitDirectory = gitDirectory))

      vduHelper.createFileFromString('/home/nornetpp/log',
"""\
#!/bin/sh
tail -f /var/log/spgwu.log
""", True)

      vduHelper.createFileFromString('/home/nornetpp/restart',
"""\
#!/bin/sh
DIRECTORY=`dirname $0`
sudo service spgwu restart && sleep 5 && sudo service hencsat-router restart && $DIRECTORY/log
""", True)
      vduHelper.runInShell('sudo chown nornetpp:nornetpp /home/nornetpp/log /home/nornetpp/restart')
      vduHelper.endBlock()

      # ====== Set up sysstat service =======================================
      vduHelper.installSysStat()

      # ====== Clean up =====================================================
      vduHelper.cleanUp()

      message = vduHelper.endBlock()
      function_set( { 'outout': message } )
      set_flag('spgwucharm.configured-spgwu')
   except:
      message = vduHelper.endBlockInException()
      function_fail(message)
   finally:
      clear_flag('actions.configure-spgwu')
Ejemplo n.º 21
0
def prepare_mme_build():
    vduHelper.beginBlock('prepare_mme_build')
    try:

        # ====== Get MME parameters ===========================================
        # For a documentation of the installation procedure, see:
        # https://github.com/OPENAIRINTERFACE/openair-cn/wiki/OpenAirSoftwareSupport#install-mme

        gitRepository = function_get('mme-git-repository')
        gitCommit = function_get('mme-git-commit')
        gitDirectory = 'openair-mme'

        mmeS1C_IPv4Interface = IPv4Interface(
            function_get('mme-S1C-ipv4-interface'))
        mmeS1C_IPv4Gateway = IPv4Address(function_get('mme-S1C-ipv4-gateway'))
        if function_get('mme-S1C-ipv6-interface') != '':
            mmeS1C_IPv6Interface = IPv6Interface(
                function_get('mme-S1C-ipv6-interface'))
        else:
            mmeS1C_IPv6Interface = None
        if function_get('mme-S1C-ipv6-gateway') != '':
            mmeS1C_IPv6Gateway = IPv6Address(
                function_get('mme-S1C-ipv6-gateway'))
        else:
            mmeS1C_IPv6Gateway = None

        # Prepare network configurations:
        mmeS6a_IfName = 'ens4'
        mmeS11_IfName = 'ens5'
        mmeS1C_IfName = 'ens6'

        configurationS6a = vduHelper.makeInterfaceConfiguration(
            mmeS6a_IfName, IPv4Interface('0.0.0.0/0'))
        configurationS11 = vduHelper.makeInterfaceConfiguration(
            mmeS11_IfName, IPv4Interface('0.0.0.0/0'))
        configurationS1C = vduHelper.makeInterfaceConfiguration(
            mmeS1C_IfName, mmeS1C_IPv4Interface, mmeS1C_IPv4Gateway,
            mmeS1C_IPv6Interface, mmeS1C_IPv6Gateway)

        # S10 dummy interface:
        mmeS10_IfName = 'dummy0'
        configurationS10 = vduHelper.makeInterfaceConfiguration(
            mmeS10_IfName,
            IPv4Interface('192.168.10.110/24'),
            createDummy=True)

        # ====== Prepare system ===============================================
        vduHelper.beginBlock('Preparing system')
        vduHelper.configureInterface(mmeS6a_IfName, configurationS6a, 61)
        vduHelper.configureInterface(mmeS11_IfName, configurationS11, 62)
        vduHelper.configureInterface(mmeS1C_IfName, configurationS1C, 63)
        vduHelper.configureInterface(mmeS10_IfName, configurationS10, 64)
        vduHelper.testNetworking()
        vduHelper.waitForPackageUpdatesToComplete()
        vduHelper.endBlock()

        # ====== Prepare sources ==============================================
        vduHelper.beginBlock('Preparing sources')
        vduHelper.fetchGitRepository(gitDirectory, gitRepository, gitCommit)
        vduHelper.endBlock()

        message = vduHelper.endBlock()
        function_set({'outout': message})
        set_flag('mmecharm.prepared-mme-build')
    except:
        message = vduHelper.endBlockInException()
        function_fail(message)
    finally:
        clear_flag('actions.prepare-mme-build')
Ejemplo n.º 22
0
def configure_mme():
    vduHelper.beginBlock('configure-mme')
    try:

        # ====== Get MME parameters ===========================================
        # For a documentation of the installation procedure, see:
        # https://github.com/OPENAIRINTERFACE/openair-cn/wiki/OpenAirSoftwareSupport#install-mme

        gitDirectory = 'openair-mme'

        hssS6a_IPv4Address = IPv4Address(function_get('hss-S6a-address'))
        mmeS1C_IPv4Interface = IPv4Interface(
            function_get('mme-S1C-ipv4-interface'))
        mmeS11_IPv4Interface = IPv4Interface(
            function_get('mme-S11-ipv4-interface'))
        mmeS10_IPv4Interface = IPv4Interface('192.168.10.110/24')
        spwgcS11_IPv4Interface = IPv4Interface(
            function_get('spgwc-S11-ipv4-interface'))
        networkRealm = function_get('network-realm')
        networkMCC = int(function_get('network-mcc'))
        networkMNC = int(function_get('network-mnc'))
        networkOP = function_get('network-op')
        networkK = function_get('network-k')
        networkIMSIFirst = function_get('network-imsi-first')
        networkMSISDNFirst = function_get('network-msisdn-first')
        networkUsers = int(function_get('network-users'))

        TAC_SGW_TEST = 7
        TAC_SGW_0 = 600
        TAC_MME_0 = 601
        TAC_MME_1 = 602

        tac_sgw_test = '{:04x}'.format(TAC_SGW_TEST)
        tac_sgw_0 = '{:04x}'.format(TAC_SGW_0)
        tac_mme_0 = '{:04x}'.format(TAC_MME_0)
        tac_mme_1 = '{:04x}'.format(TAC_MME_1)

        # Prepare network configurations:
        mmeS6a_IfName = 'ens4'
        mmeS11_IfName = 'ens5'
        mmeS1C_IfName = 'ens6'
        mmeS10_IfName = 'dummy0'

        # ====== Build MME dependencies =======================================
        vduHelper.beginBlock('Building MME dependencies')
        vduHelper.executeFromString("""\
export MAKEFLAGS="-j`nproc`" && \\
cd /home/nornetpp/src/{gitDirectory}/scripts && \\
mkdir -p logs && \\
./build_mme --check-installed-software --force >logs/build_mme-1.log 2>&1
""".format(gitDirectory=gitDirectory))
        vduHelper.endBlock()

        # ====== Build MME itself =============================================
        vduHelper.beginBlock('Building MME itself')
        vduHelper.executeFromString("""\
export MAKEFLAGS="-j`nproc`" && \\
cd /home/nornetpp/src/{gitDirectory}/scripts && \\
./build_mme --clean >logs/build_mme-2.log 2>&1
""".format(gitDirectory=gitDirectory))
        vduHelper.endBlock()

        # ====== Configure MME ================================================
        vduHelper.beginBlock('Configuring MME')
        vduHelper.executeFromString("""\
export MAKEFLAGS="-j`nproc`" && \\
cd /home/nornetpp/src/{gitDirectory}/scripts && \\
echo "127.0.1.1        mme.{networkRealm} mme" | sudo tee -a /etc/hosts && \\
echo "{hssS6a_IPv4Address}     hss.{networkRealm} hss" | sudo tee -a /etc/hosts && \\
openssl rand -out $HOME/.rnd 128 && \\
INSTANCE=1 && \\
PREFIX='/usr/local/etc/oai' && \\
sudo mkdir -m 0777 -p $PREFIX && \\
sudo mkdir -m 0777 -p $PREFIX/freeDiameter && \\
sudo cp ../etc/mme_fd.sprint.conf  $PREFIX/freeDiameter/mme_fd.conf && \\
sudo cp ../etc/mme.conf  $PREFIX && \\
declare -A MME_CONF && \\
MME_CONF[@MME_S6A_IP_ADDR@]="127.0.0.11" && \\
MME_CONF[@INSTANCE@]=$INSTANCE && \\
MME_CONF[@PREFIX@]=$PREFIX && \\
MME_CONF[@REALM@]='{networkRealm}' && \\
MME_CONF[@PID_DIRECTORY@]='/var/run' && \\
MME_CONF[@MME_FQDN@]="mme.{networkRealm}" && \\
MME_CONF[@HSS_HOSTNAME@]='hss' && \\
MME_CONF[@HSS_FQDN@]="hss.{networkRealm}" && \\
MME_CONF[@HSS_IP_ADDR@]='{hssS6a_IPv4Address}' && \\
MME_CONF[@MCC@]='{networkMCC}' && \\
MME_CONF[@MNC@]='{networkMNC}' && \\
MME_CONF[@MME_GID@]='32768' && \\
MME_CONF[@MME_CODE@]='3' && \\
MME_CONF[@TAC_0@]='600' && \\
MME_CONF[@TAC_1@]='601' && \\
MME_CONF[@TAC_2@]='602' && \\
MME_CONF[@MME_INTERFACE_NAME_FOR_S1_MME@]='{mmeS1C_IfName}' && \\
MME_CONF[@MME_IPV4_ADDRESS_FOR_S1_MME@]='{mmeS1C_IPv4Interface}' && \\
MME_CONF[@MME_INTERFACE_NAME_FOR_S11@]='{mmeS11_IfName}' && \\
MME_CONF[@MME_IPV4_ADDRESS_FOR_S11@]='{mmeS11_IPv4Interface}' && \\
MME_CONF[@MME_INTERFACE_NAME_FOR_S10@]='{mmeS10_IfName}' && \\
MME_CONF[@MME_IPV4_ADDRESS_FOR_S10@]='{mmeS10_IPv4Interface}' && \\
MME_CONF[@OUTPUT@]='CONSOLE' && \\
MME_CONF[@SGW_IPV4_ADDRESS_FOR_S11_TEST_0@]='{spwgcS11_IPv4Address}' && \\
MME_CONF[@SGW_IPV4_ADDRESS_FOR_S11_0@]='{spwgcS11_IPv4Address}' && \\
MME_CONF[@PEER_MME_IPV4_ADDRESS_FOR_S10_0@]='0.0.0.0/24' && \\
MME_CONF[@PEER_MME_IPV4_ADDRESS_FOR_S10_1@]='0.0.0.0/24' && \\
MME_CONF[@TAC-LB_SGW_TEST_0@]={tac_sgw_test_lo} && \\
MME_CONF[@TAC-HB_SGW_TEST_0@]={tac_sgw_test_hi} && \\
MME_CONF[@MCC_SGW_0@]={networkMCC} && \\
MME_CONF[@MNC3_SGW_0@]={networkMNC:03d} && \\
MME_CONF[@TAC-LB_SGW_0@]={tac_sgw_0_lo} && \\
MME_CONF[@TAC-HB_SGW_0@]={tac_sgw_0_hi} && \\
MME_CONF[@MCC_MME_0@]={networkMCC} && \\
MME_CONF[@MNC3_MME_0@]={networkMNC:03d} && \\
MME_CONF[@TAC-LB_MME_0@]={tac_mme_0_lo} && \\
MME_CONF[@TAC-HB_MME_0@]={tac_mme_0_hi} && \\
MME_CONF[@MCC_MME_1@]={networkMCC} && \\
MME_CONF[@MNC3_MME_1@]={networkMNC:03d} && \\
MME_CONF[@TAC-LB_MME_1@]={tac_mme_1_lo} && \\
MME_CONF[@TAC-HB_MME_1@]={tac_mme_1_hi} && \\
for K in "${{!MME_CONF[@]}}"; do sudo egrep -lRZ "$K" $PREFIX | xargs -0 -l sudo sed -i -e "s|$K|${{MME_CONF[$K]}}|g" ; ret=$?;[[ ret -ne 0 ]] && echo "Tried to replace $K with ${{MME_CONF[$K]}}" || true ; done && \\
sudo ./check_mme_s6a_certificate $PREFIX/freeDiameter mme.{networkRealm} >logs/check_mme_s6a_certificate.log 2>&1
""".format(gitDirectory=gitDirectory,
           hssS6a_IPv4Address=hssS6a_IPv4Address,
           mmeS1C_IfName=mmeS1C_IfName,
           mmeS1C_IPv4Interface=mmeS1C_IPv4Interface,
           mmeS11_IfName=mmeS11_IfName,
           mmeS11_IPv4Interface=mmeS11_IPv4Interface,
           mmeS10_IfName=mmeS10_IfName,
           mmeS10_IPv4Interface=mmeS10_IPv4Interface,
           spwgcS11_IPv4Address=spwgcS11_IPv4Interface.ip,
           networkRealm=networkRealm,
           networkMCC=networkMCC,
           networkMNC=networkMNC,
           networkOP=networkOP,
           networkK=networkK,
           networkIMSIFirst=networkIMSIFirst,
           networkMSISDNFirst=networkMSISDNFirst,
           networkUsers=networkUsers,
           tac_sgw_test_hi=tac_sgw_test[0:2],
           tac_sgw_test_lo=tac_sgw_test[2:4],
           tac_sgw_0_hi=tac_sgw_0[0:2],
           tac_sgw_0_lo=tac_sgw_0[2:4],
           tac_mme_0_hi=tac_mme_0[0:2],
           tac_mme_0_lo=tac_mme_0[2:4],
           tac_mme_1_hi=tac_mme_1[0:2],
           tac_mme_1_lo=tac_mme_1[2:4]))
        vduHelper.endBlock()

        # ====== Set up MME service ===========================================
        vduHelper.beginBlock('Setting up MME service')
        vduHelper.configureSystemInfo(
            'MME', 'This is the MME of the SimulaMet OAI VNF!')
        vduHelper.createFileFromString(
            '/lib/systemd/system/mme.service', """\
[Unit]
Description=Mobility Management Entity (MME)
After=ssh.target

[Service]
ExecStart=/bin/sh -c 'exec /usr/local/bin/mme -c /usr/local/etc/oai/mme.conf >>/var/log/mme.log 2>&1'
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
WorkingDirectory=/home/nornetpp/src/{gitDirectory}/scripts

[Install]
WantedBy=multi-user.target
""".format(gitDirectory=gitDirectory))

        vduHelper.createFileFromString(
            '/home/nornetpp/log', """\
#!/bin/sh
tail -f /var/log/mme.log
""", True)

        vduHelper.createFileFromString(
            '/home/nornetpp/restart', """\
#!/bin/sh
DIRECTORY=`dirname $0`
sudo service mme restart && $DIRECTORY/log
""", True)
        vduHelper.runInShell(
            'sudo chown nornetpp:nornetpp /home/nornetpp/log /home/nornetpp/restart'
        )
        vduHelper.endBlock()

        # ====== Set up sysstat service =======================================
        vduHelper.installSysStat()

        # ====== Clean up =====================================================
        vduHelper.cleanUp()

        message = vduHelper.endBlock()
        function_set({'outout': message})
        set_flag('mmecharm.configured-mme')
    except:
        message = vduHelper.endBlockInException()
        function_fail(message)
    finally:
        clear_flag('actions.configure-mme')
Ejemplo n.º 23
0
def prepare_flexran_build():
    vduHelper.beginBlock('prepare_flexran_build')
    try:

        # ====== Get FlexRAN parameters ===========================================
        # For a documentation of the installation procedure, see:
        # https://gitlab.eurecom.fr/mosaic5g/mosaic5g/-/wikis/tutorials/slicing

        gitName = function_get('git-name')
        gitEmail = function_get('git-email')
        gitRepository = function_get('flexran-git-repository')
        gitCommit = function_get('flexran-git-commit')
        gitDirectory = 'mosaic5g'

        flexranService_IPv4Interface = IPv4Interface(
            function_get('flexran-service-ipv4-interface'))
        flexranService_IPv4Gateway = IPv4Address(
            function_get('flexran-service-ipv4-gateway'))
        if function_get('flexran-service-ipv6-interface') != '':
            flexranService_IPv6Interface = IPv6Interface(
                function_get('flexran-service-ipv6-interface'))
        else:
            flexranService_IPv6Interface = None
        if function_get('flexran-service-ipv6-gateway') != '':
            flexranService_IPv6Gateway = IPv6Address(
                function_get('flexran-service-ipv6-gateway'))
        else:
            flexranService_IPv6Gateway = None

        # Prepare network configuration:
        # Cloud-Init configures all 3 interfaces in Ubuntu 20.04+
        # => unwanted configuration on ens3 and ens4
        # Get rid of the Cloud-Init configuration, then configure the
        # interfaces manually with the correct configuration.
        vduHelper.runInShell('sudo rm -f /etc/netplan/50-cloud-init.yaml')
        interfaceConfiguration = vduHelper.makeInterfaceConfiguration('ens3')
        vduHelper.configureInterface('ens3', interfaceConfiguration, 50)

        flexranService_IfName = 'ens4'
        configurationService = vduHelper.makeInterfaceConfiguration(
            flexranService_IfName, flexranService_IPv4Interface,
            flexranService_IPv4Gateway, flexranService_IPv6Interface,
            flexranService_IPv6Gateway)

        # ====== Prepare system ===============================================
        vduHelper.beginBlock('Preparing system')
        vduHelper.configureGit(gitName, gitEmail)
        vduHelper.configureInterface(flexranService_IfName,
                                     configurationService, 61)
        vduHelper.testNetworking()
        vduHelper.waitForPackageUpdatesToComplete()
        # vduHelper.executeFromString("""if [ "`find /etc/apt/sources.list.d -name 'pistache_team-ubuntu-unstable-*.list'`" == "" ] ; then sudo add-apt-repository -y ppa:pistache+team/unstable ; fi""")
        # vduHelper.aptInstallPackages([ 'libpistache-dev' ])
        vduHelper.endBlock()

        # ====== Prepare sources ==============================================
        vduHelper.beginBlock('Preparing sources')
        vduHelper.fetchGitRepository(gitDirectory, gitRepository, gitCommit)
        vduHelper.executeFromString("""\
cd /home/nornetpp/src/{gitDirectory} && \\
git submodule init && \\
git submodule update flexran
""".format(gitDirectory=gitDirectory))
        vduHelper.endBlock()

        message = vduHelper.endBlock()
        function_set({'outout': message})
        set_flag('flexrancharm.prepared-flexran-build')
    except:
        message = vduHelper.endBlockInException()
        function_fail(message)
    finally:
        clear_flag('actions.prepare-flexran-build')
Ejemplo n.º 24
0
def fail(msg):
    hookenv.function_set({'outcome': 'failure'})
    hookenv.action_fail(msg)
    sys.exit()
Ejemplo n.º 25
0
def configure_hss():
    vduHelper.beginBlock('configure_hss')
    try:

        # ====== Get HSS parameters ===========================================
        # For a documentation of the installation procedure, see:
        # https://github.com/OPENAIRINTERFACE/openair-cn/wiki/OpenAirSoftwareSupport#install-hss

        gitDirectory = 'openair-hss'
        cassandraServerIP = function_get('cassandra-server-ip')
        networkRealm = function_get('network-realm')
        networkOP = function_get('network-op')
        networkK = function_get('network-k')
        networkIMSIFirst = function_get('network-imsi-first')
        networkMSISDNFirst = function_get('network-msisdn-first')
        networkUsers = int(function_get('network-users'))

        hssS6a_IPv4Address = IPv4Address(function_get('hss-S6a-address'))
        mmeS6a_IPv4Address = IPv4Address(function_get('mme-S6a-address'))

        # ====== Build HSS dependencies =======================================
        vduHelper.beginBlock('Building HSS dependencies')
        vduHelper.executeFromString("""\
export MAKEFLAGS="-j`nproc`" && \\
cd /home/nornetpp/src/{gitDirectory}/scripts && \\
mkdir -p logs && \\
./build_hss_rel14 --check-installed-software --force >logs/build_hss_rel14-1.log 2>&1
""".format(gitDirectory=gitDirectory))
        vduHelper.endBlock()

        # ====== Build HSS itself =============================================
        vduHelper.beginBlock('Building HSS itself')
        vduHelper.executeFromString("""\
export MAKEFLAGS="-j`nproc`" && \\
cd /home/nornetpp/src/{gitDirectory}/scripts && \\
./build_hss_rel14 --clean >logs/build_hss_rel14-2.log 2>&1 && \\
cqlsh --file ../src/hss_rel14/db/oai_db.cql {cassandraServerIP} >logs/oai_db.log 2>&1
""".format(gitDirectory=gitDirectory, cassandraServerIP=cassandraServerIP))
        vduHelper.endBlock()

        # ====== Provision users and MME ======================================
        vduHelper.beginBlock('Provisioning users and MME')
        vduHelper.executeFromString("""\
cd /home/nornetpp/src/{gitDirectory}/scripts && \\
./data_provisioning_users --apn default.{networkRealm} --apn2 internet.{networkRealm} --key {networkK} --imsi-first {networkIMSIFirst} --msisdn-first {networkMSISDNFirst} --mme-identity mme.{networkRealm} --no-of-users {networkUsers} --realm {networkRealm} --truncate True  --verbose True --cassandra-cluster {cassandraServerIP} >logs/data_provisioning_users.log 2>&1 && \\
./data_provisioning_mme --id 3 --mme-identity mme.{networkRealm} --realm {networkRealm} --ue-reachability 1 --truncate True  --verbose True -C {cassandraServerIP} >logs/data_provisioning_mme.log 2>&1
""".format(gitDirectory=gitDirectory,
           cassandraServerIP=cassandraServerIP,
           networkRealm=networkRealm,
           networkOP=networkOP,
           networkK=networkK,
           networkIMSIFirst=networkIMSIFirst,
           networkMSISDNFirst=networkMSISDNFirst,
           networkUsers=networkUsers))
        vduHelper.endBlock()

        # ====== Configure HSS ================================================
        vduHelper.beginBlock('Configuring HSS')
        vduHelper.executeFromString("""\
cd /home/nornetpp/src/{gitDirectory}/scripts && \\
echo "{hssS6a_IPv4Address}   hss.{networkRealm} hss" | sudo tee -a /etc/hosts && \\
echo "{mmeS6a_IPv4Address}   mme.{networkRealm} mme" | sudo tee -a /etc/hosts && \\
openssl rand -out $HOME/.rnd 128 && \\
echo "====== Configuring Diameter ... ======" && \\
PREFIX='/usr/local/etc/oai' && \\
sudo mkdir -m 0777 -p $PREFIX && \\
sudo mkdir -m 0777 -p $PREFIX/freeDiameter && \\
sudo cp ../etc/acl.conf ../etc/hss_rel14_fd.conf $PREFIX/freeDiameter && \\
sudo cp ../etc/hss_rel14.conf ../etc/hss_rel14.json $PREFIX && \\
sudo sed -i -e 's/#ListenOn/ListenOn/g' $PREFIX/freeDiameter/hss_rel14_fd.conf && \\
echo "====== Updating configuration files ... ======" && \\
declare -A HSS_CONF && \\
HSS_CONF[@PREFIX@]=$PREFIX && \\
HSS_CONF[@REALM@]='{networkRealm}' && \\
HSS_CONF[@HSS_FQDN@]='hss.{networkRealm}' && \\
HSS_CONF[@cassandra_Server_IP@]='{cassandraServerIP}' && \\
HSS_CONF[@cassandra_IP@]='{cassandraServerIP}' && \\
HSS_CONF[@OP_KEY@]='{networkOP}' && \\
HSS_CONF[@ROAMING_ALLOWED@]='true' && \\
for K in "${{!HSS_CONF[@]}}"; do echo "K=$K ..." && sudo egrep -lRZ "$K" $PREFIX | xargs -0 -l sudo sed -i -e "s|$K|${{HSS_CONF[$K]}}|g" ; done && \\
../src/hss_rel14/bin/make_certs.sh hss {networkRealm} $PREFIX && \\
echo "====== Updating key ... ======" && \\
oai_hss -j $PREFIX/hss_rel14.json --onlyloadkey >logs/onlyloadkey.log 2>&1
""".format(gitDirectory=gitDirectory,
           cassandraServerIP=cassandraServerIP,
           hssS6a_IPv4Address=hssS6a_IPv4Address,
           mmeS6a_IPv4Address=mmeS6a_IPv4Address,
           networkRealm=networkRealm,
           networkOP=networkOP,
           networkK=networkK,
           networkIMSIFirst=networkIMSIFirst,
           networkMSISDNFirst=networkMSISDNFirst,
           networkUsers=networkUsers))
        vduHelper.endBlock()

        # ====== Set up HSS service ===========================================
        vduHelper.beginBlock('Setting up HSS service')
        vduHelper.configureSystemInfo(
            'HSS', 'This is the HSS of the SimulaMet OAI VNF!')
        vduHelper.createFileFromString(
            '/lib/systemd/system/hss.service', """\
[Unit]
Description=Home Subscriber Server (HSS)
After=ssh.target

[Service]
ExecStart=/bin/sh -c 'exec /usr/local/bin/oai_hss -j /usr/local/etc/oai/hss_rel14.json >>/var/log/hss.log 2>&1'
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
WorkingDirectory=/home/nornetpp/src/{gitDirectory}/scripts

[Install]
WantedBy=multi-user.target
""".format(gitDirectory=gitDirectory))

        vduHelper.createFileFromString(
            '/home/nornetpp/log', """\
#!/bin/sh
tail -f /var/log/hss.log
""", True)

        vduHelper.createFileFromString(
            '/home/nornetpp/restart', """\
#!/bin/sh
DIRECTORY=`dirname $0`
sudo service hss restart && $DIRECTORY/log
""", True)
        vduHelper.runInShell(
            'sudo chown nornetpp:nornetpp /home/nornetpp/log /home/nornetpp/restart'
        )
        vduHelper.endBlock()

        # ====== Set up sysstat service =======================================
        vduHelper.installSysStat()

        # ====== Clean up =====================================================
        vduHelper.cleanUp()

        message = vduHelper.endBlock()
        function_set({'outout': message})
        set_flag('hsscharm.configured-hss')
    except:
        message = vduHelper.endBlockInException()
        function_fail(message)
    finally:
        clear_flag('actions.configure-hss')
Ejemplo n.º 26
0
def node_name():
    """Implementation of 'node-name' action."""
    function_set({'node-name': cloud_utils.service_hostname()})
Ejemplo n.º 27
0
def instance_count():
    """Implementation of `instance-count` action."""
    nova = cloud_utils.nova_client()
    vm_count = cloud_utils.running_vms(nova)

    function_set({'instance-count': vm_count})
Ejemplo n.º 28
0
def configure_spgwc():
   vduHelper.beginBlock('configure_spgwc')
   try:

      # ====== Get SPGW-C parameters ========================================
      # For a documentation of the installation procedure, see:
      # https://github.com/OPENAIRINTERFACE/openair-cn-cups/wiki/OpenAirSoftwareSupport#install-spgw-c

      gitDirectory         = 'openair-spgwc'

      networkRealm         = function_get('network-realm')
      networkDNS1_IPv4     = IPv4Address(function_get('network-ipv4-dns1'))
      networkDNS2_IPv4     = IPv4Address(function_get('network-ipv4-dns2'))

      # Prepare network configurations:
      spgwcSXab_IfName     = 'ens4'
      spgwcS11_IfName      = 'ens5'
      spgwcS5S8_SGW_IfName = 'dummy0'
      spgwcS5S8_PGW_IfName = 'dummy1'

      # ====== Build SPGW-C dependencies ====================================
      vduHelper.beginBlock('Building SPGW-C dependencies')
      vduHelper.executeFromString("""\
export MAKEFLAGS="-j`nproc`" && \\
cd /home/nornetpp/src/{gitDirectory}/build/scripts && \\
mkdir -p logs && \\
./build_spgwc -I -f >logs/build_spgwc-1.log 2>&1
""".format(gitDirectory = gitDirectory))
      vduHelper.endBlock()

      # ====== Build SPGW-C itself ==========================================
      vduHelper.beginBlock('Building SPGW-C itself')
      vduHelper.executeFromString("""\
export MAKEFLAGS="-j`nproc`" && \\
cd /home/nornetpp/src/{gitDirectory}/build/scripts && \\
./build_spgwc -c -V -b Debug -j >logs/build_spgwc-2.log 2>&1
""".format(gitDirectory = gitDirectory))
      vduHelper.endBlock()

      # ====== Configure SPGW-C =============================================
      vduHelper.beginBlock('Configuring SPGW-C')
      vduHelper.executeFromString("""\
cd /home/nornetpp/src/{gitDirectory}/build/scripts && \\
INSTANCE=1 && \\
PREFIX='/usr/local/etc/oai' && \\
sudo mkdir -m 0777 -p $PREFIX && \\
sudo cp ../../etc/spgw_c.conf  $PREFIX && \\
declare -A SPGWC_CONF && \\
SPGWC_CONF[@INSTANCE@]=$INSTANCE && \\
SPGWC_CONF[@PREFIX@]=$PREFIX && \\
SPGWC_CONF[@PID_DIRECTORY@]='/var/run' && \\
SPGWC_CONF[@SGW_INTERFACE_NAME_FOR_S11@]='{spgwcS11_IfName}' && \\
SPGWC_CONF[@SGW_INTERFACE_NAME_FOR_S5_S8_CP@]='{spgwcS5S8_SGW_IfName}' && \\
SPGWC_CONF[@PGW_INTERFACE_NAME_FOR_S5_S8_CP@]='{spgwcS5S8_PGW_IfName}' && \\
SPGWC_CONF[@PGW_INTERFACE_NAME_FOR_SX@]='{spgwcSXab_IfName}' && \\
SPGWC_CONF[@DEFAULT_DNS_IPV4_ADDRESS@]='{networkDNS1_IPv4}' && \\
SPGWC_CONF[@DEFAULT_DNS_SEC_IPV4_ADDRESS@]='{networkDNS2_IPv4}' && \\
SPGWC_CONF[@DEFAULT_APN@]='default.{networkRealm}' && \\
for K in "${{!SPGWC_CONF[@]}}"; do sudo egrep -lRZ "$K" $PREFIX | xargs -0 -l sudo sed -i -e "s|$K|${{SPGWC_CONF[$K]}}|g" ; ret=$?;[[ ret -ne 0 ]] && echo "Tried to replace $K with ${{SPGWC_CONF[$K]}}" || true ; done && \\
sudo sed -e "s/APN_NI = \\"default\\"/APN_NI = \\"default.{networkRealm}\\"/g" -i /usr/local/etc/oai/spgw_c.conf && \\
sudo sed -e "s/APN_NI = \\"apn1\\"/APN_NI = \\"internet.{networkRealm}\\"/g" -i /usr/local/etc/oai/spgw_c.conf
""".format(
         gitDirectory         = gitDirectory,
         networkRealm         = networkRealm,
         networkDNS1_IPv4     = networkDNS1_IPv4,
         networkDNS2_IPv4     = networkDNS2_IPv4,
         spgwcSXab_IfName     = spgwcSXab_IfName,
         spgwcS11_IfName      = spgwcS11_IfName,
         spgwcS5S8_SGW_IfName = spgwcS5S8_SGW_IfName,
         spgwcS5S8_PGW_IfName = spgwcS5S8_PGW_IfName
      ))
      vduHelper.endBlock()


      # ====== Set up SPGW-C service ========================================
      vduHelper.beginBlock('Setting up SPGW-C service')
      vduHelper.configureSystemInfo('SPGW-C', 'This is the SPGW-C of the SimulaMet OAI VNF!')
      vduHelper.createFileFromString('/lib/systemd/system/spgwc.service', """\
[Unit]
Description=Serving and Packet Data Network Gateway -- Control Plane (SPGW-C)
After=ssh.target

[Service]
ExecStart=/bin/sh -c 'exec /usr/local/bin/spgwc -c /usr/local/etc/oai/spgw_c.conf -o >>/var/log/spgwc.log 2>&1'
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
WorkingDirectory=/home/nornetpp/src/{gitDirectory}/build/scripts

[Install]
WantedBy=multi-user.target
""".format(gitDirectory = gitDirectory))

      vduHelper.createFileFromString('/home/nornetpp/log',
"""\
#!/bin/sh
tail -f /var/log/spgwc.log
""", True)

      vduHelper.createFileFromString('/home/nornetpp/restart',
"""\
#!/bin/sh
DIRECTORY=`dirname $0`
sudo service spgwc restart && $DIRECTORY/log
""", True)
      vduHelper.runInShell('sudo chown nornetpp:nornetpp /home/nornetpp/log /home/nornetpp/restart')
      vduHelper.endBlock()

      # ====== Set up sysstat service =======================================
      vduHelper.installSysStat()

      # ====== Clean up =====================================================
      vduHelper.cleanUp()

      message = vduHelper.endBlock()
      function_set( { 'outout': message } )
      set_flag('spgwccharm.configured-spgwc')
   except:
      message = vduHelper.endBlockInException()
      function_fail(message)
   finally:
      clear_flag('actions.configure-spgwc')
Ejemplo n.º 29
0
def prepare_spgwu_build():
   vduHelper.beginBlock('prepare_spgwu_build')
   try:

      # ====== Get SPGW-U parameters ========================================
      # For a documentation of the installation procedure, see:
      # https://github.com/OPENAIRINTERFACE/openair-cn-cups/wiki/OpenAirSoftwareSupport#install-spgw-u

      gitRepository          = function_get('spgwu-git-repository')
      gitCommit              = function_get('spgwu-git-commit')
      gitDirectory           = 'openair-spgwu-tiny'

      spgwuS1U_IPv4Interface = IPv4Interface(function_get('spgwu-S1U-ipv4-interface'))
      spgwuS1U_IPv4Gateway   = IPv4Address(function_get('spgwu-S1U-ipv4-gateway'))

      spgwuSGi_IPv4Interface = IPv4Interface(function_get('spgwu-SGi-ipv4-interface'))
      spgwuSGi_IPv4Gateway   = IPv4Address(function_get('spgwu-SGi-ipv4-gateway'))
      if function_get('spgwu-SGi-ipv6-interface') == '':
         spgwuSGi_IPv6Interface = None
      else:
         spgwuSGi_IPv6Interface = IPv6Interface(function_get('spgwu-SGi-ipv6-interface'))
      if function_get('spgwu-SGi-ipv6-gateway') == '':
         spgwuSGi_IPv6Gateway = None
      else:
         spgwuSGi_IPv6Gateway = IPv6Address(function_get('spgwu-SGi-ipv6-gateway'))

      # Prepare network configurations:
      spgwuSXab_IfName       = 'ens4'
      spgwuS1U_IfName        = 'ens5'
      spgwuSGi_IfName        = 'ens6'

      configurationSXab = vduHelper.makeInterfaceConfiguration(spgwuSXab_IfName, IPv4Interface('0.0.0.0/0'), metric=261)
      configurationS1U  = vduHelper.makeInterfaceConfiguration(spgwuS1U_IfName, spgwuS1U_IPv4Interface, spgwuS1U_IPv4Gateway, metric=262)
      configurationSGi  = vduHelper.makeInterfaceConfiguration(spgwuSGi_IfName, spgwuSGi_IPv4Interface, spgwuSGi_IPv4Gateway,
                                                               spgwuSGi_IPv6Interface, spgwuSGi_IPv6Gateway,
                                                               metric=200, pdnInterface = 'pdn')


      # ====== Prepare system ===============================================
      vduHelper.beginBlock('Preparing system')
      vduHelper.configureInterface(spgwuSXab_IfName, configurationSXab, 61)
      vduHelper.configureInterface(spgwuS1U_IfName,  configurationS1U,  62)
      vduHelper.configureInterface(spgwuSGi_IfName,  configurationSGi,  63)
      vduHelper.testNetworking()
      vduHelper.waitForPackageUpdatesToComplete()
      vduHelper.endBlock()

      # ====== Prepare sources ==============================================
      vduHelper.beginBlock('Preparing sources')
      vduHelper.fetchGitRepository(gitDirectory, gitRepository, gitCommit)
      vduHelper.endBlock()


      message = vduHelper.endBlock()
      function_set( { 'outout': message } )
      set_flag('spgwucharm.prepared-spgwu-build')
   except:
      message = vduHelper.endBlockInException()
      function_fail(message)
   finally:
      clear_flag('actions.prepare-spgwu-build')
Ejemplo n.º 30
0
def configure_p4ovs():
    vduHelper.beginBlock('configure_p4ovs')
    try:

        # ====== Prepare system ===============================================
        vduHelper.beginBlock('Preparing system')

        # Cloud-Init configures all 3 interfaces in Ubuntu 20.04+
        # => unwanted configuration on ens3 and ens4
        # Get rid of the Cloud-Init configuration, then configure the
        # interfaces manually with the correct configuration.
        vduHelper.runInShell('sudo rm -f /etc/netplan/50-cloud-init.yaml')
        interfaceConfiguration = vduHelper.makeInterfaceConfiguration('ens3')
        vduHelper.configureInterface('ens3', interfaceConfiguration, 50)
        n = 0
        for interfaceName in ['ens4', 'ens5']:
            interfaceConfiguration = vduHelper.makeInterfaceConfiguration(
                interfaceName, None)
            vduHelper.configureInterface(interfaceName, interfaceConfiguration,
                                         61 + n)
            n = n + 1
        vduHelper.testNetworking()
        vduHelper.waitForPackageUpdatesToComplete()
        vduHelper.aptInstallPackages([
            'openvswitch-p4-switch', 'openvswitch-p4-switch-dpdk', 'p4lang-p4c'
        ])
        # vduHelper.pipInstallPackages([ 'nnpy' ])
        vduHelper.endBlock()

        # ====== Configure P4-OvS =============================================
        vduHelper.beginBlock('Configuring P4-OvS')
        vduHelper.configureSwitch('ovs0', ['ens4', 'ens5'])
        vduHelper.createFileFromString(
            '/etc/rc.local', """\
#!/bin/sh

# IMPORTANT: Ignore VXLAN traffic, to prevent that the switch generates a
#            packet flooding with VXLAN packets when it is attached to the
#            network also transporting traffic of the VLs!
ovs-ofctl -O OpenFlow15 add-flow ovs0 "priority=8000 udp,nw_dst=224.0.0.1,tp_dst=8472 actions=drop"
""", True)
        vduHelper.runInShell('sudo /etc/rc.local')
        vduHelper.endBlock()

        # ====== Set up P4-OvS service ========================================
        vduHelper.beginBlock('Setting up P4-OvS service')
        vduHelper.configureSystemInfo('P4-OvS',
                                      'This is the SimulaMet P4-OvS VNF!')
        vduHelper.endBlock()

        # ====== Set up sysstat service =======================================
        vduHelper.installSysStat()

        # ====== Clean up =====================================================
        vduHelper.cleanUp()

        message = vduHelper.endBlock()
        function_set({'outout': message})
        set_flag('p4ovscharm.configured-p4ovs')
    except:
        message = vduHelper.endBlockInException()
        function_fail(message)
    finally:
        clear_flag('actions.configure-p4ovs')