def _create_mission_scheduler(self, mission_id, mission_yml): """ @param mission_id @param mission_yml """ log.debug('[mm] _create_mission_scheduler: mission_id=%r', mission_id) mission_loader = MissionLoader(self._agent) mission_loader.load_mission(mission_id, mission_yml) self._mission_entries = mission_loader.mission_entries log.debug('[mm] _create_mission_scheduler: _ia_clients=\n%s', self._agent._pp.pformat(self._agent._ia_clients)) # get instrument IDs and clients for the valid running instruments: instruments = {} for (instrument_id, obj) in self._agent._ia_clients.iteritems(): if isinstance(obj, dict): # it's valid instrument. if instrument_id != obj.resource_id: log.error('[mm] _create_mission_scheduler: instrument_id=%s, ' 'resource_id=%s', instrument_id, obj.resource_id) instruments[obj.resource_id] = obj.ia_client mission_scheduler = MissionScheduler(self._agent, instruments, self._mission_entries) log.debug('[mm] _create_mission_scheduler: MissionScheduler created. entries=%s', self._mission_entries) return mission_scheduler
def test_load_mission(self): p_agent = FakeAgent() mission_id = 0 mission = MissionLoader(p_agent) filename = "ion/agents/platform/test/mission_RSN_simulator1.yml" with open(filename, 'r') as f: mission_string = f.read() self.assertTrue(mission.load_mission(mission_id, mission_string))
def _create_mission_scheduler(self, mission_id, mission_yml): """ - loads the mission - verifies instruments associated - gets exclusive access to those instruments - creates MissionScheduler @param mission_id @param mission_yml @return (mission_loader, mission_scheduler, instrument_objs) @raise Exception if no stable ID is found for an instrument; or the first exception while requesting exclusive access to a child instrument (in this case, all other successful such requests, if any, are reverted). """ log.debug('%r: [mm] _create_mission_scheduler: mission_id=%r', self._platform_id, mission_id) mission_loader = MissionLoader(self._agent) mission_loader.load_mission(mission_id, mission_yml) self._mission_entries = mission_loader.mission_entries if log.isEnabledFor(logging.DEBUG): log.debug('%r: [mm] _create_mission_scheduler: _ia_clients=\n%s', self._platform_id, self._agent._pp.pformat(self._agent._ia_clients)) # {stable_id: obj, ...} objects of valid running instruments: instrument_objs = {} for (instrument_id, obj) in self._agent._ia_clients.iteritems(): if isinstance(obj, dict): # dict means it's valid instrument. # get first "PRE:*" ID from obj.alt_ids: pres = [alt_id for alt_id in obj.alt_ids if alt_id.startswith('PRE:')] if not pres: raise Exception('%r: No stable ID found for instrument_id=%r. alt_ids=%s' % ( self._platform_id, instrument_id, obj.alt_ids)) stable_id = pres[0] log.debug('%r: [mm] _create_mission_scheduler: instrument_id=%r, stable_id=%r,' ' resource_id=%r', self._platform_id, instrument_id, stable_id, obj.resource_id) instrument_objs[stable_id] = obj # {stable_id: client, ...} dict for scheduler instruments_for_scheduler = dict((stable_id, obj.ia_client) for stable_id, obj in instrument_objs.iteritems()) mission_entries = mission_loader.mission_entries # get all involved instruments referenced in the mission: instrument_ids = set() for mission_entry in mission_entries: for instrument_id in mission_entry.get('instrument_id', []): if instrument_id in instrument_objs: instrument_ids.add(instrument_id) else: raise Exception('%r: No stable ID found for instrument_id=%r referenced' ' in mission, mission_id=%r' % (self._platform_id, instrument_id, mission_id)) # get exclusive access to those instruments. If any one fails, # rollback and raise that first exception: instrument_ids_ok = set() exception = None for instrument_id in instrument_ids: resource_id = instrument_objs[instrument_id].resource_id try: self._get_exclusive_access(instrument_id, resource_id, mission_id) instrument_ids_ok.add(instrument_id) except Exception as ex: exception = ex log.warn('%r: [xa] _create_mission_scheduler: exclusive access request to' ' resource_id=%r, instrument_id=%r failed: %s', self._platform_id, resource_id, instrument_id, exception) break if exception: if len(instrument_ids_ok): log.warn('%r: [xa] _create_mission_scheduler: reverting exclusive access to the resources: %s', self._platform_id, instrument_ids_ok) for instrument_id in instrument_ids_ok: resource_id = instrument_objs[instrument_id].resource_id try: self._remove_exclusive_access(instrument_id, resource_id, mission_id) except Exception as ex: # just log warning an continue log.warn('%r: [xa] exception while reverting exclusive access to resource_id=%r, ' 'instrument_id=%r: %s', self._platform_id, resource_id, instrument_id, ex) raise exception mission_scheduler = MissionScheduler(self._agent, instruments_for_scheduler, mission_entries) log.debug('%r: [mm] _create_mission_scheduler: MissionScheduler created. entries=%s', self._platform_id, mission_entries) return mission_loader, mission_scheduler, instrument_objs