示例#1
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")
示例#2
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')
示例#3
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')
示例#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'})
示例#5
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')
示例#6
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')
示例#7
0
def delete_backup():
    """Implementation of easyrsa 'delete-backup' action"""
    backup_name = function_get('name')
    delete_all = function_get('all')

    if not delete_all:
        if backup_name is None:
            raise RuntimeError("Parameter 'name' is required if parameter "
                               "'all' is False.")
        log("Removing backup '{}'".format(backup_name), hookenv.INFO)
        delete_file = os.path.join(PKI_BACKUP, backup_name)
        _check_path_traversal(delete_file, PKI_BACKUP)
        try:
            os.remove(delete_file)
        except FileNotFoundError:
            err_msg = "Backup file '{}' does not exist".format(backup_name)
            log(err_msg, hookenv.ERROR)
            raise RuntimeError(err_msg)
    else:
        log("Removing all backup files.", hookenv.INFO)
        shutil.rmtree(PKI_BACKUP)
示例#8
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')
示例#9
0
def purge_osd(osd):
    """Run the OSD purge action.

    :param osd: the OSD ID to operate on
    """
    svc = 'admin'
    osd_str = str(osd)
    osd_name = "osd.{}".format(osd_str)
    current_osds = ceph.get_osds(svc)
    if osd not in current_osds:
        function_fail("OSD {} is not in the current list of OSDs".format(osd))
        return

    osd_weight = get_osd_weight(osd_name)
    if osd_weight > 0:
        function_fail("OSD has weight {}, must have zero weight before "
                      "this operation".format(osd_weight))
        return

    luminous_or_later = cmp_pkgrevno('ceph-common', '12.0.0') >= 0
    if not function_get('i-really-mean-it'):
        function_fail('i-really-mean-it is a required parameter')
        return
    if luminous_or_later:
        cmds = [["ceph", "osd", "out", osd_name],
                ['ceph', 'osd', 'purge', osd_str, '--yes-i-really-mean-it']]
    else:
        cmds = [
            ["ceph", "osd", "out", osd_name],
            ["ceph", "osd", "crush", "remove", "osd.{}".format(osd)],
            ["ceph", "auth", "del", osd_name],
            ['ceph', 'osd', 'rm', osd_str],
        ]
    for cmd in cmds:
        try:
            check_call(cmd)
        except CalledProcessError as e:
            log(e)
            function_fail("OSD Purge for OSD {} failed".format(osd))
            return
示例#10
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)))})
示例#11
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')
示例#12
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')
示例#13
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')
示例#14
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')
def ghost_share(*args):
    """Ghost mount secondard TV deployment nfs-share
    """
    secondary_nfs_share = hookenv.function_get("nfs-shares")
    with charms_openstack.charm.provide_charm_instance() as trilio_wlm_charm:
        trilio_wlm_charm.ghost_nfs_share(secondary_nfs_share)
示例#16
0
def ziu_stage_5(ziu_stage, trigger):
    # wait for upgrade action and then signal
    if trigger == 'upgrade':
        stop_agent(function_get("stop-agent"))
        _run_services(get_context())
        signal_ziu("ziu_done", ziu_stage)
示例#17
0
def upgrade():
    params = {}
    params["stop_agent"] = function_get("stop-agent")
    params["force"] = function_get("force")
    utils.action_upgrade(params)
示例#18
0
        function_fail("OSD has weight {}, must have zero weight before "
                      "this operation".format(osd_weight))
        return

    luminous_or_later = cmp_pkgrevno('ceph-common', '12.0.0') >= 0
    if not function_get('i-really-mean-it'):
        function_fail('i-really-mean-it is a required parameter')
        return
    if luminous_or_later:
        cmds = [["ceph", "osd", "out", osd_name],
                ['ceph', 'osd', 'purge', osd_str, '--yes-i-really-mean-it']]
    else:
        cmds = [
            ["ceph", "osd", "out", osd_name],
            ["ceph", "osd", "crush", "remove", "osd.{}".format(osd)],
            ["ceph", "auth", "del", osd_name],
            ['ceph', 'osd', 'rm', osd_str],
        ]
    for cmd in cmds:
        try:
            check_call(cmd)
        except CalledProcessError as e:
            log(e)
            function_fail("OSD Purge for OSD {} failed".format(osd))
            return


