/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.smis.srdf; import com.emc.storageos.db.client.model.StorageSystem; import com.emc.storageos.db.client.model.Volume; import com.emc.storageos.volumecontroller.impl.providerfinders.FindProviderStrategy; import com.emc.storageos.volumecontroller.impl.smis.srdf.collectors.CollectorResultFilter; import com.emc.storageos.volumecontroller.impl.smis.srdf.collectors.CollectorStrategy; import com.emc.storageos.volumecontroller.impl.smis.srdf.executors.ExecutorStrategy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.cim.CIMObjectPath; import java.util.Collection; import java.util.LinkedList; import java.util.List; /** * Created by bibbyi1 on 3/24/2015. */ public class SRDFOperationContext { private static final Logger log = LoggerFactory.getLogger(SRDFOperationContext.class); private FindProviderStrategy providerFinder; private CollectorStrategy collector; private List<CollectorResultFilter> filters = new LinkedList<>(); private ExecutorStrategy executor; private Volume target; public FindProviderStrategy getProviderFinder() { return providerFinder; } public void setProviderFinder(FindProviderStrategy providerFinder) { this.providerFinder = providerFinder; } public CollectorStrategy getCollector() { return collector; } public void setCollector(CollectorStrategy collector) { this.collector = collector; } public ExecutorStrategy getExecutor() { return executor; } public void setExecutor(ExecutorStrategy executor) { this.executor = executor; } public Volume getTarget() { return target; } public void setTarget(Volume target) { this.target = target; } public void appendFilters(CollectorResultFilter... filters) { for (CollectorResultFilter filter : filters) { this.filters.add(filter); } } public void perform() throws Exception { // Find the provider to make SMI-S calls to. StorageSystem provider = providerFinder.find(); if (provider == null) { log.error("Both source and target providers are not reachable"); throw new IllegalStateException("Both source and target providers are not reachable"); } // Collect object paths for a GroupSync or one or more StorageSyncs. Collection<CIMObjectPath> objectPaths = collector.collect(provider, target); for (CollectorResultFilter<CIMObjectPath> filter : filters) { objectPaths = filter.filter(objectPaths, provider); } if (!objectPaths.isEmpty()) { // Execution entails building the arguments and calling the appropriate SMI-S method. executor.execute(objectPaths, provider); } else { log.info("Skipped execution because no object paths were found"); } } }