From 66e603906a7c47f574b6ad82211515ce8c93da2d Mon Sep 17 00:00:00 2001 From: bharnden Date: Mon, 29 Apr 2019 23:31:47 -0700 Subject: [PATCH] updates to layout core module packages in a more logical way, including renaming methods from objects to nodes and nodes.objid to nodes.id --- daemon/core/api/__init__.py | 3 - daemon/core/{ => api}/grpc/__init__.py | 0 daemon/core/{ => api}/grpc/client.py | 6 +- daemon/core/api/grpc/core_pb2.py | 6527 +++++++++++++++++ daemon/core/api/grpc/core_pb2_grpc.py | 828 +++ daemon/core/{ => api}/grpc/server.py | 24 +- daemon/core/{misc => api/tlv}/__init__.py | 0 daemon/core/{ => api/tlv}/broker.py | 51 +- daemon/core/api/{ => tlv}/coreapi.py | 32 +- daemon/core/{ => api/tlv}/corehandlers.py | 72 +- daemon/core/{ => api/tlv}/coreserver.py | 0 daemon/core/api/{ => tlv}/dataconversion.py | 7 +- daemon/core/{misc => api/tlv}/structutils.py | 0 daemon/core/{conf.py => config.py} | 2 +- daemon/core/coreobj.py | 758 -- daemon/core/emane/bypass.py | 6 +- daemon/core/emane/commeffect.py | 6 +- daemon/core/emane/emanemanager.py | 40 +- daemon/core/emane/emanemanifest.py | 4 +- daemon/core/emane/emanemodel.py | 12 +- daemon/core/emane/nodes.py | 14 +- daemon/core/emane/tdma.py | 9 +- daemon/core/emulator/coreemu.py | 73 +- daemon/core/{ => emulator}/data.py | 0 daemon/core/emulator/emudata.py | 8 +- daemon/core/{ => emulator}/enumerations.py | 0 daemon/core/{ => emulator}/session.py | 229 +- daemon/core/{netns => location}/__init__.py | 0 .../{location.py => location/corelocation.py} | 4 +- daemon/core/{misc => location}/event.py | 0 daemon/core/{ => location}/mobility.py | 76 +- daemon/core/{misc => location}/utm.py | 0 daemon/core/misc/LatLongUTMconversion.py | 246 - daemon/core/misc/nodemaps.py | 28 - daemon/core/misc/quagga.py | 172 - daemon/core/netns/nodes.py | 739 -- daemon/core/netns/vnode.py | 609 -- daemon/core/{phys => nodes}/__init__.py | 0 daemon/core/nodes/base.py | 1158 +++ .../{netns/vnodeclient.py => nodes/client.py} | 5 +- .../core/{netns/vif.py => nodes/interface.py} | 180 +- daemon/core/{misc => nodes}/ipaddress.py | 0 .../core/{netns/vnet.py => nodes/network.py} | 443 +- daemon/core/nodes/nodemaps.py | 29 + daemon/core/{misc => nodes}/nodeutils.py | 0 daemon/core/{netns => nodes}/openvswitch.py | 37 +- daemon/core/nodes/physical.py | 544 ++ daemon/core/phys/pnodes.py | 245 - daemon/core/plugins/__init__.py | 0 daemon/core/{ => plugins}/sdt.py | 41 +- daemon/core/services/__init__.py | 2 +- daemon/core/services/bird.py | 2 +- .../{service.py => services/coreservices.py} | 15 +- daemon/core/services/dockersvc.py | 4 +- daemon/core/services/emaneservices.py | 8 +- daemon/core/services/frr.py | 7 +- daemon/core/services/nrl.py | 6 +- daemon/core/services/quagga.py | 7 +- daemon/core/services/sdn.py | 2 +- daemon/core/services/security.py | 2 +- daemon/core/services/ucarp.py | 2 +- daemon/core/services/utility.py | 9 +- daemon/core/services/xorp.py | 2 +- daemon/core/{misc => }/utils.py | 0 daemon/core/xml/corexml.py | 21 +- daemon/core/xml/corexmldeployment.py | 14 +- daemon/core/xml/emanexml.py | 14 +- daemon/examples/api/emane80211.py | 4 +- daemon/examples/api/switch.py | 6 +- daemon/examples/api/switch_inject.py | 2 +- daemon/examples/api/wlan.py | 8 +- daemon/examples/eventloop.py | 2 +- daemon/examples/grpc/switch.py | 3 +- daemon/examples/myservices/sample.py | 4 +- daemon/examples/netns/daemonnodes.py | 32 +- daemon/examples/netns/distributed.py | 17 +- daemon/examples/netns/howmanynodes.py | 13 +- daemon/examples/netns/ospfmanetmdrtest.py | 19 +- daemon/examples/netns/wlanemanetests.py | 15 +- daemon/examples/stopsession.py | 4 +- daemon/proto/Makefile.am | 4 +- daemon/scripts/core-daemon | 12 +- daemon/scripts/coresendmsg | 10 +- daemon/tests/conftest.py | 44 +- daemon/tests/distributed/test_distributed.py | 16 +- daemon/tests/myservices/sample.py | 2 +- daemon/tests/test_conf.py | 14 +- daemon/tests/test_core.py | 10 +- daemon/tests/test_grpc.py | 20 +- daemon/tests/test_gui.py | 22 +- daemon/tests/test_links.py | 4 +- daemon/tests/test_nodes.py | 6 +- daemon/tests/test_services.py | 6 +- daemon/tests/test_utils.py | 2 +- daemon/tests/test_xml.py | 40 +- ns3/corens3/obj.py | 23 +- ns3/examples/ns3lte.py | 6 +- ns3/examples/ns3wifi.py | 6 +- ns3/examples/ns3wifirandomwalk.py | 6 +- ns3/examples/ns3wimax.py | 6 +- 100 files changed, 10283 insertions(+), 3489 deletions(-) rename daemon/core/{ => api}/grpc/__init__.py (100%) rename daemon/core/{ => api}/grpc/client.py (99%) create mode 100644 daemon/core/api/grpc/core_pb2.py create mode 100644 daemon/core/api/grpc/core_pb2_grpc.py rename daemon/core/{ => api}/grpc/server.py (98%) rename daemon/core/{misc => api/tlv}/__init__.py (100%) rename daemon/core/{ => api/tlv}/broker.py (96%) rename daemon/core/api/{ => tlv}/coreapi.py (97%) rename daemon/core/{ => api/tlv}/corehandlers.py (97%) rename daemon/core/{ => api/tlv}/coreserver.py (100%) rename daemon/core/api/{ => tlv}/dataconversion.py (94%) rename daemon/core/{misc => api/tlv}/structutils.py (100%) rename daemon/core/{conf.py => config.py} (99%) delete mode 100644 daemon/core/coreobj.py rename daemon/core/{ => emulator}/data.py (100%) rename daemon/core/{ => emulator}/enumerations.py (100%) rename daemon/core/{ => emulator}/session.py (86%) rename daemon/core/{netns => location}/__init__.py (100%) rename daemon/core/{location.py => location/corelocation.py} (99%) rename daemon/core/{misc => location}/event.py (100%) rename daemon/core/{ => location}/mobility.py (95%) rename daemon/core/{misc => location}/utm.py (100%) delete mode 100755 daemon/core/misc/LatLongUTMconversion.py delete mode 100644 daemon/core/misc/nodemaps.py delete mode 100644 daemon/core/misc/quagga.py delete mode 100644 daemon/core/netns/nodes.py delete mode 100644 daemon/core/netns/vnode.py rename daemon/core/{phys => nodes}/__init__.py (100%) create mode 100644 daemon/core/nodes/base.py rename daemon/core/{netns/vnodeclient.py => nodes/client.py} (98%) rename daemon/core/{netns/vif.py => nodes/interface.py} (69%) rename daemon/core/{misc => nodes}/ipaddress.py (100%) rename daemon/core/{netns/vnet.py => nodes/network.py} (58%) create mode 100644 daemon/core/nodes/nodemaps.py rename daemon/core/{misc => nodes}/nodeutils.py (100%) rename daemon/core/{netns => nodes}/openvswitch.py (96%) create mode 100644 daemon/core/nodes/physical.py delete mode 100644 daemon/core/phys/pnodes.py create mode 100644 daemon/core/plugins/__init__.py rename daemon/core/{ => plugins}/sdt.py (94%) rename daemon/core/{service.py => services/coreservices.py} (98%) rename daemon/core/{misc => }/utils.py (100%) diff --git a/daemon/core/api/__init__.py b/daemon/core/api/__init__.py index c2e3c613..e69de29b 100644 --- a/daemon/core/api/__init__.py +++ b/daemon/core/api/__init__.py @@ -1,3 +0,0 @@ -""" -Contains code specific to the legacy TCP API for interacting with the TCL based GUI. -""" diff --git a/daemon/core/grpc/__init__.py b/daemon/core/api/grpc/__init__.py similarity index 100% rename from daemon/core/grpc/__init__.py rename to daemon/core/api/grpc/__init__.py diff --git a/daemon/core/grpc/client.py b/daemon/core/api/grpc/client.py similarity index 99% rename from daemon/core/grpc/client.py rename to daemon/core/api/grpc/client.py index a6863e37..d3ec9ae8 100644 --- a/daemon/core/grpc/client.py +++ b/daemon/core/api/grpc/client.py @@ -10,9 +10,9 @@ from contextlib import contextmanager import grpc -from core.grpc import core_pb2 -from core.grpc import core_pb2_grpc -from core.misc.ipaddress import Ipv4Prefix, Ipv6Prefix, MacAddress +from core.api.grpc import core_pb2 +from core.api.grpc import core_pb2_grpc +from core.nodes.ipaddress import Ipv4Prefix, Ipv6Prefix, MacAddress class InterfaceHelper(object): diff --git a/daemon/core/api/grpc/core_pb2.py b/daemon/core/api/grpc/core_pb2.py new file mode 100644 index 00000000..754f76c7 --- /dev/null +++ b/daemon/core/api/grpc/core_pb2.py @@ -0,0 +1,6527 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: core.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='core.proto', + package='core', + syntax='proto3', + serialized_options=None, + serialized_pb=_b('\n\ncore.proto\x12\x04\x63ore\"\"\n\x14\x43reateSessionRequest\x12\n\n\x02id\x18\x01 \x01(\x05\"F\n\x15\x43reateSessionResponse\x12\n\n\x02id\x18\x01 \x01(\x05\x12!\n\x05state\x18\x02 \x01(\x0e\x32\x12.core.SessionState\"\"\n\x14\x44\x65leteSessionRequest\x12\n\n\x02id\x18\x01 \x01(\x05\"\'\n\x15\x44\x65leteSessionResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"\x14\n\x12GetSessionsRequest\"=\n\x13GetSessionsResponse\x12&\n\x08sessions\x18\x01 \x03(\x0b\x32\x14.core.SessionSummary\"\x1f\n\x11GetSessionRequest\x12\n\n\x02id\x18\x01 \x01(\x05\"4\n\x12GetSessionResponse\x12\x1e\n\x07session\x18\x01 \x01(\x0b\x32\r.core.Session\"&\n\x18GetSessionOptionsRequest\x12\n\n\x02id\x18\x01 \x01(\x05\">\n\x19GetSessionOptionsResponse\x12!\n\x06groups\x18\x01 \x03(\x0b\x32\x11.core.ConfigGroup\"\x91\x01\n\x18SetSessionOptionsRequest\x12\n\n\x02id\x18\x01 \x01(\x05\x12:\n\x06\x63onfig\x18\x02 \x03(\x0b\x32*.core.SetSessionOptionsRequest.ConfigEntry\x1a-\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"+\n\x19SetSessionOptionsResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"\'\n\x19GetSessionLocationRequest\x12\n\n\x02id\x18\x01 \x01(\x05\"M\n\x1aGetSessionLocationResponse\x12 \n\x08position\x18\x01 \x01(\x0b\x32\x0e.core.Position\x12\r\n\x05scale\x18\x02 \x01(\x02\"X\n\x19SetSessionLocationRequest\x12\n\n\x02id\x18\x01 \x01(\x05\x12 \n\x08position\x18\x02 \x01(\x0b\x32\x0e.core.Position\x12\r\n\x05scale\x18\x03 \x01(\x02\",\n\x1aSetSessionLocationResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"G\n\x16SetSessionStateRequest\x12\n\n\x02id\x18\x01 \x01(\x05\x12!\n\x05state\x18\x02 \x01(\x0e\x32\x12.core.SessionState\")\n\x17SetSessionStateResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"\x1f\n\x11NodeEventsRequest\x12\n\n\x02id\x18\x01 \x01(\x05\"%\n\tNodeEvent\x12\x18\n\x04node\x18\x01 \x01(\x0b\x32\n.core.Node\"\x1f\n\x11LinkEventsRequest\x12\n\n\x02id\x18\x01 \x01(\x05\"N\n\tLinkEvent\x12\'\n\x0cmessage_type\x18\x01 \x01(\x0e\x32\x11.core.MessageType\x12\x18\n\x04link\x18\x02 \x01(\x0b\x32\n.core.Link\"\"\n\x14SessionEventsRequest\x12\n\n\x02id\x18\x01 \x01(\x05\"f\n\x0cSessionEvent\x12\x0c\n\x04node\x18\x01 \x01(\x05\x12\r\n\x05\x65vent\x18\x02 \x01(\x05\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\x12\x0c\n\x04time\x18\x05 \x01(\x02\x12\x0f\n\x07session\x18\x06 \x01(\x05\"!\n\x13\x43onfigEventsRequest\x12\n\n\x02id\x18\x01 \x01(\x05\"\x9e\x02\n\x0b\x43onfigEvent\x12\'\n\x0cmessage_type\x18\x01 \x01(\x0e\x32\x11.core.MessageType\x12\x0c\n\x04node\x18\x02 \x01(\x05\x12\x0e\n\x06object\x18\x03 \x01(\t\x12\x0c\n\x04type\x18\x04 \x01(\x05\x12\x12\n\ndata_types\x18\x05 \x03(\x05\x12\x13\n\x0b\x64\x61ta_values\x18\x06 \x01(\t\x12\x10\n\x08\x63\x61ptions\x18\x07 \x01(\t\x12\x0e\n\x06\x62itmap\x18\x08 \x01(\t\x12\x17\n\x0fpossible_values\x18\t \x01(\t\x12\x0e\n\x06groups\x18\n \x01(\t\x12\x0f\n\x07session\x18\x0b \x01(\t\x12\x11\n\tinterface\x18\x0c \x01(\x05\x12\x12\n\nnetwork_id\x18\r \x01(\x05\x12\x0e\n\x06opaque\x18\x0e \x01(\t\"$\n\x16\x45xceptionEventsRequest\x12\n\n\x02id\x18\x01 \x01(\x05\"\x90\x01\n\x0e\x45xceptionEvent\x12\x0c\n\x04node\x18\x01 \x01(\x05\x12\x0f\n\x07session\x18\x02 \x01(\x05\x12#\n\x05level\x18\x03 \x01(\x0e\x32\x14.core.ExceptionLevel\x12\x0e\n\x06source\x18\x04 \x01(\t\x12\x0c\n\x04\x64\x61te\x18\x05 \x01(\t\x12\x0c\n\x04text\x18\x06 \x01(\t\x12\x0e\n\x06opaque\x18\x07 \x01(\t\"\x1f\n\x11\x46ileEventsRequest\x12\n\n\x02id\x18\x01 \x01(\x05\"\xc4\x01\n\tFileEvent\x12\'\n\x0cmessage_type\x18\x01 \x01(\x0e\x32\x11.core.MessageType\x12\x0c\n\x04node\x18\x02 \x01(\x05\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0c\n\x04mode\x18\x04 \x01(\t\x12\x0e\n\x06number\x18\x05 \x01(\x05\x12\x0c\n\x04type\x18\x06 \x01(\t\x12\x0e\n\x06source\x18\x07 \x01(\t\x12\x0f\n\x07session\x18\x08 \x01(\x05\x12\x0c\n\x04\x64\x61ta\x18\t \x01(\x0c\x12\x17\n\x0f\x63ompressed_data\x18\n \x01(\x0c\";\n\x0e\x41\x64\x64NodeRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\x18\n\x04node\x18\x02 \x01(\x0b\x32\n.core.Node\"\x1d\n\x0f\x41\x64\x64NodeResponse\x12\n\n\x02id\x18\x01 \x01(\x05\"-\n\x0eGetNodeRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\"P\n\x0fGetNodeResponse\x12\x18\n\x04node\x18\x01 \x01(\x0b\x32\n.core.Node\x12#\n\ninterfaces\x18\x02 \x03(\x0b\x32\x0f.core.Interface\"P\n\x0f\x45\x64itNodeRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12 \n\x08position\x18\x03 \x01(\x0b\x32\x0e.core.Position\"\"\n\x10\x45\x64itNodeResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"0\n\x11\x44\x65leteNodeRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\"$\n\x12\x44\x65leteNodeResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"2\n\x13GetNodeLinksRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\"1\n\x14GetNodeLinksResponse\x12\x19\n\x05links\x18\x01 \x03(\x0b\x32\n.core.Link\";\n\x0e\x41\x64\x64LinkRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\x18\n\x04link\x18\x02 \x01(\x0b\x32\n.core.Link\"!\n\x0f\x41\x64\x64LinkResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"\x98\x01\n\x0f\x45\x64itLinkRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\x10\n\x08node_one\x18\x02 \x01(\x05\x12\x10\n\x08node_two\x18\x03 \x01(\x05\x12\x15\n\rinterface_one\x18\x04 \x01(\x05\x12\x15\n\rinterface_two\x18\x05 \x01(\x05\x12\"\n\x07options\x18\x06 \x01(\x0b\x32\x11.core.LinkOptions\"\"\n\x10\x45\x64itLinkResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"v\n\x11\x44\x65leteLinkRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\x10\n\x08node_one\x18\x02 \x01(\x05\x12\x10\n\x08node_two\x18\x03 \x01(\x05\x12\x15\n\rinterface_one\x18\x04 \x01(\x05\x12\x15\n\rinterface_two\x18\x05 \x01(\x05\"$\n\x12\x44\x65leteLinkResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"\"\n\x0fGetHooksRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\"-\n\x10GetHooksResponse\x12\x19\n\x05hooks\x18\x01 \x03(\x0b\x32\n.core.Hook\";\n\x0e\x41\x64\x64HookRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\x18\n\x04hook\x18\x02 \x01(\x0b\x32\n.core.Hook\"!\n\x0f\x41\x64\x64HookResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\",\n\x19GetMobilityConfigsRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\"\xf2\x01\n\x1aGetMobilityConfigsResponse\x12>\n\x07\x63onfigs\x18\x01 \x03(\x0b\x32-.core.GetMobilityConfigsResponse.ConfigsEntry\x1a\x33\n\x0eMobilityConfig\x12!\n\x06groups\x18\x01 \x03(\x0b\x32\x11.core.ConfigGroup\x1a_\n\x0c\x43onfigsEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.core.GetMobilityConfigsResponse.MobilityConfig:\x02\x38\x01\"7\n\x18GetMobilityConfigRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\">\n\x19GetMobilityConfigResponse\x12!\n\x06groups\x18\x01 \x03(\x0b\x32\x11.core.ConfigGroup\"\xa2\x01\n\x18SetMobilityConfigRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12:\n\x06\x63onfig\x18\x03 \x03(\x0b\x32*.core.SetMobilityConfigRequest.ConfigEntry\x1a-\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"+\n\x19SetMobilityConfigResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"Z\n\x15MobilityActionRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12$\n\x06\x61\x63tion\x18\x03 \x01(\x0e\x32\x14.core.MobilityAction\"(\n\x16MobilityActionResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"\x14\n\x12GetServicesRequest\"6\n\x13GetServicesResponse\x12\x1f\n\x08services\x18\x01 \x03(\x0b\x32\r.core.Service\",\n\x19GetServiceDefaultsRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\"E\n\x1aGetServiceDefaultsResponse\x12\'\n\x08\x64\x65\x66\x61ults\x18\x01 \x03(\x0b\x32\x15.core.ServiceDefaults\"U\n\x19SetServiceDefaultsRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\'\n\x08\x64\x65\x66\x61ults\x18\x02 \x03(\x0b\x32\x15.core.ServiceDefaults\",\n\x1aSetServiceDefaultsResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"E\n\x15GetNodeServiceRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12\x0f\n\x07service\x18\x03 \x01(\t\"@\n\x16GetNodeServiceResponse\x12&\n\x07service\x18\x01 \x01(\x0b\x32\x15.core.NodeServiceData\"W\n\x19GetNodeServiceFileRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x0c\n\x04\x66ile\x18\x04 \x01(\t\"*\n\x1aGetNodeServiceFileResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"z\n\x15SetNodeServiceRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x0f\n\x07startup\x18\x04 \x03(\t\x12\x10\n\x08validate\x18\x05 \x03(\t\x12\x10\n\x08shutdown\x18\x06 \x03(\t\"(\n\x16SetNodeServiceResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"e\n\x19SetNodeServiceFileRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x0c\n\x04\x66ile\x18\x04 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x05 \x01(\x0c\",\n\x1aSetNodeServiceFileResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"i\n\x14ServiceActionRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12\x0f\n\x07service\x18\x03 \x01(\t\x12#\n\x06\x61\x63tion\x18\x04 \x01(\x0e\x32\x13.core.ServiceAction\"\'\n\x15ServiceActionResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"3\n\x14GetWlanConfigRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\":\n\x15GetWlanConfigResponse\x12!\n\x06groups\x18\x01 \x03(\x0b\x32\x11.core.ConfigGroup\"\x9a\x01\n\x14SetWlanConfigRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12\x36\n\x06\x63onfig\x18\x03 \x03(\x0b\x32&.core.SetWlanConfigRequest.ConfigEntry\x1a-\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\'\n\x15SetWlanConfigResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"(\n\x15GetEmaneConfigRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\";\n\x16GetEmaneConfigResponse\x12!\n\x06groups\x18\x01 \x03(\x0b\x32\x11.core.ConfigGroup\"\x90\x01\n\x15SetEmaneConfigRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\x37\n\x06\x63onfig\x18\x02 \x03(\x0b\x32\'.core.SetEmaneConfigRequest.ConfigEntry\x1a-\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"(\n\x16SetEmaneConfigResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\"(\n\x15GetEmaneModelsRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\"(\n\x16GetEmaneModelsResponse\x12\x0e\n\x06models\x18\x01 \x03(\t\"[\n\x1aGetEmaneModelConfigRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12\x11\n\tinterface\x18\x03 \x01(\x05\x12\r\n\x05model\x18\x04 \x01(\t\"@\n\x1bGetEmaneModelConfigResponse\x12!\n\x06groups\x18\x01 \x03(\x0b\x32\x11.core.ConfigGroup\"\xc8\x01\n\x1aSetEmaneModelConfigRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12\x11\n\tinterface\x18\x03 \x01(\x05\x12\r\n\x05model\x18\x04 \x01(\t\x12<\n\x06\x63onfig\x18\x05 \x03(\x0b\x32,.core.SetEmaneModelConfigRequest.ConfigEntry\x1a-\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"-\n\x1bSetEmaneModelConfigResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\".\n\x1bGetEmaneModelConfigsRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\"\x81\x02\n\x1cGetEmaneModelConfigsResponse\x12@\n\x07\x63onfigs\x18\x01 \x03(\x0b\x32/.core.GetEmaneModelConfigsResponse.ConfigsEntry\x1a?\n\x0bModelConfig\x12\r\n\x05model\x18\x01 \x01(\t\x12!\n\x06groups\x18\x02 \x03(\x0b\x32\x11.core.ConfigGroup\x1a^\n\x0c\x43onfigsEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12=\n\x05value\x18\x02 \x01(\x0b\x32..core.GetEmaneModelConfigsResponse.ModelConfig:\x02\x38\x01\"!\n\x0eSaveXmlRequest\x12\x0f\n\x07session\x18\x01 \x01(\x05\"\x1f\n\x0fSaveXmlResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"\x1e\n\x0eOpenXmlRequest\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"2\n\x0fOpenXmlResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\x12\x0f\n\x07session\x18\x02 \x01(\x05\"E\n\x04Hook\x12!\n\x05state\x18\x01 \x01(\x0e\x32\x12.core.SessionState\x12\x0c\n\x04\x66ile\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\"6\n\x0fServiceDefaults\x12\x11\n\tnode_type\x18\x01 \x01(\t\x12\x10\n\x08services\x18\x02 \x03(\t\"&\n\x07Service\x12\r\n\x05group\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\xee\x01\n\x0fNodeServiceData\x12\x13\n\x0b\x65xecutables\x18\x01 \x03(\t\x12\x14\n\x0c\x64\x65pendencies\x18\x02 \x03(\t\x12\x0c\n\x04\x64irs\x18\x03 \x03(\t\x12\x0f\n\x07\x63onfigs\x18\x04 \x03(\t\x12\x0f\n\x07startup\x18\x05 \x03(\t\x12\x10\n\x08validate\x18\x06 \x03(\t\x12\x34\n\x0fvalidation_mode\x18\x07 \x01(\x0e\x32\x1b.core.ServiceValidationMode\x12\x18\n\x10validation_timer\x18\x08 \x01(\x05\x12\x10\n\x08shutdown\x18\t \x03(\t\x12\x0c\n\x04meta\x18\n \x01(\t\"@\n\x0b\x43onfigGroup\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x07options\x18\x02 \x03(\x0b\x32\x12.core.ConfigOption\"X\n\x0c\x43onfigOption\x12\r\n\x05label\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\t\x12\x0c\n\x04type\x18\x04 \x01(\x05\x12\x0e\n\x06select\x18\x05 \x03(\t\"n\n\x07Session\x12\n\n\x02id\x18\x01 \x01(\x05\x12!\n\x05state\x18\x02 \x01(\x0e\x32\x12.core.SessionState\x12\x19\n\x05nodes\x18\x03 \x03(\x0b\x32\n.core.Node\x12\x19\n\x05links\x18\x04 \x03(\x0b\x32\n.core.Link\"N\n\x0eSessionSummary\x12\n\n\x02id\x18\x01 \x01(\x05\x12!\n\x05state\x18\x02 \x01(\x0e\x32\x12.core.SessionState\x12\r\n\x05nodes\x18\x03 \x01(\x05\"\xae\x01\n\x04Node\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x1c\n\x04type\x18\x03 \x01(\x0e\x32\x0e.core.NodeType\x12\r\n\x05model\x18\x04 \x01(\t\x12 \n\x08position\x18\x05 \x01(\x0b\x32\x0e.core.Position\x12\x10\n\x08services\x18\x06 \x03(\t\x12\r\n\x05\x65mane\x18\x07 \x01(\t\x12\x0c\n\x04icon\x18\x08 \x01(\t\x12\x0e\n\x06opaque\x18\t \x01(\t\"\xbc\x01\n\x04Link\x12\x10\n\x08node_one\x18\x01 \x01(\x05\x12\x10\n\x08node_two\x18\x02 \x01(\x05\x12\x1c\n\x04type\x18\x03 \x01(\x0e\x32\x0e.core.LinkType\x12&\n\rinterface_one\x18\x04 \x01(\x0b\x32\x0f.core.Interface\x12&\n\rinterface_two\x18\x05 \x01(\x0b\x32\x0f.core.Interface\x12\"\n\x07options\x18\x06 \x01(\x0b\x32\x11.core.LinkOptions\"\xba\x01\n\x0bLinkOptions\x12\x0e\n\x06opaque\x18\x01 \x01(\t\x12\x0e\n\x06jitter\x18\x02 \x01(\x02\x12\x0b\n\x03key\x18\x03 \x01(\t\x12\x0e\n\x06mburst\x18\x04 \x01(\x02\x12\x0b\n\x03mer\x18\x05 \x01(\x02\x12\x0b\n\x03per\x18\x06 \x01(\x02\x12\x11\n\tbandwidth\x18\x07 \x01(\x02\x12\r\n\x05\x62urst\x18\x08 \x01(\x02\x12\r\n\x05\x64\x65lay\x18\t \x01(\x02\x12\x0b\n\x03\x64up\x18\n \x01(\x02\x12\x16\n\x0eunidirectional\x18\x0b \x01(\x08\"\x9a\x01\n\tInterface\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0b\n\x03mac\x18\x03 \x01(\t\x12\x0b\n\x03ip4\x18\x04 \x01(\t\x12\x0f\n\x07ip4mask\x18\x05 \x01(\x05\x12\x0b\n\x03ip6\x18\x06 \x01(\t\x12\x0f\n\x07ip6mask\x18\x07 \x01(\x05\x12\r\n\x05netid\x18\x08 \x01(\x05\x12\x0e\n\x06\x66lowid\x18\t \x01(\x05\x12\x0b\n\x03mtu\x18\n \x01(\x05\"R\n\x08Position\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\x12\t\n\x01z\x18\x03 \x01(\x02\x12\x0b\n\x03lat\x18\x04 \x01(\x02\x12\x0b\n\x03lon\x18\x05 \x01(\x02\x12\x0b\n\x03\x61lt\x18\x06 \x01(\x02*\x9f\x01\n\x0bMessageType\x12\x10\n\x0cMESSAGE_NONE\x10\x00\x12\x0f\n\x0bMESSAGE_ADD\x10\x01\x12\x12\n\x0eMESSAGE_DELETE\x10\x02\x12\x0f\n\x0bMESSAGE_CRI\x10\x04\x12\x11\n\rMESSAGE_LOCAL\x10\x08\x12\x12\n\x0eMESSAGE_STRING\x10\x10\x12\x10\n\x0cMESSAGE_TEXT\x10 \x12\x0f\n\x0bMESSAGE_TTY\x10@*-\n\x08LinkType\x12\x11\n\rLINK_WIRELESS\x10\x00\x12\x0e\n\nLINK_WIRED\x10\x01*\xa4\x01\n\x0cSessionState\x12\x0e\n\nSTATE_NONE\x10\x00\x12\x14\n\x10STATE_DEFINITION\x10\x01\x12\x17\n\x13STATE_CONFIGURATION\x10\x02\x12\x17\n\x13STATE_INSTANTIATION\x10\x03\x12\x11\n\rSTATE_RUNTIME\x10\x04\x12\x15\n\x11STATE_DATACOLLECT\x10\x05\x12\x12\n\x0eSTATE_SHUTDOWN\x10\x06*\x8b\x02\n\x08NodeType\x12\x10\n\x0cNODE_DEFAULT\x10\x00\x12\x11\n\rNODE_PHYSICAL\x10\x01\x12\x0c\n\x08NODE_TBD\x10\x03\x12\x0f\n\x0bNODE_SWITCH\x10\x04\x12\x0c\n\x08NODE_HUB\x10\x05\x12\x15\n\x11NODE_WIRELESS_LAN\x10\x06\x12\r\n\tNODE_RJ45\x10\x07\x12\x0f\n\x0bNODE_TUNNEL\x10\x08\x12\x10\n\x0cNODE_KTUNNEL\x10\t\x12\x0e\n\nNODE_EMANE\x10\n\x12\x13\n\x0fNODE_TAP_BRIDGE\x10\x0b\x12\x15\n\x11NODE_PEER_TO_PEER\x10\x0c\x12\x14\n\x10NODE_CONTROL_NET\x10\r\x12\x12\n\x0eNODE_EMANE_NET\x10\x0e*c\n\x15ServiceValidationMode\x12\x17\n\x13VALIDATION_BLOCKING\x10\x00\x12\x1b\n\x17VALIDATION_NON_BLOCKING\x10\x01\x12\x14\n\x10VALIDATION_TIMER\x10\x02*_\n\rServiceAction\x12\x11\n\rSERVICE_START\x10\x00\x12\x10\n\x0cSERVICE_STOP\x10\x01\x12\x13\n\x0fSERVICE_RESTART\x10\x02\x12\x14\n\x10SERVICE_VALIDATE\x10\x03*K\n\x0eMobilityAction\x12\x12\n\x0eMOBILITY_START\x10\x00\x12\x12\n\x0eMOBILITY_PAUSE\x10\x01\x12\x11\n\rMOBILITY_STOP\x10\x02*~\n\x0e\x45xceptionLevel\x12\x15\n\x11\x45XCEPTION_DEFAULT\x10\x00\x12\x13\n\x0f\x45XCEPTION_FATAL\x10\x01\x12\x13\n\x0f\x45XCEPTION_ERROR\x10\x02\x12\x15\n\x11\x45XCEPTION_WARNING\x10\x03\x12\x14\n\x10\x45XCEPTION_NOTICE\x10\x04\x32\xe2\x1b\n\x07\x43oreApi\x12J\n\rCreateSession\x12\x1a.core.CreateSessionRequest\x1a\x1b.core.CreateSessionResponse\"\x00\x12J\n\rDeleteSession\x12\x1a.core.DeleteSessionRequest\x1a\x1b.core.DeleteSessionResponse\"\x00\x12\x44\n\x0bGetSessions\x12\x18.core.GetSessionsRequest\x1a\x19.core.GetSessionsResponse\"\x00\x12\x41\n\nGetSession\x12\x17.core.GetSessionRequest\x1a\x18.core.GetSessionResponse\"\x00\x12V\n\x11GetSessionOptions\x12\x1e.core.GetSessionOptionsRequest\x1a\x1f.core.GetSessionOptionsResponse\"\x00\x12V\n\x11SetSessionOptions\x12\x1e.core.SetSessionOptionsRequest\x1a\x1f.core.SetSessionOptionsResponse\"\x00\x12Y\n\x12GetSessionLocation\x12\x1f.core.GetSessionLocationRequest\x1a .core.GetSessionLocationResponse\"\x00\x12Y\n\x12SetSessionLocation\x12\x1f.core.SetSessionLocationRequest\x1a .core.SetSessionLocationResponse\"\x00\x12P\n\x0fSetSessionState\x12\x1c.core.SetSessionStateRequest\x1a\x1d.core.SetSessionStateResponse\"\x00\x12:\n\nNodeEvents\x12\x17.core.NodeEventsRequest\x1a\x0f.core.NodeEvent\"\x00\x30\x01\x12:\n\nLinkEvents\x12\x17.core.LinkEventsRequest\x1a\x0f.core.LinkEvent\"\x00\x30\x01\x12\x43\n\rSessionEvents\x12\x1a.core.SessionEventsRequest\x1a\x12.core.SessionEvent\"\x00\x30\x01\x12@\n\x0c\x43onfigEvents\x12\x19.core.ConfigEventsRequest\x1a\x11.core.ConfigEvent\"\x00\x30\x01\x12I\n\x0f\x45xceptionEvents\x12\x1c.core.ExceptionEventsRequest\x1a\x14.core.ExceptionEvent\"\x00\x30\x01\x12:\n\nFileEvents\x12\x17.core.FileEventsRequest\x1a\x0f.core.FileEvent\"\x00\x30\x01\x12\x38\n\x07\x41\x64\x64Node\x12\x14.core.AddNodeRequest\x1a\x15.core.AddNodeResponse\"\x00\x12\x38\n\x07GetNode\x12\x14.core.GetNodeRequest\x1a\x15.core.GetNodeResponse\"\x00\x12;\n\x08\x45\x64itNode\x12\x15.core.EditNodeRequest\x1a\x16.core.EditNodeResponse\"\x00\x12\x41\n\nDeleteNode\x12\x17.core.DeleteNodeRequest\x1a\x18.core.DeleteNodeResponse\"\x00\x12G\n\x0cGetNodeLinks\x12\x19.core.GetNodeLinksRequest\x1a\x1a.core.GetNodeLinksResponse\"\x00\x12\x38\n\x07\x41\x64\x64Link\x12\x14.core.AddLinkRequest\x1a\x15.core.AddLinkResponse\"\x00\x12;\n\x08\x45\x64itLink\x12\x15.core.EditLinkRequest\x1a\x16.core.EditLinkResponse\"\x00\x12\x41\n\nDeleteLink\x12\x17.core.DeleteLinkRequest\x1a\x18.core.DeleteLinkResponse\"\x00\x12;\n\x08GetHooks\x12\x15.core.GetHooksRequest\x1a\x16.core.GetHooksResponse\"\x00\x12\x38\n\x07\x41\x64\x64Hook\x12\x14.core.AddHookRequest\x1a\x15.core.AddHookResponse\"\x00\x12Y\n\x12GetMobilityConfigs\x12\x1f.core.GetMobilityConfigsRequest\x1a .core.GetMobilityConfigsResponse\"\x00\x12V\n\x11GetMobilityConfig\x12\x1e.core.GetMobilityConfigRequest\x1a\x1f.core.GetMobilityConfigResponse\"\x00\x12V\n\x11SetMobilityConfig\x12\x1e.core.SetMobilityConfigRequest\x1a\x1f.core.SetMobilityConfigResponse\"\x00\x12M\n\x0eMobilityAction\x12\x1b.core.MobilityActionRequest\x1a\x1c.core.MobilityActionResponse\"\x00\x12\x44\n\x0bGetServices\x12\x18.core.GetServicesRequest\x1a\x19.core.GetServicesResponse\"\x00\x12Y\n\x12GetServiceDefaults\x12\x1f.core.GetServiceDefaultsRequest\x1a .core.GetServiceDefaultsResponse\"\x00\x12Y\n\x12SetServiceDefaults\x12\x1f.core.SetServiceDefaultsRequest\x1a .core.SetServiceDefaultsResponse\"\x00\x12M\n\x0eGetNodeService\x12\x1b.core.GetNodeServiceRequest\x1a\x1c.core.GetNodeServiceResponse\"\x00\x12Y\n\x12GetNodeServiceFile\x12\x1f.core.GetNodeServiceFileRequest\x1a .core.GetNodeServiceFileResponse\"\x00\x12M\n\x0eSetNodeService\x12\x1b.core.SetNodeServiceRequest\x1a\x1c.core.SetNodeServiceResponse\"\x00\x12Y\n\x12SetNodeServiceFile\x12\x1f.core.SetNodeServiceFileRequest\x1a .core.SetNodeServiceFileResponse\"\x00\x12J\n\rServiceAction\x12\x1a.core.ServiceActionRequest\x1a\x1b.core.ServiceActionResponse\"\x00\x12J\n\rGetWlanConfig\x12\x1a.core.GetWlanConfigRequest\x1a\x1b.core.GetWlanConfigResponse\"\x00\x12J\n\rSetWlanConfig\x12\x1a.core.SetWlanConfigRequest\x1a\x1b.core.SetWlanConfigResponse\"\x00\x12M\n\x0eGetEmaneConfig\x12\x1b.core.GetEmaneConfigRequest\x1a\x1c.core.GetEmaneConfigResponse\"\x00\x12M\n\x0eSetEmaneConfig\x12\x1b.core.SetEmaneConfigRequest\x1a\x1c.core.SetEmaneConfigResponse\"\x00\x12M\n\x0eGetEmaneModels\x12\x1b.core.GetEmaneModelsRequest\x1a\x1c.core.GetEmaneModelsResponse\"\x00\x12\\\n\x13GetEmaneModelConfig\x12 .core.GetEmaneModelConfigRequest\x1a!.core.GetEmaneModelConfigResponse\"\x00\x12\\\n\x13SetEmaneModelConfig\x12 .core.SetEmaneModelConfigRequest\x1a!.core.SetEmaneModelConfigResponse\"\x00\x12_\n\x14GetEmaneModelConfigs\x12!.core.GetEmaneModelConfigsRequest\x1a\".core.GetEmaneModelConfigsResponse\"\x00\x12\x38\n\x07SaveXml\x12\x14.core.SaveXmlRequest\x1a\x15.core.SaveXmlResponse\"\x00\x12\x38\n\x07OpenXml\x12\x14.core.OpenXmlRequest\x1a\x15.core.OpenXmlResponse\"\x00\x62\x06proto3') +) + +_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='core.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='MESSAGE_NONE', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MESSAGE_ADD', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MESSAGE_DELETE', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MESSAGE_CRI', index=3, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MESSAGE_LOCAL', index=4, number=8, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MESSAGE_STRING', index=5, number=16, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MESSAGE_TEXT', index=6, number=32, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MESSAGE_TTY', index=7, number=64, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=8194, + serialized_end=8353, +) +_sym_db.RegisterEnumDescriptor(_MESSAGETYPE) + +MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) +_LINKTYPE = _descriptor.EnumDescriptor( + name='LinkType', + full_name='core.LinkType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LINK_WIRELESS', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LINK_WIRED', index=1, number=1, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=8355, + serialized_end=8400, +) +_sym_db.RegisterEnumDescriptor(_LINKTYPE) + +LinkType = enum_type_wrapper.EnumTypeWrapper(_LINKTYPE) +_SESSIONSTATE = _descriptor.EnumDescriptor( + name='SessionState', + full_name='core.SessionState', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='STATE_NONE', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='STATE_DEFINITION', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='STATE_CONFIGURATION', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='STATE_INSTANTIATION', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='STATE_RUNTIME', index=4, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='STATE_DATACOLLECT', index=5, number=5, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='STATE_SHUTDOWN', index=6, number=6, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=8403, + serialized_end=8567, +) +_sym_db.RegisterEnumDescriptor(_SESSIONSTATE) + +SessionState = enum_type_wrapper.EnumTypeWrapper(_SESSIONSTATE) +_NODETYPE = _descriptor.EnumDescriptor( + name='NodeType', + full_name='core.NodeType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='NODE_DEFAULT', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NODE_PHYSICAL', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NODE_TBD', index=2, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NODE_SWITCH', index=3, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NODE_HUB', index=4, number=5, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NODE_WIRELESS_LAN', index=5, number=6, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NODE_RJ45', index=6, number=7, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NODE_TUNNEL', index=7, number=8, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NODE_KTUNNEL', index=8, number=9, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NODE_EMANE', index=9, number=10, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NODE_TAP_BRIDGE', index=10, number=11, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NODE_PEER_TO_PEER', index=11, number=12, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NODE_CONTROL_NET', index=12, number=13, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NODE_EMANE_NET', index=13, number=14, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=8570, + serialized_end=8837, +) +_sym_db.RegisterEnumDescriptor(_NODETYPE) + +NodeType = enum_type_wrapper.EnumTypeWrapper(_NODETYPE) +_SERVICEVALIDATIONMODE = _descriptor.EnumDescriptor( + name='ServiceValidationMode', + full_name='core.ServiceValidationMode', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='VALIDATION_BLOCKING', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='VALIDATION_NON_BLOCKING', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='VALIDATION_TIMER', index=2, number=2, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=8839, + serialized_end=8938, +) +_sym_db.RegisterEnumDescriptor(_SERVICEVALIDATIONMODE) + +ServiceValidationMode = enum_type_wrapper.EnumTypeWrapper(_SERVICEVALIDATIONMODE) +_SERVICEACTION = _descriptor.EnumDescriptor( + name='ServiceAction', + full_name='core.ServiceAction', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='SERVICE_START', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_STOP', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_RESTART', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_VALIDATE', index=3, number=3, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=8940, + serialized_end=9035, +) +_sym_db.RegisterEnumDescriptor(_SERVICEACTION) + +ServiceAction = enum_type_wrapper.EnumTypeWrapper(_SERVICEACTION) +_MOBILITYACTION = _descriptor.EnumDescriptor( + name='MobilityAction', + full_name='core.MobilityAction', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='MOBILITY_START', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MOBILITY_PAUSE', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MOBILITY_STOP', index=2, number=2, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=9037, + serialized_end=9112, +) +_sym_db.RegisterEnumDescriptor(_MOBILITYACTION) + +MobilityAction = enum_type_wrapper.EnumTypeWrapper(_MOBILITYACTION) +_EXCEPTIONLEVEL = _descriptor.EnumDescriptor( + name='ExceptionLevel', + full_name='core.ExceptionLevel', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='EXCEPTION_DEFAULT', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='EXCEPTION_FATAL', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='EXCEPTION_ERROR', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='EXCEPTION_WARNING', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='EXCEPTION_NOTICE', index=4, number=4, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=9114, + serialized_end=9240, +) +_sym_db.RegisterEnumDescriptor(_EXCEPTIONLEVEL) + +ExceptionLevel = enum_type_wrapper.EnumTypeWrapper(_EXCEPTIONLEVEL) +MESSAGE_NONE = 0 +MESSAGE_ADD = 1 +MESSAGE_DELETE = 2 +MESSAGE_CRI = 4 +MESSAGE_LOCAL = 8 +MESSAGE_STRING = 16 +MESSAGE_TEXT = 32 +MESSAGE_TTY = 64 +LINK_WIRELESS = 0 +LINK_WIRED = 1 +STATE_NONE = 0 +STATE_DEFINITION = 1 +STATE_CONFIGURATION = 2 +STATE_INSTANTIATION = 3 +STATE_RUNTIME = 4 +STATE_DATACOLLECT = 5 +STATE_SHUTDOWN = 6 +NODE_DEFAULT = 0 +NODE_PHYSICAL = 1 +NODE_TBD = 3 +NODE_SWITCH = 4 +NODE_HUB = 5 +NODE_WIRELESS_LAN = 6 +NODE_RJ45 = 7 +NODE_TUNNEL = 8 +NODE_KTUNNEL = 9 +NODE_EMANE = 10 +NODE_TAP_BRIDGE = 11 +NODE_PEER_TO_PEER = 12 +NODE_CONTROL_NET = 13 +NODE_EMANE_NET = 14 +VALIDATION_BLOCKING = 0 +VALIDATION_NON_BLOCKING = 1 +VALIDATION_TIMER = 2 +SERVICE_START = 0 +SERVICE_STOP = 1 +SERVICE_RESTART = 2 +SERVICE_VALIDATE = 3 +MOBILITY_START = 0 +MOBILITY_PAUSE = 1 +MOBILITY_STOP = 2 +EXCEPTION_DEFAULT = 0 +EXCEPTION_FATAL = 1 +EXCEPTION_ERROR = 2 +EXCEPTION_WARNING = 3 +EXCEPTION_NOTICE = 4 + + + +_CREATESESSIONREQUEST = _descriptor.Descriptor( + name='CreateSessionRequest', + full_name='core.CreateSessionRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.CreateSessionRequest.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=20, + serialized_end=54, +) + + +_CREATESESSIONRESPONSE = _descriptor.Descriptor( + name='CreateSessionResponse', + full_name='core.CreateSessionResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.CreateSessionResponse.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='state', full_name='core.CreateSessionResponse.state', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=56, + serialized_end=126, +) + + +_DELETESESSIONREQUEST = _descriptor.Descriptor( + name='DeleteSessionRequest', + full_name='core.DeleteSessionRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.DeleteSessionRequest.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=128, + serialized_end=162, +) + + +_DELETESESSIONRESPONSE = _descriptor.Descriptor( + name='DeleteSessionResponse', + full_name='core.DeleteSessionResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.DeleteSessionResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=164, + serialized_end=203, +) + + +_GETSESSIONSREQUEST = _descriptor.Descriptor( + name='GetSessionsRequest', + full_name='core.GetSessionsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=205, + serialized_end=225, +) + + +_GETSESSIONSRESPONSE = _descriptor.Descriptor( + name='GetSessionsResponse', + full_name='core.GetSessionsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='sessions', full_name='core.GetSessionsResponse.sessions', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=227, + serialized_end=288, +) + + +_GETSESSIONREQUEST = _descriptor.Descriptor( + name='GetSessionRequest', + full_name='core.GetSessionRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.GetSessionRequest.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=290, + serialized_end=321, +) + + +_GETSESSIONRESPONSE = _descriptor.Descriptor( + name='GetSessionResponse', + full_name='core.GetSessionResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.GetSessionResponse.session', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=323, + serialized_end=375, +) + + +_GETSESSIONOPTIONSREQUEST = _descriptor.Descriptor( + name='GetSessionOptionsRequest', + full_name='core.GetSessionOptionsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.GetSessionOptionsRequest.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=377, + serialized_end=415, +) + + +_GETSESSIONOPTIONSRESPONSE = _descriptor.Descriptor( + name='GetSessionOptionsResponse', + full_name='core.GetSessionOptionsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='groups', full_name='core.GetSessionOptionsResponse.groups', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=417, + serialized_end=479, +) + + +_SETSESSIONOPTIONSREQUEST_CONFIGENTRY = _descriptor.Descriptor( + name='ConfigEntry', + full_name='core.SetSessionOptionsRequest.ConfigEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='core.SetSessionOptionsRequest.ConfigEntry.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='core.SetSessionOptionsRequest.ConfigEntry.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=_b('8\001'), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=582, + serialized_end=627, +) + +_SETSESSIONOPTIONSREQUEST = _descriptor.Descriptor( + name='SetSessionOptionsRequest', + full_name='core.SetSessionOptionsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.SetSessionOptionsRequest.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='config', full_name='core.SetSessionOptionsRequest.config', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_SETSESSIONOPTIONSREQUEST_CONFIGENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=482, + serialized_end=627, +) + + +_SETSESSIONOPTIONSRESPONSE = _descriptor.Descriptor( + name='SetSessionOptionsResponse', + full_name='core.SetSessionOptionsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.SetSessionOptionsResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=629, + serialized_end=672, +) + + +_GETSESSIONLOCATIONREQUEST = _descriptor.Descriptor( + name='GetSessionLocationRequest', + full_name='core.GetSessionLocationRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.GetSessionLocationRequest.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=674, + serialized_end=713, +) + + +_GETSESSIONLOCATIONRESPONSE = _descriptor.Descriptor( + name='GetSessionLocationResponse', + full_name='core.GetSessionLocationResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='position', full_name='core.GetSessionLocationResponse.position', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='scale', full_name='core.GetSessionLocationResponse.scale', index=1, + number=2, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=715, + serialized_end=792, +) + + +_SETSESSIONLOCATIONREQUEST = _descriptor.Descriptor( + name='SetSessionLocationRequest', + full_name='core.SetSessionLocationRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.SetSessionLocationRequest.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='position', full_name='core.SetSessionLocationRequest.position', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='scale', full_name='core.SetSessionLocationRequest.scale', index=2, + number=3, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=794, + serialized_end=882, +) + + +_SETSESSIONLOCATIONRESPONSE = _descriptor.Descriptor( + name='SetSessionLocationResponse', + full_name='core.SetSessionLocationResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.SetSessionLocationResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=884, + serialized_end=928, +) + + +_SETSESSIONSTATEREQUEST = _descriptor.Descriptor( + name='SetSessionStateRequest', + full_name='core.SetSessionStateRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.SetSessionStateRequest.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='state', full_name='core.SetSessionStateRequest.state', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=930, + serialized_end=1001, +) + + +_SETSESSIONSTATERESPONSE = _descriptor.Descriptor( + name='SetSessionStateResponse', + full_name='core.SetSessionStateResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.SetSessionStateResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1003, + serialized_end=1044, +) + + +_NODEEVENTSREQUEST = _descriptor.Descriptor( + name='NodeEventsRequest', + full_name='core.NodeEventsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.NodeEventsRequest.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1046, + serialized_end=1077, +) + + +_NODEEVENT = _descriptor.Descriptor( + name='NodeEvent', + full_name='core.NodeEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='node', full_name='core.NodeEvent.node', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1079, + serialized_end=1116, +) + + +_LINKEVENTSREQUEST = _descriptor.Descriptor( + name='LinkEventsRequest', + full_name='core.LinkEventsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.LinkEventsRequest.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1118, + serialized_end=1149, +) + + +_LINKEVENT = _descriptor.Descriptor( + name='LinkEvent', + full_name='core.LinkEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message_type', full_name='core.LinkEvent.message_type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='link', full_name='core.LinkEvent.link', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1151, + serialized_end=1229, +) + + +_SESSIONEVENTSREQUEST = _descriptor.Descriptor( + name='SessionEventsRequest', + full_name='core.SessionEventsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.SessionEventsRequest.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1231, + serialized_end=1265, +) + + +_SESSIONEVENT = _descriptor.Descriptor( + name='SessionEvent', + full_name='core.SessionEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='node', full_name='core.SessionEvent.node', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='event', full_name='core.SessionEvent.event', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='core.SessionEvent.name', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='data', full_name='core.SessionEvent.data', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='time', full_name='core.SessionEvent.time', index=4, + number=5, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='session', full_name='core.SessionEvent.session', index=5, + number=6, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1267, + serialized_end=1369, +) + + +_CONFIGEVENTSREQUEST = _descriptor.Descriptor( + name='ConfigEventsRequest', + full_name='core.ConfigEventsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.ConfigEventsRequest.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1371, + serialized_end=1404, +) + + +_CONFIGEVENT = _descriptor.Descriptor( + name='ConfigEvent', + full_name='core.ConfigEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message_type', full_name='core.ConfigEvent.message_type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='node', full_name='core.ConfigEvent.node', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='object', full_name='core.ConfigEvent.object', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='type', full_name='core.ConfigEvent.type', index=3, + number=4, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='data_types', full_name='core.ConfigEvent.data_types', index=4, + number=5, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='data_values', full_name='core.ConfigEvent.data_values', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='captions', full_name='core.ConfigEvent.captions', index=6, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='bitmap', full_name='core.ConfigEvent.bitmap', index=7, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='possible_values', full_name='core.ConfigEvent.possible_values', index=8, + number=9, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='groups', full_name='core.ConfigEvent.groups', index=9, + number=10, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='session', full_name='core.ConfigEvent.session', index=10, + number=11, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='interface', full_name='core.ConfigEvent.interface', index=11, + number=12, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='network_id', full_name='core.ConfigEvent.network_id', index=12, + number=13, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='opaque', full_name='core.ConfigEvent.opaque', index=13, + number=14, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1407, + serialized_end=1693, +) + + +_EXCEPTIONEVENTSREQUEST = _descriptor.Descriptor( + name='ExceptionEventsRequest', + full_name='core.ExceptionEventsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.ExceptionEventsRequest.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1695, + serialized_end=1731, +) + + +_EXCEPTIONEVENT = _descriptor.Descriptor( + name='ExceptionEvent', + full_name='core.ExceptionEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='node', full_name='core.ExceptionEvent.node', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='session', full_name='core.ExceptionEvent.session', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='level', full_name='core.ExceptionEvent.level', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='source', full_name='core.ExceptionEvent.source', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='date', full_name='core.ExceptionEvent.date', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='text', full_name='core.ExceptionEvent.text', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='opaque', full_name='core.ExceptionEvent.opaque', index=6, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1734, + serialized_end=1878, +) + + +_FILEEVENTSREQUEST = _descriptor.Descriptor( + name='FileEventsRequest', + full_name='core.FileEventsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.FileEventsRequest.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1880, + serialized_end=1911, +) + + +_FILEEVENT = _descriptor.Descriptor( + name='FileEvent', + full_name='core.FileEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message_type', full_name='core.FileEvent.message_type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='node', full_name='core.FileEvent.node', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='core.FileEvent.name', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='mode', full_name='core.FileEvent.mode', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='number', full_name='core.FileEvent.number', index=4, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='type', full_name='core.FileEvent.type', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='source', full_name='core.FileEvent.source', index=6, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='session', full_name='core.FileEvent.session', index=7, + number=8, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='data', full_name='core.FileEvent.data', index=8, + number=9, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='compressed_data', full_name='core.FileEvent.compressed_data', index=9, + number=10, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1914, + serialized_end=2110, +) + + +_ADDNODEREQUEST = _descriptor.Descriptor( + name='AddNodeRequest', + full_name='core.AddNodeRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.AddNodeRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='node', full_name='core.AddNodeRequest.node', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2112, + serialized_end=2171, +) + + +_ADDNODERESPONSE = _descriptor.Descriptor( + name='AddNodeResponse', + full_name='core.AddNodeResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.AddNodeResponse.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2173, + serialized_end=2202, +) + + +_GETNODEREQUEST = _descriptor.Descriptor( + name='GetNodeRequest', + full_name='core.GetNodeRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.GetNodeRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='core.GetNodeRequest.id', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2204, + serialized_end=2249, +) + + +_GETNODERESPONSE = _descriptor.Descriptor( + name='GetNodeResponse', + full_name='core.GetNodeResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='node', full_name='core.GetNodeResponse.node', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='interfaces', full_name='core.GetNodeResponse.interfaces', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2251, + serialized_end=2331, +) + + +_EDITNODEREQUEST = _descriptor.Descriptor( + name='EditNodeRequest', + full_name='core.EditNodeRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.EditNodeRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='core.EditNodeRequest.id', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='position', full_name='core.EditNodeRequest.position', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2333, + serialized_end=2413, +) + + +_EDITNODERESPONSE = _descriptor.Descriptor( + name='EditNodeResponse', + full_name='core.EditNodeResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.EditNodeResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2415, + serialized_end=2449, +) + + +_DELETENODEREQUEST = _descriptor.Descriptor( + name='DeleteNodeRequest', + full_name='core.DeleteNodeRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.DeleteNodeRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='core.DeleteNodeRequest.id', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2451, + serialized_end=2499, +) + + +_DELETENODERESPONSE = _descriptor.Descriptor( + name='DeleteNodeResponse', + full_name='core.DeleteNodeResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.DeleteNodeResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2501, + serialized_end=2537, +) + + +_GETNODELINKSREQUEST = _descriptor.Descriptor( + name='GetNodeLinksRequest', + full_name='core.GetNodeLinksRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.GetNodeLinksRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='core.GetNodeLinksRequest.id', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2539, + serialized_end=2589, +) + + +_GETNODELINKSRESPONSE = _descriptor.Descriptor( + name='GetNodeLinksResponse', + full_name='core.GetNodeLinksResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='links', full_name='core.GetNodeLinksResponse.links', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2591, + serialized_end=2640, +) + + +_ADDLINKREQUEST = _descriptor.Descriptor( + name='AddLinkRequest', + full_name='core.AddLinkRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.AddLinkRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='link', full_name='core.AddLinkRequest.link', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2642, + serialized_end=2701, +) + + +_ADDLINKRESPONSE = _descriptor.Descriptor( + name='AddLinkResponse', + full_name='core.AddLinkResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.AddLinkResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2703, + serialized_end=2736, +) + + +_EDITLINKREQUEST = _descriptor.Descriptor( + name='EditLinkRequest', + full_name='core.EditLinkRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.EditLinkRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='node_one', full_name='core.EditLinkRequest.node_one', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='node_two', full_name='core.EditLinkRequest.node_two', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='interface_one', full_name='core.EditLinkRequest.interface_one', index=3, + number=4, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='interface_two', full_name='core.EditLinkRequest.interface_two', index=4, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='options', full_name='core.EditLinkRequest.options', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2739, + serialized_end=2891, +) + + +_EDITLINKRESPONSE = _descriptor.Descriptor( + name='EditLinkResponse', + full_name='core.EditLinkResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.EditLinkResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2893, + serialized_end=2927, +) + + +_DELETELINKREQUEST = _descriptor.Descriptor( + name='DeleteLinkRequest', + full_name='core.DeleteLinkRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.DeleteLinkRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='node_one', full_name='core.DeleteLinkRequest.node_one', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='node_two', full_name='core.DeleteLinkRequest.node_two', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='interface_one', full_name='core.DeleteLinkRequest.interface_one', index=3, + number=4, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='interface_two', full_name='core.DeleteLinkRequest.interface_two', index=4, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2929, + serialized_end=3047, +) + + +_DELETELINKRESPONSE = _descriptor.Descriptor( + name='DeleteLinkResponse', + full_name='core.DeleteLinkResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.DeleteLinkResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3049, + serialized_end=3085, +) + + +_GETHOOKSREQUEST = _descriptor.Descriptor( + name='GetHooksRequest', + full_name='core.GetHooksRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.GetHooksRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3087, + serialized_end=3121, +) + + +_GETHOOKSRESPONSE = _descriptor.Descriptor( + name='GetHooksResponse', + full_name='core.GetHooksResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='hooks', full_name='core.GetHooksResponse.hooks', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3123, + serialized_end=3168, +) + + +_ADDHOOKREQUEST = _descriptor.Descriptor( + name='AddHookRequest', + full_name='core.AddHookRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.AddHookRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='hook', full_name='core.AddHookRequest.hook', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3170, + serialized_end=3229, +) + + +_ADDHOOKRESPONSE = _descriptor.Descriptor( + name='AddHookResponse', + full_name='core.AddHookResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.AddHookResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3231, + serialized_end=3264, +) + + +_GETMOBILITYCONFIGSREQUEST = _descriptor.Descriptor( + name='GetMobilityConfigsRequest', + full_name='core.GetMobilityConfigsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.GetMobilityConfigsRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3266, + serialized_end=3310, +) + + +_GETMOBILITYCONFIGSRESPONSE_MOBILITYCONFIG = _descriptor.Descriptor( + name='MobilityConfig', + full_name='core.GetMobilityConfigsResponse.MobilityConfig', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='groups', full_name='core.GetMobilityConfigsResponse.MobilityConfig.groups', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3407, + serialized_end=3458, +) + +_GETMOBILITYCONFIGSRESPONSE_CONFIGSENTRY = _descriptor.Descriptor( + name='ConfigsEntry', + full_name='core.GetMobilityConfigsResponse.ConfigsEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='core.GetMobilityConfigsResponse.ConfigsEntry.key', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='core.GetMobilityConfigsResponse.ConfigsEntry.value', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=_b('8\001'), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3460, + serialized_end=3555, +) + +_GETMOBILITYCONFIGSRESPONSE = _descriptor.Descriptor( + name='GetMobilityConfigsResponse', + full_name='core.GetMobilityConfigsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='configs', full_name='core.GetMobilityConfigsResponse.configs', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_GETMOBILITYCONFIGSRESPONSE_MOBILITYCONFIG, _GETMOBILITYCONFIGSRESPONSE_CONFIGSENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3313, + serialized_end=3555, +) + + +_GETMOBILITYCONFIGREQUEST = _descriptor.Descriptor( + name='GetMobilityConfigRequest', + full_name='core.GetMobilityConfigRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.GetMobilityConfigRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='core.GetMobilityConfigRequest.id', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3557, + serialized_end=3612, +) + + +_GETMOBILITYCONFIGRESPONSE = _descriptor.Descriptor( + name='GetMobilityConfigResponse', + full_name='core.GetMobilityConfigResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='groups', full_name='core.GetMobilityConfigResponse.groups', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3614, + serialized_end=3676, +) + + +_SETMOBILITYCONFIGREQUEST_CONFIGENTRY = _descriptor.Descriptor( + name='ConfigEntry', + full_name='core.SetMobilityConfigRequest.ConfigEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='core.SetMobilityConfigRequest.ConfigEntry.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='core.SetMobilityConfigRequest.ConfigEntry.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=_b('8\001'), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=582, + serialized_end=627, +) + +_SETMOBILITYCONFIGREQUEST = _descriptor.Descriptor( + name='SetMobilityConfigRequest', + full_name='core.SetMobilityConfigRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.SetMobilityConfigRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='core.SetMobilityConfigRequest.id', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='config', full_name='core.SetMobilityConfigRequest.config', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_SETMOBILITYCONFIGREQUEST_CONFIGENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3679, + serialized_end=3841, +) + + +_SETMOBILITYCONFIGRESPONSE = _descriptor.Descriptor( + name='SetMobilityConfigResponse', + full_name='core.SetMobilityConfigResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.SetMobilityConfigResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3843, + serialized_end=3886, +) + + +_MOBILITYACTIONREQUEST = _descriptor.Descriptor( + name='MobilityActionRequest', + full_name='core.MobilityActionRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.MobilityActionRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='core.MobilityActionRequest.id', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='action', full_name='core.MobilityActionRequest.action', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3888, + serialized_end=3978, +) + + +_MOBILITYACTIONRESPONSE = _descriptor.Descriptor( + name='MobilityActionResponse', + full_name='core.MobilityActionResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.MobilityActionResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3980, + serialized_end=4020, +) + + +_GETSERVICESREQUEST = _descriptor.Descriptor( + name='GetServicesRequest', + full_name='core.GetServicesRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4022, + serialized_end=4042, +) + + +_GETSERVICESRESPONSE = _descriptor.Descriptor( + name='GetServicesResponse', + full_name='core.GetServicesResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='services', full_name='core.GetServicesResponse.services', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4044, + serialized_end=4098, +) + + +_GETSERVICEDEFAULTSREQUEST = _descriptor.Descriptor( + name='GetServiceDefaultsRequest', + full_name='core.GetServiceDefaultsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.GetServiceDefaultsRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4100, + serialized_end=4144, +) + + +_GETSERVICEDEFAULTSRESPONSE = _descriptor.Descriptor( + name='GetServiceDefaultsResponse', + full_name='core.GetServiceDefaultsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='defaults', full_name='core.GetServiceDefaultsResponse.defaults', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4146, + serialized_end=4215, +) + + +_SETSERVICEDEFAULTSREQUEST = _descriptor.Descriptor( + name='SetServiceDefaultsRequest', + full_name='core.SetServiceDefaultsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.SetServiceDefaultsRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='defaults', full_name='core.SetServiceDefaultsRequest.defaults', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4217, + serialized_end=4302, +) + + +_SETSERVICEDEFAULTSRESPONSE = _descriptor.Descriptor( + name='SetServiceDefaultsResponse', + full_name='core.SetServiceDefaultsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.SetServiceDefaultsResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4304, + serialized_end=4348, +) + + +_GETNODESERVICEREQUEST = _descriptor.Descriptor( + name='GetNodeServiceRequest', + full_name='core.GetNodeServiceRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.GetNodeServiceRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='core.GetNodeServiceRequest.id', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='service', full_name='core.GetNodeServiceRequest.service', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4350, + serialized_end=4419, +) + + +_GETNODESERVICERESPONSE = _descriptor.Descriptor( + name='GetNodeServiceResponse', + full_name='core.GetNodeServiceResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='service', full_name='core.GetNodeServiceResponse.service', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4421, + serialized_end=4485, +) + + +_GETNODESERVICEFILEREQUEST = _descriptor.Descriptor( + name='GetNodeServiceFileRequest', + full_name='core.GetNodeServiceFileRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.GetNodeServiceFileRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='core.GetNodeServiceFileRequest.id', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='service', full_name='core.GetNodeServiceFileRequest.service', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='file', full_name='core.GetNodeServiceFileRequest.file', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4487, + serialized_end=4574, +) + + +_GETNODESERVICEFILERESPONSE = _descriptor.Descriptor( + name='GetNodeServiceFileResponse', + full_name='core.GetNodeServiceFileResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='data', full_name='core.GetNodeServiceFileResponse.data', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4576, + serialized_end=4618, +) + + +_SETNODESERVICEREQUEST = _descriptor.Descriptor( + name='SetNodeServiceRequest', + full_name='core.SetNodeServiceRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.SetNodeServiceRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='core.SetNodeServiceRequest.id', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='service', full_name='core.SetNodeServiceRequest.service', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='startup', full_name='core.SetNodeServiceRequest.startup', index=3, + number=4, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='validate', full_name='core.SetNodeServiceRequest.validate', index=4, + number=5, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='shutdown', full_name='core.SetNodeServiceRequest.shutdown', index=5, + number=6, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4620, + serialized_end=4742, +) + + +_SETNODESERVICERESPONSE = _descriptor.Descriptor( + name='SetNodeServiceResponse', + full_name='core.SetNodeServiceResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.SetNodeServiceResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4744, + serialized_end=4784, +) + + +_SETNODESERVICEFILEREQUEST = _descriptor.Descriptor( + name='SetNodeServiceFileRequest', + full_name='core.SetNodeServiceFileRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.SetNodeServiceFileRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='core.SetNodeServiceFileRequest.id', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='service', full_name='core.SetNodeServiceFileRequest.service', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='file', full_name='core.SetNodeServiceFileRequest.file', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='data', full_name='core.SetNodeServiceFileRequest.data', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4786, + serialized_end=4887, +) + + +_SETNODESERVICEFILERESPONSE = _descriptor.Descriptor( + name='SetNodeServiceFileResponse', + full_name='core.SetNodeServiceFileResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.SetNodeServiceFileResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4889, + serialized_end=4933, +) + + +_SERVICEACTIONREQUEST = _descriptor.Descriptor( + name='ServiceActionRequest', + full_name='core.ServiceActionRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.ServiceActionRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='core.ServiceActionRequest.id', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='service', full_name='core.ServiceActionRequest.service', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='action', full_name='core.ServiceActionRequest.action', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4935, + serialized_end=5040, +) + + +_SERVICEACTIONRESPONSE = _descriptor.Descriptor( + name='ServiceActionResponse', + full_name='core.ServiceActionResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.ServiceActionResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5042, + serialized_end=5081, +) + + +_GETWLANCONFIGREQUEST = _descriptor.Descriptor( + name='GetWlanConfigRequest', + full_name='core.GetWlanConfigRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.GetWlanConfigRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='core.GetWlanConfigRequest.id', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5083, + serialized_end=5134, +) + + +_GETWLANCONFIGRESPONSE = _descriptor.Descriptor( + name='GetWlanConfigResponse', + full_name='core.GetWlanConfigResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='groups', full_name='core.GetWlanConfigResponse.groups', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5136, + serialized_end=5194, +) + + +_SETWLANCONFIGREQUEST_CONFIGENTRY = _descriptor.Descriptor( + name='ConfigEntry', + full_name='core.SetWlanConfigRequest.ConfigEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='core.SetWlanConfigRequest.ConfigEntry.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='core.SetWlanConfigRequest.ConfigEntry.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=_b('8\001'), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=582, + serialized_end=627, +) + +_SETWLANCONFIGREQUEST = _descriptor.Descriptor( + name='SetWlanConfigRequest', + full_name='core.SetWlanConfigRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.SetWlanConfigRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='core.SetWlanConfigRequest.id', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='config', full_name='core.SetWlanConfigRequest.config', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_SETWLANCONFIGREQUEST_CONFIGENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5197, + serialized_end=5351, +) + + +_SETWLANCONFIGRESPONSE = _descriptor.Descriptor( + name='SetWlanConfigResponse', + full_name='core.SetWlanConfigResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.SetWlanConfigResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5353, + serialized_end=5392, +) + + +_GETEMANECONFIGREQUEST = _descriptor.Descriptor( + name='GetEmaneConfigRequest', + full_name='core.GetEmaneConfigRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.GetEmaneConfigRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5394, + serialized_end=5434, +) + + +_GETEMANECONFIGRESPONSE = _descriptor.Descriptor( + name='GetEmaneConfigResponse', + full_name='core.GetEmaneConfigResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='groups', full_name='core.GetEmaneConfigResponse.groups', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5436, + serialized_end=5495, +) + + +_SETEMANECONFIGREQUEST_CONFIGENTRY = _descriptor.Descriptor( + name='ConfigEntry', + full_name='core.SetEmaneConfigRequest.ConfigEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='core.SetEmaneConfigRequest.ConfigEntry.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='core.SetEmaneConfigRequest.ConfigEntry.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=_b('8\001'), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=582, + serialized_end=627, +) + +_SETEMANECONFIGREQUEST = _descriptor.Descriptor( + name='SetEmaneConfigRequest', + full_name='core.SetEmaneConfigRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.SetEmaneConfigRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='config', full_name='core.SetEmaneConfigRequest.config', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_SETEMANECONFIGREQUEST_CONFIGENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5498, + serialized_end=5642, +) + + +_SETEMANECONFIGRESPONSE = _descriptor.Descriptor( + name='SetEmaneConfigResponse', + full_name='core.SetEmaneConfigResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.SetEmaneConfigResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5644, + serialized_end=5684, +) + + +_GETEMANEMODELSREQUEST = _descriptor.Descriptor( + name='GetEmaneModelsRequest', + full_name='core.GetEmaneModelsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.GetEmaneModelsRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5686, + serialized_end=5726, +) + + +_GETEMANEMODELSRESPONSE = _descriptor.Descriptor( + name='GetEmaneModelsResponse', + full_name='core.GetEmaneModelsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='models', full_name='core.GetEmaneModelsResponse.models', index=0, + number=1, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5728, + serialized_end=5768, +) + + +_GETEMANEMODELCONFIGREQUEST = _descriptor.Descriptor( + name='GetEmaneModelConfigRequest', + full_name='core.GetEmaneModelConfigRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.GetEmaneModelConfigRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='core.GetEmaneModelConfigRequest.id', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='interface', full_name='core.GetEmaneModelConfigRequest.interface', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='model', full_name='core.GetEmaneModelConfigRequest.model', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5770, + serialized_end=5861, +) + + +_GETEMANEMODELCONFIGRESPONSE = _descriptor.Descriptor( + name='GetEmaneModelConfigResponse', + full_name='core.GetEmaneModelConfigResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='groups', full_name='core.GetEmaneModelConfigResponse.groups', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5863, + serialized_end=5927, +) + + +_SETEMANEMODELCONFIGREQUEST_CONFIGENTRY = _descriptor.Descriptor( + name='ConfigEntry', + full_name='core.SetEmaneModelConfigRequest.ConfigEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='core.SetEmaneModelConfigRequest.ConfigEntry.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='core.SetEmaneModelConfigRequest.ConfigEntry.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=_b('8\001'), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=582, + serialized_end=627, +) + +_SETEMANEMODELCONFIGREQUEST = _descriptor.Descriptor( + name='SetEmaneModelConfigRequest', + full_name='core.SetEmaneModelConfigRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.SetEmaneModelConfigRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='core.SetEmaneModelConfigRequest.id', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='interface', full_name='core.SetEmaneModelConfigRequest.interface', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='model', full_name='core.SetEmaneModelConfigRequest.model', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='config', full_name='core.SetEmaneModelConfigRequest.config', index=4, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_SETEMANEMODELCONFIGREQUEST_CONFIGENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5930, + serialized_end=6130, +) + + +_SETEMANEMODELCONFIGRESPONSE = _descriptor.Descriptor( + name='SetEmaneModelConfigResponse', + full_name='core.SetEmaneModelConfigResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.SetEmaneModelConfigResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6132, + serialized_end=6177, +) + + +_GETEMANEMODELCONFIGSREQUEST = _descriptor.Descriptor( + name='GetEmaneModelConfigsRequest', + full_name='core.GetEmaneModelConfigsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.GetEmaneModelConfigsRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6179, + serialized_end=6225, +) + + +_GETEMANEMODELCONFIGSRESPONSE_MODELCONFIG = _descriptor.Descriptor( + name='ModelConfig', + full_name='core.GetEmaneModelConfigsResponse.ModelConfig', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='model', full_name='core.GetEmaneModelConfigsResponse.ModelConfig.model', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='groups', full_name='core.GetEmaneModelConfigsResponse.ModelConfig.groups', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6326, + serialized_end=6389, +) + +_GETEMANEMODELCONFIGSRESPONSE_CONFIGSENTRY = _descriptor.Descriptor( + name='ConfigsEntry', + full_name='core.GetEmaneModelConfigsResponse.ConfigsEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='core.GetEmaneModelConfigsResponse.ConfigsEntry.key', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='core.GetEmaneModelConfigsResponse.ConfigsEntry.value', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=_b('8\001'), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6391, + serialized_end=6485, +) + +_GETEMANEMODELCONFIGSRESPONSE = _descriptor.Descriptor( + name='GetEmaneModelConfigsResponse', + full_name='core.GetEmaneModelConfigsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='configs', full_name='core.GetEmaneModelConfigsResponse.configs', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_GETEMANEMODELCONFIGSRESPONSE_MODELCONFIG, _GETEMANEMODELCONFIGSRESPONSE_CONFIGSENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6228, + serialized_end=6485, +) + + +_SAVEXMLREQUEST = _descriptor.Descriptor( + name='SaveXmlRequest', + full_name='core.SaveXmlRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='session', full_name='core.SaveXmlRequest.session', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6487, + serialized_end=6520, +) + + +_SAVEXMLRESPONSE = _descriptor.Descriptor( + name='SaveXmlResponse', + full_name='core.SaveXmlResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='data', full_name='core.SaveXmlResponse.data', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6522, + serialized_end=6553, +) + + +_OPENXMLREQUEST = _descriptor.Descriptor( + name='OpenXmlRequest', + full_name='core.OpenXmlRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='data', full_name='core.OpenXmlRequest.data', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6555, + serialized_end=6585, +) + + +_OPENXMLRESPONSE = _descriptor.Descriptor( + name='OpenXmlResponse', + full_name='core.OpenXmlResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result', full_name='core.OpenXmlResponse.result', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='session', full_name='core.OpenXmlResponse.session', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6587, + serialized_end=6637, +) + + +_HOOK = _descriptor.Descriptor( + name='Hook', + full_name='core.Hook', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='state', full_name='core.Hook.state', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='file', full_name='core.Hook.file', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='data', full_name='core.Hook.data', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6639, + serialized_end=6708, +) + + +_SERVICEDEFAULTS = _descriptor.Descriptor( + name='ServiceDefaults', + full_name='core.ServiceDefaults', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='node_type', full_name='core.ServiceDefaults.node_type', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='services', full_name='core.ServiceDefaults.services', index=1, + number=2, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6710, + serialized_end=6764, +) + + +_SERVICE = _descriptor.Descriptor( + name='Service', + full_name='core.Service', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='group', full_name='core.Service.group', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='core.Service.name', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6766, + serialized_end=6804, +) + + +_NODESERVICEDATA = _descriptor.Descriptor( + name='NodeServiceData', + full_name='core.NodeServiceData', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='executables', full_name='core.NodeServiceData.executables', index=0, + number=1, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='dependencies', full_name='core.NodeServiceData.dependencies', index=1, + number=2, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='dirs', full_name='core.NodeServiceData.dirs', index=2, + number=3, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='configs', full_name='core.NodeServiceData.configs', index=3, + number=4, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='startup', full_name='core.NodeServiceData.startup', index=4, + number=5, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='validate', full_name='core.NodeServiceData.validate', index=5, + number=6, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='validation_mode', full_name='core.NodeServiceData.validation_mode', index=6, + number=7, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='validation_timer', full_name='core.NodeServiceData.validation_timer', index=7, + number=8, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='shutdown', full_name='core.NodeServiceData.shutdown', index=8, + number=9, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='meta', full_name='core.NodeServiceData.meta', index=9, + number=10, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6807, + serialized_end=7045, +) + + +_CONFIGGROUP = _descriptor.Descriptor( + name='ConfigGroup', + full_name='core.ConfigGroup', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='core.ConfigGroup.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='options', full_name='core.ConfigGroup.options', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7047, + serialized_end=7111, +) + + +_CONFIGOPTION = _descriptor.Descriptor( + name='ConfigOption', + full_name='core.ConfigOption', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='label', full_name='core.ConfigOption.label', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='core.ConfigOption.name', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='core.ConfigOption.value', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='type', full_name='core.ConfigOption.type', index=3, + number=4, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='select', full_name='core.ConfigOption.select', index=4, + number=5, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7113, + serialized_end=7201, +) + + +_SESSION = _descriptor.Descriptor( + name='Session', + full_name='core.Session', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.Session.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='state', full_name='core.Session.state', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='nodes', full_name='core.Session.nodes', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='links', full_name='core.Session.links', index=3, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7203, + serialized_end=7313, +) + + +_SESSIONSUMMARY = _descriptor.Descriptor( + name='SessionSummary', + full_name='core.SessionSummary', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.SessionSummary.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='state', full_name='core.SessionSummary.state', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='nodes', full_name='core.SessionSummary.nodes', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7315, + serialized_end=7393, +) + + +_NODE = _descriptor.Descriptor( + name='Node', + full_name='core.Node', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.Node.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='core.Node.name', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='type', full_name='core.Node.type', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='model', full_name='core.Node.model', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='position', full_name='core.Node.position', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='services', full_name='core.Node.services', index=5, + number=6, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='emane', full_name='core.Node.emane', index=6, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='icon', full_name='core.Node.icon', index=7, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='opaque', full_name='core.Node.opaque', index=8, + number=9, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7396, + serialized_end=7570, +) + + +_LINK = _descriptor.Descriptor( + name='Link', + full_name='core.Link', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='node_one', full_name='core.Link.node_one', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='node_two', full_name='core.Link.node_two', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='type', full_name='core.Link.type', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='interface_one', full_name='core.Link.interface_one', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='interface_two', full_name='core.Link.interface_two', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='options', full_name='core.Link.options', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7573, + serialized_end=7761, +) + + +_LINKOPTIONS = _descriptor.Descriptor( + name='LinkOptions', + full_name='core.LinkOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='opaque', full_name='core.LinkOptions.opaque', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='jitter', full_name='core.LinkOptions.jitter', index=1, + number=2, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='key', full_name='core.LinkOptions.key', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='mburst', full_name='core.LinkOptions.mburst', index=3, + number=4, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='mer', full_name='core.LinkOptions.mer', index=4, + number=5, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='per', full_name='core.LinkOptions.per', index=5, + number=6, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='bandwidth', full_name='core.LinkOptions.bandwidth', index=6, + number=7, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='burst', full_name='core.LinkOptions.burst', index=7, + number=8, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='delay', full_name='core.LinkOptions.delay', index=8, + number=9, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='dup', full_name='core.LinkOptions.dup', index=9, + number=10, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='unidirectional', full_name='core.LinkOptions.unidirectional', index=10, + number=11, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7764, + serialized_end=7950, +) + + +_INTERFACE = _descriptor.Descriptor( + name='Interface', + full_name='core.Interface', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='core.Interface.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='core.Interface.name', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='mac', full_name='core.Interface.mac', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ip4', full_name='core.Interface.ip4', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ip4mask', full_name='core.Interface.ip4mask', index=4, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ip6', full_name='core.Interface.ip6', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ip6mask', full_name='core.Interface.ip6mask', index=6, + number=7, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='netid', full_name='core.Interface.netid', index=7, + number=8, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='flowid', full_name='core.Interface.flowid', index=8, + number=9, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='mtu', full_name='core.Interface.mtu', index=9, + number=10, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7953, + serialized_end=8107, +) + + +_POSITION = _descriptor.Descriptor( + name='Position', + full_name='core.Position', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='x', full_name='core.Position.x', index=0, + number=1, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='y', full_name='core.Position.y', index=1, + number=2, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='z', full_name='core.Position.z', index=2, + number=3, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='lat', full_name='core.Position.lat', index=3, + number=4, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='lon', full_name='core.Position.lon', index=4, + number=5, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='alt', full_name='core.Position.alt', index=5, + number=6, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8109, + serialized_end=8191, +) + +_CREATESESSIONRESPONSE.fields_by_name['state'].enum_type = _SESSIONSTATE +_GETSESSIONSRESPONSE.fields_by_name['sessions'].message_type = _SESSIONSUMMARY +_GETSESSIONRESPONSE.fields_by_name['session'].message_type = _SESSION +_GETSESSIONOPTIONSRESPONSE.fields_by_name['groups'].message_type = _CONFIGGROUP +_SETSESSIONOPTIONSREQUEST_CONFIGENTRY.containing_type = _SETSESSIONOPTIONSREQUEST +_SETSESSIONOPTIONSREQUEST.fields_by_name['config'].message_type = _SETSESSIONOPTIONSREQUEST_CONFIGENTRY +_GETSESSIONLOCATIONRESPONSE.fields_by_name['position'].message_type = _POSITION +_SETSESSIONLOCATIONREQUEST.fields_by_name['position'].message_type = _POSITION +_SETSESSIONSTATEREQUEST.fields_by_name['state'].enum_type = _SESSIONSTATE +_NODEEVENT.fields_by_name['node'].message_type = _NODE +_LINKEVENT.fields_by_name['message_type'].enum_type = _MESSAGETYPE +_LINKEVENT.fields_by_name['link'].message_type = _LINK +_CONFIGEVENT.fields_by_name['message_type'].enum_type = _MESSAGETYPE +_EXCEPTIONEVENT.fields_by_name['level'].enum_type = _EXCEPTIONLEVEL +_FILEEVENT.fields_by_name['message_type'].enum_type = _MESSAGETYPE +_ADDNODEREQUEST.fields_by_name['node'].message_type = _NODE +_GETNODERESPONSE.fields_by_name['node'].message_type = _NODE +_GETNODERESPONSE.fields_by_name['interfaces'].message_type = _INTERFACE +_EDITNODEREQUEST.fields_by_name['position'].message_type = _POSITION +_GETNODELINKSRESPONSE.fields_by_name['links'].message_type = _LINK +_ADDLINKREQUEST.fields_by_name['link'].message_type = _LINK +_EDITLINKREQUEST.fields_by_name['options'].message_type = _LINKOPTIONS +_GETHOOKSRESPONSE.fields_by_name['hooks'].message_type = _HOOK +_ADDHOOKREQUEST.fields_by_name['hook'].message_type = _HOOK +_GETMOBILITYCONFIGSRESPONSE_MOBILITYCONFIG.fields_by_name['groups'].message_type = _CONFIGGROUP +_GETMOBILITYCONFIGSRESPONSE_MOBILITYCONFIG.containing_type = _GETMOBILITYCONFIGSRESPONSE +_GETMOBILITYCONFIGSRESPONSE_CONFIGSENTRY.fields_by_name['value'].message_type = _GETMOBILITYCONFIGSRESPONSE_MOBILITYCONFIG +_GETMOBILITYCONFIGSRESPONSE_CONFIGSENTRY.containing_type = _GETMOBILITYCONFIGSRESPONSE +_GETMOBILITYCONFIGSRESPONSE.fields_by_name['configs'].message_type = _GETMOBILITYCONFIGSRESPONSE_CONFIGSENTRY +_GETMOBILITYCONFIGRESPONSE.fields_by_name['groups'].message_type = _CONFIGGROUP +_SETMOBILITYCONFIGREQUEST_CONFIGENTRY.containing_type = _SETMOBILITYCONFIGREQUEST +_SETMOBILITYCONFIGREQUEST.fields_by_name['config'].message_type = _SETMOBILITYCONFIGREQUEST_CONFIGENTRY +_MOBILITYACTIONREQUEST.fields_by_name['action'].enum_type = _MOBILITYACTION +_GETSERVICESRESPONSE.fields_by_name['services'].message_type = _SERVICE +_GETSERVICEDEFAULTSRESPONSE.fields_by_name['defaults'].message_type = _SERVICEDEFAULTS +_SETSERVICEDEFAULTSREQUEST.fields_by_name['defaults'].message_type = _SERVICEDEFAULTS +_GETNODESERVICERESPONSE.fields_by_name['service'].message_type = _NODESERVICEDATA +_SERVICEACTIONREQUEST.fields_by_name['action'].enum_type = _SERVICEACTION +_GETWLANCONFIGRESPONSE.fields_by_name['groups'].message_type = _CONFIGGROUP +_SETWLANCONFIGREQUEST_CONFIGENTRY.containing_type = _SETWLANCONFIGREQUEST +_SETWLANCONFIGREQUEST.fields_by_name['config'].message_type = _SETWLANCONFIGREQUEST_CONFIGENTRY +_GETEMANECONFIGRESPONSE.fields_by_name['groups'].message_type = _CONFIGGROUP +_SETEMANECONFIGREQUEST_CONFIGENTRY.containing_type = _SETEMANECONFIGREQUEST +_SETEMANECONFIGREQUEST.fields_by_name['config'].message_type = _SETEMANECONFIGREQUEST_CONFIGENTRY +_GETEMANEMODELCONFIGRESPONSE.fields_by_name['groups'].message_type = _CONFIGGROUP +_SETEMANEMODELCONFIGREQUEST_CONFIGENTRY.containing_type = _SETEMANEMODELCONFIGREQUEST +_SETEMANEMODELCONFIGREQUEST.fields_by_name['config'].message_type = _SETEMANEMODELCONFIGREQUEST_CONFIGENTRY +_GETEMANEMODELCONFIGSRESPONSE_MODELCONFIG.fields_by_name['groups'].message_type = _CONFIGGROUP +_GETEMANEMODELCONFIGSRESPONSE_MODELCONFIG.containing_type = _GETEMANEMODELCONFIGSRESPONSE +_GETEMANEMODELCONFIGSRESPONSE_CONFIGSENTRY.fields_by_name['value'].message_type = _GETEMANEMODELCONFIGSRESPONSE_MODELCONFIG +_GETEMANEMODELCONFIGSRESPONSE_CONFIGSENTRY.containing_type = _GETEMANEMODELCONFIGSRESPONSE +_GETEMANEMODELCONFIGSRESPONSE.fields_by_name['configs'].message_type = _GETEMANEMODELCONFIGSRESPONSE_CONFIGSENTRY +_HOOK.fields_by_name['state'].enum_type = _SESSIONSTATE +_NODESERVICEDATA.fields_by_name['validation_mode'].enum_type = _SERVICEVALIDATIONMODE +_CONFIGGROUP.fields_by_name['options'].message_type = _CONFIGOPTION +_SESSION.fields_by_name['state'].enum_type = _SESSIONSTATE +_SESSION.fields_by_name['nodes'].message_type = _NODE +_SESSION.fields_by_name['links'].message_type = _LINK +_SESSIONSUMMARY.fields_by_name['state'].enum_type = _SESSIONSTATE +_NODE.fields_by_name['type'].enum_type = _NODETYPE +_NODE.fields_by_name['position'].message_type = _POSITION +_LINK.fields_by_name['type'].enum_type = _LINKTYPE +_LINK.fields_by_name['interface_one'].message_type = _INTERFACE +_LINK.fields_by_name['interface_two'].message_type = _INTERFACE +_LINK.fields_by_name['options'].message_type = _LINKOPTIONS +DESCRIPTOR.message_types_by_name['CreateSessionRequest'] = _CREATESESSIONREQUEST +DESCRIPTOR.message_types_by_name['CreateSessionResponse'] = _CREATESESSIONRESPONSE +DESCRIPTOR.message_types_by_name['DeleteSessionRequest'] = _DELETESESSIONREQUEST +DESCRIPTOR.message_types_by_name['DeleteSessionResponse'] = _DELETESESSIONRESPONSE +DESCRIPTOR.message_types_by_name['GetSessionsRequest'] = _GETSESSIONSREQUEST +DESCRIPTOR.message_types_by_name['GetSessionsResponse'] = _GETSESSIONSRESPONSE +DESCRIPTOR.message_types_by_name['GetSessionRequest'] = _GETSESSIONREQUEST +DESCRIPTOR.message_types_by_name['GetSessionResponse'] = _GETSESSIONRESPONSE +DESCRIPTOR.message_types_by_name['GetSessionOptionsRequest'] = _GETSESSIONOPTIONSREQUEST +DESCRIPTOR.message_types_by_name['GetSessionOptionsResponse'] = _GETSESSIONOPTIONSRESPONSE +DESCRIPTOR.message_types_by_name['SetSessionOptionsRequest'] = _SETSESSIONOPTIONSREQUEST +DESCRIPTOR.message_types_by_name['SetSessionOptionsResponse'] = _SETSESSIONOPTIONSRESPONSE +DESCRIPTOR.message_types_by_name['GetSessionLocationRequest'] = _GETSESSIONLOCATIONREQUEST +DESCRIPTOR.message_types_by_name['GetSessionLocationResponse'] = _GETSESSIONLOCATIONRESPONSE +DESCRIPTOR.message_types_by_name['SetSessionLocationRequest'] = _SETSESSIONLOCATIONREQUEST +DESCRIPTOR.message_types_by_name['SetSessionLocationResponse'] = _SETSESSIONLOCATIONRESPONSE +DESCRIPTOR.message_types_by_name['SetSessionStateRequest'] = _SETSESSIONSTATEREQUEST +DESCRIPTOR.message_types_by_name['SetSessionStateResponse'] = _SETSESSIONSTATERESPONSE +DESCRIPTOR.message_types_by_name['NodeEventsRequest'] = _NODEEVENTSREQUEST +DESCRIPTOR.message_types_by_name['NodeEvent'] = _NODEEVENT +DESCRIPTOR.message_types_by_name['LinkEventsRequest'] = _LINKEVENTSREQUEST +DESCRIPTOR.message_types_by_name['LinkEvent'] = _LINKEVENT +DESCRIPTOR.message_types_by_name['SessionEventsRequest'] = _SESSIONEVENTSREQUEST +DESCRIPTOR.message_types_by_name['SessionEvent'] = _SESSIONEVENT +DESCRIPTOR.message_types_by_name['ConfigEventsRequest'] = _CONFIGEVENTSREQUEST +DESCRIPTOR.message_types_by_name['ConfigEvent'] = _CONFIGEVENT +DESCRIPTOR.message_types_by_name['ExceptionEventsRequest'] = _EXCEPTIONEVENTSREQUEST +DESCRIPTOR.message_types_by_name['ExceptionEvent'] = _EXCEPTIONEVENT +DESCRIPTOR.message_types_by_name['FileEventsRequest'] = _FILEEVENTSREQUEST +DESCRIPTOR.message_types_by_name['FileEvent'] = _FILEEVENT +DESCRIPTOR.message_types_by_name['AddNodeRequest'] = _ADDNODEREQUEST +DESCRIPTOR.message_types_by_name['AddNodeResponse'] = _ADDNODERESPONSE +DESCRIPTOR.message_types_by_name['GetNodeRequest'] = _GETNODEREQUEST +DESCRIPTOR.message_types_by_name['GetNodeResponse'] = _GETNODERESPONSE +DESCRIPTOR.message_types_by_name['EditNodeRequest'] = _EDITNODEREQUEST +DESCRIPTOR.message_types_by_name['EditNodeResponse'] = _EDITNODERESPONSE +DESCRIPTOR.message_types_by_name['DeleteNodeRequest'] = _DELETENODEREQUEST +DESCRIPTOR.message_types_by_name['DeleteNodeResponse'] = _DELETENODERESPONSE +DESCRIPTOR.message_types_by_name['GetNodeLinksRequest'] = _GETNODELINKSREQUEST +DESCRIPTOR.message_types_by_name['GetNodeLinksResponse'] = _GETNODELINKSRESPONSE +DESCRIPTOR.message_types_by_name['AddLinkRequest'] = _ADDLINKREQUEST +DESCRIPTOR.message_types_by_name['AddLinkResponse'] = _ADDLINKRESPONSE +DESCRIPTOR.message_types_by_name['EditLinkRequest'] = _EDITLINKREQUEST +DESCRIPTOR.message_types_by_name['EditLinkResponse'] = _EDITLINKRESPONSE +DESCRIPTOR.message_types_by_name['DeleteLinkRequest'] = _DELETELINKREQUEST +DESCRIPTOR.message_types_by_name['DeleteLinkResponse'] = _DELETELINKRESPONSE +DESCRIPTOR.message_types_by_name['GetHooksRequest'] = _GETHOOKSREQUEST +DESCRIPTOR.message_types_by_name['GetHooksResponse'] = _GETHOOKSRESPONSE +DESCRIPTOR.message_types_by_name['AddHookRequest'] = _ADDHOOKREQUEST +DESCRIPTOR.message_types_by_name['AddHookResponse'] = _ADDHOOKRESPONSE +DESCRIPTOR.message_types_by_name['GetMobilityConfigsRequest'] = _GETMOBILITYCONFIGSREQUEST +DESCRIPTOR.message_types_by_name['GetMobilityConfigsResponse'] = _GETMOBILITYCONFIGSRESPONSE +DESCRIPTOR.message_types_by_name['GetMobilityConfigRequest'] = _GETMOBILITYCONFIGREQUEST +DESCRIPTOR.message_types_by_name['GetMobilityConfigResponse'] = _GETMOBILITYCONFIGRESPONSE +DESCRIPTOR.message_types_by_name['SetMobilityConfigRequest'] = _SETMOBILITYCONFIGREQUEST +DESCRIPTOR.message_types_by_name['SetMobilityConfigResponse'] = _SETMOBILITYCONFIGRESPONSE +DESCRIPTOR.message_types_by_name['MobilityActionRequest'] = _MOBILITYACTIONREQUEST +DESCRIPTOR.message_types_by_name['MobilityActionResponse'] = _MOBILITYACTIONRESPONSE +DESCRIPTOR.message_types_by_name['GetServicesRequest'] = _GETSERVICESREQUEST +DESCRIPTOR.message_types_by_name['GetServicesResponse'] = _GETSERVICESRESPONSE +DESCRIPTOR.message_types_by_name['GetServiceDefaultsRequest'] = _GETSERVICEDEFAULTSREQUEST +DESCRIPTOR.message_types_by_name['GetServiceDefaultsResponse'] = _GETSERVICEDEFAULTSRESPONSE +DESCRIPTOR.message_types_by_name['SetServiceDefaultsRequest'] = _SETSERVICEDEFAULTSREQUEST +DESCRIPTOR.message_types_by_name['SetServiceDefaultsResponse'] = _SETSERVICEDEFAULTSRESPONSE +DESCRIPTOR.message_types_by_name['GetNodeServiceRequest'] = _GETNODESERVICEREQUEST +DESCRIPTOR.message_types_by_name['GetNodeServiceResponse'] = _GETNODESERVICERESPONSE +DESCRIPTOR.message_types_by_name['GetNodeServiceFileRequest'] = _GETNODESERVICEFILEREQUEST +DESCRIPTOR.message_types_by_name['GetNodeServiceFileResponse'] = _GETNODESERVICEFILERESPONSE +DESCRIPTOR.message_types_by_name['SetNodeServiceRequest'] = _SETNODESERVICEREQUEST +DESCRIPTOR.message_types_by_name['SetNodeServiceResponse'] = _SETNODESERVICERESPONSE +DESCRIPTOR.message_types_by_name['SetNodeServiceFileRequest'] = _SETNODESERVICEFILEREQUEST +DESCRIPTOR.message_types_by_name['SetNodeServiceFileResponse'] = _SETNODESERVICEFILERESPONSE +DESCRIPTOR.message_types_by_name['ServiceActionRequest'] = _SERVICEACTIONREQUEST +DESCRIPTOR.message_types_by_name['ServiceActionResponse'] = _SERVICEACTIONRESPONSE +DESCRIPTOR.message_types_by_name['GetWlanConfigRequest'] = _GETWLANCONFIGREQUEST +DESCRIPTOR.message_types_by_name['GetWlanConfigResponse'] = _GETWLANCONFIGRESPONSE +DESCRIPTOR.message_types_by_name['SetWlanConfigRequest'] = _SETWLANCONFIGREQUEST +DESCRIPTOR.message_types_by_name['SetWlanConfigResponse'] = _SETWLANCONFIGRESPONSE +DESCRIPTOR.message_types_by_name['GetEmaneConfigRequest'] = _GETEMANECONFIGREQUEST +DESCRIPTOR.message_types_by_name['GetEmaneConfigResponse'] = _GETEMANECONFIGRESPONSE +DESCRIPTOR.message_types_by_name['SetEmaneConfigRequest'] = _SETEMANECONFIGREQUEST +DESCRIPTOR.message_types_by_name['SetEmaneConfigResponse'] = _SETEMANECONFIGRESPONSE +DESCRIPTOR.message_types_by_name['GetEmaneModelsRequest'] = _GETEMANEMODELSREQUEST +DESCRIPTOR.message_types_by_name['GetEmaneModelsResponse'] = _GETEMANEMODELSRESPONSE +DESCRIPTOR.message_types_by_name['GetEmaneModelConfigRequest'] = _GETEMANEMODELCONFIGREQUEST +DESCRIPTOR.message_types_by_name['GetEmaneModelConfigResponse'] = _GETEMANEMODELCONFIGRESPONSE +DESCRIPTOR.message_types_by_name['SetEmaneModelConfigRequest'] = _SETEMANEMODELCONFIGREQUEST +DESCRIPTOR.message_types_by_name['SetEmaneModelConfigResponse'] = _SETEMANEMODELCONFIGRESPONSE +DESCRIPTOR.message_types_by_name['GetEmaneModelConfigsRequest'] = _GETEMANEMODELCONFIGSREQUEST +DESCRIPTOR.message_types_by_name['GetEmaneModelConfigsResponse'] = _GETEMANEMODELCONFIGSRESPONSE +DESCRIPTOR.message_types_by_name['SaveXmlRequest'] = _SAVEXMLREQUEST +DESCRIPTOR.message_types_by_name['SaveXmlResponse'] = _SAVEXMLRESPONSE +DESCRIPTOR.message_types_by_name['OpenXmlRequest'] = _OPENXMLREQUEST +DESCRIPTOR.message_types_by_name['OpenXmlResponse'] = _OPENXMLRESPONSE +DESCRIPTOR.message_types_by_name['Hook'] = _HOOK +DESCRIPTOR.message_types_by_name['ServiceDefaults'] = _SERVICEDEFAULTS +DESCRIPTOR.message_types_by_name['Service'] = _SERVICE +DESCRIPTOR.message_types_by_name['NodeServiceData'] = _NODESERVICEDATA +DESCRIPTOR.message_types_by_name['ConfigGroup'] = _CONFIGGROUP +DESCRIPTOR.message_types_by_name['ConfigOption'] = _CONFIGOPTION +DESCRIPTOR.message_types_by_name['Session'] = _SESSION +DESCRIPTOR.message_types_by_name['SessionSummary'] = _SESSIONSUMMARY +DESCRIPTOR.message_types_by_name['Node'] = _NODE +DESCRIPTOR.message_types_by_name['Link'] = _LINK +DESCRIPTOR.message_types_by_name['LinkOptions'] = _LINKOPTIONS +DESCRIPTOR.message_types_by_name['Interface'] = _INTERFACE +DESCRIPTOR.message_types_by_name['Position'] = _POSITION +DESCRIPTOR.enum_types_by_name['MessageType'] = _MESSAGETYPE +DESCRIPTOR.enum_types_by_name['LinkType'] = _LINKTYPE +DESCRIPTOR.enum_types_by_name['SessionState'] = _SESSIONSTATE +DESCRIPTOR.enum_types_by_name['NodeType'] = _NODETYPE +DESCRIPTOR.enum_types_by_name['ServiceValidationMode'] = _SERVICEVALIDATIONMODE +DESCRIPTOR.enum_types_by_name['ServiceAction'] = _SERVICEACTION +DESCRIPTOR.enum_types_by_name['MobilityAction'] = _MOBILITYACTION +DESCRIPTOR.enum_types_by_name['ExceptionLevel'] = _EXCEPTIONLEVEL +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +CreateSessionRequest = _reflection.GeneratedProtocolMessageType('CreateSessionRequest', (_message.Message,), dict( + DESCRIPTOR = _CREATESESSIONREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.CreateSessionRequest) + )) +_sym_db.RegisterMessage(CreateSessionRequest) + +CreateSessionResponse = _reflection.GeneratedProtocolMessageType('CreateSessionResponse', (_message.Message,), dict( + DESCRIPTOR = _CREATESESSIONRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.CreateSessionResponse) + )) +_sym_db.RegisterMessage(CreateSessionResponse) + +DeleteSessionRequest = _reflection.GeneratedProtocolMessageType('DeleteSessionRequest', (_message.Message,), dict( + DESCRIPTOR = _DELETESESSIONREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.DeleteSessionRequest) + )) +_sym_db.RegisterMessage(DeleteSessionRequest) + +DeleteSessionResponse = _reflection.GeneratedProtocolMessageType('DeleteSessionResponse', (_message.Message,), dict( + DESCRIPTOR = _DELETESESSIONRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.DeleteSessionResponse) + )) +_sym_db.RegisterMessage(DeleteSessionResponse) + +GetSessionsRequest = _reflection.GeneratedProtocolMessageType('GetSessionsRequest', (_message.Message,), dict( + DESCRIPTOR = _GETSESSIONSREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetSessionsRequest) + )) +_sym_db.RegisterMessage(GetSessionsRequest) + +GetSessionsResponse = _reflection.GeneratedProtocolMessageType('GetSessionsResponse', (_message.Message,), dict( + DESCRIPTOR = _GETSESSIONSRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetSessionsResponse) + )) +_sym_db.RegisterMessage(GetSessionsResponse) + +GetSessionRequest = _reflection.GeneratedProtocolMessageType('GetSessionRequest', (_message.Message,), dict( + DESCRIPTOR = _GETSESSIONREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetSessionRequest) + )) +_sym_db.RegisterMessage(GetSessionRequest) + +GetSessionResponse = _reflection.GeneratedProtocolMessageType('GetSessionResponse', (_message.Message,), dict( + DESCRIPTOR = _GETSESSIONRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetSessionResponse) + )) +_sym_db.RegisterMessage(GetSessionResponse) + +GetSessionOptionsRequest = _reflection.GeneratedProtocolMessageType('GetSessionOptionsRequest', (_message.Message,), dict( + DESCRIPTOR = _GETSESSIONOPTIONSREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetSessionOptionsRequest) + )) +_sym_db.RegisterMessage(GetSessionOptionsRequest) + +GetSessionOptionsResponse = _reflection.GeneratedProtocolMessageType('GetSessionOptionsResponse', (_message.Message,), dict( + DESCRIPTOR = _GETSESSIONOPTIONSRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetSessionOptionsResponse) + )) +_sym_db.RegisterMessage(GetSessionOptionsResponse) + +SetSessionOptionsRequest = _reflection.GeneratedProtocolMessageType('SetSessionOptionsRequest', (_message.Message,), dict( + + ConfigEntry = _reflection.GeneratedProtocolMessageType('ConfigEntry', (_message.Message,), dict( + DESCRIPTOR = _SETSESSIONOPTIONSREQUEST_CONFIGENTRY, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetSessionOptionsRequest.ConfigEntry) + )) + , + DESCRIPTOR = _SETSESSIONOPTIONSREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetSessionOptionsRequest) + )) +_sym_db.RegisterMessage(SetSessionOptionsRequest) +_sym_db.RegisterMessage(SetSessionOptionsRequest.ConfigEntry) + +SetSessionOptionsResponse = _reflection.GeneratedProtocolMessageType('SetSessionOptionsResponse', (_message.Message,), dict( + DESCRIPTOR = _SETSESSIONOPTIONSRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetSessionOptionsResponse) + )) +_sym_db.RegisterMessage(SetSessionOptionsResponse) + +GetSessionLocationRequest = _reflection.GeneratedProtocolMessageType('GetSessionLocationRequest', (_message.Message,), dict( + DESCRIPTOR = _GETSESSIONLOCATIONREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetSessionLocationRequest) + )) +_sym_db.RegisterMessage(GetSessionLocationRequest) + +GetSessionLocationResponse = _reflection.GeneratedProtocolMessageType('GetSessionLocationResponse', (_message.Message,), dict( + DESCRIPTOR = _GETSESSIONLOCATIONRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetSessionLocationResponse) + )) +_sym_db.RegisterMessage(GetSessionLocationResponse) + +SetSessionLocationRequest = _reflection.GeneratedProtocolMessageType('SetSessionLocationRequest', (_message.Message,), dict( + DESCRIPTOR = _SETSESSIONLOCATIONREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetSessionLocationRequest) + )) +_sym_db.RegisterMessage(SetSessionLocationRequest) + +SetSessionLocationResponse = _reflection.GeneratedProtocolMessageType('SetSessionLocationResponse', (_message.Message,), dict( + DESCRIPTOR = _SETSESSIONLOCATIONRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetSessionLocationResponse) + )) +_sym_db.RegisterMessage(SetSessionLocationResponse) + +SetSessionStateRequest = _reflection.GeneratedProtocolMessageType('SetSessionStateRequest', (_message.Message,), dict( + DESCRIPTOR = _SETSESSIONSTATEREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetSessionStateRequest) + )) +_sym_db.RegisterMessage(SetSessionStateRequest) + +SetSessionStateResponse = _reflection.GeneratedProtocolMessageType('SetSessionStateResponse', (_message.Message,), dict( + DESCRIPTOR = _SETSESSIONSTATERESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetSessionStateResponse) + )) +_sym_db.RegisterMessage(SetSessionStateResponse) + +NodeEventsRequest = _reflection.GeneratedProtocolMessageType('NodeEventsRequest', (_message.Message,), dict( + DESCRIPTOR = _NODEEVENTSREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.NodeEventsRequest) + )) +_sym_db.RegisterMessage(NodeEventsRequest) + +NodeEvent = _reflection.GeneratedProtocolMessageType('NodeEvent', (_message.Message,), dict( + DESCRIPTOR = _NODEEVENT, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.NodeEvent) + )) +_sym_db.RegisterMessage(NodeEvent) + +LinkEventsRequest = _reflection.GeneratedProtocolMessageType('LinkEventsRequest', (_message.Message,), dict( + DESCRIPTOR = _LINKEVENTSREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.LinkEventsRequest) + )) +_sym_db.RegisterMessage(LinkEventsRequest) + +LinkEvent = _reflection.GeneratedProtocolMessageType('LinkEvent', (_message.Message,), dict( + DESCRIPTOR = _LINKEVENT, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.LinkEvent) + )) +_sym_db.RegisterMessage(LinkEvent) + +SessionEventsRequest = _reflection.GeneratedProtocolMessageType('SessionEventsRequest', (_message.Message,), dict( + DESCRIPTOR = _SESSIONEVENTSREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SessionEventsRequest) + )) +_sym_db.RegisterMessage(SessionEventsRequest) + +SessionEvent = _reflection.GeneratedProtocolMessageType('SessionEvent', (_message.Message,), dict( + DESCRIPTOR = _SESSIONEVENT, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SessionEvent) + )) +_sym_db.RegisterMessage(SessionEvent) + +ConfigEventsRequest = _reflection.GeneratedProtocolMessageType('ConfigEventsRequest', (_message.Message,), dict( + DESCRIPTOR = _CONFIGEVENTSREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.ConfigEventsRequest) + )) +_sym_db.RegisterMessage(ConfigEventsRequest) + +ConfigEvent = _reflection.GeneratedProtocolMessageType('ConfigEvent', (_message.Message,), dict( + DESCRIPTOR = _CONFIGEVENT, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.ConfigEvent) + )) +_sym_db.RegisterMessage(ConfigEvent) + +ExceptionEventsRequest = _reflection.GeneratedProtocolMessageType('ExceptionEventsRequest', (_message.Message,), dict( + DESCRIPTOR = _EXCEPTIONEVENTSREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.ExceptionEventsRequest) + )) +_sym_db.RegisterMessage(ExceptionEventsRequest) + +ExceptionEvent = _reflection.GeneratedProtocolMessageType('ExceptionEvent', (_message.Message,), dict( + DESCRIPTOR = _EXCEPTIONEVENT, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.ExceptionEvent) + )) +_sym_db.RegisterMessage(ExceptionEvent) + +FileEventsRequest = _reflection.GeneratedProtocolMessageType('FileEventsRequest', (_message.Message,), dict( + DESCRIPTOR = _FILEEVENTSREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.FileEventsRequest) + )) +_sym_db.RegisterMessage(FileEventsRequest) + +FileEvent = _reflection.GeneratedProtocolMessageType('FileEvent', (_message.Message,), dict( + DESCRIPTOR = _FILEEVENT, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.FileEvent) + )) +_sym_db.RegisterMessage(FileEvent) + +AddNodeRequest = _reflection.GeneratedProtocolMessageType('AddNodeRequest', (_message.Message,), dict( + DESCRIPTOR = _ADDNODEREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.AddNodeRequest) + )) +_sym_db.RegisterMessage(AddNodeRequest) + +AddNodeResponse = _reflection.GeneratedProtocolMessageType('AddNodeResponse', (_message.Message,), dict( + DESCRIPTOR = _ADDNODERESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.AddNodeResponse) + )) +_sym_db.RegisterMessage(AddNodeResponse) + +GetNodeRequest = _reflection.GeneratedProtocolMessageType('GetNodeRequest', (_message.Message,), dict( + DESCRIPTOR = _GETNODEREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetNodeRequest) + )) +_sym_db.RegisterMessage(GetNodeRequest) + +GetNodeResponse = _reflection.GeneratedProtocolMessageType('GetNodeResponse', (_message.Message,), dict( + DESCRIPTOR = _GETNODERESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetNodeResponse) + )) +_sym_db.RegisterMessage(GetNodeResponse) + +EditNodeRequest = _reflection.GeneratedProtocolMessageType('EditNodeRequest', (_message.Message,), dict( + DESCRIPTOR = _EDITNODEREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.EditNodeRequest) + )) +_sym_db.RegisterMessage(EditNodeRequest) + +EditNodeResponse = _reflection.GeneratedProtocolMessageType('EditNodeResponse', (_message.Message,), dict( + DESCRIPTOR = _EDITNODERESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.EditNodeResponse) + )) +_sym_db.RegisterMessage(EditNodeResponse) + +DeleteNodeRequest = _reflection.GeneratedProtocolMessageType('DeleteNodeRequest', (_message.Message,), dict( + DESCRIPTOR = _DELETENODEREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.DeleteNodeRequest) + )) +_sym_db.RegisterMessage(DeleteNodeRequest) + +DeleteNodeResponse = _reflection.GeneratedProtocolMessageType('DeleteNodeResponse', (_message.Message,), dict( + DESCRIPTOR = _DELETENODERESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.DeleteNodeResponse) + )) +_sym_db.RegisterMessage(DeleteNodeResponse) + +GetNodeLinksRequest = _reflection.GeneratedProtocolMessageType('GetNodeLinksRequest', (_message.Message,), dict( + DESCRIPTOR = _GETNODELINKSREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetNodeLinksRequest) + )) +_sym_db.RegisterMessage(GetNodeLinksRequest) + +GetNodeLinksResponse = _reflection.GeneratedProtocolMessageType('GetNodeLinksResponse', (_message.Message,), dict( + DESCRIPTOR = _GETNODELINKSRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetNodeLinksResponse) + )) +_sym_db.RegisterMessage(GetNodeLinksResponse) + +AddLinkRequest = _reflection.GeneratedProtocolMessageType('AddLinkRequest', (_message.Message,), dict( + DESCRIPTOR = _ADDLINKREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.AddLinkRequest) + )) +_sym_db.RegisterMessage(AddLinkRequest) + +AddLinkResponse = _reflection.GeneratedProtocolMessageType('AddLinkResponse', (_message.Message,), dict( + DESCRIPTOR = _ADDLINKRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.AddLinkResponse) + )) +_sym_db.RegisterMessage(AddLinkResponse) + +EditLinkRequest = _reflection.GeneratedProtocolMessageType('EditLinkRequest', (_message.Message,), dict( + DESCRIPTOR = _EDITLINKREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.EditLinkRequest) + )) +_sym_db.RegisterMessage(EditLinkRequest) + +EditLinkResponse = _reflection.GeneratedProtocolMessageType('EditLinkResponse', (_message.Message,), dict( + DESCRIPTOR = _EDITLINKRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.EditLinkResponse) + )) +_sym_db.RegisterMessage(EditLinkResponse) + +DeleteLinkRequest = _reflection.GeneratedProtocolMessageType('DeleteLinkRequest', (_message.Message,), dict( + DESCRIPTOR = _DELETELINKREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.DeleteLinkRequest) + )) +_sym_db.RegisterMessage(DeleteLinkRequest) + +DeleteLinkResponse = _reflection.GeneratedProtocolMessageType('DeleteLinkResponse', (_message.Message,), dict( + DESCRIPTOR = _DELETELINKRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.DeleteLinkResponse) + )) +_sym_db.RegisterMessage(DeleteLinkResponse) + +GetHooksRequest = _reflection.GeneratedProtocolMessageType('GetHooksRequest', (_message.Message,), dict( + DESCRIPTOR = _GETHOOKSREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetHooksRequest) + )) +_sym_db.RegisterMessage(GetHooksRequest) + +GetHooksResponse = _reflection.GeneratedProtocolMessageType('GetHooksResponse', (_message.Message,), dict( + DESCRIPTOR = _GETHOOKSRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetHooksResponse) + )) +_sym_db.RegisterMessage(GetHooksResponse) + +AddHookRequest = _reflection.GeneratedProtocolMessageType('AddHookRequest', (_message.Message,), dict( + DESCRIPTOR = _ADDHOOKREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.AddHookRequest) + )) +_sym_db.RegisterMessage(AddHookRequest) + +AddHookResponse = _reflection.GeneratedProtocolMessageType('AddHookResponse', (_message.Message,), dict( + DESCRIPTOR = _ADDHOOKRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.AddHookResponse) + )) +_sym_db.RegisterMessage(AddHookResponse) + +GetMobilityConfigsRequest = _reflection.GeneratedProtocolMessageType('GetMobilityConfigsRequest', (_message.Message,), dict( + DESCRIPTOR = _GETMOBILITYCONFIGSREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetMobilityConfigsRequest) + )) +_sym_db.RegisterMessage(GetMobilityConfigsRequest) + +GetMobilityConfigsResponse = _reflection.GeneratedProtocolMessageType('GetMobilityConfigsResponse', (_message.Message,), dict( + + MobilityConfig = _reflection.GeneratedProtocolMessageType('MobilityConfig', (_message.Message,), dict( + DESCRIPTOR = _GETMOBILITYCONFIGSRESPONSE_MOBILITYCONFIG, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetMobilityConfigsResponse.MobilityConfig) + )) + , + + ConfigsEntry = _reflection.GeneratedProtocolMessageType('ConfigsEntry', (_message.Message,), dict( + DESCRIPTOR = _GETMOBILITYCONFIGSRESPONSE_CONFIGSENTRY, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetMobilityConfigsResponse.ConfigsEntry) + )) + , + DESCRIPTOR = _GETMOBILITYCONFIGSRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetMobilityConfigsResponse) + )) +_sym_db.RegisterMessage(GetMobilityConfigsResponse) +_sym_db.RegisterMessage(GetMobilityConfigsResponse.MobilityConfig) +_sym_db.RegisterMessage(GetMobilityConfigsResponse.ConfigsEntry) + +GetMobilityConfigRequest = _reflection.GeneratedProtocolMessageType('GetMobilityConfigRequest', (_message.Message,), dict( + DESCRIPTOR = _GETMOBILITYCONFIGREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetMobilityConfigRequest) + )) +_sym_db.RegisterMessage(GetMobilityConfigRequest) + +GetMobilityConfigResponse = _reflection.GeneratedProtocolMessageType('GetMobilityConfigResponse', (_message.Message,), dict( + DESCRIPTOR = _GETMOBILITYCONFIGRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetMobilityConfigResponse) + )) +_sym_db.RegisterMessage(GetMobilityConfigResponse) + +SetMobilityConfigRequest = _reflection.GeneratedProtocolMessageType('SetMobilityConfigRequest', (_message.Message,), dict( + + ConfigEntry = _reflection.GeneratedProtocolMessageType('ConfigEntry', (_message.Message,), dict( + DESCRIPTOR = _SETMOBILITYCONFIGREQUEST_CONFIGENTRY, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetMobilityConfigRequest.ConfigEntry) + )) + , + DESCRIPTOR = _SETMOBILITYCONFIGREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetMobilityConfigRequest) + )) +_sym_db.RegisterMessage(SetMobilityConfigRequest) +_sym_db.RegisterMessage(SetMobilityConfigRequest.ConfigEntry) + +SetMobilityConfigResponse = _reflection.GeneratedProtocolMessageType('SetMobilityConfigResponse', (_message.Message,), dict( + DESCRIPTOR = _SETMOBILITYCONFIGRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetMobilityConfigResponse) + )) +_sym_db.RegisterMessage(SetMobilityConfigResponse) + +MobilityActionRequest = _reflection.GeneratedProtocolMessageType('MobilityActionRequest', (_message.Message,), dict( + DESCRIPTOR = _MOBILITYACTIONREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.MobilityActionRequest) + )) +_sym_db.RegisterMessage(MobilityActionRequest) + +MobilityActionResponse = _reflection.GeneratedProtocolMessageType('MobilityActionResponse', (_message.Message,), dict( + DESCRIPTOR = _MOBILITYACTIONRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.MobilityActionResponse) + )) +_sym_db.RegisterMessage(MobilityActionResponse) + +GetServicesRequest = _reflection.GeneratedProtocolMessageType('GetServicesRequest', (_message.Message,), dict( + DESCRIPTOR = _GETSERVICESREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetServicesRequest) + )) +_sym_db.RegisterMessage(GetServicesRequest) + +GetServicesResponse = _reflection.GeneratedProtocolMessageType('GetServicesResponse', (_message.Message,), dict( + DESCRIPTOR = _GETSERVICESRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetServicesResponse) + )) +_sym_db.RegisterMessage(GetServicesResponse) + +GetServiceDefaultsRequest = _reflection.GeneratedProtocolMessageType('GetServiceDefaultsRequest', (_message.Message,), dict( + DESCRIPTOR = _GETSERVICEDEFAULTSREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetServiceDefaultsRequest) + )) +_sym_db.RegisterMessage(GetServiceDefaultsRequest) + +GetServiceDefaultsResponse = _reflection.GeneratedProtocolMessageType('GetServiceDefaultsResponse', (_message.Message,), dict( + DESCRIPTOR = _GETSERVICEDEFAULTSRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetServiceDefaultsResponse) + )) +_sym_db.RegisterMessage(GetServiceDefaultsResponse) + +SetServiceDefaultsRequest = _reflection.GeneratedProtocolMessageType('SetServiceDefaultsRequest', (_message.Message,), dict( + DESCRIPTOR = _SETSERVICEDEFAULTSREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetServiceDefaultsRequest) + )) +_sym_db.RegisterMessage(SetServiceDefaultsRequest) + +SetServiceDefaultsResponse = _reflection.GeneratedProtocolMessageType('SetServiceDefaultsResponse', (_message.Message,), dict( + DESCRIPTOR = _SETSERVICEDEFAULTSRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetServiceDefaultsResponse) + )) +_sym_db.RegisterMessage(SetServiceDefaultsResponse) + +GetNodeServiceRequest = _reflection.GeneratedProtocolMessageType('GetNodeServiceRequest', (_message.Message,), dict( + DESCRIPTOR = _GETNODESERVICEREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetNodeServiceRequest) + )) +_sym_db.RegisterMessage(GetNodeServiceRequest) + +GetNodeServiceResponse = _reflection.GeneratedProtocolMessageType('GetNodeServiceResponse', (_message.Message,), dict( + DESCRIPTOR = _GETNODESERVICERESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetNodeServiceResponse) + )) +_sym_db.RegisterMessage(GetNodeServiceResponse) + +GetNodeServiceFileRequest = _reflection.GeneratedProtocolMessageType('GetNodeServiceFileRequest', (_message.Message,), dict( + DESCRIPTOR = _GETNODESERVICEFILEREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetNodeServiceFileRequest) + )) +_sym_db.RegisterMessage(GetNodeServiceFileRequest) + +GetNodeServiceFileResponse = _reflection.GeneratedProtocolMessageType('GetNodeServiceFileResponse', (_message.Message,), dict( + DESCRIPTOR = _GETNODESERVICEFILERESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetNodeServiceFileResponse) + )) +_sym_db.RegisterMessage(GetNodeServiceFileResponse) + +SetNodeServiceRequest = _reflection.GeneratedProtocolMessageType('SetNodeServiceRequest', (_message.Message,), dict( + DESCRIPTOR = _SETNODESERVICEREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetNodeServiceRequest) + )) +_sym_db.RegisterMessage(SetNodeServiceRequest) + +SetNodeServiceResponse = _reflection.GeneratedProtocolMessageType('SetNodeServiceResponse', (_message.Message,), dict( + DESCRIPTOR = _SETNODESERVICERESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetNodeServiceResponse) + )) +_sym_db.RegisterMessage(SetNodeServiceResponse) + +SetNodeServiceFileRequest = _reflection.GeneratedProtocolMessageType('SetNodeServiceFileRequest', (_message.Message,), dict( + DESCRIPTOR = _SETNODESERVICEFILEREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetNodeServiceFileRequest) + )) +_sym_db.RegisterMessage(SetNodeServiceFileRequest) + +SetNodeServiceFileResponse = _reflection.GeneratedProtocolMessageType('SetNodeServiceFileResponse', (_message.Message,), dict( + DESCRIPTOR = _SETNODESERVICEFILERESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetNodeServiceFileResponse) + )) +_sym_db.RegisterMessage(SetNodeServiceFileResponse) + +ServiceActionRequest = _reflection.GeneratedProtocolMessageType('ServiceActionRequest', (_message.Message,), dict( + DESCRIPTOR = _SERVICEACTIONREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.ServiceActionRequest) + )) +_sym_db.RegisterMessage(ServiceActionRequest) + +ServiceActionResponse = _reflection.GeneratedProtocolMessageType('ServiceActionResponse', (_message.Message,), dict( + DESCRIPTOR = _SERVICEACTIONRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.ServiceActionResponse) + )) +_sym_db.RegisterMessage(ServiceActionResponse) + +GetWlanConfigRequest = _reflection.GeneratedProtocolMessageType('GetWlanConfigRequest', (_message.Message,), dict( + DESCRIPTOR = _GETWLANCONFIGREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetWlanConfigRequest) + )) +_sym_db.RegisterMessage(GetWlanConfigRequest) + +GetWlanConfigResponse = _reflection.GeneratedProtocolMessageType('GetWlanConfigResponse', (_message.Message,), dict( + DESCRIPTOR = _GETWLANCONFIGRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetWlanConfigResponse) + )) +_sym_db.RegisterMessage(GetWlanConfigResponse) + +SetWlanConfigRequest = _reflection.GeneratedProtocolMessageType('SetWlanConfigRequest', (_message.Message,), dict( + + ConfigEntry = _reflection.GeneratedProtocolMessageType('ConfigEntry', (_message.Message,), dict( + DESCRIPTOR = _SETWLANCONFIGREQUEST_CONFIGENTRY, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetWlanConfigRequest.ConfigEntry) + )) + , + DESCRIPTOR = _SETWLANCONFIGREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetWlanConfigRequest) + )) +_sym_db.RegisterMessage(SetWlanConfigRequest) +_sym_db.RegisterMessage(SetWlanConfigRequest.ConfigEntry) + +SetWlanConfigResponse = _reflection.GeneratedProtocolMessageType('SetWlanConfigResponse', (_message.Message,), dict( + DESCRIPTOR = _SETWLANCONFIGRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetWlanConfigResponse) + )) +_sym_db.RegisterMessage(SetWlanConfigResponse) + +GetEmaneConfigRequest = _reflection.GeneratedProtocolMessageType('GetEmaneConfigRequest', (_message.Message,), dict( + DESCRIPTOR = _GETEMANECONFIGREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetEmaneConfigRequest) + )) +_sym_db.RegisterMessage(GetEmaneConfigRequest) + +GetEmaneConfigResponse = _reflection.GeneratedProtocolMessageType('GetEmaneConfigResponse', (_message.Message,), dict( + DESCRIPTOR = _GETEMANECONFIGRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetEmaneConfigResponse) + )) +_sym_db.RegisterMessage(GetEmaneConfigResponse) + +SetEmaneConfigRequest = _reflection.GeneratedProtocolMessageType('SetEmaneConfigRequest', (_message.Message,), dict( + + ConfigEntry = _reflection.GeneratedProtocolMessageType('ConfigEntry', (_message.Message,), dict( + DESCRIPTOR = _SETEMANECONFIGREQUEST_CONFIGENTRY, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetEmaneConfigRequest.ConfigEntry) + )) + , + DESCRIPTOR = _SETEMANECONFIGREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetEmaneConfigRequest) + )) +_sym_db.RegisterMessage(SetEmaneConfigRequest) +_sym_db.RegisterMessage(SetEmaneConfigRequest.ConfigEntry) + +SetEmaneConfigResponse = _reflection.GeneratedProtocolMessageType('SetEmaneConfigResponse', (_message.Message,), dict( + DESCRIPTOR = _SETEMANECONFIGRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetEmaneConfigResponse) + )) +_sym_db.RegisterMessage(SetEmaneConfigResponse) + +GetEmaneModelsRequest = _reflection.GeneratedProtocolMessageType('GetEmaneModelsRequest', (_message.Message,), dict( + DESCRIPTOR = _GETEMANEMODELSREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetEmaneModelsRequest) + )) +_sym_db.RegisterMessage(GetEmaneModelsRequest) + +GetEmaneModelsResponse = _reflection.GeneratedProtocolMessageType('GetEmaneModelsResponse', (_message.Message,), dict( + DESCRIPTOR = _GETEMANEMODELSRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetEmaneModelsResponse) + )) +_sym_db.RegisterMessage(GetEmaneModelsResponse) + +GetEmaneModelConfigRequest = _reflection.GeneratedProtocolMessageType('GetEmaneModelConfigRequest', (_message.Message,), dict( + DESCRIPTOR = _GETEMANEMODELCONFIGREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetEmaneModelConfigRequest) + )) +_sym_db.RegisterMessage(GetEmaneModelConfigRequest) + +GetEmaneModelConfigResponse = _reflection.GeneratedProtocolMessageType('GetEmaneModelConfigResponse', (_message.Message,), dict( + DESCRIPTOR = _GETEMANEMODELCONFIGRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetEmaneModelConfigResponse) + )) +_sym_db.RegisterMessage(GetEmaneModelConfigResponse) + +SetEmaneModelConfigRequest = _reflection.GeneratedProtocolMessageType('SetEmaneModelConfigRequest', (_message.Message,), dict( + + ConfigEntry = _reflection.GeneratedProtocolMessageType('ConfigEntry', (_message.Message,), dict( + DESCRIPTOR = _SETEMANEMODELCONFIGREQUEST_CONFIGENTRY, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetEmaneModelConfigRequest.ConfigEntry) + )) + , + DESCRIPTOR = _SETEMANEMODELCONFIGREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetEmaneModelConfigRequest) + )) +_sym_db.RegisterMessage(SetEmaneModelConfigRequest) +_sym_db.RegisterMessage(SetEmaneModelConfigRequest.ConfigEntry) + +SetEmaneModelConfigResponse = _reflection.GeneratedProtocolMessageType('SetEmaneModelConfigResponse', (_message.Message,), dict( + DESCRIPTOR = _SETEMANEMODELCONFIGRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SetEmaneModelConfigResponse) + )) +_sym_db.RegisterMessage(SetEmaneModelConfigResponse) + +GetEmaneModelConfigsRequest = _reflection.GeneratedProtocolMessageType('GetEmaneModelConfigsRequest', (_message.Message,), dict( + DESCRIPTOR = _GETEMANEMODELCONFIGSREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetEmaneModelConfigsRequest) + )) +_sym_db.RegisterMessage(GetEmaneModelConfigsRequest) + +GetEmaneModelConfigsResponse = _reflection.GeneratedProtocolMessageType('GetEmaneModelConfigsResponse', (_message.Message,), dict( + + ModelConfig = _reflection.GeneratedProtocolMessageType('ModelConfig', (_message.Message,), dict( + DESCRIPTOR = _GETEMANEMODELCONFIGSRESPONSE_MODELCONFIG, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetEmaneModelConfigsResponse.ModelConfig) + )) + , + + ConfigsEntry = _reflection.GeneratedProtocolMessageType('ConfigsEntry', (_message.Message,), dict( + DESCRIPTOR = _GETEMANEMODELCONFIGSRESPONSE_CONFIGSENTRY, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetEmaneModelConfigsResponse.ConfigsEntry) + )) + , + DESCRIPTOR = _GETEMANEMODELCONFIGSRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.GetEmaneModelConfigsResponse) + )) +_sym_db.RegisterMessage(GetEmaneModelConfigsResponse) +_sym_db.RegisterMessage(GetEmaneModelConfigsResponse.ModelConfig) +_sym_db.RegisterMessage(GetEmaneModelConfigsResponse.ConfigsEntry) + +SaveXmlRequest = _reflection.GeneratedProtocolMessageType('SaveXmlRequest', (_message.Message,), dict( + DESCRIPTOR = _SAVEXMLREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SaveXmlRequest) + )) +_sym_db.RegisterMessage(SaveXmlRequest) + +SaveXmlResponse = _reflection.GeneratedProtocolMessageType('SaveXmlResponse', (_message.Message,), dict( + DESCRIPTOR = _SAVEXMLRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SaveXmlResponse) + )) +_sym_db.RegisterMessage(SaveXmlResponse) + +OpenXmlRequest = _reflection.GeneratedProtocolMessageType('OpenXmlRequest', (_message.Message,), dict( + DESCRIPTOR = _OPENXMLREQUEST, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.OpenXmlRequest) + )) +_sym_db.RegisterMessage(OpenXmlRequest) + +OpenXmlResponse = _reflection.GeneratedProtocolMessageType('OpenXmlResponse', (_message.Message,), dict( + DESCRIPTOR = _OPENXMLRESPONSE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.OpenXmlResponse) + )) +_sym_db.RegisterMessage(OpenXmlResponse) + +Hook = _reflection.GeneratedProtocolMessageType('Hook', (_message.Message,), dict( + DESCRIPTOR = _HOOK, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.Hook) + )) +_sym_db.RegisterMessage(Hook) + +ServiceDefaults = _reflection.GeneratedProtocolMessageType('ServiceDefaults', (_message.Message,), dict( + DESCRIPTOR = _SERVICEDEFAULTS, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.ServiceDefaults) + )) +_sym_db.RegisterMessage(ServiceDefaults) + +Service = _reflection.GeneratedProtocolMessageType('Service', (_message.Message,), dict( + DESCRIPTOR = _SERVICE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.Service) + )) +_sym_db.RegisterMessage(Service) + +NodeServiceData = _reflection.GeneratedProtocolMessageType('NodeServiceData', (_message.Message,), dict( + DESCRIPTOR = _NODESERVICEDATA, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.NodeServiceData) + )) +_sym_db.RegisterMessage(NodeServiceData) + +ConfigGroup = _reflection.GeneratedProtocolMessageType('ConfigGroup', (_message.Message,), dict( + DESCRIPTOR = _CONFIGGROUP, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.ConfigGroup) + )) +_sym_db.RegisterMessage(ConfigGroup) + +ConfigOption = _reflection.GeneratedProtocolMessageType('ConfigOption', (_message.Message,), dict( + DESCRIPTOR = _CONFIGOPTION, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.ConfigOption) + )) +_sym_db.RegisterMessage(ConfigOption) + +Session = _reflection.GeneratedProtocolMessageType('Session', (_message.Message,), dict( + DESCRIPTOR = _SESSION, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.Session) + )) +_sym_db.RegisterMessage(Session) + +SessionSummary = _reflection.GeneratedProtocolMessageType('SessionSummary', (_message.Message,), dict( + DESCRIPTOR = _SESSIONSUMMARY, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.SessionSummary) + )) +_sym_db.RegisterMessage(SessionSummary) + +Node = _reflection.GeneratedProtocolMessageType('Node', (_message.Message,), dict( + DESCRIPTOR = _NODE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.Node) + )) +_sym_db.RegisterMessage(Node) + +Link = _reflection.GeneratedProtocolMessageType('Link', (_message.Message,), dict( + DESCRIPTOR = _LINK, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.Link) + )) +_sym_db.RegisterMessage(Link) + +LinkOptions = _reflection.GeneratedProtocolMessageType('LinkOptions', (_message.Message,), dict( + DESCRIPTOR = _LINKOPTIONS, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.LinkOptions) + )) +_sym_db.RegisterMessage(LinkOptions) + +Interface = _reflection.GeneratedProtocolMessageType('Interface', (_message.Message,), dict( + DESCRIPTOR = _INTERFACE, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.Interface) + )) +_sym_db.RegisterMessage(Interface) + +Position = _reflection.GeneratedProtocolMessageType('Position', (_message.Message,), dict( + DESCRIPTOR = _POSITION, + __module__ = 'core_pb2' + # @@protoc_insertion_point(class_scope:core.Position) + )) +_sym_db.RegisterMessage(Position) + + +_SETSESSIONOPTIONSREQUEST_CONFIGENTRY._options = None +_GETMOBILITYCONFIGSRESPONSE_CONFIGSENTRY._options = None +_SETMOBILITYCONFIGREQUEST_CONFIGENTRY._options = None +_SETWLANCONFIGREQUEST_CONFIGENTRY._options = None +_SETEMANECONFIGREQUEST_CONFIGENTRY._options = None +_SETEMANEMODELCONFIGREQUEST_CONFIGENTRY._options = None +_GETEMANEMODELCONFIGSRESPONSE_CONFIGSENTRY._options = None + +_COREAPI = _descriptor.ServiceDescriptor( + name='CoreApi', + full_name='core.CoreApi', + file=DESCRIPTOR, + index=0, + serialized_options=None, + serialized_start=9243, + serialized_end=12797, + methods=[ + _descriptor.MethodDescriptor( + name='CreateSession', + full_name='core.CoreApi.CreateSession', + index=0, + containing_service=None, + input_type=_CREATESESSIONREQUEST, + output_type=_CREATESESSIONRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='DeleteSession', + full_name='core.CoreApi.DeleteSession', + index=1, + containing_service=None, + input_type=_DELETESESSIONREQUEST, + output_type=_DELETESESSIONRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetSessions', + full_name='core.CoreApi.GetSessions', + index=2, + containing_service=None, + input_type=_GETSESSIONSREQUEST, + output_type=_GETSESSIONSRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetSession', + full_name='core.CoreApi.GetSession', + index=3, + containing_service=None, + input_type=_GETSESSIONREQUEST, + output_type=_GETSESSIONRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetSessionOptions', + full_name='core.CoreApi.GetSessionOptions', + index=4, + containing_service=None, + input_type=_GETSESSIONOPTIONSREQUEST, + output_type=_GETSESSIONOPTIONSRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='SetSessionOptions', + full_name='core.CoreApi.SetSessionOptions', + index=5, + containing_service=None, + input_type=_SETSESSIONOPTIONSREQUEST, + output_type=_SETSESSIONOPTIONSRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetSessionLocation', + full_name='core.CoreApi.GetSessionLocation', + index=6, + containing_service=None, + input_type=_GETSESSIONLOCATIONREQUEST, + output_type=_GETSESSIONLOCATIONRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='SetSessionLocation', + full_name='core.CoreApi.SetSessionLocation', + index=7, + containing_service=None, + input_type=_SETSESSIONLOCATIONREQUEST, + output_type=_SETSESSIONLOCATIONRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='SetSessionState', + full_name='core.CoreApi.SetSessionState', + index=8, + containing_service=None, + input_type=_SETSESSIONSTATEREQUEST, + output_type=_SETSESSIONSTATERESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='NodeEvents', + full_name='core.CoreApi.NodeEvents', + index=9, + containing_service=None, + input_type=_NODEEVENTSREQUEST, + output_type=_NODEEVENT, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='LinkEvents', + full_name='core.CoreApi.LinkEvents', + index=10, + containing_service=None, + input_type=_LINKEVENTSREQUEST, + output_type=_LINKEVENT, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='SessionEvents', + full_name='core.CoreApi.SessionEvents', + index=11, + containing_service=None, + input_type=_SESSIONEVENTSREQUEST, + output_type=_SESSIONEVENT, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='ConfigEvents', + full_name='core.CoreApi.ConfigEvents', + index=12, + containing_service=None, + input_type=_CONFIGEVENTSREQUEST, + output_type=_CONFIGEVENT, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='ExceptionEvents', + full_name='core.CoreApi.ExceptionEvents', + index=13, + containing_service=None, + input_type=_EXCEPTIONEVENTSREQUEST, + output_type=_EXCEPTIONEVENT, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='FileEvents', + full_name='core.CoreApi.FileEvents', + index=14, + containing_service=None, + input_type=_FILEEVENTSREQUEST, + output_type=_FILEEVENT, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='AddNode', + full_name='core.CoreApi.AddNode', + index=15, + containing_service=None, + input_type=_ADDNODEREQUEST, + output_type=_ADDNODERESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetNode', + full_name='core.CoreApi.GetNode', + index=16, + containing_service=None, + input_type=_GETNODEREQUEST, + output_type=_GETNODERESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='EditNode', + full_name='core.CoreApi.EditNode', + index=17, + containing_service=None, + input_type=_EDITNODEREQUEST, + output_type=_EDITNODERESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='DeleteNode', + full_name='core.CoreApi.DeleteNode', + index=18, + containing_service=None, + input_type=_DELETENODEREQUEST, + output_type=_DELETENODERESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetNodeLinks', + full_name='core.CoreApi.GetNodeLinks', + index=19, + containing_service=None, + input_type=_GETNODELINKSREQUEST, + output_type=_GETNODELINKSRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='AddLink', + full_name='core.CoreApi.AddLink', + index=20, + containing_service=None, + input_type=_ADDLINKREQUEST, + output_type=_ADDLINKRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='EditLink', + full_name='core.CoreApi.EditLink', + index=21, + containing_service=None, + input_type=_EDITLINKREQUEST, + output_type=_EDITLINKRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='DeleteLink', + full_name='core.CoreApi.DeleteLink', + index=22, + containing_service=None, + input_type=_DELETELINKREQUEST, + output_type=_DELETELINKRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetHooks', + full_name='core.CoreApi.GetHooks', + index=23, + containing_service=None, + input_type=_GETHOOKSREQUEST, + output_type=_GETHOOKSRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='AddHook', + full_name='core.CoreApi.AddHook', + index=24, + containing_service=None, + input_type=_ADDHOOKREQUEST, + output_type=_ADDHOOKRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetMobilityConfigs', + full_name='core.CoreApi.GetMobilityConfigs', + index=25, + containing_service=None, + input_type=_GETMOBILITYCONFIGSREQUEST, + output_type=_GETMOBILITYCONFIGSRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetMobilityConfig', + full_name='core.CoreApi.GetMobilityConfig', + index=26, + containing_service=None, + input_type=_GETMOBILITYCONFIGREQUEST, + output_type=_GETMOBILITYCONFIGRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='SetMobilityConfig', + full_name='core.CoreApi.SetMobilityConfig', + index=27, + containing_service=None, + input_type=_SETMOBILITYCONFIGREQUEST, + output_type=_SETMOBILITYCONFIGRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='MobilityAction', + full_name='core.CoreApi.MobilityAction', + index=28, + containing_service=None, + input_type=_MOBILITYACTIONREQUEST, + output_type=_MOBILITYACTIONRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetServices', + full_name='core.CoreApi.GetServices', + index=29, + containing_service=None, + input_type=_GETSERVICESREQUEST, + output_type=_GETSERVICESRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetServiceDefaults', + full_name='core.CoreApi.GetServiceDefaults', + index=30, + containing_service=None, + input_type=_GETSERVICEDEFAULTSREQUEST, + output_type=_GETSERVICEDEFAULTSRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='SetServiceDefaults', + full_name='core.CoreApi.SetServiceDefaults', + index=31, + containing_service=None, + input_type=_SETSERVICEDEFAULTSREQUEST, + output_type=_SETSERVICEDEFAULTSRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetNodeService', + full_name='core.CoreApi.GetNodeService', + index=32, + containing_service=None, + input_type=_GETNODESERVICEREQUEST, + output_type=_GETNODESERVICERESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetNodeServiceFile', + full_name='core.CoreApi.GetNodeServiceFile', + index=33, + containing_service=None, + input_type=_GETNODESERVICEFILEREQUEST, + output_type=_GETNODESERVICEFILERESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='SetNodeService', + full_name='core.CoreApi.SetNodeService', + index=34, + containing_service=None, + input_type=_SETNODESERVICEREQUEST, + output_type=_SETNODESERVICERESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='SetNodeServiceFile', + full_name='core.CoreApi.SetNodeServiceFile', + index=35, + containing_service=None, + input_type=_SETNODESERVICEFILEREQUEST, + output_type=_SETNODESERVICEFILERESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='ServiceAction', + full_name='core.CoreApi.ServiceAction', + index=36, + containing_service=None, + input_type=_SERVICEACTIONREQUEST, + output_type=_SERVICEACTIONRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetWlanConfig', + full_name='core.CoreApi.GetWlanConfig', + index=37, + containing_service=None, + input_type=_GETWLANCONFIGREQUEST, + output_type=_GETWLANCONFIGRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='SetWlanConfig', + full_name='core.CoreApi.SetWlanConfig', + index=38, + containing_service=None, + input_type=_SETWLANCONFIGREQUEST, + output_type=_SETWLANCONFIGRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetEmaneConfig', + full_name='core.CoreApi.GetEmaneConfig', + index=39, + containing_service=None, + input_type=_GETEMANECONFIGREQUEST, + output_type=_GETEMANECONFIGRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='SetEmaneConfig', + full_name='core.CoreApi.SetEmaneConfig', + index=40, + containing_service=None, + input_type=_SETEMANECONFIGREQUEST, + output_type=_SETEMANECONFIGRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetEmaneModels', + full_name='core.CoreApi.GetEmaneModels', + index=41, + containing_service=None, + input_type=_GETEMANEMODELSREQUEST, + output_type=_GETEMANEMODELSRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetEmaneModelConfig', + full_name='core.CoreApi.GetEmaneModelConfig', + index=42, + containing_service=None, + input_type=_GETEMANEMODELCONFIGREQUEST, + output_type=_GETEMANEMODELCONFIGRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='SetEmaneModelConfig', + full_name='core.CoreApi.SetEmaneModelConfig', + index=43, + containing_service=None, + input_type=_SETEMANEMODELCONFIGREQUEST, + output_type=_SETEMANEMODELCONFIGRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='GetEmaneModelConfigs', + full_name='core.CoreApi.GetEmaneModelConfigs', + index=44, + containing_service=None, + input_type=_GETEMANEMODELCONFIGSREQUEST, + output_type=_GETEMANEMODELCONFIGSRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='SaveXml', + full_name='core.CoreApi.SaveXml', + index=45, + containing_service=None, + input_type=_SAVEXMLREQUEST, + output_type=_SAVEXMLRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='OpenXml', + full_name='core.CoreApi.OpenXml', + index=46, + containing_service=None, + input_type=_OPENXMLREQUEST, + output_type=_OPENXMLRESPONSE, + serialized_options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_COREAPI) + +DESCRIPTOR.services_by_name['CoreApi'] = _COREAPI + +# @@protoc_insertion_point(module_scope) diff --git a/daemon/core/api/grpc/core_pb2_grpc.py b/daemon/core/api/grpc/core_pb2_grpc.py new file mode 100644 index 00000000..5535b32b --- /dev/null +++ b/daemon/core/api/grpc/core_pb2_grpc.py @@ -0,0 +1,828 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +import core_pb2 as core__pb2 + + +class CoreApiStub(object): + # missing associated documentation comment in .proto file + pass + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.CreateSession = channel.unary_unary( + '/core.CoreApi/CreateSession', + request_serializer=core__pb2.CreateSessionRequest.SerializeToString, + response_deserializer=core__pb2.CreateSessionResponse.FromString, + ) + self.DeleteSession = channel.unary_unary( + '/core.CoreApi/DeleteSession', + request_serializer=core__pb2.DeleteSessionRequest.SerializeToString, + response_deserializer=core__pb2.DeleteSessionResponse.FromString, + ) + self.GetSessions = channel.unary_unary( + '/core.CoreApi/GetSessions', + request_serializer=core__pb2.GetSessionsRequest.SerializeToString, + response_deserializer=core__pb2.GetSessionsResponse.FromString, + ) + self.GetSession = channel.unary_unary( + '/core.CoreApi/GetSession', + request_serializer=core__pb2.GetSessionRequest.SerializeToString, + response_deserializer=core__pb2.GetSessionResponse.FromString, + ) + self.GetSessionOptions = channel.unary_unary( + '/core.CoreApi/GetSessionOptions', + request_serializer=core__pb2.GetSessionOptionsRequest.SerializeToString, + response_deserializer=core__pb2.GetSessionOptionsResponse.FromString, + ) + self.SetSessionOptions = channel.unary_unary( + '/core.CoreApi/SetSessionOptions', + request_serializer=core__pb2.SetSessionOptionsRequest.SerializeToString, + response_deserializer=core__pb2.SetSessionOptionsResponse.FromString, + ) + self.GetSessionLocation = channel.unary_unary( + '/core.CoreApi/GetSessionLocation', + request_serializer=core__pb2.GetSessionLocationRequest.SerializeToString, + response_deserializer=core__pb2.GetSessionLocationResponse.FromString, + ) + self.SetSessionLocation = channel.unary_unary( + '/core.CoreApi/SetSessionLocation', + request_serializer=core__pb2.SetSessionLocationRequest.SerializeToString, + response_deserializer=core__pb2.SetSessionLocationResponse.FromString, + ) + self.SetSessionState = channel.unary_unary( + '/core.CoreApi/SetSessionState', + request_serializer=core__pb2.SetSessionStateRequest.SerializeToString, + response_deserializer=core__pb2.SetSessionStateResponse.FromString, + ) + self.NodeEvents = channel.unary_stream( + '/core.CoreApi/NodeEvents', + request_serializer=core__pb2.NodeEventsRequest.SerializeToString, + response_deserializer=core__pb2.NodeEvent.FromString, + ) + self.LinkEvents = channel.unary_stream( + '/core.CoreApi/LinkEvents', + request_serializer=core__pb2.LinkEventsRequest.SerializeToString, + response_deserializer=core__pb2.LinkEvent.FromString, + ) + self.SessionEvents = channel.unary_stream( + '/core.CoreApi/SessionEvents', + request_serializer=core__pb2.SessionEventsRequest.SerializeToString, + response_deserializer=core__pb2.SessionEvent.FromString, + ) + self.ConfigEvents = channel.unary_stream( + '/core.CoreApi/ConfigEvents', + request_serializer=core__pb2.ConfigEventsRequest.SerializeToString, + response_deserializer=core__pb2.ConfigEvent.FromString, + ) + self.ExceptionEvents = channel.unary_stream( + '/core.CoreApi/ExceptionEvents', + request_serializer=core__pb2.ExceptionEventsRequest.SerializeToString, + response_deserializer=core__pb2.ExceptionEvent.FromString, + ) + self.FileEvents = channel.unary_stream( + '/core.CoreApi/FileEvents', + request_serializer=core__pb2.FileEventsRequest.SerializeToString, + response_deserializer=core__pb2.FileEvent.FromString, + ) + self.AddNode = channel.unary_unary( + '/core.CoreApi/AddNode', + request_serializer=core__pb2.AddNodeRequest.SerializeToString, + response_deserializer=core__pb2.AddNodeResponse.FromString, + ) + self.GetNode = channel.unary_unary( + '/core.CoreApi/GetNode', + request_serializer=core__pb2.GetNodeRequest.SerializeToString, + response_deserializer=core__pb2.GetNodeResponse.FromString, + ) + self.EditNode = channel.unary_unary( + '/core.CoreApi/EditNode', + request_serializer=core__pb2.EditNodeRequest.SerializeToString, + response_deserializer=core__pb2.EditNodeResponse.FromString, + ) + self.DeleteNode = channel.unary_unary( + '/core.CoreApi/DeleteNode', + request_serializer=core__pb2.DeleteNodeRequest.SerializeToString, + response_deserializer=core__pb2.DeleteNodeResponse.FromString, + ) + self.GetNodeLinks = channel.unary_unary( + '/core.CoreApi/GetNodeLinks', + request_serializer=core__pb2.GetNodeLinksRequest.SerializeToString, + response_deserializer=core__pb2.GetNodeLinksResponse.FromString, + ) + self.AddLink = channel.unary_unary( + '/core.CoreApi/AddLink', + request_serializer=core__pb2.AddLinkRequest.SerializeToString, + response_deserializer=core__pb2.AddLinkResponse.FromString, + ) + self.EditLink = channel.unary_unary( + '/core.CoreApi/EditLink', + request_serializer=core__pb2.EditLinkRequest.SerializeToString, + response_deserializer=core__pb2.EditLinkResponse.FromString, + ) + self.DeleteLink = channel.unary_unary( + '/core.CoreApi/DeleteLink', + request_serializer=core__pb2.DeleteLinkRequest.SerializeToString, + response_deserializer=core__pb2.DeleteLinkResponse.FromString, + ) + self.GetHooks = channel.unary_unary( + '/core.CoreApi/GetHooks', + request_serializer=core__pb2.GetHooksRequest.SerializeToString, + response_deserializer=core__pb2.GetHooksResponse.FromString, + ) + self.AddHook = channel.unary_unary( + '/core.CoreApi/AddHook', + request_serializer=core__pb2.AddHookRequest.SerializeToString, + response_deserializer=core__pb2.AddHookResponse.FromString, + ) + self.GetMobilityConfigs = channel.unary_unary( + '/core.CoreApi/GetMobilityConfigs', + request_serializer=core__pb2.GetMobilityConfigsRequest.SerializeToString, + response_deserializer=core__pb2.GetMobilityConfigsResponse.FromString, + ) + self.GetMobilityConfig = channel.unary_unary( + '/core.CoreApi/GetMobilityConfig', + request_serializer=core__pb2.GetMobilityConfigRequest.SerializeToString, + response_deserializer=core__pb2.GetMobilityConfigResponse.FromString, + ) + self.SetMobilityConfig = channel.unary_unary( + '/core.CoreApi/SetMobilityConfig', + request_serializer=core__pb2.SetMobilityConfigRequest.SerializeToString, + response_deserializer=core__pb2.SetMobilityConfigResponse.FromString, + ) + self.MobilityAction = channel.unary_unary( + '/core.CoreApi/MobilityAction', + request_serializer=core__pb2.MobilityActionRequest.SerializeToString, + response_deserializer=core__pb2.MobilityActionResponse.FromString, + ) + self.GetServices = channel.unary_unary( + '/core.CoreApi/GetServices', + request_serializer=core__pb2.GetServicesRequest.SerializeToString, + response_deserializer=core__pb2.GetServicesResponse.FromString, + ) + self.GetServiceDefaults = channel.unary_unary( + '/core.CoreApi/GetServiceDefaults', + request_serializer=core__pb2.GetServiceDefaultsRequest.SerializeToString, + response_deserializer=core__pb2.GetServiceDefaultsResponse.FromString, + ) + self.SetServiceDefaults = channel.unary_unary( + '/core.CoreApi/SetServiceDefaults', + request_serializer=core__pb2.SetServiceDefaultsRequest.SerializeToString, + response_deserializer=core__pb2.SetServiceDefaultsResponse.FromString, + ) + self.GetNodeService = channel.unary_unary( + '/core.CoreApi/GetNodeService', + request_serializer=core__pb2.GetNodeServiceRequest.SerializeToString, + response_deserializer=core__pb2.GetNodeServiceResponse.FromString, + ) + self.GetNodeServiceFile = channel.unary_unary( + '/core.CoreApi/GetNodeServiceFile', + request_serializer=core__pb2.GetNodeServiceFileRequest.SerializeToString, + response_deserializer=core__pb2.GetNodeServiceFileResponse.FromString, + ) + self.SetNodeService = channel.unary_unary( + '/core.CoreApi/SetNodeService', + request_serializer=core__pb2.SetNodeServiceRequest.SerializeToString, + response_deserializer=core__pb2.SetNodeServiceResponse.FromString, + ) + self.SetNodeServiceFile = channel.unary_unary( + '/core.CoreApi/SetNodeServiceFile', + request_serializer=core__pb2.SetNodeServiceFileRequest.SerializeToString, + response_deserializer=core__pb2.SetNodeServiceFileResponse.FromString, + ) + self.ServiceAction = channel.unary_unary( + '/core.CoreApi/ServiceAction', + request_serializer=core__pb2.ServiceActionRequest.SerializeToString, + response_deserializer=core__pb2.ServiceActionResponse.FromString, + ) + self.GetWlanConfig = channel.unary_unary( + '/core.CoreApi/GetWlanConfig', + request_serializer=core__pb2.GetWlanConfigRequest.SerializeToString, + response_deserializer=core__pb2.GetWlanConfigResponse.FromString, + ) + self.SetWlanConfig = channel.unary_unary( + '/core.CoreApi/SetWlanConfig', + request_serializer=core__pb2.SetWlanConfigRequest.SerializeToString, + response_deserializer=core__pb2.SetWlanConfigResponse.FromString, + ) + self.GetEmaneConfig = channel.unary_unary( + '/core.CoreApi/GetEmaneConfig', + request_serializer=core__pb2.GetEmaneConfigRequest.SerializeToString, + response_deserializer=core__pb2.GetEmaneConfigResponse.FromString, + ) + self.SetEmaneConfig = channel.unary_unary( + '/core.CoreApi/SetEmaneConfig', + request_serializer=core__pb2.SetEmaneConfigRequest.SerializeToString, + response_deserializer=core__pb2.SetEmaneConfigResponse.FromString, + ) + self.GetEmaneModels = channel.unary_unary( + '/core.CoreApi/GetEmaneModels', + request_serializer=core__pb2.GetEmaneModelsRequest.SerializeToString, + response_deserializer=core__pb2.GetEmaneModelsResponse.FromString, + ) + self.GetEmaneModelConfig = channel.unary_unary( + '/core.CoreApi/GetEmaneModelConfig', + request_serializer=core__pb2.GetEmaneModelConfigRequest.SerializeToString, + response_deserializer=core__pb2.GetEmaneModelConfigResponse.FromString, + ) + self.SetEmaneModelConfig = channel.unary_unary( + '/core.CoreApi/SetEmaneModelConfig', + request_serializer=core__pb2.SetEmaneModelConfigRequest.SerializeToString, + response_deserializer=core__pb2.SetEmaneModelConfigResponse.FromString, + ) + self.GetEmaneModelConfigs = channel.unary_unary( + '/core.CoreApi/GetEmaneModelConfigs', + request_serializer=core__pb2.GetEmaneModelConfigsRequest.SerializeToString, + response_deserializer=core__pb2.GetEmaneModelConfigsResponse.FromString, + ) + self.SaveXml = channel.unary_unary( + '/core.CoreApi/SaveXml', + request_serializer=core__pb2.SaveXmlRequest.SerializeToString, + response_deserializer=core__pb2.SaveXmlResponse.FromString, + ) + self.OpenXml = channel.unary_unary( + '/core.CoreApi/OpenXml', + request_serializer=core__pb2.OpenXmlRequest.SerializeToString, + response_deserializer=core__pb2.OpenXmlResponse.FromString, + ) + + +class CoreApiServicer(object): + # missing associated documentation comment in .proto file + pass + + def CreateSession(self, request, context): + """session rpc + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteSession(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetSessions(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetSession(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetSessionOptions(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetSessionOptions(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetSessionLocation(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetSessionLocation(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetSessionState(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def NodeEvents(self, request, context): + """event streams + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def LinkEvents(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SessionEvents(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ConfigEvents(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ExceptionEvents(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def FileEvents(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddNode(self, request, context): + """node rpc + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetNode(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def EditNode(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteNode(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetNodeLinks(self, request, context): + """link rpc + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddLink(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def EditLink(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteLink(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetHooks(self, request, context): + """hook rpc + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddHook(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetMobilityConfigs(self, request, context): + """mobility rpc + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetMobilityConfig(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetMobilityConfig(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def MobilityAction(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetServices(self, request, context): + """service rpc + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetServiceDefaults(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetServiceDefaults(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetNodeService(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetNodeServiceFile(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetNodeService(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetNodeServiceFile(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ServiceAction(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetWlanConfig(self, request, context): + """wlan rpc + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetWlanConfig(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetEmaneConfig(self, request, context): + """emane rpc + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetEmaneConfig(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetEmaneModels(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetEmaneModelConfig(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetEmaneModelConfig(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetEmaneModelConfigs(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SaveXml(self, request, context): + """xml rpc + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def OpenXml(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_CoreApiServicer_to_server(servicer, server): + rpc_method_handlers = { + 'CreateSession': grpc.unary_unary_rpc_method_handler( + servicer.CreateSession, + request_deserializer=core__pb2.CreateSessionRequest.FromString, + response_serializer=core__pb2.CreateSessionResponse.SerializeToString, + ), + 'DeleteSession': grpc.unary_unary_rpc_method_handler( + servicer.DeleteSession, + request_deserializer=core__pb2.DeleteSessionRequest.FromString, + response_serializer=core__pb2.DeleteSessionResponse.SerializeToString, + ), + 'GetSessions': grpc.unary_unary_rpc_method_handler( + servicer.GetSessions, + request_deserializer=core__pb2.GetSessionsRequest.FromString, + response_serializer=core__pb2.GetSessionsResponse.SerializeToString, + ), + 'GetSession': grpc.unary_unary_rpc_method_handler( + servicer.GetSession, + request_deserializer=core__pb2.GetSessionRequest.FromString, + response_serializer=core__pb2.GetSessionResponse.SerializeToString, + ), + 'GetSessionOptions': grpc.unary_unary_rpc_method_handler( + servicer.GetSessionOptions, + request_deserializer=core__pb2.GetSessionOptionsRequest.FromString, + response_serializer=core__pb2.GetSessionOptionsResponse.SerializeToString, + ), + 'SetSessionOptions': grpc.unary_unary_rpc_method_handler( + servicer.SetSessionOptions, + request_deserializer=core__pb2.SetSessionOptionsRequest.FromString, + response_serializer=core__pb2.SetSessionOptionsResponse.SerializeToString, + ), + 'GetSessionLocation': grpc.unary_unary_rpc_method_handler( + servicer.GetSessionLocation, + request_deserializer=core__pb2.GetSessionLocationRequest.FromString, + response_serializer=core__pb2.GetSessionLocationResponse.SerializeToString, + ), + 'SetSessionLocation': grpc.unary_unary_rpc_method_handler( + servicer.SetSessionLocation, + request_deserializer=core__pb2.SetSessionLocationRequest.FromString, + response_serializer=core__pb2.SetSessionLocationResponse.SerializeToString, + ), + 'SetSessionState': grpc.unary_unary_rpc_method_handler( + servicer.SetSessionState, + request_deserializer=core__pb2.SetSessionStateRequest.FromString, + response_serializer=core__pb2.SetSessionStateResponse.SerializeToString, + ), + 'NodeEvents': grpc.unary_stream_rpc_method_handler( + servicer.NodeEvents, + request_deserializer=core__pb2.NodeEventsRequest.FromString, + response_serializer=core__pb2.NodeEvent.SerializeToString, + ), + 'LinkEvents': grpc.unary_stream_rpc_method_handler( + servicer.LinkEvents, + request_deserializer=core__pb2.LinkEventsRequest.FromString, + response_serializer=core__pb2.LinkEvent.SerializeToString, + ), + 'SessionEvents': grpc.unary_stream_rpc_method_handler( + servicer.SessionEvents, + request_deserializer=core__pb2.SessionEventsRequest.FromString, + response_serializer=core__pb2.SessionEvent.SerializeToString, + ), + 'ConfigEvents': grpc.unary_stream_rpc_method_handler( + servicer.ConfigEvents, + request_deserializer=core__pb2.ConfigEventsRequest.FromString, + response_serializer=core__pb2.ConfigEvent.SerializeToString, + ), + 'ExceptionEvents': grpc.unary_stream_rpc_method_handler( + servicer.ExceptionEvents, + request_deserializer=core__pb2.ExceptionEventsRequest.FromString, + response_serializer=core__pb2.ExceptionEvent.SerializeToString, + ), + 'FileEvents': grpc.unary_stream_rpc_method_handler( + servicer.FileEvents, + request_deserializer=core__pb2.FileEventsRequest.FromString, + response_serializer=core__pb2.FileEvent.SerializeToString, + ), + 'AddNode': grpc.unary_unary_rpc_method_handler( + servicer.AddNode, + request_deserializer=core__pb2.AddNodeRequest.FromString, + response_serializer=core__pb2.AddNodeResponse.SerializeToString, + ), + 'GetNode': grpc.unary_unary_rpc_method_handler( + servicer.GetNode, + request_deserializer=core__pb2.GetNodeRequest.FromString, + response_serializer=core__pb2.GetNodeResponse.SerializeToString, + ), + 'EditNode': grpc.unary_unary_rpc_method_handler( + servicer.EditNode, + request_deserializer=core__pb2.EditNodeRequest.FromString, + response_serializer=core__pb2.EditNodeResponse.SerializeToString, + ), + 'DeleteNode': grpc.unary_unary_rpc_method_handler( + servicer.DeleteNode, + request_deserializer=core__pb2.DeleteNodeRequest.FromString, + response_serializer=core__pb2.DeleteNodeResponse.SerializeToString, + ), + 'GetNodeLinks': grpc.unary_unary_rpc_method_handler( + servicer.GetNodeLinks, + request_deserializer=core__pb2.GetNodeLinksRequest.FromString, + response_serializer=core__pb2.GetNodeLinksResponse.SerializeToString, + ), + 'AddLink': grpc.unary_unary_rpc_method_handler( + servicer.AddLink, + request_deserializer=core__pb2.AddLinkRequest.FromString, + response_serializer=core__pb2.AddLinkResponse.SerializeToString, + ), + 'EditLink': grpc.unary_unary_rpc_method_handler( + servicer.EditLink, + request_deserializer=core__pb2.EditLinkRequest.FromString, + response_serializer=core__pb2.EditLinkResponse.SerializeToString, + ), + 'DeleteLink': grpc.unary_unary_rpc_method_handler( + servicer.DeleteLink, + request_deserializer=core__pb2.DeleteLinkRequest.FromString, + response_serializer=core__pb2.DeleteLinkResponse.SerializeToString, + ), + 'GetHooks': grpc.unary_unary_rpc_method_handler( + servicer.GetHooks, + request_deserializer=core__pb2.GetHooksRequest.FromString, + response_serializer=core__pb2.GetHooksResponse.SerializeToString, + ), + 'AddHook': grpc.unary_unary_rpc_method_handler( + servicer.AddHook, + request_deserializer=core__pb2.AddHookRequest.FromString, + response_serializer=core__pb2.AddHookResponse.SerializeToString, + ), + 'GetMobilityConfigs': grpc.unary_unary_rpc_method_handler( + servicer.GetMobilityConfigs, + request_deserializer=core__pb2.GetMobilityConfigsRequest.FromString, + response_serializer=core__pb2.GetMobilityConfigsResponse.SerializeToString, + ), + 'GetMobilityConfig': grpc.unary_unary_rpc_method_handler( + servicer.GetMobilityConfig, + request_deserializer=core__pb2.GetMobilityConfigRequest.FromString, + response_serializer=core__pb2.GetMobilityConfigResponse.SerializeToString, + ), + 'SetMobilityConfig': grpc.unary_unary_rpc_method_handler( + servicer.SetMobilityConfig, + request_deserializer=core__pb2.SetMobilityConfigRequest.FromString, + response_serializer=core__pb2.SetMobilityConfigResponse.SerializeToString, + ), + 'MobilityAction': grpc.unary_unary_rpc_method_handler( + servicer.MobilityAction, + request_deserializer=core__pb2.MobilityActionRequest.FromString, + response_serializer=core__pb2.MobilityActionResponse.SerializeToString, + ), + 'GetServices': grpc.unary_unary_rpc_method_handler( + servicer.GetServices, + request_deserializer=core__pb2.GetServicesRequest.FromString, + response_serializer=core__pb2.GetServicesResponse.SerializeToString, + ), + 'GetServiceDefaults': grpc.unary_unary_rpc_method_handler( + servicer.GetServiceDefaults, + request_deserializer=core__pb2.GetServiceDefaultsRequest.FromString, + response_serializer=core__pb2.GetServiceDefaultsResponse.SerializeToString, + ), + 'SetServiceDefaults': grpc.unary_unary_rpc_method_handler( + servicer.SetServiceDefaults, + request_deserializer=core__pb2.SetServiceDefaultsRequest.FromString, + response_serializer=core__pb2.SetServiceDefaultsResponse.SerializeToString, + ), + 'GetNodeService': grpc.unary_unary_rpc_method_handler( + servicer.GetNodeService, + request_deserializer=core__pb2.GetNodeServiceRequest.FromString, + response_serializer=core__pb2.GetNodeServiceResponse.SerializeToString, + ), + 'GetNodeServiceFile': grpc.unary_unary_rpc_method_handler( + servicer.GetNodeServiceFile, + request_deserializer=core__pb2.GetNodeServiceFileRequest.FromString, + response_serializer=core__pb2.GetNodeServiceFileResponse.SerializeToString, + ), + 'SetNodeService': grpc.unary_unary_rpc_method_handler( + servicer.SetNodeService, + request_deserializer=core__pb2.SetNodeServiceRequest.FromString, + response_serializer=core__pb2.SetNodeServiceResponse.SerializeToString, + ), + 'SetNodeServiceFile': grpc.unary_unary_rpc_method_handler( + servicer.SetNodeServiceFile, + request_deserializer=core__pb2.SetNodeServiceFileRequest.FromString, + response_serializer=core__pb2.SetNodeServiceFileResponse.SerializeToString, + ), + 'ServiceAction': grpc.unary_unary_rpc_method_handler( + servicer.ServiceAction, + request_deserializer=core__pb2.ServiceActionRequest.FromString, + response_serializer=core__pb2.ServiceActionResponse.SerializeToString, + ), + 'GetWlanConfig': grpc.unary_unary_rpc_method_handler( + servicer.GetWlanConfig, + request_deserializer=core__pb2.GetWlanConfigRequest.FromString, + response_serializer=core__pb2.GetWlanConfigResponse.SerializeToString, + ), + 'SetWlanConfig': grpc.unary_unary_rpc_method_handler( + servicer.SetWlanConfig, + request_deserializer=core__pb2.SetWlanConfigRequest.FromString, + response_serializer=core__pb2.SetWlanConfigResponse.SerializeToString, + ), + 'GetEmaneConfig': grpc.unary_unary_rpc_method_handler( + servicer.GetEmaneConfig, + request_deserializer=core__pb2.GetEmaneConfigRequest.FromString, + response_serializer=core__pb2.GetEmaneConfigResponse.SerializeToString, + ), + 'SetEmaneConfig': grpc.unary_unary_rpc_method_handler( + servicer.SetEmaneConfig, + request_deserializer=core__pb2.SetEmaneConfigRequest.FromString, + response_serializer=core__pb2.SetEmaneConfigResponse.SerializeToString, + ), + 'GetEmaneModels': grpc.unary_unary_rpc_method_handler( + servicer.GetEmaneModels, + request_deserializer=core__pb2.GetEmaneModelsRequest.FromString, + response_serializer=core__pb2.GetEmaneModelsResponse.SerializeToString, + ), + 'GetEmaneModelConfig': grpc.unary_unary_rpc_method_handler( + servicer.GetEmaneModelConfig, + request_deserializer=core__pb2.GetEmaneModelConfigRequest.FromString, + response_serializer=core__pb2.GetEmaneModelConfigResponse.SerializeToString, + ), + 'SetEmaneModelConfig': grpc.unary_unary_rpc_method_handler( + servicer.SetEmaneModelConfig, + request_deserializer=core__pb2.SetEmaneModelConfigRequest.FromString, + response_serializer=core__pb2.SetEmaneModelConfigResponse.SerializeToString, + ), + 'GetEmaneModelConfigs': grpc.unary_unary_rpc_method_handler( + servicer.GetEmaneModelConfigs, + request_deserializer=core__pb2.GetEmaneModelConfigsRequest.FromString, + response_serializer=core__pb2.GetEmaneModelConfigsResponse.SerializeToString, + ), + 'SaveXml': grpc.unary_unary_rpc_method_handler( + servicer.SaveXml, + request_deserializer=core__pb2.SaveXmlRequest.FromString, + response_serializer=core__pb2.SaveXmlResponse.SerializeToString, + ), + 'OpenXml': grpc.unary_unary_rpc_method_handler( + servicer.OpenXml, + request_deserializer=core__pb2.OpenXmlRequest.FromString, + response_serializer=core__pb2.OpenXmlResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'core.CoreApi', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/daemon/core/grpc/server.py b/daemon/core/api/grpc/server.py similarity index 98% rename from daemon/core/grpc/server.py rename to daemon/core/api/grpc/server.py index bc18594a..7cec9010 100644 --- a/daemon/core/grpc/server.py +++ b/daemon/core/api/grpc/server.py @@ -9,13 +9,13 @@ import grpc from concurrent import futures from core.emulator.emudata import NodeOptions, InterfaceData, LinkOptions -from core.enumerations import NodeTypes, EventTypes, LinkTypes -from core.grpc import core_pb2 -from core.grpc import core_pb2_grpc -from core.misc import nodeutils -from core.misc.ipaddress import MacAddress -from core.mobility import BasicRangeModel, Ns2ScriptedMobility -from core.service import ServiceManager +from core.emulator.enumerations import NodeTypes, EventTypes, LinkTypes +from core.api.grpc import core_pb2 +from core.api.grpc import core_pb2_grpc +from core.nodes import nodeutils +from core.nodes.ipaddress import MacAddress +from core.location.mobility import BasicRangeModel, Ns2ScriptedMobility +from core.services.coreservices import ServiceManager _ONE_DAY_IN_SECONDS = 60 * 60 * 24 @@ -68,7 +68,7 @@ def get_emane_model_id(_id, interface): def convert_link(session, link_data): interface_one = None if link_data.interface1_id is not None: - node = session.get_object(link_data.node1_id) + node = session.get_node(link_data.node1_id) interface = node.netif(link_data.interface1_id) interface_one = core_pb2.Interface( id=link_data.interface1_id, name=interface.name, mac=convert_value(link_data.interface1_mac), @@ -77,7 +77,7 @@ def convert_link(session, link_data): interface_two = None if link_data.interface2_id is not None: - node = session.get_object(link_data.node2_id) + node = session.get_node(link_data.node2_id) interface = node.netif(link_data.interface2_id) interface_two = core_pb2.Interface( id=link_data.interface2_id, name=interface.name, mac=convert_value(link_data.interface2_mac), @@ -143,7 +143,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer): def get_node(self, session, _id, context): try: - return session.get_object(_id) + return session.get_node(_id) except KeyError: context.abort(grpc.StatusCode.NOT_FOUND, "node {} not found".format(_id)) @@ -233,8 +233,8 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer): links = [] nodes = [] - for node_id in session.objects: - node = session.objects[node_id] + for _id in session.nodes: + node = session.nodes[_id] if not isinstance(node.id, int): continue diff --git a/daemon/core/misc/__init__.py b/daemon/core/api/tlv/__init__.py similarity index 100% rename from daemon/core/misc/__init__.py rename to daemon/core/api/tlv/__init__.py diff --git a/daemon/core/broker.py b/daemon/core/api/tlv/broker.py similarity index 96% rename from daemon/core/broker.py rename to daemon/core/api/tlv/broker.py index c20a4a41..fdb28101 100644 --- a/daemon/core/broker.py +++ b/daemon/core/api/tlv/broker.py @@ -10,27 +10,26 @@ import select import socket import threading -from core.api import coreapi -from core.coreobj import PyCoreNet -from core.coreobj import PyCoreNode -from core.enumerations import ConfigDataTypes -from core.enumerations import ConfigFlags -from core.enumerations import ConfigTlvs -from core.enumerations import EventTlvs -from core.enumerations import EventTypes -from core.enumerations import ExecuteTlvs -from core.enumerations import FileTlvs -from core.enumerations import LinkTlvs -from core.enumerations import MessageFlags -from core.enumerations import MessageTypes -from core.enumerations import NodeTlvs -from core.enumerations import NodeTypes -from core.enumerations import RegisterTlvs -from core.misc import nodeutils -from core.misc.ipaddress import IpAddress -from core.netns.vif import GreTap -from core.netns.vnet import GreTapBridge -from core.phys.pnodes import PhysicalNode +from core.api.tlv import coreapi +from core.nodes.base import CoreNodeBase, CoreNetworkBase +from core.emulator.enumerations import ConfigDataTypes +from core.emulator.enumerations import ConfigFlags +from core.emulator.enumerations import ConfigTlvs +from core.emulator.enumerations import EventTlvs +from core.emulator.enumerations import EventTypes +from core.emulator.enumerations import ExecuteTlvs +from core.emulator.enumerations import FileTlvs +from core.emulator.enumerations import LinkTlvs +from core.emulator.enumerations import MessageFlags +from core.emulator.enumerations import MessageTypes +from core.emulator.enumerations import NodeTlvs +from core.emulator.enumerations import NodeTypes +from core.emulator.enumerations import RegisterTlvs +from core.nodes import nodeutils +from core.nodes.ipaddress import IpAddress +from core.nodes.interface import GreTap +from core.nodes.network import GreTapBridge +from core.nodes.physical import PhysicalNode class CoreDistributedServer(object): @@ -420,7 +419,7 @@ class CoreBroker(object): gt = GreTap(node=None, name=None, session=self.session, remoteip=remoteip, key=key) else: - gt = self.session.add_object(cls=GreTapBridge, _id=_id, policy="ACCEPT", remoteip=remoteip, key=key) + gt = self.session.create_node(cls=GreTapBridge, _id=_id, policy="ACCEPT", remoteip=remoteip, key=key) gt.localnum = localnum gt.remotenum = remotenum self.tunnels[key] = gt @@ -443,7 +442,7 @@ class CoreBroker(object): :rtype: list """ try: - net = self.session.get_object(node_id) + net = self.session.get_node(node_id) logging.info("adding net tunnel for: id(%s) %s", node_id, net) except KeyError: raise KeyError("network node %s not found" % node_id) @@ -517,7 +516,7 @@ class CoreBroker(object): except KeyError: gt = None if gt: - self.session.delete_object(gt.id) + self.session.delete_node(gt.id) del gt def gettunnel(self, n1num, n2num): @@ -757,7 +756,7 @@ class CoreBroker(object): if nodecls is None: logging.warn("broker unimplemented node type %s", nodetype) return handle_locally, servers - if issubclass(nodecls, PyCoreNet) and nodetype != NodeTypes.WIRELESS_LAN.value: + if issubclass(nodecls, CoreNetworkBase) and nodetype != NodeTypes.WIRELESS_LAN.value: # network node replicated on all servers; could be optimized # don"t replicate WLANs, because ebtables rules won"t work servers = self.getservers() @@ -768,7 +767,7 @@ class CoreBroker(object): # do not record server name for networks since network # nodes are replicated across all server return handle_locally, servers - elif issubclass(nodecls, PyCoreNode): + elif issubclass(nodecls, CoreNodeBase): name = message.get_tlv(NodeTlvs.NAME.value) if name: serverfiletxt = "%s %s %s" % (n, name, nodecls) diff --git a/daemon/core/api/coreapi.py b/daemon/core/api/tlv/coreapi.py similarity index 97% rename from daemon/core/api/coreapi.py rename to daemon/core/api/tlv/coreapi.py index cbdf8d97..afc35a11 100644 --- a/daemon/core/api/coreapi.py +++ b/daemon/core/api/tlv/coreapi.py @@ -10,22 +10,22 @@ import struct from enum import Enum -from core.enumerations import ConfigTlvs -from core.enumerations import EventTlvs -from core.enumerations import EventTypes -from core.enumerations import ExceptionTlvs -from core.enumerations import ExecuteTlvs -from core.enumerations import FileTlvs -from core.enumerations import InterfaceTlvs -from core.enumerations import LinkTlvs -from core.enumerations import MessageFlags -from core.enumerations import MessageTypes -from core.enumerations import NodeTlvs -from core.enumerations import RegisterTlvs -from core.enumerations import SessionTlvs -from core.misc import structutils -from core.misc.ipaddress import IpAddress -from core.misc.ipaddress import MacAddress +from core.emulator.enumerations import ConfigTlvs +from core.emulator.enumerations import EventTlvs +from core.emulator.enumerations import EventTypes +from core.emulator.enumerations import ExceptionTlvs +from core.emulator.enumerations import ExecuteTlvs +from core.emulator.enumerations import FileTlvs +from core.emulator.enumerations import InterfaceTlvs +from core.emulator.enumerations import LinkTlvs +from core.emulator.enumerations import MessageFlags +from core.emulator.enumerations import MessageTypes +from core.emulator.enumerations import NodeTlvs +from core.emulator.enumerations import RegisterTlvs +from core.emulator.enumerations import SessionTlvs +from core.api.tlv import structutils +from core.nodes.ipaddress import IpAddress +from core.nodes.ipaddress import MacAddress class CoreTlvData(object): diff --git a/daemon/core/corehandlers.py b/daemon/core/api/tlv/corehandlers.py similarity index 97% rename from daemon/core/corehandlers.py rename to daemon/core/api/tlv/corehandlers.py index 5eaaa4cd..90436806 100644 --- a/daemon/core/corehandlers.py +++ b/daemon/core/api/tlv/corehandlers.py @@ -13,36 +13,34 @@ import threading import time from itertools import repeat -from core.api import coreapi -from core.api import dataconversion -from core.conf import ConfigShim -from core.data import ConfigData, ExceptionData -from core.data import EventData -from core.data import FileData +from core.api.tlv import coreapi, dataconversion, structutils +from core.config import ConfigShim +from core.emulator.data import ConfigData, ExceptionData +from core.emulator.data import EventData +from core.emulator.data import FileData from core.emulator.emudata import InterfaceData from core.emulator.emudata import LinkOptions from core.emulator.emudata import NodeOptions -from core.enumerations import ConfigDataTypes -from core.enumerations import ConfigFlags -from core.enumerations import ConfigTlvs -from core.enumerations import EventTlvs -from core.enumerations import EventTypes -from core.enumerations import ExceptionTlvs -from core.enumerations import ExecuteTlvs -from core.enumerations import FileTlvs -from core.enumerations import LinkTlvs -from core.enumerations import LinkTypes -from core.enumerations import MessageFlags -from core.enumerations import MessageTypes -from core.enumerations import NodeTlvs -from core.enumerations import NodeTypes -from core.enumerations import RegisterTlvs -from core.enumerations import SessionTlvs -from core.misc import nodeutils -from core.misc import structutils -from core.misc import utils -from core.service import ServiceManager -from core.service import ServiceShim +from core.emulator.enumerations import ConfigDataTypes +from core.emulator.enumerations import ConfigFlags +from core.emulator.enumerations import ConfigTlvs +from core.emulator.enumerations import EventTlvs +from core.emulator.enumerations import EventTypes +from core.emulator.enumerations import ExceptionTlvs +from core.emulator.enumerations import ExecuteTlvs +from core.emulator.enumerations import FileTlvs +from core.emulator.enumerations import LinkTlvs +from core.emulator.enumerations import LinkTypes +from core.emulator.enumerations import MessageFlags +from core.emulator.enumerations import MessageTypes +from core.emulator.enumerations import NodeTlvs +from core.emulator.enumerations import NodeTypes +from core.emulator.enumerations import RegisterTlvs +from core.emulator.enumerations import SessionTlvs +from core.nodes import nodeutils +from core import utils +from core.services.coreservices import ServiceManager +from core.services.coreservices import ServiceShim class CoreHandler(SocketServer.BaseRequestHandler): @@ -774,7 +772,7 @@ class CoreHandler(SocketServer.BaseRequestHandler): return () try: - node = self.session.get_object(node_num) + node = self.session.get_node(node_num) # build common TLV items for reply tlv_data = "" @@ -1135,7 +1133,7 @@ class CoreHandler(SocketServer.BaseRequestHandler): if not node_id: return replies - node = self.session.get_object(node_id) + node = self.session.get_node(node_id) if node is None: logging.warn("request to configure service for unknown node %s", node_id) return replies @@ -1418,7 +1416,7 @@ class CoreHandler(SocketServer.BaseRequestHandler): if event_type.value <= EventTypes.SHUTDOWN_STATE.value: if node_id is not None: try: - node = self.session.get_object(node_id) + node = self.session.get_node(node_id) except KeyError: raise KeyError("Event message for unknown node %d" % node_id) @@ -1442,7 +1440,7 @@ class CoreHandler(SocketServer.BaseRequestHandler): self.session.instantiate() # after booting nodes attempt to send emulation id for nodes waiting on status - for _id in self.session.objects: + for _id in self.session.nodes: self.send_node_emulation_id(_id) elif event_type == EventTypes.RUNTIME_STATE: if self.session.master: @@ -1508,7 +1506,7 @@ class CoreHandler(SocketServer.BaseRequestHandler): name = event_data.name try: - node = self.session.get_object(node_id) + node = self.session.get_node(node_id) except KeyError: logging.warn("ignoring event for service '%s', unknown node '%s'", name, node_id) return @@ -1679,13 +1677,13 @@ class CoreHandler(SocketServer.BaseRequestHandler): nodes_data = [] links_data = [] - with self.session._objects_lock: - for obj in self.session.objects.itervalues(): - node_data = obj.data(message_type=MessageFlags.ADD.value) + with self.session._nodes_lock: + for node in self.session.nodes.itervalues(): + node_data = node.data(message_type=MessageFlags.ADD.value) if node_data: nodes_data.append(node_data) - node_links = obj.all_link_data(flags=MessageFlags.ADD.value) + node_links = node.all_link_data(flags=MessageFlags.ADD.value) for link_data in node_links: links_data.append(link_data) @@ -1717,7 +1715,7 @@ class CoreHandler(SocketServer.BaseRequestHandler): for node_id, service in service_configs: opaque = "service:%s" % service.name data_types = tuple(repeat(ConfigDataTypes.STRING.value, len(ServiceShim.keys))) - node = self.session.get_object(node_id) + node = self.session.get_node(node_id) values = ServiceShim.tovaluelist(node, service) config_data = ConfigData( message_type=0, diff --git a/daemon/core/coreserver.py b/daemon/core/api/tlv/coreserver.py similarity index 100% rename from daemon/core/coreserver.py rename to daemon/core/api/tlv/coreserver.py diff --git a/daemon/core/api/dataconversion.py b/daemon/core/api/tlv/dataconversion.py similarity index 94% rename from daemon/core/api/dataconversion.py rename to daemon/core/api/tlv/dataconversion.py index 5bc33fa9..781afbc2 100644 --- a/daemon/core/api/dataconversion.py +++ b/daemon/core/api/tlv/dataconversion.py @@ -2,10 +2,9 @@ Converts CORE data objects into legacy API messages. """ -from core.api import coreapi -from core.enumerations import ConfigTlvs -from core.enumerations import NodeTlvs -from core.misc import structutils +from core.api.tlv import coreapi, structutils +from core.emulator.enumerations import ConfigTlvs +from core.emulator.enumerations import NodeTlvs def convert_node(node_data): diff --git a/daemon/core/misc/structutils.py b/daemon/core/api/tlv/structutils.py similarity index 100% rename from daemon/core/misc/structutils.py rename to daemon/core/api/tlv/structutils.py diff --git a/daemon/core/conf.py b/daemon/core/config.py similarity index 99% rename from daemon/core/conf.py rename to daemon/core/config.py index b4e9c65f..d62ba33b 100644 --- a/daemon/core/conf.py +++ b/daemon/core/config.py @@ -5,7 +5,7 @@ Common support for configurable CORE objects. import logging from collections import OrderedDict -from core.data import ConfigData +from core.emulator.data import ConfigData class ConfigShim(object): diff --git a/daemon/core/coreobj.py b/daemon/core/coreobj.py deleted file mode 100644 index a4ab9467..00000000 --- a/daemon/core/coreobj.py +++ /dev/null @@ -1,758 +0,0 @@ -""" -Defines the basic objects for CORE emulation: the PyCoreObj base class, along with PyCoreNode, -PyCoreNet, and PyCoreNetIf. -""" - -import os -import shutil -import socket -import threading -from socket import AF_INET -from socket import AF_INET6 - -from core.data import NodeData, LinkData -from core.enumerations import LinkTypes -from core.misc import ipaddress - - -class Position(object): - """ - Helper class for Cartesian coordinate position - """ - - def __init__(self, x=None, y=None, z=None): - """ - Creates a Position instance. - - :param x: x position - :param y: y position - :param z: z position - :return: - """ - self.x = x - self.y = y - self.z = z - - def set(self, x=None, y=None, z=None): - """ - Returns True if the position has actually changed. - - :param float x: x position - :param float y: y position - :param float z: z position - :return: True if position changed, False otherwise - :rtype: bool - """ - if self.x == x and self.y == y and self.z == z: - return False - self.x = x - self.y = y - self.z = z - return True - - def get(self): - """ - Retrieve x,y,z position. - - :return: x,y,z position tuple - :rtype: tuple - """ - return self.x, self.y, self.z - - -class PyCoreObj(object): - """ - Base class for CORE objects (nodes and networks) - """ - apitype = None - - # TODO: appears start has no usage, verify and remove - def __init__(self, session, _id=None, name=None, start=True): - """ - Creates a PyCoreObj instance. - - :param core.session.Session session: CORE session object - :param int _id: id - :param str name: object name - :param bool start: start value - :return: - """ - - self.session = session - if _id is None: - _id = session.get_node_id() - self.id = _id - if name is None: - name = "o%s" % self.id - self.name = name - self.type = None - self.server = None - self.services = None - # ifindex is key, PyCoreNetIf instance is value - self._netif = {} - self.ifindex = 0 - self.canvas = None - self.icon = None - self.opaque = None - self.position = Position() - - def startup(self): - """ - Each object implements its own startup method. - - :return: nothing - """ - raise NotImplementedError - - def shutdown(self): - """ - Each object implements its own shutdown method. - - :return: nothing - """ - raise NotImplementedError - - def setposition(self, x=None, y=None, z=None): - """ - Set the (x,y,z) position of the object. - - :param float x: x position - :param float y: y position - :param float z: z position - :return: True if position changed, False otherwise - :rtype: bool - """ - return self.position.set(x=x, y=y, z=z) - - def getposition(self): - """ - Return an (x,y,z) tuple representing this object's position. - - :return: x,y,z position tuple - :rtype: tuple - """ - return self.position.get() - - def ifname(self, ifindex): - """ - Retrieve interface name for index. - - :param int ifindex: interface index - :return: interface name - :rtype: str - """ - return self._netif[ifindex].name - - def netifs(self, sort=False): - """ - Retrieve network interfaces, sorted if desired. - - :param bool sort: boolean used to determine if interfaces should be sorted - :return: network interfaces - :rtype: list - """ - if sort: - return map(lambda k: self._netif[k], sorted(self._netif.keys())) - else: - return self._netif.itervalues() - - def numnetif(self): - """ - Return the attached interface count. - - :return: number of network interfaces - :rtype: int - """ - return len(self._netif) - - def getifindex(self, netif): - """ - Retrieve index for an interface. - - :param PyCoreNetIf netif: interface to get index for - :return: interface index if found, -1 otherwise - :rtype: int - """ - - for ifindex in self._netif: - if self._netif[ifindex] is netif: - return ifindex - - return -1 - - def newifindex(self): - """ - Create a new interface index. - - :return: interface index - :rtype: int - """ - while self.ifindex in self._netif: - self.ifindex += 1 - ifindex = self.ifindex - self.ifindex += 1 - return ifindex - - def data(self, message_type, lat=None, lon=None, alt=None): - """ - Build a data object for this node. - - :param message_type: purpose for the data object we are creating - :param str lat: latitude - :param str lon: longitude - :param str alt: altitude - :return: node data object - :rtype: core.data.NodeData - """ - if self.apitype is None: - return None - - x, y, _ = self.getposition() - model = self.type - emulation_server = self.server - - services = self.services - if services is not None: - services = "|".join([service.name for service in services]) - - node_data = NodeData( - message_type=message_type, - id=self.id, - node_type=self.apitype, - name=self.name, - emulation_id=self.id, - canvas=self.canvas, - icon=self.icon, - opaque=self.opaque, - x_position=x, - y_position=y, - latitude=lat, - longitude=lon, - altitude=alt, - model=model, - emulation_server=emulation_server, - services=services - ) - - return node_data - - def all_link_data(self, flags): - """ - Build CORE Link data for this object. There is no default - method for PyCoreObjs as PyCoreNodes do not implement this but - PyCoreNets do. - - :param flags: message flags - :return: list of link data - :rtype: core.data.LinkData - """ - return [] - - -class PyCoreNode(PyCoreObj): - """ - Base class for CORE nodes. - """ - - def __init__(self, session, _id=None, name=None, start=True): - """ - Create a PyCoreNode instance. - - :param core.session.Session session: CORE session object - :param int _id: object id - :param str name: object name - :param bool start: boolean for starting - """ - super(PyCoreNode, self).__init__(session, _id, name, start=start) - self.services = [] - self.nodedir = None - self.tmpnodedir = False - - def addservice(self, service): - """ - Add a services to the service list. - - :param core.service.CoreService service: service to add - :return: nothing - """ - if service is not None: - self.services.append(service) - - def makenodedir(self): - """ - Create the node directory. - - :return: nothing - """ - if self.nodedir is None: - self.nodedir = os.path.join(self.session.session_dir, self.name + ".conf") - os.makedirs(self.nodedir) - self.tmpnodedir = True - else: - self.tmpnodedir = False - - def rmnodedir(self): - """ - Remove the node directory, unless preserve directory has been set. - - :return: nothing - """ - preserve = self.session.options.get_config("preservedir") == "1" - if preserve: - return - - if self.tmpnodedir: - shutil.rmtree(self.nodedir, ignore_errors=True) - - def addnetif(self, netif, ifindex): - """ - Add network interface to node and set the network interface index if successful. - - :param PyCoreNetIf netif: network interface to add - :param int ifindex: interface index - :return: nothing - """ - if ifindex in self._netif: - raise ValueError("ifindex %s already exists" % ifindex) - self._netif[ifindex] = netif - # TODO: this should have probably been set ahead, seems bad to me, check for failure and fix - netif.netindex = ifindex - - def delnetif(self, ifindex): - """ - Delete a network interface - - :param int ifindex: interface index to delete - :return: nothing - """ - if ifindex not in self._netif: - raise ValueError("ifindex %s does not exist" % ifindex) - netif = self._netif.pop(ifindex) - netif.shutdown() - del netif - - # TODO: net parameter is not used, remove - def netif(self, ifindex, net=None): - """ - Retrieve network interface. - - :param int ifindex: index of interface to retrieve - :param PyCoreNetIf net: network node - :return: network interface, or None if not found - :rtype: PyCoreNetIf - """ - if ifindex in self._netif: - return self._netif[ifindex] - else: - return None - - def attachnet(self, ifindex, net): - """ - Attach a network. - - :param int ifindex: interface of index to attach - :param PyCoreNetIf net: network to attach - :return: - """ - if ifindex not in self._netif: - raise ValueError("ifindex %s does not exist" % ifindex) - self._netif[ifindex].attachnet(net) - - def detachnet(self, ifindex): - """ - Detach network interface. - - :param int ifindex: interface index to detach - :return: nothing - """ - if ifindex not in self._netif: - raise ValueError("ifindex %s does not exist" % ifindex) - self._netif[ifindex].detachnet() - - def setposition(self, x=None, y=None, z=None): - """ - Set position. - - :param x: x position - :param y: y position - :param z: z position - :return: nothing - """ - changed = super(PyCoreNode, self).setposition(x, y, z) - if changed: - for netif in self.netifs(sort=True): - netif.setposition(x, y, z) - - def commonnets(self, obj, want_ctrl=False): - """ - Given another node or net object, return common networks between - this node and that object. A list of tuples is returned, with each tuple - consisting of (network, interface1, interface2). - - :param obj: object to get common network with - :param want_ctrl: flag set to determine if control network are wanted - :return: tuples of common networks - :rtype: list - """ - common = [] - for netif1 in self.netifs(): - if not want_ctrl and hasattr(netif1, "control"): - continue - for netif2 in obj.netifs(): - if netif1.net == netif2.net: - common.append((netif1.net, netif1, netif2)) - - return common - - def check_cmd(self, args): - """ - Runs shell command on node. - - :param list[str]|str args: command to run - :return: combined stdout and stderr - :rtype: str - :raises CoreCommandError: when a non-zero exit status occurs - """ - raise NotImplementedError - - def cmd(self, args, wait=True): - """ - Runs shell command on node, with option to not wait for a result. - - :param list[str]|str args: command to run - :param bool wait: wait for command to exit, defaults to True - :return: exit status for command - :rtype: int - """ - raise NotImplementedError - - def cmd_output(self, args): - """ - Runs shell command on node and get exit status and output. - - :param list[str]|str args: command to run - :return: exit status and combined stdout and stderr - :rtype: tuple[int, str] - """ - raise NotImplementedError - - def termcmdstring(self, sh): - """ - Create a terminal command string. - - :param str sh: shell to execute command in - :return: str - """ - raise NotImplementedError - - -class PyCoreNet(PyCoreObj): - """ - Base class for networks - """ - linktype = LinkTypes.WIRED.value - - def __init__(self, session, _id, name, start=True): - """ - Create a PyCoreNet instance. - - :param core.session.Session session: CORE session object - :param int _id: object id - :param str name: object name - :param bool start: should object start - """ - super(PyCoreNet, self).__init__(session, _id, name, start=start) - self._linked = {} - self._linked_lock = threading.Lock() - - def startup(self): - """ - Each object implements its own startup method. - - :return: nothing - """ - raise NotImplementedError - - def shutdown(self): - """ - Each object implements its own shutdown method. - - :return: nothing - """ - raise NotImplementedError - - def attach(self, netif): - """ - Attach network interface. - - :param PyCoreNetIf netif: network interface to attach - :return: nothing - """ - i = self.newifindex() - self._netif[i] = netif - netif.netifi = i - with self._linked_lock: - self._linked[netif] = {} - - def detach(self, netif): - """ - Detach network interface. - - :param PyCoreNetIf netif: network interface to detach - :return: nothing - """ - del self._netif[netif.netifi] - netif.netifi = None - with self._linked_lock: - del self._linked[netif] - - def all_link_data(self, flags): - """ - Build link data objects for this network. Each link object describes a link - between this network and a node. - """ - all_links = [] - - # build a link message from this network node to each node having a - # connected interface - for netif in self.netifs(sort=True): - if not hasattr(netif, "node"): - continue - linked_node = netif.node - uni = False - if linked_node is None: - # two layer-2 switches/hubs linked together via linknet() - if not hasattr(netif, "othernet"): - continue - linked_node = netif.othernet - if linked_node.id == self.id: - continue - netif.swapparams('_params_up') - upstream_params = netif.getparams() - netif.swapparams('_params_up') - if netif.getparams() != upstream_params: - uni = True - - unidirectional = 0 - if uni: - unidirectional = 1 - - interface2_ip4 = None - interface2_ip4_mask = None - interface2_ip6 = None - interface2_ip6_mask = None - for address in netif.addrlist: - ip, _sep, mask = address.partition("/") - mask = int(mask) - if ipaddress.is_ipv4_address(ip): - family = AF_INET - ipl = socket.inet_pton(family, ip) - interface2_ip4 = ipaddress.IpAddress(af=family, address=ipl) - interface2_ip4_mask = mask - else: - family = AF_INET6 - ipl = socket.inet_pton(family, ip) - interface2_ip6 = ipaddress.IpAddress(af=family, address=ipl) - interface2_ip6_mask = mask - - link_data = LinkData( - message_type=flags, - node1_id=self.id, - node2_id=linked_node.id, - link_type=self.linktype, - unidirectional=unidirectional, - interface2_id=linked_node.getifindex(netif), - interface2_mac=netif.hwaddr, - interface2_ip4=interface2_ip4, - interface2_ip4_mask=interface2_ip4_mask, - interface2_ip6=interface2_ip6, - interface2_ip6_mask=interface2_ip6_mask, - delay=netif.getparam("delay"), - bandwidth=netif.getparam("bw"), - dup=netif.getparam("duplicate"), - jitter=netif.getparam("jitter"), - per=netif.getparam("loss") - ) - - all_links.append(link_data) - - if not uni: - continue - - netif.swapparams('_params_up') - link_data = LinkData( - message_type=0, - node1_id=linked_node.id, - node2_id=self.id, - unidirectional=1, - delay=netif.getparam("delay"), - bandwidth=netif.getparam("bw"), - dup=netif.getparam("duplicate"), - jitter=netif.getparam("jitter"), - per=netif.getparam("loss") - ) - netif.swapparams('_params_up') - - all_links.append(link_data) - - return all_links - - -class PyCoreNetIf(object): - """ - Base class for network interfaces. - """ - - def __init__(self, node, name, mtu): - """ - Creates a PyCoreNetIf instance. - - :param core.coreobj.PyCoreNode node: node for interface - :param str name: interface name - :param mtu: mtu value - """ - - self.node = node - self.name = name - if not isinstance(mtu, (int, long)): - raise ValueError - self.mtu = mtu - self.net = None - self._params = {} - self.addrlist = [] - self.hwaddr = None - # placeholder position hook - self.poshook = lambda a, b, c, d: None - # used with EMANE - self.transport_type = None - # interface index on the network - self.netindex = None - # index used to find flow data - self.flow_id = None - - def startup(self): - """ - Startup method for the interface. - - :return: nothing - """ - pass - - def shutdown(self): - """ - Shutdown method for the interface. - - :return: nothing - """ - pass - - def attachnet(self, net): - """ - Attach network. - - :param core.coreobj.PyCoreNet net: network to attach - :return: nothing - """ - if self.net: - self.detachnet() - self.net = None - - net.attach(self) - self.net = net - - def detachnet(self): - """ - Detach from a network. - - :return: nothing - """ - if self.net is not None: - self.net.detach(self) - - def addaddr(self, addr): - """ - Add address. - - :param str addr: address to add - :return: nothing - """ - - self.addrlist.append(addr) - - def deladdr(self, addr): - """ - Delete address. - - :param str addr: address to delete - :return: nothing - """ - self.addrlist.remove(addr) - - def sethwaddr(self, addr): - """ - Set hardware address. - - :param core.misc.ipaddress.MacAddress addr: hardware address to set to. - :return: nothing - """ - self.hwaddr = addr - - def getparam(self, key): - """ - Retrieve a parameter from the, or None if the parameter does not exist. - - :param key: parameter to get value for - :return: parameter value - """ - return self._params.get(key) - - def getparams(self): - """ - Return (key, value) pairs for parameters. - """ - parameters = [] - for k in sorted(self._params.keys()): - parameters.append((k, self._params[k])) - return parameters - - def setparam(self, key, value): - """ - Set a parameter value, returns True if the parameter has changed. - - :param key: parameter name to set - :param value: parameter value - :return: True if parameter changed, False otherwise - """ - # treat None and 0 as unchanged values - current_value = self._params.get(key) - if current_value == value or current_value <= 0 and value <= 0: - return False - - self._params[key] = value - return True - - def swapparams(self, name): - """ - Swap out parameters dict for name. If name does not exist, - intialize it. This is for supporting separate upstream/downstream - parameters when two layer-2 nodes are linked together. - - :param str name: name of parameter to swap - :return: nothing - """ - tmp = self._params - if not hasattr(self, name): - setattr(self, name, {}) - self._params = getattr(self, name) - setattr(self, name, tmp) - - def setposition(self, x, y, z): - """ - Dispatch position hook handler. - - :param x: x position - :param y: y position - :param z: z position - :return: nothing - """ - self.poshook(self, x, y, z) diff --git a/daemon/core/emane/bypass.py b/daemon/core/emane/bypass.py index 91a01b37..824bfc68 100644 --- a/daemon/core/emane/bypass.py +++ b/daemon/core/emane/bypass.py @@ -1,10 +1,10 @@ """ EMANE Bypass model for CORE """ -from core.conf import ConfigGroup -from core.conf import Configuration +from core.config import ConfigGroup +from core.config import Configuration from core.emane import emanemodel -from core.enumerations import ConfigDataTypes +from core.emulator.enumerations import ConfigDataTypes class EmaneBypassModel(emanemodel.EmaneModel): diff --git a/daemon/core/emane/commeffect.py b/daemon/core/emane/commeffect.py index 62676c16..e9d9c9fe 100644 --- a/daemon/core/emane/commeffect.py +++ b/daemon/core/emane/commeffect.py @@ -7,7 +7,7 @@ import os from lxml import etree -from core.conf import ConfigGroup +from core.config import ConfigGroup from core.emane import emanemanifest from core.emane import emanemodel from core.xml import emanexml @@ -80,7 +80,7 @@ class EmaneCommEffectModel(emanemodel.EmaneModel): transport_type = "virtual" if interface and interface.transport_type == "raw": transport_type = "raw" - transport_file = emanexml.transport_file_name(self.object_id, transport_type) + transport_file = emanexml.transport_file_name(self.id, transport_type) etree.SubElement(nem_element, "transport", definition=transport_file) # set shim configuration @@ -125,7 +125,7 @@ class EmaneCommEffectModel(emanemodel.EmaneModel): # TODO: batch these into multiple events per transmission # TODO: may want to split out seconds portion of delay and jitter event = CommEffectEvent() - emane_node = self.session.get_object(self.object_id) + emane_node = self.session.get_node(self.id) nemid = emane_node.getnemid(netif) nemid2 = emane_node.getnemid(netif2) mbw = bw diff --git a/daemon/core/emane/emanemanager.py b/daemon/core/emane/emanemanager.py index 44e23831..2dc0d191 100644 --- a/daemon/core/emane/emanemanager.py +++ b/daemon/core/emane/emanemanager.py @@ -6,14 +6,13 @@ import logging import os import threading -from core import CoreCommandError +from core import CoreCommandError, utils from core import constants -from core.api import coreapi -from core.api import dataconversion -from core.conf import ConfigGroup -from core.conf import ConfigShim -from core.conf import Configuration -from core.conf import ModelManager +from core.api.tlv import coreapi, dataconversion +from core.config import ConfigGroup +from core.config import ConfigShim +from core.config import Configuration +from core.config import ModelManager from core.emane import emanemanifest from core.emane.bypass import EmaneBypassModel from core.emane.commeffect import EmaneCommEffectModel @@ -21,15 +20,14 @@ from core.emane.emanemodel import EmaneModel from core.emane.ieee80211abg import EmaneIeee80211abgModel from core.emane.rfpipe import EmaneRfPipeModel from core.emane.tdma import EmaneTdmaModel -from core.enumerations import ConfigDataTypes -from core.enumerations import ConfigFlags -from core.enumerations import ConfigTlvs -from core.enumerations import MessageFlags -from core.enumerations import MessageTypes -from core.enumerations import NodeTypes -from core.enumerations import RegisterTlvs -from core.misc import nodeutils -from core.misc import utils +from core.emulator.enumerations import ConfigDataTypes +from core.emulator.enumerations import ConfigFlags +from core.emulator.enumerations import ConfigTlvs +from core.emulator.enumerations import MessageFlags +from core.emulator.enumerations import MessageTypes +from core.emulator.enumerations import NodeTypes +from core.emulator.enumerations import RegisterTlvs +from core.nodes import nodeutils from core.xml import emanexml try: @@ -251,8 +249,8 @@ class EmaneManager(ModelManager): logging.debug("emane setup") # TODO: drive this from the session object - with self.session._objects_lock: - for node in self.session.objects.itervalues(): + with self.session._nodes_lock: + for node in self.session.nodes.itervalues(): if nodeutils.is_node(node, NodeTypes.EMANE): logging.debug("adding emane node: id(%s) name(%s)", node.id, node.name) self.add_node(node) @@ -845,7 +843,7 @@ class EmaneManager(ModelManager): # generate a node message for this location update try: - node = self.session.get_object(n) + node = self.session.get_node(n) except KeyError: logging.exception("location event NEM %s has no corresponding node %s" % (nemid, n)) return False @@ -906,8 +904,8 @@ class EmaneGlobalModel(EmaneModel): ConfigGroup("NEM Parameters", emulator_len + 1, config_len) ] - def __init__(self, session, object_id=None): - super(EmaneGlobalModel, self).__init__(session, object_id) + def __init__(self, session, _id=None): + super(EmaneGlobalModel, self).__init__(session, _id) def build_xml_files(self, config, interface=None): raise NotImplementedError diff --git a/daemon/core/emane/emanemanifest.py b/daemon/core/emane/emanemanifest.py index b07833c9..8f10737c 100644 --- a/daemon/core/emane/emanemanifest.py +++ b/daemon/core/emane/emanemanifest.py @@ -1,7 +1,7 @@ import logging -from core.conf import Configuration -from core.enumerations import ConfigDataTypes +from core.config import Configuration +from core.emulator.enumerations import ConfigDataTypes manifest = None try: diff --git a/daemon/core/emane/emanemodel.py b/daemon/core/emane/emanemodel.py index 01bf1835..6e5b641d 100644 --- a/daemon/core/emane/emanemodel.py +++ b/daemon/core/emane/emanemodel.py @@ -4,11 +4,11 @@ Defines Emane Models used within CORE. import logging import os -from core.conf import ConfigGroup -from core.conf import Configuration +from core.config import ConfigGroup +from core.config import Configuration from core.emane import emanemanifest -from core.enumerations import ConfigDataTypes -from core.mobility import WirelessModel +from core.emulator.enumerations import ConfigDataTypes +from core.location.mobility import WirelessModel from core.xml import emanexml @@ -105,7 +105,7 @@ class EmaneModel(WirelessModel): transport_type = "virtual" if interface and interface.transport_type == "raw": transport_type = "raw" - transport_name = emanexml.transport_file_name(self.object_id, transport_type) + transport_name = emanexml.transport_file_name(self.id, transport_type) # create nem xml file nem_file = os.path.join(self.session.session_dir, nem_name) @@ -138,7 +138,7 @@ class EmaneModel(WirelessModel): :return: """ try: - wlan = self.session.get_object(self.object_id) + wlan = self.session.get_node(self.id) wlan.setnempositions(moved_netifs) except KeyError: logging.exception("error during update") diff --git a/daemon/core/emane/nodes.py b/daemon/core/emane/nodes.py index 016dc031..cbbec693 100644 --- a/daemon/core/emane/nodes.py +++ b/daemon/core/emane/nodes.py @@ -6,10 +6,10 @@ share the same MAC+PHY model. import logging -from core.coreobj import PyCoreNet -from core.enumerations import LinkTypes -from core.enumerations import NodeTypes -from core.enumerations import RegisterTlvs +from core.nodes.base import CoreNetworkBase +from core.emulator.enumerations import LinkTypes +from core.emulator.enumerations import NodeTypes +from core.emulator.enumerations import RegisterTlvs try: from emane.events import LocationEvent @@ -20,7 +20,7 @@ except ImportError: logging.debug("compatible emane python bindings not installed") -class EmaneNet(PyCoreNet): +class EmaneNet(CoreNetworkBase): """ EMANE network base class. """ @@ -80,10 +80,10 @@ class EmaneNode(EmaneNet): if model.config_type == RegisterTlvs.WIRELESS.value: # EmaneModel really uses values from ConfigurableManager # when buildnemxml() is called, not during init() - self.model = model(session=self.session, object_id=self.id) + self.model = model(session=self.session, _id=self.id) self.model.update_config(config) elif model.config_type == RegisterTlvs.MOBILITY.value: - self.mobility = model(session=self.session, object_id=self.id) + self.mobility = model(session=self.session, _id=self.id) self.mobility.update_config(config) def setnemid(self, netif, nemid): diff --git a/daemon/core/emane/tdma.py b/daemon/core/emane/tdma.py index b599638d..5507ae65 100644 --- a/daemon/core/emane/tdma.py +++ b/daemon/core/emane/tdma.py @@ -5,11 +5,10 @@ tdma.py: EMANE TDMA model bindings for CORE import logging import os -from core import constants -from core.conf import Configuration +from core import constants, utils +from core.config import Configuration from core.emane import emanemodel -from core.enumerations import ConfigDataTypes -from core.misc import utils +from core.emulator.enumerations import ConfigDataTypes class EmaneTdmaModel(emanemodel.EmaneModel): @@ -49,7 +48,7 @@ class EmaneTdmaModel(emanemodel.EmaneModel): :return: nothing """ # get configured schedule - config = self.session.emane.get_configs(node_id=self.object_id, config_type=self.name) + config = self.session.emane.get_configs(node_id=self.id, config_type=self.name) if not config: return schedule = config[self.schedule_name] diff --git a/daemon/core/emulator/coreemu.py b/daemon/core/emulator/coreemu.py index a95a347d..467ea145 100644 --- a/daemon/core/emulator/coreemu.py +++ b/daemon/core/emulator/coreemu.py @@ -5,18 +5,16 @@ import signal import sys import core.services -from core.coreobj import PyCoreNet -from core.coreobj import PyCoreNode -from core.data import NodeData +from core.nodes.base import CoreNodeBase, CoreNetworkBase +from core.emulator.data import NodeData from core.emulator.emudata import LinkOptions from core.emulator.emudata import NodeOptions -from core.enumerations import EventTypes -from core.enumerations import LinkTypes -from core.enumerations import NodeTypes -from core.misc import nodemaps -from core.misc import nodeutils -from core.service import ServiceManager -from core.session import Session +from core.emulator.enumerations import EventTypes +from core.emulator.enumerations import LinkTypes +from core.emulator.enumerations import NodeTypes +from core.nodes import nodeutils, nodemaps +from core.services.coreservices import ServiceManager +from core.emulator.session import Session from core.xml.corexml import CoreXmlReader, CoreXmlWriter @@ -94,7 +92,7 @@ def is_net_node(node): :return: True if object is an instance of a network node, False otherwise :rtype: bool """ - return isinstance(node, PyCoreNet) + return isinstance(node, CoreNetworkBase) def is_core_node(node): @@ -105,7 +103,7 @@ def is_core_node(node): :return: True if object is an instance of a core node, False otherwise :rtype: bool """ - return isinstance(node, PyCoreNode) + return isinstance(node, CoreNodeBase) class IdGen(object): @@ -149,8 +147,8 @@ class EmuSession(Session): net_two = None # retrieve node one - node_one = self.get_object(node_one_id) - node_two = self.get_object(node_two_id) + node_one = self.get_node(node_one_id) + node_two = self.get_node(node_two_id) # both node ids are provided tunnel = self.broker.gettunnel(node_one_id, node_two_id) @@ -245,7 +243,7 @@ class EmuSession(Session): logging.info("adding link for peer to peer nodes: %s - %s", node_one.name, node_two.name) ptp_class = nodeutils.get_node_class(NodeTypes.PEER_TO_PEER) start = self.state > EventTypes.DEFINITION_STATE.value - net_one = self.add_object(cls=ptp_class, start=start) + net_one = self.create_node(cls=ptp_class, start=start) # node to network if node_one and net_one: @@ -366,7 +364,7 @@ class EmuSession(Session): interface_one.detachnet() interface_two.detachnet() if net_one.numnetif() == 0: - self.delete_object(net_one.id) + self.delete_node(net_one.id) node_one.delnetif(interface_one.netindex) node_two.delnetif(interface_two.netindex) finally: @@ -483,7 +481,7 @@ class EmuSession(Session): if not _id: while True: _id = self.node_id_gen.next() - if _id not in self.objects: + if _id not in self.nodes: break # generate name if not provided @@ -493,7 +491,7 @@ class EmuSession(Session): # create node logging.info("creating node(%s) id(%s) name(%s) start(%s)", node_class.__name__, _id, name, start) - node = self.add_object(cls=node_class, _id=_id, name=name, start=start) + node = self.create_node(cls=node_class, _id=_id, name=name, start=start) # set node attributes node.icon = node_options.icon @@ -510,9 +508,9 @@ class EmuSession(Session): self.services.add_services(node, node.type, node_options.services) # boot nodes if created after runtime, LcxNodes, Physical, and RJ45 are all PyCoreNodes - is_boot_node = isinstance(node, PyCoreNode) and not nodeutils.is_node(node, NodeTypes.RJ45) + is_boot_node = isinstance(node, CoreNodeBase) and not nodeutils.is_node(node, NodeTypes.RJ45) if self.state == EventTypes.RUNTIME_STATE.value and is_boot_node: - self.write_objects() + self.write_nodes() self.add_remove_control_interface(node=node, remove=False) self.services.boot_services(node) @@ -530,7 +528,7 @@ class EmuSession(Session): result = False try: # get node to update - node = self.get_object(node_id) + node = self.get_node(node_id) # set node position and broadcast it self.set_node_position(node, node_options) @@ -546,20 +544,6 @@ class EmuSession(Session): return result - def delete_node(self, node_id): - """ - Delete a node from the session and check if session should shutdown, if no nodes are left. - - :param int node_id: id of node to delete - :return: True if node deleted, False otherwise - :rtype: bool - """ - # delete node and check for session shutdown if a node was removed - result = self.custom_delete_object(node_id) - if result: - self.check_shutdown() - return result - def set_node_position(self, node, node_options): """ Set position for a node, use lat/lon/alt if needed. @@ -625,21 +609,6 @@ class EmuSession(Session): self.set_state(EventTypes.SHUTDOWN_STATE, send_event=True) super(EmuSession, self).shutdown() - def custom_delete_object(self, object_id): - """ - Remove an emulation object. - - :param int object_id: object id to remove - :return: True if object deleted, False otherwise - """ - result = False - with self._objects_lock: - if object_id in self.objects: - obj = self.objects.pop(object_id) - obj.shutdown() - result = True - return result - def is_active(self): """ Determine if this session is considered to be active. (Runtime or Data collect states) @@ -704,7 +673,7 @@ class EmuSession(Session): :return: nothing """ - node = self.get_object(node_id) + node = self.get_node(node_id) if source_name is not None: node.addfile(source_name, file_name) @@ -717,7 +686,7 @@ class EmuSession(Session): :return: nothing """ - self.delete_objects() + self.delete_nodes() self.del_hooks() self.broker.reset() self.emane.reset() diff --git a/daemon/core/data.py b/daemon/core/emulator/data.py similarity index 100% rename from daemon/core/data.py rename to daemon/core/emulator/data.py diff --git a/daemon/core/emulator/emudata.py b/daemon/core/emulator/emudata.py index 437220da..6e5ebbfe 100644 --- a/daemon/core/emulator/emudata.py +++ b/daemon/core/emulator/emudata.py @@ -1,7 +1,7 @@ -from core.enumerations import LinkTypes -from core.misc.ipaddress import Ipv4Prefix -from core.misc.ipaddress import Ipv6Prefix -from core.misc.ipaddress import MacAddress +from core.emulator.enumerations import LinkTypes +from core.nodes.ipaddress import Ipv4Prefix +from core.nodes.ipaddress import Ipv6Prefix +from core.nodes.ipaddress import MacAddress class NodeOptions(object): diff --git a/daemon/core/enumerations.py b/daemon/core/emulator/enumerations.py similarity index 100% rename from daemon/core/enumerations.py rename to daemon/core/emulator/enumerations.py diff --git a/daemon/core/session.py b/daemon/core/emulator/session.py similarity index 86% rename from daemon/core/session.py rename to daemon/core/emulator/session.py index 43500b2c..b4ca45d1 100644 --- a/daemon/core/session.py +++ b/daemon/core/emulator/session.py @@ -5,6 +5,7 @@ that manages a CORE session. import logging import os +import pwd import random import shutil import subprocess @@ -13,31 +14,29 @@ import threading import time from multiprocessing.pool import ThreadPool -import pwd - -from core import constants -from core.api import coreapi -from core.broker import CoreBroker -from core.conf import ConfigurableManager -from core.conf import ConfigurableOptions -from core.conf import Configuration -from core.data import EventData -from core.data import ExceptionData +import core.nodes.base +from core import constants, utils +from core.api.tlv import coreapi +from core.api.tlv.broker import CoreBroker +from core.config import ConfigurableManager +from core.config import ConfigurableOptions +from core.config import Configuration from core.emane.emanemanager import EmaneManager -from core.enumerations import ConfigDataTypes -from core.enumerations import EventTypes -from core.enumerations import ExceptionLevels -from core.enumerations import NodeTypes -from core.enumerations import RegisterTlvs -from core.location import CoreLocation -from core.misc import nodeutils -from core.misc import utils -from core.misc.event import EventLoop -from core.misc.ipaddress import MacAddress -from core.mobility import MobilityManager -from core.netns import nodes -from core.sdt import Sdt -from core.service import CoreServices +from core.emulator.data import EventData +from core.emulator.data import ExceptionData +from core.emulator.enumerations import ConfigDataTypes +from core.emulator.enumerations import EventTypes +from core.emulator.enumerations import ExceptionLevels +from core.emulator.enumerations import NodeTypes +from core.emulator.enumerations import RegisterTlvs +from core.location.corelocation import CoreLocation +from core.location.event import EventLoop +from core.location.mobility import MobilityManager +from core.nodes import nodeutils +from core.nodes.base import CoreNodeBase +from core.nodes.ipaddress import MacAddress +from core.plugins.sdt import Sdt +from core.services.coreservices import CoreServices from core.xml import corexml, corexmldeployment @@ -67,9 +66,9 @@ class Session(object): self.user = None self.event_loop = EventLoop() - # dict of objects: all nodes and nets - self.objects = {} - self._objects_lock = threading.Lock() + # dict of nodes: all nodes and nets + self.nodes = {} + self._nodes_lock = threading.Lock() # TODO: should the default state be definition? self.state = EventTypes.NONE.value @@ -110,15 +109,15 @@ class Session(object): def shutdown(self): """ - Shutdown all emulation objects and remove the session directory. + Shutdown all session nodes and remove the session directory. """ # shutdown/cleanup feature helpers self.emane.shutdown() self.broker.shutdown() self.sdt.shutdown() - # delete all current objects - self.delete_objects() + # delete all current nodes + self.delete_nodes() # remove this sessions working directory preserve = self.options.get_config("preservedir") == "1" @@ -464,93 +463,87 @@ class Session(object): """ Return a unique, new node id. """ - with self._objects_lock: + with self._nodes_lock: while True: - object_id = random.randint(1, 0xFFFF) - if object_id not in self.objects: + node_id = random.randint(1, 0xFFFF) + if node_id not in self.nodes: break - return object_id + return node_id - def add_object(self, cls, *clsargs, **clskwds): + def create_node(self, cls, *clsargs, **clskwds): """ Create an emulation node. - :param class cls: object class to add + :param class cls: node class to create :param list clsargs: list of arguments for the class to create :param dict clskwds: dictionary of arguments for the class to create - :return: the created class instance + :return: the created node instance """ node = cls(self, *clsargs, **clskwds) - with self._objects_lock: - if node.id in self.objects: + with self._nodes_lock: + if node.id in self.nodes: node.shutdown() raise KeyError("duplicate node id %s for %s" % (node.id, node.name)) - self.objects[node.id] = node + self.nodes[node.id] = node return node - def get_object(self, object_id): + def get_node(self, _id): """ - Get an emulation object. + Get a session node. - :param int object_id: object id to retrieve - :return: object for the given id - :rtype: core.coreobj.PyCoreNode + :param int _id: node id to retrieve + :return: node for the given id + :rtype: core.nodes.base.CoreNode """ - if object_id not in self.objects: - raise KeyError("unknown object id %s" % object_id) - return self.objects[object_id] + if _id not in self.nodes: + raise KeyError("unknown node id %s" % _id) + return self.nodes[_id] - def get_object_by_name(self, name): + def delete_node(self, _id): """ - Get an emulation object using its name attribute. + Delete a node from the session and check if session should shutdown, if no nodes are left. - :param str name: name of object to retrieve - :return: object for the name given + :param int _id: id of node to delete + :return: True if node deleted, False otherwise + :rtype: bool """ - with self._objects_lock: - for obj in self.objects.itervalues(): - if hasattr(obj, "name") and obj.name == name: - return obj - raise KeyError("unknown object with name %s" % name) + # delete node and check for session shutdown if a node was removed + result = False + with self._nodes_lock: + if _id in self.nodes: + node = self.nodes.pop(_id) + node.shutdown() + result = True - def delete_object(self, object_id): - """ - Remove an emulation object. + if result: + self.check_shutdown() - :param int object_id: object id to remove - :return: nothing - """ - with self._objects_lock: - try: - obj = self.objects.pop(object_id) - obj.shutdown() - except KeyError: - logging.error("failed to remove object, object with id was not found: %s", object_id) + return result - def delete_objects(self): + def delete_nodes(self): """ - Clear the objects dictionary, and call shutdown for each object. + Clear the nodes dictionary, and call shutdown for each node. """ - with self._objects_lock: - while self.objects: - _, obj = self.objects.popitem() - obj.shutdown() + with self._nodes_lock: + while self.nodes: + _, node = self.nodes.popitem() + node.shutdown() - def write_objects(self): + def write_nodes(self): """ - Write objects to a 'nodes' file in the session dir. + Write nodes to a 'nodes' file in the session dir. The 'nodes' file lists: number, name, api-type, class-type """ try: - nodes_file = open(os.path.join(self.session_dir, "nodes"), "w") - with self._objects_lock: - for object_id in sorted(self.objects.keys()): - obj = self.objects[object_id] - nodes_file.write("%s %s %s %s\n" % (object_id, obj.name, obj.apitype, type(obj))) - nodes_file.close() + with self._nodes_lock: + file_path = os.path.join(self.session_dir, "nodes") + with open(file_path, "w") as f: + for _id in sorted(self.nodes.keys()): + node = self.nodes[_id] + f.write("%s %s %s %s\n" % (_id, node.name, node.apitype, type(node))) except IOError: logging.exception("error writing nodes file") @@ -560,21 +553,21 @@ class Session(object): """ logging.info("session id=%s name=%s state=%s", self.id, self.name, self.state) logging.info("file=%s thumbnail=%s node_count=%s/%s", - self.file_name, self.thumbnail, self.get_node_count(), len(self.objects)) + self.file_name, self.thumbnail, self.get_node_count(), len(self.nodes)) - def exception(self, level, source, object_id, text): + def exception(self, level, source, node_id, text): """ Generate and broadcast an exception event. :param str level: exception level :param str source: source name - :param int object_id: object id + :param int node_id: node related to exception :param str text: exception message :return: nothing """ exception_data = ExceptionData( - node=object_id, + node=node_id, session=str(self.id), level=level, source=source, @@ -591,8 +584,8 @@ class Session(object): for transition to the runtime state. """ - # write current objects out to session directory file - self.write_objects() + # write current nodes out to session directory file + self.write_nodes() # controlnet may be needed by some EMANE models self.add_remove_control_interface(node=None, remove=False) @@ -626,12 +619,12 @@ class Session(object): that are not considered in the GUI's node count. """ - with self._objects_lock: - count = len([x for x in self.objects.itervalues() + with self._nodes_lock: + count = len([x for x in self.nodes.itervalues() if not nodeutils.is_node(x, (NodeTypes.PEER_TO_PEER, NodeTypes.CONTROL_NET))]) # on Linux, GreTapBridges are auto-created, not part of GUI's node count - count -= len([x for x in self.objects.itervalues() + count -= len([x for x in self.nodes.itervalues() if nodeutils.is_node(x, NodeTypes.TAP_BRIDGE) and not nodeutils.is_node(x, NodeTypes.TUNNEL)]) return count @@ -668,10 +661,10 @@ class Session(object): self.event_loop.stop() # stop node services - with self._objects_lock: - for obj in self.objects.itervalues(): + with self._nodes_lock: + for obj in self.nodes.itervalues(): # TODO: determine if checking for CoreNode alone is ok - if isinstance(obj, nodes.PyCoreNode): + if isinstance(obj, core.nodes.base.CoreNodeBase): self.services.stop_services(obj) # shutdown emane @@ -715,14 +708,14 @@ class Session(object): messages to the GUI for node messages that had the status request flag. """ - with self._objects_lock: + with self._nodes_lock: pool = ThreadPool() results = [] start = time.time() - for obj in self.objects.itervalues(): + for obj in self.nodes.itervalues(): # TODO: PyCoreNode is not the type to check - if isinstance(obj, nodes.PyCoreNode) and not nodeutils.is_node(obj, NodeTypes.RJ45): + if isinstance(obj, CoreNodeBase) and not nodeutils.is_node(obj, NodeTypes.RJ45): # add a control interface if configured logging.info("booting node: %s", obj.name) self.add_remove_control_interface(node=obj, remove=False) @@ -786,10 +779,10 @@ class Session(object): return index return -1 - def get_control_net_object(self, net_index): + def get_control_net(self, net_index): # TODO: all nodes use an integer id and now this wants to use a string - object_id = "ctrl%dnet" % net_index - return self.get_object(object_id) + _id = "ctrl%dnet" % net_index + return self.get_node(_id) def add_remove_control_net(self, net_index, remove=False, conf_required=True): """ @@ -801,8 +794,8 @@ class Session(object): :param int net_index: network index :param bool remove: flag to check if it should be removed :param bool conf_required: flag to check if conf is required - :return: control net object - :rtype: core.netns.nodes.CtrlNet + :return: control net node + :rtype: core.nodes.network.CtrlNet """ logging.debug("add/remove control net: index(%s) remove(%s) conf_required(%s)", net_index, remove, conf_required) prefix_spec_list = self.get_control_net_prefixes() @@ -820,10 +813,10 @@ class Session(object): # return any existing controlnet bridge try: - control_net = self.get_control_net_object(net_index) + control_net = self.get_control_net(net_index) if remove: - self.delete_object(control_net.id) + self.delete_node(control_net.id) return None return control_net @@ -832,7 +825,7 @@ class Session(object): return None # build a new controlnet bridge - object_id = "ctrl%dnet" % net_index + _id = "ctrl%dnet" % net_index # use the updown script for control net 0 only. updown_script = None @@ -887,16 +880,16 @@ class Session(object): prefix = prefixes[0] control_net_class = nodeutils.get_node_class(NodeTypes.CONTROL_NET) - control_net = self.add_object(cls=control_net_class, _id=object_id, prefix=prefix, - assign_address=assign_address, - updown_script=updown_script, serverintf=server_interface) + control_net = self.create_node(cls=control_net_class, _id=_id, prefix=prefix, + assign_address=assign_address, + updown_script=updown_script, serverintf=server_interface) # tunnels between controlnets will be built with Broker.addnettunnels() - # TODO: potentially remove documentation saying object ids are ints + # TODO: potentially remove documentation saying node ids are ints # TODO: need to move broker code out of the session object - self.broker.addnet(object_id) + self.broker.addnet(_id) for server in self.broker.getservers(): - self.broker.addnodemap(server, object_id) + self.broker.addnodemap(server, _id) return control_net @@ -908,7 +901,7 @@ class Session(object): If conf_reqd is False, the control network may be built even when the user has not configured one (e.g. for EMANE.) - :param core.netns.nodes.CoreNode node: node to add or remove control interface + :param core.netns.vnode.CoreNode node: node to add or remove control interface :param int net_index: network index :param bool remove: flag to check if it should be removed :param bool conf_required: flag to check if conf is required @@ -954,9 +947,9 @@ class Session(object): return try: - control_net = self.get_control_net_object(net_index) + control_net = self.get_control_net(net_index) except KeyError: - logging.exception("error retrieving control net object") + logging.exception("error retrieving control net node") return header = "CORE session %s host entries" % self.id @@ -991,7 +984,7 @@ class Session(object): start of the runtime state. :param event_time: event time - :param core.netns.nodes.CoreNode node: node to add event for + :param core.netns.vnode.CoreNode node: node to add event for :param str name: name of event :param data: data for event :return: nothing @@ -1029,13 +1022,13 @@ class Session(object): if not node_id: utils.mute_detach(data) else: - node = self.get_object(node_id) + node = self.get_node(node_id) node.cmd(data, wait=False) class SessionConfig(ConfigurableManager, ConfigurableOptions): """ - Session configuration object. + Provides session configuration. """ name = "session" options = [ diff --git a/daemon/core/netns/__init__.py b/daemon/core/location/__init__.py similarity index 100% rename from daemon/core/netns/__init__.py rename to daemon/core/location/__init__.py diff --git a/daemon/core/location.py b/daemon/core/location/corelocation.py similarity index 99% rename from daemon/core/location.py rename to daemon/core/location/corelocation.py index b95a8670..a65a4d72 100644 --- a/daemon/core/location.py +++ b/daemon/core/location/corelocation.py @@ -7,8 +7,8 @@ https://pypi.python.org/pypi/utm (version 0.3.0). import logging -from core.enumerations import RegisterTlvs -from core.misc import utm +from core.emulator.enumerations import RegisterTlvs +from core.location import utm class CoreLocation(object): diff --git a/daemon/core/misc/event.py b/daemon/core/location/event.py similarity index 100% rename from daemon/core/misc/event.py rename to daemon/core/location/event.py diff --git a/daemon/core/mobility.py b/daemon/core/location/mobility.py similarity index 95% rename from daemon/core/mobility.py rename to daemon/core/location/mobility.py index 3f2cc4e5..2890e9c2 100644 --- a/daemon/core/mobility.py +++ b/daemon/core/location/mobility.py @@ -9,22 +9,22 @@ import os import threading import time -from core.conf import ConfigGroup -from core.conf import ConfigurableOptions -from core.conf import Configuration -from core.conf import ModelManager -from core.coreobj import PyCoreNode -from core.data import EventData -from core.data import LinkData -from core.enumerations import ConfigDataTypes -from core.enumerations import EventTypes -from core.enumerations import LinkTypes -from core.enumerations import MessageFlags -from core.enumerations import MessageTypes -from core.enumerations import NodeTlvs -from core.enumerations import RegisterTlvs -from core.misc import utils -from core.misc.ipaddress import IpAddress +from core.config import ConfigGroup +from core.config import ConfigurableOptions +from core.config import Configuration +from core.config import ModelManager +from core.nodes.base import CoreNodeBase +from core.emulator.data import EventData +from core.emulator.data import LinkData +from core.emulator.enumerations import ConfigDataTypes +from core.emulator.enumerations import EventTypes +from core.emulator.enumerations import LinkTypes +from core.emulator.enumerations import MessageFlags +from core.emulator.enumerations import MessageTypes +from core.emulator.enumerations import NodeTlvs +from core.emulator.enumerations import RegisterTlvs +from core import utils +from core.nodes.ipaddress import IpAddress class MobilityManager(ModelManager): @@ -67,7 +67,7 @@ class MobilityManager(ModelManager): logging.info("node mobility configurations: %s", self.get_all_configs(node_id)) try: - node = self.session.get_object(node_id) + node = self.session.get_node(node_id) except KeyError: logging.warn("skipping mobility configuration for unknown node: %s", node_id) continue @@ -98,7 +98,7 @@ class MobilityManager(ModelManager): name = event_data.name try: - node = self.session.get_object(node_id) + node = self.session.get_node(node_id) except KeyError: logging.exception("Ignoring event for model '%s', unknown node '%s'", name, node_id) return @@ -152,7 +152,7 @@ class MobilityManager(ModelManager): data += " end=%d" % int(model.endtime) event_data = EventData( - node=model.object_id, + node=model.id, event_type=event_type, name="mobility:%s" % model.name, data=data, @@ -173,7 +173,7 @@ class MobilityManager(ModelManager): """ for node_id in self.nodes(): try: - node = self.session.get_object(node_id) + node = self.session.get_node(node_id) except KeyError: continue if node.model: @@ -213,7 +213,7 @@ class MobilityManager(ModelManager): return if nn[1] in self.session.broker.physical_nodes: # record the fact that this PhysicalNode is linked to a net - dummy = PyCoreNode(session=self.session, _id=nn[1], name="n%d" % nn[1], start=False) + dummy = CoreNodeBase(session=self.session, _id=nn[1], name="n%d" % nn[1], start=False) self.addphys(nn[0], dummy) # TODO: remove need to handling old style messages @@ -265,15 +265,15 @@ class WirelessModel(ConfigurableOptions): bitmap = None position_callback = None - def __init__(self, session, object_id): + def __init__(self, session, _id): """ Create a WirelessModel instance. :param core.session.Session session: core session we are tied to - :param int object_id: object id + :param int _id: object id """ self.session = session - self.object_id = object_id + self.id = _id def all_link_data(self, flags): """ @@ -329,17 +329,17 @@ class BasicRangeModel(WirelessModel): ConfigGroup("Basic Range Parameters", 1, len(cls.configurations())) ] - def __init__(self, session, object_id): + def __init__(self, session, _id): """ Create a BasicRangeModel instance. :param core.session.Session session: related core session - :param int object_id: object id + :param int _id: object id :param dict config: values """ - super(BasicRangeModel, self).__init__(session=session, object_id=object_id) + super(BasicRangeModel, self).__init__(session=session, _id=_id) self.session = session - self.wlan = session.get_object(object_id) + self.wlan = session.get_node(_id) self._netifs = {} self._netifslock = threading.Lock() @@ -605,15 +605,15 @@ class WayPointMobility(WirelessModel): STATE_RUNNING = 1 STATE_PAUSED = 2 - def __init__(self, session, object_id): + def __init__(self, session, _id): """ Create a WayPointMobility instance. :param core.session.Session session: CORE session instance - :param int object_id: object id + :param int _id: object id :return: """ - super(WayPointMobility, self).__init__(session=session, object_id=object_id) + super(WayPointMobility, self).__init__(session=session, _id=_id) self.state = self.STATE_STOPPED self.queue = [] @@ -622,7 +622,7 @@ class WayPointMobility(WirelessModel): self.initial = {} self.lasttime = None self.endtime = None - self.wlan = session.get_object(object_id) + self.wlan = session.get_node(_id) # these are really set in child class via confmatrix self.loop = False self.refresh_ms = 50 @@ -700,7 +700,7 @@ class WayPointMobility(WirelessModel): Calculate next node location and update its coordinates. Returns True if the node's position has changed. - :param core.netns.nodes.CoreNode node: node to move + :param core.netns.vnode.CoreNode node: node to move :param dt: move factor :return: True if node was moved, False otherwise :rtype: bool @@ -830,7 +830,7 @@ class WayPointMobility(WirelessModel): without invoking the interface poshook callback that may perform range calculation. - :param core.netns.nodes.CoreNode node: node to set position for + :param core.netns.vnode.CoreNode node: node to set position for :param x: x position :param y: y position :param z: z position @@ -923,15 +923,15 @@ class Ns2ScriptedMobility(WayPointMobility): ConfigGroup("ns-2 Mobility Script Parameters", 1, len(cls.configurations())) ] - def __init__(self, session, object_id): + def __init__(self, session, _id): """ Creates a Ns2ScriptedMobility instance. :param core.session.Session session: CORE session instance - :param int object_id: object id + :param int _id: object id :param config: values """ - super(Ns2ScriptedMobility, self).__init__(session=session, object_id=object_id) + super(Ns2ScriptedMobility, self).__init__(session=session, _id=_id) self._netifs = {} self._netifslock = threading.Lock() @@ -946,7 +946,7 @@ class Ns2ScriptedMobility(WayPointMobility): def update_config(self, config): self.file = config["file"] - logging.info("ns-2 scripted mobility configured for WLAN %d using file: %s", self.object_id, self.file) + logging.info("ns-2 scripted mobility configured for WLAN %d using file: %s", self.id, self.file) self.refresh_ms = int(config["refresh_ms"]) self.loop = config["loop"].lower() == "on" self.autostart = config["autostart"] diff --git a/daemon/core/misc/utm.py b/daemon/core/location/utm.py similarity index 100% rename from daemon/core/misc/utm.py rename to daemon/core/location/utm.py diff --git a/daemon/core/misc/LatLongUTMconversion.py b/daemon/core/misc/LatLongUTMconversion.py deleted file mode 100755 index 4f7c13dc..00000000 --- a/daemon/core/misc/LatLongUTMconversion.py +++ /dev/null @@ -1,246 +0,0 @@ -#!/usr/bin/env python -# this file is from http://pygps.org/ - -# Lat Long - UTM, UTM - Lat Long conversions - -from math import pi, sin, cos, tan, sqrt - -# LatLong- UTM conversion..h -# definitions for lat/long to UTM and UTM to lat/lng conversions -# include - -_deg2rad = pi / 180.0 -_rad2deg = 180.0 / pi - -_EquatorialRadius = 2 -_eccentricitySquared = 3 - -_ellipsoid = [ - # id, Ellipsoid name, Equatorial Radius, square of eccentricity - # first once is a placeholder only, To allow array indices to match id numbers - [-1, "Placeholder", 0, 0], - [1, "Airy", 6377563, 0.00667054], - [2, "Australian National", 6378160, 0.006694542], - [3, "Bessel 1841", 6377397, 0.006674372], - [4, "Bessel 1841 (Nambia] ", 6377484, 0.006674372], - [5, "Clarke 1866", 6378206, 0.006768658], - [6, "Clarke 1880", 6378249, 0.006803511], - [7, "Everest", 6377276, 0.006637847], - [8, "Fischer 1960 (Mercury] ", 6378166, 0.006693422], - [9, "Fischer 1968", 6378150, 0.006693422], - [10, "GRS 1967", 6378160, 0.006694605], - [11, "GRS 1980", 6378137, 0.00669438], - [12, "Helmert 1906", 6378200, 0.006693422], - [13, "Hough", 6378270, 0.00672267], - [14, "International", 6378388, 0.00672267], - [15, "Krassovsky", 6378245, 0.006693422], - [16, "Modified Airy", 6377340, 0.00667054], - [17, "Modified Everest", 6377304, 0.006637847], - [18, "Modified Fischer 1960", 6378155, 0.006693422], - [19, "South American 1969", 6378160, 0.006694542], - [20, "WGS 60", 6378165, 0.006693422], - [21, "WGS 66", 6378145, 0.006694542], - [22, "WGS-72", 6378135, 0.006694318], - [23, "WGS-84", 6378137, 0.00669438] -] - - -# Reference ellipsoids derived from Peter H. Dana's website- -# http://www.utexas.edu/depts/grg/gcraft/notes/datum/elist.html -# Department of Geography, University of Texas at Austin -# Internet: pdana@mail.utexas.edu -# 3/22/95 - -# Source -# Defense Mapping Agency. 1987b. DMA Technical Report: Supplement to Department of Defense World Geodetic System -# 1984 Technical Report. Part I and II. Washington, DC: Defense Mapping Agency - -# def LLtoUTM(int ReferenceEllipsoid, const double Lat, const double Long, -# double &UTMNorthing, double &UTMEasting, char* UTMZone) - -def LLtoUTM(ReferenceEllipsoid, Lat, Long, zone=None): - """converts lat/long to UTM coords. Equations from USGS Bulletin 1532 - East Longitudes are positive, West longitudes are negative. - North latitudes are positive, South latitudes are negative - Lat and Long are in decimal degrees - Written by Chuck Gantz- chuck.gantz@globalstar.com""" - - a = _ellipsoid[ReferenceEllipsoid][_EquatorialRadius] - eccSquared = _ellipsoid[ReferenceEllipsoid][_eccentricitySquared] - k0 = 0.9996 - - # Make sure the longitude is between -180.00 .. 179.9 - LongTemp = (Long + 180) - int((Long + 180) / 360) * 360 - 180 # -180.00 .. 179.9 - - LatRad = Lat * _deg2rad - LongRad = LongTemp * _deg2rad - - if zone is None: - ZoneNumber = int((LongTemp + 180) / 6) + 1 - else: - ZoneNumber = zone - - if Lat >= 56.0 and Lat < 64.0 and LongTemp >= 3.0 and LongTemp < 12.0: - ZoneNumber = 32 - - # Special zones for Svalbard - if Lat >= 72.0 and Lat < 84.0: - if LongTemp >= 0.0 and LongTemp < 9.0: - ZoneNumber = 31 - elif LongTemp >= 9.0 and LongTemp < 21.0: - ZoneNumber = 33 - elif LongTemp >= 21.0 and LongTemp < 33.0: - ZoneNumber = 35 - elif LongTemp >= 33.0 and LongTemp < 42.0: - ZoneNumber = 37 - - LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3 # +3 puts origin in middle of zone - LongOriginRad = LongOrigin * _deg2rad - - # compute the UTM Zone from the latitude and longitude - UTMZone = "%d%c" % (ZoneNumber, _UTMLetterDesignator(Lat)) - - eccPrimeSquared = (eccSquared) / (1 - eccSquared) - N = a / sqrt(1 - eccSquared * sin(LatRad) * sin(LatRad)) - T = tan(LatRad) * tan(LatRad) - C = eccPrimeSquared * cos(LatRad) * cos(LatRad) - A = cos(LatRad) * (LongRad - LongOriginRad) - - M = a * ((1 - - eccSquared / 4 - - 3 * eccSquared * eccSquared / 64 - - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad - - (3 * eccSquared / 8 - + 3 * eccSquared * eccSquared / 32 - + 45 * eccSquared * eccSquared * eccSquared / 1024) * sin(2 * LatRad) - + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * sin(4 * LatRad) - - (35 * eccSquared * eccSquared * eccSquared / 3072) * sin(6 * LatRad)) - - UTMEasting = (k0 * N * (A + (1 - T + C) * A * A * A / 6 - + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120) - + 500000.0) - - UTMNorthing = (k0 * (M + N * tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24 - + (61 - - 58 * T - + T * T - + 600 * C - - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720))) - - if Lat < 0: - UTMNorthing = UTMNorthing + 10000000.0; # 10000000 meter offset for southern hemisphere - return (UTMZone, UTMEasting, UTMNorthing) - - -def _UTMLetterDesignator(Lat): - """This routine determines the correct UTM letter designator for the given - latitude returns 'Z' if latitude is outside the UTM limits of 84N to 80S - Written by Chuck Gantz- chuck.gantz@globalstar.com""" - - if 84 >= Lat >= 72: - return 'X' - elif 72 > Lat >= 64: - return 'W' - elif 64 > Lat >= 56: - return 'V' - elif 56 > Lat >= 48: - return 'U' - elif 48 > Lat >= 40: - return 'T' - elif 40 > Lat >= 32: - return 'S' - elif 32 > Lat >= 24: - return 'R' - elif 24 > Lat >= 16: - return 'Q' - elif 16 > Lat >= 8: - return 'P' - elif 8 > Lat >= 0: - return 'N' - elif 0 > Lat >= -8: - return 'M' - elif -8 > Lat >= -16: - return 'L' - elif -16 > Lat >= -24: - return 'K' - elif -24 > Lat >= -32: - return 'J' - elif -32 > Lat >= -40: - return 'H' - elif -40 > Lat >= -48: - return 'G' - elif -48 > Lat >= -56: - return 'F' - elif -56 > Lat >= -64: - return 'E' - elif -64 > Lat >= -72: - return 'D' - elif -72 > Lat >= -80: - return 'C' - else: - return 'Z' # if the Latitude is outside the UTM limits - - -# void UTMtoLL(int ReferenceEllipsoid, const double UTMNorthing, const double UTMEasting, const char* UTMZone, -# double& Lat, double& Long ) - -def UTMtoLL(ReferenceEllipsoid, northing, easting, zone): - """converts UTM coords to lat/long. Equations from USGS Bulletin 1532 -East Longitudes are positive, West longitudes are negative. -North latitudes are positive, South latitudes are negative -Lat and Long are in decimal degrees. -Written by Chuck Gantz- chuck.gantz@globalstar.com -Converted to Python by Russ Nelson """ - - k0 = 0.9996 - a = _ellipsoid[ReferenceEllipsoid][_EquatorialRadius] - eccSquared = _ellipsoid[ReferenceEllipsoid][_eccentricitySquared] - e1 = (1 - sqrt(1 - eccSquared)) / (1 + sqrt(1 - eccSquared)) - # NorthernHemisphere; //1 for northern hemispher, 0 for southern - - x = easting - 500000.0 # remove 500,000 meter offset for longitude - y = northing - - ZoneLetter = zone[-1] - ZoneNumber = int(zone[:-1]) - if ZoneLetter >= 'N': - NorthernHemisphere = 1 # point is in northern hemisphere - else: - NorthernHemisphere = 0 # point is in southern hemisphere - y -= 10000000.0 # remove 10,000,000 meter offset used for southern hemisphere - - LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3 # +3 puts origin in middle of zone - - eccPrimeSquared = (eccSquared) / (1 - eccSquared) - - M = y / k0 - mu = M / ( - a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256)) - - phi1Rad = (mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * sin(2 * mu) - + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * sin(4 * mu) - + (151 * e1 * e1 * e1 / 96) * sin(6 * mu)) - phi1 = phi1Rad * _rad2deg; - - N1 = a / sqrt(1 - eccSquared * sin(phi1Rad) * sin(phi1Rad)) - T1 = tan(phi1Rad) * tan(phi1Rad) - C1 = eccPrimeSquared * cos(phi1Rad) * cos(phi1Rad) - R1 = a * (1 - eccSquared) / pow(1 - eccSquared * sin(phi1Rad) * sin(phi1Rad), 1.5) - D = x / (N1 * k0) - - Lat = phi1Rad - (N1 * tan(phi1Rad) / R1) * ( - D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 - + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720) - Lat = Lat * _rad2deg - - Long = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + ( - 5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) - * D * D * D * D * D / 120) / cos(phi1Rad) - Long = LongOrigin + Long * _rad2deg - return (Lat, Long) - - -if __name__ == '__main__': - (z, e, n) = LLtoUTM(23, 45.00, -75.00) - print z, e, n - print UTMtoLL(23, n, e, z) diff --git a/daemon/core/misc/nodemaps.py b/daemon/core/misc/nodemaps.py deleted file mode 100644 index 8c3d0c37..00000000 --- a/daemon/core/misc/nodemaps.py +++ /dev/null @@ -1,28 +0,0 @@ -""" -Provides default node maps that can be used to run core with. -""" - -from core.emane.nodes import EmaneNet -from core.emane.nodes import EmaneNode -from core.enumerations import NodeTypes -from core.netns import nodes -from core.netns.vnet import GreTapBridge -from core.phys import pnodes - -# legacy core nodes, that leverage linux bridges -NODES = { - NodeTypes.DEFAULT: nodes.CoreNode, - NodeTypes.PHYSICAL: pnodes.PhysicalNode, - NodeTypes.TBD: None, - NodeTypes.SWITCH: nodes.SwitchNode, - NodeTypes.HUB: nodes.HubNode, - NodeTypes.WIRELESS_LAN: nodes.WlanNode, - NodeTypes.RJ45: nodes.RJ45Node, - NodeTypes.TUNNEL: nodes.TunnelNode, - NodeTypes.KTUNNEL: None, - NodeTypes.EMANE: EmaneNode, - NodeTypes.EMANE_NET: EmaneNet, - NodeTypes.TAP_BRIDGE: GreTapBridge, - NodeTypes.PEER_TO_PEER: nodes.PtpNet, - NodeTypes.CONTROL_NET: nodes.CtrlNet -} diff --git a/daemon/core/misc/quagga.py b/daemon/core/misc/quagga.py deleted file mode 100644 index 9887277d..00000000 --- a/daemon/core/misc/quagga.py +++ /dev/null @@ -1,172 +0,0 @@ -""" -quagga.py: helper class for generating Quagga configuration. -""" - -from string import Template - -from core.misc import utils - - -def addrstr(x): - if x.find(".") >= 0: - return "ip address %s" % x - elif x.find(":") >= 0: - return "ipv6 address %s" % x - else: - raise ValueError("invalid address: %s" % x) - - -class NetIf(object): - """ - Represents a network interface. - """ - - def __init__(self, name, addrlist=None): - """ - Create a NetIf instance. - - :param str name: interface name - :param addrlist: address list for the interface - """ - self.name = name - - if addrlist: - self.addrlist = addrlist - else: - self.addrlist = [] - - -class Conf(object): - """ - Provides a configuration object. - """ - - template = Template("") - - def __init__(self, **kwargs): - """ - Create a Conf instance. - - :param dict kwargs: configuration keyword arguments - """ - self.kwargs = kwargs - - def __str__(self): - """ - Provides a string representation of a configuration object. - - :return: string representation - :rtype: str - """ - tmp = self.template.substitute(**self.kwargs) - if tmp[-1] == "\n": - tmp = tmp[:-1] - return tmp - - -class QuaggaOSPF6Interface(Conf): - """ - Provides quagga ospf6 interface functionality. - """ - AF_IPV6_ID = 0 - AF_IPV4_ID = 65 - - template = Template("""\ -interface $interface - $addr - ipv6 ospf6 instance-id $instanceid - ipv6 ospf6 hello-interval 2 - ipv6 ospf6 dead-interval 11 - ipv6 ospf6 retransmit-interval 5 - ipv6 ospf6 network $network - ipv6 ospf6 diffhellos - ipv6 ospf6 adjacencyconnectivity uniconnected - ipv6 ospf6 lsafullness mincostlsa -""") - - # ip address $ipaddr/32 - # ipv6 ospf6 simhelloLLtoULRecv :$simhelloport - # !$ipaddr:$simhelloport - - def __init__(self, netif, instanceid=AF_IPV4_ID, network="manet-designated-router", **kwargs): - """ - Create a QuaggaOSPF6Interface instance. - - :param netif: network interface - :param int instanceid: instance id - :param network: network - :param dict kwargs: keyword arguments - """ - self.netif = netif - addr = "\n ".join(map(addrstr, netif.addrlist)) - self.instanceid = instanceid - self.network = network - Conf.__init__(self, interface=netif.name, addr=addr, - instanceid=instanceid, network=network, **kwargs) - - def name(self): - """ - Retrieve network interface name. - - :return: network interface name - :rtype: str - """ - return self.netif.name - - -class QuaggaOSPF6(Conf): - """ - Provides quagga ospf6 functionality. - """ - template = Template("""\ -$interfaces -! -router ospf6 - router-id $routerid - $ospfifs - $redistribute -""") - - def __init__(self, ospf6ifs, area, routerid, redistribute="! no redistribute"): - """ - Create a QuaggaOSPF6 instance. - - :param list ospf6ifs: ospf6 interfaces - :param area: area - :param routerid: router id - :param str redistribute: redistribute value - """ - ospf6ifs = utils.make_tuple(ospf6ifs) - interfaces = "\n!\n".join(map(str, ospf6ifs)) - ospfifs = "\n ".join(map(lambda x: "interface %s area %s" % (x.name(), area), ospf6ifs)) - Conf.__init__(self, interfaces=interfaces, routerid=routerid, ospfifs=ospfifs, redistribute=redistribute) - - -class QuaggaConf(Conf): - """ - Provides quagga configuration functionality. - """ - template = Template("""\ -log file $logfile -$debugs -! -$routers -! -$forwarding -""") - - def __init__(self, routers, logfile, debugs=()): - """ - Create a QuaggaConf instance. - - :param list routers: routers - :param str logfile: log file name - :param debugs: debug options - """ - routers = "\n!\n".join(map(str, utils.make_tuple(routers))) - if debugs: - debugs = "\n".join(utils.make_tuple(debugs)) - else: - debugs = "! no debugs" - forwarding = "ip forwarding\nipv6 forwarding" - Conf.__init__(self, logfile=logfile, debugs=debugs, routers=routers, forwarding=forwarding) diff --git a/daemon/core/netns/nodes.py b/daemon/core/netns/nodes.py deleted file mode 100644 index df7b18b4..00000000 --- a/daemon/core/netns/nodes.py +++ /dev/null @@ -1,739 +0,0 @@ -""" -Definition of LxcNode, CoreNode, and other node classes that inherit from the CoreNode, -implementing specific node types. -""" - -import logging -import socket -import threading -from socket import AF_INET -from socket import AF_INET6 - -from core import CoreCommandError -from core import constants -from core.coreobj import PyCoreNetIf -from core.coreobj import PyCoreNode -from core.coreobj import PyCoreObj -from core.data import LinkData -from core.enumerations import LinkTypes -from core.enumerations import NodeTypes -from core.enumerations import RegisterTlvs -from core.misc import ipaddress -from core.misc import utils -from core.netns.vnet import GreTapBridge -from core.netns.vnet import LxBrNet -from core.netns.vnode import LxcNode - - -class CtrlNet(LxBrNet): - """ - Control network functionality. - """ - policy = "ACCEPT" - # base control interface index - CTRLIF_IDX_BASE = 99 - DEFAULT_PREFIX_LIST = [ - "172.16.0.0/24 172.16.1.0/24 172.16.2.0/24 172.16.3.0/24 172.16.4.0/24", - "172.17.0.0/24 172.17.1.0/24 172.17.2.0/24 172.17.3.0/24 172.17.4.0/24", - "172.18.0.0/24 172.18.1.0/24 172.18.2.0/24 172.18.3.0/24 172.18.4.0/24", - "172.19.0.0/24 172.19.1.0/24 172.19.2.0/24 172.19.3.0/24 172.19.4.0/24" - ] - - def __init__(self, session, _id="ctrlnet", name=None, prefix=None, - hostid=None, start=True, assign_address=True, - updown_script=None, serverintf=None): - """ - Creates a CtrlNet instance. - - :param core.session.Session session: core session instance - :param int _id: node id - :param str name: node namee - :param prefix: control network ipv4 prefix - :param hostid: host id - :param bool start: start flag - :param str assign_address: assigned address - :param str updown_script: updown script - :param serverintf: server interface - :return: - """ - self.prefix = ipaddress.Ipv4Prefix(prefix) - self.hostid = hostid - self.assign_address = assign_address - self.updown_script = updown_script - self.serverintf = serverintf - LxBrNet.__init__(self, session, _id=_id, name=name, start=start) - - def startup(self): - """ - Startup functionality for the control network. - - :return: nothing - :raises CoreCommandError: when there is a command exception - """ - if self.detectoldbridge(): - return - - LxBrNet.startup(self) - - if self.hostid: - addr = self.prefix.addr(self.hostid) - else: - addr = self.prefix.max_addr() - - logging.info("added control network bridge: %s %s", self.brname, self.prefix) - - if self.assign_address: - addrlist = ["%s/%s" % (addr, self.prefix.prefixlen)] - self.addrconfig(addrlist=addrlist) - logging.info("address %s", addr) - - if self.updown_script: - logging.info("interface %s updown script (%s startup) called", self.brname, self.updown_script) - utils.check_cmd([self.updown_script, self.brname, "startup"]) - - if self.serverintf: - # sets the interface as a port of the bridge - utils.check_cmd([constants.BRCTL_BIN, "addif", self.brname, self.serverintf]) - - # bring interface up - utils.check_cmd([constants.IP_BIN, "link", "set", self.serverintf, "up"]) - - def detectoldbridge(self): - """ - Occassionally, control net bridges from previously closed sessions are not cleaned up. - Check if there are old control net bridges and delete them - - :return: True if an old bridge was detected, False otherwise - :rtype: bool - """ - status, output = utils.cmd_output([constants.BRCTL_BIN, "show"]) - if status != 0: - logging.error("Unable to retrieve list of installed bridges") - else: - lines = output.split("\n") - for line in lines[1:]: - cols = line.split("\t") - oldbr = cols[0] - flds = cols[0].split(".") - if len(flds) == 3: - if flds[0] == "b" and flds[1] == self.id: - logging.error( - "error: An active control net bridge (%s) found. " - "An older session might still be running. " - "Stop all sessions and, if needed, delete %s to continue.", oldbr, oldbr - ) - return True - return False - - def shutdown(self): - """ - Control network shutdown. - - :return: nothing - """ - if self.serverintf is not None: - try: - utils.check_cmd([constants.BRCTL_BIN, "delif", self.brname, self.serverintf]) - except CoreCommandError: - logging.exception("error deleting server interface %s from bridge %s", self.serverintf, self.brname) - - if self.updown_script is not None: - try: - logging.info("interface %s updown script (%s shutdown) called", self.brname, self.updown_script) - utils.check_cmd([self.updown_script, self.brname, "shutdown"]) - except CoreCommandError: - logging.exception("error issuing shutdown script shutdown") - - LxBrNet.shutdown(self) - - def all_link_data(self, flags): - """ - Do not include CtrlNet in link messages describing this session. - - :param flags: message flags - :return: list of link data - :rtype: list[core.data.LinkData] - """ - return [] - - -class CoreNode(LxcNode): - """ - Basic core node class for nodes to extend. - """ - apitype = NodeTypes.DEFAULT.value - - -class PtpNet(LxBrNet): - """ - Peer to peer network node. - """ - policy = "ACCEPT" - - def attach(self, netif): - """ - Attach a network interface, but limit attachment to two interfaces. - - :param core.netns.vif.VEth netif: network interface - :return: nothing - """ - if len(self._netif) >= 2: - raise ValueError("Point-to-point links support at most 2 network interfaces") - - LxBrNet.attach(self, netif) - - def data(self, message_type, lat=None, lon=None, alt=None): - """ - Do not generate a Node Message for point-to-point links. They are - built using a link message instead. - - :param message_type: purpose for the data object we are creating - :param float lat: latitude - :param float lon: longitude - :param float alt: altitude - :return: node data object - :rtype: core.data.NodeData - """ - return None - - def all_link_data(self, flags): - """ - Build CORE API TLVs for a point-to-point link. One Link message - describes this network. - - :param flags: message flags - :return: list of link data - :rtype: list[core.data.LinkData] - """ - - all_links = [] - - if len(self._netif) != 2: - return all_links - - if1, if2 = self._netif.values() - - unidirectional = 0 - if if1.getparams() != if2.getparams(): - unidirectional = 1 - - interface1_ip4 = None - interface1_ip4_mask = None - interface1_ip6 = None - interface1_ip6_mask = None - for address in if1.addrlist: - ip, _sep, mask = address.partition("/") - mask = int(mask) - if ipaddress.is_ipv4_address(ip): - family = AF_INET - ipl = socket.inet_pton(family, ip) - interface1_ip4 = ipaddress.IpAddress(af=family, address=ipl) - interface1_ip4_mask = mask - else: - family = AF_INET6 - ipl = socket.inet_pton(family, ip) - interface1_ip6 = ipaddress.IpAddress(af=family, address=ipl) - interface1_ip6_mask = mask - - interface2_ip4 = None - interface2_ip4_mask = None - interface2_ip6 = None - interface2_ip6_mask = None - for address in if2.addrlist: - ip, _sep, mask = address.partition("/") - mask = int(mask) - if ipaddress.is_ipv4_address(ip): - family = AF_INET - ipl = socket.inet_pton(family, ip) - interface2_ip4 = ipaddress.IpAddress(af=family, address=ipl) - interface2_ip4_mask = mask - else: - family = AF_INET6 - ipl = socket.inet_pton(family, ip) - interface2_ip6 = ipaddress.IpAddress(af=family, address=ipl) - interface2_ip6_mask = mask - - link_data = LinkData( - message_type=flags, - node1_id=if1.node.id, - node2_id=if2.node.id, - link_type=self.linktype, - unidirectional=unidirectional, - delay=if1.getparam("delay"), - bandwidth=if1.getparam("bw"), - dup=if1.getparam("duplicate"), - jitter=if1.getparam("jitter"), - interface1_id=if1.node.getifindex(if1), - interface1_mac=if1.hwaddr, - interface1_ip4=interface1_ip4, - interface1_ip4_mask=interface1_ip4_mask, - interface1_ip6=interface1_ip6, - interface1_ip6_mask=interface1_ip6_mask, - interface2_id=if2.node.getifindex(if2), - interface2_mac=if2.hwaddr, - interface2_ip4=interface2_ip4, - interface2_ip4_mask=interface2_ip4_mask, - interface2_ip6=interface2_ip6, - interface2_ip6_mask=interface2_ip6_mask, - ) - - all_links.append(link_data) - - # build a 2nd link message for the upstream link parameters - # (swap if1 and if2) - if unidirectional: - link_data = LinkData( - message_type=0, - node1_id=if2.node.id, - node2_id=if1.node.id, - delay=if1.getparam("delay"), - bandwidth=if1.getparam("bw"), - dup=if1.getparam("duplicate"), - jitter=if1.getparam("jitter"), - unidirectional=1, - interface1_id=if2.node.getifindex(if2), - interface2_id=if1.node.getifindex(if1) - ) - all_links.append(link_data) - - return all_links - - -class SwitchNode(LxBrNet): - """ - Provides switch functionality within a core node. - """ - apitype = NodeTypes.SWITCH.value - policy = "ACCEPT" - type = "lanswitch" - - -class HubNode(LxBrNet): - """ - Provides hub functionality within a core node, forwards packets to all bridge - ports by turning off MAC address learning. - """ - apitype = NodeTypes.HUB.value - policy = "ACCEPT" - type = "hub" - - def __init__(self, session, _id=None, name=None, start=True): - """ - Creates a HubNode instance. - - :param core.session.Session session: core session instance - :param int _id: node id - :param str name: node namee - :param bool start: start flag - :raises CoreCommandError: when there is a command exception - """ - LxBrNet.__init__(self, session, _id, name, start) - - # TODO: move to startup method - if start: - utils.check_cmd([constants.BRCTL_BIN, "setageing", self.brname, "0"]) - - -class WlanNode(LxBrNet): - """ - Provides wireless lan functionality within a core node. - """ - apitype = NodeTypes.WIRELESS_LAN.value - linktype = LinkTypes.WIRELESS.value - policy = "DROP" - type = "wlan" - - def __init__(self, session, _id=None, name=None, start=True, policy=None): - """ - Create a WlanNode instance. - - :param core.session.Session session: core session instance - :param int _id: node id - :param str name: node name - :param bool start: start flag - :param policy: wlan policy - """ - LxBrNet.__init__(self, session, _id, name, start, policy) - # wireless model such as basic range - self.model = None - # mobility model such as scripted - self.mobility = None - - def attach(self, netif): - """ - Attach a network interface. - - :param core.netns.vif.VEth netif: network interface - :return: nothing - """ - LxBrNet.attach(self, netif) - if self.model: - netif.poshook = self.model.position_callback - if netif.node is None: - return - x, y, z = netif.node.position.get() - # invokes any netif.poshook - netif.setposition(x, y, z) - - def setmodel(self, model, config): - """ - Sets the mobility and wireless model. - - :param core.mobility.WirelessModel.cls model: wireless model to set to - :param dict config: configuration for model being set - :return: nothing - """ - logging.info("adding model: %s", model.name) - if model.config_type == RegisterTlvs.WIRELESS.value: - self.model = model(session=self.session, object_id=self.id) - self.model.update_config(config) - if self.model.position_callback: - for netif in self.netifs(): - netif.poshook = self.model.position_callback - if netif.node is not None: - x, y, z = netif.node.position.get() - netif.poshook(netif, x, y, z) - self.model.setlinkparams() - elif model.config_type == RegisterTlvs.MOBILITY.value: - self.mobility = model(session=self.session, object_id=self.id) - self.mobility.update_config(config) - - def update_mobility(self, config): - if not self.mobility: - raise ValueError("no mobility set to update for node(%s)", self.id) - self.mobility.set_configs(config, node_id=self.id) - - def updatemodel(self, config): - if not self.model: - raise ValueError("no model set to update for node(%s)", self.id) - logging.info("node(%s) updating model(%s): %s", self.id, self.model.name, config) - self.model.set_configs(config, node_id=self.id) - if self.model.position_callback: - for netif in self.netifs(): - netif.poshook = self.model.position_callback - if netif.node is not None: - x, y, z = netif.node.position.get() - netif.poshook(netif, x, y, z) - self.model.updateconfig() - - def all_link_data(self, flags): - """ - Retrieve all link data. - - :param flags: message flags - :return: list of link data - :rtype: list[core.data.LinkData] - """ - all_links = LxBrNet.all_link_data(self, flags) - - if self.model: - all_links.extend(self.model.all_link_data(flags)) - - return all_links - - -class RJ45Node(PyCoreNode, PyCoreNetIf): - """ - RJ45Node is a physical interface on the host linked to the emulated - network. - """ - apitype = NodeTypes.RJ45.value - type = "rj45" - - def __init__(self, session, _id=None, name=None, mtu=1500, start=True): - """ - Create an RJ45Node instance. - - :param core.session.Session session: core session instance - :param int _id: node id - :param str name: node name - :param mtu: rj45 mtu - :param bool start: start flag - :return: - """ - PyCoreNode.__init__(self, session, _id, name, start=start) - PyCoreNetIf.__init__(self, node=self, name=name, mtu=mtu) - self.up = False - self.lock = threading.RLock() - self.ifindex = None - # the following are PyCoreNetIf attributes - self.transport_type = "raw" - self.localname = name - self.old_up = False - self.old_addrs = [] - - if start: - self.startup() - - def startup(self): - """ - Set the interface in the up state. - - :return: nothing - :raises CoreCommandError: when there is a command exception - """ - # interface will also be marked up during net.attach() - self.savestate() - utils.check_cmd([constants.IP_BIN, "link", "set", self.localname, "up"]) - self.up = True - - def shutdown(self): - """ - Bring the interface down. Remove any addresses and queuing - disciplines. - - :return: nothing - """ - if not self.up: - return - - try: - utils.check_cmd([constants.IP_BIN, "link", "set", self.localname, "down"]) - utils.check_cmd([constants.IP_BIN, "addr", "flush", "dev", self.localname]) - utils.check_cmd([constants.TC_BIN, "qdisc", "del", "dev", self.localname, "root"]) - except CoreCommandError: - logging.exception("error shutting down") - - self.up = False - self.restorestate() - - # TODO: issue in that both classes inherited from provide the same method with different signatures - def attachnet(self, net): - """ - Attach a network. - - :param core.coreobj.PyCoreNet net: network to attach - :return: nothing - """ - PyCoreNetIf.attachnet(self, net) - - # TODO: issue in that both classes inherited from provide the same method with different signatures - def detachnet(self): - """ - Detach a network. - - :return: nothing - """ - PyCoreNetIf.detachnet(self) - - def newnetif(self, net=None, addrlist=None, hwaddr=None, ifindex=None, ifname=None): - """ - This is called when linking with another node. Since this node - represents an interface, we do not create another object here, - but attach ourselves to the given network. - - :param core.coreobj.PyCoreNet net: new network instance - :param list[str] addrlist: address list - :param str hwaddr: hardware address - :param int ifindex: interface index - :param str ifname: interface name - :return: interface index - :rtype: int - :raises ValueError: when an interface has already been created, one max - """ - with self.lock: - if ifindex is None: - ifindex = 0 - - if self.net is not None: - raise ValueError("RJ45 nodes support at most 1 network interface") - - self._netif[ifindex] = self - # PyCoreNetIf.node is self - self.node = self - self.ifindex = ifindex - - if net is not None: - self.attachnet(net) - - if addrlist: - for addr in utils.make_tuple(addrlist): - self.addaddr(addr) - - return ifindex - - def delnetif(self, ifindex): - """ - Delete a network interface. - - :param int ifindex: interface index to delete - :return: nothing - """ - if ifindex is None: - ifindex = 0 - - self._netif.pop(ifindex) - - if ifindex == self.ifindex: - self.shutdown() - else: - raise ValueError("ifindex %s does not exist" % ifindex) - - def netif(self, ifindex, net=None): - """ - This object is considered the network interface, so we only - return self here. This keeps the RJ45Node compatible with - real nodes. - - :param int ifindex: interface index to retrieve - :param net: network to retrieve - :return: a network interface - :rtype: core.coreobj.PyCoreNetIf - """ - if net is not None and net == self.net: - return self - - if ifindex is None: - ifindex = 0 - - if ifindex == self.ifindex: - return self - - return None - - def getifindex(self, netif): - """ - Retrieve network interface index. - - :param core.coreobj.PyCoreNetIf netif: network interface to retrieve index for - :return: interface index, None otherwise - :rtype: int - """ - if netif != self: - return None - - return self.ifindex - - def addaddr(self, addr): - """ - Add address to to network interface. - - :param str addr: address to add - :return: nothing - :raises CoreCommandError: when there is a command exception - """ - if self.up: - utils.check_cmd([constants.IP_BIN, "addr", "add", str(addr), "dev", self.name]) - - PyCoreNetIf.addaddr(self, addr) - - def deladdr(self, addr): - """ - Delete address from network interface. - - :param str addr: address to delete - :return: nothing - :raises CoreCommandError: when there is a command exception - """ - if self.up: - utils.check_cmd([constants.IP_BIN, "addr", "del", str(addr), "dev", self.name]) - - PyCoreNetIf.deladdr(self, addr) - - def savestate(self): - """ - Save the addresses and other interface state before using the - interface for emulation purposes. TODO: save/restore the PROMISC flag - - :return: nothing - :raises CoreCommandError: when there is a command exception - """ - self.old_up = False - self.old_addrs = [] - args = [constants.IP_BIN, "addr", "show", "dev", self.localname] - output = utils.check_cmd(args) - for line in output.split("\n"): - items = line.split() - if len(items) < 2: - continue - - if items[1] == "%s:" % self.localname: - flags = items[2][1:-1].split(",") - if "UP" in flags: - self.old_up = True - elif items[0] == "inet": - self.old_addrs.append((items[1], items[3])) - elif items[0] == "inet6": - if items[1][:4] == "fe80": - continue - self.old_addrs.append((items[1], None)) - - def restorestate(self): - """ - Restore the addresses and other interface state after using it. - - :return: nothing - :raises CoreCommandError: when there is a command exception - """ - for addr in self.old_addrs: - if addr[1] is None: - utils.check_cmd([constants.IP_BIN, "addr", "add", addr[0], "dev", self.localname]) - else: - utils.check_cmd([constants.IP_BIN, "addr", "add", addr[0], "brd", addr[1], "dev", self.localname]) - - if self.old_up: - utils.check_cmd([constants.IP_BIN, "link", "set", self.localname, "up"]) - - def setposition(self, x=None, y=None, z=None): - """ - Uses setposition from both parent classes. - - :param float x: x position - :param float y: y position - :param float z: z position - :return: True if position changed, False otherwise - :rtype: bool - """ - result = PyCoreObj.setposition(self, x, y, z) - PyCoreNetIf.setposition(self, x, y, z) - return result - - def check_cmd(self, args): - """ - Runs shell command on node. - - :param list[str]|str args: command to run - :return: exist status and combined stdout and stderr - :rtype: tuple[int, str] - :raises CoreCommandError: when a non-zero exit status occurs - """ - raise NotImplementedError - - def cmd(self, args, wait=True): - """ - Runs shell command on node, with option to not wait for a result. - - :param list[str]|str args: command to run - :param bool wait: wait for command to exit, defaults to True - :return: exit status for command - :rtype: int - """ - raise NotImplementedError - - def cmd_output(self, args): - """ - Runs shell command on node and get exit status and output. - - :param list[str]|str args: command to run - :return: exit status and combined stdout and stderr - :rtype: tuple[int, str] - """ - raise NotImplementedError - - def termcmdstring(self, sh): - """ - Create a terminal command string. - - :param str sh: shell to execute command in - :return: str - """ - raise NotImplementedError - - -class TunnelNode(GreTapBridge): - """ - Provides tunnel functionality in a core node. - """ - apitype = NodeTypes.TUNNEL.value - policy = "ACCEPT" - type = "tunnel" diff --git a/daemon/core/netns/vnode.py b/daemon/core/netns/vnode.py deleted file mode 100644 index d56418d0..00000000 --- a/daemon/core/netns/vnode.py +++ /dev/null @@ -1,609 +0,0 @@ -""" -PyCoreNode and LxcNode classes that implement the network namespac virtual node. -""" - -import errno -import logging -import os -import random -import shutil -import signal -import string -import threading - -from core import CoreCommandError -from core import constants -from core.coreobj import PyCoreNetIf -from core.coreobj import PyCoreNode -from core.enumerations import NodeTypes -from core.misc import nodeutils -from core.misc import utils -from core.misc.ipaddress import MacAddress -from core.netns import vnodeclient -from core.netns.vif import TunTap -from core.netns.vif import VEth - -_DEFAULT_MTU = 1500 - -utils.check_executables([constants.IP_BIN]) - - -class SimpleLxcNode(PyCoreNode): - """ - Provides simple lxc functionality for core nodes. - - :var nodedir: str - :var ctrlchnlname: str - :var client: core.netns.vnodeclient.VnodeClient - :var pid: int - :var up: bool - :var lock: threading.RLock - :var _mounts: list[tuple[str, str]] - """ - valid_address_types = {"inet", "inet6", "inet6link"} - - def __init__(self, session, _id=None, name=None, nodedir=None, start=True): - """ - Create a SimpleLxcNode instance. - - :param core.session.Session session: core session instance - :param int _id: object id - :param str name: object name - :param str nodedir: node directory - :param bool start: start flag - """ - PyCoreNode.__init__(self, session, _id, name, start=start) - self.nodedir = nodedir - self.ctrlchnlname = os.path.abspath(os.path.join(self.session.session_dir, self.name)) - self.client = None - self.pid = None - self.up = False - self.lock = threading.RLock() - self._mounts = [] - - def alive(self): - """ - Check if the node is alive. - - :return: True if node is alive, False otherwise - :rtype: bool - """ - try: - os.kill(self.pid, 0) - except OSError: - return False - - return True - - def startup(self): - """ - Start a new namespace node by invoking the vnoded process that - allocates a new namespace. Bring up the loopback device and set - the hostname. - - :return: nothing - """ - if self.up: - raise ValueError("starting a node that is already up") - - # create a new namespace for this node using vnoded - vnoded = [ - constants.VNODED_BIN, - "-v", - "-c", self.ctrlchnlname, - "-l", self.ctrlchnlname + ".log", - "-p", self.ctrlchnlname + ".pid" - ] - if self.nodedir: - vnoded += ["-C", self.nodedir] - env = self.session.get_environment(state=False) - env["NODE_NUMBER"] = str(self.id) - env["NODE_NAME"] = str(self.name) - - output = utils.check_cmd(vnoded, env=env) - self.pid = int(output) - - # create vnode client - self.client = vnodeclient.VnodeClient(self.name, self.ctrlchnlname) - - # bring up the loopback interface - logging.debug("bringing up loopback interface") - self.check_cmd([constants.IP_BIN, "link", "set", "lo", "up"]) - - # set hostname for node - logging.debug("setting hostname: %s", self.name) - self.check_cmd(["hostname", self.name]) - - # mark node as up - self.up = True - - def shutdown(self): - """ - Shutdown logic for simple lxc nodes. - - :return: nothing - """ - # nothing to do if node is not up - if not self.up: - return - - # unmount all targets (NOTE: non-persistent mount namespaces are - # removed by the kernel when last referencing process is killed) - self._mounts = [] - - # shutdown all interfaces - for netif in self.netifs(): - netif.shutdown() - - # attempt to kill node process and wait for termination of children - try: - os.kill(self.pid, signal.SIGTERM) - os.waitpid(self.pid, 0) - except OSError as e: - if e.errno != 10: - logging.exception("error killing process") - - # remove node directory if present - try: - os.unlink(self.ctrlchnlname) - except OSError as e: - # no such file or directory - if e.errno != errno.ENOENT: - logging.exception("error removing node directory") - - # clear interface data, close client, and mark self and not up - self._netif.clear() - self.client.close() - self.up = False - - def cmd(self, args, wait=True): - """ - Runs shell command on node, with option to not wait for a result. - - :param list[str]|str args: command to run - :param bool wait: wait for command to exit, defaults to True - :return: exit status for command - :rtype: int - """ - return self.client.cmd(args, wait) - - def cmd_output(self, args): - """ - Runs shell command on node and get exit status and output. - - :param list[str]|str args: command to run - :return: exit status and combined stdout and stderr - :rtype: tuple[int, str] - """ - return self.client.cmd_output(args) - - def check_cmd(self, args): - """ - Runs shell command on node. - - :param list[str]|str args: command to run - :return: combined stdout and stderr - :rtype: str - :raises CoreCommandError: when a non-zero exit status occurs - """ - return self.client.check_cmd(args) - - def termcmdstring(self, sh="/bin/sh"): - """ - Create a terminal command string. - - :param str sh: shell to execute command in - :return: str - """ - return self.client.termcmdstring(sh) - - def mount(self, source, target): - """ - Create and mount a directory. - - :param str source: source directory to mount - :param str target: target directory to create - :return: nothing - :raises CoreCommandError: when a non-zero exit status occurs - """ - source = os.path.abspath(source) - logging.info("node(%s) mounting: %s at %s", self.name, source, target) - cmd = 'mkdir -p "%s" && %s -n --bind "%s" "%s"' % (target, constants.MOUNT_BIN, source, target) - status, output = self.client.shcmd_result(cmd) - if status: - raise CoreCommandError(status, cmd, output) - self._mounts.append((source, target)) - - def newifindex(self): - """ - Retrieve a new interface index. - - :return: new interface index - :rtype: int - """ - with self.lock: - return super(SimpleLxcNode, self).newifindex() - - def newveth(self, ifindex=None, ifname=None, net=None): - """ - Create a new interface. - - :param int ifindex: index for the new interface - :param str ifname: name for the new interface - :param net: network to associate interface with - :return: nothing - """ - with self.lock: - if ifindex is None: - ifindex = self.newifindex() - - if ifname is None: - ifname = "eth%d" % ifindex - - sessionid = self.session.short_session_id() - - try: - suffix = "%x.%s.%s" % (self.id, ifindex, sessionid) - except TypeError: - suffix = "%s.%s.%s" % (self.id, ifindex, sessionid) - - localname = "veth" + suffix - if len(localname) >= 16: - raise ValueError("interface local name (%s) too long" % localname) - - name = localname + "p" - if len(name) >= 16: - raise ValueError("interface name (%s) too long" % name) - - veth = VEth(node=self, name=name, localname=localname, net=net, start=self.up) - - if self.up: - utils.check_cmd([constants.IP_BIN, "link", "set", veth.name, "netns", str(self.pid)]) - self.check_cmd([constants.IP_BIN, "link", "set", veth.name, "name", ifname]) - - veth.name = ifname - - if self.up: - # TODO: potentially find better way to query interface ID - # retrieve interface information - output = self.check_cmd(["ip", "link", "show", veth.name]) - logging.debug("interface command output: %s", output) - output = output.split("\n") - veth.flow_id = int(output[0].strip().split(":")[0]) + 1 - logging.debug("interface flow index: %s - %s", veth.name, veth.flow_id) - veth.hwaddr = MacAddress.from_string(output[1].strip().split()[1]) - logging.debug("interface mac: %s - %s", veth.name, veth.hwaddr) - - try: - self.addnetif(veth, ifindex) - except ValueError as e: - veth.shutdown() - del veth - raise e - - return ifindex - - def newtuntap(self, ifindex=None, ifname=None, net=None): - """ - Create a new tunnel tap. - - :param int ifindex: interface index - :param str ifname: interface name - :param net: network to associate with - :return: interface index - :rtype: int - """ - with self.lock: - if ifindex is None: - ifindex = self.newifindex() - - if ifname is None: - ifname = "eth%d" % ifindex - - sessionid = self.session.short_session_id() - localname = "tap%s.%s.%s" % (self.id, ifindex, sessionid) - name = ifname - tuntap = TunTap(node=self, name=name, localname=localname, net=net, start=self.up) - - try: - self.addnetif(tuntap, ifindex) - except ValueError as e: - tuntap.shutdown() - del tuntap - raise e - - return ifindex - - def sethwaddr(self, ifindex, addr): - """ - Set hardware addres for an interface. - - :param int ifindex: index of interface to set hardware address for - :param core.misc.ipaddress.MacAddress addr: hardware address to set - :return: nothing - :raises CoreCommandError: when a non-zero exit status occurs - """ - self._netif[ifindex].sethwaddr(addr) - if self.up: - args = [constants.IP_BIN, "link", "set", "dev", self.ifname(ifindex), "address", str(addr)] - self.check_cmd(args) - - def addaddr(self, ifindex, addr): - """ - Add interface address. - - :param int ifindex: index of interface to add address to - :param str addr: address to add to interface - :return: nothing - """ - if self.up: - # check if addr is ipv6 - if ":" in str(addr): - args = [constants.IP_BIN, "addr", "add", str(addr), "dev", self.ifname(ifindex)] - self.check_cmd(args) - else: - args = [constants.IP_BIN, "addr", "add", str(addr), "broadcast", "+", "dev", self.ifname(ifindex)] - self.check_cmd(args) - - self._netif[ifindex].addaddr(addr) - - def deladdr(self, ifindex, addr): - """ - Delete address from an interface. - - :param int ifindex: index of interface to delete address from - :param str addr: address to delete from interface - :return: nothing - :raises CoreCommandError: when a non-zero exit status occurs - """ - try: - self._netif[ifindex].deladdr(addr) - except ValueError: - logging.exception("trying to delete unknown address: %s" % addr) - - if self.up: - self.check_cmd([constants.IP_BIN, "addr", "del", str(addr), "dev", self.ifname(ifindex)]) - - def delalladdr(self, ifindex, address_types=None): - """ - Delete all addresses from an interface. - - :param int ifindex: index of interface to delete address types from - :param tuple[str] address_types: address types to delete - :return: nothing - :raises CoreCommandError: when a non-zero exit status occurs - """ - if not address_types: - address_types = self.valid_address_types - - interface_name = self.ifname(ifindex) - addresses = self.client.getaddr(interface_name, rescan=True) - - for address_type in address_types: - if address_type not in self.valid_address_types: - raise ValueError("addr type must be in: %s" % " ".join(self.valid_address_types)) - for address in addresses[address_type]: - self.deladdr(ifindex, address) - - # update cached information - self.client.getaddr(interface_name, rescan=True) - - def ifup(self, ifindex): - """ - Bring an interface up. - - :param int ifindex: index of interface to bring up - :return: nothing - """ - if self.up: - self.check_cmd([constants.IP_BIN, "link", "set", self.ifname(ifindex), "up"]) - - def newnetif(self, net=None, addrlist=None, hwaddr=None, ifindex=None, ifname=None): - """ - Create a new network interface. - - :param net: network to associate with - :param list addrlist: addresses to add on the interface - :param core.misc.ipaddress.MacAddress hwaddr: hardware address to set for interface - :param int ifindex: index of interface to create - :param str ifname: name for interface - :return: interface index - :rtype: int - """ - if not addrlist: - addrlist = [] - - with self.lock: - # TODO: see if you can move this to emane specific code - if nodeutils.is_node(net, NodeTypes.EMANE): - ifindex = self.newtuntap(ifindex=ifindex, ifname=ifname, net=net) - # TUN/TAP is not ready for addressing yet; the device may - # take some time to appear, and installing it into a - # namespace after it has been bound removes addressing; - # save addresses with the interface now - self.attachnet(ifindex, net) - netif = self.netif(ifindex) - netif.sethwaddr(hwaddr) - for address in utils.make_tuple(addrlist): - netif.addaddr(address) - return ifindex - else: - ifindex = self.newveth(ifindex=ifindex, ifname=ifname, net=net) - - if net is not None: - self.attachnet(ifindex, net) - - if hwaddr: - self.sethwaddr(ifindex, hwaddr) - - for address in utils.make_tuple(addrlist): - self.addaddr(ifindex, address) - - self.ifup(ifindex) - return ifindex - - def connectnode(self, ifname, othernode, otherifname): - """ - Connect a node. - - :param str ifname: name of interface to connect - :param core.netns.nodes.LxcNode othernode: node to connect to - :param str otherifname: interface name to connect to - :return: nothing - """ - tmplen = 8 - tmp1 = "tmp." + "".join([random.choice(string.ascii_lowercase) for _ in xrange(tmplen)]) - tmp2 = "tmp." + "".join([random.choice(string.ascii_lowercase) for _ in xrange(tmplen)]) - utils.check_cmd([constants.IP_BIN, "link", "add", "name", tmp1, "type", "veth", "peer", "name", tmp2]) - - utils.check_cmd([constants.IP_BIN, "link", "set", tmp1, "netns", str(self.pid)]) - self.check_cmd([constants.IP_BIN, "link", "set", tmp1, "name", ifname]) - interface = PyCoreNetIf(node=self, name=ifname, mtu=_DEFAULT_MTU) - self.addnetif(interface, self.newifindex()) - - utils.check_cmd([constants.IP_BIN, "link", "set", tmp2, "netns", str(othernode.pid)]) - othernode.check_cmd([constants.IP_BIN, "link", "set", tmp2, "name", otherifname]) - other_interface = PyCoreNetIf(node=othernode, name=otherifname, mtu=_DEFAULT_MTU) - othernode.addnetif(other_interface, othernode.newifindex()) - - def addfile(self, srcname, filename): - """ - Add a file. - - :param str srcname: source file name - :param str filename: file name to add - :return: nothing - :raises CoreCommandError: when a non-zero exit status occurs - """ - logging.info("adding file from %s to %s", srcname, filename) - directory = os.path.dirname(filename) - - cmd = 'mkdir -p "%s" && mv "%s" "%s" && sync' % (directory, srcname, filename) - status, output = self.client.shcmd_result(cmd) - if status: - raise CoreCommandError(status, cmd, output) - - -class LxcNode(SimpleLxcNode): - """ - Provides lcx node functionality for core nodes. - """ - - def __init__(self, session, _id=None, name=None, nodedir=None, bootsh="boot.sh", start=True): - """ - Create a LxcNode instance. - - :param core.session.Session session: core session instance - :param int _id: object id - :param str name: object name - :param str nodedir: node directory - :param bootsh: boot shell - :param bool start: start flag - """ - super(LxcNode, self).__init__(session=session, _id=_id, name=name, nodedir=nodedir, start=start) - self.bootsh = bootsh - if start: - self.startup() - - def startup(self): - """ - Startup logic for the node. - - :return: nothing - """ - with self.lock: - self.makenodedir() - super(LxcNode, self).startup() - self.privatedir("/var/run") - self.privatedir("/var/log") - - def shutdown(self): - """ - Shutdown logic for the node. - - :return: nothing - """ - if not self.up: - return - - with self.lock: - try: - super(LxcNode, self).shutdown() - except OSError: - logging.exception("error during shutdown") - finally: - self.rmnodedir() - - def privatedir(self, path): - """ - Create a private directory. - - :param str path: path to create - :return: nothing - """ - if path[0] != "/": - raise ValueError("path not fully qualified: %s" % path) - hostpath = os.path.join(self.nodedir, os.path.normpath(path).strip("/").replace("/", ".")) - os.mkdir(hostpath) - self.mount(hostpath, path) - - def hostfilename(self, filename): - """ - Return the name of a node"s file on the host filesystem. - - :param str filename: host file name - :return: path to file - """ - dirname, basename = os.path.split(filename) - if not basename: - raise ValueError("no basename for filename: %s" % filename) - if dirname and dirname[0] == "/": - dirname = dirname[1:] - dirname = dirname.replace("/", ".") - dirname = os.path.join(self.nodedir, dirname) - return os.path.join(dirname, basename) - - def opennodefile(self, filename, mode="w"): - """ - Open a node file, within it"s directory. - - :param str filename: file name to open - :param str mode: mode to open file in - :return: open file - :rtype: file - """ - hostfilename = self.hostfilename(filename) - dirname, _basename = os.path.split(hostfilename) - if not os.path.isdir(dirname): - os.makedirs(dirname, mode=0755) - return open(hostfilename, mode) - - def nodefile(self, filename, contents, mode=0644): - """ - Create a node file with a given mode. - - :param str filename: name of file to create - :param contents: contents of file - :param int mode: mode for file - :return: nothing - """ - with self.opennodefile(filename, "w") as open_file: - open_file.write(contents) - os.chmod(open_file.name, mode) - logging.info("node(%s) added file: %s; mode: 0%o", self.name, open_file.name, mode) - - def nodefilecopy(self, filename, srcfilename, mode=None): - """ - Copy a file to a node, following symlinks and preserving metadata. - Change file mode if specified. - - :param str filename: file name to copy file to - :param str srcfilename: file to copy - :param int mode: mode to copy to - :return: nothing - """ - hostfilename = self.hostfilename(filename) - shutil.copy2(srcfilename, hostfilename) - if mode is not None: - os.chmod(hostfilename, mode) - logging.info("node(%s) copied file: %s; mode: %s", self.name, hostfilename, mode) diff --git a/daemon/core/phys/__init__.py b/daemon/core/nodes/__init__.py similarity index 100% rename from daemon/core/phys/__init__.py rename to daemon/core/nodes/__init__.py diff --git a/daemon/core/nodes/base.py b/daemon/core/nodes/base.py new file mode 100644 index 00000000..a5d5a70a --- /dev/null +++ b/daemon/core/nodes/base.py @@ -0,0 +1,1158 @@ +""" +PyCoreNode and LxcNode classes that implement the network namespac virtual node. +""" + +import errno +import logging +import os +import random +import shutil +import signal +import socket +import string +import threading +from socket import AF_INET, AF_INET6 + +from core import CoreCommandError, utils +from core import constants +from core.emulator.data import NodeData, LinkData +from core.emulator.enumerations import NodeTypes, LinkTypes +from core.nodes.ipaddress import MacAddress +from core.nodes import client, nodeutils, ipaddress +from core.nodes.interface import TunTap, CoreInterface +from core.nodes.interface import Veth + +_DEFAULT_MTU = 1500 + +utils.check_executables([constants.IP_BIN]) + + +class NodeBase(object): + """ + Base class for CORE nodes (nodes and networks) + """ + apitype = None + + # TODO: appears start has no usage, verify and remove + def __init__(self, session, _id=None, name=None, start=True): + """ + Creates a PyCoreObj instance. + + :param core.session.Session session: CORE session object + :param int _id: id + :param str name: object name + :param bool start: start value + :return: + """ + + self.session = session + if _id is None: + _id = session.get_node_id() + self.id = _id + if name is None: + name = "o%s" % self.id + self.name = name + self.type = None + self.server = None + self.services = None + # ifindex is key, PyCoreNetIf instance is value + self._netif = {} + self.ifindex = 0 + self.canvas = None + self.icon = None + self.opaque = None + self.position = Position() + + def startup(self): + """ + Each object implements its own startup method. + + :return: nothing + """ + raise NotImplementedError + + def shutdown(self): + """ + Each object implements its own shutdown method. + + :return: nothing + """ + raise NotImplementedError + + def setposition(self, x=None, y=None, z=None): + """ + Set the (x,y,z) position of the object. + + :param float x: x position + :param float y: y position + :param float z: z position + :return: True if position changed, False otherwise + :rtype: bool + """ + return self.position.set(x=x, y=y, z=z) + + def getposition(self): + """ + Return an (x,y,z) tuple representing this object's position. + + :return: x,y,z position tuple + :rtype: tuple + """ + return self.position.get() + + def ifname(self, ifindex): + """ + Retrieve interface name for index. + + :param int ifindex: interface index + :return: interface name + :rtype: str + """ + return self._netif[ifindex].name + + def netifs(self, sort=False): + """ + Retrieve network interfaces, sorted if desired. + + :param bool sort: boolean used to determine if interfaces should be sorted + :return: network interfaces + :rtype: list + """ + if sort: + return map(lambda k: self._netif[k], sorted(self._netif.keys())) + else: + return self._netif.itervalues() + + def numnetif(self): + """ + Return the attached interface count. + + :return: number of network interfaces + :rtype: int + """ + return len(self._netif) + + def getifindex(self, netif): + """ + Retrieve index for an interface. + + :param core.nodes.interface.CoreInterface netif: interface to get index for + :return: interface index if found, -1 otherwise + :rtype: int + """ + + for ifindex in self._netif: + if self._netif[ifindex] is netif: + return ifindex + + return -1 + + def newifindex(self): + """ + Create a new interface index. + + :return: interface index + :rtype: int + """ + while self.ifindex in self._netif: + self.ifindex += 1 + ifindex = self.ifindex + self.ifindex += 1 + return ifindex + + def data(self, message_type, lat=None, lon=None, alt=None): + """ + Build a data object for this node. + + :param message_type: purpose for the data object we are creating + :param str lat: latitude + :param str lon: longitude + :param str alt: altitude + :return: node data object + :rtype: core.data.NodeData + """ + if self.apitype is None: + return None + + x, y, _ = self.getposition() + model = self.type + emulation_server = self.server + + services = self.services + if services is not None: + services = "|".join([service.name for service in services]) + + node_data = NodeData( + message_type=message_type, + id=self.id, + node_type=self.apitype, + name=self.name, + emulation_id=self.id, + canvas=self.canvas, + icon=self.icon, + opaque=self.opaque, + x_position=x, + y_position=y, + latitude=lat, + longitude=lon, + altitude=alt, + model=model, + emulation_server=emulation_server, + services=services + ) + + return node_data + + def all_link_data(self, flags): + """ + Build CORE Link data for this object. There is no default + method for PyCoreObjs as PyCoreNodes do not implement this but + PyCoreNets do. + + :param flags: message flags + :return: list of link data + :rtype: core.data.LinkData + """ + return [] + + +class CoreNodeBase(NodeBase): + """ + Base class for CORE nodes. + """ + + def __init__(self, session, _id=None, name=None, start=True): + """ + Create a CoreNodeBase instance. + + :param core.session.Session session: CORE session object + :param int _id: object id + :param str name: object name + :param bool start: boolean for starting + """ + super(CoreNodeBase, self).__init__(session, _id, name, start=start) + self.services = [] + self.nodedir = None + self.tmpnodedir = False + + def addservice(self, service): + """ + Add a services to the service list. + + :param core.services.coreservices.CoreService service: service to add + :return: nothing + """ + if service is not None: + self.services.append(service) + + def makenodedir(self): + """ + Create the node directory. + + :return: nothing + """ + if self.nodedir is None: + self.nodedir = os.path.join(self.session.session_dir, self.name + ".conf") + os.makedirs(self.nodedir) + self.tmpnodedir = True + else: + self.tmpnodedir = False + + def rmnodedir(self): + """ + Remove the node directory, unless preserve directory has been set. + + :return: nothing + """ + preserve = self.session.options.get_config("preservedir") == "1" + if preserve: + return + + if self.tmpnodedir: + shutil.rmtree(self.nodedir, ignore_errors=True) + + def addnetif(self, netif, ifindex): + """ + Add network interface to node and set the network interface index if successful. + + :param core.nodes.interface.CoreInterface netif: network interface to add + :param int ifindex: interface index + :return: nothing + """ + if ifindex in self._netif: + raise ValueError("ifindex %s already exists" % ifindex) + self._netif[ifindex] = netif + # TODO: this should have probably been set ahead, seems bad to me, check for failure and fix + netif.netindex = ifindex + + def delnetif(self, ifindex): + """ + Delete a network interface + + :param int ifindex: interface index to delete + :return: nothing + """ + if ifindex not in self._netif: + raise ValueError("ifindex %s does not exist" % ifindex) + netif = self._netif.pop(ifindex) + netif.shutdown() + del netif + + # TODO: net parameter is not used, remove + def netif(self, ifindex, net=None): + """ + Retrieve network interface. + + :param int ifindex: index of interface to retrieve + :param core.nodes.interface.CoreInterface net: network node + :return: network interface, or None if not found + :rtype: core.nodes.interface.CoreInterface + """ + if ifindex in self._netif: + return self._netif[ifindex] + else: + return None + + def attachnet(self, ifindex, net): + """ + Attach a network. + + :param int ifindex: interface of index to attach + :param core.nodes.interface.CoreInterface net: network to attach + :return: + """ + if ifindex not in self._netif: + raise ValueError("ifindex %s does not exist" % ifindex) + self._netif[ifindex].attachnet(net) + + def detachnet(self, ifindex): + """ + Detach network interface. + + :param int ifindex: interface index to detach + :return: nothing + """ + if ifindex not in self._netif: + raise ValueError("ifindex %s does not exist" % ifindex) + self._netif[ifindex].detachnet() + + def setposition(self, x=None, y=None, z=None): + """ + Set position. + + :param x: x position + :param y: y position + :param z: z position + :return: nothing + """ + changed = super(CoreNodeBase, self).setposition(x, y, z) + if changed: + for netif in self.netifs(sort=True): + netif.setposition(x, y, z) + + def commonnets(self, obj, want_ctrl=False): + """ + Given another node or net object, return common networks between + this node and that object. A list of tuples is returned, with each tuple + consisting of (network, interface1, interface2). + + :param obj: object to get common network with + :param want_ctrl: flag set to determine if control network are wanted + :return: tuples of common networks + :rtype: list + """ + common = [] + for netif1 in self.netifs(): + if not want_ctrl and hasattr(netif1, "control"): + continue + for netif2 in obj.netifs(): + if netif1.net == netif2.net: + common.append((netif1.net, netif1, netif2)) + + return common + + def check_cmd(self, args): + """ + Runs shell command on node. + + :param list[str]|str args: command to run + :return: combined stdout and stderr + :rtype: str + :raises CoreCommandError: when a non-zero exit status occurs + """ + raise NotImplementedError + + def cmd(self, args, wait=True): + """ + Runs shell command on node, with option to not wait for a result. + + :param list[str]|str args: command to run + :param bool wait: wait for command to exit, defaults to True + :return: exit status for command + :rtype: int + """ + raise NotImplementedError + + def cmd_output(self, args): + """ + Runs shell command on node and get exit status and output. + + :param list[str]|str args: command to run + :return: exit status and combined stdout and stderr + :rtype: tuple[int, str] + """ + raise NotImplementedError + + def termcmdstring(self, sh): + """ + Create a terminal command string. + + :param str sh: shell to execute command in + :return: str + """ + raise NotImplementedError + + +class CoreNode(CoreNodeBase): + """ + Provides standard core node logic. + + :var nodedir: str + :var ctrlchnlname: str + :var client: core.netns.vnodeclient.VnodeClient + :var pid: int + :var up: bool + :var lock: threading.RLock + :var _mounts: list[tuple[str, str]] + """ + apitype = NodeTypes.DEFAULT.value + valid_address_types = {"inet", "inet6", "inet6link"} + + def __init__(self, session, _id=None, name=None, nodedir=None, bootsh="boot.sh", start=True): + """ + Create a CoreNode instance. + + :param core.session.Session session: core session instance + :param int _id: object id + :param str name: object name + :param str nodedir: node directory + :param str bootsh: boot shell to use + :param bool start: start flag + """ + super(CoreNode, self).__init__(session, _id, name, start) + self.nodedir = nodedir + self.ctrlchnlname = os.path.abspath(os.path.join(self.session.session_dir, self.name)) + self.client = None + self.pid = None + self.up = False + self.lock = threading.RLock() + self._mounts = [] + self.bootsh = bootsh + if start: + self.startup() + + def alive(self): + """ + Check if the node is alive. + + :return: True if node is alive, False otherwise + :rtype: bool + """ + try: + os.kill(self.pid, 0) + except OSError: + return False + + return True + + def startup(self): + """ + Start a new namespace node by invoking the vnoded process that + allocates a new namespace. Bring up the loopback device and set + the hostname. + + :return: nothing + """ + with self.lock: + self.makenodedir() + if self.up: + raise ValueError("starting a node that is already up") + + # create a new namespace for this node using vnoded + vnoded = [ + constants.VNODED_BIN, + "-v", + "-c", self.ctrlchnlname, + "-l", self.ctrlchnlname + ".log", + "-p", self.ctrlchnlname + ".pid" + ] + if self.nodedir: + vnoded += ["-C", self.nodedir] + env = self.session.get_environment(state=False) + env["NODE_NUMBER"] = str(self.id) + env["NODE_NAME"] = str(self.name) + + output = utils.check_cmd(vnoded, env=env) + self.pid = int(output) + + # create vnode client + self.client = client.VnodeClient(self.name, self.ctrlchnlname) + + # bring up the loopback interface + logging.debug("bringing up loopback interface") + self.check_cmd([constants.IP_BIN, "link", "set", "lo", "up"]) + + # set hostname for node + logging.debug("setting hostname: %s", self.name) + self.check_cmd(["hostname", self.name]) + + # mark node as up + self.up = True + + # create private directories + self.privatedir("/var/run") + self.privatedir("/var/log") + + def shutdown(self): + """ + Shutdown logic for simple lxc nodes. + + :return: nothing + """ + # nothing to do if node is not up + if not self.up: + return + + with self.lock: + try: + # unmount all targets (NOTE: non-persistent mount namespaces are + # removed by the kernel when last referencing process is killed) + self._mounts = [] + + # shutdown all interfaces + for netif in self.netifs(): + netif.shutdown() + + # attempt to kill node process and wait for termination of children + try: + os.kill(self.pid, signal.SIGTERM) + os.waitpid(self.pid, 0) + except OSError as e: + if e.errno != 10: + logging.exception("error killing process") + + # remove node directory if present + try: + os.unlink(self.ctrlchnlname) + except OSError as e: + # no such file or directory + if e.errno != errno.ENOENT: + logging.exception("error removing node directory") + + # clear interface data, close client, and mark self and not up + self._netif.clear() + self.client.close() + self.up = False + except OSError: + logging.exception("error during shutdown") + finally: + self.rmnodedir() + + + def cmd(self, args, wait=True): + """ + Runs shell command on node, with option to not wait for a result. + + :param list[str]|str args: command to run + :param bool wait: wait for command to exit, defaults to True + :return: exit status for command + :rtype: int + """ + return self.client.cmd(args, wait) + + def cmd_output(self, args): + """ + Runs shell command on node and get exit status and output. + + :param list[str]|str args: command to run + :return: exit status and combined stdout and stderr + :rtype: tuple[int, str] + """ + return self.client.cmd_output(args) + + def check_cmd(self, args): + """ + Runs shell command on node. + + :param list[str]|str args: command to run + :return: combined stdout and stderr + :rtype: str + :raises CoreCommandError: when a non-zero exit status occurs + """ + return self.client.check_cmd(args) + + def termcmdstring(self, sh="/bin/sh"): + """ + Create a terminal command string. + + :param str sh: shell to execute command in + :return: str + """ + return self.client.termcmdstring(sh) + + def privatedir(self, path): + """ + Create a private directory. + + :param str path: path to create + :return: nothing + """ + if path[0] != "/": + raise ValueError("path not fully qualified: %s" % path) + hostpath = os.path.join(self.nodedir, os.path.normpath(path).strip("/").replace("/", ".")) + os.mkdir(hostpath) + self.mount(hostpath, path) + + def mount(self, source, target): + """ + Create and mount a directory. + + :param str source: source directory to mount + :param str target: target directory to create + :return: nothing + :raises CoreCommandError: when a non-zero exit status occurs + """ + source = os.path.abspath(source) + logging.info("node(%s) mounting: %s at %s", self.name, source, target) + cmd = 'mkdir -p "%s" && %s -n --bind "%s" "%s"' % (target, constants.MOUNT_BIN, source, target) + status, output = self.client.shcmd_result(cmd) + if status: + raise CoreCommandError(status, cmd, output) + self._mounts.append((source, target)) + + def newifindex(self): + """ + Retrieve a new interface index. + + :return: new interface index + :rtype: int + """ + with self.lock: + return super(CoreNode, self).newifindex() + + def newveth(self, ifindex=None, ifname=None, net=None): + """ + Create a new interface. + + :param int ifindex: index for the new interface + :param str ifname: name for the new interface + :param net: network to associate interface with + :return: nothing + """ + with self.lock: + if ifindex is None: + ifindex = self.newifindex() + + if ifname is None: + ifname = "eth%d" % ifindex + + sessionid = self.session.short_session_id() + + try: + suffix = "%x.%s.%s" % (self.id, ifindex, sessionid) + except TypeError: + suffix = "%s.%s.%s" % (self.id, ifindex, sessionid) + + localname = "veth" + suffix + if len(localname) >= 16: + raise ValueError("interface local name (%s) too long" % localname) + + name = localname + "p" + if len(name) >= 16: + raise ValueError("interface name (%s) too long" % name) + + veth = Veth(node=self, name=name, localname=localname, net=net, start=self.up) + + if self.up: + utils.check_cmd([constants.IP_BIN, "link", "set", veth.name, "netns", str(self.pid)]) + self.check_cmd([constants.IP_BIN, "link", "set", veth.name, "name", ifname]) + + veth.name = ifname + + if self.up: + # TODO: potentially find better way to query interface ID + # retrieve interface information + output = self.check_cmd(["ip", "link", "show", veth.name]) + logging.debug("interface command output: %s", output) + output = output.split("\n") + veth.flow_id = int(output[0].strip().split(":")[0]) + 1 + logging.debug("interface flow index: %s - %s", veth.name, veth.flow_id) + veth.hwaddr = MacAddress.from_string(output[1].strip().split()[1]) + logging.debug("interface mac: %s - %s", veth.name, veth.hwaddr) + + try: + self.addnetif(veth, ifindex) + except ValueError as e: + veth.shutdown() + del veth + raise e + + return ifindex + + def newtuntap(self, ifindex=None, ifname=None, net=None): + """ + Create a new tunnel tap. + + :param int ifindex: interface index + :param str ifname: interface name + :param net: network to associate with + :return: interface index + :rtype: int + """ + with self.lock: + if ifindex is None: + ifindex = self.newifindex() + + if ifname is None: + ifname = "eth%d" % ifindex + + sessionid = self.session.short_session_id() + localname = "tap%s.%s.%s" % (self.id, ifindex, sessionid) + name = ifname + tuntap = TunTap(node=self, name=name, localname=localname, net=net, start=self.up) + + try: + self.addnetif(tuntap, ifindex) + except ValueError as e: + tuntap.shutdown() + del tuntap + raise e + + return ifindex + + def sethwaddr(self, ifindex, addr): + """ + Set hardware addres for an interface. + + :param int ifindex: index of interface to set hardware address for + :param core.misc.ipaddress.MacAddress addr: hardware address to set + :return: nothing + :raises CoreCommandError: when a non-zero exit status occurs + """ + self._netif[ifindex].sethwaddr(addr) + if self.up: + args = [constants.IP_BIN, "link", "set", "dev", self.ifname(ifindex), "address", str(addr)] + self.check_cmd(args) + + def addaddr(self, ifindex, addr): + """ + Add interface address. + + :param int ifindex: index of interface to add address to + :param str addr: address to add to interface + :return: nothing + """ + if self.up: + # check if addr is ipv6 + if ":" in str(addr): + args = [constants.IP_BIN, "addr", "add", str(addr), "dev", self.ifname(ifindex)] + self.check_cmd(args) + else: + args = [constants.IP_BIN, "addr", "add", str(addr), "broadcast", "+", "dev", self.ifname(ifindex)] + self.check_cmd(args) + + self._netif[ifindex].addaddr(addr) + + def deladdr(self, ifindex, addr): + """ + Delete address from an interface. + + :param int ifindex: index of interface to delete address from + :param str addr: address to delete from interface + :return: nothing + :raises CoreCommandError: when a non-zero exit status occurs + """ + try: + self._netif[ifindex].deladdr(addr) + except ValueError: + logging.exception("trying to delete unknown address: %s" % addr) + + if self.up: + self.check_cmd([constants.IP_BIN, "addr", "del", str(addr), "dev", self.ifname(ifindex)]) + + def delalladdr(self, ifindex, address_types=None): + """ + Delete all addresses from an interface. + + :param int ifindex: index of interface to delete address types from + :param tuple[str] address_types: address types to delete + :return: nothing + :raises CoreCommandError: when a non-zero exit status occurs + """ + if not address_types: + address_types = self.valid_address_types + + interface_name = self.ifname(ifindex) + addresses = self.client.getaddr(interface_name, rescan=True) + + for address_type in address_types: + if address_type not in self.valid_address_types: + raise ValueError("addr type must be in: %s" % " ".join(self.valid_address_types)) + for address in addresses[address_type]: + self.deladdr(ifindex, address) + + # update cached information + self.client.getaddr(interface_name, rescan=True) + + def ifup(self, ifindex): + """ + Bring an interface up. + + :param int ifindex: index of interface to bring up + :return: nothing + """ + if self.up: + self.check_cmd([constants.IP_BIN, "link", "set", self.ifname(ifindex), "up"]) + + def newnetif(self, net=None, addrlist=None, hwaddr=None, ifindex=None, ifname=None): + """ + Create a new network interface. + + :param net: network to associate with + :param list addrlist: addresses to add on the interface + :param core.misc.ipaddress.MacAddress hwaddr: hardware address to set for interface + :param int ifindex: index of interface to create + :param str ifname: name for interface + :return: interface index + :rtype: int + """ + if not addrlist: + addrlist = [] + + with self.lock: + # TODO: see if you can move this to emane specific code + if nodeutils.is_node(net, NodeTypes.EMANE): + ifindex = self.newtuntap(ifindex=ifindex, ifname=ifname, net=net) + # TUN/TAP is not ready for addressing yet; the device may + # take some time to appear, and installing it into a + # namespace after it has been bound removes addressing; + # save addresses with the interface now + self.attachnet(ifindex, net) + netif = self.netif(ifindex) + netif.sethwaddr(hwaddr) + for address in utils.make_tuple(addrlist): + netif.addaddr(address) + return ifindex + else: + ifindex = self.newveth(ifindex=ifindex, ifname=ifname, net=net) + + if net is not None: + self.attachnet(ifindex, net) + + if hwaddr: + self.sethwaddr(ifindex, hwaddr) + + for address in utils.make_tuple(addrlist): + self.addaddr(ifindex, address) + + self.ifup(ifindex) + return ifindex + + def connectnode(self, ifname, othernode, otherifname): + """ + Connect a node. + + :param str ifname: name of interface to connect + :param core.netns.nodes.LxcNode othernode: node to connect to + :param str otherifname: interface name to connect to + :return: nothing + """ + tmplen = 8 + tmp1 = "tmp." + "".join([random.choice(string.ascii_lowercase) for _ in xrange(tmplen)]) + tmp2 = "tmp." + "".join([random.choice(string.ascii_lowercase) for _ in xrange(tmplen)]) + utils.check_cmd([constants.IP_BIN, "link", "add", "name", tmp1, "type", "veth", "peer", "name", tmp2]) + + utils.check_cmd([constants.IP_BIN, "link", "set", tmp1, "netns", str(self.pid)]) + self.check_cmd([constants.IP_BIN, "link", "set", tmp1, "name", ifname]) + interface = CoreInterface(node=self, name=ifname, mtu=_DEFAULT_MTU) + self.addnetif(interface, self.newifindex()) + + utils.check_cmd([constants.IP_BIN, "link", "set", tmp2, "netns", str(othernode.pid)]) + othernode.check_cmd([constants.IP_BIN, "link", "set", tmp2, "name", otherifname]) + other_interface = CoreInterface(node=othernode, name=otherifname, mtu=_DEFAULT_MTU) + othernode.addnetif(other_interface, othernode.newifindex()) + + def addfile(self, srcname, filename): + """ + Add a file. + + :param str srcname: source file name + :param str filename: file name to add + :return: nothing + :raises CoreCommandError: when a non-zero exit status occurs + """ + logging.info("adding file from %s to %s", srcname, filename) + directory = os.path.dirname(filename) + + cmd = 'mkdir -p "%s" && mv "%s" "%s" && sync' % (directory, srcname, filename) + status, output = self.client.shcmd_result(cmd) + if status: + raise CoreCommandError(status, cmd, output) + + def hostfilename(self, filename): + """ + Return the name of a node"s file on the host filesystem. + + :param str filename: host file name + :return: path to file + """ + dirname, basename = os.path.split(filename) + if not basename: + raise ValueError("no basename for filename: %s" % filename) + if dirname and dirname[0] == "/": + dirname = dirname[1:] + dirname = dirname.replace("/", ".") + dirname = os.path.join(self.nodedir, dirname) + return os.path.join(dirname, basename) + + def opennodefile(self, filename, mode="w"): + """ + Open a node file, within it"s directory. + + :param str filename: file name to open + :param str mode: mode to open file in + :return: open file + :rtype: file + """ + hostfilename = self.hostfilename(filename) + dirname, _basename = os.path.split(hostfilename) + if not os.path.isdir(dirname): + os.makedirs(dirname, mode=0755) + return open(hostfilename, mode) + + def nodefile(self, filename, contents, mode=0644): + """ + Create a node file with a given mode. + + :param str filename: name of file to create + :param contents: contents of file + :param int mode: mode for file + :return: nothing + """ + with self.opennodefile(filename, "w") as open_file: + open_file.write(contents) + os.chmod(open_file.name, mode) + logging.info("node(%s) added file: %s; mode: 0%o", self.name, open_file.name, mode) + + def nodefilecopy(self, filename, srcfilename, mode=None): + """ + Copy a file to a node, following symlinks and preserving metadata. + Change file mode if specified. + + :param str filename: file name to copy file to + :param str srcfilename: file to copy + :param int mode: mode to copy to + :return: nothing + """ + hostfilename = self.hostfilename(filename) + shutil.copy2(srcfilename, hostfilename) + if mode is not None: + os.chmod(hostfilename, mode) + logging.info("node(%s) copied file: %s; mode: %s", self.name, hostfilename, mode) + + +class CoreNetworkBase(NodeBase): + """ + Base class for networks + """ + linktype = LinkTypes.WIRED.value + + def __init__(self, session, _id, name, start=True): + """ + Create a PyCoreNet instance. + + :param core.session.Session session: CORE session object + :param int _id: object id + :param str name: object name + :param bool start: should object start + """ + super(CoreNetworkBase, self).__init__(session, _id, name, start=start) + self._linked = {} + self._linked_lock = threading.Lock() + + def startup(self): + """ + Each object implements its own startup method. + + :return: nothing + """ + raise NotImplementedError + + def shutdown(self): + """ + Each object implements its own shutdown method. + + :return: nothing + """ + raise NotImplementedError + + def attach(self, netif): + """ + Attach network interface. + + :param core.nodes.interface.CoreInterface netif: network interface to attach + :return: nothing + """ + i = self.newifindex() + self._netif[i] = netif + netif.netifi = i + with self._linked_lock: + self._linked[netif] = {} + + def detach(self, netif): + """ + Detach network interface. + + :param core.nodes.interface.CoreInterface netif: network interface to detach + :return: nothing + """ + del self._netif[netif.netifi] + netif.netifi = None + with self._linked_lock: + del self._linked[netif] + + def all_link_data(self, flags): + """ + Build link data objects for this network. Each link object describes a link + between this network and a node. + """ + all_links = [] + + # build a link message from this network node to each node having a + # connected interface + for netif in self.netifs(sort=True): + if not hasattr(netif, "node"): + continue + linked_node = netif.node + uni = False + if linked_node is None: + # two layer-2 switches/hubs linked together via linknet() + if not hasattr(netif, "othernet"): + continue + linked_node = netif.othernet + if linked_node.id == self.id: + continue + netif.swapparams('_params_up') + upstream_params = netif.getparams() + netif.swapparams('_params_up') + if netif.getparams() != upstream_params: + uni = True + + unidirectional = 0 + if uni: + unidirectional = 1 + + interface2_ip4 = None + interface2_ip4_mask = None + interface2_ip6 = None + interface2_ip6_mask = None + for address in netif.addrlist: + ip, _sep, mask = address.partition("/") + mask = int(mask) + if ipaddress.is_ipv4_address(ip): + family = AF_INET + ipl = socket.inet_pton(family, ip) + interface2_ip4 = ipaddress.IpAddress(af=family, address=ipl) + interface2_ip4_mask = mask + else: + family = AF_INET6 + ipl = socket.inet_pton(family, ip) + interface2_ip6 = ipaddress.IpAddress(af=family, address=ipl) + interface2_ip6_mask = mask + + link_data = LinkData( + message_type=flags, + node1_id=self.id, + node2_id=linked_node.id, + link_type=self.linktype, + unidirectional=unidirectional, + interface2_id=linked_node.getifindex(netif), + interface2_mac=netif.hwaddr, + interface2_ip4=interface2_ip4, + interface2_ip4_mask=interface2_ip4_mask, + interface2_ip6=interface2_ip6, + interface2_ip6_mask=interface2_ip6_mask, + delay=netif.getparam("delay"), + bandwidth=netif.getparam("bw"), + dup=netif.getparam("duplicate"), + jitter=netif.getparam("jitter"), + per=netif.getparam("loss") + ) + + all_links.append(link_data) + + if not uni: + continue + + netif.swapparams('_params_up') + link_data = LinkData( + message_type=0, + node1_id=linked_node.id, + node2_id=self.id, + unidirectional=1, + delay=netif.getparam("delay"), + bandwidth=netif.getparam("bw"), + dup=netif.getparam("duplicate"), + jitter=netif.getparam("jitter"), + per=netif.getparam("loss") + ) + netif.swapparams('_params_up') + + all_links.append(link_data) + + return all_links + + +class Position(object): + """ + Helper class for Cartesian coordinate position + """ + + def __init__(self, x=None, y=None, z=None): + """ + Creates a Position instance. + + :param x: x position + :param y: y position + :param z: z position + :return: + """ + self.x = x + self.y = y + self.z = z + + def set(self, x=None, y=None, z=None): + """ + Returns True if the position has actually changed. + + :param float x: x position + :param float y: y position + :param float z: z position + :return: True if position changed, False otherwise + :rtype: bool + """ + if self.x == x and self.y == y and self.z == z: + return False + self.x = x + self.y = y + self.z = z + return True + + def get(self): + """ + Retrieve x,y,z position. + + :return: x,y,z position tuple + :rtype: tuple + """ + return self.x, self.y, self.z diff --git a/daemon/core/netns/vnodeclient.py b/daemon/core/nodes/client.py similarity index 98% rename from daemon/core/netns/vnodeclient.py rename to daemon/core/nodes/client.py index 11669a59..7ef7a005 100644 --- a/daemon/core/netns/vnodeclient.py +++ b/daemon/core/nodes/client.py @@ -1,5 +1,5 @@ """ -vnodeclient.py: implementation of the VnodeClient class for issuing commands +client.py: implementation of the VnodeClient class for issuing commands over a control channel to the vnoded process running in a network namespace. The control channel can be accessed via calls to the vcmd Python module or by invoking the vcmd shell command. @@ -10,9 +10,8 @@ import os import vcmd -from core import CoreCommandError +from core import CoreCommandError, utils from core import constants -from core.misc import utils class VnodeClient(object): diff --git a/daemon/core/netns/vif.py b/daemon/core/nodes/interface.py similarity index 69% rename from daemon/core/netns/vif.py rename to daemon/core/nodes/interface.py index b7e8f23d..8d5df152 100644 --- a/daemon/core/netns/vif.py +++ b/daemon/core/nodes/interface.py @@ -5,17 +5,175 @@ virtual ethernet classes that implement the interfaces available under Linux. import logging import time -from core import CoreCommandError +from core import CoreCommandError, utils from core import constants -from core.coreobj import PyCoreNetIf -from core.enumerations import NodeTypes -from core.misc import nodeutils -from core.misc import utils +from core.emulator.enumerations import NodeTypes +from core.nodes import nodeutils utils.check_executables([constants.IP_BIN]) -class VEth(PyCoreNetIf): +class CoreInterface(object): + """ + Base class for network interfaces. + """ + + def __init__(self, node, name, mtu): + """ + Creates a PyCoreNetIf instance. + + :param core.coreobj.PyCoreNode node: node for interface + :param str name: interface name + :param mtu: mtu value + """ + + self.node = node + self.name = name + if not isinstance(mtu, (int, long)): + raise ValueError + self.mtu = mtu + self.net = None + self._params = {} + self.addrlist = [] + self.hwaddr = None + # placeholder position hook + self.poshook = lambda a, b, c, d: None + # used with EMANE + self.transport_type = None + # interface index on the network + self.netindex = None + # index used to find flow data + self.flow_id = None + + def startup(self): + """ + Startup method for the interface. + + :return: nothing + """ + pass + + def shutdown(self): + """ + Shutdown method for the interface. + + :return: nothing + """ + pass + + def attachnet(self, net): + """ + Attach network. + + :param core.coreobj.PyCoreNet net: network to attach + :return: nothing + """ + if self.net: + self.detachnet() + self.net = None + + net.attach(self) + self.net = net + + def detachnet(self): + """ + Detach from a network. + + :return: nothing + """ + if self.net is not None: + self.net.detach(self) + + def addaddr(self, addr): + """ + Add address. + + :param str addr: address to add + :return: nothing + """ + + self.addrlist.append(addr) + + def deladdr(self, addr): + """ + Delete address. + + :param str addr: address to delete + :return: nothing + """ + self.addrlist.remove(addr) + + def sethwaddr(self, addr): + """ + Set hardware address. + + :param core.misc.ipaddress.MacAddress addr: hardware address to set to. + :return: nothing + """ + self.hwaddr = addr + + def getparam(self, key): + """ + Retrieve a parameter from the, or None if the parameter does not exist. + + :param key: parameter to get value for + :return: parameter value + """ + return self._params.get(key) + + def getparams(self): + """ + Return (key, value) pairs for parameters. + """ + parameters = [] + for k in sorted(self._params.keys()): + parameters.append((k, self._params[k])) + return parameters + + def setparam(self, key, value): + """ + Set a parameter value, returns True if the parameter has changed. + + :param key: parameter name to set + :param value: parameter value + :return: True if parameter changed, False otherwise + """ + # treat None and 0 as unchanged values + current_value = self._params.get(key) + if current_value == value or current_value <= 0 and value <= 0: + return False + + self._params[key] = value + return True + + def swapparams(self, name): + """ + Swap out parameters dict for name. If name does not exist, + intialize it. This is for supporting separate upstream/downstream + parameters when two layer-2 nodes are linked together. + + :param str name: name of parameter to swap + :return: nothing + """ + tmp = self._params + if not hasattr(self, name): + setattr(self, name, {}) + self._params = getattr(self, name) + setattr(self, name, tmp) + + def setposition(self, x, y, z): + """ + Dispatch position hook handler. + + :param x: x position + :param y: y position + :param z: z position + :return: nothing + """ + self.poshook(self, x, y, z) + + +class Veth(CoreInterface): """ Provides virtual ethernet functionality for core nodes. """ @@ -34,7 +192,7 @@ class VEth(PyCoreNetIf): :raises CoreCommandError: when there is a command exception """ # note that net arg is ignored - PyCoreNetIf.__init__(self, node=node, name=name, mtu=mtu) + CoreInterface.__init__(self, node=node, name=name, mtu=mtu) self.localname = localname self.up = False if start: @@ -76,7 +234,7 @@ class VEth(PyCoreNetIf): self.up = False -class TunTap(PyCoreNetIf): +class TunTap(CoreInterface): """ TUN/TAP virtual device in TAP mode """ @@ -93,7 +251,7 @@ class TunTap(PyCoreNetIf): :param net: related network :param bool start: start flag """ - PyCoreNetIf.__init__(self, node=node, name=name, mtu=mtu) + CoreInterface.__init__(self, node=node, name=name, mtu=mtu) self.localname = localname self.up = False self.transport_type = "virtual" @@ -233,7 +391,7 @@ class TunTap(PyCoreNetIf): self.node.check_cmd([constants.IP_BIN, "addr", "add", str(addr), "dev", self.name]) -class GreTap(PyCoreNetIf): +class GreTap(CoreInterface): """ GRE TAP device for tunneling between emulation servers. Uses the "gretap" tunnel device type from Linux which is a GRE device @@ -258,7 +416,7 @@ class GreTap(PyCoreNetIf): :param bool start: start flag :raises CoreCommandError: when there is a command exception """ - PyCoreNetIf.__init__(self, node=node, name=name, mtu=mtu) + CoreInterface.__init__(self, node=node, name=name, mtu=mtu) self.session = session if _id is None: # from PyCoreObj diff --git a/daemon/core/misc/ipaddress.py b/daemon/core/nodes/ipaddress.py similarity index 100% rename from daemon/core/misc/ipaddress.py rename to daemon/core/nodes/ipaddress.py diff --git a/daemon/core/netns/vnet.py b/daemon/core/nodes/network.py similarity index 58% rename from daemon/core/netns/vnet.py rename to daemon/core/nodes/network.py index a7be41b5..b76a035a 100644 --- a/daemon/core/netns/vnet.py +++ b/daemon/core/nodes/network.py @@ -5,15 +5,19 @@ Linux Ethernet bridging and ebtables rules. import logging import os +import socket import threading import time +from socket import AF_INET, AF_INET6 -from core import CoreCommandError +from core import CoreCommandError, utils from core import constants -from core.coreobj import PyCoreNet -from core.misc import utils -from core.netns.vif import GreTap -from core.netns.vif import VEth +from core.nodes.base import CoreNetworkBase +from core.emulator.data import LinkData +from core.emulator.enumerations import NodeTypes, LinkTypes, RegisterTlvs +from core.nodes import ipaddress +from core.nodes.interface import GreTap +from core.nodes.interface import Veth utils.check_executables([ constants.BRCTL_BIN, @@ -236,9 +240,9 @@ def ebtablescmds(call, cmds): call(args) -class LxBrNet(PyCoreNet): +class CoreNetwork(CoreNetworkBase): """ - Provides linux bridge network functionlity for core nodes. + Provides linux bridge network functionality for core nodes. """ policy = "DROP" @@ -252,7 +256,7 @@ class LxBrNet(PyCoreNet): :param bool start: start flag :param policy: network policy """ - PyCoreNet.__init__(self, session, _id, name, start) + CoreNetworkBase.__init__(self, session, _id, name, start) if name is None: name = str(self.id) if policy is not None: @@ -333,7 +337,7 @@ class LxBrNet(PyCoreNet): utils.check_cmd([constants.BRCTL_BIN, "addif", self.brname, netif.localname]) utils.check_cmd([constants.IP_BIN, "link", "set", netif.localname, "up"]) - PyCoreNet.attach(self, netif) + CoreNetworkBase.attach(self, netif) def detach(self, netif): """ @@ -345,7 +349,7 @@ class LxBrNet(PyCoreNet): if self.up: utils.check_cmd([constants.BRCTL_BIN, "delif", self.brname, netif.localname]) - PyCoreNet.detach(self, netif) + CoreNetworkBase.detach(self, netif) def linked(self, netif1, netif2): """ @@ -520,7 +524,7 @@ class LxBrNet(PyCoreNet): if len(name) >= 16: raise ValueError("interface name %s too long" % name) - netif = VEth(node=None, name=name, localname=localname, mtu=1500, net=self, start=self.up) + netif = Veth(node=None, name=name, localname=localname, mtu=1500, net=self, start=self.up) self.attach(netif) if net.up: # this is similar to net.attach() but uses netif.name instead @@ -564,7 +568,7 @@ class LxBrNet(PyCoreNet): utils.check_cmd([constants.IP_BIN, "addr", "add", str(addr), "dev", self.brname]) -class GreTapBridge(LxBrNet): +class GreTapBridge(CoreNetwork): """ A network consisting of a bridge with a gretap device for tunneling to another system. @@ -586,7 +590,7 @@ class GreTapBridge(LxBrNet): :param bool start: start flag :return: """ - LxBrNet.__init__(self, session=session, _id=_id, name=name, policy=policy, start=False) + CoreNetwork.__init__(self, session=session, _id=_id, name=name, policy=policy, start=False) self.grekey = key if self.grekey is None: self.grekey = self.session.id ^ self.id @@ -609,7 +613,7 @@ class GreTapBridge(LxBrNet): :return: nothing """ - LxBrNet.startup(self) + CoreNetwork.startup(self) if self.gretap: self.attach(self.gretap) @@ -623,7 +627,7 @@ class GreTapBridge(LxBrNet): self.detach(self.gretap) self.gretap.shutdown() self.gretap = None - LxBrNet.shutdown(self) + CoreNetwork.shutdown(self) def addrconfig(self, addrlist): """ @@ -654,3 +658,412 @@ class GreTapBridge(LxBrNet): :return: nothing """ self.grekey = key + + +class CtrlNet(CoreNetwork): + """ + Control network functionality. + """ + policy = "ACCEPT" + # base control interface index + CTRLIF_IDX_BASE = 99 + DEFAULT_PREFIX_LIST = [ + "172.16.0.0/24 172.16.1.0/24 172.16.2.0/24 172.16.3.0/24 172.16.4.0/24", + "172.17.0.0/24 172.17.1.0/24 172.17.2.0/24 172.17.3.0/24 172.17.4.0/24", + "172.18.0.0/24 172.18.1.0/24 172.18.2.0/24 172.18.3.0/24 172.18.4.0/24", + "172.19.0.0/24 172.19.1.0/24 172.19.2.0/24 172.19.3.0/24 172.19.4.0/24" + ] + + def __init__(self, session, _id="ctrlnet", name=None, prefix=None, + hostid=None, start=True, assign_address=True, + updown_script=None, serverintf=None): + """ + Creates a CtrlNet instance. + + :param core.session.Session session: core session instance + :param int _id: node id + :param str name: node namee + :param prefix: control network ipv4 prefix + :param hostid: host id + :param bool start: start flag + :param str assign_address: assigned address + :param str updown_script: updown script + :param serverintf: server interface + :return: + """ + self.prefix = ipaddress.Ipv4Prefix(prefix) + self.hostid = hostid + self.assign_address = assign_address + self.updown_script = updown_script + self.serverintf = serverintf + CoreNetwork.__init__(self, session, _id=_id, name=name, start=start) + + def startup(self): + """ + Startup functionality for the control network. + + :return: nothing + :raises CoreCommandError: when there is a command exception + """ + if self.detectoldbridge(): + return + + CoreNetwork.startup(self) + + if self.hostid: + addr = self.prefix.addr(self.hostid) + else: + addr = self.prefix.max_addr() + + logging.info("added control network bridge: %s %s", self.brname, self.prefix) + + if self.assign_address: + addrlist = ["%s/%s" % (addr, self.prefix.prefixlen)] + self.addrconfig(addrlist=addrlist) + logging.info("address %s", addr) + + if self.updown_script: + logging.info("interface %s updown script (%s startup) called", self.brname, self.updown_script) + utils.check_cmd([self.updown_script, self.brname, "startup"]) + + if self.serverintf: + # sets the interface as a port of the bridge + utils.check_cmd([constants.BRCTL_BIN, "addif", self.brname, self.serverintf]) + + # bring interface up + utils.check_cmd([constants.IP_BIN, "link", "set", self.serverintf, "up"]) + + def detectoldbridge(self): + """ + Occassionally, control net bridges from previously closed sessions are not cleaned up. + Check if there are old control net bridges and delete them + + :return: True if an old bridge was detected, False otherwise + :rtype: bool + """ + status, output = utils.cmd_output([constants.BRCTL_BIN, "show"]) + if status != 0: + logging.error("Unable to retrieve list of installed bridges") + else: + lines = output.split("\n") + for line in lines[1:]: + cols = line.split("\t") + oldbr = cols[0] + flds = cols[0].split(".") + if len(flds) == 3: + if flds[0] == "b" and flds[1] == self.id: + logging.error( + "error: An active control net bridge (%s) found. " + "An older session might still be running. " + "Stop all sessions and, if needed, delete %s to continue.", oldbr, oldbr + ) + return True + return False + + def shutdown(self): + """ + Control network shutdown. + + :return: nothing + """ + if self.serverintf is not None: + try: + utils.check_cmd([constants.BRCTL_BIN, "delif", self.brname, self.serverintf]) + except CoreCommandError: + logging.exception("error deleting server interface %s from bridge %s", self.serverintf, self.brname) + + if self.updown_script is not None: + try: + logging.info("interface %s updown script (%s shutdown) called", self.brname, self.updown_script) + utils.check_cmd([self.updown_script, self.brname, "shutdown"]) + except CoreCommandError: + logging.exception("error issuing shutdown script shutdown") + + CoreNetwork.shutdown(self) + + def all_link_data(self, flags): + """ + Do not include CtrlNet in link messages describing this session. + + :param flags: message flags + :return: list of link data + :rtype: list[core.data.LinkData] + """ + return [] + + +class PtpNet(CoreNetwork): + """ + Peer to peer network node. + """ + policy = "ACCEPT" + + def attach(self, netif): + """ + Attach a network interface, but limit attachment to two interfaces. + + :param core.netns.vif.VEth netif: network interface + :return: nothing + """ + if len(self._netif) >= 2: + raise ValueError("Point-to-point links support at most 2 network interfaces") + + CoreNetwork.attach(self, netif) + + def data(self, message_type, lat=None, lon=None, alt=None): + """ + Do not generate a Node Message for point-to-point links. They are + built using a link message instead. + + :param message_type: purpose for the data object we are creating + :param float lat: latitude + :param float lon: longitude + :param float alt: altitude + :return: node data object + :rtype: core.data.NodeData + """ + return None + + def all_link_data(self, flags): + """ + Build CORE API TLVs for a point-to-point link. One Link message + describes this network. + + :param flags: message flags + :return: list of link data + :rtype: list[core.data.LinkData] + """ + + all_links = [] + + if len(self._netif) != 2: + return all_links + + if1, if2 = self._netif.values() + + unidirectional = 0 + if if1.getparams() != if2.getparams(): + unidirectional = 1 + + interface1_ip4 = None + interface1_ip4_mask = None + interface1_ip6 = None + interface1_ip6_mask = None + for address in if1.addrlist: + ip, _sep, mask = address.partition("/") + mask = int(mask) + if ipaddress.is_ipv4_address(ip): + family = AF_INET + ipl = socket.inet_pton(family, ip) + interface1_ip4 = ipaddress.IpAddress(af=family, address=ipl) + interface1_ip4_mask = mask + else: + family = AF_INET6 + ipl = socket.inet_pton(family, ip) + interface1_ip6 = ipaddress.IpAddress(af=family, address=ipl) + interface1_ip6_mask = mask + + interface2_ip4 = None + interface2_ip4_mask = None + interface2_ip6 = None + interface2_ip6_mask = None + for address in if2.addrlist: + ip, _sep, mask = address.partition("/") + mask = int(mask) + if ipaddress.is_ipv4_address(ip): + family = AF_INET + ipl = socket.inet_pton(family, ip) + interface2_ip4 = ipaddress.IpAddress(af=family, address=ipl) + interface2_ip4_mask = mask + else: + family = AF_INET6 + ipl = socket.inet_pton(family, ip) + interface2_ip6 = ipaddress.IpAddress(af=family, address=ipl) + interface2_ip6_mask = mask + + link_data = LinkData( + message_type=flags, + node1_id=if1.node.id, + node2_id=if2.node.id, + link_type=self.linktype, + unidirectional=unidirectional, + delay=if1.getparam("delay"), + bandwidth=if1.getparam("bw"), + dup=if1.getparam("duplicate"), + jitter=if1.getparam("jitter"), + interface1_id=if1.node.getifindex(if1), + interface1_mac=if1.hwaddr, + interface1_ip4=interface1_ip4, + interface1_ip4_mask=interface1_ip4_mask, + interface1_ip6=interface1_ip6, + interface1_ip6_mask=interface1_ip6_mask, + interface2_id=if2.node.getifindex(if2), + interface2_mac=if2.hwaddr, + interface2_ip4=interface2_ip4, + interface2_ip4_mask=interface2_ip4_mask, + interface2_ip6=interface2_ip6, + interface2_ip6_mask=interface2_ip6_mask, + ) + + all_links.append(link_data) + + # build a 2nd link message for the upstream link parameters + # (swap if1 and if2) + if unidirectional: + link_data = LinkData( + message_type=0, + node1_id=if2.node.id, + node2_id=if1.node.id, + delay=if1.getparam("delay"), + bandwidth=if1.getparam("bw"), + dup=if1.getparam("duplicate"), + jitter=if1.getparam("jitter"), + unidirectional=1, + interface1_id=if2.node.getifindex(if2), + interface2_id=if1.node.getifindex(if1) + ) + all_links.append(link_data) + + return all_links + + +class SwitchNode(CoreNetwork): + """ + Provides switch functionality within a core node. + """ + apitype = NodeTypes.SWITCH.value + policy = "ACCEPT" + type = "lanswitch" + + +class HubNode(CoreNetwork): + """ + Provides hub functionality within a core node, forwards packets to all bridge + ports by turning off MAC address learning. + """ + apitype = NodeTypes.HUB.value + policy = "ACCEPT" + type = "hub" + + def __init__(self, session, _id=None, name=None, start=True): + """ + Creates a HubNode instance. + + :param core.session.Session session: core session instance + :param int _id: node id + :param str name: node namee + :param bool start: start flag + :raises CoreCommandError: when there is a command exception + """ + CoreNetwork.__init__(self, session, _id, name, start) + + # TODO: move to startup method + if start: + utils.check_cmd([constants.BRCTL_BIN, "setageing", self.brname, "0"]) + + +class WlanNode(CoreNetwork): + """ + Provides wireless lan functionality within a core node. + """ + apitype = NodeTypes.WIRELESS_LAN.value + linktype = LinkTypes.WIRELESS.value + policy = "DROP" + type = "wlan" + + def __init__(self, session, _id=None, name=None, start=True, policy=None): + """ + Create a WlanNode instance. + + :param core.session.Session session: core session instance + :param int _id: node id + :param str name: node name + :param bool start: start flag + :param policy: wlan policy + """ + CoreNetwork.__init__(self, session, _id, name, start, policy) + # wireless model such as basic range + self.model = None + # mobility model such as scripted + self.mobility = None + + def attach(self, netif): + """ + Attach a network interface. + + :param core.netns.vif.VEth netif: network interface + :return: nothing + """ + CoreNetwork.attach(self, netif) + if self.model: + netif.poshook = self.model.position_callback + if netif.node is None: + return + x, y, z = netif.node.position.get() + # invokes any netif.poshook + netif.setposition(x, y, z) + + def setmodel(self, model, config): + """ + Sets the mobility and wireless model. + + :param core.mobility.WirelessModel.cls model: wireless model to set to + :param dict config: configuration for model being set + :return: nothing + """ + logging.info("adding model: %s", model.name) + if model.config_type == RegisterTlvs.WIRELESS.value: + self.model = model(session=self.session, _id=self.id) + self.model.update_config(config) + if self.model.position_callback: + for netif in self.netifs(): + netif.poshook = self.model.position_callback + if netif.node is not None: + x, y, z = netif.node.position.get() + netif.poshook(netif, x, y, z) + self.model.setlinkparams() + elif model.config_type == RegisterTlvs.MOBILITY.value: + self.mobility = model(session=self.session, _id=self.id) + self.mobility.update_config(config) + + def update_mobility(self, config): + if not self.mobility: + raise ValueError("no mobility set to update for node(%s)", self.id) + self.mobility.set_configs(config, node_id=self.id) + + def updatemodel(self, config): + if not self.model: + raise ValueError("no model set to update for node(%s)", self.id) + logging.info("node(%s) updating model(%s): %s", self.id, self.model.name, config) + self.model.set_configs(config, node_id=self.id) + if self.model.position_callback: + for netif in self.netifs(): + netif.poshook = self.model.position_callback + if netif.node is not None: + x, y, z = netif.node.position.get() + netif.poshook(netif, x, y, z) + self.model.updateconfig() + + def all_link_data(self, flags): + """ + Retrieve all link data. + + :param flags: message flags + :return: list of link data + :rtype: list[core.data.LinkData] + """ + all_links = CoreNetwork.all_link_data(self, flags) + + if self.model: + all_links.extend(self.model.all_link_data(flags)) + + return all_links + + +class TunnelNode(GreTapBridge): + """ + Provides tunnel functionality in a core node. + """ + apitype = NodeTypes.TUNNEL.value + policy = "ACCEPT" + type = "tunnel" diff --git a/daemon/core/nodes/nodemaps.py b/daemon/core/nodes/nodemaps.py new file mode 100644 index 00000000..525ab43d --- /dev/null +++ b/daemon/core/nodes/nodemaps.py @@ -0,0 +1,29 @@ +""" +Provides default node maps that can be used to run core with. +""" +import core.nodes.base +import core.nodes.network +import core.nodes.physical +from core.emane.nodes import EmaneNet +from core.emane.nodes import EmaneNode +from core.emulator.enumerations import NodeTypes +from core.nodes.network import GreTapBridge +from core.nodes import physical + +# legacy core nodes, that leverage linux bridges +NODES = { + NodeTypes.DEFAULT: core.nodes.base.CoreNode, + NodeTypes.PHYSICAL: physical.PhysicalNode, + NodeTypes.TBD: None, + NodeTypes.SWITCH: core.nodes.network.SwitchNode, + NodeTypes.HUB: core.nodes.network.HubNode, + NodeTypes.WIRELESS_LAN: core.nodes.network.WlanNode, + NodeTypes.RJ45: core.nodes.physical.Rj45Node, + NodeTypes.TUNNEL: core.nodes.network.TunnelNode, + NodeTypes.KTUNNEL: None, + NodeTypes.EMANE: EmaneNode, + NodeTypes.EMANE_NET: EmaneNet, + NodeTypes.TAP_BRIDGE: GreTapBridge, + NodeTypes.PEER_TO_PEER: core.nodes.network.PtpNet, + NodeTypes.CONTROL_NET: core.nodes.network.CtrlNet +} diff --git a/daemon/core/misc/nodeutils.py b/daemon/core/nodes/nodeutils.py similarity index 100% rename from daemon/core/misc/nodeutils.py rename to daemon/core/nodes/nodeutils.py diff --git a/daemon/core/netns/openvswitch.py b/daemon/core/nodes/openvswitch.py similarity index 96% rename from daemon/core/netns/openvswitch.py rename to daemon/core/nodes/openvswitch.py index c79c2835..facff596 100644 --- a/daemon/core/netns/openvswitch.py +++ b/daemon/core/nodes/openvswitch.py @@ -8,19 +8,18 @@ import threading from socket import AF_INET from socket import AF_INET6 -from core import CoreCommandError +from core import CoreCommandError, utils from core import constants -from core.coreobj import PyCoreNet -from core.data import LinkData -from core.enumerations import LinkTypes -from core.enumerations import NodeTypes -from core.enumerations import RegisterTlvs -from core.misc import ipaddress -from core.misc import utils -from core.netns.vif import GreTap -from core.netns.vif import VEth -from core.netns.vnet import EbtablesQueue -from core.netns.vnet import GreTapBridge +from core.nodes.base import CoreNetworkBase +from core.emulator.data import LinkData +from core.emulator.enumerations import LinkTypes +from core.emulator.enumerations import NodeTypes +from core.emulator.enumerations import RegisterTlvs +from core.nodes import ipaddress +from core.nodes.interface import GreTap +from core.nodes.interface import Veth +from core.nodes.network import EbtablesQueue +from core.nodes.network import GreTapBridge # a global object because all WLANs share the same queue # cannot have multiple threads invoking the ebtables commnd @@ -41,7 +40,7 @@ def ebtables_commands(call, commands): call(command) -class OvsNet(PyCoreNet): +class OvsNet(CoreNetworkBase): """ Used to be LxBrNet. @@ -62,7 +61,7 @@ class OvsNet(PyCoreNet): :return: """ - PyCoreNet.__init__(self, session, _id, name, start) + CoreNetworkBase.__init__(self, session, _id, name, start) if policy: self.policy = policy @@ -129,13 +128,13 @@ class OvsNet(PyCoreNet): utils.check_cmd([constants.OVS_BIN, "add-port", self.bridge_name, interface.localname]) utils.check_cmd([constants.IP_BIN, "link", "set", interface.localname, "up"]) - PyCoreNet.attach(self, interface) + CoreNetworkBase.attach(self, interface) def detach(self, interface): if self.up: utils.check_cmd([constants.OVS_BIN, "del-port", self.bridge_name, interface.localname]) - PyCoreNet.detach(self, interface) + CoreNetworkBase.detach(self, interface) def linked(self, interface_one, interface_two): # check if the network interfaces are attached to this network @@ -297,7 +296,7 @@ class OvsNet(PyCoreNet): if len(name) >= 16: raise ValueError("interface name %s too long" % name) - interface = VEth(node=None, name=name, localname=localname, mtu=1500, net=self, start=self.up) + interface = Veth(node=None, name=name, localname=localname, mtu=1500, net=self, start=self.up) self.attach(interface) if network.up: # this is similar to net.attach() but uses netif.name instead @@ -598,7 +597,7 @@ class OvsWlanNode(OvsNet): logging.info("adding model %s", model.name) if model.type == RegisterTlvs.WIRELESS.value: - self.model = model(session=self.session, object_id=self.id, config=config) + self.model = model(session=self.session, _id=self.id, config=config) if self.model.position_callback: for interface in self.netifs(): interface.poshook = self.model.position_callback @@ -607,7 +606,7 @@ class OvsWlanNode(OvsNet): interface.poshook(interface, x, y, z) self.model.setlinkparams() elif model.type == RegisterTlvs.MOBILITY.value: - self.mobility = model(session=self.session, object_id=self.id, config=config) + self.mobility = model(session=self.session, _id=self.id, config=config) def updatemodel(self, config): if not self.model: diff --git a/daemon/core/nodes/physical.py b/daemon/core/nodes/physical.py new file mode 100644 index 00000000..1e9d3a89 --- /dev/null +++ b/daemon/core/nodes/physical.py @@ -0,0 +1,544 @@ +""" +PhysicalNode class for including real systems in the emulated network. +""" + +import logging +import os +import subprocess +import threading + +from core import CoreCommandError, utils +from core import constants +from core.nodes.base import CoreNodeBase +from core.nodes.interface import CoreInterface +from core.emulator.enumerations import NodeTypes +from core.nodes.network import GreTap +from core.nodes.network import CoreNetwork + + +class PhysicalNode(CoreNodeBase): + def __init__(self, session, _id=None, name=None, nodedir=None, start=True): + CoreNodeBase.__init__(self, session, _id, name, start=start) + self.nodedir = nodedir + self.up = start + self.lock = threading.RLock() + self._mounts = [] + if start: + self.startup() + + def startup(self): + with self.lock: + self.makenodedir() + + def shutdown(self): + if not self.up: + return + + with self.lock: + while self._mounts: + _source, target = self._mounts.pop(-1) + self.umount(target) + + for netif in self.netifs(): + netif.shutdown() + + self.rmnodedir() + + def termcmdstring(self, sh="/bin/sh"): + """ + Create a terminal command string. + + :param str sh: shell to execute command in + :return: str + """ + return sh + + def cmd(self, args, wait=True): + """ + Runs shell command on node, with option to not wait for a result. + + :param list[str]|str args: command to run + :param bool wait: wait for command to exit, defaults to True + :return: exit status for command + :rtype: int + """ + os.chdir(self.nodedir) + status = utils.cmd(args, wait) + return status + + def cmd_output(self, args): + """ + Runs shell command on node and get exit status and output. + + :param list[str]|str args: command to run + :return: exit status and combined stdout and stderr + :rtype: tuple[int, str] + """ + os.chdir(self.nodedir) + p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + stdout, _ = p.communicate() + status = p.wait() + return status, stdout.strip() + + def check_cmd(self, args): + """ + Runs shell command on node. + + :param list[str]|str args: command to run + :return: combined stdout and stderr + :rtype: str + :raises CoreCommandError: when a non-zero exit status occurs + """ + status, output = self.cmd_output(args) + if status: + raise CoreCommandError(status, args, output) + return output.strip() + + def shcmd(self, cmdstr, sh="/bin/sh"): + return self.cmd([sh, "-c", cmdstr]) + + def sethwaddr(self, ifindex, addr): + """ + same as SimpleLxcNode.sethwaddr() + """ + self._netif[ifindex].sethwaddr(addr) + ifname = self.ifname(ifindex) + if self.up: + self.check_cmd([constants.IP_BIN, "link", "set", "dev", ifname, "address", str(addr)]) + + def addaddr(self, ifindex, addr): + """ + same as SimpleLxcNode.addaddr() + """ + if self.up: + self.check_cmd([constants.IP_BIN, "addr", "add", str(addr), "dev", self.ifname(ifindex)]) + + self._netif[ifindex].addaddr(addr) + + def deladdr(self, ifindex, addr): + """ + same as SimpleLxcNode.deladdr() + """ + try: + self._netif[ifindex].deladdr(addr) + except ValueError: + logging.exception("trying to delete unknown address: %s", addr) + + if self.up: + self.check_cmd([constants.IP_BIN, "addr", "del", str(addr), "dev", self.ifname(ifindex)]) + + def adoptnetif(self, netif, ifindex, hwaddr, addrlist): + """ + The broker builds a GreTap tunnel device to this physical node. + When a link message is received linking this node to another part of + the emulation, no new interface is created; instead, adopt the + GreTap netif as the node interface. + """ + netif.name = "gt%d" % ifindex + netif.node = self + self.addnetif(netif, ifindex) + + # use a more reasonable name, e.g. "gt0" instead of "gt.56286.150" + if self.up: + self.check_cmd([constants.IP_BIN, "link", "set", "dev", netif.localname, "down"]) + self.check_cmd([constants.IP_BIN, "link", "set", netif.localname, "name", netif.name]) + + netif.localname = netif.name + + if hwaddr: + self.sethwaddr(ifindex, hwaddr) + + for addr in utils.make_tuple(addrlist): + self.addaddr(ifindex, addr) + + if self.up: + self.check_cmd([constants.IP_BIN, "link", "set", "dev", netif.localname, "up"]) + + def linkconfig(self, netif, bw=None, delay=None, loss=None, duplicate=None, jitter=None, netif2=None): + """ + Apply tc queing disciplines using LxBrNet.linkconfig() + """ + # borrow the tc qdisc commands from LxBrNet.linkconfig() + linux_bridge = CoreNetwork(session=self.session, start=False) + linux_bridge.up = True + linux_bridge.linkconfig(netif, bw=bw, delay=delay, loss=loss, duplicate=duplicate, jitter=jitter, netif2=netif2) + del linux_bridge + + def newifindex(self): + with self.lock: + while self.ifindex in self._netif: + self.ifindex += 1 + ifindex = self.ifindex + self.ifindex += 1 + return ifindex + + def newnetif(self, net=None, addrlist=None, hwaddr=None, ifindex=None, ifname=None): + logging.info("creating interface") + if not addrlist: + addrlist = [] + + if self.up and net is None: + raise NotImplementedError + + if ifindex is None: + ifindex = self.newifindex() + + if self.up: + # this is reached when this node is linked to a network node + # tunnel to net not built yet, so build it now and adopt it + gt = self.session.broker.addnettunnel(net.id) + if gt is None or len(gt) != 1: + raise ValueError("error building tunnel from adding a new network interface: %s" % gt) + gt = gt[0] + net.detach(gt) + self.adoptnetif(gt, ifindex, hwaddr, addrlist) + return ifindex + + # this is reached when configuring services (self.up=False) + if ifname is None: + ifname = "gt%d" % ifindex + + netif = GreTap(node=self, name=ifname, session=self.session, start=False) + self.adoptnetif(netif, ifindex, hwaddr, addrlist) + return ifindex + + def privatedir(self, path): + if path[0] != "/": + raise ValueError("path not fully qualified: %s" % path) + hostpath = os.path.join(self.nodedir, os.path.normpath(path).strip('/').replace('/', '.')) + os.mkdir(hostpath) + self.mount(hostpath, path) + + def mount(self, source, target): + source = os.path.abspath(source) + logging.info("mounting %s at %s", source, target) + os.makedirs(target) + self.check_cmd([constants.MOUNT_BIN, "--bind", source, target]) + self._mounts.append((source, target)) + + def umount(self, target): + logging.info("unmounting '%s'" % target) + try: + self.check_cmd([constants.UMOUNT_BIN, "-l", target]) + except CoreCommandError: + logging.exception("unmounting failed for %s", target) + + def opennodefile(self, filename, mode="w"): + dirname, basename = os.path.split(filename) + if not basename: + raise ValueError("no basename for filename: " + filename) + + if dirname and dirname[0] == "/": + dirname = dirname[1:] + + dirname = dirname.replace("/", ".") + dirname = os.path.join(self.nodedir, dirname) + if not os.path.isdir(dirname): + os.makedirs(dirname, mode=0755) + + hostfilename = os.path.join(dirname, basename) + return open(hostfilename, mode) + + def nodefile(self, filename, contents, mode=0644): + with self.opennodefile(filename, "w") as node_file: + node_file.write(contents) + os.chmod(node_file.name, mode) + logging.info("created nodefile: '%s'; mode: 0%o", node_file.name, mode) + + +class Rj45Node(CoreNodeBase, CoreInterface): + """ + RJ45Node is a physical interface on the host linked to the emulated + network. + """ + apitype = NodeTypes.RJ45.value + type = "rj45" + + def __init__(self, session, _id=None, name=None, mtu=1500, start=True): + """ + Create an RJ45Node instance. + + :param core.session.Session session: core session instance + :param int _id: node id + :param str name: node name + :param mtu: rj45 mtu + :param bool start: start flag + :return: + """ + CoreNodeBase.__init__(self, session, _id, name, start=start) + CoreInterface.__init__(self, node=self, name=name, mtu=mtu) + self.up = False + self.lock = threading.RLock() + self.ifindex = None + # the following are PyCoreNetIf attributes + self.transport_type = "raw" + self.localname = name + self.old_up = False + self.old_addrs = [] + + if start: + self.startup() + + def startup(self): + """ + Set the interface in the up state. + + :return: nothing + :raises CoreCommandError: when there is a command exception + """ + # interface will also be marked up during net.attach() + self.savestate() + utils.check_cmd([constants.IP_BIN, "link", "set", self.localname, "up"]) + self.up = True + + def shutdown(self): + """ + Bring the interface down. Remove any addresses and queuing + disciplines. + + :return: nothing + """ + if not self.up: + return + + try: + utils.check_cmd([constants.IP_BIN, "link", "set", self.localname, "down"]) + utils.check_cmd([constants.IP_BIN, "addr", "flush", "dev", self.localname]) + utils.check_cmd([constants.TC_BIN, "qdisc", "del", "dev", self.localname, "root"]) + except CoreCommandError: + logging.exception("error shutting down") + + self.up = False + self.restorestate() + + # TODO: issue in that both classes inherited from provide the same method with different signatures + def attachnet(self, net): + """ + Attach a network. + + :param core.coreobj.PyCoreNet net: network to attach + :return: nothing + """ + CoreInterface.attachnet(self, net) + + # TODO: issue in that both classes inherited from provide the same method with different signatures + def detachnet(self): + """ + Detach a network. + + :return: nothing + """ + CoreInterface.detachnet(self) + + def newnetif(self, net=None, addrlist=None, hwaddr=None, ifindex=None, ifname=None): + """ + This is called when linking with another node. Since this node + represents an interface, we do not create another object here, + but attach ourselves to the given network. + + :param core.coreobj.PyCoreNet net: new network instance + :param list[str] addrlist: address list + :param str hwaddr: hardware address + :param int ifindex: interface index + :param str ifname: interface name + :return: interface index + :rtype: int + :raises ValueError: when an interface has already been created, one max + """ + with self.lock: + if ifindex is None: + ifindex = 0 + + if self.net is not None: + raise ValueError("RJ45 nodes support at most 1 network interface") + + self._netif[ifindex] = self + # PyCoreNetIf.node is self + self.node = self + self.ifindex = ifindex + + if net is not None: + self.attachnet(net) + + if addrlist: + for addr in utils.make_tuple(addrlist): + self.addaddr(addr) + + return ifindex + + def delnetif(self, ifindex): + """ + Delete a network interface. + + :param int ifindex: interface index to delete + :return: nothing + """ + if ifindex is None: + ifindex = 0 + + self._netif.pop(ifindex) + + if ifindex == self.ifindex: + self.shutdown() + else: + raise ValueError("ifindex %s does not exist" % ifindex) + + def netif(self, ifindex, net=None): + """ + This object is considered the network interface, so we only + return self here. This keeps the RJ45Node compatible with + real nodes. + + :param int ifindex: interface index to retrieve + :param net: network to retrieve + :return: a network interface + :rtype: core.coreobj.PyCoreNetIf + """ + if net is not None and net == self.net: + return self + + if ifindex is None: + ifindex = 0 + + if ifindex == self.ifindex: + return self + + return None + + def getifindex(self, netif): + """ + Retrieve network interface index. + + :param core.coreobj.PyCoreNetIf netif: network interface to retrieve index for + :return: interface index, None otherwise + :rtype: int + """ + if netif != self: + return None + + return self.ifindex + + def addaddr(self, addr): + """ + Add address to to network interface. + + :param str addr: address to add + :return: nothing + :raises CoreCommandError: when there is a command exception + """ + if self.up: + utils.check_cmd([constants.IP_BIN, "addr", "add", str(addr), "dev", self.name]) + + CoreInterface.addaddr(self, addr) + + def deladdr(self, addr): + """ + Delete address from network interface. + + :param str addr: address to delete + :return: nothing + :raises CoreCommandError: when there is a command exception + """ + if self.up: + utils.check_cmd([constants.IP_BIN, "addr", "del", str(addr), "dev", self.name]) + + CoreInterface.deladdr(self, addr) + + def savestate(self): + """ + Save the addresses and other interface state before using the + interface for emulation purposes. TODO: save/restore the PROMISC flag + + :return: nothing + :raises CoreCommandError: when there is a command exception + """ + self.old_up = False + self.old_addrs = [] + args = [constants.IP_BIN, "addr", "show", "dev", self.localname] + output = utils.check_cmd(args) + for line in output.split("\n"): + items = line.split() + if len(items) < 2: + continue + + if items[1] == "%s:" % self.localname: + flags = items[2][1:-1].split(",") + if "UP" in flags: + self.old_up = True + elif items[0] == "inet": + self.old_addrs.append((items[1], items[3])) + elif items[0] == "inet6": + if items[1][:4] == "fe80": + continue + self.old_addrs.append((items[1], None)) + + def restorestate(self): + """ + Restore the addresses and other interface state after using it. + + :return: nothing + :raises CoreCommandError: when there is a command exception + """ + for addr in self.old_addrs: + if addr[1] is None: + utils.check_cmd([constants.IP_BIN, "addr", "add", addr[0], "dev", self.localname]) + else: + utils.check_cmd([constants.IP_BIN, "addr", "add", addr[0], "brd", addr[1], "dev", self.localname]) + + if self.old_up: + utils.check_cmd([constants.IP_BIN, "link", "set", self.localname, "up"]) + + def setposition(self, x=None, y=None, z=None): + """ + Uses setposition from both parent classes. + + :param float x: x position + :param float y: y position + :param float z: z position + :return: True if position changed, False otherwise + :rtype: bool + """ + result = CoreNodeBase.setposition(self, x, y, z) + CoreInterface.setposition(self, x, y, z) + return result + + def check_cmd(self, args): + """ + Runs shell command on node. + + :param list[str]|str args: command to run + :return: exist status and combined stdout and stderr + :rtype: tuple[int, str] + :raises CoreCommandError: when a non-zero exit status occurs + """ + raise NotImplementedError + + def cmd(self, args, wait=True): + """ + Runs shell command on node, with option to not wait for a result. + + :param list[str]|str args: command to run + :param bool wait: wait for command to exit, defaults to True + :return: exit status for command + :rtype: int + """ + raise NotImplementedError + + def cmd_output(self, args): + """ + Runs shell command on node and get exit status and output. + + :param list[str]|str args: command to run + :return: exit status and combined stdout and stderr + :rtype: tuple[int, str] + """ + raise NotImplementedError + + def termcmdstring(self, sh): + """ + Create a terminal command string. + + :param str sh: shell to execute command in + :return: str + """ + raise NotImplementedError diff --git a/daemon/core/phys/pnodes.py b/daemon/core/phys/pnodes.py deleted file mode 100644 index a2313e97..00000000 --- a/daemon/core/phys/pnodes.py +++ /dev/null @@ -1,245 +0,0 @@ -""" -PhysicalNode class for including real systems in the emulated network. -""" - -import logging -import os -import subprocess -import threading - -from core import CoreCommandError -from core import constants -from core.coreobj import PyCoreNode -from core.misc import utils -from core.netns.vnet import GreTap -from core.netns.vnet import LxBrNet - - -class PhysicalNode(PyCoreNode): - def __init__(self, session, _id=None, name=None, nodedir=None, start=True): - PyCoreNode.__init__(self, session, _id, name, start=start) - self.nodedir = nodedir - self.up = start - self.lock = threading.RLock() - self._mounts = [] - if start: - self.startup() - - def startup(self): - with self.lock: - self.makenodedir() - - def shutdown(self): - if not self.up: - return - - with self.lock: - while self._mounts: - _source, target = self._mounts.pop(-1) - self.umount(target) - - for netif in self.netifs(): - netif.shutdown() - - self.rmnodedir() - - def termcmdstring(self, sh="/bin/sh"): - """ - Create a terminal command string. - - :param str sh: shell to execute command in - :return: str - """ - return sh - - def cmd(self, args, wait=True): - """ - Runs shell command on node, with option to not wait for a result. - - :param list[str]|str args: command to run - :param bool wait: wait for command to exit, defaults to True - :return: exit status for command - :rtype: int - """ - os.chdir(self.nodedir) - status = utils.cmd(args, wait) - return status - - def cmd_output(self, args): - """ - Runs shell command on node and get exit status and output. - - :param list[str]|str args: command to run - :return: exit status and combined stdout and stderr - :rtype: tuple[int, str] - """ - os.chdir(self.nodedir) - p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - stdout, _ = p.communicate() - status = p.wait() - return status, stdout.strip() - - def check_cmd(self, args): - """ - Runs shell command on node. - - :param list[str]|str args: command to run - :return: combined stdout and stderr - :rtype: str - :raises CoreCommandError: when a non-zero exit status occurs - """ - status, output = self.cmd_output(args) - if status: - raise CoreCommandError(status, args, output) - return output.strip() - - def shcmd(self, cmdstr, sh="/bin/sh"): - return self.cmd([sh, "-c", cmdstr]) - - def sethwaddr(self, ifindex, addr): - """ - same as SimpleLxcNode.sethwaddr() - """ - self._netif[ifindex].sethwaddr(addr) - ifname = self.ifname(ifindex) - if self.up: - self.check_cmd([constants.IP_BIN, "link", "set", "dev", ifname, "address", str(addr)]) - - def addaddr(self, ifindex, addr): - """ - same as SimpleLxcNode.addaddr() - """ - if self.up: - self.check_cmd([constants.IP_BIN, "addr", "add", str(addr), "dev", self.ifname(ifindex)]) - - self._netif[ifindex].addaddr(addr) - - def deladdr(self, ifindex, addr): - """ - same as SimpleLxcNode.deladdr() - """ - try: - self._netif[ifindex].deladdr(addr) - except ValueError: - logging.exception("trying to delete unknown address: %s", addr) - - if self.up: - self.check_cmd([constants.IP_BIN, "addr", "del", str(addr), "dev", self.ifname(ifindex)]) - - def adoptnetif(self, netif, ifindex, hwaddr, addrlist): - """ - The broker builds a GreTap tunnel device to this physical node. - When a link message is received linking this node to another part of - the emulation, no new interface is created; instead, adopt the - GreTap netif as the node interface. - """ - netif.name = "gt%d" % ifindex - netif.node = self - self.addnetif(netif, ifindex) - - # use a more reasonable name, e.g. "gt0" instead of "gt.56286.150" - if self.up: - self.check_cmd([constants.IP_BIN, "link", "set", "dev", netif.localname, "down"]) - self.check_cmd([constants.IP_BIN, "link", "set", netif.localname, "name", netif.name]) - - netif.localname = netif.name - - if hwaddr: - self.sethwaddr(ifindex, hwaddr) - - for addr in utils.make_tuple(addrlist): - self.addaddr(ifindex, addr) - - if self.up: - self.check_cmd([constants.IP_BIN, "link", "set", "dev", netif.localname, "up"]) - - def linkconfig(self, netif, bw=None, delay=None, loss=None, duplicate=None, jitter=None, netif2=None): - """ - Apply tc queing disciplines using LxBrNet.linkconfig() - """ - # borrow the tc qdisc commands from LxBrNet.linkconfig() - linux_bridge = LxBrNet(session=self.session, start=False) - linux_bridge.up = True - linux_bridge.linkconfig(netif, bw=bw, delay=delay, loss=loss, duplicate=duplicate, jitter=jitter, netif2=netif2) - del linux_bridge - - def newifindex(self): - with self.lock: - while self.ifindex in self._netif: - self.ifindex += 1 - ifindex = self.ifindex - self.ifindex += 1 - return ifindex - - def newnetif(self, net=None, addrlist=None, hwaddr=None, ifindex=None, ifname=None): - logging.info("creating interface") - if not addrlist: - addrlist = [] - - if self.up and net is None: - raise NotImplementedError - - if ifindex is None: - ifindex = self.newifindex() - - if self.up: - # this is reached when this node is linked to a network node - # tunnel to net not built yet, so build it now and adopt it - gt = self.session.broker.addnettunnel(net.id) - if gt is None or len(gt) != 1: - raise ValueError("error building tunnel from adding a new network interface: %s" % gt) - gt = gt[0] - net.detach(gt) - self.adoptnetif(gt, ifindex, hwaddr, addrlist) - return ifindex - - # this is reached when configuring services (self.up=False) - if ifname is None: - ifname = "gt%d" % ifindex - - netif = GreTap(node=self, name=ifname, session=self.session, start=False) - self.adoptnetif(netif, ifindex, hwaddr, addrlist) - return ifindex - - def privatedir(self, path): - if path[0] != "/": - raise ValueError("path not fully qualified: %s" % path) - hostpath = os.path.join(self.nodedir, os.path.normpath(path).strip('/').replace('/', '.')) - os.mkdir(hostpath) - self.mount(hostpath, path) - - def mount(self, source, target): - source = os.path.abspath(source) - logging.info("mounting %s at %s", source, target) - os.makedirs(target) - self.check_cmd([constants.MOUNT_BIN, "--bind", source, target]) - self._mounts.append((source, target)) - - def umount(self, target): - logging.info("unmounting '%s'" % target) - try: - self.check_cmd([constants.UMOUNT_BIN, "-l", target]) - except CoreCommandError: - logging.exception("unmounting failed for %s", target) - - def opennodefile(self, filename, mode="w"): - dirname, basename = os.path.split(filename) - if not basename: - raise ValueError("no basename for filename: " + filename) - - if dirname and dirname[0] == "/": - dirname = dirname[1:] - - dirname = dirname.replace("/", ".") - dirname = os.path.join(self.nodedir, dirname) - if not os.path.isdir(dirname): - os.makedirs(dirname, mode=0755) - - hostfilename = os.path.join(dirname, basename) - return open(hostfilename, mode) - - def nodefile(self, filename, contents, mode=0644): - with self.opennodefile(filename, "w") as node_file: - node_file.write(contents) - os.chmod(node_file.name, mode) - logging.info("created nodefile: '%s'; mode: 0%o", node_file.name, mode) diff --git a/daemon/core/plugins/__init__.py b/daemon/core/plugins/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/daemon/core/sdt.py b/daemon/core/plugins/sdt.py similarity index 94% rename from daemon/core/sdt.py rename to daemon/core/plugins/sdt.py index fd9c9b14..ae65dfc5 100644 --- a/daemon/core/sdt.py +++ b/daemon/core/plugins/sdt.py @@ -7,16 +7,15 @@ import socket from urlparse import urlparse from core import constants -from core.coreobj import PyCoreNet -from core.coreobj import PyCoreObj -from core.enumerations import EventTypes -from core.enumerations import LinkTlvs -from core.enumerations import LinkTypes -from core.enumerations import MessageFlags -from core.enumerations import MessageTypes -from core.enumerations import NodeTlvs -from core.enumerations import NodeTypes -from core.misc import nodeutils +from core.nodes.base import NodeBase, CoreNetworkBase +from core.emulator.enumerations import EventTypes +from core.emulator.enumerations import LinkTlvs +from core.emulator.enumerations import LinkTypes +from core.emulator.enumerations import MessageFlags +from core.emulator.enumerations import MessageTypes +from core.emulator.enumerations import NodeTlvs +from core.emulator.enumerations import NodeTypes +from core.nodes import nodeutils # TODO: A named tuple may be more appropriate, than abusing a class dict like this @@ -321,22 +320,20 @@ class Sdt(object): :return: nothing """ nets = [] - with self.session._objects_lock: - for obj in self.session.objects.itervalues(): - if isinstance(obj, PyCoreNet): - nets.append(obj) - if not isinstance(obj, PyCoreObj): + with self.session._nodes_lock: + for node in self.session.nodes.itervalues(): + if isinstance(node, CoreNetworkBase): + nets.append(node) + if not isinstance(node, NodeBase): continue - (x, y, z) = obj.getposition() + (x, y, z) = node.getposition() if x is None or y is None: continue - self.updatenode(obj.id, MessageFlags.ADD.value, x, y, z, - obj.name, obj.type, obj.icon) + self.updatenode(node.id, MessageFlags.ADD.value, x, y, z, node.name, node.type, node.icon) for nodenum in sorted(self.remotes.keys()): r = self.remotes[nodenum] x, y, z = r.pos - self.updatenode(nodenum, MessageFlags.ADD.value, x, y, z, - r.name, r.type, r.icon) + self.updatenode(nodenum, MessageFlags.ADD.value, x, y, z, r.name, r.type, r.icon) for net in nets: all_links = net.all_link_data(flags=MessageFlags.ADD.value) @@ -411,7 +408,7 @@ class Sdt(object): nodetype = None try: - node = self.session.get_object(nodenum) + node = self.session.get_node(nodenum) except KeyError: node = None if node: @@ -472,7 +469,7 @@ class Sdt(object): return True else: try: - n = self.session.get_object(nodenum) + n = self.session.get_node(nodenum) except KeyError: return False if nodeutils.is_node(n, (NodeTypes.WIRELESS_LAN, NodeTypes.EMANE)): diff --git a/daemon/core/services/__init__.py b/daemon/core/services/__init__.py index 974cd03e..6c0c18ed 100644 --- a/daemon/core/services/__init__.py +++ b/daemon/core/services/__init__.py @@ -6,7 +6,7 @@ __all__ is automatically loaded by the main core module. """ import os -from core.service import ServiceManager +from core.services.coreservices import ServiceManager _PATH = os.path.abspath(os.path.dirname(__file__)) diff --git a/daemon/core/services/bird.py b/daemon/core/services/bird.py index d0b3d2e9..448cff41 100644 --- a/daemon/core/services/bird.py +++ b/daemon/core/services/bird.py @@ -2,7 +2,7 @@ bird.py: defines routing services provided by the BIRD Internet Routing Daemon. """ -from core.service import CoreService +from core.services.coreservices import CoreService class Bird(CoreService): diff --git a/daemon/core/service.py b/daemon/core/services/coreservices.py similarity index 98% rename from daemon/core/service.py rename to daemon/core/services/coreservices.py index 86a8e3a4..9b762fe1 100644 --- a/daemon/core/service.py +++ b/daemon/core/services/coreservices.py @@ -14,11 +14,10 @@ from multiprocessing.pool import ThreadPool import enum from core.constants import which -from core import CoreCommandError -from core.data import FileData -from core.enumerations import MessageFlags -from core.enumerations import RegisterTlvs -from core.misc import utils +from core import CoreCommandError, utils +from core.emulator.data import FileData +from core.emulator.enumerations import MessageFlags +from core.emulator.enumerations import RegisterTlvs class ServiceBootError(Exception): @@ -58,7 +57,7 @@ class ServiceDependencies(object): Generates the boot paths for the services provided to the class. :return: list of services to boot, in order - :rtype: list[core.service.CoreService] + :rtype: list[core.coreservices.CoreService] """ paths = [] for service in self.node_services.itervalues(): @@ -126,7 +125,7 @@ class ServiceShim(object): Convert service properties into a string list of key=value pairs, separated by "|". - :param core.netns.nodes.CoreNode node: node to get value list for + :param core.netns.vnode.CoreNode node: node to get value list for :param CoreService service: service to get value list for :return: value list string :rtype: str @@ -556,7 +555,7 @@ class CoreServices(object): """ Stop all services on a node. - :param core.netns.nodes.CoreNode node: node to stop services on + :param core.netns.vnode.CoreNode node: node to stop services on :return: nothing """ for service in node.services: diff --git a/daemon/core/services/dockersvc.py b/daemon/core/services/dockersvc.py index 75a31c54..101e30a9 100644 --- a/daemon/core/services/dockersvc.py +++ b/daemon/core/services/dockersvc.py @@ -99,8 +99,8 @@ Limitations: import logging -from core.service import CoreService -from core.service import ServiceManager +from core.services.coreservices import CoreService +from core.services.coreservices import ServiceManager try: from docker import Client diff --git a/daemon/core/services/emaneservices.py b/daemon/core/services/emaneservices.py index 62010e8b..8fb9befe 100644 --- a/daemon/core/services/emaneservices.py +++ b/daemon/core/services/emaneservices.py @@ -1,6 +1,6 @@ -from core.enumerations import NodeTypes -from core.misc import nodeutils -from core.service import CoreService +from core.emulator.enumerations import NodeTypes +from core.nodes import nodeutils +from core.services.coreservices import CoreService from core.xml import emanexml @@ -21,7 +21,7 @@ class EmaneTransportService(CoreService): if filename == cls.configs[0]: transport_commands = [] for interface in node.netifs(sort=True): - network_node = node.session.get_object(interface.net.id) + network_node = node.session.get_node(interface.net.id) if nodeutils.is_node(network_node, NodeTypes.EMANE): config = node.session.emane.get_configs(network_node.id, network_node.model.name) if config and emanexml.is_external(config): diff --git a/daemon/core/services/frr.py b/daemon/core/services/frr.py index 4b51706c..116f9ff6 100644 --- a/daemon/core/services/frr.py +++ b/daemon/core/services/frr.py @@ -4,10 +4,9 @@ Assumes installation of FRR via https://deb.frrouting.org/ """ from core import constants -from core.enumerations import LinkTypes, NodeTypes -from core.misc import ipaddress -from core.misc import nodeutils -from core.service import CoreService +from core.emulator.enumerations import LinkTypes, NodeTypes +from core.nodes import nodeutils, ipaddress +from core.services.coreservices import CoreService class FRRZebra(CoreService): diff --git a/daemon/core/services/nrl.py b/daemon/core/services/nrl.py index a036b732..62f0b9e3 100644 --- a/daemon/core/services/nrl.py +++ b/daemon/core/services/nrl.py @@ -3,9 +3,9 @@ nrl.py: defines services provided by NRL protolib tools hosted here: http://www.nrl.navy.mil/itd/ncs/products """ -from core.misc import utils -from core.misc.ipaddress import Ipv4Prefix -from core.service import CoreService +from core import utils +from core.nodes.ipaddress import Ipv4Prefix +from core.services.coreservices import CoreService class NrlService(CoreService): diff --git a/daemon/core/services/quagga.py b/daemon/core/services/quagga.py index e036a06d..841585ad 100644 --- a/daemon/core/services/quagga.py +++ b/daemon/core/services/quagga.py @@ -3,10 +3,9 @@ quagga.py: defines routing services provided by Quagga. """ from core import constants -from core.enumerations import LinkTypes, NodeTypes -from core.misc import ipaddress -from core.misc import nodeutils -from core.service import CoreService +from core.emulator.enumerations import LinkTypes, NodeTypes +from core.nodes import nodeutils, ipaddress +from core.services.coreservices import CoreService class Zebra(CoreService): diff --git a/daemon/core/services/sdn.py b/daemon/core/services/sdn.py index edbb8dfc..f2b0c084 100644 --- a/daemon/core/services/sdn.py +++ b/daemon/core/services/sdn.py @@ -4,7 +4,7 @@ sdn.py defines services to start Open vSwitch and the Ryu SDN Controller. import re -from core.service import CoreService +from core.services.coreservices import CoreService class SdnService(CoreService): diff --git a/daemon/core/services/security.py b/daemon/core/services/security.py index 9ed3fc39..1fd486d5 100644 --- a/daemon/core/services/security.py +++ b/daemon/core/services/security.py @@ -6,7 +6,7 @@ firewall) import logging from core import constants -from core.service import CoreService +from core.services.coreservices import CoreService class VPNClient(CoreService): diff --git a/daemon/core/services/ucarp.py b/daemon/core/services/ucarp.py index 31657861..ca5bf942 100644 --- a/daemon/core/services/ucarp.py +++ b/daemon/core/services/ucarp.py @@ -2,7 +2,7 @@ ucarp.py: defines high-availability IP address controlled by ucarp """ -from core.service import CoreService +from core.services.coreservices import CoreService UCARP_ETC = "/usr/local/etc/ucarp" diff --git a/daemon/core/services/utility.py b/daemon/core/services/utility.py index 366973a2..a39fa6a6 100644 --- a/daemon/core/services/utility.py +++ b/daemon/core/services/utility.py @@ -4,12 +4,11 @@ utility.py: defines miscellaneous utility services. import os -from core import CoreCommandError +from core import CoreCommandError, utils from core import constants -from core.misc import utils -from core.misc.ipaddress import Ipv4Prefix -from core.misc.ipaddress import Ipv6Prefix -from core.service import CoreService +from core.nodes.ipaddress import Ipv4Prefix +from core.nodes.ipaddress import Ipv6Prefix +from core.services.coreservices import CoreService class UtilService(CoreService): diff --git a/daemon/core/services/xorp.py b/daemon/core/services/xorp.py index 49425ab7..c1564a31 100644 --- a/daemon/core/services/xorp.py +++ b/daemon/core/services/xorp.py @@ -4,7 +4,7 @@ xorp.py: defines routing services provided by the XORP routing suite. import logging -from core.service import CoreService +from core.services.coreservices import CoreService class XorpRtrmgr(CoreService): diff --git a/daemon/core/misc/utils.py b/daemon/core/utils.py similarity index 100% rename from daemon/core/misc/utils.py rename to daemon/core/utils.py diff --git a/daemon/core/xml/corexml.py b/daemon/core/xml/corexml.py index ff063d35..d689f022 100644 --- a/daemon/core/xml/corexml.py +++ b/daemon/core/xml/corexml.py @@ -1,15 +1,14 @@ import logging - from lxml import etree -from core import coreobj +import core.nodes.base +import core.nodes.physical from core.emulator.emudata import InterfaceData from core.emulator.emudata import LinkOptions from core.emulator.emudata import NodeOptions -from core.enumerations import NodeTypes -from core.misc import nodeutils -from core.misc.ipaddress import MacAddress -from core.netns import nodes +from core.emulator.enumerations import NodeTypes +from core.nodes import nodeutils +from core.nodes.ipaddress import MacAddress def write_xml_file(xml_element, file_path, doctype=None): @@ -377,12 +376,12 @@ class CoreXmlWriter(object): self.devices = etree.SubElement(self.scenario, "devices") links = [] - for node in self.session.objects.itervalues(): + for node in self.session.nodes.itervalues(): # network node - if isinstance(node, (coreobj.PyCoreNet, nodes.RJ45Node)) and not nodeutils.is_node(node, NodeTypes.CONTROL_NET): + if isinstance(node, (core.nodes.base.CoreNetworkBase, core.nodes.physical.Rj45Node)) and not nodeutils.is_node(node, NodeTypes.CONTROL_NET): self.write_network(node) # device node - elif isinstance(node, nodes.PyCoreNode): + elif isinstance(node, core.nodes.base.CoreNodeBase): self.write_device(node) # add known links @@ -432,7 +431,7 @@ class CoreXmlWriter(object): # check for interface one if link_data.interface1_id is not None: interface_one = etree.Element("interface_one") - node = self.session.get_object(link_data.node1_id) + node = self.session.get_node(link_data.node1_id) node_interface = node.netif(link_data.interface1_id) add_attribute(interface_one, "id", link_data.interface1_id) @@ -453,7 +452,7 @@ class CoreXmlWriter(object): # check for interface two if link_data.interface2_id is not None: interface_two = etree.Element("interface_two") - node = self.session.get_object(link_data.node2_id) + node = self.session.get_node(link_data.node2_id) node_interface = node.netif(link_data.interface2_id) add_attribute(interface_two, "id", link_data.interface2_id) diff --git a/daemon/core/xml/corexmldeployment.py b/daemon/core/xml/corexmldeployment.py index ea1dfc72..aff7b1ae 100644 --- a/daemon/core/xml/corexmldeployment.py +++ b/daemon/core/xml/corexmldeployment.py @@ -3,10 +3,10 @@ import socket from lxml import etree -from core import constants -from core.coreobj import PyCoreNode -from core.enumerations import NodeTypes -from core.misc import utils, nodeutils, ipaddress +from core import constants, utils +from core.nodes.base import CoreNodeBase +from core.emulator.enumerations import NodeTypes +from core.nodes import nodeutils, ipaddress def add_type(parent_element, name): @@ -100,8 +100,8 @@ class CoreXmlDeployment(object): # servers = self.session.broker.getservernames() # servers.remove("localhost") - for node in self.session.objects.itervalues(): - if isinstance(node, PyCoreNode): + for node in self.session.nodes.itervalues(): + if isinstance(node, CoreNodeBase): self.add_virtual_host(physical_host, node) def add_physical_host(self, name): @@ -119,7 +119,7 @@ class CoreXmlDeployment(object): return host_element def add_virtual_host(self, physical_host, node): - if not isinstance(node, PyCoreNode): + if not isinstance(node, CoreNodeBase): raise TypeError("invalid node type: %s" % node) # create virtual host element diff --git a/daemon/core/xml/emanexml.py b/daemon/core/xml/emanexml.py index 3fb3945c..1696f790 100644 --- a/daemon/core/xml/emanexml.py +++ b/daemon/core/xml/emanexml.py @@ -3,8 +3,8 @@ import os from lxml import etree -from core.misc import utils -from core.misc.ipaddress import MacAddress +from core import utils +from core.nodes.ipaddress import MacAddress from core.xml import corexml _hwaddr_prefix = "02:02" @@ -101,7 +101,7 @@ def build_node_platform_xml(emane_manager, control_net, node, nem_id, platform_x Create platform xml for a specific node. :param core.emane.emanemanager.EmaneManager emane_manager: emane manager with emane configurations - :param core.netns.nodes.CtrlNet control_net: control net node for this emane network + :param core.nodes.network.CtrlNet control_net: control net node for this emane network :param core.emane.nodes.EmaneNode node: node to write platform xml for :param int nem_id: nem id to use for interfaces for this node :param dict platform_xmls: stores platform xml elements to append nem entries to @@ -121,7 +121,7 @@ def build_node_platform_xml(emane_manager, control_net, node, nem_id, platform_x nem_element = etree.Element("nem", id=str(nem_id), name=netif.localname, definition=nem_definition) # check if this is an external transport, get default config if an interface specific one does not exist - config = emane_manager.getifcconfig(node.model.object_id, netif, node.model.name) + config = emane_manager.getifcconfig(node.model.id, netif, node.model.name) if is_external(config): nem_element.set("transport", "external") @@ -214,7 +214,7 @@ def build_xml_files(emane_manager, node): return # get model configurations - config = emane_manager.get_configs(node.model.object_id, node.model.name) + config = emane_manager.get_configs(node.model.id, node.model.name) if not config: return @@ -229,7 +229,7 @@ def build_xml_files(emane_manager, node): for netif in node.netifs(): # check for interface specific emane configuration and write xml files, if needed - config = emane_manager.getifcconfig(node.model.object_id, netif, node.model.name) + config = emane_manager.getifcconfig(node.model.id, netif, node.model.name) if config: node.model.build_xml_files(config, netif) @@ -379,7 +379,7 @@ def _basename(emane_model, interface=None): :return: basename used for file creation :rtype: str """ - name = "n%s" % emane_model.object_id + name = "n%s" % emane_model.id if interface: node_id = interface.node.id diff --git a/daemon/examples/api/emane80211.py b/daemon/examples/api/emane80211.py index c0ecf11e..c111962c 100644 --- a/daemon/examples/api/emane80211.py +++ b/daemon/examples/api/emane80211.py @@ -9,7 +9,7 @@ from core import load_logging_config from core.emane.ieee80211abg import EmaneIeee80211abgModel from core.emulator.coreemu import CoreEmu from core.emulator.emudata import IpPrefixes -from core.enumerations import EventTypes +from core.emulator.enumerations import EventTypes load_logging_config() @@ -43,7 +43,7 @@ def example(options): session.instantiate() # start a shell on the first node - node = session.get_object(2) + node = session.get_node(2) node.client.term("bash") # shutdown session diff --git a/daemon/examples/api/switch.py b/daemon/examples/api/switch.py index 1bab2fff..633d9b46 100644 --- a/daemon/examples/api/switch.py +++ b/daemon/examples/api/switch.py @@ -11,7 +11,7 @@ import parser from core import load_logging_config from core.emulator.coreemu import CoreEmu from core.emulator.emudata import IpPrefixes -from core.enumerations import NodeTypes, EventTypes +from core.emulator.enumerations import NodeTypes, EventTypes load_logging_config() @@ -40,8 +40,8 @@ def example(options): session.instantiate() # get nodes to run example - first_node = session.get_object(2) - last_node = session.get_object(options.nodes + 1) + first_node = session.get_node(2) + last_node = session.get_node(options.nodes + 1) print "starting iperf server on node: %s" % first_node.name first_node.cmd(["iperf", "-s", "-D"]) diff --git a/daemon/examples/api/switch_inject.py b/daemon/examples/api/switch_inject.py index 7e9300a6..0c80b0f9 100644 --- a/daemon/examples/api/switch_inject.py +++ b/daemon/examples/api/switch_inject.py @@ -6,7 +6,7 @@ # nodestep from core import load_logging_config from core.emulator.emudata import IpPrefixes -from core.enumerations import NodeTypes, EventTypes +from core.emulator.enumerations import NodeTypes, EventTypes load_logging_config() diff --git a/daemon/examples/api/wlan.py b/daemon/examples/api/wlan.py index 1cbd9dd9..aa3c7a03 100644 --- a/daemon/examples/api/wlan.py +++ b/daemon/examples/api/wlan.py @@ -11,8 +11,8 @@ import parser from core import load_logging_config from core.emulator.coreemu import CoreEmu from core.emulator.emudata import IpPrefixes, NodeOptions -from core.enumerations import NodeTypes, EventTypes -from core.mobility import BasicRangeModel +from core.emulator.enumerations import NodeTypes, EventTypes +from core.location.mobility import BasicRangeModel load_logging_config() @@ -44,8 +44,8 @@ def example(options): session.instantiate() # get nodes for example run - first_node = session.get_object(2) - last_node = session.get_object(options.nodes + 1) + first_node = session.get_node(2) + last_node = session.get_node(options.nodes + 1) print "starting iperf server on node: %s" % first_node.name first_node.cmd(["iperf", "-s", "-D"]) diff --git a/daemon/examples/eventloop.py b/daemon/examples/eventloop.py index 7c1b0f8f..d602ee50 100644 --- a/daemon/examples/eventloop.py +++ b/daemon/examples/eventloop.py @@ -1,7 +1,7 @@ import logging import time -from core.misc.event import EventLoop +from core.location.event import EventLoop def main(): diff --git a/daemon/examples/grpc/switch.py b/daemon/examples/grpc/switch.py index 354e7b66..bad993f1 100644 --- a/daemon/examples/grpc/switch.py +++ b/daemon/examples/grpc/switch.py @@ -1,7 +1,6 @@ import logging -from core.grpc import client -from core.grpc import core_pb2 +from core.api.grpc import client, core_pb2 def log_event(event): diff --git a/daemon/examples/myservices/sample.py b/daemon/examples/myservices/sample.py index 843e59ef..3a58345d 100644 --- a/daemon/examples/myservices/sample.py +++ b/daemon/examples/myservices/sample.py @@ -2,8 +2,8 @@ Sample user-defined service. """ -from core.service import CoreService -from core.service import ServiceMode +from core.services.coreservices import CoreService +from core.services.coreservices import ServiceMode ## Custom CORE Service diff --git a/daemon/examples/netns/daemonnodes.py b/daemon/examples/netns/daemonnodes.py index 5d1e2d3c..23061fc2 100755 --- a/daemon/examples/netns/daemonnodes.py +++ b/daemon/examples/netns/daemonnodes.py @@ -14,23 +14,23 @@ import datetime import optparse import sys -from core.api import coreapi -from core.api import dataconversion -from core.api.coreapi import CoreExecuteTlv -from core.enumerations import CORE_API_PORT -from core.enumerations import EventTlvs -from core.enumerations import EventTypes -from core.enumerations import ExecuteTlvs -from core.enumerations import LinkTlvs -from core.enumerations import LinkTypes -from core.enumerations import MessageFlags -from core.enumerations import MessageTypes -from core.misc import ipaddress -from core.netns import nodes +import core.nodes.base +import core.nodes.network +from core.api.tlv import coreapi, dataconversion +from core.api.tlv.coreapi import CoreExecuteTlv +from core.emulator.enumerations import CORE_API_PORT +from core.emulator.enumerations import EventTlvs +from core.emulator.enumerations import EventTypes +from core.emulator.enumerations import ExecuteTlvs +from core.emulator.enumerations import LinkTlvs +from core.emulator.enumerations import LinkTypes +from core.emulator.enumerations import MessageFlags +from core.emulator.enumerations import MessageTypes +from core.nodes import ipaddress # declare classes for use with Broker -from core.session import Session +from core.emulator.session import Session # node list (count from 1) n = [None] @@ -136,7 +136,7 @@ def main(): session.broker.handlerawmsg(coreapi.CoreEventMessage.pack(0, tlvdata)) flags = MessageFlags.ADD.value - switch = nodes.SwitchNode(session=session, name="switch", start=False) + switch = core.nodes.network.SwitchNode(session=session, name="switch", start=False) switch.setposition(x=80, y=50) switch.server = daemon switch_data = switch.data(flags) @@ -149,7 +149,7 @@ def main(): # create remote nodes via API for i in xrange(1, number_of_nodes + 1): - node = nodes.CoreNode(session=session, _id=i, name="n%d" % i, start=False) + node = core.nodes.base.CoreNode(session=session, _id=i, name="n%d" % i, start=False) node.setposition(x=150 * i, y=150) node.server = daemon node_data = node.data(flags) diff --git a/daemon/examples/netns/distributed.py b/daemon/examples/netns/distributed.py index 3c092b66..2bd55d3e 100755 --- a/daemon/examples/netns/distributed.py +++ b/daemon/examples/netns/distributed.py @@ -13,12 +13,13 @@ import datetime import optparse import sys +import core.nodes.base +import core.nodes.network from core import constants -from core.api import coreapi, dataconversion -from core.enumerations import CORE_API_PORT, EventTypes, EventTlvs, LinkTlvs, LinkTypes, MessageFlags -from core.misc import ipaddress -from core.netns import nodes -from core.session import Session +from core.api.tlv import coreapi, dataconversion +from core.emulator.enumerations import CORE_API_PORT, EventTypes, EventTlvs, LinkTlvs, LinkTypes, MessageFlags +from core.nodes import ipaddress +from core.emulator.session import Session # node list (count from 1) n = [None] @@ -73,14 +74,14 @@ def main(): tlvdata = coreapi.CoreEventTlv.pack(EventTlvs.TYPE.value, EventTypes.CONFIGURATION_STATE.value) session.broker.handlerawmsg(coreapi.CoreEventMessage.pack(0, tlvdata)) - switch = session.add_object(cls=nodes.SwitchNode, name="switch") + switch = session.create_node(cls=core.nodes.network.SwitchNode, name="switch") switch.setposition(x=80, y=50) num_local = options.numnodes / 2 num_remote = options.numnodes / 2 + options.numnodes % 2 print "creating %d (%d local / %d remote) nodes with addresses from %s" % \ (options.numnodes, num_local, num_remote, prefix) for i in xrange(1, num_local + 1): - node = session.add_object(cls=nodes.CoreNode, name="n%d" % i, _id=i) + node = session.create_node(cls=core.nodes.base.CoreNode, name="n%d" % i, _id=i) node.newnetif(switch, ["%s/%s" % (prefix.addr(i), prefix.prefixlen)]) node.cmd([constants.SYSCTL_BIN, "net.ipv4.icmp_echo_ignore_broadcasts=0"]) node.setposition(x=150 * i, y=150) @@ -91,7 +92,7 @@ def main(): # create remote nodes via API for i in xrange(num_local + 1, options.numnodes + 1): - node = nodes.CoreNode(session=session, _id=i, name="n%d" % i, start=False) + node = core.nodes.base.CoreNode(session=session, _id=i, name="n%d" % i, start=False) node.setposition(x=150 * i, y=150) node.server = slave n.append(node) diff --git a/daemon/examples/netns/howmanynodes.py b/daemon/examples/netns/howmanynodes.py index 851baeb6..bf709a57 100755 --- a/daemon/examples/netns/howmanynodes.py +++ b/daemon/examples/netns/howmanynodes.py @@ -19,10 +19,11 @@ import shutil import sys import time +import core.nodes.base +import core.nodes.network from core import constants -from core.misc import ipaddress -from core.netns import nodes -from core.session import Session +from core.nodes import ipaddress +from core.emulator.session import Session GBD = 1024.0 * 1024.0 @@ -135,7 +136,7 @@ def main(): lfp.flush() session = Session(1) - switch = session.add_object(cls=nodes.SwitchNode) + switch = session.create_node(cls=core.nodes.network.SwitchNode) switchlist.append(switch) print "Added bridge %s (%d)." % (switch.brname, len(switchlist)) @@ -146,7 +147,7 @@ def main(): # optionally add a bridge (options.bridges nodes per bridge) try: if 0 < options.bridges <= switch.numnetif(): - switch = session.add_object(cls=nodes.SwitchNode) + switch = session.create_node(cls=core.nodes.network.SwitchNode) switchlist.append(switch) print "\nAdded bridge %s (%d) for node %d." % (switch.brname, len(switchlist), i) except Exception, e: @@ -155,7 +156,7 @@ def main(): # create a node try: - n = session.add_object(cls=nodes.LxcNode, name="n%d" % i) + n = session.create_node(cls=core.nodes.base.CoreNode, name="n%d" % i) n.newnetif(switch, ["%s/%s" % (prefix.addr(i), prefix.prefixlen)]) n.cmd([constants.SYSCTL_BIN, "net.ipv4.icmp_echo_ignore_broadcasts=0"]) if options.services is not None: diff --git a/daemon/examples/netns/ospfmanetmdrtest.py b/daemon/examples/netns/ospfmanetmdrtest.py index ed6b3ba8..3bf4f7d0 100755 --- a/daemon/examples/netns/ospfmanetmdrtest.py +++ b/daemon/examples/netns/ospfmanetmdrtest.py @@ -15,14 +15,13 @@ import sys import time from string import Template +import core.nodes.base +import core.nodes.network from core.constants import QUAGGA_STATE_DIR - -from core.misc import ipaddress -from core.misc.utils import check_cmd -from core.netns import nodes - +from core.nodes import ipaddress +from core.utils import check_cmd # this is the /etc/core/core.conf default -from core.session import Session +from core.emulator.session import Session quagga_sbin_search = ("/usr/local/sbin", "/usr/sbin", "/usr/lib/quagga") quagga_path = "zebra" @@ -39,7 +38,7 @@ except OSError: sys.exit(1) -class ManetNode(nodes.LxcNode): +class ManetNode(core.nodes.base.CoreNode): """ An Lxc namespace node configured for Quagga OSPFv3 MANET MDR """ conftemp = Template("""\ @@ -69,7 +68,7 @@ ip forwarding routerid = ipaddr.split("/")[0] self.ipaddr = ipaddr self.routerid = routerid - nodes.LxcNode.__init__(self, core, _id, name, nodedir) + core.nodes.base.CoreBaseNode.__init__(self, core, _id, name, nodedir) self.privatedir(self.confdir) self.privatedir(QUAGGA_STATE_DIR) @@ -243,10 +242,10 @@ class ManetExperiment(object): prefix = ipaddress.Ipv4Prefix("10.14.0.0/16") self.session = Session(1) # emulated network - self.net = self.session.add_object(cls=nodes.WlanNode) + self.net = self.session.create_node(cls=core.nodes.network.WlanNode) for i in xrange(1, numnodes + 1): addr = "%s/%s" % (prefix.addr(i), 32) - tmp = self.session.add_object(cls=ManetNode, ipaddr=addr, _id="%d" % i, name="n%d" % i) + tmp = self.session.create_node(cls=ManetNode, ipaddr=addr, _id="%d" % i, name="n%d" % i) tmp.newnetif(self.net, [addr]) self.nodes.append(tmp) # connect nodes with probability linkprob diff --git a/daemon/examples/netns/wlanemanetests.py b/daemon/examples/netns/wlanemanetests.py index 0d78d792..b0870deb 100755 --- a/daemon/examples/netns/wlanemanetests.py +++ b/daemon/examples/netns/wlanemanetests.py @@ -37,13 +37,14 @@ import os import sys import time +import core.nodes.base +import core.nodes.network from core import emane from core.emane.bypass import EmaneBypassModel from core.emane.nodes import EmaneNode from core.emane.rfpipe import EmaneRfPipeModel -from core.misc import ipaddress -from core.netns import nodes -from core.session import Session +from core.nodes import ipaddress +from core.emulator.session import Session try: import emaneeventservice @@ -413,11 +414,11 @@ class Experiment(object): prefix = ipaddress.Ipv4Prefix("10.0.0.0/16") self.session = Session(1) # emulated network - self.net = self.session.add_object(cls=nodes.WlanNode, name="wlan1") + self.net = self.session.create_node(cls=core.nodes.network.WlanNode, name="wlan1") prev = None for i in xrange(1, numnodes + 1): addr = "%s/%s" % (prefix.addr(i), 32) - tmp = self.session.add_object(cls=nodes.CoreNode, _id=i, name="n%d" % i) + tmp = self.session.create_node(cls=core.nodes.base.CoreNode, _id=i, name="n%d" % i) tmp.newnetif(self.net, [addr]) self.nodes.append(tmp) self.session.services.add_services(tmp, "router", "IPForward") @@ -440,12 +441,12 @@ class Experiment(object): self.session.location.setrefgeo(47.57917, -122.13232, 2.00000) self.session.location.refscale = 150.0 self.session.emane.loadmodels() - self.net = self.session.add_object(cls=EmaneNode, _id=numnodes + 1, name="wlan1") + self.net = self.session.create_node(cls=EmaneNode, _id=numnodes + 1, name="wlan1") self.net.verbose = verbose # self.session.emane.addobj(self.net) for i in xrange(1, numnodes + 1): addr = "%s/%s" % (prefix.addr(i), 32) - tmp = self.session.add_object(cls=nodes.CoreNode, _id=i, name="n%d" % i) + tmp = self.session.create_node(cls=core.nodes.base.CoreNode, _id=i, name="n%d" % i) # tmp.setposition(i * 20, 50, None) tmp.setposition(50, 50, None) tmp.newnetif(self.net, [addr]) diff --git a/daemon/examples/stopsession.py b/daemon/examples/stopsession.py index 9cbfc2cb..d6b2349d 100755 --- a/daemon/examples/stopsession.py +++ b/daemon/examples/stopsession.py @@ -8,8 +8,8 @@ import optparse import socket -from core.api import coreapi -from core.enumerations import MessageFlags, SessionTlvs, CORE_API_PORT +from core.api.tlv import coreapi +from core.emulator.enumerations import MessageFlags, SessionTlvs, CORE_API_PORT def main(): diff --git a/daemon/proto/Makefile.am b/daemon/proto/Makefile.am index bcf62a2c..59665a6f 100644 --- a/daemon/proto/Makefile.am +++ b/daemon/proto/Makefile.am @@ -1,5 +1,5 @@ all: - $(PYTHON) -m grpc_tools.protoc -I . --python_out=../core/grpc --grpc_python_out=../core/grpc core.proto + $(PYTHON) -m grpc_tools.protoc -I . --python_out=../core/api/grpc --grpc_python_out=../core/api/grpc core.proto clean: - -rm -f ../core/grpc/core_pb2* + -rm -f ../core/api/grpc/core_pb2* diff --git a/daemon/scripts/core-daemon b/daemon/scripts/core-daemon index a1c14cec..e40ace9b 100755 --- a/daemon/scripts/core-daemon +++ b/daemon/scripts/core-daemon @@ -14,11 +14,11 @@ import time from core import load_logging_config from core import constants -from core import enumerations -from core.corehandlers import CoreHandler -from core.coreserver import CoreServer -from core.grpc.server import CoreGrpcServer -from core.misc.utils import close_onexec +from core.emulator import enumerations +from core.api.tlv.corehandlers import CoreHandler +from core.api.tlv.coreserver import CoreServer +from core.api.grpc.server import CoreGrpcServer +from core.utils import close_onexec load_logging_config() @@ -48,7 +48,7 @@ def cored(cfg): try: server = CoreServer((host, port), CoreHandler, cfg) if cfg["ovs"] == "True": - from core.netns.openvswitch import OVS_NODES + from core.nodes.openvswitch import OVS_NODES server.coreemu.update_nodes(OVS_NODES) except: logging.exception("error starting main server on: %s:%s", host, port) diff --git a/daemon/scripts/coresendmsg b/daemon/scripts/coresendmsg index be6e030b..d8d8a2d3 100644 --- a/daemon/scripts/coresendmsg +++ b/daemon/scripts/coresendmsg @@ -8,11 +8,11 @@ import os import socket import sys -from core.api import coreapi -from core.enumerations import CORE_API_PORT -from core.enumerations import MessageFlags -from core.enumerations import MessageTypes -from core.enumerations import SessionTlvs +from core.api.tlv import coreapi +from core.emulator.enumerations import CORE_API_PORT +from core.emulator.enumerations import MessageFlags +from core.emulator.enumerations import MessageTypes +from core.emulator.enumerations import SessionTlvs def print_available_tlvs(t, tlv_class): diff --git a/daemon/tests/conftest.py b/daemon/tests/conftest.py index 4e8a2871..221700d5 100644 --- a/daemon/tests/conftest.py +++ b/daemon/tests/conftest.py @@ -9,30 +9,30 @@ import time import pytest from mock.mock import MagicMock -from core.api.coreapi import CoreConfMessage -from core.api.coreapi import CoreEventMessage -from core.api.coreapi import CoreExecMessage -from core.api.coreapi import CoreLinkMessage -from core.api.coreapi import CoreNodeMessage -from core.corehandlers import CoreHandler -from core.coreserver import CoreServer +from core.api.tlv.coreapi import CoreConfMessage +from core.api.tlv.coreapi import CoreEventMessage +from core.api.tlv.coreapi import CoreExecMessage +from core.api.tlv.coreapi import CoreLinkMessage +from core.api.tlv.coreapi import CoreNodeMessage +from core.api.tlv.corehandlers import CoreHandler +from core.api.tlv.coreserver import CoreServer from core.emulator.coreemu import CoreEmu from core.emulator.emudata import IpPrefixes -from core.enumerations import CORE_API_PORT -from core.enumerations import ConfigTlvs -from core.enumerations import EventTlvs -from core.enumerations import EventTypes -from core.enumerations import ExecuteTlvs -from core.enumerations import LinkTlvs -from core.enumerations import LinkTypes -from core.enumerations import MessageFlags -from core.enumerations import NodeTlvs -from core.enumerations import NodeTypes -from core.grpc.client import InterfaceHelper -from core.grpc.server import CoreGrpcServer -from core.misc import ipaddress -from core.misc.ipaddress import MacAddress -from core.service import ServiceManager +from core.emulator.enumerations import CORE_API_PORT +from core.emulator.enumerations import ConfigTlvs +from core.emulator.enumerations import EventTlvs +from core.emulator.enumerations import EventTypes +from core.emulator.enumerations import ExecuteTlvs +from core.emulator.enumerations import LinkTlvs +from core.emulator.enumerations import LinkTypes +from core.emulator.enumerations import MessageFlags +from core.emulator.enumerations import NodeTlvs +from core.emulator.enumerations import NodeTypes +from core.api.grpc.client import InterfaceHelper +from core.api.grpc.server import CoreGrpcServer +from core.nodes import ipaddress +from core.nodes.ipaddress import MacAddress +from core.services.coreservices import ServiceManager EMANE_SERVICES = "zebra|OSPFv3MDR|IPForward" diff --git a/daemon/tests/distributed/test_distributed.py b/daemon/tests/distributed/test_distributed.py index 0a808f0f..925c4b7f 100644 --- a/daemon/tests/distributed/test_distributed.py +++ b/daemon/tests/distributed/test_distributed.py @@ -4,12 +4,12 @@ Unit tests for testing CORE with distributed networks. import conftest -from core.api.coreapi import CoreExecMessage -from core.enumerations import EventTypes -from core.enumerations import ExecuteTlvs -from core.enumerations import MessageFlags -from core.enumerations import NodeTypes -from core.misc.ipaddress import IpAddress +from core.api.tlv.coreapi import CoreExecMessage +from core.emulator.enumerations import EventTypes +from core.emulator.enumerations import ExecuteTlvs +from core.emulator.enumerations import MessageFlags +from core.emulator.enumerations import NodeTypes +from core.nodes.ipaddress import IpAddress def validate_response(replies, _): @@ -89,7 +89,7 @@ class TestDistributed: cored.request_handler.handle_message(message) # test a ping command - node_one = cored.session.get_object(1) + node_one = cored.session.get_node(1) message = conftest.command_message(node_one, "ping -c 5 %s" % ip4_address) cored.request_handler.dispatch_replies = validate_response cored.request_handler.handle_message(message) @@ -155,7 +155,7 @@ class TestDistributed: cored.request_handler.handle_message(message) # test a ping command - node_one = cored.session.get_object(1) + node_one = cored.session.get_node(1) message = conftest.command_message(node_one, "ping -c 5 %s" % ip4_address) cored.request_handler.dispatch_replies = validate_response cored.request_handler.handle_message(message) diff --git a/daemon/tests/myservices/sample.py b/daemon/tests/myservices/sample.py index e6673670..5a12c795 100644 --- a/daemon/tests/myservices/sample.py +++ b/daemon/tests/myservices/sample.py @@ -2,7 +2,7 @@ Sample user-defined services for testing. """ -from core.service import CoreService +from core.services.coreservices import CoreService class MyService(CoreService): diff --git a/daemon/tests/test_conf.py b/daemon/tests/test_conf.py index 15b17300..0d2dc78f 100644 --- a/daemon/tests/test_conf.py +++ b/daemon/tests/test_conf.py @@ -1,13 +1,13 @@ import pytest -from core.conf import ConfigurableManager -from core.conf import ConfigurableOptions -from core.conf import Configuration -from core.conf import ModelManager +from core.config import ConfigurableManager +from core.config import ConfigurableOptions +from core.config import Configuration +from core.config import ModelManager from core.emane.ieee80211abg import EmaneIeee80211abgModel -from core.enumerations import ConfigDataTypes -from core.enumerations import NodeTypes -from core.mobility import BasicRangeModel +from core.emulator.enumerations import ConfigDataTypes +from core.emulator.enumerations import NodeTypes +from core.location.mobility import BasicRangeModel class TestConfigurableOptions(ConfigurableOptions): diff --git a/daemon/tests/test_core.py b/daemon/tests/test_core.py index 04f05897..176bcdd1 100644 --- a/daemon/tests/test_core.py +++ b/daemon/tests/test_core.py @@ -10,11 +10,11 @@ import pytest from mock import MagicMock from core.emulator.emudata import NodeOptions -from core.enumerations import MessageFlags -from core.enumerations import NodeTypes -from core.mobility import BasicRangeModel -from core.mobility import Ns2ScriptedMobility -from core.netns.vnodeclient import VnodeClient +from core.emulator.enumerations import MessageFlags +from core.emulator.enumerations import NodeTypes +from core.location.mobility import BasicRangeModel +from core.location.mobility import Ns2ScriptedMobility +from core.nodes.client import VnodeClient _PATH = os.path.abspath(os.path.dirname(__file__)) _MOBILITY_FILE = os.path.join(_PATH, "mobility.scen") diff --git a/daemon/tests/test_grpc.py b/daemon/tests/test_grpc.py index 9b4cc0fa..22cd3afe 100644 --- a/daemon/tests/test_grpc.py +++ b/daemon/tests/test_grpc.py @@ -5,13 +5,13 @@ from Queue import Queue import grpc import pytest -from core.conf import ConfigShim -from core.data import EventData +from core.config import ConfigShim +from core.emulator.data import EventData from core.emane.ieee80211abg import EmaneIeee80211abgModel -from core.enumerations import NodeTypes, EventTypes, ConfigFlags, ExceptionLevels -from core.grpc import core_pb2 -from core.grpc.client import CoreGrpcClient -from core.mobility import BasicRangeModel, Ns2ScriptedMobility +from core.emulator.enumerations import NodeTypes, EventTypes, ConfigFlags, ExceptionLevels +from core.api.grpc import core_pb2 +from core.api.grpc.client import CoreGrpcClient +from core.location.mobility import BasicRangeModel, Ns2ScriptedMobility class TestGrpc: @@ -182,7 +182,7 @@ class TestGrpc: # then assert response.id is not None - assert session.get_object(response.id) is not None + assert session.get_node(response.id) is not None def test_get_node(self, grpc_server): # given @@ -237,7 +237,7 @@ class TestGrpc: assert response.result is expected if expected is True: with pytest.raises(KeyError): - assert session.get_object(node.id) + assert session.get_node(node.id) def test_get_hooks(self, grpc_server): # given @@ -390,8 +390,8 @@ class TestGrpc: interface_two = ip_prefixes.create_interface(node_two) session.add_link(node_one.id, node_two.id, interface_one, interface_two) link_node = None - for node_id in session.objects: - node = session.objects[node_id] + for node_id in session.nodes: + node = session.nodes[node_id] if node.id not in {node_one.id, node_two.id}: link_node = node break diff --git a/daemon/tests/test_gui.py b/daemon/tests/test_gui.py index 95962739..a06d61a9 100644 --- a/daemon/tests/test_gui.py +++ b/daemon/tests/test_gui.py @@ -4,17 +4,17 @@ Unit tests for testing with a CORE switch. import threading -from core.api import coreapi, dataconversion -from core.api.coreapi import CoreExecuteTlv -from core.enumerations import CORE_API_PORT, NodeTypes -from core.enumerations import EventTlvs -from core.enumerations import EventTypes -from core.enumerations import ExecuteTlvs -from core.enumerations import LinkTlvs -from core.enumerations import LinkTypes -from core.enumerations import MessageFlags -from core.enumerations import MessageTypes -from core.misc import ipaddress +from core.api.tlv import coreapi, dataconversion +from core.api.tlv.coreapi import CoreExecuteTlv +from core.emulator.enumerations import CORE_API_PORT, NodeTypes +from core.emulator.enumerations import EventTlvs +from core.emulator.enumerations import EventTypes +from core.emulator.enumerations import ExecuteTlvs +from core.emulator.enumerations import LinkTlvs +from core.emulator.enumerations import LinkTypes +from core.emulator.enumerations import MessageFlags +from core.emulator.enumerations import MessageTypes +from core.nodes import ipaddress def command_message(node, command): diff --git a/daemon/tests/test_links.py b/daemon/tests/test_links.py index c032c4a6..fa3a3a5c 100644 --- a/daemon/tests/test_links.py +++ b/daemon/tests/test_links.py @@ -1,6 +1,6 @@ from core.emulator.emudata import LinkOptions -from core.enumerations import NodeTypes -from core.misc import utils +from core.emulator.enumerations import NodeTypes +from core import utils def create_ptp_network(session, ip_prefixes): diff --git a/daemon/tests/test_nodes.py b/daemon/tests/test_nodes.py index a361ff6c..bebf7dbc 100644 --- a/daemon/tests/test_nodes.py +++ b/daemon/tests/test_nodes.py @@ -4,8 +4,8 @@ import time import pytest from core.emulator.emudata import NodeOptions -from core.enumerations import NodeTypes -from core.misc import utils +from core.emulator.enumerations import NodeTypes +from core import utils MODELS = [ "router", @@ -63,7 +63,7 @@ class TestNodes: # then with pytest.raises(KeyError): - session.get_object(node.id) + session.get_node(node.id) @pytest.mark.parametrize("net_type", NET_TYPES) def test_net(self, session, net_type): diff --git a/daemon/tests/test_services.py b/daemon/tests/test_services.py index 42c10634..d6960dfc 100644 --- a/daemon/tests/test_services.py +++ b/daemon/tests/test_services.py @@ -2,9 +2,9 @@ import os import pytest -from core.service import CoreService -from core.service import ServiceDependencies -from core.service import ServiceManager +from core.services.coreservices import CoreService +from core.services.coreservices import ServiceDependencies +from core.services.coreservices import ServiceManager _PATH = os.path.abspath(os.path.dirname(__file__)) _SERVICES_PATH = os.path.join(_PATH, "myservices") diff --git a/daemon/tests/test_utils.py b/daemon/tests/test_utils.py index 997dce0f..571a376d 100644 --- a/daemon/tests/test_utils.py +++ b/daemon/tests/test_utils.py @@ -1,4 +1,4 @@ -from core.misc import utils +from core import utils class TestUtils: diff --git a/daemon/tests/test_xml.py b/daemon/tests/test_xml.py index 04db4c0e..f093b225 100644 --- a/daemon/tests/test_xml.py +++ b/daemon/tests/test_xml.py @@ -4,8 +4,8 @@ import pytest from core.emane.ieee80211abg import EmaneIeee80211abgModel from core.emulator.emudata import NodeOptions -from core.enumerations import NodeTypes -from core.mobility import BasicRangeModel +from core.emulator.enumerations import NodeTypes +from core.location.mobility import BasicRangeModel from core.services.utility import SshService @@ -87,16 +87,16 @@ class TestXml: # verify nodes have been removed from session with pytest.raises(KeyError): - assert not session.get_object(n1_id) + assert not session.get_node(n1_id) with pytest.raises(KeyError): - assert not session.get_object(n2_id) + assert not session.get_node(n2_id) # load saved xml session.open_xml(file_path, start=True) # verify nodes have been recreated - assert session.get_object(n1_id) - assert session.get_object(n2_id) + assert session.get_node(n1_id) + assert session.get_node(n2_id) def test_xml_ptp_services(self, session, tmpdir, ip_prefixes): """ @@ -147,9 +147,9 @@ class TestXml: # verify nodes have been removed from session with pytest.raises(KeyError): - assert not session.get_object(n1_id) + assert not session.get_node(n1_id) with pytest.raises(KeyError): - assert not session.get_object(n2_id) + assert not session.get_node(n2_id) # load saved xml session.open_xml(file_path, start=True) @@ -158,8 +158,8 @@ class TestXml: service = session.services.get_service(node_one.id, SshService.name) # verify nodes have been recreated - assert session.get_object(n1_id) - assert session.get_object(n2_id) + assert session.get_node(n1_id) + assert session.get_node(n2_id) assert service.config_data.get(service_file) == file_data def test_xml_mobility(self, session, tmpdir, ip_prefixes): @@ -208,9 +208,9 @@ class TestXml: # verify nodes have been removed from session with pytest.raises(KeyError): - assert not session.get_object(n1_id) + assert not session.get_node(n1_id) with pytest.raises(KeyError): - assert not session.get_object(n2_id) + assert not session.get_node(n2_id) # load saved xml session.open_xml(file_path, start=True) @@ -219,9 +219,9 @@ class TestXml: value = str(session.mobility.get_config("test", wlan_id, BasicRangeModel.name)) # verify nodes and configuration were restored - assert session.get_object(n1_id) - assert session.get_object(n2_id) - assert session.get_object(wlan_id) + assert session.get_node(n1_id) + assert session.get_node(n2_id) + assert session.get_node(wlan_id) assert value == "1" def test_xml_emane(self, session, tmpdir, ip_prefixes): @@ -275,9 +275,9 @@ class TestXml: # verify nodes have been removed from session with pytest.raises(KeyError): - assert not session.get_object(n1_id) + assert not session.get_node(n1_id) with pytest.raises(KeyError): - assert not session.get_object(n2_id) + assert not session.get_node(n2_id) # load saved xml session.open_xml(file_path, start=True) @@ -286,7 +286,7 @@ class TestXml: value = str(session.emane.get_config("test", emane_id, EmaneIeee80211abgModel.name)) # verify nodes and configuration were restored - assert session.get_object(n1_id) - assert session.get_object(n2_id) - assert session.get_object(emane_id) + assert session.get_node(n1_id) + assert session.get_node(n2_id) + assert session.get_node(emane_id) assert value == "1" diff --git a/ns3/corens3/obj.py b/ns3/corens3/obj.py index 1920fd62..e23acc46 100644 --- a/ns3/corens3/obj.py +++ b/ns3/corens3/obj.py @@ -17,14 +17,13 @@ import ns.wifi import ns.wimax from core import constants -from core.coreobj import PyCoreNet -from core.enumerations import EventTypes -from core.enumerations import LinkTypes -from core.enumerations import NodeTypes -from core.misc.utils import make_tuple -from core.mobility import WayPointMobility -from core.netns.nodes import CoreNode -from core.session import Session +from core.emulator.enumerations import EventTypes +from core.emulator.enumerations import LinkTypes +from core.emulator.enumerations import NodeTypes +from core.utils import make_tuple +from core.location.mobility import WayPointMobility +from core.nodes.base import CoreNode, CoreNetworkBase +from core.emulator.session import Session ns.core.GlobalValue.Bind( "SimulatorImplementationType", @@ -107,7 +106,7 @@ class CoreNs3Node(CoreNode, ns.network.Node): self.warn("ns-3 mobility model not found, not setting position") -class CoreNs3Net(PyCoreNet): +class CoreNs3Net(CoreNetworkBase): """ The CoreNs3Net is a helper PyCoreNet object. Networks are represented entirely in simulation with the TunTap device bridging the emulated and @@ -119,7 +118,7 @@ class CoreNs3Net(PyCoreNet): type = "wlan" def __init__(self, session, _id=None, name=None, start=True, policy=None): - PyCoreNet.__init__(self, session, _id, name) + CoreNetworkBase.__init__(self, session, _id, name) self.tapbridge = ns.tap_bridge.TapBridgeHelper() self._ns3devs = {} self._tapdevs = {} @@ -402,7 +401,7 @@ class Ns3Session(Session): A convenience helper for Session.addobj(), for adding CoreNs3Nodes to this session. Keeps a NodeContainer for later use. """ - n = self.add_object(cls=CoreNs3Node, name=name) + n = self.create_node(cls=CoreNs3Node, name=name) self.nodes.Add(n) return n @@ -488,7 +487,7 @@ class Ns3Session(Session): Start a tracing thread using the ASCII output from the ns3 mobility helper. """ - net.mobility = WayPointMobility(session=self, object_id=net.id) + net.mobility = WayPointMobility(session=self, _id=net.id) net.mobility.setendtime() net.mobility.refresh_ms = 300 net.mobility.empty_queue_stop = False diff --git a/ns3/examples/ns3lte.py b/ns3/examples/ns3lte.py index ef3a6fc2..2cb17407 100644 --- a/ns3/examples/ns3lte.py +++ b/ns3/examples/ns3lte.py @@ -11,9 +11,7 @@ import sys import ns.core import ns.mobility -from core.misc import ipaddress -from core.misc import nodemaps -from core.misc import nodeutils +from core.nodes import nodeutils, nodemaps, ipaddress from corens3.obj import Ns3LteNet from corens3.obj import Ns3Session @@ -24,7 +22,7 @@ def ltesession(opt): """ nodeutils.set_node_map(nodemaps.NODES) session = Ns3Session(1, persistent=True, duration=opt.duration) - lte = session.add_object(cls=Ns3LteNet, name="wlan1") + lte = session.create_node(cls=Ns3LteNet, name="wlan1") lte.setsubchannels(range(25), range(50, 100)) if opt.verbose: ascii_helper = ns.network.AsciiTraceHelper() diff --git a/ns3/examples/ns3wifi.py b/ns3/examples/ns3wifi.py index 759c5675..747b184b 100644 --- a/ns3/examples/ns3wifi.py +++ b/ns3/examples/ns3wifi.py @@ -28,9 +28,7 @@ import sys import ns.core -from core.misc import ipaddress -from core.misc import nodeutils -from core.misc import nodemaps +from core.nodes import nodeutils, nodemaps, ipaddress from corens3.obj import Ns3Session from corens3.obj import Ns3WifiNet @@ -59,7 +57,7 @@ def wifisession(opt): session.node_count = str(opt.numnodes + 1) add_to_server(session) - wifi = session.add_object(cls=Ns3WifiNet, name="wlan1") + wifi = session.create_node(cls=Ns3WifiNet, name="wlan1") wifi.setposition(30, 30, 0) wifi.phy.Set("RxGain", ns.core.DoubleValue(18.0)) diff --git a/ns3/examples/ns3wifirandomwalk.py b/ns3/examples/ns3wifirandomwalk.py index 2946f359..a96f37f6 100644 --- a/ns3/examples/ns3wifirandomwalk.py +++ b/ns3/examples/ns3wifirandomwalk.py @@ -20,9 +20,7 @@ import ns.network from corens3.obj import Ns3Session from corens3.obj import Ns3WifiNet -from core.misc import ipaddress -from core.misc import nodemaps -from core.misc import nodeutils +from core.nodes import nodeutils, nodemaps, ipaddress def add_to_server(session): @@ -48,7 +46,7 @@ def wifisession(opt): session.filename = session.name + ".py" session.node_count = str(opt.numnodes + 1) add_to_server(session) - wifi = session.add_object(cls=Ns3WifiNet, name="wlan1", rate="OfdmRate12Mbps") + wifi = session.create_node(cls=Ns3WifiNet, name="wlan1", rate="OfdmRate12Mbps") wifi.setposition(30, 30, 0) # for improved connectivity wifi.phy.Set("RxGain", ns.core.DoubleValue(18.0)) diff --git a/ns3/examples/ns3wimax.py b/ns3/examples/ns3wimax.py index e939e934..b1d7212c 100644 --- a/ns3/examples/ns3wimax.py +++ b/ns3/examples/ns3wimax.py @@ -13,9 +13,7 @@ import logging import optparse import sys -from core.misc import ipaddress -from core.misc import nodemaps -from core.misc import nodeutils +from core.nodes import nodeutils, nodemaps, ipaddress from corens3.obj import Ns3Session from corens3.obj import Ns3WimaxNet @@ -26,7 +24,7 @@ def wimaxsession(opt): """ nodeutils.set_node_map(nodemaps.NODES) session = Ns3Session(1, persistent=True, duration=opt.duration) - wimax = session.add_object(cls=Ns3WimaxNet, name="wlan1") + wimax = session.create_node(cls=Ns3WimaxNet, name="wlan1") # wimax.wimax.EnableLogComponents() prefix = ipaddress.Ipv4Prefix("10.0.0.0/16")