package org.ovirt.engine.core.bll;
import java.util.Arrays;
import java.util.List;
import javax.inject.Inject;
import org.apache.commons.collections.CollectionUtils;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.network.cluster.NetworkClusterValidatorBase;
import org.ovirt.engine.core.bll.profiles.CpuProfileHelper;
import org.ovirt.engine.core.bll.utils.PermissionSubject;
import org.ovirt.engine.core.bll.validator.ClusterValidator;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.CpuProfileParameters;
import org.ovirt.engine.core.common.action.ManagementNetworkOnClusterOperationParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
import org.ovirt.engine.core.common.businessentities.ActionGroup;
import org.ovirt.engine.core.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.SupportedAdditionalClusterFeature;
import org.ovirt.engine.core.common.businessentities.network.NetworkCluster;
import org.ovirt.engine.core.common.businessentities.profiles.CpuProfile;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.common.validation.group.CreateEntity;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.ClusterDao;
import org.ovirt.engine.core.dao.ClusterFeatureDao;
import org.ovirt.engine.core.dao.MacPoolDao;
import org.ovirt.engine.core.dao.network.NetworkClusterDao;
public class AddClusterCommand<T extends ManagementNetworkOnClusterOperationParameters>
extends ClusterOperationCommandBase<T> {
public static final String DefaultNetworkDescription = "Default Management Network";
@Inject
protected MacPoolDao macPoolDao;
@Inject
private ClusterFeatureDao clusterFeatureDao;
@Inject
private ClusterDao clusterDao;
@Inject
private NetworkClusterDao networkClusterDao;
public AddClusterCommand(T parameters, CommandContext commandContext) {
super(parameters, commandContext);
}
@Override
protected void init() {
setStoragePoolId(getCluster().getStoragePoolId());
updateMigrateOnError();
}
@Override
protected void executeCommand() {
Cluster cluster = getCluster();
cluster.setArchitecture(getArchitecture());
setDefaultSwitchTypeIfNeeded();
checkMaxMemoryOverCommitValue();
cluster.setDetectEmulatedMachine(true);
cluster.setMacPoolId(calculateMacPoolIdToUse());
clusterDao.save(cluster);
alertIfFencingDisabled();
// add default network
if (getParameters().getCluster().getStoragePoolId() != null) {
attachManagementNetwork();
}
// create default CPU profile for supported clusters.
addDefaultCpuProfile();
if (CollectionUtils.isNotEmpty(cluster.getAddtionalFeaturesSupported())) {
for (SupportedAdditionalClusterFeature feature : cluster.getAddtionalFeaturesSupported()) {
feature.setClusterId(cluster.getId());
}
clusterFeatureDao.addAllSupportedClusterFeature(cluster.getAddtionalFeaturesSupported());
}
setActionReturnValue(cluster.getId());
setSucceeded(true);
}
private void addDefaultCpuProfile() {
CpuProfile cpuProfile = CpuProfileHelper.createCpuProfile(getParameters().getCluster().getId(),
getParameters().getCluster().getName());
CpuProfileParameters cpuProfileAddParameters = new CpuProfileParameters(cpuProfile);
cpuProfileAddParameters.setAddPermissions(true);
cpuProfileAddParameters.setParametersCurrentUser(getCurrentUser());
cpuProfileAddParameters.setSessionId(getContext().getEngineContext().getSessionId());
VdcReturnValueBase addCpuProfileReturnValue = getBackend().runAction(VdcActionType.AddCpuProfile,
cpuProfileAddParameters);
cpuProfile.setId(addCpuProfileReturnValue.getActionReturnValue());
}
private Guid calculateMacPoolIdToUse() {
Cluster cluster = getCluster();
Guid requestedMacPoolId = cluster == null ? null : cluster.getMacPoolId();
return requestedMacPoolId == null ? macPoolDao.getDefaultPool().getId() : requestedMacPoolId;
}
private void attachManagementNetwork() {
final NetworkCluster networkCluster = createManagementNetworkCluster();
networkCluster.setClusterId(getClusterId());
networkClusterDao.save(networkCluster);
}
@Override
public AuditLogType getAuditLogTypeValue() {
return getSucceeded() ? AuditLogType.USER_ADD_CLUSTER
: AuditLogType.USER_ADD_CLUSTER_FAILED;
}
@Override
protected void setActionMessageParameters() {
super.setActionMessageParameters();
addValidationMessage(EngineMessage.VAR__ACTION__CREATE);
}
@Override
protected boolean validate() {
final ClusterValidator validator = new ClusterValidator(
getDbFacade(), getCluster(), getCpuFlagsManagerHandler());
return validate(validator.nameNotUsed())
&& validate(validator.cpuTypeSupportsVirtService())
&& validate(validator.versionSupported())
&& validate(validator.dataCenterVersionMismatch())
&& validate(validator.dataCenterExists())
&& validate(validator.localStoragePoolAttachedToSingleCluster())
&& validate(validator.clusterServiceDefined())
&& validate(validator.mixedClusterServicesSupported())
&& validate(validator.attestationServerConfigured())
&& validate(validator.migrationSupported(getArchitecture()))
&& validate(validator.rngSourcesAllowed())
&& validateClusterPolicy(null)
&& validateManagementNetwork()
&& validate(validator.memoryOptimizationConfiguration());
}
@Override
protected boolean validateInputManagementNetwork(NetworkClusterValidatorBase networkClusterValidator) {
return validate(networkClusterValidator.networkBelongsToClusterDataCenter(getCluster(), getManagementNetwork()))
&& validate(networkClusterValidator.managementNetworkRequired(getManagementNetwork()))
&& validate(networkClusterValidator.managementNetworkNotExternal(getManagementNetwork()));
}
@Override
public List<PermissionSubject> getPermissionCheckSubjects() {
return Arrays.asList(
new PermissionSubject(getCluster().getStoragePoolId(),
VdcObjectType.StoragePool,
getActionType().getActionGroup()),
new PermissionSubject(calculateMacPoolIdToUse(), VdcObjectType.MacPool, ActionGroup.CONFIGURE_MAC_POOL)
);
}
@Override
protected List<Class<?>> getValidationGroups() {
addValidationGroup(CreateEntity.class);
return super.getValidationGroups();
}
}