def remove_from_cloud(): """ Implementation of 'remove-from-cloud' action. This action is preparation for clean removal of nova-compute unit from juju model. If this action succeeds , user can run `juju remove-unit` command. Steps performed by this action: - Checks that this nova-compute unit can be removed from the cloud - If not, action fails - Stops nova-compute system service - Unregisters nova-compute service from the nova cloud controller """ nova = cloud_utils.nova_client() if cloud_utils.running_vms(nova) > 0: raise RuntimeError("This unit can not be removed from the " "cloud because it's still running VMs. Please " "remove these VMs or migrate them to another " "nova-compute unit") nova_service_id = cloud_utils.nova_service_id(nova) log("Stopping nova-compute service", DEBUG) service_pause('nova-compute') log("Deleting nova service '{}'".format(nova_service_id), DEBUG) nova.services.delete(nova_service_id) status_set(WORKLOAD_STATES.BLOCKED, UNIT_REMOVED_MSG) function_set({'message': UNIT_REMOVED_MSG})
def osd_in_out(action): """Pause/Resume the ceph OSDs unit ont the local machine only. :param action: Either IN or OUT (see global constants) :type action: string :raises RuntimeError: if a supported action is not used :raises subprocess.CalledProcessError: if the ceph commands fails :raises OSError: if the unit can't get the local osd ids """ if action not in (IN, OUT): raise RuntimeError("Unknown action \"{}\"".format(action)) osds = parse_osds_arguments() osds, failed_osds = check_osd_id(osds) if failed_osds: function_fail("invalid ceph OSD device id: " "{}".format(",".join(failed_osds))) return outputs = [] for osd_id in osds: output = ceph_osd_upgrade(action, str(osd_id)) outputs.append(output) function_set({ "message": "osd-{action} action was successfully executed for ceph " "OSD devices [{osds}]".format(action=action, osds=",".join(osds)), "outputs": os.linesep.join(outputs) }) assess_status()
def list_computes(): """Implementation of `list-compute-nodes` action.""" nova = cloud_utils.nova_client() function_set({'node-name': cloud_utils.service_hostname()}) computes = [service.to_dict() for service in nova.services.list(binary='nova-compute')] function_set({'compute-nodes': json.dumps(computes)})
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 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 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 get_lbaasv2_lb(args): """Implementation of 'show-loadbalancers' action.""" neutron = get_neutron() agent_list = get_network_agents_on_host(socket.gethostname(), neutron, "Loadbalancerv2 agent") list_func = neutron.list_loadbalancers_on_lbaas_agent lb_list = get_resource_list_on_agents(agent_list, list_func, "loadbalancers") clean_data = clean_resource_list(lb_list, allowed_keys=["id", "status", "name"]) function_set({"load-balancers": format_status_output(clean_data)})
def get_dhcp_networks(args): """Implementation of 'show-dhcp-networks' action.""" neutron = get_neutron() agent_list = get_network_agents_on_host(socket.gethostname(), neutron, "DHCP agent") list_func = neutron.list_networks_on_dhcp_agent dhcp_network_list = get_resource_list_on_agents(agent_list, list_func, "networks") clean_data = clean_resource_list(dhcp_network_list, allowed_keys=["id", "status", "name"]) function_set({"dhcp-networks": format_status_output(clean_data)})
def get_routers(args): """Implementation of 'show-routers' action.""" neutron = get_neutron() agent_list = get_network_agents_on_host(socket.gethostname(), neutron, "L3 agent") router_list = get_resource_list_on_agents(agent_list, neutron.list_routers_on_l3_agent, "routers") clean_data = clean_resource_list( router_list, allowed_keys=["id", "status", "ha", "name"]) function_set({"router-list": format_status_output(clean_data)})
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 restart_spgwu(): vduHelper.beginBlock('restart_spgwu') try: vduHelper.runInShell('sudo service spgwu restart') message = vduHelper.endBlock() function_set( { 'outout': message } ) except: message = vduHelper.endBlockInException() function_fail(message) finally: clear_flag('actions.restart-spgwu')
def restart_p4ovs(): vduHelper.beginBlock('restart_p4ovs') try: # !!! FIXME! !!! # vduHelper.runInShell('sudo service p4ovs restart') message = vduHelper.endBlock() function_set({'outout': message}) except: message = vduHelper.endBlockInException() function_fail(message) finally: clear_flag('actions.restart-p4ovs')
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 list_backups(): """Implementation of easyrsa 'list-backups' action.""" file_list = [] try: file_list = os.listdir(PKI_BACKUP) except FileNotFoundError: pass if file_list: message = "Available backup files:" for file in file_list: message += "\n{}".format(file) else: message = "There are no available backup files." function_set({"message": message})
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 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 register_to_cloud(): """ Implementation of `register-to-cloud` action. This action reverts `remove-from-cloud` action. It starts nova-comptue system service which will trigger its re-registration in the cloud. """ log("Starting nova-compute service", DEBUG) service_resume('nova-compute') current_status = status_get() if current_status[0] == WORKLOAD_STATES.BLOCKED.value and \ current_status[1] == UNIT_REMOVED_MSG: status_set(WORKLOAD_STATES.ACTIVE, 'Unit is ready') nova_compute_hooks.update_status() function_set({ 'command': 'openstack compute service list', 'message': "Nova compute service started. It should get registered " "with the cloud controller in a short time. Use the " "'openstack' command to verify that it's registered." })
def backup(): """ Implementation of easyrsa 'backup' action. Currently deployed pki is packed into tarball and stored in the backups directory. """ _ensure_backup_dir_exists() timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") backup_name = "easyrsa-{}.tar.gz".format(timestamp) backup_path = os.path.join(PKI_BACKUP, backup_name) with tarfile.open(backup_path, mode="w:gz") as pki_tar: pki_tar.add(os.path.join(easyrsa_directory, "pki"), "pki") log("Backup created and saved to '{}'".format(backup_path), hookenv.DEBUG) function_set( { "command": "juju scp {}:{} .".format(local_unit(), backup_path), "message": "Backup archive created successfully. Use the juju scp " "command to copy it to your local machine.", } )
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 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 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 fail(msg): hookenv.function_set({'outcome': 'failure'}) hookenv.action_fail(msg) sys.exit()
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')
def node_name(): """Implementation of 'node-name' action.""" function_set({'node-name': cloud_utils.service_hostname()})
def instance_count(): """Implementation of `instance-count` action.""" nova = cloud_utils.nova_client() vm_count = cloud_utils.running_vms(nova) function_set({'instance-count': vm_count})
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 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_p4ovs(): vduHelper.beginBlock('configure_p4ovs') try: # ====== Prepare system =============================================== vduHelper.beginBlock('Preparing system') # Cloud-Init configures all 3 interfaces in Ubuntu 20.04+ # => unwanted configuration on ens3 and ens4 # Get rid of the Cloud-Init configuration, then configure the # interfaces manually with the correct configuration. vduHelper.runInShell('sudo rm -f /etc/netplan/50-cloud-init.yaml') interfaceConfiguration = vduHelper.makeInterfaceConfiguration('ens3') vduHelper.configureInterface('ens3', interfaceConfiguration, 50) n = 0 for interfaceName in ['ens4', 'ens5']: interfaceConfiguration = vduHelper.makeInterfaceConfiguration( interfaceName, None) vduHelper.configureInterface(interfaceName, interfaceConfiguration, 61 + n) n = n + 1 vduHelper.testNetworking() vduHelper.waitForPackageUpdatesToComplete() vduHelper.aptInstallPackages([ 'openvswitch-p4-switch', 'openvswitch-p4-switch-dpdk', 'p4lang-p4c' ]) # vduHelper.pipInstallPackages([ 'nnpy' ]) vduHelper.endBlock() # ====== Configure P4-OvS ============================================= vduHelper.beginBlock('Configuring P4-OvS') vduHelper.configureSwitch('ovs0', ['ens4', 'ens5']) vduHelper.createFileFromString( '/etc/rc.local', """\ #!/bin/sh # IMPORTANT: Ignore VXLAN traffic, to prevent that the switch generates a # packet flooding with VXLAN packets when it is attached to the # network also transporting traffic of the VLs! ovs-ofctl -O OpenFlow15 add-flow ovs0 "priority=8000 udp,nw_dst=224.0.0.1,tp_dst=8472 actions=drop" """, True) vduHelper.runInShell('sudo /etc/rc.local') vduHelper.endBlock() # ====== Set up P4-OvS service ======================================== vduHelper.beginBlock('Setting up P4-OvS service') vduHelper.configureSystemInfo('P4-OvS', 'This is the SimulaMet P4-OvS VNF!') vduHelper.endBlock() # ====== Set up sysstat service ======================================= vduHelper.installSysStat() # ====== Clean up ===================================================== vduHelper.cleanUp() message = vduHelper.endBlock() function_set({'outout': message}) set_flag('p4ovscharm.configured-p4ovs') except: message = vduHelper.endBlockInException() function_fail(message) finally: clear_flag('actions.configure-p4ovs')