/*
* 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, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* 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 and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.core.clientapi.server.configuration;
import org.rhq.core.communications.command.annotation.Asynchronous;
import org.rhq.core.communications.command.annotation.LimitedConcurrency;
import org.rhq.core.domain.configuration.Configuration;
/**
* Interface that allows an agent to provide information about a resource's configuration.
*/
public interface ConfigurationServerService {
String CONCURRENCY_LIMIT_CONFIG_UPDATE = "rhq.server.concurrency-limit.configuration-update";
/**
* The agent will notify the server when a configuration update request has been completed by calling this method.
*
* <p>The completed request will contain the final {@link ConfigurationUpdateResponse#getStatus() status}(for
* example, {@link ConfigurationUpdateStatus#SUCCESS} or {@link ConfigurationUpdateStatus#FAILURE}). If an error
* occurred, the request's {@link ConfigurationUpdateResponse#getErrorMessage() error message} should be
* non-<code>null</code> to describe an overall error message and it should have a Configuration with properties
* that contain {@link Property#getErrorMessage() error messages} that indicate which properties failed to get
* updated and why. This allows you to indicate all the errors that occurred, in case more than one property was
* invalid or could not be updated.</p>
*
* <p>If the update was successful, the <code>completedRequest</code> object does not need to have a
* non-<code>null</code> {@link ConfigurationUpdateResponse#getConfiguration()} (to avoid sending a duplicate
* configuration back over the wire). Therefore, callers can
* {@link ConfigurationUpdateResponse#setConfiguration(Configuration) set the configuration} to <code>null</code> if
* the status was {@link ConfigurationUpdateStatus#SUCCESS}. When the status is successful, the <code>
* response</code>'s configuration is actually ignored and the original configuration that was sent in the original
* request will be assumed to have been used (this is why agents can just set the configuration to <code>null</code>
* when successful - avoid sending it over the wire since this method doesn't even need it.</p>
*
* @param response information about the request that was completed (which may have succeeded or failed)
*/
@Asynchronous(guaranteedDelivery = true)
void completeConfigurationUpdate(ConfigurationUpdateResponse response);
/**
* This is for when the agent needs to notify the server that a new Resource configuration has been detected
* on the agent side. This happens when a resource configuration is changed outside of this system and is
* detected on its regularly scheduled checks for update.
* @param resourceId the resourceId to update
* @param resourceConfiguration the newly detected configuration
*/
@Asynchronous(guaranteedDelivery = true)
@LimitedConcurrency(CONCURRENCY_LIMIT_CONFIG_UPDATE)
void persistUpdatedResourceConfiguration(int resourceId, Configuration resourceConfiguration);
/**
* This is for when the agent needs to notify the server that a new Plugin configuration has been
* discovered on the agent side. This happens when resource discovery discovers a new version of a resource.
* The properties set by discovery are merged into the existing config, and need to be updated
* server-side.
*
* @param resourceId the resourceId to update
* @param resourceConfiguration the newly detected configuration
*
* @return The persisted plugin configuration
*/
@LimitedConcurrency(CONCURRENCY_LIMIT_CONFIG_UPDATE)
Configuration persistUpdatedPluginConfiguration(int resourceId, Configuration pluginConfiguration);
}