Phase 2 of image generation prep
This change:
- deletes some of the unnecessary framework
files which were imported at repo create time.
- adds docs for RTD
- Adds CMake files to build (easier for CI)
- Tweaks the docker file to build using cmake
Issue-ID: RIC-349
Signed-off-by: E. Scott Daniels <daniels@research.att.com>
Change-Id: I94202642764d4b4c0c3555a37dc8b36f4c009f3f
diff --git a/src/ts_xapp/ts_xapp.cpp b/src/ts_xapp/ts_xapp.cpp
new file mode 100644
index 0000000..f6e2c37
--- /dev/null
+++ b/src/ts_xapp/ts_xapp.cpp
@@ -0,0 +1,346 @@
+// vi: ts=4 sw=4 noet:
+/*
+==================================================================================
+ Copyright (c) 2020 Nokia
+ Copyright (c) 2020 AT&T Intellectual Property.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================================
+*/
+
+/*
+ Mnemonic: ts_xapp.cpp
+ Abstract: Traffic Steering xApp;
+ 1. Receives A1 Policy
+ 2. Queries SDL to decide which UE to attempt Traffic Steering for
+ 3. Requests prediction for UE throughput on current and neighbor cells
+ 4. Receives prediction
+ 5. Optionally exercises Traffic Steering action over E2
+
+ Date: 22 April 2020
+ Author: Ron Shacham
+
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <iostream>
+#include <memory>
+
+#include <sdl/syncstorage.hpp>
+#include <set>
+#include <map>
+#include <vector>
+#include <string>
+
+#include "ricxfcpp/xapp.hpp"
+
+using Namespace = std::string;
+using Key = std::string;
+using Data = std::vector<uint8_t>;
+using DataMap = std::map<Key, Data>;
+using Keys = std::set<Key>;
+
+
+// ----------------------------------------------------------
+
+std::unique_ptr<Xapp> xfw;
+
+
+void policy_callback( Message& mbuf, int mtype, int subid, int len, Msg_component payload, void* data ) {
+
+ long now;
+ long total_count;
+
+ int sz;
+ int i;
+
+ int response_to = 0; // max timeout wating for a response
+
+ int send_mtype = 0;
+ int rmtype; // received message type
+ int delay = 1000000; // mu-sec delay; default 1s
+
+ std::unique_ptr<Message> msg;
+ Msg_component send_payload; // special type of unique pointer to the payload
+
+ fprintf( stderr, "Policy Callback got a message, type=%d , length=%d\n" , mtype, len);
+ fprintf(stderr, "payload is %s\n", payload.get());
+
+ //fprintf( stderr, "callback 1 got a message type = %d len = %d\n", mtype, len );
+ mbuf.Send_response( 101, -1, 5, (unsigned char *) "OK1\n" ); // validate that we can use the same buffer for 2 rts calls
+ mbuf.Send_response( 101, -1, 5, (unsigned char *) "OK2\n" );
+
+ mtype = 0;
+
+ fprintf(stderr, "cb 1\n");
+
+ msg = xfw->Alloc_msg( 2048 );
+
+ sz = msg->Get_available_size(); // we'll reuse a message if we received one back; ensure it's big enough
+ if( sz < 2048 ) {
+ fprintf( stderr, "<SNDR> fail: message returned did not have enough size: %d [%d]\n", sz, i );
+ exit( 1 );
+ }
+
+ fprintf(stderr, "cb 2");
+
+ send_payload = msg->Get_payload(); // direct access to payload
+ snprintf( (char *) send_payload.get(), 2048, "{\"UEPredictionSet\" : [\"222\", \"333\", \"444\"]}" );
+
+ fprintf(stderr, "cb 3");
+
+ // payload updated in place, nothing to copy from, so payload parm is nil
+ if ( ! msg->Send_msg( mtype, Message::NO_SUBID, strlen( (char *) send_payload.get() )+1, NULL )) {
+ fprintf( stderr, "<SNDR> send failed: %d\n", msg->Get_state() );
+ }
+
+ fprintf(stderr, "cb 4");
+
+ /*
+ msg = xfw->Receive( response_to );
+ if( msg != NULL ) {
+ rmtype = msg->Get_mtype();
+ send_payload = msg->Get_payload();
+ fprintf( stderr, "got: mtype=%d payload=(%s)\n", rmtype, (char *) send_payload.get() );
+ }
+ */
+
+}
+
+
+void prediction_callback( Message& mbuf, int mtype, int subid, int len, Msg_component payload, void* data ) {
+
+ long now;
+ long total_count;
+
+ int sz;
+ int i;
+
+ int response_to = 0; // max timeout wating for a response
+
+ int send_mtype = 0;
+ int rmtype; // received message type
+ int delay = 1000000; // mu-sec delay; default 1s
+
+ std::unique_ptr<Message> msg;
+ Msg_component send_payload; // special type of unique pointer to the payload
+
+ fprintf( stderr, "Prediction Callback got a message, type=%d , length=%d\n" , mtype, len);
+ fprintf(stderr, "payload is %s\n", payload.get());
+
+ mbuf.Send_response( 101, -1, 5, (unsigned char *) "OK1\n" ); // validate that we can use the same buffer for 2 rts calls
+ mbuf.Send_response( 101, -1, 5, (unsigned char *) "OK2\n" );
+
+ mtype = 0;
+
+ fprintf(stderr, "cb 1\n");
+
+}
+
+
+
+extern int main( int argc, char** argv ) {
+
+ std::unique_ptr<Message> msg;
+ Msg_component payload; // special type of unique pointer to the payload
+
+ int nthreads = 1;
+
+ int response_to = 0; // max timeout wating for a response
+
+ int delay = 1000000; // mu-sec delay; default 1s
+
+ char* port = (char *) "4560";
+
+ int ai;
+
+ ai = 1;
+ while( ai < argc ) { // very simple flag processing (no bounds/error checking)
+ if( argv[ai][0] != '-' ) {
+ break;
+ }
+
+ switch( argv[ai][1] ) { // we only support -x so -xy must be -x -y
+ case 'd': // delay between messages (mu-sec)
+ delay = atoi( argv[ai+1] );
+ ai++;
+ break;
+
+ case 'p':
+ port = argv[ai+1];
+ ai++;
+ break;
+
+ case 't': // timeout in seconds; we need to convert to ms for rmr calls
+ response_to = atoi( argv[ai+1] ) * 1000;
+ ai++;
+ break;
+ }
+ ai++;
+ }
+
+ fprintf( stderr, "<XAPP> response timeout set to: %d\n", response_to );
+ fprintf( stderr, "<XAPP> listening on port: %s\n", port );
+
+ xfw = std::unique_ptr<Xapp>( new Xapp( port, true ) ); // new xAPP thing; wait for a route table
+
+ fprintf(stderr, "code1\n");
+
+ xfw->Add_msg_cb( 20010, policy_callback, NULL );
+ xfw->Add_msg_cb( 30002, prediction_callback, NULL );
+
+ fprintf(stderr, "code2\n");
+
+ std::string sdl_namespace_u = "TS-UE-metrics";
+ std::string sdl_namespace_c = "TS-cell-metrics";
+
+ fprintf(stderr, "code5\n");
+
+ std::unique_ptr<shareddatalayer::SyncStorage> sdl(shareddatalayer::SyncStorage::create());
+
+ Namespace nsu(sdl_namespace_u);
+ Namespace nsc(sdl_namespace_c);
+
+ /*
+
+ fprintf(stderr, "before sdl set\n");
+
+ try{
+ //connecting to the Redis and generating a random key for namespace "hwxapp"
+ fprintf(stderr, "IN SDL Set Data");
+ // std::string data_string = "{\"rsrp\" : -110}";
+
+
+ std::string data_string = "{\"CellID\": \"310-680-200-555001\", \"MeasTimestampPDCPBytes\": \"2020-03-18 02:23:18.220\", \"MeasPeriodPDCPBytes\": 20, \"PDCPBytesDL\": 2000000, \"PDCPBytesUL\": 1200000, \"MeasTimestampAvailPRB\": \"2020-03-18 02:23:18.220\", \"MeasPeriodAvailPRB\": 20, \"AvailPRBDL\": 30, \"AvailPRBUL\": 50 }";
+
+ DataMap dmap;
+ // char key[4]="abc";
+ char key[] = "310-680-200-555001";
+ std::cout << "KEY: "<< key << std::endl;
+ Key k = key;
+ Data d;
+ // uint8_t num = 101;
+ d.assign(data_string.begin(), data_string.end());
+ // d.push_back(num);
+ dmap.insert({k,d});
+
+ sdl->set(nsc, dmap);
+
+ data_string = "{ \"CellID\": \"310-680-200-555002\", \"MeasTimestampPDCPBytes\": \"2020-03-18 02:23:18.220\", \"MeasPeriodPDCPBytes\": 20, \"PDCPBytesDL\": 800000, \"PDCPBytesUL\": 400000, \"MeasTimestampAvailPRB\": \"2020-03-18 02:23:18.220\", \"MeasPeriodAvailPRB\": 20, \"AvailPRBDL\": 30, \"AvailPRBUL\": 45 }";
+
+ Data d2;
+ DataMap dmap2;
+ char key2[] = "310-680-200-555002";
+ std::cout << "KEY: "<< key2 << std::endl;
+ Key k2 = key2;
+ d2.assign(data_string.begin(), data_string.end());
+ // d.push_back(num);
+ dmap2.insert({k2,d});
+
+ sdl->set(nsc, dmap2);
+
+
+
+ std::string data_string = "{ \"CellID\": \"310-680-200-555003\", \"MeasTimestampPDCPBytes\": \"2020-03-18 02:23:18.220\", \"MeasPeriodPDCPBytes\": 20, \"PDCPBytesDL\": 800000, \"PDCPBytesUL\": 400000, \"MeasTimestampAvailPRB\": \"2020-03-18 02:23:18.220\", \"MeasPeriodAvailPRB\": 20, \"AvailPRBDL\": 30, \"AvailPRBUL\": 45 }";
+
+ Data d3;
+ DataMap dmap3;
+ char key3[] = "310-680-200-555003";
+ std::cout << "KEY: "<< key3 << std::endl;
+ Key k3 = key3;
+ d3.assign(data_string.begin(), data_string.end());
+ // d.push_back(num);
+ dmap3.insert({k3,d3});
+
+ sdl->set(nsc, dmap3);
+
+
+
+ data_string = "{ \"UEID\": 12345, \"ServingCellID\": \"310-680-200-555002\", \"MeasTimestampUEPDCPBytes\": \"2020-03-18 02:23:18.220\", \"MeasPeriodUEPDCPBytes\": 20,\"UEPDCPBytesDL\": 250000,\"UEPDCPBytesUL\": 100000, \"MeasTimestampUEPRBUsage\": \"2020-03-18 02:23:18.220\", \"MeasPeriodUEPRBUsage\": 20, \"UEPRBUsageDL\": 10, \"UEPRBUsageUL\": 30, \"MeasTimestampRF\": \"2020-03-18 02:23:18.210\",\"MeasPeriodRF\": 40, \"ServingCellRF\": [-115,-16,-5], \"NeighborCellRF\": [ {\"CID\": \"310-680-200-555001\",\"Cell-RF\": [-90,-13,-2.5 ] }, {\"CID\": \"310-680-200-555003\", \"Cell-RF\": [-140,-17,-6 ] } ] }";
+
+ Data d4;
+ DataMap dmap4;
+ char key4[] = "12345";
+ std::cout << "KEY: "<< key << std::endl;
+ d4.assign(data_string.begin(), data_string.end());
+ Key k4 = key4;
+ // d.push_back(num);
+ dmap4.insert({k4,d4});
+
+ sdl->set(nsu, dmap4);
+
+
+ }
+ catch(...){
+ fprintf(stderr,"SDL Error in Set Data for Namespace");
+ return false;
+ }
+
+ fprintf(stderr, "after sdl set\n");
+
+ */
+
+ fprintf(stderr, "before sdl get\n");
+
+
+ std::string prefix2="310";
+ Keys K = sdl->findKeys(nsc, prefix2); // just the prefix
+ DataMap Dk = sdl->get(nsc, K);
+
+ std::cout << "K contains " << K.size() << " elements.\n";
+
+ fprintf(stderr, "before forloop\n");
+
+ for(auto si=K.begin();si!=K.end();++si){
+ std::vector<uint8_t> val_v = Dk[(*si)]; // 4 lines to unpack a string
+ char val[val_v.size()+1]; // from Data
+ int i;
+ for(i=0;i<val_v.size();++i) val[i] = (char)(val_v[i]);
+ val[i]='\0';
+ fprintf(stderr, "KEYS and Values %s = %s\n",(*si).c_str(), val);
+ }
+
+
+ std::string prefix3="12";
+ Keys K2 = sdl->findKeys(nsu, prefix3); // just the prefix
+ DataMap Dk2 = sdl->get(nsu, K2);
+
+ std::cout << "K contains " << K2.size() << " elements.\n";
+
+ fprintf(stderr, "before forloop\n");
+
+ for(auto si=K2.begin();si!=K2.end();++si){
+ std::vector<uint8_t> val_v = Dk2[(*si)]; // 4 lines to unpack a string
+ char val[val_v.size()+1]; // from Data
+ int i;
+ for(i=0;i<val_v.size();++i) val[i] = (char)(val_v[i]);
+ val[i]='\0';
+ fprintf(stderr, "KEYS and Values %s = %s\n",(*si).c_str(), val);
+ }
+
+
+ fprintf(stderr, "after sdl get\n");
+
+ xfw->Run( nthreads );
+
+ fprintf(stderr, "code3\n");
+
+ msg = xfw->Alloc_msg( 2048 );
+
+ fprintf(stderr, "code4\n");
+
+
+}