def handle_decoded_payload(self, data): """ Override this method if you wish to handle the decoded data differently. """ # Ensure payload is unicode. Disregard failure to decode binary blobs. if "user" in data: log.info( "User %s Executing command %s with jid %s", data["user"], data["fun"], data["jid"], ) else: log.info("Executing command %s with jid %s", data["fun"], data["jid"]) log.debug("Command details %s", data) # Don't duplicate jobs log.trace("Started JIDs: %s", self.jid_queue) if self.jid_queue is not None: if data["jid"] in self.jid_queue: return else: self.jid_queue.append(data["jid"]) if len(self.jid_queue) > self.opts["minion_jid_queue_hwm"]: self.jid_queue.pop(0) if isinstance(data["fun"], str): if data["fun"] == "sys.reload_modules": ( self.functions, self.returners, self.function_errors, self.executors, ) = self._load_modules() self.schedule.functions = self.functions self.schedule.returners = self.returners process_count_max = self.opts.get("process_count_max") if process_count_max > 0: process_count = len(salt.utils.minion.running(self.opts)) while process_count >= process_count_max: log.warning( "Maximum number of processes reached while executing jid %s, waiting...", data["jid"], ) yield salt.ext.tornado.gen.sleep(10) process_count = len(salt.utils.minion.running(self.opts)) # We stash an instance references to allow for the socket # communication in Windows. You can't pickle functions, and thus # python needs to be able to reconstruct the reference on the other # side. instance = self multiprocessing_enabled = self.opts.get("multiprocessing", True) if multiprocessing_enabled: if sys.platform.startswith("win"): # let python reconstruct the minion on the other side if we're # running on windows instance = None with default_signals(signal.SIGINT, signal.SIGTERM): process = SignalHandlingProcess( target=self._target, name="ProcessPayload", args=(instance, self.opts, data, self.connected), ) else: process = threading.Thread( target=self._target, args=(instance, self.opts, data, self.connected), name=data["jid"], ) if multiprocessing_enabled: with default_signals(signal.SIGINT, signal.SIGTERM): # Reset current signals before starting the process in # order not to inherit the current signal handlers process.start() else: process.start() process.name = "{}-Job-{}".format(process.name, data["jid"]) self.subprocess_list.add(process)
def handle_decoded_payload(self, data): ''' Override this method if you wish to handle the decoded data differently. ''' # Ensure payload is unicode. Disregard failure to decode binary blobs. if six.PY2: data = salt.utils.data.decode(data, keep=True) if 'user' in data: log.info( 'User %s Executing command %s with jid %s', data['user'], data['fun'], data['jid'] ) else: log.info( 'Executing command %s with jid %s', data['fun'], data['jid'] ) log.debug('Command details %s', data) # Don't duplicate jobs log.trace('Started JIDs: %s', self.jid_queue) if self.jid_queue is not None: if data['jid'] in self.jid_queue: return else: self.jid_queue.append(data['jid']) if len(self.jid_queue) > self.opts['minion_jid_queue_hwm']: self.jid_queue.pop(0) if isinstance(data['fun'], six.string_types): if data['fun'] == 'sys.reload_modules': self.functions, self.returners, self.function_errors, self.executors = self._load_modules() self.schedule.functions = self.functions self.schedule.returners = self.returners process_count_max = self.opts.get('process_count_max') if process_count_max > 0: process_count = len(salt.utils.minion.running(self.opts)) while process_count >= process_count_max: log.warning("Maximum number of processes reached while executing jid {0}, waiting...".format(data['jid'])) yield tornado.gen.sleep(10) process_count = len(salt.utils.minion.running(self.opts)) # We stash an instance references to allow for the socket # communication in Windows. You can't pickle functions, and thus # python needs to be able to reconstruct the reference on the other # side. instance = self multiprocessing_enabled = self.opts.get('multiprocessing', True) if multiprocessing_enabled: if sys.platform.startswith('win'): # let python reconstruct the minion on the other side if we're # running on windows instance = None with default_signals(signal.SIGINT, signal.SIGTERM): process = SignalHandlingProcess( target=self._target, name='ProcessPayload', args=(instance, self.opts, data, self.connected) ) else: process = threading.Thread( target=self._target, args=(instance, self.opts, data, self.connected), name=data['jid'] ) if multiprocessing_enabled: with default_signals(signal.SIGINT, signal.SIGTERM): # Reset current signals before starting the process in # order not to inherit the current signal handlers process.start() else: process.start() process.name = '{}-Job-{}'.format(process.name, data['jid']) self.subprocess_list.add(process)
def handle_decoded_payload(self, data): """ Override this method if you wish to handle the decoded data differently. """ if "user" in data: log.info( "User %s Executing command %s with jid %s", data["user"], data["fun"], data["jid"], ) else: log.info("Executing command %s with jid %s", data["fun"], data["jid"]) log.debug("Command details %s", data) # Don"t duplicate jobs log.trace("Started JIDs: %s", self.jid_queue) if self.jid_queue is not None: if data["jid"] in self.jid_queue: return else: self.jid_queue.append(data["jid"]) if len(self.jid_queue) > self.opts["minion_jid_queue_hwm"]: self.jid_queue.pop(0) if isinstance(data["fun"], str): if data["fun"] == "sys.reload_modules": ( self.functions, self.returners, self.function_errors, self.executors, ) = self._load_modules() self.schedule.functions = self.functions self.schedule.returners = self.returners process_count_max = self.opts.get("process_count_max") if process_count_max > 0: process_count = self.subprocess_list.count once_logged = False while process_count >= process_count_max: if once_logged is False: log.debug( "Maximum number of processes reached while executing jid %s, waiting...", data["jid"], ) once_logged = True yield salt.ext.tornado.gen.sleep(0.5) process_count = self.subprocess_list.count # We stash an instance references to allow for the socket # communication in Windows. You can"t pickle functions, and thus # python needs to be able to reconstruct the reference on the other # side. instance = self multiprocessing_enabled = self.opts.get("multiprocessing", True) name = "ProcessPayload(jid={})".format(data["jid"]) if multiprocessing_enabled: if sys.platform.startswith("win"): # let python reconstruct the minion on the other side if we"re # running on windows instance = None process = SignalHandlingProcess( target=target, args=(self, instance, instance.opts, data, self.connected), name=name, ) else: process = threading.Thread( target=target, args=(self, instance, instance.opts, data, self.connected), name=name, ) process.start() process.name = "{}-Job-{}".format(process.name, data["jid"]) self.subprocess_list.add(process)