package org.ovirt.engine.core.vdsbroker.vdsbroker;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.inject.Inject;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
import org.ovirt.engine.core.common.errors.EngineError;
import org.ovirt.engine.core.common.vdscommands.StorageServerConnectionManagementVDSParameters;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase;
import org.ovirt.engine.core.di.Injector;
import org.ovirt.engine.core.vdsbroker.storage.StorageConnectionHelper;
public class ConnectStorageServerVDSCommand<P extends StorageServerConnectionManagementVDSParameters>
extends VdsBrokerCommand<P> {
protected ServerConnectionStatusReturn _result;
@Inject
private AuditLogDirector auditLogDirector;
@Inject
private StorageConnectionHelper storageConnectionHelper;
public ConnectStorageServerVDSCommand(P parameters) {
super(parameters);
}
@Override
protected void executeVdsBrokerCommand() {
_result = getBroker().connectStorageServer(getParameters().getStorageType().getValue(),
getParameters().getStoragePoolId().toString(), buildStructFromConnectionListObject());
proceedProxyReturnValue();
Map<String, String> returnValue = _result.convertToStatusList();
setReturnValue(returnValue);
logFailedStorageConnections(returnValue);
}
@Override
protected void proceedProxyReturnValue() {
EngineError returnStatus = getReturnValueFromStatus(getReturnStatus());
switch (returnStatus) {
case StorageServerConnectionRefIdAlreadyInUse:
case StorageServerConnectionRefIdDoesNotExist:
VDSExceptionBase outEx = new VDSErrorException(String.format("Failed in vdscommand %1$s, error = %2$s",
getCommandName(), getReturnStatus().message));
initializeVdsError(returnStatus);
getVDSReturnValue().setSucceeded(false);
throw outEx;
default:
super.proceedProxyReturnValue();
break;
}
}
@SuppressWarnings("unchecked")
protected Map<String, String>[] buildStructFromConnectionListObject() {
final Map<String, String>[] result = new HashMap[getParameters().getConnectionList().size()];
int i = 0;
for (StorageServerConnections connection : getParameters().getConnectionList()) {
result[i] = storageConnectionHelper.createStructFromConnection(connection, getParameters().getVdsId());
i++;
}
return result;
}
private void logFailedStorageConnections(Map<String, String> returnValue) {
StringBuilder failedDomainNames = new StringBuilder();
String namesSeparator = ",";
for (Entry<String, String> result : returnValue.entrySet()) {
if (!"0".equals(result.getValue())) {
List<StorageDomain> domains =
DbFacade.getInstance().getStorageDomainDao().getAllByConnectionId(new Guid(result.getKey()));
if (!domains.isEmpty()) {
for (StorageDomain domain : domains) {
if (failedDomainNames.length() > 0) {
failedDomainNames.append(namesSeparator);
}
failedDomainNames.append(domain.getStorageName());
}
}
}
}
if (failedDomainNames.length() > 0) {
AuditLogableBase logable = Injector.injectMembers(new AuditLogableBase(getParameters().getVdsId()));
logable.addCustomValue("failedStorageDomains", failedDomainNames.toString());
auditLogDirector.log(logable, AuditLogType.VDS_STORAGES_CONNECTION_FAILED);
}
}
@Override
protected Status getReturnStatus() {
return _result.getStatus();
}
@Override
protected Object getReturnValueFromBroker() {
return _result;
}
}