/*
* Copyright 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl;
import java.net.URI;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.Controller;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.DiscoveredDataObject.Type;
import com.emc.storageos.db.client.model.DiscoveredSystemObject;
import com.emc.storageos.db.client.model.ObjectUserSecretKey;
import com.emc.storageos.db.client.model.StorageSystem;
import com.emc.storageos.exceptions.ClientControllerException;
import com.emc.storageos.impl.AbstractDiscoveredSystemController;
import com.emc.storageos.model.object.BucketACLUpdateParams;
import com.emc.storageos.svcs.errorhandling.resources.InternalException;
import com.emc.storageos.volumecontroller.AsyncTask;
import com.emc.storageos.volumecontroller.ControllerException;
import com.emc.storageos.volumecontroller.ObjectController;
import com.emc.storageos.volumecontroller.impl.ControllerServiceImpl.Lock;
import com.emc.storageos.volumecontroller.impl.monitoring.MonitoringJob;
import com.emc.storageos.volumecontroller.impl.plugins.discovery.smis.MonitorTaskCompleter;
/**
* This class services all object provisioning calls. Provisioning
* calls are matched against device specific controller implementations
* and forwarded from this implementation
*/
public class ObjectControllerImpl extends AbstractDiscoveredSystemController
implements ObjectController {
private final static Logger _log = LoggerFactory.getLogger(FileControllerImpl.class);
// device specific ObjectController implementations
private Set<ObjectController> _deviceImpl;
private Dispatcher _dispatcher;
private DbClient _dbClient;
public void setDeviceImpl(Set<ObjectController> deviceImpl) {
_deviceImpl = deviceImpl;
}
public void setDispatcher(Dispatcher dispatcher) {
_dispatcher = dispatcher;
}
public void setDbClient(DbClient dbClient) {
_dbClient = dbClient;
}
@Override
public void connectStorage(URI storage) throws InternalException {
_log.debug("ObjectControllerImpl:connectStorage");
execOb("connectStorage", storage);
}
@Override
public void disconnectStorage(URI storage) throws InternalException {
execOb("disconnectStorage", storage);
}
@Override
public void discoverStorageSystem(AsyncTask[] tasks)
throws InternalException {
_log.debug("ObjectControllerImpl:discoverStorageSystem");
try {
ControllerServiceImpl.scheduleDiscoverJobs(tasks, Lock.DISCOVER_COLLECTION_LOCK, ControllerServiceImpl.DISCOVERY);
} catch (Exception e) {
_log.error(
"Problem in discoverStorageSystem due to {} ",
e.getMessage());
throw ClientControllerException.fatals.unableToScheduleDiscoverJobs(tasks, e);
}
}
@Override
public void scanStorageProviders(AsyncTask[] tasks)
throws InternalException {
_log.debug("ObjectControllerImpl:scanStorageProviders");
throw ClientControllerException.fatals.unableToScanSMISProviders(tasks, "ObjectController", null);
}
@Override
public void startMonitoring(AsyncTask task, Type deviceType)
throws InternalException {
try {
_log.debug("ObjectControllerImpl:startMonitoring");
MonitoringJob job = new MonitoringJob();
job.setCompleter(new MonitorTaskCompleter(task));
job.setDeviceType(deviceType);
ControllerServiceImpl.enqueueMonitoringJob(job);
} catch (Exception e) {
throw ClientControllerException.fatals.unableToMonitorSMISProvider(task, deviceType.toString(), e);
}
}
@Override
public Controller lookupDeviceController(DiscoveredSystemObject device) throws ControllerException {
// dummy impl that returns the first one
_log.debug("ObjectControllerImpl:lookupDeviceController");
if (device == null) {
throw ClientControllerException.fatals.unableToLookupStorageDeviceIsNull();
}
ObjectController ob = _deviceImpl.iterator().next();
if (ob == null) {
throw ClientControllerException.fatals.unableToLocateDeviceController("BlockController");
}
return ob;
}
private void execOb(String methodName, Object... args) throws InternalException {
queueTask(_dbClient, StorageSystem.class, _dispatcher, methodName, args);
}
@Override
public void createBucket(URI storage, URI stPool, URI bkt, String label, String namespace, Integer retention,
Long hardQuota, Long softQuota, String owner, String opId) throws InternalException {
_log.debug("ObjectControllerImpl:createBucket start");
execOb("createBucket", storage, stPool, bkt, label, namespace, retention,
hardQuota, softQuota, owner, opId);
}
@Override
public void deleteBucket(URI storage, URI bucket, String deleteType, String task) throws InternalException {
_log.debug("ObjectControllerImpl:deleteBucket");
execOb("deleteBucket", storage, bucket, deleteType, task);
}
@Override
public void updateBucket(URI storage, URI bucket, Long softQuota, Long hardQuota, Integer retention, String task)
throws InternalException {
_log.debug("ObjectControllerImpl:updateBucket");
execOb("updateBucket", storage, bucket, softQuota, hardQuota, retention, task);
}
@Override
public void updateBucketACL(URI storage, URI bucket, BucketACLUpdateParams param, String opId) throws InternalException {
_log.debug("ObjectControllerImpl:updateBucketACL start");
execOb("updateBucketACL", storage, bucket, param, opId);
}
@Override
public void deleteBucketACL(URI storage, URI bucket, String opId) throws InternalException {
_log.debug("ObjectControllerImpl:deleteBucketACL start");
execOb("deleteBucketACL", storage, bucket, opId);
}
@Override
public void syncBucketACL(URI storage, URI bucketId, String opId) throws InternalException {
execOb("syncBucketACL", storage, bucketId, opId);
}
@Override
public ObjectUserSecretKey addUserSecretKey(URI storage, String userId, String secretKey) throws InternalException {
_log.debug("ObjectControllerImpl:addUserSecretKey start");
// Synchronous call than queuing
StorageSystem storageSystem = _dbClient.queryObject(StorageSystem.class, storage);
Controller controller = lookupDeviceController(storageSystem);
ObjectController objController = (ObjectController) controller;
return objController.addUserSecretKey(storage, userId, secretKey);
}
}