--- /dev/null
+AUTOBAHN_DEBUG = true;
+var autobahn = require('autobahn');
+var uuid = require('node-uuid');
+var _ = require('lodash');
+
+// Our modules
+var dm = require('./data_model.js');
+
+
+var DUMP_RESULTS = false;
+
+// TODO: make the url be configurable via command line arg
+var connection = new autobahn.Connection({
+ url: 'ws://localhost:8090/ws',
+ realm: 'dts_mock'
+});
+
+// Instance of our data model/data store
+var dataModel = new dm.DataModel();
+
+var descriptor_module = (function () {
+
+ my = {};
+
+ /*
+ * This function sets descriptors in the dataModel
+ */
+ function on_config_descriptor_catalog(args) {
+ try {
+ var xpath = args[0];
+ var msg = args[1];
+
+ console.log("\n\n*** Got on_config_descriptor_catalog:\n (xpath: %s)(msg: %j)", xpath, msg);
+
+ var descriptor_type = xpath.match(new RegExp(/(nsd|vnfd|vld)-catalog/))[1];
+
+ if (descriptor_type in msg) {
+ msg[descriptor_type].forEach(function(entry) {
+ console.log('Assigning descriptor "%s" with id %s',
+ descriptor_type, entry.id);
+ if (descriptor_type == 'vnfd') {
+ console.log('-- Adding VNFR data');
+ dataModel.addVnfData(entry);
+ } else {
+ // Simply assign
+ dataModel.setDescriptor(descriptor_type, entry);
+ }
+ });
+ }
+ } catch(e) {
+ console.error("Caught exception: %s\n\n%s", e, e.stack);
+ }
+ }
+
+ my.register = function (session) {
+ console.log('Registering for descriptor handling');
+ session.subscribe('dts.config.nsd-catalog', on_config_descriptor_catalog);
+ session.subscribe('dts.config.vnfd-catalog', on_config_descriptor_catalog);
+ session.subscribe('dts.config.vld-catalog', on_config_descriptor_catalog);
+ };
+
+ return my;
+}());
+
+
+var instance_module = (function () {
+ my = {};
+
+ function on_config_config(args) {
+ try {
+ var xpath = args[0];
+ var msg = args[1];
+
+ console.log("\n\n*** Got on_config_config:\n (xpath: %s)(msg: %j)", xpath, msg);
+
+ var record_type = xpath.match(new RegExp(/(ns|vnf|vl)-instance-config/))[1];
+ record_type += 'r';
+
+ console.log('record_type = %s', record_type);
+
+ if (record_type in msg) {
+ msg[record_type].forEach(function(entry) {
+ console.log('Assigning record (%s) id=%s, descriptor: id=%s',
+ record_type, entry.id, entry.nsd_ref);
+ if (record_type == 'nsr') {
+ dataModel.setNsInstanceConfig(entry);
+ } else {
+ // vnfd, vld, which don't have instance_config records yet
+ dataModel.setConfigRecord(record_type, entry);
+ }
+ });
+ }
+
+ } catch (e) {
+ console.error("Caught exception: %s\n\n%s", e, e.stack);
+ }
+ }
+
+ /*
+ * Get all nsr opdata records:
+ * xpath: D,/nsr:ns-instance-opdata/nsr:nsr
+ * msg: {"nsr":[{"ns_instance_config_ref":""}]}
+ *
+ * Get Ping Pong nsr opdata record:
+ * xpath: D,/nsr:ns-instance-opdata/nsr:nsr[nsr:ns-instance-config-ref='f5f41f36-78f6-11e5-b9ba-6cb3113b406f']
+ * msg: {"nsr":[{"ns_instance_config_ref":"f5f41f36-78f6-11e5-b9ba-6cb3113b406f"}]}
+ *
+ * Get monitoring param for nsr instance opdata record:
+ * xpath: D,/nsr:ns-instance-opdata/nsr:nsr[nsr:ns-instance-config-ref='f5f41f36-78f6-11e5-b9ba-6cb3113b406f']
+ * msg: {
+ * "nsr":[{
+ * "monitoring_param":[{"id":""}],
+ * "ns_instance_config_ref":"f5f41f36-78f6-11e5-b9ba-6cb3113b406f"
+ * }]}
+ *
+ * Note that the xpath arg is identical in getting the entire NSR and getting sub-elements in the NSR
+ * The message tells what values to get
+ */
+ function on_get_opdata(args) {
+ try {
+ var xpath = args[0];
+ var msg = args[1];
+ //console.log("\n\n*** Got on_get_opdata:\n (xpath: %s)(msg: %j)", xpath, msg);
+ console.log("*** Got on_get_opdata:\n (xpath: %s)(msg: %j)", xpath, msg);
+
+ var record_type = xpath.match(new RegExp(/(ns|vnf|vl)-instance-opdata/))[1];
+ record_type += 'r';
+
+ var gi_type_map = {
+ "nsr": "RwNsrYang.YangData_Nsr_NsInstanceOpdata",
+ "vnfr": "VnfrYang.YangData_Vnfr_VnfInstanceOpdata_Vnfr",
+ "vlr": "VlrYang.YangData_Vlr_VlInstanceOpdata_Vlr"
+ };
+
+ if (record_type == 'nsr') {
+ //console.log("###################\n data model:\n\n");
+ //dataModel.prettyPrint();
+ var response = {
+ 'nsr': dataModel.getNsInstanceOpdata()
+ };
+ var respond_xpath = 'D,/nsr:ns-instance-opdata';
+ } else {
+ throw new dm.NotImplementedException(
+ "record_type '%s' is not yet supported.", record_type);
+ }
+
+ var result = new autobahn.Result([
+ 'RwNsrYang.YangData_Nsr_NsInstanceOpdata',
+ response
+ ], {"xpath": respond_xpath});
+
+ if (DUMP_RESULTS)
+ console.log("result=\n%s", JSON.stringify(result) );
+
+ return result;
+ } catch(e) {
+ console.error("Caught exception: %s\n\n%s", e, e.stack);
+ }
+ }
+
+ function on_get_vnfr_catalog(args) {
+ try {
+ var xpath = args[0];
+ var msg = args[1];
+ console.log("*** Got on_vnfr_catalog:\n (xpath: %s)(msg: %j)", xpath, msg);
+
+ var response = {
+ 'vnfr': dataModel.getVnfrs()
+ };
+ var respond_xpath = 'D,/vnfr:vnfr-catalog';
+
+ var result = new autobahn.Result([
+ 'RwVnfrYang.YangData_Vnfr_VnfrCatalog',
+ response
+ ], {"xpath": respond_xpath});
+
+ if (DUMP_RESULTS)
+ console.log("result=\n%s", JSON.stringify(result) );
+
+ return result;
+ } catch(e) {
+ console.error("Caught exception: %s\n\n%s", e, e.stack);
+ }
+ }
+
+ my.register = function (session) {
+ console.log('Registering for record handling');
+ session.register('dts.data.ns-instance-opdata', on_get_opdata);
+ session.register('dts.data.vnfr-catalog', on_get_vnfr_catalog);
+ session.subscribe('dts.config.ns-instance-config', on_config_config);
+ }
+
+ return my;
+}());
+
+
+var action_module = (function() {
+ my = {};
+
+ /*
+ * Set the specified VNFR operating state
+ *
+ * (xpath: I,/lpmocklet:start-vnfr)
+ * (msg: {"id":"f26b90b0-8184-11e5-bc47-2b429643382b"})
+ */
+ function on_set_opstate(args) {
+ try {
+ var xpath = args[0];
+ var msg = args[1];
+
+ console.log("\n\n*** Got on_start_vnfr:\n (xpath: %s)(msg: %j)",
+ xpath, msg);
+ var action_match = xpath.match(new RegExp(/lpmocklet:(\w+)-(\w+)/));
+ var action = action_match[1];
+ var obj_type = action_match[2];
+
+ var record_id = msg['id'];
+ console.log('action="%s", obj_type="%s", record_id="%s"',
+ action, obj_type, record_id);
+
+ if (obj_type == 'vnfr') {
+ if (action == 'start') {
+ dataModel.startVnfr(record_id);
+ }
+ else if (action == 'stop') {
+ dataModel.stopVnfr(record_id);
+ }
+ else {
+ console.error('Unsupported opstate action "%s"', action);
+ }
+ } else {
+ console.error('Unsupported opstate action object: "%s"',
+ obj_type);
+ }
+
+ console.log('\n\nBuilding response....');
+
+ var response = {
+ id: uuid.v1(),
+ object_type: obj_type,
+ action: action,
+ status: 'SUCCESS'
+ };
+ var respond_xpath = 'D,/lpmocklet:lpmocklet-action-status';
+ var result = new autobahn.Result([
+ 'LpmockletYang.YangData_Lpmocklet_LpmockletActionStatus',
+ response
+ ], {"xpath": respond_xpath});
+
+ console.log('Done running on_set_opdata');
+ return result;
+
+ } catch (e) {
+ console.error("Caught exception: %s\n\n%s", e, e.stack);
+ }
+ }
+
+ function on_set_control_param(args) {
+ try {
+ var xpath = args[0];
+ var msg = args[1];
+
+ console.log("\n\n*** Got on_set_control_param:\n (xpath: %s)(msg: %j)",
+ xpath, msg);
+
+ // We can ignore xpath. We expect: "I,/lpmocklet:set-control-param"
+// msg: {"set":{"id":"f8d63b30-84b3-11e5-891c-61c6a71edd3c","obj_code":"VNFR","control_id":"ping-packet-size-1","value":10}}
+
+ var response_class = 'LpmockletYang.YangData_Lpmocklet_LpmockletActionStatus';
+ var status = dataModel.updateControlParam(
+ msg.obj_code.toLowerCase(),
+ msg.id,
+ msg.control_id,
+ msg.value);
+
+ var response = {
+ id: uuid.v1(),
+ object_type: msg.obj_code,
+ action: msg.control_id,
+ status: status
+ };
+
+ var respond_xpath = 'D,/lpmocklet:lpmocklet-action-status';
+ var result = new autobahn.Result([
+ 'LpmockletYang.YangData_Lpmocklet_LpmockletActionStatus',
+ response
+ ], {"xpath": respond_xpath});
+
+ console.log('Done running on_set_opdata');
+ return result;
+ } catch (e) {
+ console.error("Caught exception: %s\n\n%s", e, e.stack);
+ }
+ }
+
+ my.register = function(session) {
+ console.log('Registering for action handling');
+ session.register('dts.rpc.start-vnfr', on_set_opstate);
+ session.register('dts.rpc.stop-vnfr', on_set_opstate);
+ session.register('dts.rpc.set-control-param', on_set_control_param);
+ }
+
+ return my;
+
+}());
+
+
+connection.onopen = function (session) {
+ console.log('Connection to wamp server established!');
+ descriptor_module.register(session);
+ instance_module.register(session);
+ action_module.register(session);
+}
+
+console.log('Opening autobahn connection');
+connection.open();
+