예제 #1
0
 def __init__(self,
              appid='meqserver',
              client_id='meqclient',
              spawn=None,
              opt=False,
              **kwargs):
     if spawn and isinstance(spawn, bool):
         if opt:
             spawn = default_spawn_opt
         else:
             spawn = default_spawn
     # set gui arg
     if 'gui' in kwargs and kwargs['gui'] and not callable(kwargs['gui']):
         kwargs['gui'] = meqserver_gui
     self._we_track_results = None
     # init base class
     multiapp_proxy.__init__(self, appid, client_id, spawn=spawn, **kwargs)
     # setup own state
     self._pprint = PrettyPrinter(width=78, stream=sys.stderr)
     # track axis map changes
     self._we_axis_list = self.whenever('axis.list',
                                        self._axis_list_handler)
     # if base/gui init() has explicitly disabled result tracking, _we_track_results
     # will be False rather than None
     if self.get_verbose() > 0 and self._we_track_results is None:
         self.dprint(1, 'verbose>0: auto-enabling node_result output')
         self.track_results(True)
         self.dprint(
             1, 'you can disable this by calling .track_results(False)')
예제 #2
0
 def set_data(self, dataitem, default_open=None, **opts):
     _dprint(3, 'set_data ', dataitem.udi)
     # save currently open tree
     if self._rec is not None:
         openitems = self.get_open_items()
     else:  # no data, use default open tree if specified
         openitems = default_open or self._default_open
     # clear everything and reset data as new
     self.clear()
     self.set_udi_root(dataitem.udi)
     self._rec = dataitem.data
     self._pprint = PrettyPrinter(width=78, stream=sys.stderr)
     self.set_refresh_func(dataitem.refresh_func)
     # expand first level of record
     self.set_content(self._rec)
     # apply saved open tree
     self.set_open_items(openitems)
     # enable & highlight the cell
     self.enable()
     self.flash_refresh()
예제 #3
0
 def __init__(self,appid='meqserver',client_id='meqclient',
              spawn=None,opt=False,**kwargs):
   if spawn and isinstance(spawn,bool):
     if opt:
       spawn = default_spawn_opt;
     else:
       spawn = default_spawn;
   # set gui arg
   if 'gui' in kwargs and kwargs['gui'] and not callable(kwargs['gui']):
     kwargs['gui'] = meqserver_gui;
   self._we_track_results = None;
   # init base class  
   multiapp_proxy.__init__(self,appid,client_id,spawn=spawn,**kwargs);
   # setup own state
   self._pprint = PrettyPrinter(width=78,stream=sys.stderr);
   # track axis map changes
   self._we_axis_list = self.whenever('axis.list',self._axis_list_handler);
   # if base/gui init() has explicitly disabled result tracking, _we_track_results
   # will be False rather than None
   if self.get_verbose() > 0 and self._we_track_results is None:
     self.dprint(1,'verbose>0: auto-enabling node_result output');
     self.track_results(True);
     self.dprint(1,'you can disable this by calling .track_results(False)');
