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")
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')
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')
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'})
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')
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')
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)
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')
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
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)))})
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')
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')
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')
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)
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)
def upgrade(): params = {} params["stop_agent"] = function_get("stop-agent") params["force"] = function_get("force") utils.action_upgrade(params)
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)
# 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)
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')
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()
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')
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')