Example #1
0
    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
Example #3
0
    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)))