if __name__ == '__main__':
    osd = function_get("osd")
    purge_osd(osd)
示例#19
0
# limitations under the License.
"""Changes the crush weight of an OSD."""

import sys

sys.path.append("lib")
sys.path.append("hooks")

from charmhelpers.core.hookenv import function_fail, function_get, log
from charms_ceph.utils import reweight_osd


def crush_reweight(osd_num, new_weight):
    """Run reweight_osd to change OSD weight."""
    try:
        result = reweight_osd(str(osd_num), str(new_weight))
    except Exception as e:
        log(e)
        function_fail("Reweight failed due to exception")
        return

    if not result:
        function_fail("Reweight failed to complete")
        return


if __name__ == "__main__":
    osd_num = function_get("osd")
    new_weight = function_get("weight")
    crush_reweight(osd_num, new_weight)
示例#20
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')
示例#21
0
def restore():
    """
    Implementation of easyrsa 'restore' action

    Backup restoration process can be summarized as following:

        * Selected backup is scanned and verified
        * Contents of the backup are unpacked into <cahrm_dir>/EasyRSA/pki
        * Data that are stored in the local database are updated
        * All units that have relation with this easyrsa unit will be notified
          about the certificate changes.
    """
    pki_dir = os.path.join(easyrsa_directory, "pki")
    backup_name = function_get("name")

    if backup_name is None:
        raise RuntimeError("Parameter 'name' is required.")

    log("Restoring pki from backup file {}".format(backup_name), hookenv.INFO)

    backup_path = os.path.join(PKI_BACKUP, backup_name)

    if not os.path.isfile(backup_path):
        log("Backup file '{}' does not exists.".format(backup_path), hookenv.ERROR)
        raise RuntimeError(
            "Backup with name '{}' does not exist. Use action "
            "'list-backups' to list all available "
            "backups".format(backup_name)
        )

    with tarfile.open(backup_path, "r:gz") as pki_tar:
        _verify_backup(pki_tar)
        _replace_pki(pki_tar, pki_dir)

    cert_dir = os.path.join(pki_dir, "issued")
    key_dir = os.path.join(pki_dir, "private")

    # Update CA and global client data stored in the local leader's database
    # NOTE(mkalcok): Easyrsa does not really support HA mode, so it's usually
    #                run as a single unit/model
    _update_leadership_data(pki_dir, cert_dir, key_dir)

    ca_cert = leader_get("certificate_authority")
    tls = endpoint_from_name("client")
    log("Sending CA certificate to all related units", hookenv.INFO)
    tls.set_ca(ca_cert)
    log("Sending global client certificate and key to all related units", hookenv.INFO)
    tls.set_client_cert(leader_get("client_certificate"), leader_get("client_key"))
    for client in tls.all_requests:
        try:
            cert_file = os.path.join(cert_dir, "{}.crt".format(client.common_name))
            key_file = os.path.join(key_dir, "{}.key".format(client.common_name))
            with open(cert_file, "r") as file:
                cert = file.read()
            with open(key_file, "r") as file:
                key = file.read()
            log(
                "Sending certificate for '{}' to unit"
                "'{}'".format(client.common_name, client.unit_name),
                hookenv.INFO,
            )
            log(cert, hookenv.DEBUG)
            client.set_cert(cert, key)

        except FileNotFoundError:
            log(
                "Certificate for '{}' not found in backup. " "Generating new one.",
                hookenv.INFO,
            )
            if client.cert_type == "client":
                cert, key = create_client_certificate(client.common_name)
            elif client.cert_type == "server":
                cert, key = create_server_certificate(
                    client.common_name, client.sans, client.common_name
                )
            else:
                # This use case should not really happen as easyrsa charm
                # does not support Application type certificates
                raise RuntimeError(
                    "Unrecognized certificate request type "
                    '"{}".'.format(client.cert_type)
                )
            log(
                "Sending certificate for '{}' to unit"
                "'{}'".format(client.common_name, client.unit_name),
                hookenv.INFO,
            )
            log(cert, hookenv.DEBUG)
            client.set_cert(cert, key)

    hookenv._run_atexit()
示例#22
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')
示例#23
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')