diff --git a/modules/dcache-bulk/src/main/java/org/dcache/services/bulk/activity/BulkActivity.java b/modules/dcache-bulk/src/main/java/org/dcache/services/bulk/activity/BulkActivity.java index 06e8c2f18aa..226b511ec57 100644 --- a/modules/dcache-bulk/src/main/java/org/dcache/services/bulk/activity/BulkActivity.java +++ b/modules/dcache-bulk/src/main/java/org/dcache/services/bulk/activity/BulkActivity.java @@ -214,7 +214,7 @@ public abstract ListenableFuture perform(String rid, long tid, FsPath path, F * * @param arguments parameters of the specific activity. */ - protected abstract void configure(Map arguments); + protected abstract void configure(Map arguments) throws BulkServiceException; /** * Internal implementation of completion handler taking full target. diff --git a/modules/dcache-bulk/src/main/java/org/dcache/services/bulk/activity/plugin/qos/UpdateQoSActivity.java b/modules/dcache-bulk/src/main/java/org/dcache/services/bulk/activity/plugin/qos/UpdateQoSActivity.java index 19983591ca5..9050c4944cb 100644 --- a/modules/dcache-bulk/src/main/java/org/dcache/services/bulk/activity/plugin/qos/UpdateQoSActivity.java +++ b/modules/dcache-bulk/src/main/java/org/dcache/services/bulk/activity/plugin/qos/UpdateQoSActivity.java @@ -60,8 +60,11 @@ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING package org.dcache.services.bulk.activity.plugin.qos; import static com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly; +import static org.dcache.services.bulk.activity.plugin.qos.UpdateQoSActivityProvider.QOS_POLICY; +import static org.dcache.services.bulk.activity.plugin.qos.UpdateQoSActivityProvider.QOS_STATE; import static org.dcache.services.bulk.activity.plugin.qos.UpdateQoSActivityProvider.TARGET_QOS; +import com.google.common.base.Strings; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import diskCacheV111.util.CacheException; @@ -100,6 +103,8 @@ public class UpdateQoSActivity extends BulkActivity perform(String rid, long tid, FsPath path, FileAttributes attributes) throws BulkServiceException { - if (targetQos == null) { - return Futures.immediateFailedFuture(new IllegalArgumentException("no target qos given.")); + if (targetQos == null && qosPolicy == null) { + return Futures.immediateFailedFuture(new IllegalArgumentException("no target qos or policy given.")); } if (attributes == null) { @@ -137,12 +142,17 @@ public ListenableFuture perform(String rid, long PnfsId pnfsId = attributes.getPnfsId(); FileQoSRequirements requirements = new FileQoSRequirements(pnfsId, attributes); - if (targetQos.contains("disk")) { - requirements.setRequiredDisk(1); - } + if (qosPolicy != null) { + requirements.setRequiredQoSPolicy(qosPolicy); + requirements.setRequiredQoSStateIndex(qosState == null ? 0 : qosState); + } else { + if (targetQos.contains("disk")) { + requirements.setRequiredDisk(1); + } - if (targetQos.contains("tape")) { - requirements.setRequiredTape(1); + if (targetQos.contains("tape")) { + requirements.setRequiredTape(1); + } } QoSTransitionFuture future = responseReceiver.register(pnfsId.toString()); @@ -161,11 +171,28 @@ public ListenableFuture perform(String rid, long } @Override - protected void configure(Map arguments) { + protected void configure(Map arguments) throws BulkServiceException { if (arguments == null) { return; } targetQos = arguments.get(TARGET_QOS); + qosPolicy = arguments.get(QOS_POLICY.getName()); + + if (qosPolicy == null) { + qosState = Integer.parseInt(QOS_STATE.getDefaultValue()); + } else { + String state = arguments.get(QOS_STATE.getName()); + if ( Strings.emptyToNull(state) == null) { + qosState = Integer.parseInt(QOS_STATE.getDefaultValue()); + } else { + qosState = Integer.parseInt(state); + } + } + + if (targetQos == null && qosPolicy == null) { + throw new BulkServiceException("either targetQos or qosPolicy must be " + + "provided as argument."); + } } @Override diff --git a/modules/dcache-bulk/src/main/java/org/dcache/services/bulk/activity/plugin/qos/UpdateQoSActivityProvider.java b/modules/dcache-bulk/src/main/java/org/dcache/services/bulk/activity/plugin/qos/UpdateQoSActivityProvider.java index 7819358b9d2..279ed174f73 100644 --- a/modules/dcache-bulk/src/main/java/org/dcache/services/bulk/activity/plugin/qos/UpdateQoSActivityProvider.java +++ b/modules/dcache-bulk/src/main/java/org/dcache/services/bulk/activity/plugin/qos/UpdateQoSActivityProvider.java @@ -60,6 +60,7 @@ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING package org.dcache.services.bulk.activity.plugin.qos; import static org.dcache.services.bulk.activity.BulkActivity.TargetType.FILE; +import static org.dcache.services.bulk.activity.BulkActivityArgumentDescriptor.EMPTY_DEFAULT; import com.google.common.collect.ImmutableSet; import java.util.Map; @@ -77,8 +78,22 @@ public final class UpdateQoSActivityProvider extends BulkActivityProvider getActivityClass() { return UpdateQoSActivity.class; } + @Override public Set getDescriptors() { - return ImmutableSet.of(DEFAULT_DESCRIPTOR); + return ImmutableSet.of(DEFAULT_DESCRIPTOR, QOS_STATE, QOS_POLICY); } @Override