blob: 911bf24fafe1a4b703d2147d8d451f2fcd0fedb3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.kalumet.agent.updater;
import org.apache.kalumet.FileManipulator;
import org.apache.kalumet.KalumetException;
import org.apache.kalumet.agent.Configuration;
import org.apache.kalumet.agent.utils.EventUtils;
import org.apache.kalumet.controller.core.JEEApplicationServerController;
import org.apache.kalumet.controller.core.JEEApplicationServerControllerFactory;
import org.apache.kalumet.model.Agent;
import org.apache.kalumet.model.Cache;
import org.apache.kalumet.model.Environment;
import org.apache.kalumet.model.JDBCConnectionPool;
import org.apache.kalumet.model.JDBCDataSource;
import org.apache.kalumet.model.JEEApplication;
import org.apache.kalumet.model.JEEApplicationServer;
import org.apache.kalumet.model.JMSConnectionFactory;
import org.apache.kalumet.model.JMSServer;
import org.apache.kalumet.model.JNDIBinding;
import org.apache.kalumet.model.Kalumet;
import org.apache.kalumet.model.SharedLibrary;
import org.apache.kalumet.model.update.UpdateLog;
import org.apache.kalumet.model.update.UpdateMessage;
import org.apache.kalumet.utils.CommandUtils;
import org.apache.kalumet.utils.NotifierUtils;
import org.apache.kalumet.utils.PublisherUtils;
import org.apache.kalumet.utils.VariableUtils;
import org.apache.kalumet.ws.client.ClientException;
import org.apache.kalumet.ws.client.JEEApplicationServerClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Iterator;
import java.util.List;
/**
* Update a JEE application server.
*/
public class JEEApplicationServerUpdater
{
private static final transient Logger LOGGER = LoggerFactory.getLogger( JEEApplicationServerUpdater.class );
/**
* Wrapper class to update a JEE application server (via WS).
*
* @param environmentName the target environment name.
* @param serverName the target JEE application server name.
* @param delegation flag indicates if the update is a atomic call or part of an update launched by another agent.
* @throws KalumetException if the JEE application server update fails.
*/
public static void update( String environmentName, String serverName, boolean delegation )
throws KalumetException
{
LOGGER.info( "JEE application server {} update requested by WS", serverName );
// load configuration
LOGGER.debug( "Loading configuration" );
Kalumet kalumet = Kalumet.digeste( Configuration.CONFIG_LOCATION );
Environment environment = kalumet.getEnvironment( environmentName );
if ( environment == null )
{
LOGGER.error( "Environment {} is not found in the configuration", environmentName );
throw new KalumetException( "Environment " + environmentName + " is not found in the configuration" );
}
JEEApplicationServer applicationServer =
environment.getJEEApplicationServers().getJEEApplicationServer( serverName );
if ( applicationServer == null )
{
LOGGER.error( "JEE application server {} is not found in environment {}", serverName, environmentName );
throw new KalumetException(
"JEE application server " + serverName + " is not found in environment " + environmentName );
}
// update configuration cache
LOGGER.debug( "Updating configuration cache" );
Configuration.CONFIG_CACHE = kalumet;
EventUtils.post( environment, "UPDATE", "JEE application server " + serverName + " update requested by WS" );
UpdateLog updateLog =
new UpdateLog( "JEE application server " + serverName + " update in progress ...", environment.getName(),
environment );
if ( !delegation )
{
// it's not a delegation from another agent, send a notification and waiting for the count down
LOGGER.info( "Send a notification and waiting for the count down" );
EventUtils.post( environment, "UPDATE", "Send a notification and waiting for the count down" );
NotifierUtils.waitAndNotify( environment );
}
try
{
// launch the update
LOGGER.debug( "Call JEE application server updater" );
JEEApplicationServerUpdater.update( kalumet, environment, applicationServer, updateLog );
}
catch ( Exception e )
{
// an error occurs
LOGGER.error( "JEE application server {} update failed", serverName, e );
EventUtils.post( environment, "ERROR",
"JEE application server " + serverName + " update failed: " + e.getMessage() );
if ( !delegation )
{
// it's not a delegation from another agent, publish update result
updateLog.setStatus( "JEE application server " + serverName + " update failed" );
updateLog.addUpdateMessage( new UpdateMessage( "error", "JEE application server " + serverName
+ " update failed: " + e.getMessage() ) );
PublisherUtils.publish( environment );
}
throw new UpdateException( "JEE application server " + serverName + " update failed", e );
}
// update is completed
LOGGER.info( "JEE application server {} updated", applicationServer.getName() );
EventUtils.post( environment, "UPDATE", "JEE application server " + serverName + " updated" );
if ( !delegation )
{
// it's not a delegation from another agent, publish update result
if ( updateLog.isUpdated() )
{
updateLog.setStatus( "JEE application server " + serverName + " updated" );
}
else
{
updateLog.setStatus( "JEE application server " + serverName + " already up to date" );
}
updateLog.addUpdateMessage( new UpdateMessage( "info", "Update completed" ) );
LOGGER.info( "Publishing update report" );
PublisherUtils.publish( environment );
}
}
/**
* Update a JEE application server.
*
* @param kalumet the main configuration.
* @param environment the target <code>Environment</code>.
* @param server the target <code>ApplicationServer</code> to update.
* @param updateLog the <code>UpdateLog</code> to use.
*/
public static void update( Kalumet kalumet, Environment environment, JEEApplicationServer server,
UpdateLog updateLog )
throws UpdateException
{
String applicationServerJmxUrl = VariableUtils.replace( server.getJmxurl(), environment.getVariables() );
LOGGER.info( "Updating JEE application server {}", server.getName() );
if ( !server.isActive() )
{
LOGGER.info( "JEE application server {} is inactive, so not updated", server.getName() );
updateLog.addUpdateMessage( new UpdateMessage( "info", "JEE application server " + server.getName()
+ " is inactive, so not updated" ) );
EventUtils.post( environment, "UPDATE",
"JEE application server " + server.getName() + " is inactive, so not updated" );
return;
}
if ( server.getAgent() != null && server.getAgent().trim().length() > 0 &&
!server.getAgent().equals( Configuration.AGENT_ID ) )
{
// delegates the update to another agent
LOGGER.info( "Delegating JEE application server {} update to agent {}", server.getName(),
server.getAgent() );
EventUtils.post( environment, "UPDATE",
"Delegating JEE application server " + server.getName() + " update to agent "
+ server.getAgent() );
updateLog.addUpdateMessage( new UpdateMessage( "info",
"Delegating JEE application server " + server.getName()
+ " update to agent " + server.getAgent() ) );
Agent delegationAgent = Configuration.CONFIG_CACHE.getAgent( server.getAgent() );
if ( delegationAgent == null )
{
// the target agent is not found in the configuration
LOGGER.error( "Agent {} not found in the configuration", server.getAgent() );
throw new UpdateException( "Agent " + server.getAgent() + " not found in the configuration" );
}
try
{
// request the update via WebService call
LOGGER.debug( "Call JEE application server WS" );
JEEApplicationServerClient client =
new JEEApplicationServerClient( delegationAgent.getHostname(), delegationAgent.getPort() );
client.update( environment.getName(), server.getName(), true );
}
catch ( ClientException e )
{
// an error occurs during the update on the remote agent
LOGGER.error( "JEE application server {} update failed", server.getName(), e );
throw new UpdateException( "JEE application server " + server.getName() + " update failed", e );
}
return;
}
EventUtils.post( environment, "UPDATE", "Updating JEE application server " + server.getName() );
updateLog.addUpdateMessage( new UpdateMessage( "info",
"JEE application server " + server.getName() + " located "
+ applicationServerJmxUrl ) );
// update JDBC connection pools
LOGGER.info( "Updating JDBC connection pools" );
for ( Iterator connectionPoolIterator = server.getJDBCConnectionPools().iterator();
connectionPoolIterator.hasNext(); )
{
JDBCConnectionPool connectionPool = (JDBCConnectionPool) connectionPoolIterator.next();
try
{
JDBCConnectionPoolUpdater.update( environment, server, connectionPool, updateLog );
}
catch ( UpdateException updateException )
{
// the JDBC connection pool update has failed
if ( connectionPool.isBlocker() )
{
// connection pool is update blocker
LOGGER.error( "JDBC connection pool {} update failed", connectionPool.getName(), updateException );
updateLog.addUpdateMessage( new UpdateMessage( "error",
"JDBC connection pool " + connectionPool.getName()
+ " update failed: "
+ updateException.getMessage() ) );
EventUtils.post( environment, "ERROR",
"JDBC connection pool " + connectionPool.getName() + " update failed: "
+ updateException.getMessage() );
throw new UpdateException( "JDBC connection ool " + connectionPool.getName() + " update failed",
updateException );
}
else
{
// connection pool is not update blocker
LOGGER.warn( "JDBC connection pool {} update failed", connectionPool.getName(), updateException );
updateLog.addUpdateMessage( new UpdateMessage( "warn",
"JDBC connection pool " + connectionPool.getName()
+ " update failed: "
+ updateException.getMessage() ) );
updateLog.addUpdateMessage( new UpdateMessage( "info",
"JDBC connection pool " + connectionPool.getName()
+ " is not update blocker, update continues" ) );
EventUtils.post( environment, "WARN",
"JDBC connection pool " + connectionPool.getName() + " update failed: "
+ updateException.getMessage() );
EventUtils.post( environment, "UPDATE", "JDBC connection pool " + connectionPool.getName()
+ " is not update blocker, update continues" );
}
}
}
// update JDBC data sources
LOGGER.info( "Updating JDBC data sources" );
for ( Iterator dataSourceIterator = server.getJDBCDataSources().iterator(); dataSourceIterator.hasNext(); )
{
JDBCDataSource dataSource = (JDBCDataSource) dataSourceIterator.next();
try
{
JDBCDataSourceUpdater.update( environment, server, dataSource, updateLog );
}
catch ( UpdateException updateException )
{
// the JDBC data source update has failed
if ( dataSource.isBlocker() )
{
// data source is update blocker
LOGGER.error( "JDBC data source {} udpate failed", dataSource.getName(), updateException );
updateLog.addUpdateMessage( new UpdateMessage( "error", "JDBC data source " + dataSource.getName()
+ " update failed: " + updateException.getMessage() ) );
EventUtils.post( environment, "ERROR",
"JDBC data source " + dataSource.getName() + " update failed: "
+ updateException.getMessage() );
throw new UpdateException( "JDBC data source " + dataSource.getName() + " update failed",
updateException );
}
else
{
// data source is not update blocker
LOGGER.warn( "JDBC data source {} update failed", dataSource.getName(), updateException );
updateLog.addUpdateMessage( new UpdateMessage( "warn", "JDBC data source " + dataSource.getName()
+ " update failed: " + updateException.getMessage() ) );
updateLog.addUpdateMessage( new UpdateMessage( "info", "JDBC data source " + dataSource.getName()
+ " is not update blocker, update continues" ) );
EventUtils.post( environment, "WARN",
"JDBC data source " + dataSource.getName() + " update failed: "
+ updateException.getMessage() );
EventUtils.post( environment, "UPDATE", "JDBC data source " + dataSource.getName()
+ " is not update blocker, update continues" );
}
}
}
// update JMS connection factories
LOGGER.info( "Updating JMS connection factories" );
for ( Iterator jmsConnectionFactoryIterator = server.getJMSConnectionFactories().iterator();
jmsConnectionFactoryIterator.hasNext(); )
{
JMSConnectionFactory jmsConnectionFactory = (JMSConnectionFactory) jmsConnectionFactoryIterator.next();
try
{
JMSConnectionFactoryUpdater.update( environment, server, jmsConnectionFactory, updateLog );
}
catch ( UpdateException updateException )
{
// the JMS connection factory update has failed
if ( jmsConnectionFactory.isBlocker() )
{
// JMS connection factory is update blocker
LOGGER.error( "JMS connection factory {} update failed", jmsConnectionFactory.getName(),
updateException );
updateLog.addUpdateMessage( new UpdateMessage( "error", "JMS connection factory "
+ jmsConnectionFactory.getName() + " update failed: " + updateException.getMessage() ) );
EventUtils.post( environment, "ERROR",
"JMS connection factory " + jmsConnectionFactory.getName() + " update failed: "
+ updateException.getMessage() );
throw new UpdateException(
"JMS connection factory " + jmsConnectionFactory.getName() + " update failed: "
+ updateException.getMessage(), updateException );
}
else
{
// JMS connection factory is not update blocker
LOGGER.warn( "JMS connection factory {} update failed", jmsConnectionFactory.getName(),
updateException );
updateLog.addUpdateMessage( new UpdateMessage( "warn", "JMS connection factory "
+ jmsConnectionFactory.getName() + " update failed: " + updateException.getMessage() ) );
updateLog.addUpdateMessage( new UpdateMessage( "info", "JMS connection factory "
+ jmsConnectionFactory.getName() + " is not update blocker, update continues" ) );
EventUtils.post( environment, "WARN",
"JMS connection factory " + jmsConnectionFactory.getName() + " update failed: "
+ updateException.getMessage() );
EventUtils.post( environment, "UPDATE", "JMS connection factory " + jmsConnectionFactory.getName()
+ " is not update blocker, update continues" );
}
}
}
// update JMS servers
LOGGER.info( "Updating JMS servers" );
for ( Iterator jmsServerIterator = server.getJMSServers().iterator(); jmsServerIterator.hasNext(); )
{
JMSServer jmsServer = (JMSServer) jmsServerIterator.next();
try
{
JMSServerUpdater.update( environment, server, jmsServer, updateLog );
}
catch ( UpdateException updateException )
{
// the JMS server update has failed
if ( jmsServer.isBlocker() )
{
// JMS server is update blocker
LOGGER.error( "JMS server {} update failed", jmsServer.getName(), updateException );
updateLog.addUpdateMessage( new UpdateMessage( "error", "JMS server " + jmsServer.getName()
+ " update failed: " + updateException.getMessage() ) );
EventUtils.post( environment, "ERROR", "JMS server " + jmsServer.getName() + " update failed: "
+ updateException.getMessage() );
throw new UpdateException( "JMS server " + jmsServer.getName() + " update failed",
updateException );
}
else
{
// JMS server is not update blocker
LOGGER.warn( "JMS server {} update failed", jmsServer.getName(), updateException );
updateLog.addUpdateMessage( new UpdateMessage( "warn", "JMS server " + jmsServer.getName()
+ " update failed: " + updateException.getMessage() ) );
updateLog.addUpdateMessage( new UpdateMessage( "info", "JMS server " + jmsServer.getName()
+ " is not update blocker, update continues" ) );
EventUtils.post( environment, "WARN", "JMS server " + jmsServer.getName() + " update failed: "
+ updateException.getMessage() );
EventUtils.post( environment, "UPDATE",
"JMS server " + jmsServer.getName() + " is not update blocker, update continues" );
}
}
}
// update JNDI name space bindings
LOGGER.info( "Updating JNDIbindings" );
for ( Iterator jndiBindingsIterator = server.getJNDIBindings().iterator(); jndiBindingsIterator.hasNext(); )
{
JNDIBinding jndiBinding = (JNDIBinding) jndiBindingsIterator.next();
try
{
JNDIBindingUpdater.update( environment, server, jndiBinding, updateLog );
}
catch ( UpdateException updateException )
{
// the JNDI binding update has failed
if ( jndiBinding.isBlocker() )
{
// JNDIbinding is update blocker
LOGGER.error( "JNDI binding {} update failed", jndiBinding.getName(), updateException );
updateLog.addUpdateMessage( new UpdateMessage( "error", "JNDI binding " + jndiBinding.getName()
+ " update failed: " + updateException.getMessage() ) );
EventUtils.post( environment, "ERROR", "JNDI binding " + jndiBinding.getName() + " update failed: "
+ updateException.getMessage() );
throw new UpdateException( "JNDI binding " + jndiBinding.getName() + " update failed",
updateException );
}
else
{
// JNDI binding is not update blocker
LOGGER.warn( "JNDI binding {} update failed", jndiBinding.getName(), updateException );
updateLog.addUpdateMessage( new UpdateMessage( "warn", "JNDI binding " + jndiBinding.getName()
+ " update failed: " + updateException.getMessage() ) );
updateLog.addUpdateMessage( new UpdateMessage( "info", "JNDI binding " + jndiBinding.getName()
+ " is not update blocker, update continues" ) );
EventUtils.post( environment, "WARN", "JNDI binding " + jndiBinding.getName() + " update failed: "
+ updateException.getMessage() );
EventUtils.post( environment, "UPDATE", "JNDI binding " + jndiBinding.getName()
+ " is not update blocker, update continues" );
}
}
}
// update shared libraries
LOGGER.info( "Updating shared libraries" );
for ( Iterator sharedLibraryIterator = server.getSharedLibraries().iterator();
sharedLibraryIterator.hasNext(); )
{
SharedLibrary sharedLibrary = (SharedLibrary) sharedLibraryIterator.next();
try
{
SharedLibraryUpdater.update( environment, server, sharedLibrary, updateLog );
}
catch ( UpdateException updateException )
{
// the shared library update has failed
if ( sharedLibrary.isBlocker() )
{
// shared library is update blocker
LOGGER.error( "Shared library {} update failed", sharedLibrary.getName(), updateException );
updateLog.addUpdateMessage( new UpdateMessage( "error", "Shared library " + sharedLibrary.getName()
+ " update failed: " + updateException.getMessage() ) );
EventUtils.post( environment, "ERROR",
"Shared library " + sharedLibrary.getName() + " update failed: "
+ updateException.getMessage() );
throw new UpdateException( "Shared library " + sharedLibrary.getName() + " update failed",
updateException );
}
else
{
// shared library is not update blocker
LOGGER.warn( "Shared library {} update failed", sharedLibrary.getName(), updateException );
updateLog.addUpdateMessage( new UpdateMessage( "warn", "Shared library " + sharedLibrary.getName()
+ " update failed: " + updateException.getMessage() ) );
updateLog.addUpdateMessage( new UpdateMessage( "info", "Shared library " + sharedLibrary.getName()
+ " is not update blocker, update continues" ) );
EventUtils.post( environment, "WARN",
"Shared library " + sharedLibrary.getName() + " update failed: "
+ updateException.getMessage() );
EventUtils.post( environment, "UPDATE", "Shared library " + sharedLibrary.getName()
+ " is not update blocker, update continues" );
}
}
}
// update JEE applications
LOGGER.info( "Updating JEE applications" );
for ( Iterator applicationIterator = server.getJEEApplications().iterator(); applicationIterator.hasNext(); )
{
JEEApplication application = (JEEApplication) applicationIterator.next();
try
{
JEEApplicationUpdater.update( environment, server, application, updateLog );
}
catch ( UpdateException updateException )
{
// the JEE application update has failed
if ( application.isBlocker() )
{
// JEE application is update blocker
LOGGER.error( "JEE application {} update failed", application.getName(), updateException );
updateLog.addUpdateMessage( new UpdateMessage( "error", "JEE application " + application.getName()
+ " update failed: " + updateException.getMessage() ) );
EventUtils.post( environment, "ERROR",
"JEE application " + application.getName() + " update failed: "
+ updateException.getMessage() );
throw new UpdateException( "JEE application " + application.getName() + " update failed",
updateException );
}
else
{
// JEE application is not update blocker
LOGGER.warn( "JEE application {} update failed", application.getName(), updateException );
updateLog.addUpdateMessage( new UpdateMessage( "warn", "JEE application " + application.getName()
+ " update failed: " + updateException.getMessage() ) );
updateLog.addUpdateMessage( new UpdateMessage( "info", "JEE application " + application.getName()
+ " is not update blocker, update continues" ) );
EventUtils.post( environment, "WARN",
"JEE application " + application.getName() + " update failed: "
+ updateException.getMessage() );
EventUtils.post( environment, "UPDATE", "JEE application " + application.getName()
+ " is not update blocker, update continues" );
}
}
}
// stop JEE server
LOGGER.info( "Shutting down JEE application server" );
try
{
JEEApplicationServerUpdater.stop( environment, server, updateLog );
}
catch ( UpdateException updateException )
{
// the JEE application server stop has failed
if ( server.isBlocker() )
{
// JEE application server is update blocker
LOGGER.error( "JEE application server {} shutdown failed", server.getName(), updateException );
updateLog.addUpdateMessage( new UpdateMessage( "error", "JEE application server " + server.getName()
+ " shutdown failed: " + updateException.getMessage() ) );
EventUtils.post( environment, "ERROR",
"JEE application server " + server.getName() + " shutdown failed: "
+ updateException.getMessage() );
throw new UpdateException(
"JEE application server " + server.getName() + " shutdown failed: " + updateException.getMessage(),
updateException );
}
else
{
// JEE application server is not update blocker
LOGGER.warn( "JEE application server {} shutdown failed", server.getName(), updateException );
updateLog.addUpdateMessage( new UpdateMessage( "warn", "JEE application server " + server.getName()
+ " shutdown failed: " + updateException.getMessage() ) );
updateLog.addUpdateMessage( new UpdateMessage( "info", "JEE application server " + server.getName()
+ " is not update blocker, update continues" ) );
EventUtils.post( environment, "WARN",
"JEE application server " + server.getName() + " shutdown failed: "
+ updateException.getMessage() );
EventUtils.post( environment, "UPDATE", "JEE application server " + server.getName()
+ " is not update blocker, update continues" );
}
}
// clean the JEE application server cache
LOGGER.info( "Clean JEE application server cache directories" );
try
{
JEEApplicationServerUpdater.cleanCaches( environment, server, updateLog );
}
catch ( UpdateException updateException )
{
// the JEE application server cache directories cleaning has failed
if ( server.isBlocker() )
{
// JEE application server is update blocker
LOGGER.error( "JEE application server {} cache directories cleanup failed", server.getName(),
updateException );
updateLog.addUpdateMessage( new UpdateMessage( "error", "JEE application server " + server.getName()
+ " cache directories cleanup failed: " + updateException.getMessage() ) );
EventUtils.post( environment, "ERROR",
"JEE application server " + server.getName() + " cache directories cleanup failed: "
+ updateException.getMessage() );
throw new UpdateException(
"JEE application server " + server.getName() + " cache directories cleanup failed",
updateException );
}
else
{
// JEE application server is not update blocker
LOGGER.warn( "JEE application server {} cache directories cleanup failed", server.getName(),
updateException );
updateLog.addUpdateMessage( new UpdateMessage( "warn", "JEE application server " + server.getName()
+ " cache directories cleanup failed: " + updateException.getMessage() ) );
updateLog.addUpdateMessage( new UpdateMessage( "info", "JEE application server " + server.getName()
+ " is not update blocker, update continues" ) );
EventUtils.post( environment, "WARN",
"JEE application server " + server.getName() + " cache directories cleanup failed: "
+ updateException.getMessage() );
EventUtils.post( environment, "UPDATE", "JEE application server " + server.getName()
+ " is not update blocker, update continues" );
}
}
// start JEE application server
LOGGER.info( "Starting JEE application server" );
try
{
JEEApplicationServerUpdater.start( kalumet, environment, server, updateLog );
}
catch ( UpdateException updateException )
{
// the JEE application server start has failed
if ( server.isBlocker() )
{
// JEE application server is update blocker
LOGGER.error( "JEE application server {} start failed", server.getName(), updateException );
updateLog.addUpdateMessage( new UpdateMessage( "error", "JEE application server " + server.getName()
+ " start failed: " + updateException.getMessage() ) );
EventUtils.post( environment, "ERROR", "JEE application server " + server.getName() + " start failed: "
+ updateException.getMessage() );
throw new UpdateException( "JEE application server " + server.getName() + " start failed",
updateException );
}
else
{
// JEE application server is not update blocker
LOGGER.warn( "JEE application server " + server.getName() + " start failed", updateException );
updateLog.addUpdateMessage( new UpdateMessage( "warn", "JEE application server " + server.getName()
+ " start failed: " + updateException.getMessage() ) );
updateLog.addUpdateMessage( new UpdateMessage( "info", "JEE application server " + server.getName()
+ " is not update blocker, update continues" ) );
EventUtils.post( environment, "WARN", "JEE application server " + server.getName() + " start failed: "
+ updateException.getMessage() );
EventUtils.post( environment, "UPDATE", "JEE application server " + server.getName()
+ " is not update blocker, update continues" );
}
}
// update completed
EventUtils.post( environment, "UPDATE", "JEE application server updated" );
}
/**
* Shutdown a JEE server.
*
* @param environment the target <code>Environment</code>.
* @param server the <code>JEEApplicationServer</code> to stop.
* @param updateLog the <code>UpdateLog</code> to use.
*/
protected static void stop( Environment environment, JEEApplicationServer server, UpdateLog updateLog )
throws UpdateException
{
// TODO delegate the JEE server stop to another agent is required
try
{
if ( !server.isUpdateRequireRestart() || !updateLog.isUpdated() )
{
LOGGER.info( "JEE application server {} shutdown is not required", server.getName() );
updateLog.addUpdateMessage( new UpdateMessage( "info", "JEE application server " + server.getName()
+ " shutdown is not required" ) );
EventUtils.post( environment, "UPDATE",
"JEE application server " + server.getName() + " shutdown is not required" );
return;
}
// the server restart is required
LOGGER.info( "JEE application server {} shutdown is required", server.getName() );
updateLog.addUpdateMessage(
new UpdateMessage( "info", "JEE application server " + server.getName() + " shutdown is required" ) );
EventUtils.post( environment, "UPDATE",
"JEE application server " + server.getName() + " shutdown is required" );
if ( server.isUsejmxstop() )
{
LOGGER.debug( "JEE application server shutdown is performed using JMX controller" );
LOGGER.debug( "Getting JEE application server JMX controller" );
JEEApplicationServerController controller =
JEEApplicationServerControllerFactory.getController( environment, server );
controller.shutdown();
LOGGER.info( "JEE application server {} shutdown completed", server.getName() );
EventUtils.post( environment, "UPDATE", "JEE server " + server.getName() + " shutdown completed" );
updateLog.addUpdateMessage(
new UpdateMessage( "info", "JEE server " + server.getName() + " shutdown completed" ) );
return;
}
LOGGER.debug( "JEE application server shutdown is performed using system command" );
String output = CommandUtils.execute(
VariableUtils.replace( server.getShutdowncommand(), environment.getVariables() ) );
LOGGER.info( "JEE application server " + server.getName() + " shutdown completed: " + output );
updateLog.addUpdateMessage( new UpdateMessage( "info", "JEE application server " + server.getName()
+ " shutdown completed: " + output ) );
EventUtils.post( environment, "UPDATE",
"JEE server " + server.getName() + " shutdown completed: " + output );
}
catch ( Exception exception )
{
LOGGER.error( "JEE application server " + server.getName() + " shutdown failed", exception );
updateLog.addUpdateMessage( new UpdateMessage( "error",
"JEE server " + server.getName() + " shutdown failed: "
+ exception.getMessage() ) );
EventUtils.post( environment, "ERROR", "JEE application server " + server.getName() + " shutdown failed: "
+ exception.getMessage() );
throw new UpdateException( "JEE application server " + server.getName() + " shutdown failed", exception );
}
}
/**
* Start a JEE application server.
*
* @param kalumet the configuration.
* @param environment the target <code>Environment</code>.
* @param server the <code>JEEApplicationServer</code> to start.
* @param updateLog the <code>UpdateLog</code> to use.
*/
protected static void start( Kalumet kalumet, Environment environment, JEEApplicationServer server,
UpdateLog updateLog )
throws UpdateException
{
// TODO delegate the JEE server start to another agent is required
try
{
if ( !server.isUpdateRequireRestart() || !updateLog.isUpdated() )
{
LOGGER.info( "JEE application server {} start is not required", server.getName() );
EventUtils.post( environment, "UPDATE",
"JEE application server " + server.getName() + " start is not required" );
updateLog.addUpdateMessage(
new UpdateMessage( "info", "JEE application server " + server.getName() + " start is required" ) );
return;
}
LOGGER.info( "JEE application server {} start is required", server.getName() );
updateLog.addUpdateMessage(
new UpdateMessage( "info", "JEE application server " + server.getName() + " start is required" ) );
EventUtils.post( environment, "UPDATE",
"JEE application server " + server.getName() + " start is required" );
// get the agent configuration
Agent agent = kalumet.getAgent( Configuration.AGENT_ID );
// check the agent max environment active
if ( agent.getMaxjeeapplicationserversstarted() > 0 )
{
// get the environments managed by the agent
List agentEnvironments = kalumet.getEnvironmentsByAgent( Configuration.AGENT_ID );
int applicationServersStarted = 0;
for ( Iterator agentEnvironmentsIterator = agentEnvironments.iterator();
agentEnvironmentsIterator.hasNext(); )
{
Environment agentEnvironment = (Environment) agentEnvironmentsIterator.next();
// check if the application server started into the environment
for ( Iterator agentEnvironmentApplicationServersIterator =
agentEnvironment.getJEEApplicationServers().getJEEApplicationServers().iterator();
agentEnvironmentApplicationServersIterator.hasNext(); )
{
JEEApplicationServer agentEnvironmentApplicationServer =
(JEEApplicationServer) agentEnvironmentApplicationServersIterator.next();
// get the controller
JEEApplicationServerController controller =
JEEApplicationServerControllerFactory.getController( environment, server );
if ( !controller.isStopped() )
{
applicationServersStarted++;
if ( applicationServersStarted >= agent.getMaxjeeapplicationserversstarted() )
{
// the max number of application servers started is raised
throw new UpdateException(
"The maximum number of started JEE application servers has been raised for the agent" );
}
}
}
}
}
// the start is performed using system command
String output =
CommandUtils.execute( VariableUtils.replace( server.getStartupcommand(), environment.getVariables() ) );
// application server start has been performed
LOGGER.info( "JEE application server {} start completed: {}", server.getName(), output );
updateLog.addUpdateMessage( new UpdateMessage( "info", "JEE application server " + server.getName()
+ " start completed: " + output ) );
EventUtils.post( environment, "UPDATE",
"JEE application server " + server.getName() + " start completed: " + output );
}
catch ( Exception exception )
{
LOGGER.error( "JEE application server {} start failed", server.getName(), exception );
updateLog.addUpdateMessage( new UpdateMessage( "error", "JEE application server " + server.getName()
+ " start failed: " + exception.getMessage() ) );
EventUtils.post( environment, "ERROR", "JEE application server " + server.getName() + " start failed: "
+ exception.getMessage() );
throw new UpdateException( "JEE application server " + server.getName() + " start failed", exception );
}
}
/**
* Cleanup JEE application server caches.
*
* @param environment the <code>Environment</code>.
* @param server the target <code>JEEApplicationServer</code>.
* @param updateLog the <code>UpdateLog</code> to use.
*/
protected static void cleanCaches( Environment environment, JEEApplicationServer server, UpdateLog updateLog )
throws UpdateException
{
try
{
if ( !server.isUpdateRequireCacheCleaning() || !updateLog.isUpdated() )
{
LOGGER.info( "JEE application server {} caches cleaning is not required", server.getName() );
updateLog.addUpdateMessage( new UpdateMessage( "info", "JEE application server " + server.getName()
+ " caches cleaning is not required" ) );
EventUtils.post( environment, "UPDATE",
"JEE application server " + server.getName() + " caches cleaning is not required" );
return;
}
// the application server caches cleaning is required
LOGGER.info( "JEE application server {} caches cleaning is required", server.getName() );
updateLog.addUpdateMessage( new UpdateMessage( "info", "JEE application server " + server.getName()
+ " caches cleaning is required" ) );
EventUtils.post( environment, "UPDATE",
"JEE application server " + server.getName() + " caches cleaning is required" );
// initializes the file manipulator instance
FileManipulator fileManipulator = new FileManipulator();
for ( Iterator cacheIterator = server.getCaches().iterator(); cacheIterator.hasNext(); )
{
Cache cache = (Cache) cacheIterator.next();
String path = VariableUtils.replace( cache.getPath(), environment.getVariables() );
fileManipulator.delete( path );
}
}
catch ( Exception exception )
{
LOGGER.error( "JEE application server {} cache directories cleanup failed", server.getName(), exception );
updateLog.addUpdateMessage( new UpdateMessage( "error", "JEE application server" + server.getName()
+ " cache directories cleanup failed: " + exception.getMessage() ) );
EventUtils.post( environment, "ERROR",
"JEE application server " + server.getName() + " cache directories cleanup failed: "
+ exception.getMessage() );
throw new UpdateException( "JEE application server " + server.getName() + " caches cleanup failed",
exception );
}
}
/**
* Wrapper method to start JEE application server (via WS).
*
* @param environmentName the target environment name.
* @param serverName the target JEE application server name.
*/
public static void start( String environmentName, String serverName )
throws KalumetException
{
LOGGER.info( "JEE application server {} start requested by WS", serverName );
LOGGER.debug( "Loading configuration" );
Kalumet kalumet = Kalumet.digeste( Configuration.CONFIG_LOCATION );
Environment environment = kalumet.getEnvironment( environmentName );
if ( environment == null )
{
LOGGER.error( "Environment {} is not found in the configuration", environmentName );
throw new UpdateException( "Environment " + environmentName + " is not found in the configuration" );
}
JEEApplicationServer server = environment.getJEEApplicationServers().getJEEApplicationServer( serverName );
if ( server == null )
{
LOGGER.error( "JEE application server {} is not found in environment {}", serverName, environmentName );
throw new UpdateException(
"JEE application server " + serverName + " is not found in environment " + environmentName );
}
// get the agent configuration
Agent agent = kalumet.getAgent( Configuration.AGENT_ID );
// check the agent max environment active
if ( agent.getMaxjeeapplicationserversstarted() > 0 )
{
// get the environments managed by the agent
List agentEnvironments = kalumet.getEnvironmentsByAgent( Configuration.AGENT_ID );
int applicationServersStarted = 0;
for ( Iterator agentEnvironmentsIterator = agentEnvironments.iterator();
agentEnvironmentsIterator.hasNext(); )
{
Environment agentEnvironment = (Environment) agentEnvironmentsIterator.next();
// check if the application server started into the environment
for ( Iterator agentEnvironmentApplicationServersIterator =
agentEnvironment.getJEEApplicationServers().getJEEApplicationServers().iterator();
agentEnvironmentApplicationServersIterator.hasNext(); )
{
JEEApplicationServer agentEnvironmentApplicationServer =
(JEEApplicationServer) agentEnvironmentApplicationServersIterator.next();
// get the controller
JEEApplicationServerController controller =
JEEApplicationServerControllerFactory.getController( environment, server );
if ( !controller.isStopped() )
{
applicationServersStarted++;
if ( applicationServersStarted >= agent.getMaxjeeapplicationserversstarted() )
{
// the max number of application servers started is raised
throw new KalumetException(
"The maximum number of started JEE application servers has been raised for the agent" );
}
}
}
}
}
EventUtils.post( environment, "INFO", "JEE application server " + serverName + " start requested by WS" );
// the start is performed using system command
String output =
CommandUtils.execute( VariableUtils.replace( server.getStartupcommand(), environment.getVariables() ) );
// application server start has been performed
LOGGER.info( "JEE application server {} STARTED: {}", serverName, output );
EventUtils.post( environment, "INFO", "JEE application server " + serverName + " started: " + output );
}
/**
* Wrapper method to stop JEE application server (via WS).
*
* @param environmentName the environment name.
* @param serverName the JEE application server name.
*/
public static void stop( String environmentName, String serverName )
throws UpdateException
{
LOGGER.info( "JEE application server {} shutdown requested by WS", serverName );
Kalumet kalumet;
try
{
kalumet = Kalumet.digeste( Configuration.CONFIG_LOCATION );
}
catch ( KalumetException e )
{
LOGGER.error( "Can't load configuration", e );
throw new UpdateException( "Can't load configuration", e );
}
Environment environment = kalumet.getEnvironment( environmentName );
if ( environment == null )
{
LOGGER.error( "Environment {} is not found in the configuration", environmentName );
throw new UpdateException( "Environment " + environmentName + " is not found in the configuration" );
}
JEEApplicationServer server = environment.getJEEApplicationServers().getJEEApplicationServer( serverName );
if ( server == null )
{
LOGGER.error( "JEE application server {} is not found in environment {}", serverName, environmentName );
throw new UpdateException(
"JEE application server " + serverName + " is not found in environment " + environmentName );
}
EventUtils.post( environment, "INFO", "JEE application server " + serverName + " shutdown requested by WS" );
// check if the stop is made using JMX
try
{
if ( server.isUsejmxstop() )
{
JEEApplicationServerController controller =
JEEApplicationServerControllerFactory.getController( environment, server );
controller.shutdown();
LOGGER.info( "JEE application server {} shutdown using the controller", serverName );
EventUtils.post( environment, "INFO",
"JEE application server " + serverName + " shutdown using the controller" );
return;
}
}
catch ( Exception e )
{
LOGGER.error( "JEE application server {} shutdown failed", serverName, e );
throw new UpdateException( "JEE application server " + serverName + " shutdown failed", e );
}
// no JMX stop, use system command call
String shutdownCommand = VariableUtils.replace( server.getShutdowncommand(), environment.getVariables() );
String output = null;
try
{
output = CommandUtils.execute( shutdownCommand );
}
catch ( KalumetException e )
{
LOGGER.error( "JEE application server {} shutdown FAILED.", serverName, e );
throw new UpdateException( "JEE application server " + serverName + " shutdown failed", e );
}
LOGGER.info( "JEE application server {} shutdown using system command: {}", serverName, output );
EventUtils.post( environment, "INFO",
"JEE application server " + serverName + " shutdown using system command: " + output );
}
/**
* Wrapper method to get JEE application server status (via WS).
*
* @param environmentName the environment name.
* @param applicationServerName the JEE application server name.
* @return the JEE application server current status.
*/
public static String status( String environmentName, String applicationServerName )
throws UpdateException
{
// TODO delegate the JEE server status to another agent if required
LOGGER.info( "JEE application server {} status check requested by WS", applicationServerName );
LOGGER.debug( "Loading configuration" );
Kalumet kalumet;
try
{
kalumet = Kalumet.digeste( Configuration.CONFIG_LOCATION );
}
catch ( KalumetException e )
{
LOGGER.error( "Can't load configuration", e );
throw new UpdateException( "Can't load configuration", e );
}
Environment environment = kalumet.getEnvironment( environmentName );
if ( environment == null )
{
LOGGER.error( "Environment {} is not found in the configuration", environmentName );
throw new UpdateException( "Environment " + environmentName + " is not found in the configuration" );
}
JEEApplicationServer server =
environment.getJEEApplicationServers().getJEEApplicationServer( applicationServerName );
if ( server == null )
{
LOGGER.error( "JEE application server {} is not found in environment {}", applicationServerName,
environmentName );
throw new UpdateException(
"JEE application server " + applicationServerName + " is not found in environment " + environmentName );
}
EventUtils.post( environment, "INFO",
"JEE application server " + applicationServerName + " status requested by WS" );
try
{
// get the controller
JEEApplicationServerController controller =
JEEApplicationServerControllerFactory.getController( environment, server );
// get the application server status
return controller.status();
}
catch ( Exception e )
{
LOGGER.error( "JEE application server {} status check failed", applicationServerName, e );
throw new UpdateException( "JEE application server " + applicationServerName + " status check failed", e );
}
}
}