basic api2 experiment is loadable

This commit is contained in:
Rod A Santiago 2016-07-28 16:47:14 -07:00
parent 36390cbba6
commit 2a8eb823ca
3 changed files with 115 additions and 8 deletions

View file

@ -70,10 +70,15 @@ class CoreApiBridge(object):
newMsg.session.SetInParent()
newMsg.session.clientId = 'client' + sessions[0]
newMsg.session.port_num = port_num
print "len=", len(newMsg.SerializeToString())
api2msgs.append(newMsg.SerializeToString())
api2msgs.append(CoreApiBridge.packApi2(newMsg))
else:
print "received message type", msgtype
return api2msgs
@staticmethod
def packApi2(message):
data = message.SerializeToString()
return struct.pack(HDRFMT, len(data)) + data
@staticmethod
def translateApi2SessionMsg(message):
@ -97,6 +102,7 @@ class CoreApiBridge(object):
msgs.append(EventMsgWrapper.createLegacyMessage(legacy.CORE_EVENT_CONFIGURATION_STATE))
# Send location
# TODO: Add this info to the Experiment
msgs.append(ConfigMsgWrapper.createLegacyMessage(obj="location",
dataTypes=(9,9,9,9,9,9),
dataValues='0|0| 47.5766974863|-122.125920191|0.0|150.0'))
@ -118,13 +124,30 @@ class CoreApiBridge(object):
node.idx,
str(node.name)))
for device in message.devices:
# TODO: Add other fields
msgs.append(NodeMsgWrapper.createLegacyMessage(
legacy.CORE_API_ADD_FLAG|legacy.CORE_API_STR_FLAG,
device.idx,
str(device.name),
type = legacy.CORE_NODE_SWITCH)) # TODO: Update this later
for network in message.networks:
for channel in network.channels:
if len(channel.endpoints) == 2:
ep0 = channel.endpoints[0]
ep1 = channel.endpoints[1]
msgs.append(LinkMsgWrapper.createLegacyMessage(legacy.CORE_API_ADD_FLAG,
ep0.dev_idx,ep0.intf_idx,
ep1.dev_idx,ep1.intf_idx))
# send metadata
# TODO
# transition to instantiation state
# TODO
msgs.append(EventMsgWrapper.createLegacyMessage(legacy.CORE_EVENT_INSTANTIATION_STATE))
return msgs
@ -236,6 +259,71 @@ class NodeMsgWrapper(legacy.CoreNodeMessage):
return self.gettlv(legacy.CORE_TLV_NODE_OPAQUE)
class LinkMsgWrapper(legacy.CoreLinkMessage):
@staticmethod
def createLegacyMessage(flags, n1number, if1num, n2number, if2num,
delay=0, bw=0, per=None, dup=None, jitter=0, mer=0, burst=0, mburst=0,
session=None, type=legacy.CORE_LINK_WIRED, guiattr=None,
emuid=-1, netid=-1, key=-1,
if1ip4=None, if1ip4mask=24, if1mac=None, if1ip6=None, if1ip6mask=64,
if2ip4=None, if2ip4mask=24, if2mac=None, if2ip6=None, if2ip6mask=64,
opaque=None):
tlvdata = legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_N1NUMBER,n1number)
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_N2NUMBER,n2number)
# TODO: do we need to set delay, bw, per, dup for default values (as in api.tcl)?
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_DELAY,delay)
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_BW,bw)
if per is not None:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_PER,per)
if dup is not None:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_DUP,dup)
if jitter > 0:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_JITTER,jitter)
if mer > 0:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_MER,mer)
if burst > 0:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_BURST,burst)
if mburst > 0:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_MBURST,mburst)
if session is not None:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_SESSION,session)
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_TYPE,type)
if guiattr is not None:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_GUIATTR,guiattr)
if emuid >= 0:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_EMUID,emuid)
if netid >= 0:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_NETID,netid)
if key >= 0:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_KEY,key)
if if1num > -2:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_IF1NUM,if1num)
if if1ip4 is not None:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_IF1IP4,IPAddr(AF_INET, socket.inet_aton(if1ip4)))
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_IF1IP4MASK,if1ip4mask)
if if1mac is not None:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_IF1MAC,MacAddr.fromstring(if1mac))
if if1ip6 is not None:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_IF1IP6,IPAddr(AF_INET6, socket.inet_pton(AF_INET6,if1ip6)))
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_IF1IP6MASK,if1ip6mask)
if if2num > -2:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_IF2NUM,if2num)
if if2ip4 is not None:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_IF2IP4,IPAddr(AF_INET, socket.inet_aton(if2ip4)))
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_IF2IP4MASK,if2ip4mask)
if if2mac is not None:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_IF2MAC,MacAddr.fromstring(if2mac))
if if2ip6 is not None:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_IF2IP6,IPAddr(AF_INET6, socket.inet_pton(AF_INET6,if2ip6)))
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_IF2IP6MASK,if2ip6mask)
if opaque is not None:
tlvdata = tlvdata + legacy.CoreLinkTlv.pack(legacy.CORE_TLV_LINK_OPAQUE,opaque)
hdr = struct.pack(legacy.CoreMessage.hdrfmt, legacy.CoreLinkMessage.msgtype, flags, len(tlvdata))
return legacy.CoreLinkMessage(flags, hdr, tlvdata)
def getN1number(self):
return self.gettlv(legacy.CORE_TLV_LINK_N1NUMBER)
def getN2number(self):

View file

@ -186,6 +186,7 @@ class Session(object):
if isinstance(msg, coreapi.CoreNodeMessage) or \
isinstance(msg, coreapi.CoreLinkMessage):
try:
print "broadcasting.."
handler.sendall(msg.rawmsg)
except Exception, e:
self.warn("sendall() error: %s" % e)
@ -199,6 +200,7 @@ class Session(object):
if handler == src:
continue
try:
print "broadcasting raw data.."
handler.sendall(data)
except Exception, e:
self.warn("sendall() error: %s" % e)
@ -675,6 +677,7 @@ class Session(object):
self.info("Checking for runtime with %d of %d session nodes" % \
(nc, session_node_count))
if nc < session_node_count:
self.info("do not have information on all nodes")
return # do not have information on all nodes yet
# information on all nodes has been received and they have been started
# enter the runtime state
@ -683,6 +686,7 @@ class Session(object):
state = coreapi.CORE_EVENT_RUNTIME_STATE
self.evq.run()
self.setstate(state, info=True, sendevent=True)
self.info("Entered runtime state")
def datacollect(self):
''' Tear down a running session. Stop the event loop and any running