예제 #4
0
class meqserver(multiapp_proxy):
    """interface to MeqServer app"""
    def __init__(self,
                 appid='meqserver',
                 client_id='meqclient',
                 spawn=None,
                 opt=False,
                 **kwargs):
        if spawn and isinstance(spawn, bool):
            if opt:
                spawn = default_spawn_opt
            else:
                spawn = default_spawn
        # set gui arg
        if 'gui' in kwargs and kwargs['gui'] and not callable(kwargs['gui']):
            kwargs['gui'] = meqserver_gui
        self._we_track_results = None
        # init base class
        multiapp_proxy.__init__(self, appid, client_id, spawn=spawn, **kwargs)
        # setup own state
        self._pprint = PrettyPrinter(width=78, stream=sys.stderr)
        # track axis map changes
        self._we_axis_list = self.whenever('axis.list',
                                           self._axis_list_handler)
        # if base/gui init() has explicitly disabled result tracking, _we_track_results
        # will be False rather than None
        if self.get_verbose() > 0 and self._we_track_results is None:
            self.dprint(1, 'verbose>0: auto-enabling node_result output')
            self.track_results(True)
            self.dprint(
                1, 'you can disable this by calling .track_results(False)')

    # define meqserver-specific methods
    def meq(self, command, args=None, wait=None, silent=False):
        """sends a meq-command and optionally waits for result.
    wait can be specified in seconds, or True to wait indefinitely."""
        command = make_hiid(command)
        payload = record()
        if args is not None:
            payload.args = args
        # send command and wait for reply
        if wait:
            if isinstance(wait, bool):
                wait = None
                # timeout=None means block indefinitely
            if silent:
                self.dprint(
                    0,
                    'warning: both wait and silent specified, ignoring silent flag'
                )
            payload.command_index = self.new_command_index()
            replyname = 'result' + command + payload.command_index
            self.dprintf(3, 'sending command %s with wait\n', command)
            self.dprint(5, 'arguments are ', args)
            self.pause_events()
            self.send_command('command' + command, payload)
            msg = self. await (replyname, resume=True, timeout=wait)
            return msg.payload
        # else simply send command
        else:
            self.dprintf(3, 'sending command %s with no wait, silent=%d\n',
                         command, silent)
            self.dprint(5, 'arguments are ', args)
            payload.silent = silent
            self.send_command('command' + command, payload)

    # helper function to create a node specification record
    def makenodespec(self, node):
        "makes an record( containing a node specification"
        if isinstance(node, str):
            return record(name=node)
        elif isinstance(node, int):
            return record(nodeindex=node)
        else:
            raise TypeError('node must be specified by name or index, have ' +
                            str(type(node)))

    def createnode(self, initrec, wait=False, silent=False):
        initrec = make_record(initrec)
        return self.meq('Create.Node', initrec, wait=wait, silent=silent)

    def getnodestate(self, node, wait=True, sync=False):
        spec = self.makenodespec(node)
        spec.sync = sync
        return self.meq('Node.Get.State', spec, wait=wait)

    def setnodestate(self, node, fields_record, wait=False, sync=True):
        spec = self.makenodespec(node)
        spec.sync = sync
        spec.state = fields_record
        return self.meq('Node.Set.State', spec, wait=wait)

    def getnodeindex(self, name):
        retval = self.meq('Get.NodeIndex', self.makenodespec(name), wait=True)
        try:
            return retval.nodeindex
        except:
            raise ValueError('MeqServer did not return a nodeindex field')

    def getnodelist(self,
                    name=True,
                    nodeindex=True,
                    classname=True,
                    children=False):
        rec = record({
            'name': name,
            'nodeindex': nodeindex,
            'class': classname,
            'children': children
        })
        return self.meq('Get.Node.List', rec, wait=True)

    def execute(self, node, req, wait=False):
        rec = self.makenodespec(node)
        rec.request = req
        return self.meq('Node.Execute', rec, wait=wait)

    def clearcache(self, node, recursive=True, wait=False, sync=True):
        rec = self.makenodespec(node)
        rec.recursive = recursive
        rec.sync = sync
        return self.meq('Node.Clear.Cache', rec, wait=wait)

    def change_wd(self, path):
        rec = record(cwd=path)
        return self.meq('Set.Cwd', rec, wait=False)

    def publish(self, node, wait=False):
        rec = self.makenodespec(node)
        rec.level = 1
        return self.meq('Node.Set.Publish.Level', rec, wait=wait)

    def _event_handler(self, msg):
        """Auguments app_proxy._event_handler(), to keep track of forest state"""
        multiapp_proxy._event_handler(self, msg)
        payload = msg.payload
        if self.current_server \
           and getattr(msg,'from') == self.current_server.addr \
           and isinstance(payload,record):
            # check if message includes update of forest state and/or status
            fstatus = getattr(payload, 'forest_status', None)
            fstate = getattr(payload, 'forest_state', None)
            # update forest state, if supplied. Merge in the forest status if
            # we also have it
            if fstate is not None:
                if fstatus is not None:
                    fstate.update(fstatus)
                meqds.update_forest_state(fstate)
            # no forest state supplied but a status is: merge it in
            elif fstatus is not None:
                meqds.update_forest_state(fstatus, merge=True)

    def _result_handler(self, msg):
        try:
            value = msg.payload
            dprint(0, '============= result for node: ', value.name)
            self._pprint.pprint(value)
        except:
            print('exception in meqserver._result_handler: ', sys.exc_info())
            traceback.print_exc()

    def _axis_list_handler(self, msg):
        try:
            if self.current_server \
                  and getattr(msg,'from') == self.current_server.addr:                 \
                        mequtils.set_axis_list(msg.payload)
        except:
            print('exception in meqserver._axis_list_handler: ',
                  sys.exc_info())
            traceback.print_exc()

    def track_results(self, enable=True):
        if enable:
            self.dprint(2, 'auto-printing all node_result events')
            if self._we_track_results:
                self._we_track_results.activate()
            else:
                self._we_track_results = self.whenever('node.result',
                                                       self._result_handler)
        else:  # disable
            self.dprint(2, 'disabling auto-printing of node_result events')
            if self._we_track_results:
                self._we_track_results.deactivate()
            self._we_track_results = False
