/*
* Copyright (c) 2008-2014 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.api.service.impl.resource.utils.vpoolvalidators;
import com.emc.storageos.api.service.impl.resource.utils.VirtualPoolValidator;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.StringSet;
import com.emc.storageos.db.client.model.StringSetMap;
import com.emc.storageos.db.client.model.VirtualPool;
import com.emc.storageos.model.vpool.BlockVirtualPoolParam;
import com.emc.storageos.model.vpool.BlockVirtualPoolUpdateParam;
import com.emc.storageos.svcs.errorhandling.resources.APIException;
import com.emc.storageos.volumecontroller.impl.utils.VirtualPoolCapabilityValuesWrapper;
public class HostIOLimitValidator extends VirtualPoolValidator<BlockVirtualPoolParam, BlockVirtualPoolUpdateParam> {
private Integer MAX_HOST_IO_LIMIT_BANDWIDTH = 100000;
private Integer MAX_HOST_IO_LIMIT_IOPS = 999900;
@Override
public void setNextValidator(VirtualPoolValidator validator) {
_nextValidator = validator;
}
@Override
protected boolean isUpdateAttributeOn(BlockVirtualPoolUpdateParam updateParam) {
return updateParam.isHostIOLimitBandwidthSet() || updateParam.isHostIOLimitIOPsSet();
}
@Override
protected void validateVirtualPoolUpdateAttributeValue(
VirtualPool cos, BlockVirtualPoolUpdateParam updateParam, DbClient dbClient) {
StringSetMap arrayInfo = cos.getArrayInfo();
if (null == arrayInfo
|| null == arrayInfo.get(VirtualPoolCapabilityValuesWrapper.SYSTEM_TYPE)) {
if (null == updateParam.getSystemType()
|| VirtualPool.SystemType.NONE.name()
.equalsIgnoreCase(updateParam.getSystemType())) {
throw APIException.badRequests.missingParameterSystemTypeforHostIOLimits();
}
}
if (null != updateParam.getSystemType()) {
if (!VirtualPool.SystemType.vmax.toString().equalsIgnoreCase(updateParam.getSystemType())) {
throw APIException.badRequests.invalidParameterSystemTypeforHostIOLimits();
}
} else if (null != arrayInfo
&& null != arrayInfo.get(VirtualPoolCapabilityValuesWrapper.SYSTEM_TYPE)) {
StringSet deviceTypes = arrayInfo.get(VirtualPoolCapabilityValuesWrapper.SYSTEM_TYPE);
if (!deviceTypes.contains(VirtualPool.SystemType.vmax.toString())) {
throw APIException.badRequests.invalidParameterSystemTypeforHostIOLimits();
}
}
validHostIOLimits(updateParam.getHostIOLimitBandwidth(), updateParam.getHostIOLimitIOPs());
}
@Override
protected void validateVirtualPoolCreateAttributeValue(BlockVirtualPoolParam createParam, DbClient dbClient) {
if (null == createParam.getSystemType()
|| createParam.getSystemType().equalsIgnoreCase(NONE)) {
throw APIException.badRequests.missingParameterSystemTypeforHostIOLimits();
}
if (!VirtualPool.SystemType.vmax.toString().equalsIgnoreCase(createParam.getSystemType())) {
throw APIException.badRequests.invalidParameterSystemTypeforHostIOLimits();
}
validHostIOLimits(createParam.getHostIOLimitBandwidth(), createParam.getHostIOLimitIOPs());
}
@Override
protected boolean isCreateAttributeOn(BlockVirtualPoolParam createParam) {
return createParam.isHostIOLimitBandwidthSet() || createParam.isHostIOLimitIOPsSet();
}
private void validHostIOLimits(Integer limitBandwidth, Integer limitIops) {
// if specified, iops value must a positive number and it should be multiple of 100
if (limitIops != null && (limitIops < 0 || limitIops % 100 != 0 || limitIops > MAX_HOST_IO_LIMIT_IOPS)) {
throw APIException.badRequests.invalidParameterValueforHostIOLimitIOPs();
}
// if specified, bandwidth value must a positive number and it must <= MAX_HOST_IO_LIMIT_BANDWIDTH
if (limitBandwidth != null && (limitBandwidth < 0 || limitBandwidth > MAX_HOST_IO_LIMIT_BANDWIDTH)) {
throw APIException.badRequests.invalidParameterValueforHostIOLimitBandwidth();
}
}
}