/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.server.measurement; import java.util.List; import java.util.Set; import javax.ejb.Local; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.authz.Permission; import org.rhq.core.domain.common.EntityContext; import org.rhq.core.domain.measurement.DataType; import org.rhq.core.domain.measurement.DisplayType; import org.rhq.core.domain.measurement.MeasurementDefinition; import org.rhq.core.domain.measurement.MeasurementSchedule; import org.rhq.core.domain.measurement.ResourceMeasurementScheduleRequest; import org.rhq.core.domain.measurement.composite.MeasurementScheduleComposite; import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; import org.rhq.enterprise.server.agentclient.AgentClient; /** * A manager for {@link MeasurementSchedule}s. * * @author Heiko W. Rupp */ @Local public interface MeasurementScheduleManagerLocal extends MeasurementScheduleManagerRemote { /** * Given a resource ID, this will return all schedule collections for all of the resource's measurements, including * all measurements for the resource's children. This will also create schedules for resources if they do not * already exist. * * @param resourceIds IDs of the resources whose measurements are to be returned * @param getDescendents if true, descendents will be loaded as well * * @return the set of resource schedule requests for a subtree or a single resource */ Set<ResourceMeasurementScheduleRequest> findSchedulesForResourceAndItsDescendants(int[] resourceIds, boolean getDescendents); /** * Get the {@link AgentClient} (the connection to the agent) that is associated with the given schedule. * * @param sched a {@link MeasurementSchedule} for which we need a connection to the Agent * * @return an {@link AgentClient} that can be used to communicate with the Agent */ AgentClient getAgentClientForSchedule(MeasurementSchedule sched); /** * Return a list of MeasurementSchedules for the given definition ids and resource id. * * @param definitionIds * @param resourceId * * @return a list of Schedules */ List<MeasurementSchedule> findSchedulesByResourceIdAndDefinitionIds(Subject subject, int resourceId, int[] definitionIds); /** * Obtain a MeasurementSchedule by its Id after a check for a valid session * * @param subject a session id that must be valid * @param scheduleId The primary key of the Schedule * * @return a MeasurementSchedule or null if the session or the scheduleId are invalid */ MeasurementSchedule getScheduleById(Subject subject, int scheduleId); /** * Find MeasurementSchedules that are attached to a certain definition and a resource * * @param subject * @param definitionId The primary key of a MeasurementDefinition * @param resourceId the id of the resource * @param attachBaseline TODO * * @return the MeasurementSchedule of the given definition for the given resource */ MeasurementSchedule getSchedule(Subject subject, int resourceId, int definitionId, boolean attachBaseline) throws MeasurementNotFoundException; /** * Disables all collection schedules in the given measurement definition IDs. This only disables the "templates", it * does not disable actual schedules. For that capability, see * {@link #disableSchedules(Subject, int[], int)}. * * @param subject * @param measurementDefinitionIds * @param updateSchedules TODO * * @Deprecated portal-war */ void disableDefaultCollectionForMeasurementDefinitions(Subject subject, int[] measurementDefinitionIds, boolean updateSchedules); /** * Disables all collection schedules for all measurement definitions. This only disables the "templates", it does * not disable actual schedules. For that capability, see {@link #disableAllMeasurementSchedules(Subject)}. * * <p>This is a highly disruptive method - it turns off monitoring for future resources. The user making this call * must have global inventory and setting permissions to execute this.</p> * * @param subject user that must have global inventory and setting rights * * @deprecated portal-war */ void disableAllDefaultCollections(Subject subject); /** * Disables all collection schedules attached to all resources. This only disables the currently existing schedules, * it does not disable the templates for future resources. For that capability, see * {@link #disableAllDefaultCollections(Subject)}. * * <p>This is a highly disruptive method - it turns off monitoring for existing resources. The user making this call * must have global inventory and setting permissions to execute this.</p> * * @param subject user that must have global inventory and setting rights * * @deprecated portal-war */ void disableAllSchedules(Subject subject); /** * (Re-)Enables all collection schedules in the given measurement definition IDs and sets their collection * intervals. This only enables the "templates", it does not enable actual schedules unless updateExistingSchedules * is set to true. * * @param subject a valid subject that has the {@link Permission#MANAGE_SETTINGS MANAGE_SETTINGS} * global permission * @param measurementDefinitionIds the primary keys for the definitions * @param collectionInterval if > 0, enable the metric with this value as the the new collection * interval, in milliseconds; if == 0, enable the metric with its current * collection interval; if < 0, disable the metric; if >0, the value * should also be >=30000, since 30s is the minimum allowed interval; if * it is not, 30000 will be used instead of the specified interval * @param updateExistingSchedules if true, then existing schedules for this definition will also be updated. * * @deprecated portal-war */ void updateDefaultCollectionIntervalForMeasurementDefinitions(Subject subject, int[] measurementDefinitionIds, long collectionInterval, boolean updateExistingSchedules); /** * Using this method one can both update the default collection interval AND enable or disable the * measurement definitions. This method is therefore preferable if you need to do both these things * in 1 go. * * @param subject the current user * @param measurementDefinitionIds the ids of measurement definitions to update * @param collectionInterval the default collection interval to set * @param enable whether to enable or disable the measurement definition * @param updateExistingSchedules whether to accordingly update the existing schedules */ void updateDefaultCollectionIntervalAndEnablementForMeasurementDefinitions(Subject subject, int[] measurementDefinitionIds, long collectionInterval, boolean enable, boolean updateExistingSchedules); /** * Enables all collection schedules attached to the given auto group whose schedules are based off the given * definitions. This does not enable the "templates" (aka definitions). If the passed group does not exist an * Exception is thrown. * * @param subject Subject of the caller * @param measurementDefinitionIds the definitions on which the schedules to update are based * @param parentResourceId the Id of the parent resource * @param childResourceType the ID of the {@link ResourceType} of the children that form the autogroup * @param collectionInterval the new interval */ void updateSchedulesForAutoGroup(Subject subject, int parentResourceId, int childResourceType, int[] measurementDefinitionIds, long collectionInterval); /** * Determine the Schedules for a Resource and DataType. The data type is used to filter out (numerical) measurement * and / or traits. If it is null, then we don't filter by DataType * * @param subject Subject of the caller * @param resourceId PK of the resource we're interested in * @param dataType DataType of the desired results use null for no filtering * @param displayType the display type desired or null for no filtering * @param enabledOnly should we restrict the query to certain enablement state? null means "don't care". * * @return List of MeasuremenSchedules for the given resource */ List<MeasurementSchedule> findSchedulesForResourceAndType(Subject subject, int resourceId, DataType dataType, DisplayType displayType, boolean enabledOnly); /** * @return a rounded count of the average number of metrics that are scheduled per minute */ int getScheduledMeasurementsPerMinute(); /** * Disable the measurement schedules for the passed definitions of the rsource ot the passed auto group. * * @param subject * @param measurementDefinitionIds * @param parentResourceId * @param childResourceType * * @deprecated portal-war */ void disableSchedulesForAutoGroup(Subject subject, int parentResourceId, int childResourceType, int[] measurementDefinitionIds); /** * Enable the measurement schedules for the passed definitions of the resource ot the passed auto group. * * @param subject * @param measurementDefinitionIds * @param parentResourceId * @param childResourceType * * @deprecated portal-war */ void enableSchedulesForAutoGroup(Subject subject, int parentResourceId, int childResourceType, int[] measurementDefinitionIds); /** * Create {@link MeasurementSchedule}s for existing resources hanging on newType. * @param type The {@link ResourceType} for which we want to add schedules * @param newDefinition The {@link MeasurementDefinition} where we derive the schedules from */ void createSchedulesForExistingResources(ResourceType type, MeasurementDefinition newDefinition); int insertSchedulesFor(int[] batchIds) throws Exception; int returnSchedulesFor(int[] batchIds, Set<ResourceMeasurementScheduleRequest> allSchedules) throws Exception; /** * This method should be called when it is determined that the data in the measurement schedule table might be * corrupt. This happens when the schedules get a collection interval of less than 30 seconds. Execution of this * method will automatically correct that situation, and update the mtime's of the corresponding resources whose * schedules were corrupt, to cause the agent to synchronize those schedules. */ void errorCorrectSchedules(); /** * Return a list of MeasurementSchedules for the given ids * * @param ids PrimaryKeys of the schedules searched * * @return a list of Schedules */ List<MeasurementSchedule> findSchedulesByIds(int[] ids); /** * Find MeasurementSchedules that are attached to a certain definition and some resources * * @param subject A session id that must be valid * @param definitionId The primary key of a MeasurementDefinition * @param resourceIds primary of Resources wanted * * @return a List of MeasurementSchedules */ List<MeasurementSchedule> findSchedulesByResourceIdsAndDefinitionId(Subject subject, int[] resourceIds, int definitionId); /** * Return a list of MeasurementSchedules for the given definition ids and resource ids. Note that this method does * not take a Subject argument. Security checks are the responsibility of the caller. * * @param resourceIds The ids of the resource for which schedules are being fetched * @param definitionIds The ids of the the measurement definitions * @return A list of MeasurementSchedules */ List<MeasurementSchedule> findSchedulesByResourceIdsAndDefinitionIds(int[] resourceIds, int[] definitionIds); PageList<MeasurementScheduleComposite> getMeasurementScheduleCompositesByContext(Subject subject, EntityContext context, PageControl pc); int updateSchedulesForContext(Subject subject, EntityContext context, int[] measurementDefinitionIds, long collectionInterval); int enableSchedulesForContext(Subject subject, EntityContext context, int[] measurementDefinitionIds); int disableSchedulesForContext(Subject subject, EntityContext context, int[] measurementDefinitionIds); /** * Notifies all agents of measurement schedule changes. * @param entityContext the context. * @param scheduleSubQuery the subquery indicating which schedules changed */ void notifyAgentsOfScheduleUpdates(EntityContext entityContext, String scheduleSubQuery); }