예제 #5
0
class meqserver (multiapp_proxy):
  """interface to MeqServer app""";
  def __init__(self,appid='meqserver',client_id='meqclient',
               spawn=None,opt=False,**kwargs):
    if spawn and isinstance(spawn,bool):
      if opt:
        spawn = default_spawn_opt;
      else:
        spawn = default_spawn;
    # set gui arg
    if 'gui' in kwargs and kwargs['gui'] and not callable(kwargs['gui']):
      kwargs['gui'] = meqserver_gui;
    self._we_track_results = None;
    # init base class  
    multiapp_proxy.__init__(self,appid,client_id,spawn=spawn,**kwargs);
    # setup own state
    self._pprint = PrettyPrinter(width=78,stream=sys.stderr);
    # track axis map changes
    self._we_axis_list = self.whenever('axis.list',self._axis_list_handler);
    # if base/gui init() has explicitly disabled result tracking, _we_track_results
    # will be False rather than None
    if self.get_verbose() > 0 and self._we_track_results is None:
      self.dprint(1,'verbose>0: auto-enabling node_result output');
      self.track_results(True);
      self.dprint(1,'you can disable this by calling .track_results(False)');
  
  # define meqserver-specific methods
  def meq (self,command,args=None,wait=None,silent=False):
    """sends a meq-command and optionally waits for result.
    wait can be specified in seconds, or True to wait indefinitely.""";
    command = make_hiid(command);
    payload = record();
    if args is not None:
      payload.args = args;
    # send command and wait for reply
    if wait:
      if isinstance(wait,bool):
        wait = None;       # timeout=None means block indefinitely
      if silent:
        self.dprint(0,'warning: both wait and silent specified, ignoring silent flag');
      payload.command_index = self.new_command_index();
      replyname = 'result' + command + payload.command_index;
      self.dprintf(3,'sending command %s with wait\n',command);
      self.dprint(5,'arguments are ',args);
      self.pause_events();
      self.send_command('command'+command,payload);
      msg = self.await(replyname,resume=True,timeout=wait);
      return msg.payload;
    # else simply send command
    else: 
      self.dprintf(3,'sending command %s with no wait, silent=%d\n',command,silent);
      self.dprint(5,'arguments are ',args);
      payload.silent = silent;
      self.send_command('command'+command,payload);
  
  # helper function to create a node specification record
  def makenodespec (self,node):
    "makes an record( containing a node specification";
    if isinstance(node,str):
      return record(name=node);
    elif isinstance(node,int):
      return record(nodeindex=node);
    else:
      raise TypeError,'node must be specified by name or index, have '+str(type(node));

  def createnode (self,initrec,wait=False,silent=False):
    initrec = make_record(initrec);
    return self.meq('Create.Node',initrec,wait=wait,silent=silent);
  
  def getnodestate (self,node,wait=True,sync=False):
    spec = self.makenodespec(node);
    spec.sync = sync;
    return self.meq('Node.Get.State',spec,wait=wait);

  def setnodestate (self,node,fields_record,wait=False,sync=True):
    spec = self.makenodespec(node);
    spec.sync = sync;
    spec.state = fields_record;
    return self.meq('Node.Set.State',spec,wait=wait);
  
  def getnodeindex (self,name):
    retval = self.meq('Get.NodeIndex',self.makenodespec(name),wait=True);
    try: return retval.nodeindex;
    except:
      raise ValueError,'MeqServer did not return a nodeindex field';

  def getnodelist (self,name=True,nodeindex=True,classname=True,children=False):
    rec = record({'name':name,'nodeindex':nodeindex,'class':classname,'children':children});
    return self.meq('Get.Node.List',rec,wait=True);
  
  def execute (self,node,req,wait=False):
    rec = self.makenodespec(node);
    rec.request = req;
    return self.meq('Node.Execute',rec,wait=wait);
    
  def clearcache (self,node,recursive=True,wait=False,sync=True):
    rec = self.makenodespec(node);
    rec.recursive = recursive;
    rec.sync = sync;
    return self.meq('Node.Clear.Cache',rec,wait=wait);
  
  def change_wd (self,path):
    rec = record(cwd=path);
    return self.meq('Set.Cwd',rec,wait=False);
    
  def publish (self,node,wait=False):
    rec = self.makenodespec(node);
    rec.level = 1;
    return self.meq('Node.Set.Publish.Level',rec,wait=wait);
    
  def _event_handler (self,msg):
    """Auguments app_proxy._event_handler(), to keep track of forest state""";
    multiapp_proxy._event_handler(self,msg);
    payload = msg.payload;
    if self.current_server \
       and getattr(msg,'from') == self.current_server.addr \
       and isinstance(payload,record):
      # check if message includes update of forest state and/or status
      fstatus = getattr(payload,'forest_status',None);
      fstate  = getattr(payload,'forest_state',None);
      # update forest state, if supplied. Merge in the forest status if
      # we also have it
      if fstate is not None:
        if fstatus is not None:
          fstate.update(fstatus);
        meqds.update_forest_state(fstate);
      # no forest state supplied but a status is: merge it in
      elif fstatus is not None:
        meqds.update_forest_state(fstatus,merge=True);
    
  def _result_handler (self,msg):
    try:
      value = msg.payload;
      dprint(0,'============= result for node: ',value.name);
      self._pprint.pprint(value);
    except:
      print 'exception in meqserver._result_handler: ',sys.exc_info();
      traceback.print_exc();
      
  def _axis_list_handler (self,msg):
    try:
      if self.current_server \
            and getattr(msg,'from') == self.current_server.addr: \
        mequtils.set_axis_list(msg.payload);
    except:
      print 'exception in meqserver._axis_list_handler: ',sys.exc_info();
      traceback.print_exc();
  
  def track_results (self,enable=True):
    if enable:
      self.dprint(2,'auto-printing all node_result events');
      if self._we_track_results:
        self._we_track_results.activate();
      else:
        self._we_track_results = self.whenever('node.result',self._result_handler);
    else:  # disable
      self.dprint(2,'disabling auto-printing of node_result events');
      if self._we_track_results:
        self._we_track_results.deactivate();
      self._we_track_results = False;