def _obtainCmdExecThreads(self, exeName, service, manifest, activateFlow): """start the threads to execute cmd in each package in the service/manifest""" execThreads = [] packages = ManifestController.getPackages(service, os.path.basename(manifest)) # Executing the deactivate in reversed order where the last package is first deactivated. if (not activateFlow): packages.reverse() # make sure there's something to do, otherwise just return here if (len(packages) == 0): return execThreads for package in packages: pkgPath = manifestutil.packagePath(service, manifest, package) pkgInit = PkgInitConfig(pkgPath) pkgConfig = pkgInit.getConfigs() # check command type and package startup process if (exeName == 'reboot' or exeName == 'restart'): # default action for reboot is to startup, noop for restart agent action = 'startup' if 'reboot' == exeName else 'noop' if exeName == 'reboot' and pkgConfig and pkgConfig.has_key( 'lcm_on_system_reboot'): action = pkgConfig['lcm_on_system_reboot'] if (exeName == 'restart' and pkgConfig and pkgConfig.has_key('lcm_on_agent_restart')): action = pkgConfig['lcm_on_agent_restart'] if action == 'reset': execThread, dummy = self._getBuiltThread( service, manifest, package, "shutdown") execThreads.append([execThread, dummy]) execThread, dummy = self._getBuiltThread( service, manifest, package, "deactivate") execThreads.append([execThread, dummy]) execThread, dummy = self._getBuiltThread( service, manifest, package, "activate") execThreads.append([execThread, dummy]) if (action == 'reset' or action == 'startup'): execThread, dummy = self._getBuiltThread( service, manifest, package, 'startup') execThreads.append([execThread, dummy]) else: execThread, dummy = self._getBuiltThread( service, manifest, package, exeName) execThreads.append([execThread, dummy]) return execThreads
def _obtainCmdExecThreads(self, exeName, service, manifest, activateFlow): """start the threads to execute cmd in each package in the service/manifest""" execThreads = [] packages = ManifestController.getPackages(service, os.path.basename(manifest)) # Executing the deactivate in reversed order where the last package is first deactivated. if (not activateFlow): packages.reverse() # make sure there's something to do, otherwise just return here if (len(packages) == 0): return execThreads for package in packages: pkgPath = manifestutil.packagePath(service, manifest, package) pkgInit = PkgInitConfig(pkgPath) pkgConfig = pkgInit.getConfigs() # check command type and package startup process if (exeName == 'reboot' or exeName == 'restart'): # default action for reboot is to startup, noop for restart agent action = 'startup' if 'reboot' == exeName else 'noop' if exeName == 'reboot' and pkgConfig and pkgConfig.has_key('lcm_on_system_reboot'): action = pkgConfig['lcm_on_system_reboot'] if (exeName == 'restart' and pkgConfig and pkgConfig.has_key('lcm_on_agent_restart')): action = pkgConfig['lcm_on_agent_restart'] if action == 'reset': execThread, dummy = self._getBuiltThread(service, manifest, package, "shutdown") execThreads.append([execThread, dummy]) execThread, dummy = self._getBuiltThread(service, manifest, package, "deactivate") execThreads.append([execThread, dummy]) execThread, dummy = self._getBuiltThread(service, manifest, package, "activate") execThreads.append([execThread, dummy]) if (action == 'reset' or action == 'startup'): execThread, dummy = self._getBuiltThread(service, manifest, package, 'startup') execThreads.append([execThread, dummy]) else: execThread, dummy = self._getBuiltThread(service, manifest, package, exeName) execThreads.append([execThread, dummy]) return execThreads
def _addMonitors(self, service, activeManifest): ''' add monitors for a service's activeManifest ''' monitorTasks = [] self.__monitorTasks[(service, activeManifest)] = monitorTasks # metric tags metricTags = {} # add default metric tags metricTags['fqdn'] = utils.fqdn # read tags from agent agtMetricTags = manifestutil.readJsonServiceMeta('agent', [METRIC_TAGS_KEY]) if agtMetricTags and METRIC_TAGS_KEY in agtMetricTags: metricTags.update(agtMetricTags[METRIC_TAGS_KEY]) # read tags from service if (service != 'agent'): serviceMetricTags = manifestutil.readJsonServiceMeta(service, [METRIC_TAGS_KEY]) if serviceMetricTags or METRIC_TAGS_KEY in serviceMetricTags: metricTags.update(serviceMetricTags[METRIC_TAGS_KEY]) # all packages in this manifest packages = ManifestController.getPackages(service, os.path.basename(activeManifest)) # metric tags for externally passed in metrics # monitorTags = {additionaltags_dict, datatype_dict, ctx(env.pool.host), appType(Monitor|custom), monitorType(Cronus|CronusApplication)} self.__monitorTags[service] = {'default': (metricTags, {}, {})} self.__monitorValues[(service, 'default')] = {} self.__monitorMessages[(service, 'default')] = {} # a unique index for all monitors in the service for package in packages: # load monitor setting from cronus.ini pkgConfigs = manifestutil.getPackageInitConfig(service, activeManifest, package) if pkgConfigs is not None and 'monitors' in pkgConfigs: metricCtx = pkgConfigs[METRIC_CONTEXT] if METRIC_CONTEXT in pkgConfigs else {} metricTypes = {} if METRIC_TYPE_KEY in pkgConfigs and pkgConfigs[METRIC_TYPE_KEY]: metricTypes = pkgConfigs[METRIC_TYPE_KEY] if METRIC_TAGS_KEY in pkgConfigs and pkgConfigs[METRIC_TAGS_KEY]: metricTags.update(pkgConfigs[METRIC_TAGS_KEY]) monitors = pkgConfigs['monitors'] for monitor in monitors: try: m_name = str(monitor['name']) # metric tags for externally passed in metrics # monitorTags = {additionaltags_dict, datatype_dict, ctx(env.pool.host), appType(Monitor|custom), monitorType(Cronus|CronusApplication)} self.__monitorTags[service][m_name] = (metricTags, metricTypes, metricCtx) # now normalize the interval to one allowable by EVPS (downcast) if 'reportIntervalSec' not in monitor: continue m_interval = float(monitor['reportIntervalSec']) m_interval = self._normalizeResolution(m_interval) m_timeout = float(monitor['timeoutSec']) if 'timeoutSec' in monitor else m_interval m_timeout = max(1, min(m_interval-1, m_timeout)) m_items = monitor['items'] if 'items' in monitor else [] # prime monitor value store self.__monitorValues[(service, m_name)] = {} self.__monitorMessages[(service, m_name)] = {} mi_idx = 0 for m_item in m_items: if 'type' not in m_item: continue mi_idx += 1 mi_type = m_item['type'] mi_cmd = None if 'script' == mi_type: mi_script = m_item['script'] mi_cmd = manifestutil.getMonitorScriptPath(service, activeManifest, package, mi_script) else: # unknown type, skip LOG.error('Unknown monitor item type %s, can only be script' % mi_type) continue # schedule monitor m_sch_name = '%s.%s' % (service, m_name) try: self.__monitorMessages[(service, m_name)][mi_cmd] = [] task = self.__monitorSch.add_interval_task(self._runMonitor, '%s.%s' % (m_sch_name, str(mi_idx)), 0, float(m_interval), [mi_type,mi_cmd,service,m_name,m_timeout,(str(int(round(m_interval))),metricTags,metricTypes,metricCtx)],None) monitorTasks.append(task) except Exception as excep: LOG.error('Cannot add monitor task for %s.%s - (%s) %s' % (m_sch_name, str(mi_idx), excep, traceback.format_exc(5))) except Exception as excep1: LOG.error('Cannot add report task for %s.%s - (%s) %s' % (service, m_name, excep1, traceback.format_exc(5)))