/**
* Copyright (C) 2010-2013 Eugen Feller, INRIA <eugen.feller@inria.fr>
*
* This file is part of Snooze, a scalable, autonomic, and
* energy-aware virtual machine (VM) management framework.
*
* 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, either version 2
* of the License, or (at your option) any later version.
*
* 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, see <http://www.gnu.org/licenses>.
*/
package org.inria.myriads.snoozenode.util;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.inria.myriads.snoozecommon.communication.NodeRole;
import org.inria.myriads.snoozecommon.communication.groupmanager.GroupManagerDescription;
import org.inria.myriads.snoozecommon.communication.groupmanager.ListenSettings;
import org.inria.myriads.snoozecommon.communication.localcontroller.LocalControllerDescription;
import org.inria.myriads.snoozecommon.communication.localcontroller.LocalControllerStatus;
import org.inria.myriads.snoozecommon.communication.virtualcluster.VirtualMachineMetaData;
import org.inria.myriads.snoozecommon.communication.virtualcluster.migration.MigrationRequest;
import org.inria.myriads.snoozecommon.communication.virtualcluster.status.VirtualMachineErrorCode;
import org.inria.myriads.snoozecommon.communication.virtualcluster.status.VirtualMachineStatus;
import org.inria.myriads.snoozecommon.communication.virtualcluster.submission.VirtualMachineLocation;
import org.inria.myriads.snoozecommon.guard.Guard;
import org.inria.myriads.snoozenode.configurator.api.NodeConfiguration;
import org.inria.myriads.snoozenode.configurator.networking.NetworkingSettings;
import org.inria.myriads.snoozenode.heartbeat.message.HeartbeatMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Management utility.
*
* @author Eugen Feller
*/
public final class ManagementUtils
{
/** Define the logger. */
private static final Logger log_ = LoggerFactory.getLogger(ManagementUtils.class);
/**
* Hide the consturctor.
*/
private ManagementUtils()
{
throw new UnsupportedOperationException();
}
/**
* Updates all virtual machine met data.
*
* @param virtualMachines The virtual machines
* @param status The status
* @param errorCode The error code
*/
public static void updateAllVirtualMachineMetaData(List<VirtualMachineMetaData> virtualMachines,
VirtualMachineStatus status,
VirtualMachineErrorCode errorCode)
{
for (VirtualMachineMetaData metaData : virtualMachines)
{
updateVirtualMachineMetaData(metaData, status, errorCode);
}
}
/**
* Updates the virtual machine meta status.
*
* @param virtualMachine The virtual machine meta data
* @param status The virtual machine status
* @param errorCode The virtual machine error code
*/
public static void updateVirtualMachineMetaData(VirtualMachineMetaData virtualMachine,
VirtualMachineStatus status,
VirtualMachineErrorCode errorCode)
{
log_.debug(String.format("Updating virtual machine %s meta data! Setting status and error code to: %s, %s",
virtualMachine.getVirtualMachineLocation().getVirtualMachineId(),
status,
errorCode));
virtualMachine.setStatus(status);
virtualMachine.setErrorCode(errorCode);
}
/**
* Creates a group manager from node role.
*
* @param nodeRole The node role
* @param networkingSettings The node parameters
* @return The group manager information
*/
public static GroupManagerDescription createGroupManagerDescription(NodeRole nodeRole,
NetworkingSettings networkingSettings)
{
Guard.check(networkingSettings);
log_.debug("Generating group manager description");
GroupManagerDescription groupManager = new GroupManagerDescription();
String id = UUID.randomUUID().toString();
groupManager.setId(id);
groupManager.setListenSettings(networkingSettings.getListen());
if (nodeRole.equals(NodeRole.groupmanager))
{
groupManager.setHeartbeatAddress(networkingSettings.getMulticast().getGroupManagerHeartbeatAddress());
} else
{
groupManager.setHeartbeatAddress(networkingSettings.getMulticast().getGroupLeaderHeartbeatAddress());
}
return groupManager;
}
/**
* Creates group manager info from heartbeat message.
*
* @param heartbeatMessage The heartbeat message
* @return The group leader information
*/
public static GroupManagerDescription createGroupLeaderDescriptionFromHeartbeat(HeartbeatMessage heartbeatMessage)
{
Guard.check(heartbeatMessage);
GroupManagerDescription groupManager = new GroupManagerDescription();
groupManager.setId(heartbeatMessage.getId());
groupManager.setListenSettings(heartbeatMessage.getListenSettings());
return groupManager;
}
/**
* Creates a local controller from node configuration.
*
* @param nodeConfiguration The node configuration
* @param totalCapacity The total capacity
* @return The local controller information
*/
public static LocalControllerDescription createLocalController(NodeConfiguration nodeConfiguration,
ArrayList<Double> totalCapacity)
{
Guard.check(nodeConfiguration);
log_.debug("Creating local controller description from node parameters");
LocalControllerDescription localController = new LocalControllerDescription();
String id = UUID.randomUUID().toString();
localController.setId(id);
localController.setStatus(LocalControllerStatus.ACTIVE);
localController.setControlDataAddress(nodeConfiguration.getNetworking().getListen().getControlDataAddress());
localController.setHypervisorSettings(nodeConfiguration.getHypervisor());
localController.setWakeupSettings(nodeConfiguration.getEnergyManagement().getDrivers().getWakeup());
localController.setTotalCapacity(totalCapacity);
return localController;
}
/**
* Creates a local controller from migration request.
*
* @param migrationRequest The migration request request
* @return The local controller information
*/
public static LocalControllerDescription createLocalController(MigrationRequest migrationRequest)
{
Guard.check(migrationRequest);
log_.debug("Creating local controller description from migration request");
LocalControllerDescription localController = new LocalControllerDescription();
localController.setControlDataAddress(migrationRequest.getDestinationVirtualMachineLocation()
.getLocalControllerControlDataAddress());
localController.setHypervisorSettings(migrationRequest.getDestinationHypervisorSettings());
return localController;
}
/**
* Creates a heartbeat message from node params.
*
* @param listenSettings The listen settings
* @param groupManagerId The group manager identifier
* @return The heartbeat messsage
*/
public static HeartbeatMessage createHeartbeatMessage(ListenSettings listenSettings,
String groupManagerId)
{
Guard.check(listenSettings, groupManagerId);
HeartbeatMessage message = new HeartbeatMessage();
message.setId(groupManagerId);
message.setListenSettings(listenSettings);
return message;
}
/**
* Marks the virtual machine as RUNNING.
*
* @param metaData The virtual machine meta data
* @param localController The local controller description
*/
public static void setVirtualMachineRunning(VirtualMachineMetaData metaData,
LocalControllerDescription localController)
{
VirtualMachineLocation location = metaData.getVirtualMachineLocation();
location.setLocalControllerId(localController.getId());
location.setLocalControllerControlDataAddress(localController.getControlDataAddress());
metaData.setStatus(VirtualMachineStatus.RUNNING);
}
}