Commit e4ae1270 authored by Joanne Hugé's avatar Joanne Hugé

Update Release Candidate

parents 7791a4a3 76045cfa
From c2b800e61e10d401fcbdc57dd150270da5b550e9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9rome=20Perrin?= <perrinjerome@gmail.com>
Date: Thu, 16 Mar 2023 14:44:52 +0900
Subject: [PATCH] SkinsTool: fix Find form with Zope4 ZMI (#127)
SkinsTool: fix Find form with Zope4 ZMI
SkinsTool has a custom "Find" tab that got broken when FindSupport API changed for Zope4, this repairs all this.
Co-authored-by: Maurits van Rees <maurits@vanrees.org>
---
src/Products/CMFCore/SkinsTool.py | 7 +-
src/Products/CMFCore/dtml/findForm.dtml | 394 +++++++++++++++-------
src/Products/CMFCore/dtml/findResult.dtml | 313 -----------------
4 files changed, 280 insertions(+), 437 deletions(-)
delete mode 100644 src/Products/CMFCore/dtml/findResult.dtml
diff --git a/src/Products/CMFCore/SkinsTool.py b/src/Products/CMFCore/SkinsTool.py
index c7df7000..acfd6c8f 100644
--- a/src/Products/CMFCore/SkinsTool.py
+++ b/src/Products/CMFCore/SkinsTool.py
@@ -100,13 +100,8 @@ def _getSelections(self):
'manage_propertiesForm')
manage_propertiesForm = DTMLFile('dtml/skinProps', globals())
- # the following two methods override those in FindSupport, to
+ # the following method override the one in FindSupport, to
# support marking of objects used in specific skins
- security.declareProtected(ManagePortal, # NOQA: flake8: D001
- 'manage_findResult')
- manage_findResult = DTMLFile('findResult', _dtmldir,
- management_view='Find')
-
security.declareProtected(ManagePortal, # NOQA: flake8: D001
'manage_findForm')
manage_findForm = DTMLFile('findForm', _dtmldir,
diff --git a/src/Products/CMFCore/dtml/findForm.dtml b/src/Products/CMFCore/dtml/findForm.dtml
index 0fcb7102..7d935e16 100644
--- a/src/Products/CMFCore/dtml/findForm.dtml
+++ b/src/Products/CMFCore/dtml/findForm.dtml
@@ -1,131 +1,289 @@
<dtml-var manage_page_header>
+
<dtml-var manage_tabs>
<main class="container-fluid">
-<p class="form-help">
-Find allows you to locate Zope objects based on different
-criteria. For more find choices choose the <EM>Advanced</EM>
-find option.
-</p>
-
-<FORM ACTION="manage_findResult" METHOD="GET">
-<INPUT TYPE = "hidden" NAME="searchtype" VALUE="simple">
-<TABLE class="action">
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-label">
- Find objects of type:
- </div>
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-element">
- <SELECT NAME="obj_metatypes:list" SIZE="8" MULTIPLE>
- <OPTION VALUE="all" SELECTED> All types
-<dtml-let sorted_meta_types="[]">
- <dtml-in all_meta_types mapping>
- <dtml-call "sorted_meta_types.append(name)">
- </dtml-in>
- <dtml-call "sorted_meta_types.sort()">
- <dtml-in sorted_meta_types>
- <OPTION VALUE="&dtml-sequence-item;">&dtml-sequence-item;
- </dtml-in>
-</dtml-let>
- </SELECT>
- </div>
- </TD>
-</TR>
+<!-- BO findResults.dtml -->
+<dtml-in "('obj_ids', 'obj_searchterm', 'obj_expr', 'obj_mtime', 'obj_mspec', 'obj_permission', 'obj_roles', 'search_sub','searchtype')"
+ ><dtml-else "_.hasattr(REQUEST, _['sequence-item'])"
+ ><dtml-call "REQUEST.set(_['sequence-item'], None)"
+ ></dtml-else
+></dtml-in>
+<dtml-call "REQUEST.set('obj_metatypes',
+ [x for x in (REQUEST.get('obj_metatypes', []) or [])])">
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-label">
- with ids:
- </div>
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <INPUT TYPE="TEXT" NAME="obj_ids:tokens" SIZE="30">
- </TD>
-</TR>
-
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-label">
- containing:
- </div>
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <INPUT TYPE="TEXT" NAME="obj_searchterm" SIZE="30">
- </TD>
-</TR>
-
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-label">
- modified:
- </div>
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-element">
- <SELECT NAME="obj_mspec">
- <OPTION VALUE="&lt;"> before
- <OPTION VALUE="&gt;"> after
- </SELECT>
- </div>
- <INPUT TYPE="TEXT" NAME="obj_mtime" SIZE="22">
- </TD>
-</TR>
+<dtml-if btn_submit>
+<dtml-with "_.namespace(
+ results=ZopeFind(this(),
+ obj_ids=obj_ids,
+ obj_metatypes=obj_metatypes,
+ obj_searchterm=obj_searchterm,
+ obj_expr=obj_expr,
+ obj_mtime=obj_mtime,
+ obj_mspec=obj_mspec,
+ obj_permission=obj_permission,
+ obj_roles=obj_roles,
+ search_sub=search_sub,
+ REQUEST=REQUEST)
+ )">
+<form action="manage_compareResults">
+<dtml-unless batch_size><dtml-call "REQUEST.set('batch_size',20)"></dtml-unless>
+<dtml-if results>
+ <div class="alert alert-success">
+ Displaying items
+ <dtml-in name="results" size=batch_size start=query_start
+ ><dtml-if sequence-start>&dtml-sequence-number;</dtml-if
+ ><dtml-if sequence-end>-&dtml-sequence-number; of
+ <dtml-var "_.len(results)"
+ ></dtml-if
+ ></dtml-in>
+ items matching your query. You can <a href="#zmi-search-form">revise</a>
+ your search terms below.
+ </div>
+<dtml-else>
+ <div class="alert alert-danger">
+ No items were found matching your query. You can
+ <a href="#zmi-search-form">revise</a> your search terms below.
+ </div>
+</dtml-if>
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-label">
- mark the object used in skin:
- </div>
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-element">
- <SELECT NAME="obj_skinspec">
- <dtml-in getSkinSelections>
- <OPTION value="&dtml-sequence-item;"
- <dtml-if "_['sequence-item'] == getDefaultSkin()">selected</dtml-if>>
- <dtml-var sequence-item>
- </OPTION>
- </dtml-in>
- </SELECT>
- </div>
- </TD>
-</TR>
-
-
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-text">
- <INPUT TYPE="RADIO" NAME="search_sub:int" VALUE="0">
- Search only in this folder
- <BR>
- <INPUT TYPE="RADIO" NAME="search_sub:int" VALUE="1" CHECKED>
- Search all subfolders
+<dtml-unless searchtype><dtml-call "REQUEST.set('searchtype', 'simple')"></dtml-unless>
+<dtml-unless skey><dtml-call "REQUEST.set('skey', 'id')"></dtml-unless>
+<dtml-unless rkey><dtml-call "REQUEST.set('rkey', '')"></dtml-unless>
+<dtml-if "rkey == 'reverse'"><dtml-call "REQUEST.set('rkey', skey)"></dtml-if>
+
+
+<dtml-if "_.len(results) > int(batch_size)">
+ <nav class="zmi-find-results nav row mb-2">
+ <div class="col-6">
+ <dtml-in name="results" previous size=batch_size start=query_start>
+ <a class="btn btn-primary float-left"
+ href="<dtml-var "REQUEST.URL" html_quote>&dtml-sequence-query;query_start=&dtml-previous-sequence-start-number;">
+ <i class="fa fa-caret-left"></i>&nbsp;&nbsp;Previous
+ </a>
+ </dtml-in>
+ </div>
+ <div class="col-6 text-right">
+ <dtml-in name="results" next size=batch_size start=query_start>
+ <a class="btn btn-primary"
+ href="<dtml-var "REQUEST.URL" html_quote>&dtml-sequence-query;query_start=&dtml-next-sequence-start-number;">
+ Next&nbsp;&nbsp;<i class="fa fa-caret-right"></i>
+ </a>
+ </dtml-in>
+ </div>
+ </nav>
+</dtml-if>
+
+
+<ul class="zmi-find-results list-group mb-5">
+<dtml-in results size="batch_size" start="query_start" sort_expr="skey"
+ reverse_expr="rkey">
+ <li class="list-group-item">
+ <div class="form-check">
+ <input class="form-check-input col-0" type="checkbox" value="&dtml.url_quote-sequence-key;" name="item_paths:list"/>
+ <a href="&dtml.url_quote-sequence-key;/manage_workspace"
+ class="col-2
+ <dtml-if "isFirstInSkin(_['sequence-key'], obj_skinspec)">font-weight-bold"</dtml-if>
+ ">
+ <i title="&dtml-meta_type;"
+ class="&dtml-zmi_icon;">&nbsp;</i>
+ &dtml-sequence-key; <dtml-if title>(&dtml-title;)</dtml-if>
+ </a>
</div>
- </TD>
-</TR>
-
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-element">
- <INPUT class="form-element" TYPE="SUBMIT" NAME="btn_submit" VALUE="Find">
- <span class="form-text">
- <a href="manage_findAdv">Advanced...<a>
- </span>
+ </li>
+</dtml-in>
+</ul>
+
+</dtml-with> <!-- /namespace -->
+ <div class="zmi-controls">
+ <input class="btn btn-primary" type="submit" name="btn_submit" value="Compare" />
</div>
- </TD>
-</TR>
-</TABLE>
-</FORM>
+</form>
+</dtml-if> <!-- /button submit -->
+<!-- EO findResults.dtml -->
+
+<form id="zmi-search-form" action="manage_findForm" method="get" class="zmi-find">
+<table class="table table-borderless">
+<tr class="simple-search">
+ <td style="width:10rem">
+ <label for="type" class="form-label">Find objects of type:</label>
+ </td>
+ <td style="width:*">
+ <div class="form-element">
+ <select id="type" class="form-control" name="obj_metatypes:list" size="8" multiple="multiple">
+ <option value="all"
+ <dtml-if "not obj_metatypes">
+ selected="selected"
+ <dtml-else>
+ <dtml-var "('all' in obj_metatypes) and 'selected=\042selected\042' or ''">
+ </dtml-if>
+ >All types</option>
+ <dtml-let sorted_meta_types="[]"
+ ><dtml-in all_meta_types mapping
+ ><dtml-call "sorted_meta_types.append(name)"
+ ></dtml-in><dtml-call "sorted_meta_types.sort()"
+ ><dtml-in sorted_meta_types
+ ><option value="&dtml-sequence-item;"
+ <dtml-if "not obj_metatypes">
+ <dtml-else>
+ <dtml-var "(_['sequence-item'] in obj_metatypes) and 'selected=\042selected\042' or ''">
+ </dtml-if>
+ >&dtml-sequence-item;</option>
+ </dtml-in
+ ></dtml-let>
+ </select>
+ </div>
+ </td>
+</tr>
+
+<tr class="simple-search">
+ <td>
+ <label for="ids" class="form-label">With ids:</label>
+ </td>
+ <td>
+ <input id="ids" class="form-control" type="text" name="obj_ids:tokens" value="<dtml-var "' '.join(obj_ids or [])" html_quote>" />
+ </td>
+</tr>
+
+<tr class="simple-search">
+ <td>
+ <label for="contain" class="form-label">Containing:</label>
+ </td>
+ <td>
+ <input id="contain" class="form-control" type="text" name="obj_searchterm"
+ value="<dtml-var "obj_searchterm and obj_searchterm or ''" html_quote>" />
+ </td>
+</tr>
+
+<tr class="advanced-search-only" <dtml-if "searchtype!='advanced'">style="display:none;"</dtml-if>>
+ <td>
+ <label for="expr" class="form-label">Expr:</label>
+ </td>
+ <td>
+ <textarea id="expr" class="form-control" name="obj_expr" rows="4" cols="30"
+ ><dtml-var "obj_expr and obj_expr or ''"></textarea>
+ </td>
+</tr>
+
+<tr class="advanced-search-only" <dtml-if "searchtype!='advanced'">style="display:none;"</dtml-if>>
+ <td>
+ <label for="roles" class="form-label">Where the roles:</label>
+ </td>
+ <td>
+ <div class="form-element">
+ <select id="roles" class="form-control" name="obj_roles:list" size="3" multiple="multiple">
+ <dtml-in valid_roles>
+ <dtml-if obj_roles>
+ <option value="&dtml-sequence-item;"<dtml-if "_['sequence-item'] in obj_roles"> selected="selected"</dtml-if>>&dtml-sequence-item;</option>
+ <dtml-else>
+ <option value="&dtml-sequence-item;">&dtml-sequence-item;</option>
+ </dtml-if>
+ </dtml-in>
+ </select>
+ </div>
+ </td>
+</tr>
+
+<tr class="advanced-search-only" <dtml-if "searchtype!='advanced'">style="display:none;"</dtml-if>>
+ <td>
+ <label for="perm" class="form-label">Have permission:</label>
+ </td>
+ <td>
+ <div class="form-element">
+ <select id="perm" class="form-control" name="obj_permission">
+ <dtml-in permission_settings mapping>
+ <option value="&dtml-name;"> &dtml-name;</option>
+ </dtml-in>
+ </select>
+ </div>
+ </td>
+</tr>
+
+<tr class="advanced-search-only" <dtml-if "searchtype!='advanced'">style="display:none;"</dtml-if>>
+ <td>
+ <label for="skey" class="form-label">Sort results by:</label>
+ </td>
+ <td>
+ <div class="form-group">
+ <select name="skey" id="skey" class="form-control">
+ <option value="meta_type">Type</option>
+ <option value="id">Id</option>
+ </select>
+ <div class="form-check px-4 mt-2">
+ <input id="rkey" class="form-check-input" type="checkbox" name="rkey" value="reverse" />
+ <label for="rkey" class="form-check-label">Reverse?</label>
+ </div>
+ </div>
+ </td>
+</tr>
+
+<tr class="simple-search">
+ <td>
+ <label for="mod" class="form-label">Modified:</label>
+ </td>
+ <td>
+ <div class="form-inline">
+ <div class="input-group px-0 col-12">
+ <select id="mod" name="obj_mspec" class="input-group-prepend form-control col-4 col-md-3">
+ <option value="&lt;"> before</option>
+ <option value="&gt;"> after</option>
+ </select>
+ <input class="form-control col-8 col-md-9 px-0" type="text" name="obj_mtime" />
+ </div>
+ </div>
+ </td>
+</tr>
+
+<tr class="simple-search">
+ <td>
+ <label for="skinspec" class="form-label">Mark the object used in skin:</label>
+ </td>
+ <td>
+ <div class="form-inline">
+ <select id="skinspec" name="obj_skinspec" class="form-control">
+ <dtml-in getSkinSelections>
+ <option value="&dtml-sequence-item;"
+ <dtml-if "_['sequence-item'] == getDefaultSkin()">selected</dtml-if>>
+ <dtml-var sequence-item>
+ </option>
+ </dtml-in>
+ </select>
+ </div>
+ </div>
+ </td>
+</tr>
+
+<tr class="simple-search">
+ <td>&nbsp;</td>
+ <td>
+ <div class="form-check">
+ <input id="thisfolder" class="form-check-input" type="radio" name="search_sub:int" value="0" />
+ <label for="thisfolder" class="form-check-label">Search only in this folder</label>
+ </div>
+ <div class="form-check">
+ <input id="subfolder" class="form-check-input" type="radio" name="search_sub:int" value="1" checked="checked" />
+ <label for="subfolder" class="form-check-label">Search all subfolders</label>
+ </div>
+ </td>
+</tr>
-</main>
+<tr class="simple-search">
+ <td>&nbsp;</td>
+ <td>
+ <div class="zmi-controls">
+ <input class="btn btn-primary" type="submit" name="btn_submit" value="Find" />
+ <div class="btn ml-3" >
+ <input id="searchtype"
+ onclick="$('.advanced-search-only').toggle()"
+ class="form-check-input" type="checkbox" name="searchtype" value="advanced" <dtml-if "searchtype=='advanced'"> checked="checked"</dtml-if> />
+ <label for="searchtype" class="form-check-label">Advanced Search</label>
+ </div>
+ </div>
+ </td>
+</tr>
+</table>
+</form>
<dtml-var manage_page_footer>
diff --git a/src/Products/CMFCore/dtml/findResult.dtml b/src/Products/CMFCore/dtml/findResult.dtml
deleted file mode 100644
index 6e0ca36a..00000000
--- a/src/Products/CMFCore/dtml/findResult.dtml
+++ /dev/null
@@ -1,313 +0,0 @@
-<dtml-var manage_page_header>
-<dtml-var manage_tabs>
-
-<main class="container-fluid">
-
-<dtml-in expr="('obj_ids', 'obj_metatypes', 'obj_searchterm', 'obj_expr', 'obj_mtime', 'obj_mspec', 'obj_permission', 'obj_roles', 'search_sub')">
-<dtml-else expr="_.hasattr(REQUEST, _['sequence-item'])">
-<dtml-call expr="REQUEST.set(_['sequence-item'], _.None)">
-</dtml-else>
-</dtml-in>
-
-<dtml-if btn_submit>
-<dtml-with "_.namespace(
- results=PrincipiaFind(this(),
- obj_ids=obj_ids,
- obj_metatypes=obj_metatypes,
- obj_searchterm=obj_searchterm,
- obj_expr=obj_expr,
- obj_mtime=obj_mtime,
- obj_mspec=obj_mspec,
- obj_permission=obj_permission,
- obj_roles=obj_roles,
- search_sub=search_sub,
- REQUEST=REQUEST))">
-
-<dtml-unless batch_size>
-<dtml-call "REQUEST.set('batch_size',20)">
-</dtml-unless>
-
-<dtml-if results>
-<p class="std-text">
-Displaying items
-<dtml-in name="results" size=batch_size start=query_start>
-<dtml-if sequence-start>&dtml-sequence-number;</dtml-if><dtml-if
- sequence-end>-&dtml-sequence-number; of <dtml-var
- "_.len(results)"></dtml-if></dtml-in> items matching your query. You can
-<a href="#form">revise</a> your search terms below.
-</p>
-<dtml-else>
-<p class="std-text">
-No items were found matching your query. You can <a href="#form">revise</a>
-your search terms below.
-</p>
-</dtml-if>
-
-<dtml-unless searchtype>
-<dtml-call expr="REQUEST.set('searchtype', 'simple')">
-</dtml-unless>
-<dtml-unless skey>
-<dtml-call expr="REQUEST.set('skey', 'id')">
-</dtml-unless>
-<dtml-unless rkey>
-<dtml-call expr="REQUEST.set('rkey', '')">
-</dtml-unless>
-<dtml-if "rkey == 'reverse'">
-<dtml-call "REQUEST.set('rkey', skey)">
-</dtml-if>
-
-<TABLE width="100%" CELLSPACING="0" CELLPADDING="2" border="0">
-<dtml-if expr="_.len(results) > batch_size">
-<tr class="list-header">
-<td width="50%">
- <div class="list-item">
- <dtml-in name="results" previous size="batch_size" start="query_start">
- <strong> <a href="&dtml-URL;&dtml-sequence-query;query_start=&dtml-previous-sequence-start-number;">&lt; Previous</a></strong>
- <dtml-else>&nbsp;</dtml-in></div>
-</td>
-<td align="right" width="50%">
- <div class="list-item">
- <dtml-in name="results" next size=batch_size start=query_start>
- <strong><a href="&dtml-URL;&dtml-sequence-query;query_start=&dtml-next-sequence-start-number;">Next &gt;</a></strong>
- <dtml-else>&nbsp;</dtml-in></div>
-</td>
-</tr>
-</dtml-if>
-</table>
-
-<FORM ACTION="manage_compareResults" METHOD="GET">
-<TABLE width="100%" CELLSPACING="0" CELLPADDING="2" border="0">
-<dtml-in results size="batch_size" start="query_start" sort_expr="skey" reverse_expr="rkey">
-<dtml-if sequence-odd>
-<TR class="row-normal">
-<dtml-else>
-<TR class="row-hilite">
-</dtml-if>
- <TD ALIGN="LEFT" VALIGN="TOP" WIDTH="40">
- <input type="checkbox" value="&dtml.url_quote-sequence-key;" name="item_paths:list"/>
- <A HREF="&dtml.url_quote-sequence-key;/manage_workspace">
- <IMG SRC="&dtml-BASEPATH1;/&dtml-icon;"
- ALT="[&dtml-meta_type;]" BORDER="0"></A>
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="list-item">
- <A HREF="&dtml.url_quote-sequence-key;/manage_workspace">
- <dtml-if "isFirstInSkin(_['sequence-key'], obj_skinspec)">
- <span style="color: red">*</span>
- </dtml-if>
- &dtml-sequence-key;
- <dtml-if title>
- (&dtml-title;)
- </dtml-if>
- </A>
- </div>
-</TD>
-</TR>
-</dtml-in>
-</TABLE>
-<INPUT TYPE="SUBMIT" NAME="btn_submit" VALUE="Compare">
-</FORM>
-</dtml-with>
-
-</dtml-if>
-
-<a name="form">
-<FORM ACTION="manage_findResult" METHOD="GET">
-<TABLE class="action">
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-label">
- Find objects of type:</a>
- </div>
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-element">
- <SELECT NAME="obj_metatypes:list" SIZE="4" MULTIPLE>
- <OPTION VALUE="all" <dtml-in obj_metatypes><dtml-if "_['sequence-item'] == 'all'">SELECTED</dtml-if></dtml-in>> All types
-<dtml-in all_meta_types mapping>
- <OPTION VALUE="&dtml-name;" <dtml-in obj_metatypes><dtml-if "_['sequence-item'] == _['name']">SELECTED</dtml-if></dtml-in>>&dtml-name;
-</dtml-in>
- </SELECT>
- </div>
- </TD>
-</TR>
-
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-label">
- with ids:
- </div>
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <INPUT TYPE="TEXT" NAME="obj_ids:tokens" SIZE="30" VALUE="<dtml-unless "REQUEST.obj_ids == []">
-<dtml-in expr="REQUEST.obj_ids">
-&dtml-sequence-item;&nbsp;
-
-</dtml-in>
-</dtml-unless>">
- </TD>
-</TR>
-
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-label">
- containing:
- </div>
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <INPUT TYPE="TEXT" NAME="obj_searchterm" SIZE="30" VALUE="<dtml-var "REQUEST.obj_searchterm" html_quote>">
- </TD>
-</TR>
-
-<dtml-if "searchtype == 'advanced'">
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-label">
- expr:
- </div>
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <TEXTAREA NAME="obj_expr" ROWS="4" COLS="30">&dtml-obj_expr;</TEXTAREA>
- </TD>
-</TR>
-</dtml-if>
-
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-label">
- modified:
- </div>
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-element">
- <SELECT NAME="obj_mspec">
-
- <OPTION VALUE="&lt;" <dtml-if "REQUEST.obj_mspec == '<'">SELECTED</dtml-if>> before
- <OPTION VALUE="&gt;" <dtml-if "REQUEST.obj_mspec == '>'">SELECTED</dtml-if>> after
- </SELECT>
- </div>
- <INPUT TYPE="TEXT" NAME="obj_mtime" SIZE="22" VALUE="&dtml-obj_mtime;">
- </TD>
-</TR>
-
-
-
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-label">
- mark the object used in skin:
- </div>
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-element">
- <SELECT NAME="obj_skinspec">
- <dtml-in getSkinSelections>
- <OPTION value="&dtml-sequence-item;"
- <dtml-if "_['sequence-item'] == obj_skinspec">selected</dtml-if>>
- <dtml-var sequence-item>
- </OPTION>
- </dtml-in>
- </SELECT>
- </div>
- </TD>
-</TR>
-
-<dtml-if "searchtype == 'advanced'">
-<INPUT TYPE = "hidden" NAME="searchtype" VALUE="advanced">
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-label">
- where the roles:
- </div>
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-element">
- <SELECT NAME="obj_roles:list" SIZE="3" MULTIPLE>
-<dtml-in valid_roles>
-<dtml-if obj_roles>
- <OPTION VALUE="&dtml-sequence-item;"<dtml-if "_['sequence-item'] in obj_roles">SELECTED</dtml-if>>&dtml-sequence-item;
-<dtml-else>
- <OPTION VALUE="&dtml-sequence-item;">&dtml-sequence-item;
-</dtml-if>
-
-</dtml-in>
- </SELECT>
- </div>
- </TD>
-</TR>
-
-
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-label">
- have permission:
- </div>
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-element">
- <SELECT NAME="obj_permission">
-<dtml-in permission_settings mapping>
- <OPTION VALUE="&dtml-name;"<dtml-in obj_metatypes><dtml-if "_['sequence-item'] == _['name']">SELECTED</dtml-if></dtml-in>> &dtml-name;
-</dtml-in>
- </SELECT>
- </div>
- </TD>
-</TR>
-
-
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-label">
- Sort results by:
- </div>
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-element">
- <SELECT NAME="skey">
- <OPTION VALUE="id">Id
- <OPTION VALUE="meta_type">Type
- </SELECT>
- <span class="form-label">
- <INPUT TYPE="checkbox" NAME="rkey" VALUE="reverse"> Reverse?
- </span>
- </div>
- </TD>
-</TR>
-</dtml-if>
-
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-text">
- <INPUT TYPE="RADIO" NAME="search_sub:int" VALUE="0" <dtml-if "REQUEST.search_sub == 0">CHECKED</dtml-if>>
- Search only in this folder
- <BR>
- <INPUT TYPE="RADIO" NAME="search_sub:int" VALUE="1" <dtml-if "REQUEST.search_sub == 1">CHECKED</dtml-if>>
- Search all subfolders
- </div>
- </TD>
-</TR>
-
-<TR>
- <TD ALIGN="LEFT" VALIGN="TOP">
- </TD>
- <TD ALIGN="LEFT" VALIGN="TOP">
- <div class="form-element">
- <INPUT TYPE="SUBMIT" NAME="btn_submit" VALUE="Find">
- <span class="form-text">
- <dtml-if "searchtype == 'advanced'">
- <a href="manage_findForm">Simple...<a>
- <dtml-else>
- <a href="manage_findAdv">Advanced...<a>
- </dtml-if>
- </span>
- </div>
- </TD>
-</TR>
-</TABLE>
-</FORM>
-
-</main>
-
-<dtml-var manage_page_footer>
...@@ -11,8 +11,6 @@ md5sum = 2e8c3c23795415475654346484f5c4b8 ...@@ -11,8 +11,6 @@ md5sum = 2e8c3c23795415475654346484f5c4b8
# liburing 2.3 needs at least kernel 4.14 because it uses SO_ZEROCOPY # liburing 2.3 needs at least kernel 4.14 because it uses SO_ZEROCOPY
# see https://github.com/axboe/liburing/blob/liburing-2.3/CHANGELOG#L13 # see https://github.com/axboe/liburing/blob/liburing-2.3/CHANGELOG#L13
# see https://kernelnewbies.org/Linux_4.14#Zero-copy_from_user_memory_to_sockets # see https://kernelnewbies.org/Linux_4.14#Zero-copy_from_user_memory_to_sockets
[liburing:[int(q) for q in platform.release().split("-")[0].split(".")]<[4,14,0]] [liburing:[int(q) for q in platform.release().split(".")[:2]]<[4,14]]
recipe = slapos.recipe.cmmi
shared = true
url = https://github.com/axboe/liburing/archive/refs/tags/liburing-2.2.tar.gz url = https://github.com/axboe/liburing/archive/refs/tags/liburing-2.2.tar.gz
md5sum = 9075595460c86646a7239e3110ec0dd5 md5sum = 9075595460c86646a7239e3110ec0dd5
...@@ -31,7 +31,7 @@ configure-command = ...@@ -31,7 +31,7 @@ configure-command =
-Dusethreads -Dusethreads
environment = environment =
PATH=${patch:location}/bin:${xz-utils:location}/bin:%(PATH)s PATH=${patch:location}/bin:${xz-utils:location}/bin:%(PATH)s
post-make-hook = ${:_profile_base_location_}/perl-create-libs-symlink.py#943453b7d3ff8d49ed12d44a7f7076ee:post_make_hook post-make-hook = ${:_profile_base_location_}/perl-create-libs-symlink.py#8a2cae20c74f93c2bab2c82564aeeaca:post_make_hook
[perl-CPAN-package] [perl-CPAN-package]
......
...@@ -6,7 +6,8 @@ def post_make_hook(options, buildout): ...@@ -6,7 +6,8 @@ def post_make_hook(options, buildout):
location = options['location'] location = options['location']
matches = [os.path.join(root, filename) matches = [os.path.join(root, filename)
for root, dirnames, filenames in os.walk(location) for root, dirnames, filenames in os.walk(location)
for filename in fnmatch.filter(filenames, 'libperl.a')] for filename in fnmatch.filter(filenames, 'libperl.a')
if '.build' not in root]
if not matches: if not matches:
raise UserError("ERROR - no libperl.* found!") raise UserError("ERROR - no libperl.* found!")
if len(matches) > 1: if len(matches) > 1:
......
...@@ -7,3 +7,5 @@ recipe = slapos.recipe.cmmi ...@@ -7,3 +7,5 @@ recipe = slapos.recipe.cmmi
shared = true shared = true
url = https://zlib.net/fossils/zlib-1.2.12.tar.gz url = https://zlib.net/fossils/zlib-1.2.12.tar.gz
md5sum = 5fc414a9726be31427b440b434d05f78 md5sum = 5fc414a9726be31427b440b434d05f78
environment =
CFLAGS=-fPIC
...@@ -66,8 +66,8 @@ ...@@ -66,8 +66,8 @@
"type": "string" "type": "string"
}, },
"shared": { "shared": {
"description": "Define if the request will request a Slave or Software Instance.", "description": "Define if the request will request a Shared Instance or Software Instance.",
"default": "false", "default": false,
"type": "boolean" "type": "boolean"
}, },
"index": { "index": {
......
...@@ -97,8 +97,8 @@ eggs += ...@@ -97,8 +97,8 @@ eggs +=
[beremiz] [beremiz]
recipe = slapos.recipe.build:download-unpacked recipe = slapos.recipe.build:download-unpacked
# download beremiz from github # download beremiz from github
url = https://github.com/beremiz/beremiz/archive/a8efd2fee83733939a1fa48ea924bf7a7a5ef819.tar.gz url = https://github.com/beremiz/beremiz/archive/d0925aa2e32b0143fde5f51eb3ddd3bbb28975ba.tar.gz
md5sum = 2a141b97047896bb9206c221aa56fd55 md5sum = cec3b98faf0b2133eb7d75688802aab7
[beremiz-setup] [beremiz-setup]
recipe = zc.recipe.egg:develop recipe = zc.recipe.egg:develop
......
...@@ -41,7 +41,7 @@ post-install = ...@@ -41,7 +41,7 @@ post-install =
[beremiz-source] [beremiz-source]
recipe = slapos.recipe.build:gitclone recipe = slapos.recipe.build:gitclone
repository = https://github.com/beremiz/beremiz.git repository = https://github.com/beremiz/beremiz.git
revision = caee3ad3b7bb2865c77328de5ffdaeec61dbf49f revision = d0925aa2e32b0143fde5f51eb3ddd3bbb28975ba
git-executable = ${git:location}/bin/git git-executable = ${git:location}/bin/git
[beremiz] [beremiz]
......
...@@ -70,14 +70,14 @@ ...@@ -70,14 +70,14 @@
"default": "http://git.erp5.org/gitweb/slapos.git/blob_plain/HEAD:/software/apache-frontend/software.cfg" "default": "http://git.erp5.org/gitweb/slapos.git/blob_plain/HEAD:/software/apache-frontend/software.cfg"
}, },
"slave-frontend-dict": { "slave-frontend-dict": {
"title": "Slave Front end definition", "title": "Shared Front end definition",
"description": "Slave Front end definition", "description": "Shared Front end definition",
"patternProperties": { "patternProperties": {
".*": { ".*": {
"properties": { "properties": {
"domain": { "domain": {
"title": "Name of the domain to be used", "title": "Name of the domain to be used",
"description": "Name of the domain to be used (example: mydomain.com). Subdomains of this domain will be used for the slave instances (example: instance12345.mydomain.com).", "description": "Name of the domain to be used (example: mydomain.com). Subdomains of this domain will be used for the shared instances (example: instance12345.mydomain.com).",
"type": "string", "type": "string",
"default": "" "default": ""
}, },
...@@ -89,13 +89,13 @@ ...@@ -89,13 +89,13 @@
"default": "" "default": ""
}, },
"enable-cache": { "enable-cache": {
"title": "Use cache for this slave frontend.", "title": "Use cache for this shared frontend.",
"description": "Specify if slave frontend should use a squid to connect to backend.", "description": "Specify if shared frontend should use a cache to connect to backend.",
"type": "boolean", "type": "boolean",
"default": false "default": false
}, },
"type": { "type": {
"title": "Specify if slave frontend will redirect to a zope backend.", "title": "Specify if shared frontend will redirect to a zope backend.",
"description": "If specified, Apache RewriteRule will use Zope's Virtual Host Daemon. Possible values: 'zope', 'default'.", "description": "If specified, Apache RewriteRule will use Zope's Virtual Host Daemon. Possible values: 'zope', 'default'.",
"type": "string", "type": "string",
"default": "default" "default": "default"
......
[instance-profile] [instance-profile]
filename = instance.cfg.in filename = instance.cfg.in
md5sum = 0e74c862401f266111552b7a3611f7bf md5sum = c79f0bcf9dac25060340aa829c4f291c
...@@ -190,12 +190,13 @@ wrapper-path = $${directory:bin}/$${:_buildout_section_name_} ...@@ -190,12 +190,13 @@ wrapper-path = $${directory:bin}/$${:_buildout_section_name_}
command-line = command-line =
sh -e -c "\ sh -e -c "\
echo 'This will replace current database with latest backup. Hit Ctrl+C to cancel'; echo 'This will replace current database with latest backup. Hit Ctrl+C to cancel';
sleep 30; sleep 5;
$${postgresql:bin}/pg_restore \ $${postgresql:bin}/pg_restore \
--exit-on-error \ --exit-on-error \
--clean \
--create \
-h $${postgresql:pgdata-directory} \ -h $${postgresql:pgdata-directory} \
-U $${postgresql:superuser} \ -U $${postgresql:superuser} \
-d $${postgresql:dbname} \
$${postgresql-backup:backup-file}" $${postgresql-backup:backup-file}"
[cron] [cron]
......
...@@ -12,21 +12,13 @@ How to deploy from scratch ...@@ -12,21 +12,13 @@ How to deploy from scratch
Since there are many ors-amarisoft softwares releases and software types, the following files are Since there are many ors-amarisoft softwares releases and software types, the following files are
generated with jinja2 templates with the render-templates script before being pushed to gitlab: generated with jinja2 templates with the render-templates script before being pushed to gitlab:
* instance-tdd1900-enb-epc-input-schema.json
* instance-tdd1900-enb-input-schema.json * instance-tdd1900-enb-input-schema.json
* instance-tdd1900-gnb-epc-input-schema.json
* instance-tdd1900-gnb-input-schema.json * instance-tdd1900-gnb-input-schema.json
* instance-tdd2600-enb-epc-input-schema.json
* instance-tdd2600-enb-input-schema.json * instance-tdd2600-enb-input-schema.json
* instance-tdd2600-gnb-epc-input-schema.json
* instance-tdd2600-gnb-input-schema.json * instance-tdd2600-gnb-input-schema.json
* instance-tdd3500-enb-epc-input-schema.json
* instance-tdd3500-enb-input-schema.json * instance-tdd3500-enb-input-schema.json
* instance-tdd3500-gnb-epc-input-schema.json
* instance-tdd3500-gnb-input-schema.json * instance-tdd3500-gnb-input-schema.json
* instance-tdd3700-enb-epc-input-schema.json
* instance-tdd3700-enb-input-schema.json * instance-tdd3700-enb-input-schema.json
* instance-tdd3700-gnb-epc-input-schema.json
* instance-tdd3700-gnb-input-schema.json * instance-tdd3700-gnb-input-schema.json
* software-tdd1900.cfg * software-tdd1900.cfg
* software-tdd1900.cfg.json * software-tdd1900.cfg.json
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
[template] [template]
filename = instance.cfg filename = instance.cfg
md5sum = 3f982f31a642ba9d6a1613f49e1c0d10 md5sum = f1f1167970ae465cdcece47b722caf20
[amarisoft-stats.jinja2.py] [amarisoft-stats.jinja2.py]
_update_hash_filename_ = amarisoft-stats.jinja2.py _update_hash_filename_ = amarisoft-stats.jinja2.py
...@@ -34,38 +34,30 @@ md5sum = 6339dd6c5dcbef95b58ed52a9fadc9a4 ...@@ -34,38 +34,30 @@ md5sum = 6339dd6c5dcbef95b58ed52a9fadc9a4
_update_hash_filename_ = lopcomm-rrh-config.jinja2.py _update_hash_filename_ = lopcomm-rrh-config.jinja2.py
md5sum = e0b68a87238282568e0e04c792ec7288 md5sum = e0b68a87238282568e0e04c792ec7288
[template-lte-enb-epc] [template-enb]
_update_hash_filename_ = instance-enb-epc.jinja2.cfg
md5sum = 22c2d4f52463de898fcd7516269aed62
[template-lte-enb]
_update_hash_filename_ = instance-enb.jinja2.cfg _update_hash_filename_ = instance-enb.jinja2.cfg
md5sum = dd85f04ab2836cf459078f0adaf7b847 md5sum = a7448167f7433a50938bf6d3e6903065
[template-lte-gnb-epc]
_update_hash_filename_ = instance-gnb-epc.jinja2.cfg
md5sum = 12b4a6eb722d0ddd0c6edb2a48285f73
[template-lte-epc] [template-gnb]
_update_hash_filename_ = instance-epc.jinja2.cfg
md5sum = 397dccca5d9fa027dfc9ba0aab3b7544
[template-lte-gnb]
_update_hash_filename_ = instance-gnb.jinja2.cfg _update_hash_filename_ = instance-gnb.jinja2.cfg
md5sum = a6a57b623cf072b713954c44b55d2dbc md5sum = afa508e78851fe151fd25d8781aaa34a
[template-lte-mme] [template-core-network]
_update_hash_filename_ = instance-mme.jinja2.cfg _update_hash_filename_ = instance-core-network.jinja2.cfg
md5sum = e4ce3208b530e4d01fed328843ea76ca md5sum = 5a46abb4310fa7fa8015fb0cde6cd87f
[template-lte-ue-lte] [template-ue-lte]
_update_hash_filename_ = instance-ue-lte.jinja2.cfg _update_hash_filename_ = instance-ue-lte.jinja2.cfg
md5sum = e201f486d31388cc2542e91bbda85711 md5sum = e201f486d31388cc2542e91bbda85711
[template-lte-ue-nr] [template-ue-nr]
_update_hash_filename_ = instance-ue-nr.jinja2.cfg _update_hash_filename_ = instance-ue-nr.jinja2.cfg
md5sum = 765fd303d6013cf4dbee108c53623412 md5sum = 765fd303d6013cf4dbee108c53623412
[template-obsolete]
_update_hash_filename_ = instance-obsolete.jinja2.cfg
md5sum = e9bd42aa4861c41b684911ad0f37ba4d
[ue_db.jinja2.cfg] [ue_db.jinja2.cfg]
filename = config/ue_db.jinja2.cfg filename = config/ue_db.jinja2.cfg
md5sum = dcaac06553a3222b14c0013a13f4a149 md5sum = dcaac06553a3222b14c0013a13f4a149
...@@ -88,7 +80,7 @@ md5sum = 1ba2e065bdf14a6411e95e80db17dcfd ...@@ -88,7 +80,7 @@ md5sum = 1ba2e065bdf14a6411e95e80db17dcfd
[mme.jinja2.cfg] [mme.jinja2.cfg]
filename = config/mme.jinja2.cfg filename = config/mme.jinja2.cfg
md5sum = f002f908d9af8b4089dad0c64742dde6 md5sum = 3b3ab394e5303ec39fdcdd849a749550
[ims.jinja2.cfg] [ims.jinja2.cfg]
filename = config/ims.jinja2.cfg filename = config/ims.jinja2.cfg
......
...@@ -11,3 +11,11 @@ Version 1.0.312 (2023-03-20) ...@@ -11,3 +11,11 @@ Version 1.0.312 (2023-03-20)
* Add promise to test if reception is saturated * Add promise to test if reception is saturated
* Add IMSI in connection parameters when SIM gets attached * Add IMSI in connection parameters when SIM gets attached
Version 1.0.316 (2023-04-14)
-------------
* Remove enb-epc, gnb-epc and epc software types, the software types are now:
- enb
- gnb
- core-network (replaces epc software type)
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
gtp_addr: "127.0.1.100", gtp_addr: "127.0.1.100",
{% endif %} {% endif %}
plmn: "{{ slapparameter_dict.get('epc_plmn', "00101") }}", plmn: "{{ slapparameter_dict.get('core_network_plmn', "00101") }}",
mme_group_id: 32769, mme_group_id: 32769,
mme_code: 1, mme_code: 1,
......
{
"$schema": "http://json-schema.org/draft-04/schema",
"title": "Core Network Input Parameters",
"type": "object",
"properties": {
"core_network_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"iperf3": {
"default": false,
"title": "iperf3 UDP server",
"description": "Activate iperf3 UDP server",
"type": "boolean"
},
"use_ipv4": {
"default": false,
"title": "Use IPv4",
"description": "Set to true to use IPv4 for AMF / MME addresses",
"type": "boolean"
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
}
}
}
...@@ -13,10 +13,17 @@ info = Your SIM card with IMSI {{ slave_parameters.get('imsi', '') }} has been a ...@@ -13,10 +13,17 @@ info = Your SIM card with IMSI {{ slave_parameters.get('imsi', '') }} has been a
[buildout] [buildout]
parts = parts =
directory directory
lte-enb-request ltelogs
lte-mme-request mme-config
mme-service
monitor-base
check-cpu-temperature.py check-cpu-temperature.py
check-interface-up.py
publish-connection-information publish-connection-information
{% if slapparameter_dict.get("iperf3", None) %}
iperf-service
port-listening-promise
{% endif %}
{% for part in part_list -%} {% for part in part_list -%}
{{ ' %s' % part }} {{ ' %s' % part }}
{% endfor %} {% endfor %}
...@@ -27,6 +34,25 @@ eggs-directory = {{ eggs_directory }} ...@@ -27,6 +34,25 @@ eggs-directory = {{ eggs_directory }}
develop-eggs-directory = {{ develop_eggs_directory }} develop-eggs-directory = {{ develop_eggs_directory }}
offline = true offline = true
[slap-configuration]
recipe = slapos.cookbook:slapconfiguration.serialised
computer = {{ slap_connection['computer-id'] }}
partition = {{ slap_connection['partition-id'] }}
url = {{ slap_connection['server-url'] }}
key = {{ slap_connection['key-file'] }}
cert = {{ slap_connection['cert-file'] }}
configuration.network_name = RAPIDSPACE
configuration.domain = rapid.space
configuration.log_size = 50M
configuration.mme_ws_port = 9000
configuration.enb_ws_port = 9002
configuration.ims_ws_port = 9003
configuration.mme_addr = 127.0.1.100
configuration.ims_addr = 127.0.0.1
configuration.ims_bind = 127.0.0.2
configuration.enb_addr = 127.0.1.1
ue_db_path = {{ ue_db_path }}
[monitor-httpd-conf-parameter] [monitor-httpd-conf-parameter]
httpd-include-file = {{ buildout_directory }}/etc/httpd-include-file.conf httpd-include-file = {{ buildout_directory }}/etc/httpd-include-file.conf
port = ${monitor-instance-parameter:monitor-httpd-port} port = ${monitor-instance-parameter:monitor-httpd-port}
...@@ -41,71 +67,20 @@ minimum = 8035 ...@@ -41,71 +67,20 @@ minimum = 8035
maximum = 8055 maximum = 8055
ip = ${monitor-instance-parameter:monitor-httpd-ipv6} ip = ${monitor-instance-parameter:monitor-httpd-ipv6}
[slap-configuration]
recipe = slapos.cookbook:slapconfiguration.serialised
computer = {{ slap_connection['computer-id'] }}
partition = {{ slap_connection['partition-id'] }}
url = {{ slap_connection['server-url'] }}
key = {{ slap_connection['key-file'] }}
cert = {{ slap_connection['cert-file'] }}
[directory] [directory]
recipe = slapos.cookbook:mkdirectory recipe = slapos.cookbook:mkdirectory
software = {{ buildout_directory }} software = {{ buildout_directory }}
home = ${buildout:directory} home = ${buildout:directory}
etc = ${:home}/etc etc = ${:home}/etc
var = ${:home}/var var = ${:home}/var
etc = ${:home}/etc
bin = ${:home}/bin bin = ${:home}/bin
tmp = ${:home}/tmp
run = ${:var}/run run = ${:var}/run
script = ${:etc}/run script = ${:etc}/run
service = ${:etc}/service service = ${:etc}/service
promise = ${:etc}/promise promise = ${:etc}/promise
log = ${:var}/log log = ${:var}/log
[request-common-base]
recipe = slapos.cookbook:requestoptional.serialised
software-url = {{ slap_connection['software-release-url'] }}
server-url = {{ slap_connection['server-url'] }}
computer-id = {{ slap_connection['computer-id'] }}
partition-id = {{ slap_connection['partition-id'] }}
key-file = {{ slap_connection['key-file'] }}
cert-file = {{ slap_connection['cert-file'] }}
sla-computer_guid = {{ slap_connection['computer-id'] }}
config-monitor-password = ${monitor-htpasswd:passwd}
config-sub-instance = true
[lte-mme-request]
<= request-common-base
name = MME
software-type = mme
config-name = mme
{%- for key, value in slapparameter_dict.items() %}
config-{{ key }} = {{ dumps(value) }}
{% endfor %}
config-slave-list = {{ dumps(slave_instance_list) }}
return = monitor-base-url epc-ipv6
[lte-enb-request]
<= request-common-base
name = eNB
software-type = enb
config-name = enb
{%- for key, value in slapparameter_dict.items() %}
config-{{ key }} = {{ dumps(value) }}
{% endfor %}
return = monitor-base-url
[monitor-base-url-dict]
lte-mme-request = ${lte-mme-request:connection-monitor-base-url}
lte-enb-request = ${lte-enb-request:connection-monitor-base-url}
[macro.promise]
<= monitor-promise-base
name = ${:_buildout_section_name_}
[check-cpu-temperature.py] [check-cpu-temperature.py]
<= macro.promise <= macro.promise
promise = check_cpu_temperature promise = check_cpu_temperature
...@@ -116,9 +91,144 @@ config-max-avg-temp = {{ slapparameter_dict.get("promise_cpu_max_avg_temp", 80) ...@@ -116,9 +91,144 @@ config-max-avg-temp = {{ slapparameter_dict.get("promise_cpu_max_avg_temp", 80)
config-avg-temp-duration = {{ slapparameter_dict.get("promise_cpu_avg_temp_duration", 600) }} config-avg-temp-duration = {{ slapparameter_dict.get("promise_cpu_avg_temp_duration", 600) }}
config-avg-flag-file = ${directory:var}/promise_cpu_avg_flag_file config-avg-flag-file = ${directory:var}/promise_cpu_avg_flag_file
[ltelogs]
recipe = slapos.recipe.template:jinja2
url = {{ ltelogs_template }}
output = ${directory:home}/ltelogs.sh
extensions = jinja2.ext.do
context =
section directory directory
{% if slapparameter_dict.get("mme_config_link", None) %}
[mme-config-dl]
recipe = slapos.recipe.build:download
url = {{ slapparameter_dict.get("mme_config_link") }}
version = {{ slapparameter_dict.get("mme_config_version") }}
offline = false
{% endif %}
### IMS
[ims-service]
recipe = slapos.cookbook:wrapper
init = ${ltelogs:output} ${directory:log}/ims.log; sleep 1
command-line = {{ mme }}/lteims ${directory:etc}/ims.cfg
wrapper-path = ${directory:service}/ims
mode = 0775
pidfile = ${directory:run}/ims.pid
hash-files =
${ims-config:output}
{{ ue_db_path }}
environment = AMARISOFT_PATH=/opt/amarisoft/.amarisoft
[mme-sh-wrapper]
recipe = slapos.recipe.template
output = ${directory:bin}/${:_buildout_section_name_}
mme-log = ${directory:log}/mme-output.log
inline =
#!/bin/sh
{% if not slapparameter_dict.get("testing", False) %}
rm -f ${directory:var}/lte_ue.db;
(echo && echo && date "+[%Y/%m/%d %T.%N %Z] Starting MME software..." && echo) >> ${:mme-log};
tail -c 1M ${:mme-log} > ${:mme-log}.tmp;
mv ${:mme-log}.tmp ${:mme-log};
{{ mme }}/ltemme ${directory:etc}/mme.cfg >> ${:mme-log} 2>> ${:mme-log};
{% endif %}
### MME
[mme-service]
recipe = slapos.cookbook:wrapper
# When the machine shutdowns abruptly, lte_ue is not cleaned up which causes
# amarisoft ltemme to fail. TODO: find a cleaner way to handle this
init = ${ltelogs:output} ${directory:log}/mme.log
command-line = ${mme-sh-wrapper:output}
wrapper-path = ${directory:service}/mme
mode = 0775
pidfile = ${directory:run}/mme.pid
hash-files =
${mme-config:output}
{{ ue_db_path }}
${mme-sh-wrapper:output}
environment =
LD_LIBRARY_PATH={{ openssl_location }}/lib:{{ nghttp2_location }}/lib
AMARISOFT_PATH=/opt/amarisoft/.amarisoft
### EMPTY mme-ifup script
[mme-ifup-empty]
recipe = slapos.cookbook:wrapper
wrapper-path = ${directory:bin}/mme-ifup-empty
command-line = echo Using interface
mode = 775
{% if slapparameter_dict.get("iperf3", None) %}
### iperf3
[iperf-service]
recipe = slapos.cookbook:wrapper
port = 5001
ip = ${slap-configuration:tun-ipv4-addr}
command-line = {{ iperf3_location }}/bin/iperf3 --server --interval 1 --port ${:port} --bind ${:ip}
wrapper-path = ${directory:service}/iperf3
mode = 0775
pidfile = ${directory:run}/iperf3.pid
[port-listening-promise]
<= monitor-promise-base
promise = check_socket_listening
name = iperf3-port-listening.py
config-host = ${iperf-service:ip}
config-port = ${iperf-service:port}
{% endif %}
[config-base]
recipe = slapos.recipe.template:jinja2
extensions = jinja2.ext.do
context =
section directory directory
section slap_configuration slap-configuration
key slapparameter_dict slap-configuration:configuration
key gtp_addr_v6 slap-configuration:ipv6-random
raw gtp_addr_v4 {{ lan_ipv4 }}
import netaddr netaddr
key ifup_empty mme-ifup-empty:wrapper-path
[ims-config]
<= config-base
url = {{ ims_template }}
output = ${directory:etc}/ims.cfg
[mme-config]
<= config-base
{% if slapparameter_dict.get("mme_config_link", None) %}
url = ${mme-config-dl:target}
{% else %}
url = {{ mme_template }}
{% endif %}
output = ${directory:etc}/mme.cfg
[monitor-instance-parameter]
{% if slapparameter_dict.get("name", None) %}
monitor-title = {{ slapparameter_dict['name'] | string }}
{% endif %}
{% if slapparameter_dict.get("monitor-password", None) %}
password = {{ slapparameter_dict['monitor-password'] | string }}
{% endif %}
[publish-connection-information] [publish-connection-information]
recipe = slapos.cookbook:publish.serialised
<= monitor-publish <= monitor-publish
epc-ipv6 = ${lte-mme-request:connection-epc-ipv6} recipe = slapos.cookbook:publish.serialised
epc-ipv4 = {{ epc_ipv4 }} core-network-ipv6 = ${slap-configuration:ipv6-random}
core-network-ipv4 = {{ lan_ipv4 }}
monitor-gadget-url = ${:monitor-base-url}/gadget/software.cfg.html monitor-gadget-url = ${:monitor-base-url}/gadget/software.cfg.html
[macro.promise]
<= monitor-promise-base
name = ${:_buildout_section_name_}
[check-interface-up.py]
<= macro.promise
promise = check_interface_up
config-testing = {{ slapparameter_dict.get("testing", False) }}
{% if not slapparameter_dict.get("testing", False) %}
config-ifname = ${slap-configuration:tun-name}
{% else %}
config-ifname =
{% endif %}
...@@ -3,26 +3,6 @@ ...@@ -3,26 +3,6 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
{%- if epc %}
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"iperf3": {
"default": false,
"title": "iperf3 UDP server",
"description": "Activate iperf3 UDP server",
"type": "boolean"
},
{%- endif %}
"rrh": { "rrh": {
"title": "RRH", "title": "RRH",
"description": "RRH", "description": "RRH",
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
parts = parts =
directory directory
ltelogs ltelogs
lte-enb-config enb-config
lte-enb-service enb-service
amarisoft-stats-service amarisoft-stats-service
amarisoft-rf-info-service amarisoft-rf-info-service
{% if slapparameter_dict.get('rrh', '') == "Lopcomm ORAN" %} {% if slapparameter_dict.get('rrh', '') == "Lopcomm ORAN" %}
...@@ -102,7 +102,7 @@ version = {{ slapparameter_dict.get("enb_config_version") }} ...@@ -102,7 +102,7 @@ version = {{ slapparameter_dict.get("enb_config_version") }}
offline = false offline = false
{% endif %} {% endif %}
[lte-enb-sh-wrapper] [enb-sh-wrapper]
recipe = slapos.recipe.template recipe = slapos.recipe.template
output = ${directory:bin}/${:_buildout_section_name_} output = ${directory:bin}/${:_buildout_section_name_}
enb-log = ${directory:log}/enb-output.log enb-log = ${directory:log}/enb-output.log
...@@ -118,17 +118,17 @@ inline = ...@@ -118,17 +118,17 @@ inline =
{{ enb }}/lteenb ${directory:etc}/enb.cfg >> ${:enb-log} 2>> ${:enb-log}; {{ enb }}/lteenb ${directory:etc}/enb.cfg >> ${:enb-log} 2>> ${:enb-log};
{% endif %} {% endif %}
[lte-enb-service] [enb-service]
recipe = slapos.cookbook:wrapper recipe = slapos.cookbook:wrapper
init = ${ltelogs:output} ${directory:log}/enb.log; sleep 2 init = ${ltelogs:output} ${directory:log}/enb.log; sleep 2
command-line = ${lte-enb-sh-wrapper:output} command-line = ${enb-sh-wrapper:output}
wrapper-path = ${directory:service}/lte-enb wrapper-path = ${directory:service}/enb
mode = 0775 mode = 0775
reserve-cpu = True reserve-cpu = True
pidfile = ${directory:run}/enb.pid pidfile = ${directory:run}/enb.pid
hash-files = hash-files =
${lte-enb-config:output} ${enb-config:output}
${lte-enb-sh-wrapper:output} ${enb-sh-wrapper:output}
environment = environment =
LD_LIBRARY_PATH={{ openssl_location }}/lib LD_LIBRARY_PATH={{ openssl_location }}/lib
AMARISOFT_PATH=/opt/amarisoft/.amarisoft AMARISOFT_PATH=/opt/amarisoft/.amarisoft
...@@ -234,11 +234,11 @@ context = ...@@ -234,11 +234,11 @@ context =
section slap_configuration slap-configuration section slap_configuration slap-configuration
key slapparameter_dict slap-configuration:configuration key slapparameter_dict slap-configuration:configuration
key gtp_addr_v6 slap-configuration:ipv6-random key gtp_addr_v6 slap-configuration:ipv6-random
raw gtp_addr_v4 {{ epc_ipv4 }} raw gtp_addr_v4 {{ lan_ipv4 }}
raw sib23 {{ sib23 }} raw sib23 {{ sib23 }}
import netaddr netaddr import netaddr netaddr
[lte-enb-config] [enb-config]
<= config-base <= config-base
{% if slapparameter_dict.get("enb_config_link", None) %} {% if slapparameter_dict.get("enb_config_link", None) %}
url = ${enb-config-dl:target} url = ${enb-config-dl:target}
...@@ -250,6 +250,8 @@ output = ${directory:etc}/enb.cfg ...@@ -250,6 +250,8 @@ output = ${directory:etc}/enb.cfg
[publish-connection-information] [publish-connection-information]
<= monitor-publish <= monitor-publish
recipe = slapos.cookbook:publish.serialised recipe = slapos.cookbook:publish.serialised
enb-ipv6 = ${slap-configuration:ipv6-random}
enb-ipv4 = {{ lan_ipv4 }}
monitor-gadget-url = ${:monitor-base-url}/gadget/software.cfg.html monitor-gadget-url = ${:monitor-base-url}/gadget/software.cfg.html
[monitor-instance-parameter] [monitor-instance-parameter]
......
{% set part_list = [] -%}
{%- for i, slave in enumerate(slave_instance_list) %}
{%- set slave_parameters = json_module.loads(slave['_']) %}
{% set slave_reference = slave.get('slave_reference', '') %}
{% set publish_section_title = 'publish-%s' % slave_reference %}
{% do part_list.append(publish_section_title) %}
[{{ publish_section_title }}]
recipe = slapos.cookbook:publish.serialised
-slave-reference = {{ slave_reference }}
info = Your SIM card with IMSI {{ slave_parameters.get('imsi', '') }} has been attached to service ${slap-configuration:instance-title}.
{%- endfor %}
[buildout]
parts =
directory
lte-mme-request
check-cpu-temperature.py
publish-connection-information
{% for part in part_list -%}
{{ ' %s' % part }}
{% endfor %}
extends = {{ monitor_template }}
eggs-directory = {{ eggs_directory }}
develop-eggs-directory = {{ develop_eggs_directory }}
offline = true
[monitor-httpd-conf-parameter]
httpd-include-file = {{ buildout_directory }}/etc/httpd-include-file.conf
port = ${monitor-instance-parameter:monitor-httpd-port}
url = https://[${monitor-instance-parameter:monitor-httpd-ipv6}]:${:port}
[monitor-instance-parameter]
monitor-httpd-port = ${monitor-address:port}
[monitor-address]
recipe = slapos.cookbook:free_port
minimum = 8035
maximum = 8055
ip = ${monitor-instance-parameter:monitor-httpd-ipv6}
[slap-configuration]
recipe = slapos.cookbook:slapconfiguration.serialised
computer = {{ slap_connection['computer-id'] }}
partition = {{ slap_connection['partition-id'] }}
url = {{ slap_connection['server-url'] }}
key = {{ slap_connection['key-file'] }}
cert = {{ slap_connection['cert-file'] }}
[directory]
recipe = slapos.cookbook:mkdirectory
software = {{ buildout_directory }}
home = ${buildout:directory}
etc = ${:home}/etc
var = ${:home}/var
etc = ${:home}/etc
bin = ${:home}/bin
run = ${:var}/run
script = ${:etc}/run
service = ${:etc}/service
promise = ${:etc}/promise
log = ${:var}/log
[request-common-base]
recipe = slapos.cookbook:requestoptional.serialised
software-url = {{ slap_connection['software-release-url'] }}
server-url = {{ slap_connection['server-url'] }}
computer-id = {{ slap_connection['computer-id'] }}
partition-id = {{ slap_connection['partition-id'] }}
key-file = {{ slap_connection['key-file'] }}
cert-file = {{ slap_connection['cert-file'] }}
sla-computer_guid = {{ slap_connection['computer-id'] }}
config-monitor-password = ${monitor-htpasswd:passwd}
return = monitor-base-url epc-ipv6
[lte-mme-request]
<= request-common-base
name = MME
software-type = mme
config-name = mme
{%- for key, value in slapparameter_dict.items() %}
config-{{ key }} = {{ dumps(value) }}
{% endfor %}
config-slave-list = {{ dumps(slave_instance_list) }}
[monitor-base-url-dict]
lte-mme-request = ${lte-mme-request:connection-monitor-base-url}
[macro.promise]
<= monitor-promise-base
name = ${:_buildout_section_name_}
[check-cpu-temperature.py]
<= macro.promise
promise = check_cpu_temperature
config-testing = {{ slapparameter_dict.get("testing", False) }}
config-frequency = {{ slapparameter_dict.get("promise_cpu_temperature_frequency", 5) }}
config-max-spot-temp = {{ slapparameter_dict.get("promise_cpu_max_spot_temp", 90) }}
config-max-avg-temp = {{ slapparameter_dict.get("promise_cpu_max_avg_temp", 80) }}
config-avg-temp-duration = {{ slapparameter_dict.get("promise_cpu_avg_temp_duration", 600) }}
config-avg-flag-file = ${directory:var}/promise_cpu_avg_flag_file
[publish-connection-information]
recipe = slapos.cookbook:publish.serialised
<= monitor-publish
epc-ipv6 = ${lte-mme-request:connection-epc-ipv6}
epc-ipv4 = {{ epc_ipv4 }}
monitor-gadget-url = ${:monitor-base-url}/gadget/software.cfg.html
{
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema",
"title": "SIM Card Parameters",
"required": [
"sim_algo",
"imsi",
"opc",
"amf",
"sqn",
"k",
"impu",
"impi"
],
"properties": {
"sim_algo": {
"title": "Sim Algorithm",
"description": "xor, milenage or tuak. Set the USIM authentication algorithm.",
"type": "string",
"default": "milenage"
},
"imsi": {
"title": "IMSI",
"description": "IMSI",
"type": "string",
"default": ""
},
"opc": {
"title": "OPC",
"description": "Operator key preprocessed with the user secret key (as a 16 byte hexadecimal string). When the Milenage authentication algorithm is used, opc must be set.",
"type": "string",
"default": ""
},
"amf": {
"title": "AMF",
"description": "Range: 0 to 65535. Set the Authentication Management Field.",
"type": "string",
"default": "0x9001"
},
"sqn": {
"title": "SQN",
"description": "Optional String (6 byte hexadecimal string). Set the initial sequence number. For the XOR algorithm, the actual value does not matter. For the Milenage or TUAK algorithm, a sequence number resynchronization is initiated if the sequence number does not match the one stored in the USIM.",
"type": "string",
"default": "000000000000"
},
"k": {
"title": "K",
"description": "Set the user secret key (as a 16 bytes hexadecimal string, or eventually 32 bytes hexadecimal string for TUAK).",
"type": "string",
"default": ""
},
"impu": {
"title": "IMPU",
"description": "sip URI or a telephone number. Note that sip URI must not include hostname. If IMPU does not start by a scheme, it is assumed to be a sip URI.",
"type": "string",
"default": ""
},
"impi": {
"title": "IMPI",
"description": "Defines user IMPI. Must be fully filled with hostname if necessary.",
"type": "string",
"default": ""
}
}
}
{% set part_list = [] -%}
{%- for i, slave in enumerate(slave_instance_list) %}
{%- set slave_parameters = json_module.loads(slave['_']) %}
{% set slave_reference = slave.get('slave_reference', '') %}
{% set publish_section_title = 'publish-%s' % slave_reference %}
{% do part_list.append(publish_section_title) %}
[{{ publish_section_title }}]
recipe = slapos.cookbook:publish.serialised
-slave-reference = {{ slave_reference }}
info = Your SIM card with IMSI {{ slave_parameters.get('imsi', '') }} has been attached to service ${slap-configuration:instance-title}.
{%- endfor %}
[buildout]
parts =
directory
lte-gnb-request
lte-mme-request
check-cpu-temperature.py
publish-connection-information
{% for part in part_list -%}
{{ ' %s' % part }}
{% endfor %}
extends = {{ monitor_template }}
eggs-directory = {{ eggs_directory }}
develop-eggs-directory = {{ develop_eggs_directory }}
offline = true
[monitor-httpd-conf-parameter]
httpd-include-file = {{ buildout_directory }}/etc/httpd-include-file.conf
port = ${monitor-instance-parameter:monitor-httpd-port}
url = https://[${monitor-instance-parameter:monitor-httpd-ipv6}]:${:port}
[monitor-instance-parameter]
monitor-httpd-port = ${monitor-address:port}
[monitor-address]
recipe = slapos.cookbook:free_port
minimum = 8035
maximum = 8055
ip = ${monitor-instance-parameter:monitor-httpd-ipv6}
[slap-configuration]
recipe = slapos.cookbook:slapconfiguration.serialised
computer = {{ slap_connection['computer-id'] }}
partition = {{ slap_connection['partition-id'] }}
url = {{ slap_connection['server-url'] }}
key = {{ slap_connection['key-file'] }}
cert = {{ slap_connection['cert-file'] }}
[directory]
recipe = slapos.cookbook:mkdirectory
software = {{ buildout_directory }}
home = ${buildout:directory}
etc = ${:home}/etc
var = ${:home}/var
etc = ${:home}/etc
bin = ${:home}/bin
run = ${:var}/run
script = ${:etc}/run
service = ${:etc}/service
promise = ${:etc}/promise
log = ${:var}/log
[request-common-base]
recipe = slapos.cookbook:requestoptional.serialised
software-url = {{ slap_connection['software-release-url'] }}
server-url = {{ slap_connection['server-url'] }}
computer-id = {{ slap_connection['computer-id'] }}
partition-id = {{ slap_connection['partition-id'] }}
key-file = {{ slap_connection['key-file'] }}
cert-file = {{ slap_connection['cert-file'] }}
sla-computer_guid = {{ slap_connection['computer-id'] }}
config-monitor-password = ${monitor-htpasswd:passwd}
config-sub-instance = true
[lte-mme-request]
<= request-common-base
name = MME
software-type = mme
config-name = mme
{%- for key, value in slapparameter_dict.items() %}
config-{{ key }} = {{ dumps(value) }}
{% endfor %}
config-slave-list = {{ dumps(slave_instance_list) }}
return = monitor-base-url epc-ipv6
[lte-gnb-request]
<= request-common-base
name = gNB
software-type = gnb
config-name = gnb
{%- for key, value in slapparameter_dict.items() %}
config-{{ key }} = {{ dumps(value) }}
{% endfor %}
return = monitor-base-url
[monitor-base-url-dict]
lte-mme-request = ${lte-mme-request:connection-monitor-base-url}
lte-gnb-request = ${lte-gnb-request:connection-monitor-base-url}
[macro.promise]
<= monitor-promise-base
name = ${:_buildout_section_name_}
[check-cpu-temperature.py]
<= macro.promise
promise = check_cpu_temperature
config-testing = {{ slapparameter_dict.get("testing", False) }}
config-frequency = {{ slapparameter_dict.get("promise_cpu_temperature_frequency", 5) }}
config-max-spot-temp = {{ slapparameter_dict.get("promise_cpu_max_spot_temp", 90) }}
config-max-avg-temp = {{ slapparameter_dict.get("promise_cpu_max_avg_temp", 80) }}
config-avg-temp-duration = {{ slapparameter_dict.get("promise_cpu_avg_temp_duration", 600) }}
config-avg-flag-file = ${directory:var}/promise_cpu_avg_flag_file
[publish-connection-information]
recipe = slapos.cookbook:publish.serialised
<= monitor-publish
epc-ipv6 = ${lte-mme-request:connection-epc-ipv6}
epc-ipv4 = {{ epc_ipv4 }}
monitor-gadget-url = ${:monitor-base-url}/gadget/software.cfg.html
...@@ -3,26 +3,6 @@ ...@@ -3,26 +3,6 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
{%- if epc %}
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"iperf3": {
"default": false,
"title": "iperf3 UDP server",
"description": "Activate iperf3 UDP server",
"type": "boolean"
},
{%- endif %}
"rrh": { "rrh": {
"title": "RRH", "title": "RRH",
"description": "RRH", "description": "RRH",
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
parts = parts =
directory directory
ltelogs ltelogs
lte-gnb-config gnb-config
lte-enb-service enb-service
amarisoft-stats-service amarisoft-stats-service
amarisoft-rf-info-service amarisoft-rf-info-service
{% if slapparameter_dict.get('rrh', '') == "Lopcomm ORAN" %} {% if slapparameter_dict.get('rrh', '') == "Lopcomm ORAN" %}
...@@ -101,7 +101,7 @@ version = {{ slapparameter_dict.get("gnb_config_version") }} ...@@ -101,7 +101,7 @@ version = {{ slapparameter_dict.get("gnb_config_version") }}
offline = false offline = false
{% endif %} {% endif %}
[lte-enb-sh-wrapper] [enb-sh-wrapper]
recipe = slapos.recipe.template recipe = slapos.recipe.template
output = ${directory:bin}/${:_buildout_section_name_} output = ${directory:bin}/${:_buildout_section_name_}
gnb-log = ${directory:log}/gnb-output.log gnb-log = ${directory:log}/gnb-output.log
...@@ -119,17 +119,17 @@ inline = ...@@ -119,17 +119,17 @@ inline =
{% endif %} {% endif %}
### eNodeB (enb) ### eNodeB (enb)
[lte-enb-service] [enb-service]
recipe = slapos.cookbook:wrapper recipe = slapos.cookbook:wrapper
init = ${ltelogs:output} ${directory:log}/enb.log; sleep 2 init = ${ltelogs:output} ${directory:log}/enb.log; sleep 2
command-line = ${lte-enb-sh-wrapper:output} command-line = ${enb-sh-wrapper:output}
wrapper-path = ${directory:service}/lte-enb wrapper-path = ${directory:service}/enb
mode = 0775 mode = 0775
reserve-cpu = True reserve-cpu = True
pidfile = ${directory:run}/enb.pid pidfile = ${directory:run}/enb.pid
hash-files = hash-files =
${lte-gnb-config:output} ${gnb-config:output}
${lte-enb-sh-wrapper:output} ${enb-sh-wrapper:output}
environment = environment =
LD_LIBRARY_PATH={{ openssl_location }}/lib LD_LIBRARY_PATH={{ openssl_location }}/lib
AMARISOFT_PATH=/opt/amarisoft/.amarisoft AMARISOFT_PATH=/opt/amarisoft/.amarisoft
...@@ -188,10 +188,10 @@ context = ...@@ -188,10 +188,10 @@ context =
section slap_configuration slap-configuration section slap_configuration slap-configuration
key slapparameter_dict slap-configuration:configuration key slapparameter_dict slap-configuration:configuration
key gtp_addr_v6 slap-configuration:ipv6-random key gtp_addr_v6 slap-configuration:ipv6-random
raw gtp_addr_v4 {{ epc_ipv4 }} raw gtp_addr_v4 {{ lan_ipv4 }}
import netaddr netaddr import netaddr netaddr
[lte-gnb-config] [gnb-config]
<= config-base <= config-base
{% if slapparameter_dict.get("gnb_config_link", None) %} {% if slapparameter_dict.get("gnb_config_link", None) %}
url = ${gnb-config-dl:target} url = ${gnb-config-dl:target}
...@@ -203,6 +203,8 @@ output = ${directory:etc}/gnb.cfg ...@@ -203,6 +203,8 @@ output = ${directory:etc}/gnb.cfg
[publish-connection-information] [publish-connection-information]
<= monitor-publish <= monitor-publish
recipe = slapos.cookbook:publish.serialised recipe = slapos.cookbook:publish.serialised
gnb-ipv6 = ${slap-configuration:ipv6-random}
gnb-ipv4 = {{ lan_ipv4 }}
monitor-gadget-url = ${:monitor-base-url}/gadget/software.cfg.html monitor-gadget-url = ${:monitor-base-url}/gadget/software.cfg.html
[monitor-instance-parameter] [monitor-instance-parameter]
......
{ {
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "EPC Input Parameters", "title": "Core Network Input Parameters",
"type": "object", "type": "object",
"properties": { "properties": {
"epc_plmn": { "epc_plmn": {
......
{% set part_list = [] -%}
{%- for i, slave in enumerate(slave_instance_list) %}
{%- set slave_parameters = json_module.loads(slave['_']) %}
{% set slave_reference = slave.get('slave_reference', '') %}
{% set publish_section_title = 'publish-%s' % slave_reference %}
{% do part_list.append(publish_section_title) %}
[{{ publish_section_title }}]
recipe = slapos.cookbook:publish.serialised
-slave-reference = {{ slave_reference }}
info = Your SIM card with IMSI {{ slave_parameters.get('imsi', '') }} has been attached to service ${slap-configuration:instance-title}.
{%- endfor %}
[buildout] [buildout]
parts = parts =
directory directory
ltelogs ltelogs
lte-mme-config mme-config
lte-mme-service mme-service
monitor-base monitor-base
publish-connection-information check-cpu-temperature.py
check-interface-up.py check-interface-up.py
publish-connection-information
{% if slapparameter_dict.get("iperf3", None) %} {% if slapparameter_dict.get("iperf3", None) %}
iperf-service iperf-service
port-listening-promise port-listening-promise
{% endif %} {% endif %}
{% for part in part_list -%}
{{ ' %s' % part }}
{% endfor %}
extends = {{ monitor_template }} extends = {{ monitor_template }}
...@@ -18,20 +34,6 @@ eggs-directory = {{ eggs_directory }} ...@@ -18,20 +34,6 @@ eggs-directory = {{ eggs_directory }}
develop-eggs-directory = {{ develop_eggs_directory }} develop-eggs-directory = {{ develop_eggs_directory }}
offline = true offline = true
[monitor-httpd-conf-parameter]
httpd-include-file = {{ buildout_directory }}/etc/httpd-include-file.conf
port = ${monitor-instance-parameter:monitor-httpd-port}
url = https://[${monitor-instance-parameter:monitor-httpd-ipv6}]:${:port}
[monitor-instance-parameter]
monitor-httpd-port = ${monitor-address:port}
[monitor-address]
recipe = slapos.cookbook:free_port
minimum = 8035
maximum = 8055
ip = ${monitor-instance-parameter:monitor-httpd-ipv6}
[slap-configuration] [slap-configuration]
recipe = slapos.cookbook:slapconfiguration.serialised recipe = slapos.cookbook:slapconfiguration.serialised
computer = {{ slap_connection['computer-id'] }} computer = {{ slap_connection['computer-id'] }}
...@@ -39,7 +41,6 @@ partition = {{ slap_connection['partition-id'] }} ...@@ -39,7 +41,6 @@ partition = {{ slap_connection['partition-id'] }}
url = {{ slap_connection['server-url'] }} url = {{ slap_connection['server-url'] }}
key = {{ slap_connection['key-file'] }} key = {{ slap_connection['key-file'] }}
cert = {{ slap_connection['cert-file'] }} cert = {{ slap_connection['cert-file'] }}
configuration.network_name = RAPIDSPACE configuration.network_name = RAPIDSPACE
configuration.domain = rapid.space configuration.domain = rapid.space
configuration.log_size = 50M configuration.log_size = 50M
...@@ -50,16 +51,28 @@ configuration.mme_addr = 127.0.1.100 ...@@ -50,16 +51,28 @@ configuration.mme_addr = 127.0.1.100
configuration.ims_addr = 127.0.0.1 configuration.ims_addr = 127.0.0.1
configuration.ims_bind = 127.0.0.2 configuration.ims_bind = 127.0.0.2
configuration.enb_addr = 127.0.1.1 configuration.enb_addr = 127.0.1.1
ue_db_path = {{ ue_db_path }} ue_db_path = {{ ue_db_path }}
[monitor-httpd-conf-parameter]
httpd-include-file = {{ buildout_directory }}/etc/httpd-include-file.conf
port = ${monitor-instance-parameter:monitor-httpd-port}
url = https://[${monitor-instance-parameter:monitor-httpd-ipv6}]:${:port}
[monitor-instance-parameter]
monitor-httpd-port = ${monitor-address:port}
[monitor-address]
recipe = slapos.cookbook:free_port
minimum = 8035
maximum = 8055
ip = ${monitor-instance-parameter:monitor-httpd-ipv6}
[directory] [directory]
recipe = slapos.cookbook:mkdirectory recipe = slapos.cookbook:mkdirectory
software = {{ buildout_directory }} software = {{ buildout_directory }}
home = ${buildout:directory} home = ${buildout:directory}
etc = ${:home}/etc etc = ${:home}/etc
var = ${:home}/var var = ${:home}/var
etc = ${:home}/etc
bin = ${:home}/bin bin = ${:home}/bin
tmp = ${:home}/tmp tmp = ${:home}/tmp
run = ${:var}/run run = ${:var}/run
...@@ -68,6 +81,16 @@ service = ${:etc}/service ...@@ -68,6 +81,16 @@ service = ${:etc}/service
promise = ${:etc}/promise promise = ${:etc}/promise
log = ${:var}/log log = ${:var}/log
[check-cpu-temperature.py]
<= macro.promise
promise = check_cpu_temperature
config-testing = {{ slapparameter_dict.get("testing", False) }}
config-frequency = {{ slapparameter_dict.get("promise_cpu_temperature_frequency", 5) }}
config-max-spot-temp = {{ slapparameter_dict.get("promise_cpu_max_spot_temp", 90) }}
config-max-avg-temp = {{ slapparameter_dict.get("promise_cpu_max_avg_temp", 80) }}
config-avg-temp-duration = {{ slapparameter_dict.get("promise_cpu_avg_temp_duration", 600) }}
config-avg-flag-file = ${directory:var}/promise_cpu_avg_flag_file
[ltelogs] [ltelogs]
recipe = slapos.recipe.template:jinja2 recipe = slapos.recipe.template:jinja2
url = {{ ltelogs_template }} url = {{ ltelogs_template }}
...@@ -97,7 +120,7 @@ hash-files = ...@@ -97,7 +120,7 @@ hash-files =
{{ ue_db_path }} {{ ue_db_path }}
environment = AMARISOFT_PATH=/opt/amarisoft/.amarisoft environment = AMARISOFT_PATH=/opt/amarisoft/.amarisoft
[lte-mme-sh-wrapper] [mme-sh-wrapper]
recipe = slapos.recipe.template recipe = slapos.recipe.template
output = ${directory:bin}/${:_buildout_section_name_} output = ${directory:bin}/${:_buildout_section_name_}
mme-log = ${directory:log}/mme-output.log mme-log = ${directory:log}/mme-output.log
...@@ -112,25 +135,25 @@ inline = ...@@ -112,25 +135,25 @@ inline =
{% endif %} {% endif %}
### MME ### MME
[lte-mme-service] [mme-service]
recipe = slapos.cookbook:wrapper recipe = slapos.cookbook:wrapper
# When the machine shutdowns abruptly, lte_ue is not cleaned up which causes # When the machine shutdowns abruptly, lte_ue is not cleaned up which causes
# amarisoft ltemme to fail. TODO: find a cleaner way to handle this # amarisoft ltemme to fail. TODO: find a cleaner way to handle this
init = ${ltelogs:output} ${directory:log}/mme.log init = ${ltelogs:output} ${directory:log}/mme.log
command-line = ${lte-mme-sh-wrapper:output} command-line = ${mme-sh-wrapper:output}
wrapper-path = ${directory:service}/lte-mme wrapper-path = ${directory:service}/mme
mode = 0775 mode = 0775
pidfile = ${directory:run}/mme.pid pidfile = ${directory:run}/mme.pid
hash-files = hash-files =
${lte-mme-config:output} ${mme-config:output}
{{ ue_db_path }} {{ ue_db_path }}
${lte-mme-sh-wrapper:output} ${mme-sh-wrapper:output}
environment = environment =
LD_LIBRARY_PATH={{ openssl_location }}/lib:{{ nghttp2_location }}/lib LD_LIBRARY_PATH={{ openssl_location }}/lib:{{ nghttp2_location }}/lib
AMARISOFT_PATH=/opt/amarisoft/.amarisoft AMARISOFT_PATH=/opt/amarisoft/.amarisoft
### EMPTY mme-ifup script ### EMPTY mme-ifup script
[lte-mme-ifup-empty] [mme-ifup-empty]
recipe = slapos.cookbook:wrapper recipe = slapos.cookbook:wrapper
wrapper-path = ${directory:bin}/mme-ifup-empty wrapper-path = ${directory:bin}/mme-ifup-empty
command-line = echo Using interface command-line = echo Using interface
...@@ -163,16 +186,16 @@ context = ...@@ -163,16 +186,16 @@ context =
section slap_configuration slap-configuration section slap_configuration slap-configuration
key slapparameter_dict slap-configuration:configuration key slapparameter_dict slap-configuration:configuration
key gtp_addr_v6 slap-configuration:ipv6-random key gtp_addr_v6 slap-configuration:ipv6-random
raw gtp_addr_v4 {{ epc_ipv4 }} raw gtp_addr_v4 {{ lan_ipv4 }}
import netaddr netaddr import netaddr netaddr
key ifup_empty lte-mme-ifup-empty:wrapper-path key ifup_empty mme-ifup-empty:wrapper-path
[lte-ims-config] [lte-ims-config]
<= config-base <= config-base
url = {{ ims_template }} url = {{ ims_template }}
output = ${directory:etc}/ims.cfg output = ${directory:etc}/ims.cfg
[lte-mme-config] [mme-config]
<= config-base <= config-base
{% if slapparameter_dict.get("mme_config_link", None) %} {% if slapparameter_dict.get("mme_config_link", None) %}
url = ${mme-config-dl:target} url = ${mme-config-dl:target}
...@@ -193,7 +216,7 @@ password = {{ slapparameter_dict['monitor-password'] | string }} ...@@ -193,7 +216,7 @@ password = {{ slapparameter_dict['monitor-password'] | string }}
<= monitor-publish <= monitor-publish
recipe = slapos.cookbook:publish.serialised recipe = slapos.cookbook:publish.serialised
epc-ipv6 = ${slap-configuration:ipv6-random} epc-ipv6 = ${slap-configuration:ipv6-random}
epc-ipv4 = {{ epc_ipv4 }} epc-ipv4 = {{ lan_ipv4 }}
monitor-gadget-url = ${:monitor-base-url}/gadget/software.cfg.html monitor-gadget-url = ${:monitor-base-url}/gadget/software.cfg.html
[macro.promise] [macro.promise]
......
{% set obsolete_message = "This software type doesn't exist anymore. Please see documentation at XXXX" -%}
{% set part_list = [] -%}
{%- for i, slave in enumerate(slave_instance_list) %}
{% set slave_reference = slave.get('slave_reference', '') %}
{% set publish_section_title = 'publish-%s' % slave_reference %}
{% do part_list.append(publish_section_title) %}
[{{ publish_section_title }}]
recipe = slapos.cookbook:publish.serialised
-slave-reference = {{ slave_reference }}
info = {{ obsolete_message }}
{%- endfor %}
[buildout]
parts =
publish-connection-information
{% for part in part_list -%}
{{ ' %s' % part }}
{% endfor %}
eggs-directory = {{ eggs_directory }}
develop-eggs-directory = {{ develop_eggs_directory }}
offline = true
[publish-connection-information]
recipe = slapos.cookbook:publish.serialised
message = {{ obsolete_message }}
{
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters",
"properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"iperf3": {
"default": false,
"title": "iperf3 UDP server",
"description": "Activate iperf3 UDP server",
"type": "boolean"
},
"rrh": {
"title": "RRH",
"description": "RRH",
"type": "string",
"default": "SDR",
"enum": [
"SDR",
"Lopcomm ORAN"
]
},
"tx_gain": {
"title": "Tx gain",
"description": "Tx gain (in dB)",
"type": "number",
"default": 60
},
"rx_gain": {
"title": "Rx gain",
"description": "Rx gain (in dB)",
"type": "number",
"default": 45
},
"dl_earfcn": {
"title": "DL EARFCN",
"description": "Downlink E-UTRA Absolute Radio Frequency Channel Number of the cell",
"type": "number",
"default": 38350
},
"n_rb_dl": {
"title": "DL RB",
"description": "number of DL resource blocks",
"type": "number",
"default": 100
},
"mme_list": {
"title": "MME list",
"description": "Optionnal. List of MME to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"mme_addr": {
"title": "MME Address",
"description": "IP address (and optional port) of S1AP SCTP connection to the MME. The default port is 36412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"enb_id": {
"title": "eNB ID",
"description": "eNB ID",
"type": "string",
"default": "0x1A2D0"
},
"pci": {
"title": "Physical Cell ID",
"description": "Physical Cell ID",
"type": "number",
"default": 1
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the eNodeB, at most 6 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"attach_without_pdn": {
"default": false,
"title": "Attach Without PDN",
"description": "Optional boolean. Indicates if PLMN supports attach without PDN connectivity.",
"type": "boolean"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"inactivity_timer": {
"title": "Inactivity Timer",
"description": "Send RRC connection release after this time (in ms) of network inactivity.",
"type": "number",
"default": 10000
},
"use_ipv4": {
"default": false,
"title": "Use IPv4",
"description": "Set to true to use IPv4 for AMF / MME addresses",
"type": "boolean"
},
"enb_stats_fetch_period": {
"title": "eNB statistics fetch period (seconds)",
"description": "Describes how often a call to Amarisoft remote API is made to get eNB statistics",
"type": "number",
"default": 60
},
"max_rx_sample_db": {
"title": "Maximum RX sample value (dB)",
"description": "Maximum RX sample threshold above which RX saturated promise will fail",
"type": "number",
"default": 0
},
"min_txrx_delay": {
"title": "Minimum available time for radio front end processing (ms)",
"description": "Baseband latency promise will fail if minimum TX/RX diff reaches threshold (higher than this value)",
"type": "number",
"default": 5
},
"avg_txrx_delay": {
"title": "Average available time for radio front end processing (ms)",
"description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)",
"type": "number",
"default": 7
},
"promise_cpu_max_spot_temp": {
"title": "Maximum CPU spot temperature",
"description": "Maximum CPU spot temperature above which CPU temperature promise will fail",
"type": "number",
"default": 90
},
"promise_cpu_max_avg_temp": {
"title": "Maximum average CPU temperature",
"description": "If average temperature over specified period reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temp_period": {
"title": "Period of Average CPU temperature checks",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
},
"n_antenna_dl": {
"title": "Number of DL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of DL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number",
"default": 2
},
"n_antenna_ul": {
"title": "Number of UL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of UL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number",
"default": 2
},
"txa0cc00_active": {
"title": "Lopcomm ORAN TX array carriers (TXA0CC00)",
"description": "Activate or inactivate Lopcomm ORAN TX array carriers (TXA0CC00)",
"type": "string",
"default": "ACTIVE",
"enum": [
"ACTIVE",
"INACTIVE"
]
},
"rxa0cc00_active": {
"title": "Lopcomm ORAN RX array carriers (RXA0CC00)",
"description": "Activate or inactivate Lopcomm ORAN RX array carriers (RXA0CC00)",
"type": "string",
"default": "ACTIVE",
"enum": [
"ACTIVE",
"INACTIVE"
]
}
}
}
{
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters",
"properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"iperf3": {
"default": false,
"title": "iperf3 UDP server",
"description": "Activate iperf3 UDP server",
"type": "boolean"
},
"rrh": {
"title": "RRH",
"description": "RRH",
"type": "string",
"default": "SDR",
"enum": [
"SDR",
"M2RU Sunwave"
]
},
"tx_gain": {
"title": "Tx gain",
"description": "Tx gain (in dB)",
"type": "number",
"default": 60
},
"rx_gain": {
"title": "Rx gain",
"description": "Rx gain (in dB)",
"type": "number",
"default": 45
},
"dl_nr_arfcn": {
"title": "DL NR ARFCN",
"description": "Downlink NR Absolute Radio Frequency Channel Number of the cell",
"type": "number",
"default": 378000
},
"nr_band": {
"title": "NR band",
"description": "NR band number",
"type": "number",
"default": 39
},
"nr_bandwidth": {
"title": "Bandwidth",
"description": "Downlink Bandwidth (in MHz)",
"type": "number",
"default": 40
},
"amf_list": {
"title": "AMF list",
"description": "Optionnal. List of AMF to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"amf_addr": {
"title": "AMF Address",
"description": "IP address (and optional port) of NGAP SCTP connection to the AMF. The default port is 38412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"gnb_id": {
"title": "gNB ID",
"description": "gNB ID",
"type": "string",
"default": "0x12345"
},
"gnb_id_bits": {
"title": "gNB ID bits",
"description": "Number of bits for the gNodeB global identifier. (range 22 to 32)",
"type": "number",
"default": 28
},
"pci": {
"title": "Physical Cell ID",
"description": "Physical Cell ID",
"type": "number",
"default": 1
},
"ssb_pos_bitmap": {
"title": "SSB Position Bitmap",
"description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).",
"type": "string",
"default": 1000
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the gNodeB, at most 12 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"tac": {
"default": 100,
"title": "Tracking Area Code",
"description": "Integer (range 0 to 16777215)",
"type": "number"
},
"ranac": {
"title": "Optional integer (range 0 to 255)",
"description": "RAN Area Code",
"type": "number"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"nssai": {
"title": "AMF slices configuration",
"description": "AMF slices configuration.",
"patternProperties": {
".*": {
"properties": {
"sst": {
"default": 1,
"title": "Slice Service Type",
"description": "Integer (range 1 to 255).",
"type": "number"
},
"sd": {
"default": 50,
"title": "Slice Differentiator",
"description": "Optional integer (range 0 to 0xFFFFFE)",
"type": "number"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"inactivity_timer": {
"title": "Inactivity Timer",
"description": "Send RRC connection release after this time (in ms) of network inactivity.",
"type": "number",
"default": 10000
},
"use_ipv4": {
"default": false,
"title": "Use IPv4",
"description": "Set to true to use IPv4 for AMF / MME addresses",
"type": "boolean"
},
"gnb_stats_fetch_period": {
"title": "gNB statistics fetch period (seconds)",
"description": "Describes how often a call to Amarisoft remote API is made to get gNB statistics",
"type": "number",
"default": 60
},
"max_rx_sample_db": {
"title": "Maximum RX sample value (dB)",
"description": "Maximum RX sample threshold above which RX saturated promise will fail",
"type": "number",
"default": 0
},
"min_txrx_delay": {
"title": "Minimum available time for radio front end processing (ms)",
"description": "Minimum TX/RX diff threshold above which baseband latency promise will fail",
"type": "number",
"default": 5
},
"avg_txrx_delay": {
"title": "Average available time for radio front end processing (ms)",
"description": "Average TX/RX diff threshold above which baseband latency promise will fail",
"type": "number",
"default": 7
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
},
"n_antenna_dl": {
"title": "Number of DL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of DL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number",
"default": 2
},
"n_antenna_ul": {
"title": "Number of UL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of UL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number",
"default": 2
}
}
}
{
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters",
"properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"iperf3": {
"default": false,
"title": "iperf3 UDP server",
"description": "Activate iperf3 UDP server",
"type": "boolean"
},
"rrh": {
"title": "RRH",
"description": "RRH",
"type": "string",
"default": "SDR",
"enum": [
"SDR",
"Lopcomm ORAN"
]
},
"tx_gain": {
"title": "Tx gain",
"description": "Tx gain (in dB)",
"type": "number",
"default": 60
},
"rx_gain": {
"title": "Rx gain",
"description": "Rx gain (in dB)",
"type": "number",
"default": 45
},
"dl_earfcn": {
"title": "DL EARFCN",
"description": "Downlink E-UTRA Absolute Radio Frequency Channel Number of the cell",
"type": "number",
"default": 38050
},
"n_rb_dl": {
"title": "DL RB",
"description": "number of DL resource blocks",
"type": "number",
"default": 100
},
"mme_list": {
"title": "MME list",
"description": "Optionnal. List of MME to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"mme_addr": {
"title": "MME Address",
"description": "IP address (and optional port) of S1AP SCTP connection to the MME. The default port is 36412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"enb_id": {
"title": "eNB ID",
"description": "eNB ID",
"type": "string",
"default": "0x1A2D0"
},
"pci": {
"title": "Physical Cell ID",
"description": "Physical Cell ID",
"type": "number",
"default": 1
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the eNodeB, at most 6 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"attach_without_pdn": {
"default": false,
"title": "Attach Without PDN",
"description": "Optional boolean. Indicates if PLMN supports attach without PDN connectivity.",
"type": "boolean"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"inactivity_timer": {
"title": "Inactivity Timer",
"description": "Send RRC connection release after this time (in ms) of network inactivity.",
"type": "number",
"default": 10000
},
"use_ipv4": {
"default": false,
"title": "Use IPv4",
"description": "Set to true to use IPv4 for AMF / MME addresses",
"type": "boolean"
},
"enb_stats_fetch_period": {
"title": "eNB statistics fetch period (seconds)",
"description": "Describes how often a call to Amarisoft remote API is made to get eNB statistics",
"type": "number",
"default": 60
},
"max_rx_sample_db": {
"title": "Maximum RX sample value (dB)",
"description": "Maximum RX sample threshold above which RX saturated promise will fail",
"type": "number",
"default": 0
},
"min_txrx_delay": {
"title": "Minimum available time for radio front end processing (ms)",
"description": "Baseband latency promise will fail if minimum TX/RX diff reaches threshold (higher than this value)",
"type": "number",
"default": 5
},
"avg_txrx_delay": {
"title": "Average available time for radio front end processing (ms)",
"description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)",
"type": "number",
"default": 7
},
"promise_cpu_max_spot_temp": {
"title": "Maximum CPU spot temperature",
"description": "Maximum CPU spot temperature above which CPU temperature promise will fail",
"type": "number",
"default": 90
},
"promise_cpu_max_avg_temp": {
"title": "Maximum average CPU temperature",
"description": "If average temperature over specified period reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temp_period": {
"title": "Period of Average CPU temperature checks",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
},
"n_antenna_dl": {
"title": "Number of DL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of DL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number",
"default": 2
},
"n_antenna_ul": {
"title": "Number of UL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of UL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number",
"default": 2
},
"txa0cc00_active": {
"title": "Lopcomm ORAN TX array carriers (TXA0CC00)",
"description": "Activate or inactivate Lopcomm ORAN TX array carriers (TXA0CC00)",
"type": "string",
"default": "ACTIVE",
"enum": [
"ACTIVE",
"INACTIVE"
]
},
"rxa0cc00_active": {
"title": "Lopcomm ORAN RX array carriers (RXA0CC00)",
"description": "Activate or inactivate Lopcomm ORAN RX array carriers (RXA0CC00)",
"type": "string",
"default": "ACTIVE",
"enum": [
"ACTIVE",
"INACTIVE"
]
}
}
}
{
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters",
"properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"iperf3": {
"default": false,
"title": "iperf3 UDP server",
"description": "Activate iperf3 UDP server",
"type": "boolean"
},
"rrh": {
"title": "RRH",
"description": "RRH",
"type": "string",
"default": "SDR",
"enum": [
"SDR",
"M2RU Sunwave"
]
},
"tx_gain": {
"title": "Tx gain",
"description": "Tx gain (in dB)",
"type": "number",
"default": 60
},
"rx_gain": {
"title": "Rx gain",
"description": "Rx gain (in dB)",
"type": "number",
"default": 45
},
"dl_nr_arfcn": {
"title": "DL NR ARFCN",
"description": "Downlink NR Absolute Radio Frequency Channel Number of the cell",
"type": "number",
"default": 520000
},
"nr_band": {
"title": "NR band",
"description": "NR band number",
"type": "number",
"default": 38
},
"nr_bandwidth": {
"title": "Bandwidth",
"description": "Downlink Bandwidth (in MHz)",
"type": "number",
"default": 40
},
"amf_list": {
"title": "AMF list",
"description": "Optionnal. List of AMF to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"amf_addr": {
"title": "AMF Address",
"description": "IP address (and optional port) of NGAP SCTP connection to the AMF. The default port is 38412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"gnb_id": {
"title": "gNB ID",
"description": "gNB ID",
"type": "string",
"default": "0x12345"
},
"gnb_id_bits": {
"title": "gNB ID bits",
"description": "Number of bits for the gNodeB global identifier. (range 22 to 32)",
"type": "number",
"default": 28
},
"pci": {
"title": "Physical Cell ID",
"description": "Physical Cell ID",
"type": "number",
"default": 1
},
"ssb_pos_bitmap": {
"title": "SSB Position Bitmap",
"description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).",
"type": "string",
"default": 10000000
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the gNodeB, at most 12 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"tac": {
"default": 100,
"title": "Tracking Area Code",
"description": "Integer (range 0 to 16777215)",
"type": "number"
},
"ranac": {
"title": "Optional integer (range 0 to 255)",
"description": "RAN Area Code",
"type": "number"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"nssai": {
"title": "AMF slices configuration",
"description": "AMF slices configuration.",
"patternProperties": {
".*": {
"properties": {
"sst": {
"default": 1,
"title": "Slice Service Type",
"description": "Integer (range 1 to 255).",
"type": "number"
},
"sd": {
"default": 50,
"title": "Slice Differentiator",
"description": "Optional integer (range 0 to 0xFFFFFE)",
"type": "number"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"inactivity_timer": {
"title": "Inactivity Timer",
"description": "Send RRC connection release after this time (in ms) of network inactivity.",
"type": "number",
"default": 10000
},
"use_ipv4": {
"default": false,
"title": "Use IPv4",
"description": "Set to true to use IPv4 for AMF / MME addresses",
"type": "boolean"
},
"gnb_stats_fetch_period": {
"title": "gNB statistics fetch period (seconds)",
"description": "Describes how often a call to Amarisoft remote API is made to get gNB statistics",
"type": "number",
"default": 60
},
"max_rx_sample_db": {
"title": "Maximum RX sample value (dB)",
"description": "Maximum RX sample threshold above which RX saturated promise will fail",
"type": "number",
"default": 0
},
"min_txrx_delay": {
"title": "Minimum available time for radio front end processing (ms)",
"description": "Minimum TX/RX diff threshold above which baseband latency promise will fail",
"type": "number",
"default": 5
},
"avg_txrx_delay": {
"title": "Average available time for radio front end processing (ms)",
"description": "Average TX/RX diff threshold above which baseband latency promise will fail",
"type": "number",
"default": 7
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
},
"n_antenna_dl": {
"title": "Number of DL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of DL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number",
"default": 2
},
"n_antenna_ul": {
"title": "Number of UL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of UL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number",
"default": 2
}
}
}
{
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters",
"properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"iperf3": {
"default": false,
"title": "iperf3 UDP server",
"description": "Activate iperf3 UDP server",
"type": "boolean"
},
"rrh": {
"title": "RRH",
"description": "RRH",
"type": "string",
"default": "SDR",
"enum": [
"SDR",
"Lopcomm ORAN"
]
},
"tx_gain": {
"title": "Tx gain",
"description": "Tx gain (in dB)",
"type": "number",
"default": 60
},
"rx_gain": {
"title": "Rx gain",
"description": "Rx gain (in dB)",
"type": "number",
"default": 45
},
"dl_earfcn": {
"title": "DL EARFCN",
"description": "Downlink E-UTRA Absolute Radio Frequency Channel Number of the cell",
"type": "number",
"default": 42590
},
"n_rb_dl": {
"title": "DL RB",
"description": "number of DL resource blocks",
"type": "number",
"default": 100
},
"mme_list": {
"title": "MME list",
"description": "Optionnal. List of MME to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"mme_addr": {
"title": "MME Address",
"description": "IP address (and optional port) of S1AP SCTP connection to the MME. The default port is 36412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"enb_id": {
"title": "eNB ID",
"description": "eNB ID",
"type": "string",
"default": "0x1A2D0"
},
"pci": {
"title": "Physical Cell ID",
"description": "Physical Cell ID",
"type": "number",
"default": 1
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the eNodeB, at most 6 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"attach_without_pdn": {
"default": false,
"title": "Attach Without PDN",
"description": "Optional boolean. Indicates if PLMN supports attach without PDN connectivity.",
"type": "boolean"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"inactivity_timer": {
"title": "Inactivity Timer",
"description": "Send RRC connection release after this time (in ms) of network inactivity.",
"type": "number",
"default": 10000
},
"use_ipv4": {
"default": false,
"title": "Use IPv4",
"description": "Set to true to use IPv4 for AMF / MME addresses",
"type": "boolean"
},
"enb_stats_fetch_period": {
"title": "eNB statistics fetch period (seconds)",
"description": "Describes how often a call to Amarisoft remote API is made to get eNB statistics",
"type": "number",
"default": 60
},
"max_rx_sample_db": {
"title": "Maximum RX sample value (dB)",
"description": "Maximum RX sample threshold above which RX saturated promise will fail",
"type": "number",
"default": 0
},
"min_txrx_delay": {
"title": "Minimum available time for radio front end processing (ms)",
"description": "Baseband latency promise will fail if minimum TX/RX diff reaches threshold (higher than this value)",
"type": "number",
"default": 5
},
"avg_txrx_delay": {
"title": "Average available time for radio front end processing (ms)",
"description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)",
"type": "number",
"default": 7
},
"promise_cpu_max_spot_temp": {
"title": "Maximum CPU spot temperature",
"description": "Maximum CPU spot temperature above which CPU temperature promise will fail",
"type": "number",
"default": 90
},
"promise_cpu_max_avg_temp": {
"title": "Maximum average CPU temperature",
"description": "If average temperature over specified period reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temp_period": {
"title": "Period of Average CPU temperature checks",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
},
"n_antenna_dl": {
"title": "Number of DL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of DL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number",
"default": 2
},
"n_antenna_ul": {
"title": "Number of UL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of UL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number",
"default": 2
},
"txa0cc00_active": {
"title": "Lopcomm ORAN TX array carriers (TXA0CC00)",
"description": "Activate or inactivate Lopcomm ORAN TX array carriers (TXA0CC00)",
"type": "string",
"default": "ACTIVE",
"enum": [
"ACTIVE",
"INACTIVE"
]
},
"rxa0cc00_active": {
"title": "Lopcomm ORAN RX array carriers (RXA0CC00)",
"description": "Activate or inactivate Lopcomm ORAN RX array carriers (RXA0CC00)",
"type": "string",
"default": "ACTIVE",
"enum": [
"ACTIVE",
"INACTIVE"
]
}
}
}
{
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters",
"properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"iperf3": {
"default": false,
"title": "iperf3 UDP server",
"description": "Activate iperf3 UDP server",
"type": "boolean"
},
"rrh": {
"title": "RRH",
"description": "RRH",
"type": "string",
"default": "SDR",
"enum": [
"SDR",
"M2RU Sunwave"
]
},
"tx_gain": {
"title": "Tx gain",
"description": "Tx gain (in dB)",
"type": "number",
"default": 60
},
"rx_gain": {
"title": "Rx gain",
"description": "Rx gain (in dB)",
"type": "number",
"default": 45
},
"dl_nr_arfcn": {
"title": "DL NR ARFCN",
"description": "Downlink NR Absolute Radio Frequency Channel Number of the cell",
"type": "number",
"default": 632628
},
"nr_band": {
"title": "NR band",
"description": "NR band number",
"type": "number",
"default": 78
},
"nr_bandwidth": {
"title": "Bandwidth",
"description": "Downlink Bandwidth (in MHz)",
"type": "number",
"default": 40
},
"amf_list": {
"title": "AMF list",
"description": "Optionnal. List of AMF to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"amf_addr": {
"title": "AMF Address",
"description": "IP address (and optional port) of NGAP SCTP connection to the AMF. The default port is 38412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"gnb_id": {
"title": "gNB ID",
"description": "gNB ID",
"type": "string",
"default": "0x12345"
},
"gnb_id_bits": {
"title": "gNB ID bits",
"description": "Number of bits for the gNodeB global identifier. (range 22 to 32)",
"type": "number",
"default": 28
},
"pci": {
"title": "Physical Cell ID",
"description": "Physical Cell ID",
"type": "number",
"default": 1
},
"ssb_pos_bitmap": {
"title": "SSB Position Bitmap",
"description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).",
"type": "string",
"default": 10000000
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the gNodeB, at most 12 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"tac": {
"default": 100,
"title": "Tracking Area Code",
"description": "Integer (range 0 to 16777215)",
"type": "number"
},
"ranac": {
"title": "Optional integer (range 0 to 255)",
"description": "RAN Area Code",
"type": "number"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"nssai": {
"title": "AMF slices configuration",
"description": "AMF slices configuration.",
"patternProperties": {
".*": {
"properties": {
"sst": {
"default": 1,
"title": "Slice Service Type",
"description": "Integer (range 1 to 255).",
"type": "number"
},
"sd": {
"default": 50,
"title": "Slice Differentiator",
"description": "Optional integer (range 0 to 0xFFFFFE)",
"type": "number"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"inactivity_timer": {
"title": "Inactivity Timer",
"description": "Send RRC connection release after this time (in ms) of network inactivity.",
"type": "number",
"default": 10000
},
"use_ipv4": {
"default": false,
"title": "Use IPv4",
"description": "Set to true to use IPv4 for AMF / MME addresses",
"type": "boolean"
},
"gnb_stats_fetch_period": {
"title": "gNB statistics fetch period (seconds)",
"description": "Describes how often a call to Amarisoft remote API is made to get gNB statistics",
"type": "number",
"default": 60
},
"max_rx_sample_db": {
"title": "Maximum RX sample value (dB)",
"description": "Maximum RX sample threshold above which RX saturated promise will fail",
"type": "number",
"default": 0
},
"min_txrx_delay": {
"title": "Minimum available time for radio front end processing (ms)",
"description": "Minimum TX/RX diff threshold above which baseband latency promise will fail",
"type": "number",
"default": 5
},
"avg_txrx_delay": {
"title": "Average available time for radio front end processing (ms)",
"description": "Average TX/RX diff threshold above which baseband latency promise will fail",
"type": "number",
"default": 7
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
},
"n_antenna_dl": {
"title": "Number of DL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of DL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number",
"default": 2
},
"n_antenna_ul": {
"title": "Number of UL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of UL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number",
"default": 2
}
}
}
{
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters",
"properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"iperf3": {
"default": false,
"title": "iperf3 UDP server",
"description": "Activate iperf3 UDP server",
"type": "boolean"
},
"rrh": {
"title": "RRH",
"description": "RRH",
"type": "string",
"default": "SDR",
"enum": [
"SDR",
"Lopcomm ORAN"
]
},
"tx_gain": {
"title": "Tx gain",
"description": "Tx gain (in dB)",
"type": "number",
"default": 60
},
"rx_gain": {
"title": "Rx gain",
"description": "Rx gain (in dB)",
"type": "number",
"default": 45
},
"dl_earfcn": {
"title": "DL EARFCN",
"description": "Downlink E-UTRA Absolute Radio Frequency Channel Number of the cell",
"type": "number",
"default": 44590
},
"n_rb_dl": {
"title": "DL RB",
"description": "number of DL resource blocks",
"type": "number",
"default": 100
},
"mme_list": {
"title": "MME list",
"description": "Optionnal. List of MME to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"mme_addr": {
"title": "MME Address",
"description": "IP address (and optional port) of S1AP SCTP connection to the MME. The default port is 36412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"enb_id": {
"title": "eNB ID",
"description": "eNB ID",
"type": "string",
"default": "0x1A2D0"
},
"pci": {
"title": "Physical Cell ID",
"description": "Physical Cell ID",
"type": "number",
"default": 1
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the eNodeB, at most 6 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"attach_without_pdn": {
"default": false,
"title": "Attach Without PDN",
"description": "Optional boolean. Indicates if PLMN supports attach without PDN connectivity.",
"type": "boolean"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"inactivity_timer": {
"title": "Inactivity Timer",
"description": "Send RRC connection release after this time (in ms) of network inactivity.",
"type": "number",
"default": 10000
},
"use_ipv4": {
"default": false,
"title": "Use IPv4",
"description": "Set to true to use IPv4 for AMF / MME addresses",
"type": "boolean"
},
"enb_stats_fetch_period": {
"title": "eNB statistics fetch period (seconds)",
"description": "Describes how often a call to Amarisoft remote API is made to get eNB statistics",
"type": "number",
"default": 60
},
"max_rx_sample_db": {
"title": "Maximum RX sample value (dB)",
"description": "Maximum RX sample threshold above which RX saturated promise will fail",
"type": "number",
"default": 0
},
"min_txrx_delay": {
"title": "Minimum available time for radio front end processing (ms)",
"description": "Baseband latency promise will fail if minimum TX/RX diff reaches threshold (higher than this value)",
"type": "number",
"default": 5
},
"avg_txrx_delay": {
"title": "Average available time for radio front end processing (ms)",
"description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)",
"type": "number",
"default": 7
},
"promise_cpu_max_spot_temp": {
"title": "Maximum CPU spot temperature",
"description": "Maximum CPU spot temperature above which CPU temperature promise will fail",
"type": "number",
"default": 90
},
"promise_cpu_max_avg_temp": {
"title": "Maximum average CPU temperature",
"description": "If average temperature over specified period reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temp_period": {
"title": "Period of Average CPU temperature checks",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
},
"n_antenna_dl": {
"title": "Number of DL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of DL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number",
"default": 2
},
"n_antenna_ul": {
"title": "Number of UL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of UL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number",
"default": 2
},
"txa0cc00_active": {
"title": "Lopcomm ORAN TX array carriers (TXA0CC00)",
"description": "Activate or inactivate Lopcomm ORAN TX array carriers (TXA0CC00)",
"type": "string",
"default": "ACTIVE",
"enum": [
"ACTIVE",
"INACTIVE"
]
},
"rxa0cc00_active": {
"title": "Lopcomm ORAN RX array carriers (RXA0CC00)",
"description": "Activate or inactivate Lopcomm ORAN RX array carriers (RXA0CC00)",
"type": "string",
"default": "ACTIVE",
"enum": [
"ACTIVE",
"INACTIVE"
]
}
}
}
{
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters",
"properties": {
"epc_plmn": {
"default": "00101",
"title": "Core Network PLMN",
"description": "Core Network Public Land Mobile Network",
"type": "string"
},
"external_enb_gnb": {
"default": false,
"title": "External eNB / gNB",
"description": "Set to true if external eNB / gNB will need to connect to this core network.",
"type": "boolean"
},
"iperf3": {
"default": false,
"title": "iperf3 UDP server",
"description": "Activate iperf3 UDP server",
"type": "boolean"
},
"rrh": {
"title": "RRH",
"description": "RRH",
"type": "string",
"default": "SDR",
"enum": [
"SDR",
"M2RU Sunwave"
]
},
"tx_gain": {
"title": "Tx gain",
"description": "Tx gain (in dB)",
"type": "number",
"default": 60
},
"rx_gain": {
"title": "Rx gain",
"description": "Rx gain (in dB)",
"type": "number",
"default": 45
},
"dl_nr_arfcn": {
"title": "DL NR ARFCN",
"description": "Downlink NR Absolute Radio Frequency Channel Number of the cell",
"type": "number",
"default": 646666
},
"nr_band": {
"title": "NR band",
"description": "NR band number",
"type": "number",
"default": 78
},
"nr_bandwidth": {
"title": "Bandwidth",
"description": "Downlink Bandwidth (in MHz)",
"type": "number",
"default": 40
},
"amf_list": {
"title": "AMF list",
"description": "Optionnal. List of AMF to which the gNodeB is connected",
"patternProperties": {
".*": {
"properties": {
"amf_addr": {
"title": "AMF Address",
"description": "IP address (and optional port) of NGAP SCTP connection to the AMF. The default port is 38412.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"gnb_id": {
"title": "gNB ID",
"description": "gNB ID",
"type": "string",
"default": "0x12345"
},
"gnb_id_bits": {
"title": "gNB ID bits",
"description": "Number of bits for the gNodeB global identifier. (range 22 to 32)",
"type": "number",
"default": 28
},
"pci": {
"title": "Physical Cell ID",
"description": "Physical Cell ID",
"type": "number",
"default": 1
},
"ssb_pos_bitmap": {
"title": "SSB Position Bitmap",
"description": "SSB position bitmap in bits (4, 8 or 64 bits depending on the DL frequency).",
"type": "string",
"default": 10000000
},
"plmn_list": {
"title": "PLMN list",
"description": "List of PLMNs broadcasted by the gNodeB, at most 12 (default: 00101)",
"patternProperties": {
".*": {
"properties": {
"plmn": {
"default": "00101",
"title": "Public Land Mobile Network",
"description": "Public Land Mobile Network",
"type": "string"
},
"tac": {
"default": 100,
"title": "Tracking Area Code",
"description": "Integer (range 0 to 16777215)",
"type": "number"
},
"ranac": {
"title": "Optional integer (range 0 to 255)",
"description": "RAN Area Code",
"type": "number"
},
"reserved": {
"default": false,
"title": "Reserved",
"description": "True if the cell is reserved for operator use.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"nssai": {
"title": "AMF slices configuration",
"description": "AMF slices configuration.",
"patternProperties": {
".*": {
"properties": {
"sst": {
"default": 1,
"title": "Slice Service Type",
"description": "Integer (range 1 to 255).",
"type": "number"
},
"sd": {
"default": 50,
"title": "Slice Differentiator",
"description": "Optional integer (range 0 to 0xFFFFFE)",
"type": "number"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"inactivity_timer": {
"title": "Inactivity Timer",
"description": "Send RRC connection release after this time (in ms) of network inactivity.",
"type": "number",
"default": 10000
},
"use_ipv4": {
"default": false,
"title": "Use IPv4",
"description": "Set to true to use IPv4 for AMF / MME addresses",
"type": "boolean"
},
"gnb_stats_fetch_period": {
"title": "gNB statistics fetch period (seconds)",
"description": "Describes how often a call to Amarisoft remote API is made to get gNB statistics",
"type": "number",
"default": 60
},
"max_rx_sample_db": {
"title": "Maximum RX sample value (dB)",
"description": "Maximum RX sample threshold above which RX saturated promise will fail",
"type": "number",
"default": 0
},
"min_txrx_delay": {
"title": "Minimum available time for radio front end processing (ms)",
"description": "Minimum TX/RX diff threshold above which baseband latency promise will fail",
"type": "number",
"default": 5
},
"avg_txrx_delay": {
"title": "Average available time for radio front end processing (ms)",
"description": "Average TX/RX diff threshold above which baseband latency promise will fail",
"type": "number",
"default": 7
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
},
"n_antenna_dl": {
"title": "Number of DL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of DL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number",
"default": 2
},
"n_antenna_ul": {
"title": "Number of UL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of UL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number",
"default": 2
}
}
}
...@@ -25,7 +25,7 @@ context = ...@@ -25,7 +25,7 @@ context =
raw buildout_directory ${buildout:directory} raw buildout_directory ${buildout:directory}
section slap_connection slap-connection section slap_connection slap-connection
key slapparameter_dict slap-configuration:configuration key slapparameter_dict slap-configuration:configuration
key epc_ipv4 ethernet-ip:ipv4 key lan_ipv4 lan-ip:ipv4
$${:extra-context} $${:extra-context}
[amarisoft] [amarisoft]
...@@ -45,7 +45,7 @@ init = ...@@ -45,7 +45,7 @@ init =
options['ims'] = path + "/ims" options['ims'] = path + "/ims"
options['ue'] = path + "/ue" options['ue'] = path + "/ue"
[ethernet-ip] [lan-ip]
recipe = slapos.recipe.build recipe = slapos.recipe.build
init = init =
import netifaces import netifaces
...@@ -60,47 +60,30 @@ init = ...@@ -60,47 +60,30 @@ init =
[switch-softwaretype] [switch-softwaretype]
recipe = slapos.cookbook:switch-softwaretype recipe = slapos.cookbook:switch-softwaretype
enb-epc = dynamic-template-lte-enb-epc:output enb = dynamic-template-enb:output
gnb-epc = dynamic-template-lte-gnb-epc:output gnb = dynamic-template-gnb:output
epc = dynamic-template-lte-epc:output core-network = dynamic-template-core-network:output
enb = dynamic-template-lte-enb:output ue-lte = dynamic-template-ue-lte:output
gnb = dynamic-template-lte-gnb:output ue-nr = dynamic-template-ue-nr:output
mme = dynamic-template-lte-mme:output RootSoftwareInstance = $${:core-network}
ue-lte = dynamic-template-lte-ue-lte:output obsolete = dynamic-template-obsolete:output
ue-nr = dynamic-template-lte-ue-nr:output enb-epc = $${:obsolete}
RootSoftwareInstance = $${:enb-epc} gnb-epc = $${:obsolete}
epc = $${:obsolete}
mme = $${:obsolete}
[dynamic-template-lte-enb-epc] [dynamic-template-obsolete]
< = jinja2-template-base < = jinja2-template-base
url = ${template-lte-enb-epc:target} url = ${template-obsolete:target}
filename = instance-lte-enb-epc.cfg filename = instance-obsolete.cfg
extensions = jinja2.ext.do extensions = jinja2.ext.do
extra-context = extra-context =
raw monitor_template ${monitor2-template:output}
key slave_instance_list slap-configuration:slave-instance-list
[dynamic-template-lte-gnb-epc]
< = jinja2-template-base
url = ${template-lte-gnb-epc:target}
filename = instance-lte-gnb-epc.cfg
extensions = jinja2.ext.do
extra-context =
raw monitor_template ${monitor2-template:output}
key slave_instance_list slap-configuration:slave-instance-list key slave_instance_list slap-configuration:slave-instance-list
[dynamic-template-lte-epc] [dynamic-template-enb]
< = jinja2-template-base < = jinja2-template-base
url = ${template-lte-epc:target} url = ${template-enb:target}
filename = instance-lte-epc.cfg filename = instance-enb.cfg
extensions = jinja2.ext.do
extra-context =
raw monitor_template ${monitor2-template:output}
key slave_instance_list slap-configuration:slave-instance-list
[dynamic-template-lte-enb]
< = jinja2-template-base
url = ${template-lte-enb:target}
filename = instance-lte-enb.cfg
extensions = jinja2.ext.do extensions = jinja2.ext.do
extra-context = extra-context =
raw monitor_template ${monitor2-template:output} raw monitor_template ${monitor2-template:output}
...@@ -128,10 +111,10 @@ extra-context = ...@@ -128,10 +111,10 @@ extra-context =
raw min_frequency ${default-params:min-frequency} raw min_frequency ${default-params:min-frequency}
raw max_frequency ${default-params:max-frequency} raw max_frequency ${default-params:max-frequency}
[dynamic-template-lte-gnb] [dynamic-template-gnb]
< = jinja2-template-base < = jinja2-template-base
url = ${template-lte-gnb:target} url = ${template-gnb:target}
filename = instance-lte-gnb.cfg filename = instance-gnb.cfg
extensions = jinja2.ext.do extensions = jinja2.ext.do
extra-context = extra-context =
raw monitor_template ${monitor2-template:output} raw monitor_template ${monitor2-template:output}
...@@ -156,10 +139,10 @@ extra-context = ...@@ -156,10 +139,10 @@ extra-context =
raw max_frequency ${default-params:max-frequency} raw max_frequency ${default-params:max-frequency}
raw python_path ${python3:location} raw python_path ${python3:location}
[dynamic-template-lte-mme] [dynamic-template-core-network]
< = jinja2-template-base < = jinja2-template-base
url = ${template-lte-mme:target} url = ${template-core-network:target}
filename = instance-lte-mme.cfg filename = instance-core-network.cfg
extensions = jinja2.ext.do extensions = jinja2.ext.do
extra-context = extra-context =
raw monitor_template ${monitor2-template:output} raw monitor_template ${monitor2-template:output}
...@@ -171,11 +154,12 @@ extra-context = ...@@ -171,11 +154,12 @@ extra-context =
raw nghttp2_location ${nghttp2:location} raw nghttp2_location ${nghttp2:location}
raw iperf3_location ${iperf3:location} raw iperf3_location ${iperf3:location}
key ue_db_path ue-db-config:output key ue_db_path ue-db-config:output
key slave_instance_list slap-configuration:slave-instance-list
[dynamic-template-lte-ue-lte] [dynamic-template-ue-lte]
< = jinja2-template-base < = jinja2-template-base
url = ${template-lte-ue-lte:target} url = ${template-ue-lte:target}
filename = instance-lte-ue-lte.cfg filename = instance-ue-lte.cfg
extensions = jinja2.ext.do extensions = jinja2.ext.do
extra-context = extra-context =
raw monitor_template ${monitor2-template:output} raw monitor_template ${monitor2-template:output}
...@@ -194,10 +178,10 @@ extra-context = ...@@ -194,10 +178,10 @@ extra-context =
raw default_lte_imsi ${default-params:default-lte-imsi} raw default_lte_imsi ${default-params:default-lte-imsi}
raw default_lte_k ${default-params:default-lte-k} raw default_lte_k ${default-params:default-lte-k}
[dynamic-template-lte-ue-nr] [dynamic-template-ue-nr]
< = jinja2-template-base < = jinja2-template-base
url = ${template-lte-ue-nr:target} url = ${template-ue-nr:target}
filename = instance-lte-ue-nr.cfg filename = instance-ue-nr.cfg
extensions = jinja2.ext.do extensions = jinja2.ext.do
extra-context = extra-context =
raw monitor_template ${monitor2-template:output} raw monitor_template ${monitor2-template:output}
...@@ -225,4 +209,4 @@ extensions = jinja2.ext.do ...@@ -225,4 +209,4 @@ extensions = jinja2.ext.do
output = $${buildout:directory}/$${:filename} output = $${buildout:directory}/$${:filename}
context = context =
import json_module json import json_module json
key slave_instance_list slap-configuration:configuration.slave-list key slave_instance_list slap-configuration:slave-instance-list
...@@ -95,14 +95,12 @@ for i in range (4): ...@@ -95,14 +95,12 @@ for i in range (4):
with open('software.cfg.json.jinja2', 'r') as f: with open('software.cfg.json.jinja2', 'r') as f:
software_json_template = Template(f.read()) software_json_template = Template(f.read())
with open('instance-enb-input-schema.json.jinja2', 'r') as f:
instance_enb_json_template = Template(f.read()) instance_json_template_map = {}
with open('instance-gnb-input-schema.json.jinja2', 'r') as f: for software_type in ['enb', 'gnb', 'ue-lte', 'ue-nr']:
instance_gnb_json_template = Template(f.read()) with open('instance-{}-input-schema.json.jinja2'.format(software_type), 'r') as f:
with open('instance-ue-lte-input-schema.json.jinja2', 'r') as f: instance_json_template_map[software_type] = Template(f.read())
instance_ue_lte_json_template = Template(f.read())
with open('instance-ue-nr-input-schema.json.jinja2', 'r') as f:
instance_ue_nr_json_template = Template(f.read())
with open('software.jinja2.cfg', 'r') as f: with open('software.jinja2.cfg', 'r') as f:
software_template = Template(f.read()) software_template = Template(f.read())
with open('test/test.jinja2.py', 'r') as f: with open('test/test.jinja2.py', 'r') as f:
...@@ -118,17 +116,9 @@ for rf_mode_context in rf_mode_context_list: ...@@ -118,17 +116,9 @@ for rf_mode_context in rf_mode_context_list:
with open('software-{}.cfg'.format(rf_mode_context['rf_mode']), with open('software-{}.cfg'.format(rf_mode_context['rf_mode']),
'w+') as f: 'w+') as f:
f.write(software_template.render(**rf_mode_context, **global_context) + '\n') f.write(software_template.render(**rf_mode_context, **global_context) + '\n')
for software_type in ['enb', 'enb-epc', 'gnb', 'gnb-epc', 'ue-lte', 'ue-nr']: for software_type in ['enb', 'gnb', 'ue-lte', 'ue-nr']:
with open('instance-{}-{}-input-schema.json'.format( with open('instance-{}-{}-input-schema.json'.format(
rf_mode_context['rf_mode'], rf_mode_context['rf_mode'],
software_type), software_type),
'w+') as f: 'w+') as f:
if software_type in ['enb', 'enb-epc']: f.write(instance_json_template_map[software_type].render(**rf_mode_context, **global_context) + '\n')
f.write(instance_enb_json_template.render(**rf_mode_context, **global_context, epc='epc' in software_type) + '\n')
elif software_type in ['gnb', 'gnb-epc']:
f.write(instance_gnb_json_template.render(**rf_mode_context, **global_context, epc='epc' in software_type) + '\n')
elif software_type in ['ue-lte']:
f.write(instance_ue_lte_json_template.render(**rf_mode_context, **global_context) + '\n')
else:
f.write(instance_ue_nr_json_template.render(**rf_mode_context, **global_context) + '\n')
...@@ -11,64 +11,30 @@ ...@@ -11,64 +11,30 @@
"response": "instance-tdd1900-enb-schema.json", "response": "instance-tdd1900-enb-schema.json",
"index": 0 "index": 0
}, },
"enb-epc": {
"title": "eNB and EPC",
"software-type": "enb-epc",
"description": "eNodeB and EPC Configuration",
"request": "instance-tdd1900-enb-epc-input-schema.json",
"response": "instance-tdd1900-enb-epc-schema.json",
"index": 1
},
"gnb": { "gnb": {
"title": "gNB", "title": "gNB",
"software-type": "gnb", "software-type": "gnb",
"description": "gNodeB Configuration", "description": "gNodeB Configuration",
"request": "instance-tdd1900-gnb-input-schema.json", "request": "instance-tdd1900-gnb-input-schema.json",
"response": "instance-tdd1900-gnb-schema.json", "response": "instance-tdd1900-gnb-schema.json",
"index": 2 "index": 1
},
"gnb-epc": {
"title": "gNB and EPC",
"software-type": "gnb-epc",
"description": "gNodeB and EPC Configuration",
"request": "instance-tdd1900-gnb-epc-input-schema.json",
"response": "instance-tdd1900-gnb-epc-schema.json",
"index": 3
},
"epc": {
"title": "EPC",
"software-type": "epc",
"description": "EPC Configuration",
"request": "instance-epc-input-schema.json",
"response": "instance-epc-schema.json",
"index": 4
},
"gnb-epc-slave": {
"title": "gNB-EPC Sim Card",
"description": "gNB-EPC Sim Card Configuration",
"software-type": "gnb-epc",
"request": "instance-gnb-epc-slave-input-schema.json",
"response": "instance-gnb-epc-slave-schema.json",
"shared": true,
"index": 5
}, },
"enb-epc-slave": { "core-network": {
"title": "eNB-EPC Sim Card", "title": "Core Network",
"description": "eNB-EPC Sim Card Configuration", "software-type": "core-network",
"software-type": "enb-epc", "description": "Core Network Configuration",
"request": "instance-enb-epc-slave-input-schema.json", "request": "instance-core-network-input-schema.json",
"response": "instance-enb-epc-slave-schema.json", "response": "instance-core-network-schema.json",
"shared": true, "index": 2
"index": 6
}, },
"epc-slave": { "core-network-slave": {
"title": "EPC Sim Card", "title": "Core Network Sim Card",
"description": "EPC Sim Card Configuration", "description": "Core Network Sim Card Configuration",
"software-type": "epc", "software-type": "core-network",
"request": "instance-epc-slave-input-schema.json", "request": "instance-core-network-slave-input-schema.json",
"response": "instance-epc-slave-schema.json", "response": "instance-core-network-slave-schema.json",
"shared": true, "shared": true,
"index": 7 "index": 3
}, },
"ue-lte": { "ue-lte": {
"title": "UE-LTE", "title": "UE-LTE",
...@@ -76,7 +42,7 @@ ...@@ -76,7 +42,7 @@
"software-type": "ue-lte", "software-type": "ue-lte",
"request": "instance-tdd1900-ue-lte-input-schema.json", "request": "instance-tdd1900-ue-lte-input-schema.json",
"response": "instance-tdd1900-ue-lte-schema.json", "response": "instance-tdd1900-ue-lte-schema.json",
"index": 8 "index": 4
}, },
"ue-nr": { "ue-nr": {
"title": "UE-NR", "title": "UE-NR",
...@@ -84,7 +50,7 @@ ...@@ -84,7 +50,7 @@
"software-type": "ue-nr", "software-type": "ue-nr",
"request": "instance-tdd1900-ue-nr-input-schema.json", "request": "instance-tdd1900-ue-nr-input-schema.json",
"response": "instance-tdd1900-ue-nr-schema.json", "response": "instance-tdd1900-ue-nr-schema.json",
"index": 9 "index": 5
} }
} }
} }
...@@ -11,64 +11,30 @@ ...@@ -11,64 +11,30 @@
"response": "instance-tdd2600-enb-schema.json", "response": "instance-tdd2600-enb-schema.json",
"index": 0 "index": 0
}, },
"enb-epc": {
"title": "eNB and EPC",
"software-type": "enb-epc",
"description": "eNodeB and EPC Configuration",
"request": "instance-tdd2600-enb-epc-input-schema.json",
"response": "instance-tdd2600-enb-epc-schema.json",
"index": 1
},
"gnb": { "gnb": {
"title": "gNB", "title": "gNB",
"software-type": "gnb", "software-type": "gnb",
"description": "gNodeB Configuration", "description": "gNodeB Configuration",
"request": "instance-tdd2600-gnb-input-schema.json", "request": "instance-tdd2600-gnb-input-schema.json",
"response": "instance-tdd2600-gnb-schema.json", "response": "instance-tdd2600-gnb-schema.json",
"index": 2 "index": 1
},
"gnb-epc": {
"title": "gNB and EPC",
"software-type": "gnb-epc",
"description": "gNodeB and EPC Configuration",
"request": "instance-tdd2600-gnb-epc-input-schema.json",
"response": "instance-tdd2600-gnb-epc-schema.json",
"index": 3
},
"epc": {
"title": "EPC",
"software-type": "epc",
"description": "EPC Configuration",
"request": "instance-epc-input-schema.json",
"response": "instance-epc-schema.json",
"index": 4
},
"gnb-epc-slave": {
"title": "gNB-EPC Sim Card",
"description": "gNB-EPC Sim Card Configuration",
"software-type": "gnb-epc",
"request": "instance-gnb-epc-slave-input-schema.json",
"response": "instance-gnb-epc-slave-schema.json",
"shared": true,
"index": 5
}, },
"enb-epc-slave": { "core-network": {
"title": "eNB-EPC Sim Card", "title": "Core Network",
"description": "eNB-EPC Sim Card Configuration", "software-type": "core-network",
"software-type": "enb-epc", "description": "Core Network Configuration",
"request": "instance-enb-epc-slave-input-schema.json", "request": "instance-core-network-input-schema.json",
"response": "instance-enb-epc-slave-schema.json", "response": "instance-core-network-schema.json",
"shared": true, "index": 2
"index": 6
}, },
"epc-slave": { "core-network-slave": {
"title": "EPC Sim Card", "title": "Core Network Sim Card",
"description": "EPC Sim Card Configuration", "description": "Core Network Sim Card Configuration",
"software-type": "epc", "software-type": "core-network",
"request": "instance-epc-slave-input-schema.json", "request": "instance-core-network-slave-input-schema.json",
"response": "instance-epc-slave-schema.json", "response": "instance-core-network-slave-schema.json",
"shared": true, "shared": true,
"index": 7 "index": 3
}, },
"ue-lte": { "ue-lte": {
"title": "UE-LTE", "title": "UE-LTE",
...@@ -76,7 +42,7 @@ ...@@ -76,7 +42,7 @@
"software-type": "ue-lte", "software-type": "ue-lte",
"request": "instance-tdd2600-ue-lte-input-schema.json", "request": "instance-tdd2600-ue-lte-input-schema.json",
"response": "instance-tdd2600-ue-lte-schema.json", "response": "instance-tdd2600-ue-lte-schema.json",
"index": 8 "index": 4
}, },
"ue-nr": { "ue-nr": {
"title": "UE-NR", "title": "UE-NR",
...@@ -84,7 +50,7 @@ ...@@ -84,7 +50,7 @@
"software-type": "ue-nr", "software-type": "ue-nr",
"request": "instance-tdd2600-ue-nr-input-schema.json", "request": "instance-tdd2600-ue-nr-input-schema.json",
"response": "instance-tdd2600-ue-nr-schema.json", "response": "instance-tdd2600-ue-nr-schema.json",
"index": 9 "index": 5
} }
} }
} }
...@@ -11,64 +11,30 @@ ...@@ -11,64 +11,30 @@
"response": "instance-tdd3500-enb-schema.json", "response": "instance-tdd3500-enb-schema.json",
"index": 0 "index": 0
}, },
"enb-epc": {
"title": "eNB and EPC",
"software-type": "enb-epc",
"description": "eNodeB and EPC Configuration",
"request": "instance-tdd3500-enb-epc-input-schema.json",
"response": "instance-tdd3500-enb-epc-schema.json",
"index": 1
},
"gnb": { "gnb": {
"title": "gNB", "title": "gNB",
"software-type": "gnb", "software-type": "gnb",
"description": "gNodeB Configuration", "description": "gNodeB Configuration",
"request": "instance-tdd3500-gnb-input-schema.json", "request": "instance-tdd3500-gnb-input-schema.json",
"response": "instance-tdd3500-gnb-schema.json", "response": "instance-tdd3500-gnb-schema.json",
"index": 2 "index": 1
},
"gnb-epc": {
"title": "gNB and EPC",
"software-type": "gnb-epc",
"description": "gNodeB and EPC Configuration",
"request": "instance-tdd3500-gnb-epc-input-schema.json",
"response": "instance-tdd3500-gnb-epc-schema.json",
"index": 3
},
"epc": {
"title": "EPC",
"software-type": "epc",
"description": "EPC Configuration",
"request": "instance-epc-input-schema.json",
"response": "instance-epc-schema.json",
"index": 4
},
"gnb-epc-slave": {
"title": "gNB-EPC Sim Card",
"description": "gNB-EPC Sim Card Configuration",
"software-type": "gnb-epc",
"request": "instance-gnb-epc-slave-input-schema.json",
"response": "instance-gnb-epc-slave-schema.json",
"shared": true,
"index": 5
}, },
"enb-epc-slave": { "core-network": {
"title": "eNB-EPC Sim Card", "title": "Core Network",
"description": "eNB-EPC Sim Card Configuration", "software-type": "core-network",
"software-type": "enb-epc", "description": "Core Network Configuration",
"request": "instance-enb-epc-slave-input-schema.json", "request": "instance-core-network-input-schema.json",
"response": "instance-enb-epc-slave-schema.json", "response": "instance-core-network-schema.json",
"shared": true, "index": 2
"index": 6
}, },
"epc-slave": { "core-network-slave": {
"title": "EPC Sim Card", "title": "Core Network Sim Card",
"description": "EPC Sim Card Configuration", "description": "Core Network Sim Card Configuration",
"software-type": "epc", "software-type": "core-network",
"request": "instance-epc-slave-input-schema.json", "request": "instance-core-network-slave-input-schema.json",
"response": "instance-epc-slave-schema.json", "response": "instance-core-network-slave-schema.json",
"shared": true, "shared": true,
"index": 7 "index": 3
}, },
"ue-lte": { "ue-lte": {
"title": "UE-LTE", "title": "UE-LTE",
...@@ -76,7 +42,7 @@ ...@@ -76,7 +42,7 @@
"software-type": "ue-lte", "software-type": "ue-lte",
"request": "instance-tdd3500-ue-lte-input-schema.json", "request": "instance-tdd3500-ue-lte-input-schema.json",
"response": "instance-tdd3500-ue-lte-schema.json", "response": "instance-tdd3500-ue-lte-schema.json",
"index": 8 "index": 4
}, },
"ue-nr": { "ue-nr": {
"title": "UE-NR", "title": "UE-NR",
...@@ -84,7 +50,7 @@ ...@@ -84,7 +50,7 @@
"software-type": "ue-nr", "software-type": "ue-nr",
"request": "instance-tdd3500-ue-nr-input-schema.json", "request": "instance-tdd3500-ue-nr-input-schema.json",
"response": "instance-tdd3500-ue-nr-schema.json", "response": "instance-tdd3500-ue-nr-schema.json",
"index": 9 "index": 5
} }
} }
} }
...@@ -11,64 +11,30 @@ ...@@ -11,64 +11,30 @@
"response": "instance-tdd3700-enb-schema.json", "response": "instance-tdd3700-enb-schema.json",
"index": 0 "index": 0
}, },
"enb-epc": {
"title": "eNB and EPC",
"software-type": "enb-epc",
"description": "eNodeB and EPC Configuration",
"request": "instance-tdd3700-enb-epc-input-schema.json",
"response": "instance-tdd3700-enb-epc-schema.json",
"index": 1
},
"gnb": { "gnb": {
"title": "gNB", "title": "gNB",
"software-type": "gnb", "software-type": "gnb",
"description": "gNodeB Configuration", "description": "gNodeB Configuration",
"request": "instance-tdd3700-gnb-input-schema.json", "request": "instance-tdd3700-gnb-input-schema.json",
"response": "instance-tdd3700-gnb-schema.json", "response": "instance-tdd3700-gnb-schema.json",
"index": 2 "index": 1
},
"gnb-epc": {
"title": "gNB and EPC",
"software-type": "gnb-epc",
"description": "gNodeB and EPC Configuration",
"request": "instance-tdd3700-gnb-epc-input-schema.json",
"response": "instance-tdd3700-gnb-epc-schema.json",
"index": 3
},
"epc": {
"title": "EPC",
"software-type": "epc",
"description": "EPC Configuration",
"request": "instance-epc-input-schema.json",
"response": "instance-epc-schema.json",
"index": 4
},
"gnb-epc-slave": {
"title": "gNB-EPC Sim Card",
"description": "gNB-EPC Sim Card Configuration",
"software-type": "gnb-epc",
"request": "instance-gnb-epc-slave-input-schema.json",
"response": "instance-gnb-epc-slave-schema.json",
"shared": true,
"index": 5
}, },
"enb-epc-slave": { "core-network": {
"title": "eNB-EPC Sim Card", "title": "Core Network",
"description": "eNB-EPC Sim Card Configuration", "software-type": "core-network",
"software-type": "enb-epc", "description": "Core Network Configuration",
"request": "instance-enb-epc-slave-input-schema.json", "request": "instance-core-network-input-schema.json",
"response": "instance-enb-epc-slave-schema.json", "response": "instance-core-network-schema.json",
"shared": true, "index": 2
"index": 6
}, },
"epc-slave": { "core-network-slave": {
"title": "EPC Sim Card", "title": "Core Network Sim Card",
"description": "EPC Sim Card Configuration", "description": "Core Network Sim Card Configuration",
"software-type": "epc", "software-type": "core-network",
"request": "instance-epc-slave-input-schema.json", "request": "instance-core-network-slave-input-schema.json",
"response": "instance-epc-slave-schema.json", "response": "instance-core-network-slave-schema.json",
"shared": true, "shared": true,
"index": 7 "index": 3
}, },
"ue-lte": { "ue-lte": {
"title": "UE-LTE", "title": "UE-LTE",
...@@ -76,7 +42,7 @@ ...@@ -76,7 +42,7 @@
"software-type": "ue-lte", "software-type": "ue-lte",
"request": "instance-tdd3700-ue-lte-input-schema.json", "request": "instance-tdd3700-ue-lte-input-schema.json",
"response": "instance-tdd3700-ue-lte-schema.json", "response": "instance-tdd3700-ue-lte-schema.json",
"index": 8 "index": 4
}, },
"ue-nr": { "ue-nr": {
"title": "UE-NR", "title": "UE-NR",
...@@ -84,7 +50,7 @@ ...@@ -84,7 +50,7 @@
"software-type": "ue-nr", "software-type": "ue-nr",
"request": "instance-tdd3700-ue-nr-input-schema.json", "request": "instance-tdd3700-ue-nr-input-schema.json",
"response": "instance-tdd3700-ue-nr-schema.json", "response": "instance-tdd3700-ue-nr-schema.json",
"index": 9 "index": 5
} }
} }
} }
...@@ -60,28 +60,22 @@ url = ${:_profile_base_location_}/${:_update_hash_filename_} ...@@ -60,28 +60,22 @@ url = ${:_profile_base_location_}/${:_update_hash_filename_}
[lopcomm-rrh-config.jinja2.py] [lopcomm-rrh-config.jinja2.py]
<= download-base <= download-base
[template-lte-enb-epc] [template-enb]
<= download-base <= download-base
[template-lte-gnb-epc] [template-gnb]
<= download-base <= download-base
[template-lte-epc] [template-core-network]
<= download-base <= download-base
[template-lte-enb] [template-ue-lte]
<= download-base <= download-base
[template-lte-gnb] [template-ue-nr]
<= download-base <= download-base
[template-lte-mme] [template-obsolete]
<= download-base
[template-lte-ue-lte]
<= download-base
[template-lte-ue-nr]
<= download-base <= download-base
[copy-to-instance] [copy-to-instance]
......
...@@ -11,64 +11,30 @@ ...@@ -11,64 +11,30 @@
"response": "instance-{{ rf_mode }}-enb-schema.json", "response": "instance-{{ rf_mode }}-enb-schema.json",
"index": 0 "index": 0
}, },
"enb-epc": {
"title": "eNB and EPC",
"software-type": "enb-epc",
"description": "eNodeB and EPC Configuration",
"request": "instance-{{ rf_mode }}-enb-epc-input-schema.json",
"response": "instance-{{ rf_mode }}-enb-epc-schema.json",
"index": 1
},
"gnb": { "gnb": {
"title": "gNB", "title": "gNB",
"software-type": "gnb", "software-type": "gnb",
"description": "gNodeB Configuration", "description": "gNodeB Configuration",
"request": "instance-{{ rf_mode }}-gnb-input-schema.json", "request": "instance-{{ rf_mode }}-gnb-input-schema.json",
"response": "instance-{{ rf_mode }}-gnb-schema.json", "response": "instance-{{ rf_mode }}-gnb-schema.json",
"index": 2 "index": 1
},
"gnb-epc": {
"title": "gNB and EPC",
"software-type": "gnb-epc",
"description": "gNodeB and EPC Configuration",
"request": "instance-{{ rf_mode }}-gnb-epc-input-schema.json",
"response": "instance-{{ rf_mode }}-gnb-epc-schema.json",
"index": 3
},
"epc": {
"title": "EPC",
"software-type": "epc",
"description": "EPC Configuration",
"request": "instance-epc-input-schema.json",
"response": "instance-epc-schema.json",
"index": 4
},
"gnb-epc-slave": {
"title": "gNB-EPC Sim Card",
"description": "gNB-EPC Sim Card Configuration",
"software-type": "gnb-epc",
"request": "instance-gnb-epc-slave-input-schema.json",
"response": "instance-gnb-epc-slave-schema.json",
"shared": true,
"index": 5
}, },
"enb-epc-slave": { "core-network": {
"title": "eNB-EPC Sim Card", "title": "Core Network",
"description": "eNB-EPC Sim Card Configuration", "software-type": "core-network",
"software-type": "enb-epc", "description": "Core Network Configuration",
"request": "instance-enb-epc-slave-input-schema.json", "request": "instance-core-network-input-schema.json",
"response": "instance-enb-epc-slave-schema.json", "response": "instance-core-network-schema.json",
"shared": true, "index": 2
"index": 6
}, },
"epc-slave": { "core-network-slave": {
"title": "EPC Sim Card", "title": "Core Network Sim Card",
"description": "EPC Sim Card Configuration", "description": "Core Network Sim Card Configuration",
"software-type": "epc", "software-type": "core-network",
"request": "instance-epc-slave-input-schema.json", "request": "instance-core-network-slave-input-schema.json",
"response": "instance-epc-slave-schema.json", "response": "instance-core-network-slave-schema.json",
"shared": true, "shared": true,
"index": 7 "index": 3
}, },
"ue-lte": { "ue-lte": {
"title": "UE-LTE", "title": "UE-LTE",
...@@ -76,7 +42,7 @@ ...@@ -76,7 +42,7 @@
"software-type": "ue-lte", "software-type": "ue-lte",
"request": "instance-{{ rf_mode }}-ue-lte-input-schema.json", "request": "instance-{{ rf_mode }}-ue-lte-input-schema.json",
"response": "instance-{{ rf_mode }}-ue-lte-schema.json", "response": "instance-{{ rf_mode }}-ue-lte-schema.json",
"index": 8 "index": 4
}, },
"ue-nr": { "ue-nr": {
"title": "UE-NR", "title": "UE-NR",
...@@ -84,7 +50,7 @@ ...@@ -84,7 +50,7 @@
"software-type": "ue-nr", "software-type": "ue-nr",
"request": "instance-{{ rf_mode }}-ue-nr-input-schema.json", "request": "instance-{{ rf_mode }}-ue-nr-input-schema.json",
"response": "instance-{{ rf_mode }}-ue-nr-schema.json", "response": "instance-{{ rf_mode }}-ue-nr-schema.json",
"index": 9 "index": 5
} }
} }
} }
...@@ -57,7 +57,7 @@ param_dict = { ...@@ -57,7 +57,7 @@ param_dict = {
'10.0.0.1': {'mme_addr': '10.0.0.1'}, '10.0.0.1': {'mme_addr': '10.0.0.1'},
'2001:db8::1': {'mme_addr': '2001:db8::1'}, '2001:db8::1': {'mme_addr': '2001:db8::1'},
}, },
'epc_plmn': '00102', 'core_network_plmn': '00102',
'dl_nr_arfcn': 325320, 'dl_nr_arfcn': 325320,
'nr_band': 99, 'nr_band': 99,
'nr_bandwidth': 50, 'nr_bandwidth': 50,
...@@ -166,7 +166,7 @@ def test_mme_conf(self): ...@@ -166,7 +166,7 @@ def test_mme_conf(self):
with open(conf_file, 'r') as f: with open(conf_file, 'r') as f:
conf = yaml.load(f) conf = yaml.load(f)
self.assertEqual(conf['plmn'], param_dict['epc_plmn']) self.assertEqual(conf['plmn'], param_dict['core_network_plmn'])
def test_sim_card(self): def test_sim_card(self):
...@@ -180,7 +180,6 @@ def test_sim_card(self): ...@@ -180,7 +180,6 @@ def test_sim_card(self):
self.assertEqual(conf['ue_db'][0]['K'], param_dict['k']) self.assertEqual(conf['ue_db'][0]['K'], param_dict['k'])
self.assertEqual(conf['ue_db'][0]['amf'], int(param_dict['amf'], 16)) self.assertEqual(conf['ue_db'][0]['amf'], int(param_dict['amf'], 16))
self.slap.waitForInstance() # Wait until publish is done
p = self.requestSlaveInstance().getConnectionParameterDict() p = self.requestSlaveInstance().getConnectionParameterDict()
p = p['_'] if '_' in p else p p = p['_'] if '_' in p else p
self.assertIn('info', p) self.assertIn('info', p)
...@@ -232,68 +231,26 @@ class TestGNBParameters2(ORSTestCase): ...@@ -232,68 +231,26 @@ class TestGNBParameters2(ORSTestCase):
def test_gnb_conf(self): def test_gnb_conf(self):
test_gnb_conf2(self) test_gnb_conf2(self)
class TestEPCParameters(ORSTestCase): class TestCoreNetworkParameters(ORSTestCase):
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
return {'_': json.dumps(param_dict)} return {'_': json.dumps(param_dict)}
@classmethod @classmethod
def getInstanceSoftwareType(cls): def getInstanceSoftwareType(cls):
return "epc" return "core-network"
def test_mme_conf(self): def test_mme_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_mme_conf(self) test_mme_conf(self)
class TestENBEPCParameters(ORSTestCase): def requestSlaveInstance(cls):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(enb_param_dict)}
@classmethod
def getInstanceSoftwareType(cls):
return "enb-epc"
def test_enb_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_enb_conf(self)
def test_mme_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_mme_conf(self)
class TestGNBEPCParameters(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(gnb_param_dict1)}
@classmethod
def getInstanceSoftwareType(cls):
return "gnb-epc"
def test_gnb_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_gnb_conf1(self)
def test_mme_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_mme_conf(self)
def requestSlaveInstance(cls, software_type):
software_url = cls.getSoftwareURL() software_url = cls.getSoftwareURL()
return cls.slap.request( return cls.slap.request(
software_release=software_url, software_release=software_url,
partition_reference="SIM-CARD-EPC", partition_reference="SIM-CARD",
partition_parameter_kw={'_': json.dumps(param_dict)}, partition_parameter_kw={'_': json.dumps(param_dict)},
shared=True, shared=True,
software_type=software_type, software_type='core-network',
) )
class TestEPCMonitorGadgetUrl(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})}
@classmethod
def getInstanceSoftwareType(cls):
return "epc"
def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self)
class TestENBMonitorGadgetUrl(ORSTestCase): class TestENBMonitorGadgetUrl(ORSTestCase):
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
...@@ -304,33 +261,6 @@ class TestENBMonitorGadgetUrl(ORSTestCase): ...@@ -304,33 +261,6 @@ class TestENBMonitorGadgetUrl(ORSTestCase):
return "enb" return "enb"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self)
class TestENBEPCMonitorGadgetUrl(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(enb_param_dict)}
@classmethod
def getInstanceSoftwareType(cls):
return "enb-epc"
def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self)
class TestGNBEPCMonitorGadgetUrl(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(gnb_param_dict1)}
@classmethod
def getInstanceSoftwareType(cls):
return "gnb-epc"
def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestGNBMonitorGadgetUrl(ORSTestCase): class TestGNBMonitorGadgetUrl(ORSTestCase):
...@@ -343,20 +273,18 @@ class TestGNBMonitorGadgetUrl(ORSTestCase): ...@@ -343,20 +273,18 @@ class TestGNBMonitorGadgetUrl(ORSTestCase):
return "gnb" return "gnb"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestMMEMonitorGadgetUrl(ORSTestCase): class TestCoreNetworkMonitorGadgetUrl(ORSTestCase):
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True, 'slave-list': []})} return {'_': json.dumps({'testing': True, 'slave-list': []})}
@classmethod @classmethod
def getInstanceSoftwareType(cls): def getInstanceSoftwareType(cls):
return "mme" return "core-network"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestUELTEMonitorGadgetUrl(ORSTestCase): class TestUELTEMonitorGadgetUrl(ORSTestCase):
...@@ -369,7 +297,6 @@ class TestUELTEMonitorGadgetUrl(ORSTestCase): ...@@ -369,7 +297,6 @@ class TestUELTEMonitorGadgetUrl(ORSTestCase):
return "ue-lte" return "ue-lte"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestUENRMonitorGadgetUrl(ORSTestCase): class TestUENRMonitorGadgetUrl(ORSTestCase):
...@@ -382,50 +309,9 @@ class TestUENRMonitorGadgetUrl(ORSTestCase): ...@@ -382,50 +309,9 @@ class TestUENRMonitorGadgetUrl(ORSTestCase):
return "ue-nr" return "ue-nr"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestEPCSimCard(ORSTestCase): class TestSimCard(ORSTestCase):
@classmethod
def requestDefaultInstance(cls, state='started'):
default_instance = super(
ORSTestCase, cls).requestDefaultInstance(state=state)
cls.requestSlaveInstance()
return default_instance
@classmethod
def requestSlaveInstance(cls):
return requestSlaveInstance(cls, 'epc')
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})}
@classmethod
def getInstanceSoftwareType(cls):
return "epc"
def test_sim_card(self):
self.slap.waitForInstance() # Wait until publish is done
test_sim_card(self)
class TestENBEPCSimCard(ORSTestCase):
@classmethod
def requestDefaultInstance(cls, state='started'):
default_instance = super(
ORSTestCase, cls).requestDefaultInstance(state=state)
cls.requestSlaveInstance()
return default_instance
@classmethod
def requestSlaveInstance(cls):
return requestSlaveInstance(cls, 'enb-epc')
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})}
@classmethod
def getInstanceSoftwareType(cls):
return "enb-epc"
def test_sim_card(self):
self.slap.waitForInstance() # Wait until publish is done
test_sim_card(self)
class TestGNBEPCSimCard(ORSTestCase):
@classmethod @classmethod
def requestDefaultInstance(cls, state='started'): def requestDefaultInstance(cls, state='started'):
default_instance = super( default_instance = super(
...@@ -434,15 +320,14 @@ class TestGNBEPCSimCard(ORSTestCase): ...@@ -434,15 +320,14 @@ class TestGNBEPCSimCard(ORSTestCase):
return default_instance return default_instance
@classmethod @classmethod
def requestSlaveInstance(cls): def requestSlaveInstance(cls):
return requestSlaveInstance(cls, 'gnb-epc') return requestSlaveInstance(cls)
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})} return {'_': json.dumps({'testing': True})}
@classmethod @classmethod
def getInstanceSoftwareType(cls): def getInstanceSoftwareType(cls):
return "gnb-epc" return "core-network"
def test_sim_card(self): def test_sim_card(self):
self.slap.waitForInstance() # Wait until publish is done
test_sim_card(self) test_sim_card(self)
class TestUELTEParameters(ORSTestCase): class TestUELTEParameters(ORSTestCase):
......
...@@ -57,7 +57,7 @@ param_dict = { ...@@ -57,7 +57,7 @@ param_dict = {
'10.0.0.1': {'mme_addr': '10.0.0.1'}, '10.0.0.1': {'mme_addr': '10.0.0.1'},
'2001:db8::1': {'mme_addr': '2001:db8::1'}, '2001:db8::1': {'mme_addr': '2001:db8::1'},
}, },
'epc_plmn': '00102', 'core_network_plmn': '00102',
'dl_nr_arfcn': 325320, 'dl_nr_arfcn': 325320,
'nr_band': 99, 'nr_band': 99,
'nr_bandwidth': 50, 'nr_bandwidth': 50,
...@@ -166,7 +166,7 @@ def test_mme_conf(self): ...@@ -166,7 +166,7 @@ def test_mme_conf(self):
with open(conf_file, 'r') as f: with open(conf_file, 'r') as f:
conf = yaml.load(f) conf = yaml.load(f)
self.assertEqual(conf['plmn'], param_dict['epc_plmn']) self.assertEqual(conf['plmn'], param_dict['core_network_plmn'])
def test_sim_card(self): def test_sim_card(self):
...@@ -180,7 +180,6 @@ def test_sim_card(self): ...@@ -180,7 +180,6 @@ def test_sim_card(self):
self.assertEqual(conf['ue_db'][0]['K'], param_dict['k']) self.assertEqual(conf['ue_db'][0]['K'], param_dict['k'])
self.assertEqual(conf['ue_db'][0]['amf'], int(param_dict['amf'], 16)) self.assertEqual(conf['ue_db'][0]['amf'], int(param_dict['amf'], 16))
self.slap.waitForInstance() # Wait until publish is done
p = self.requestSlaveInstance().getConnectionParameterDict() p = self.requestSlaveInstance().getConnectionParameterDict()
p = p['_'] if '_' in p else p p = p['_'] if '_' in p else p
self.assertIn('info', p) self.assertIn('info', p)
...@@ -232,68 +231,26 @@ class TestGNBParameters2(ORSTestCase): ...@@ -232,68 +231,26 @@ class TestGNBParameters2(ORSTestCase):
def test_gnb_conf(self): def test_gnb_conf(self):
test_gnb_conf2(self) test_gnb_conf2(self)
class TestEPCParameters(ORSTestCase): class TestCoreNetworkParameters(ORSTestCase):
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
return {'_': json.dumps(param_dict)} return {'_': json.dumps(param_dict)}
@classmethod @classmethod
def getInstanceSoftwareType(cls): def getInstanceSoftwareType(cls):
return "epc" return "core-network"
def test_mme_conf(self): def test_mme_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_mme_conf(self) test_mme_conf(self)
class TestENBEPCParameters(ORSTestCase): def requestSlaveInstance(cls):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(enb_param_dict)}
@classmethod
def getInstanceSoftwareType(cls):
return "enb-epc"
def test_enb_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_enb_conf(self)
def test_mme_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_mme_conf(self)
class TestGNBEPCParameters(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(gnb_param_dict1)}
@classmethod
def getInstanceSoftwareType(cls):
return "gnb-epc"
def test_gnb_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_gnb_conf1(self)
def test_mme_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_mme_conf(self)
def requestSlaveInstance(cls, software_type):
software_url = cls.getSoftwareURL() software_url = cls.getSoftwareURL()
return cls.slap.request( return cls.slap.request(
software_release=software_url, software_release=software_url,
partition_reference="SIM-CARD-EPC", partition_reference="SIM-CARD",
partition_parameter_kw={'_': json.dumps(param_dict)}, partition_parameter_kw={'_': json.dumps(param_dict)},
shared=True, shared=True,
software_type=software_type, software_type='core-network',
) )
class TestEPCMonitorGadgetUrl(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})}
@classmethod
def getInstanceSoftwareType(cls):
return "epc"
def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self)
class TestENBMonitorGadgetUrl(ORSTestCase): class TestENBMonitorGadgetUrl(ORSTestCase):
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
...@@ -304,33 +261,6 @@ class TestENBMonitorGadgetUrl(ORSTestCase): ...@@ -304,33 +261,6 @@ class TestENBMonitorGadgetUrl(ORSTestCase):
return "enb" return "enb"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self)
class TestENBEPCMonitorGadgetUrl(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(enb_param_dict)}
@classmethod
def getInstanceSoftwareType(cls):
return "enb-epc"
def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self)
class TestGNBEPCMonitorGadgetUrl(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(gnb_param_dict1)}
@classmethod
def getInstanceSoftwareType(cls):
return "gnb-epc"
def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestGNBMonitorGadgetUrl(ORSTestCase): class TestGNBMonitorGadgetUrl(ORSTestCase):
...@@ -343,20 +273,18 @@ class TestGNBMonitorGadgetUrl(ORSTestCase): ...@@ -343,20 +273,18 @@ class TestGNBMonitorGadgetUrl(ORSTestCase):
return "gnb" return "gnb"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestMMEMonitorGadgetUrl(ORSTestCase): class TestCoreNetworkMonitorGadgetUrl(ORSTestCase):
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True, 'slave-list': []})} return {'_': json.dumps({'testing': True, 'slave-list': []})}
@classmethod @classmethod
def getInstanceSoftwareType(cls): def getInstanceSoftwareType(cls):
return "mme" return "core-network"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestUELTEMonitorGadgetUrl(ORSTestCase): class TestUELTEMonitorGadgetUrl(ORSTestCase):
...@@ -369,7 +297,6 @@ class TestUELTEMonitorGadgetUrl(ORSTestCase): ...@@ -369,7 +297,6 @@ class TestUELTEMonitorGadgetUrl(ORSTestCase):
return "ue-lte" return "ue-lte"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestUENRMonitorGadgetUrl(ORSTestCase): class TestUENRMonitorGadgetUrl(ORSTestCase):
...@@ -382,50 +309,9 @@ class TestUENRMonitorGadgetUrl(ORSTestCase): ...@@ -382,50 +309,9 @@ class TestUENRMonitorGadgetUrl(ORSTestCase):
return "ue-nr" return "ue-nr"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestEPCSimCard(ORSTestCase): class TestSimCard(ORSTestCase):
@classmethod
def requestDefaultInstance(cls, state='started'):
default_instance = super(
ORSTestCase, cls).requestDefaultInstance(state=state)
cls.requestSlaveInstance()
return default_instance
@classmethod
def requestSlaveInstance(cls):
return requestSlaveInstance(cls, 'epc')
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})}
@classmethod
def getInstanceSoftwareType(cls):
return "epc"
def test_sim_card(self):
self.slap.waitForInstance() # Wait until publish is done
test_sim_card(self)
class TestENBEPCSimCard(ORSTestCase):
@classmethod
def requestDefaultInstance(cls, state='started'):
default_instance = super(
ORSTestCase, cls).requestDefaultInstance(state=state)
cls.requestSlaveInstance()
return default_instance
@classmethod
def requestSlaveInstance(cls):
return requestSlaveInstance(cls, 'enb-epc')
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})}
@classmethod
def getInstanceSoftwareType(cls):
return "enb-epc"
def test_sim_card(self):
self.slap.waitForInstance() # Wait until publish is done
test_sim_card(self)
class TestGNBEPCSimCard(ORSTestCase):
@classmethod @classmethod
def requestDefaultInstance(cls, state='started'): def requestDefaultInstance(cls, state='started'):
default_instance = super( default_instance = super(
...@@ -434,15 +320,14 @@ class TestGNBEPCSimCard(ORSTestCase): ...@@ -434,15 +320,14 @@ class TestGNBEPCSimCard(ORSTestCase):
return default_instance return default_instance
@classmethod @classmethod
def requestSlaveInstance(cls): def requestSlaveInstance(cls):
return requestSlaveInstance(cls, 'gnb-epc') return requestSlaveInstance(cls)
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})} return {'_': json.dumps({'testing': True})}
@classmethod @classmethod
def getInstanceSoftwareType(cls): def getInstanceSoftwareType(cls):
return "gnb-epc" return "core-network"
def test_sim_card(self): def test_sim_card(self):
self.slap.waitForInstance() # Wait until publish is done
test_sim_card(self) test_sim_card(self)
class TestUELTEParameters(ORSTestCase): class TestUELTEParameters(ORSTestCase):
......
...@@ -57,7 +57,7 @@ param_dict = { ...@@ -57,7 +57,7 @@ param_dict = {
'10.0.0.1': {'mme_addr': '10.0.0.1'}, '10.0.0.1': {'mme_addr': '10.0.0.1'},
'2001:db8::1': {'mme_addr': '2001:db8::1'}, '2001:db8::1': {'mme_addr': '2001:db8::1'},
}, },
'epc_plmn': '00102', 'core_network_plmn': '00102',
'dl_nr_arfcn': 325320, 'dl_nr_arfcn': 325320,
'nr_band': 99, 'nr_band': 99,
'nr_bandwidth': 50, 'nr_bandwidth': 50,
...@@ -166,7 +166,7 @@ def test_mme_conf(self): ...@@ -166,7 +166,7 @@ def test_mme_conf(self):
with open(conf_file, 'r') as f: with open(conf_file, 'r') as f:
conf = yaml.load(f) conf = yaml.load(f)
self.assertEqual(conf['plmn'], param_dict['epc_plmn']) self.assertEqual(conf['plmn'], param_dict['core_network_plmn'])
def test_sim_card(self): def test_sim_card(self):
...@@ -180,7 +180,6 @@ def test_sim_card(self): ...@@ -180,7 +180,6 @@ def test_sim_card(self):
self.assertEqual(conf['ue_db'][0]['K'], param_dict['k']) self.assertEqual(conf['ue_db'][0]['K'], param_dict['k'])
self.assertEqual(conf['ue_db'][0]['amf'], int(param_dict['amf'], 16)) self.assertEqual(conf['ue_db'][0]['amf'], int(param_dict['amf'], 16))
self.slap.waitForInstance() # Wait until publish is done
p = self.requestSlaveInstance().getConnectionParameterDict() p = self.requestSlaveInstance().getConnectionParameterDict()
p = p['_'] if '_' in p else p p = p['_'] if '_' in p else p
self.assertIn('info', p) self.assertIn('info', p)
...@@ -232,68 +231,26 @@ class TestGNBParameters2(ORSTestCase): ...@@ -232,68 +231,26 @@ class TestGNBParameters2(ORSTestCase):
def test_gnb_conf(self): def test_gnb_conf(self):
test_gnb_conf2(self) test_gnb_conf2(self)
class TestEPCParameters(ORSTestCase): class TestCoreNetworkParameters(ORSTestCase):
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
return {'_': json.dumps(param_dict)} return {'_': json.dumps(param_dict)}
@classmethod @classmethod
def getInstanceSoftwareType(cls): def getInstanceSoftwareType(cls):
return "epc" return "core-network"
def test_mme_conf(self): def test_mme_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_mme_conf(self) test_mme_conf(self)
class TestENBEPCParameters(ORSTestCase): def requestSlaveInstance(cls):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(enb_param_dict)}
@classmethod
def getInstanceSoftwareType(cls):
return "enb-epc"
def test_enb_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_enb_conf(self)
def test_mme_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_mme_conf(self)
class TestGNBEPCParameters(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(gnb_param_dict1)}
@classmethod
def getInstanceSoftwareType(cls):
return "gnb-epc"
def test_gnb_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_gnb_conf1(self)
def test_mme_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_mme_conf(self)
def requestSlaveInstance(cls, software_type):
software_url = cls.getSoftwareURL() software_url = cls.getSoftwareURL()
return cls.slap.request( return cls.slap.request(
software_release=software_url, software_release=software_url,
partition_reference="SIM-CARD-EPC", partition_reference="SIM-CARD",
partition_parameter_kw={'_': json.dumps(param_dict)}, partition_parameter_kw={'_': json.dumps(param_dict)},
shared=True, shared=True,
software_type=software_type, software_type='core-network',
) )
class TestEPCMonitorGadgetUrl(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})}
@classmethod
def getInstanceSoftwareType(cls):
return "epc"
def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self)
class TestENBMonitorGadgetUrl(ORSTestCase): class TestENBMonitorGadgetUrl(ORSTestCase):
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
...@@ -304,33 +261,6 @@ class TestENBMonitorGadgetUrl(ORSTestCase): ...@@ -304,33 +261,6 @@ class TestENBMonitorGadgetUrl(ORSTestCase):
return "enb" return "enb"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self)
class TestENBEPCMonitorGadgetUrl(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(enb_param_dict)}
@classmethod
def getInstanceSoftwareType(cls):
return "enb-epc"
def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self)
class TestGNBEPCMonitorGadgetUrl(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(gnb_param_dict1)}
@classmethod
def getInstanceSoftwareType(cls):
return "gnb-epc"
def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestGNBMonitorGadgetUrl(ORSTestCase): class TestGNBMonitorGadgetUrl(ORSTestCase):
...@@ -343,20 +273,18 @@ class TestGNBMonitorGadgetUrl(ORSTestCase): ...@@ -343,20 +273,18 @@ class TestGNBMonitorGadgetUrl(ORSTestCase):
return "gnb" return "gnb"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestMMEMonitorGadgetUrl(ORSTestCase): class TestCoreNetworkMonitorGadgetUrl(ORSTestCase):
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True, 'slave-list': []})} return {'_': json.dumps({'testing': True, 'slave-list': []})}
@classmethod @classmethod
def getInstanceSoftwareType(cls): def getInstanceSoftwareType(cls):
return "mme" return "core-network"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestUELTEMonitorGadgetUrl(ORSTestCase): class TestUELTEMonitorGadgetUrl(ORSTestCase):
...@@ -369,7 +297,6 @@ class TestUELTEMonitorGadgetUrl(ORSTestCase): ...@@ -369,7 +297,6 @@ class TestUELTEMonitorGadgetUrl(ORSTestCase):
return "ue-lte" return "ue-lte"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestUENRMonitorGadgetUrl(ORSTestCase): class TestUENRMonitorGadgetUrl(ORSTestCase):
...@@ -382,50 +309,9 @@ class TestUENRMonitorGadgetUrl(ORSTestCase): ...@@ -382,50 +309,9 @@ class TestUENRMonitorGadgetUrl(ORSTestCase):
return "ue-nr" return "ue-nr"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestEPCSimCard(ORSTestCase): class TestSimCard(ORSTestCase):
@classmethod
def requestDefaultInstance(cls, state='started'):
default_instance = super(
ORSTestCase, cls).requestDefaultInstance(state=state)
cls.requestSlaveInstance()
return default_instance
@classmethod
def requestSlaveInstance(cls):
return requestSlaveInstance(cls, 'epc')
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})}
@classmethod
def getInstanceSoftwareType(cls):
return "epc"
def test_sim_card(self):
self.slap.waitForInstance() # Wait until publish is done
test_sim_card(self)
class TestENBEPCSimCard(ORSTestCase):
@classmethod
def requestDefaultInstance(cls, state='started'):
default_instance = super(
ORSTestCase, cls).requestDefaultInstance(state=state)
cls.requestSlaveInstance()
return default_instance
@classmethod
def requestSlaveInstance(cls):
return requestSlaveInstance(cls, 'enb-epc')
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})}
@classmethod
def getInstanceSoftwareType(cls):
return "enb-epc"
def test_sim_card(self):
self.slap.waitForInstance() # Wait until publish is done
test_sim_card(self)
class TestGNBEPCSimCard(ORSTestCase):
@classmethod @classmethod
def requestDefaultInstance(cls, state='started'): def requestDefaultInstance(cls, state='started'):
default_instance = super( default_instance = super(
...@@ -434,15 +320,14 @@ class TestGNBEPCSimCard(ORSTestCase): ...@@ -434,15 +320,14 @@ class TestGNBEPCSimCard(ORSTestCase):
return default_instance return default_instance
@classmethod @classmethod
def requestSlaveInstance(cls): def requestSlaveInstance(cls):
return requestSlaveInstance(cls, 'gnb-epc') return requestSlaveInstance(cls)
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})} return {'_': json.dumps({'testing': True})}
@classmethod @classmethod
def getInstanceSoftwareType(cls): def getInstanceSoftwareType(cls):
return "gnb-epc" return "core-network"
def test_sim_card(self): def test_sim_card(self):
self.slap.waitForInstance() # Wait until publish is done
test_sim_card(self) test_sim_card(self)
class TestUELTEParameters(ORSTestCase): class TestUELTEParameters(ORSTestCase):
......
...@@ -57,7 +57,7 @@ param_dict = { ...@@ -57,7 +57,7 @@ param_dict = {
'10.0.0.1': {'mme_addr': '10.0.0.1'}, '10.0.0.1': {'mme_addr': '10.0.0.1'},
'2001:db8::1': {'mme_addr': '2001:db8::1'}, '2001:db8::1': {'mme_addr': '2001:db8::1'},
}, },
'epc_plmn': '00102', 'core_network_plmn': '00102',
'dl_nr_arfcn': 325320, 'dl_nr_arfcn': 325320,
'nr_band': 99, 'nr_band': 99,
'nr_bandwidth': 50, 'nr_bandwidth': 50,
...@@ -166,7 +166,7 @@ def test_mme_conf(self): ...@@ -166,7 +166,7 @@ def test_mme_conf(self):
with open(conf_file, 'r') as f: with open(conf_file, 'r') as f:
conf = yaml.load(f) conf = yaml.load(f)
self.assertEqual(conf['plmn'], param_dict['epc_plmn']) self.assertEqual(conf['plmn'], param_dict['core_network_plmn'])
def test_sim_card(self): def test_sim_card(self):
...@@ -180,7 +180,6 @@ def test_sim_card(self): ...@@ -180,7 +180,6 @@ def test_sim_card(self):
self.assertEqual(conf['ue_db'][0]['K'], param_dict['k']) self.assertEqual(conf['ue_db'][0]['K'], param_dict['k'])
self.assertEqual(conf['ue_db'][0]['amf'], int(param_dict['amf'], 16)) self.assertEqual(conf['ue_db'][0]['amf'], int(param_dict['amf'], 16))
self.slap.waitForInstance() # Wait until publish is done
p = self.requestSlaveInstance().getConnectionParameterDict() p = self.requestSlaveInstance().getConnectionParameterDict()
p = p['_'] if '_' in p else p p = p['_'] if '_' in p else p
self.assertIn('info', p) self.assertIn('info', p)
...@@ -232,68 +231,26 @@ class TestGNBParameters2(ORSTestCase): ...@@ -232,68 +231,26 @@ class TestGNBParameters2(ORSTestCase):
def test_gnb_conf(self): def test_gnb_conf(self):
test_gnb_conf2(self) test_gnb_conf2(self)
class TestEPCParameters(ORSTestCase): class TestCoreNetworkParameters(ORSTestCase):
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
return {'_': json.dumps(param_dict)} return {'_': json.dumps(param_dict)}
@classmethod @classmethod
def getInstanceSoftwareType(cls): def getInstanceSoftwareType(cls):
return "epc" return "core-network"
def test_mme_conf(self): def test_mme_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_mme_conf(self) test_mme_conf(self)
class TestENBEPCParameters(ORSTestCase): def requestSlaveInstance(cls):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(enb_param_dict)}
@classmethod
def getInstanceSoftwareType(cls):
return "enb-epc"
def test_enb_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_enb_conf(self)
def test_mme_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_mme_conf(self)
class TestGNBEPCParameters(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(gnb_param_dict1)}
@classmethod
def getInstanceSoftwareType(cls):
return "gnb-epc"
def test_gnb_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_gnb_conf1(self)
def test_mme_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_mme_conf(self)
def requestSlaveInstance(cls, software_type):
software_url = cls.getSoftwareURL() software_url = cls.getSoftwareURL()
return cls.slap.request( return cls.slap.request(
software_release=software_url, software_release=software_url,
partition_reference="SIM-CARD-EPC", partition_reference="SIM-CARD",
partition_parameter_kw={'_': json.dumps(param_dict)}, partition_parameter_kw={'_': json.dumps(param_dict)},
shared=True, shared=True,
software_type=software_type, software_type='core-network',
) )
class TestEPCMonitorGadgetUrl(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})}
@classmethod
def getInstanceSoftwareType(cls):
return "epc"
def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self)
class TestENBMonitorGadgetUrl(ORSTestCase): class TestENBMonitorGadgetUrl(ORSTestCase):
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
...@@ -304,33 +261,6 @@ class TestENBMonitorGadgetUrl(ORSTestCase): ...@@ -304,33 +261,6 @@ class TestENBMonitorGadgetUrl(ORSTestCase):
return "enb" return "enb"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self)
class TestENBEPCMonitorGadgetUrl(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(enb_param_dict)}
@classmethod
def getInstanceSoftwareType(cls):
return "enb-epc"
def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self)
class TestGNBEPCMonitorGadgetUrl(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(gnb_param_dict1)}
@classmethod
def getInstanceSoftwareType(cls):
return "gnb-epc"
def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestGNBMonitorGadgetUrl(ORSTestCase): class TestGNBMonitorGadgetUrl(ORSTestCase):
...@@ -343,20 +273,18 @@ class TestGNBMonitorGadgetUrl(ORSTestCase): ...@@ -343,20 +273,18 @@ class TestGNBMonitorGadgetUrl(ORSTestCase):
return "gnb" return "gnb"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestMMEMonitorGadgetUrl(ORSTestCase): class TestCoreNetworkMonitorGadgetUrl(ORSTestCase):
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True, 'slave-list': []})} return {'_': json.dumps({'testing': True, 'slave-list': []})}
@classmethod @classmethod
def getInstanceSoftwareType(cls): def getInstanceSoftwareType(cls):
return "mme" return "core-network"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestUELTEMonitorGadgetUrl(ORSTestCase): class TestUELTEMonitorGadgetUrl(ORSTestCase):
...@@ -369,7 +297,6 @@ class TestUELTEMonitorGadgetUrl(ORSTestCase): ...@@ -369,7 +297,6 @@ class TestUELTEMonitorGadgetUrl(ORSTestCase):
return "ue-lte" return "ue-lte"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestUENRMonitorGadgetUrl(ORSTestCase): class TestUENRMonitorGadgetUrl(ORSTestCase):
...@@ -382,50 +309,9 @@ class TestUENRMonitorGadgetUrl(ORSTestCase): ...@@ -382,50 +309,9 @@ class TestUENRMonitorGadgetUrl(ORSTestCase):
return "ue-nr" return "ue-nr"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestEPCSimCard(ORSTestCase): class TestSimCard(ORSTestCase):
@classmethod
def requestDefaultInstance(cls, state='started'):
default_instance = super(
ORSTestCase, cls).requestDefaultInstance(state=state)
cls.requestSlaveInstance()
return default_instance
@classmethod
def requestSlaveInstance(cls):
return requestSlaveInstance(cls, 'epc')
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})}
@classmethod
def getInstanceSoftwareType(cls):
return "epc"
def test_sim_card(self):
self.slap.waitForInstance() # Wait until publish is done
test_sim_card(self)
class TestENBEPCSimCard(ORSTestCase):
@classmethod
def requestDefaultInstance(cls, state='started'):
default_instance = super(
ORSTestCase, cls).requestDefaultInstance(state=state)
cls.requestSlaveInstance()
return default_instance
@classmethod
def requestSlaveInstance(cls):
return requestSlaveInstance(cls, 'enb-epc')
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})}
@classmethod
def getInstanceSoftwareType(cls):
return "enb-epc"
def test_sim_card(self):
self.slap.waitForInstance() # Wait until publish is done
test_sim_card(self)
class TestGNBEPCSimCard(ORSTestCase):
@classmethod @classmethod
def requestDefaultInstance(cls, state='started'): def requestDefaultInstance(cls, state='started'):
default_instance = super( default_instance = super(
...@@ -434,15 +320,14 @@ class TestGNBEPCSimCard(ORSTestCase): ...@@ -434,15 +320,14 @@ class TestGNBEPCSimCard(ORSTestCase):
return default_instance return default_instance
@classmethod @classmethod
def requestSlaveInstance(cls): def requestSlaveInstance(cls):
return requestSlaveInstance(cls, 'gnb-epc') return requestSlaveInstance(cls)
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})} return {'_': json.dumps({'testing': True})}
@classmethod @classmethod
def getInstanceSoftwareType(cls): def getInstanceSoftwareType(cls):
return "gnb-epc" return "core-network"
def test_sim_card(self): def test_sim_card(self):
self.slap.waitForInstance() # Wait until publish is done
test_sim_card(self) test_sim_card(self)
class TestUELTEParameters(ORSTestCase): class TestUELTEParameters(ORSTestCase):
......
...@@ -57,7 +57,7 @@ param_dict = { ...@@ -57,7 +57,7 @@ param_dict = {
'10.0.0.1': {'mme_addr': '10.0.0.1'}, '10.0.0.1': {'mme_addr': '10.0.0.1'},
'2001:db8::1': {'mme_addr': '2001:db8::1'}, '2001:db8::1': {'mme_addr': '2001:db8::1'},
}, },
'epc_plmn': '00102', 'core_network_plmn': '00102',
'dl_nr_arfcn': 325320, 'dl_nr_arfcn': 325320,
'nr_band': 99, 'nr_band': 99,
'nr_bandwidth': 50, 'nr_bandwidth': 50,
...@@ -166,7 +166,7 @@ def test_mme_conf(self): ...@@ -166,7 +166,7 @@ def test_mme_conf(self):
with open(conf_file, 'r') as f: with open(conf_file, 'r') as f:
conf = yaml.load(f) conf = yaml.load(f)
self.assertEqual(conf['plmn'], param_dict['epc_plmn']) self.assertEqual(conf['plmn'], param_dict['core_network_plmn'])
def test_sim_card(self): def test_sim_card(self):
...@@ -180,7 +180,6 @@ def test_sim_card(self): ...@@ -180,7 +180,6 @@ def test_sim_card(self):
self.assertEqual(conf['ue_db'][0]['K'], param_dict['k']) self.assertEqual(conf['ue_db'][0]['K'], param_dict['k'])
self.assertEqual(conf['ue_db'][0]['amf'], int(param_dict['amf'], 16)) self.assertEqual(conf['ue_db'][0]['amf'], int(param_dict['amf'], 16))
self.slap.waitForInstance() # Wait until publish is done
p = self.requestSlaveInstance().getConnectionParameterDict() p = self.requestSlaveInstance().getConnectionParameterDict()
p = p['_'] if '_' in p else p p = p['_'] if '_' in p else p
self.assertIn('info', p) self.assertIn('info', p)
...@@ -232,68 +231,26 @@ class TestGNBParameters2(ORSTestCase): ...@@ -232,68 +231,26 @@ class TestGNBParameters2(ORSTestCase):
def test_gnb_conf(self): def test_gnb_conf(self):
test_gnb_conf2(self) test_gnb_conf2(self)
class TestEPCParameters(ORSTestCase): class TestCoreNetworkParameters(ORSTestCase):
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
return {'_': json.dumps(param_dict)} return {'_': json.dumps(param_dict)}
@classmethod @classmethod
def getInstanceSoftwareType(cls): def getInstanceSoftwareType(cls):
return "epc" return "core-network"
def test_mme_conf(self): def test_mme_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_mme_conf(self) test_mme_conf(self)
class TestENBEPCParameters(ORSTestCase): def requestSlaveInstance(cls):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(enb_param_dict)}
@classmethod
def getInstanceSoftwareType(cls):
return "enb-epc"
def test_enb_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_enb_conf(self)
def test_mme_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_mme_conf(self)
class TestGNBEPCParameters(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(gnb_param_dict1)}
@classmethod
def getInstanceSoftwareType(cls):
return "gnb-epc"
def test_gnb_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_gnb_conf1(self)
def test_mme_conf(self):
self.slap.waitForInstance() # Wait until publish is done
test_mme_conf(self)
def requestSlaveInstance(cls, software_type):
software_url = cls.getSoftwareURL() software_url = cls.getSoftwareURL()
return cls.slap.request( return cls.slap.request(
software_release=software_url, software_release=software_url,
partition_reference="SIM-CARD-EPC", partition_reference="SIM-CARD",
partition_parameter_kw={'_': json.dumps(param_dict)}, partition_parameter_kw={'_': json.dumps(param_dict)},
shared=True, shared=True,
software_type=software_type, software_type='core-network',
) )
class TestEPCMonitorGadgetUrl(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})}
@classmethod
def getInstanceSoftwareType(cls):
return "epc"
def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self)
class TestENBMonitorGadgetUrl(ORSTestCase): class TestENBMonitorGadgetUrl(ORSTestCase):
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
...@@ -304,33 +261,6 @@ class TestENBMonitorGadgetUrl(ORSTestCase): ...@@ -304,33 +261,6 @@ class TestENBMonitorGadgetUrl(ORSTestCase):
return "enb" return "enb"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self)
class TestENBEPCMonitorGadgetUrl(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(enb_param_dict)}
@classmethod
def getInstanceSoftwareType(cls):
return "enb-epc"
def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self)
class TestGNBEPCMonitorGadgetUrl(ORSTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(gnb_param_dict1)}
@classmethod
def getInstanceSoftwareType(cls):
return "gnb-epc"
def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestGNBMonitorGadgetUrl(ORSTestCase): class TestGNBMonitorGadgetUrl(ORSTestCase):
...@@ -343,20 +273,18 @@ class TestGNBMonitorGadgetUrl(ORSTestCase): ...@@ -343,20 +273,18 @@ class TestGNBMonitorGadgetUrl(ORSTestCase):
return "gnb" return "gnb"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestMMEMonitorGadgetUrl(ORSTestCase): class TestCoreNetworkMonitorGadgetUrl(ORSTestCase):
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True, 'slave-list': []})} return {'_': json.dumps({'testing': True, 'slave-list': []})}
@classmethod @classmethod
def getInstanceSoftwareType(cls): def getInstanceSoftwareType(cls):
return "mme" return "core-network"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestUELTEMonitorGadgetUrl(ORSTestCase): class TestUELTEMonitorGadgetUrl(ORSTestCase):
...@@ -369,7 +297,6 @@ class TestUELTEMonitorGadgetUrl(ORSTestCase): ...@@ -369,7 +297,6 @@ class TestUELTEMonitorGadgetUrl(ORSTestCase):
return "ue-lte" return "ue-lte"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestUENRMonitorGadgetUrl(ORSTestCase): class TestUENRMonitorGadgetUrl(ORSTestCase):
...@@ -382,50 +309,9 @@ class TestUENRMonitorGadgetUrl(ORSTestCase): ...@@ -382,50 +309,9 @@ class TestUENRMonitorGadgetUrl(ORSTestCase):
return "ue-nr" return "ue-nr"
def test_monitor_gadget_url(self): def test_monitor_gadget_url(self):
self.slap.waitForInstance() # Wait until publish is done
test_monitor_gadget_url(self) test_monitor_gadget_url(self)
class TestEPCSimCard(ORSTestCase): class TestSimCard(ORSTestCase):
@classmethod
def requestDefaultInstance(cls, state='started'):
default_instance = super(
ORSTestCase, cls).requestDefaultInstance(state=state)
cls.requestSlaveInstance()
return default_instance
@classmethod
def requestSlaveInstance(cls):
return requestSlaveInstance(cls, 'epc')
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})}
@classmethod
def getInstanceSoftwareType(cls):
return "epc"
def test_sim_card(self):
self.slap.waitForInstance() # Wait until publish is done
test_sim_card(self)
class TestENBEPCSimCard(ORSTestCase):
@classmethod
def requestDefaultInstance(cls, state='started'):
default_instance = super(
ORSTestCase, cls).requestDefaultInstance(state=state)
cls.requestSlaveInstance()
return default_instance
@classmethod
def requestSlaveInstance(cls):
return requestSlaveInstance(cls, 'enb-epc')
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})}
@classmethod
def getInstanceSoftwareType(cls):
return "enb-epc"
def test_sim_card(self):
self.slap.waitForInstance() # Wait until publish is done
test_sim_card(self)
class TestGNBEPCSimCard(ORSTestCase):
@classmethod @classmethod
def requestDefaultInstance(cls, state='started'): def requestDefaultInstance(cls, state='started'):
default_instance = super( default_instance = super(
...@@ -434,15 +320,14 @@ class TestGNBEPCSimCard(ORSTestCase): ...@@ -434,15 +320,14 @@ class TestGNBEPCSimCard(ORSTestCase):
return default_instance return default_instance
@classmethod @classmethod
def requestSlaveInstance(cls): def requestSlaveInstance(cls):
return requestSlaveInstance(cls, 'gnb-epc') return requestSlaveInstance(cls)
@classmethod @classmethod
def getInstanceParameterDict(cls): def getInstanceParameterDict(cls):
return {'_': json.dumps({'testing': True})} return {'_': json.dumps({'testing': True})}
@classmethod @classmethod
def getInstanceSoftwareType(cls): def getInstanceSoftwareType(cls):
return "gnb-epc" return "core-network"
def test_sim_card(self): def test_sim_card(self):
self.slap.waitForInstance() # Wait until publish is done
test_sim_card(self) test_sim_card(self)
class TestUELTEParameters(ORSTestCase): class TestUELTEParameters(ORSTestCase):
......
...@@ -15,4 +15,4 @@ ...@@ -15,4 +15,4 @@
[template] [template]
filename = instance.cfg filename = instance.cfg
md5sum = a8bd56d112344ae56138e3a775fec478 md5sum = 5f5378550470b551d280dd432878a0ba
...@@ -177,6 +177,7 @@ inline = ...@@ -177,6 +177,7 @@ inline =
cwd="""$${slapos.recipe.template:location}""", cwd="""$${slapos.recipe.template:location}""",
summaryf=UnitTest.summary, summaryf=UnitTest.summary,
) )
if six.PY3:
TestCase( TestCase(
"slapos.toolbox", "slapos.toolbox",
# ['python', '-m', 'unittest', 'discover', '-v'], # ['python', '-m', 'unittest', 'discover', '-v'],
......
...@@ -540,6 +540,7 @@ eggs = ${neoppod:eggs} ...@@ -540,6 +540,7 @@ eggs = ${neoppod:eggs}
${scipy:egg} ${scipy:egg}
${scikit-learn:egg} ${scikit-learn:egg}
${scikit-image:egg} ${scikit-image:egg}
${python-PyYAML:egg}
sympy sympy
more-itertools more-itertools
${h5py:egg} ${h5py:egg}
...@@ -603,6 +604,7 @@ eggs = ${neoppod:eggs} ...@@ -603,6 +604,7 @@ eggs = ${neoppod:eggs}
typing typing
pytracemalloc pytracemalloc
xlrd xlrd
pydot
# Zope # Zope
${zope.security:egg} ${zope.security:egg}
...@@ -675,7 +677,6 @@ scripts = ...@@ -675,7 +677,6 @@ scripts =
apachedex apachedex
performance_tester_erp5 performance_tester_erp5
runwsgi runwsgi
runzope
runzeo runzeo
tidstoraged tidstoraged
tidstorage_repozo tidstorage_repozo
...@@ -691,6 +692,8 @@ Acquisition-patches = ${:_profile_base_location_}/../../component/egg-patch/Acqu ...@@ -691,6 +692,8 @@ Acquisition-patches = ${:_profile_base_location_}/../../component/egg-patch/Acqu
Acquisition-patch-options = -p1 Acquisition-patch-options = -p1
Products.DCWorkflow-patches = ${:_profile_base_location_}/../../component/egg-patch/Products.DCWorkflow/workflow_method-2.4.1.patch#ec7bb56a9f1d37fcbf960cd1e96e6e6d Products.DCWorkflow-patches = ${:_profile_base_location_}/../../component/egg-patch/Products.DCWorkflow/workflow_method-2.4.1.patch#ec7bb56a9f1d37fcbf960cd1e96e6e6d
Products.DCWorkflow-patch-options = -p1 Products.DCWorkflow-patch-options = -p1
Products.CMFCore-patches = ${:_profile_base_location_}/../../component/egg-patch/Products.CMFCore/portal_skins_ZMI_find.patch#19ec05c0477c50927ee1df6eb75d1e7f
Products.CMFCore-patch-options = -p1
PyPDF2-patches = ${:_profile_base_location_}/../../component/egg-patch/PyPDF2/0001-Custom-implementation-of-warnings.formatwarning-remo.patch#d25bb0f5dde7f3337a0a50c2f986f5c8 PyPDF2-patches = ${:_profile_base_location_}/../../component/egg-patch/PyPDF2/0001-Custom-implementation-of-warnings.formatwarning-remo.patch#d25bb0f5dde7f3337a0a50c2f986f5c8
PyPDF2-patch-options = -p1 PyPDF2-patch-options = -p1
python-magic-patches = ${:_profile_base_location_}/../../component/egg-patch/python_magic/magic.patch#de0839bffac17801e39b60873a6c2068 python-magic-patches = ${:_profile_base_location_}/../../component/egg-patch/python_magic/magic.patch#de0839bffac17801e39b60873a6c2068
...@@ -798,7 +801,7 @@ parso = 0.5.1 ...@@ -798,7 +801,7 @@ parso = 0.5.1
Pillow = 6.2.2 Pillow = 6.2.2
polib = 1.0.8 polib = 1.0.8
pprofile = 2.0.4 pprofile = 2.0.4
Products.CMFCore = 2.7.0 Products.CMFCore = 2.7.0+SlapOSPatched001
Products.ExternalMethod = 4.7 Products.ExternalMethod = 4.7
Products.GenericSetup = 2.3.0 Products.GenericSetup = 2.3.0
Products.MailHost = 4.13 Products.MailHost = 4.13
...@@ -816,6 +819,7 @@ pyasn1-modules = 0.0.8 ...@@ -816,6 +819,7 @@ pyasn1-modules = 0.0.8
pycountry = 17.1.8 pycountry = 17.1.8
pycrypto = 2.6.1 pycrypto = 2.6.1
pycryptodomex = 3.10.1 pycryptodomex = 3.10.1
pydot = 1.4.2
pyflakes = 1.5.0 pyflakes = 1.5.0
pyjwkest = 1.4.2 pyjwkest = 1.4.2
Pympler = 0.4.3 Pympler = 0.4.3
......
...@@ -360,6 +360,7 @@ pyparsing = 2.2.0 ...@@ -360,6 +360,7 @@ pyparsing = 2.2.0
pyrsistent = 0.16.1 pyrsistent = 0.16.1
requests = 2.27.1 requests = 2.27.1
selectors34 = 1.2 selectors34 = 1.2
slapos.toolbox = 0.128
smmap = 0.9.0 smmap = 0.9.0
smmap2 = 2.0.5 smmap2 = 2.0.5
traitlets = 4.3.3 traitlets = 4.3.3
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment