/* * Copyright (c) 2012 EMC Corporation * All Rights Reserved */ package com.emc.storageos.api.service.utils; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; import java.util.UUID; import java.util.concurrent.ExecutorService; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.api.service.impl.resource.utils.MarshallingExcetion; import com.emc.storageos.db.client.DbAggregatorItf; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.TimeSeriesMetadata; import com.emc.storageos.db.client.TimeSeriesMetadata.TimeBucket; import com.emc.storageos.db.client.TimeSeriesQueryResult; import com.emc.storageos.db.client.URIUtil; import com.emc.storageos.db.client.constraint.Constraint; import com.emc.storageos.db.client.constraint.QueryResultList; import com.emc.storageos.db.client.model.AuditLog; import com.emc.storageos.db.client.model.DataObject; import com.emc.storageos.db.client.model.Event; import com.emc.storageos.db.client.model.NamedURI; import com.emc.storageos.db.client.model.Operation; import com.emc.storageos.db.client.model.Stat; import com.emc.storageos.db.client.model.TimeSeries; import com.emc.storageos.db.client.model.TimeSeriesSerializer.DataPoint; import com.emc.storageos.db.exceptions.DatabaseException; import com.emc.storageos.model.ResourceOperationTypeEnum; import com.emc.storageos.svcs.errorhandling.model.ServiceCoded; import com.netflix.astyanax.clock.MicrosecondsClock; import com.netflix.astyanax.util.TimeUUIDUtils; /** * Implemation of StatRetriever to retrieve stats locally instead of getting * from Cassandra database. * * @author rvobugar * */ public class DummyDBClient implements DbClient { HashMap<URI, DataObject> _idToObjectMap; final private Logger _logger = LoggerFactory.getLogger(DummyDBClient.class); @Override public DataObject queryObject(URI id) throws DatabaseException { Class<? extends DataObject> clazz = URIUtil.getModelClass(id); return queryObject(clazz, id); } @Override public <T extends DataObject> T queryObject(Class<T> clazz, URI id) throws DatabaseException { checkStarted(); return (T) _idToObjectMap.get(id); } @Override public <T extends DataObject> T queryObject(Class<T> clazz, NamedURI id) throws DatabaseException { return queryObject(clazz, id.getURI()); } @Override public <T extends DataObject> List<T> queryObject(Class<T> clazz, Collection<URI> id) throws DatabaseException { checkStarted(); List<T> objectList = new ArrayList<T>(); for (URI idEntry : id) { Object entry = _idToObjectMap.get(idEntry); if (null != entry) { objectList.add((T) entry); } } return objectList; } @Override public <T extends DataObject> List<T> queryObject(Class<T> clazz, URI... id) throws DatabaseException { checkStarted(); List<T> objectList = new ArrayList<T>(); for (URI idEntry : id) { Object entry = _idToObjectMap.get(idEntry); if (null != entry) { objectList.add((T) entry); } } return objectList; } @Override public <T extends DataObject> List<T> queryObjectField(Class<T> clazz, String fieldName, Collection<URI> ids) throws DatabaseException { checkStarted(); // TODO Auto-generated method stub return null; } @Override public <T extends DataObject> Iterator<T> queryIterativeObjectField(Class<T> clazz, String fieldName, Collection<URI> ids) throws DatabaseException { checkStarted(); // TODO Auto-generated method stub return null; } @Override public <T extends DataObject> List<T> queryObjectFields(Class<T> clazz, Collection<String> fieldNames, Collection<URI> ids) throws DatabaseException { checkStarted(); // TODO Auto-generated method stub return null; } @Override public <T extends DataObject> Iterator<T> queryIterativeObjectFields(Class<T> clazz, Collection<String> fieldNames, Collection<URI> ids) throws DatabaseException { checkStarted(); // TODO Auto-generated method stub return null; } @Override public <T extends DataObject> void aggregateObjectField(Class<T> clazz, Iterator<URI> ids, DbAggregatorItf aggregator) { // do nothing } @Override public <T extends DataObject> Iterator<T> queryIterativeObjects(Class<T> clazz, Collection<URI> id) throws DatabaseException { // TODO Auto-generated method stub return null; } @Override public <T extends DataObject> List<URI> queryByType(Class<T> clazz, boolean activeOnly) throws DatabaseException { checkStarted(); List<URI> idList = new ArrayList<URI>(); for (Entry<URI, DataObject> entry : _idToObjectMap.entrySet()) { if (clazz.isInstance(entry.getValue()) && (!activeOnly || !entry.getValue().getInactive())) { idList.add(entry.getKey()); } } return idList; } @Override public <T extends DataObject> List<URI> queryByType(Class<T> clazz, boolean activeOnly, URI startID, int count) throws DatabaseException { return null; } @Override public <T extends DataObject> void queryInactiveObjects(Class<T> clazz, final long timeBefore, QueryResultList<URI> result) throws DatabaseException { throw new UnsupportedOperationException(); } public List<URI> queryByConstraint(Constraint constraint) throws DatabaseException { checkStarted(); // TODO Auto-generated method stub return null; } @Override public <T extends DataObject> void createObject(T object) throws DatabaseException { persistObject(object); } @Override public <T extends DataObject> void createObject(Collection<T> object) throws DatabaseException { persistObject(object); } @Override public <T extends DataObject> void createObject(T... object) throws DatabaseException { persistObject(object); } @Override public <T extends DataObject> void persistObject(T object) throws DatabaseException { checkStarted(); _idToObjectMap.put(object.getId(), object); } @Override public <T extends DataObject> void persistObject(Collection<T> object) throws DatabaseException { checkStarted(); for (DataObject entry : object) { persistObject(entry); } } @Override public <T extends DataObject> void persistObject(T... object) throws DatabaseException { checkStarted(); for (DataObject entry : object) { persistObject(entry); } } @Override public <T extends DataObject> void updateAndReindexObject(T object) throws DatabaseException { // TODO Auto-generated method stub } @Override public <T extends DataObject> void updateAndReindexObject(Collection<T> object) throws DatabaseException { // TODO Auto-generated method stub } @Override public <T extends DataObject> void updateAndReindexObject(T... object) throws DatabaseException { // TODO Auto-generated method stub } @Override public <T extends DataObject> void updateObject(T object) { // TODO Auto-generated method stub } @Override public <T extends DataObject> void updateObject(Collection<T> objects) { // TODO Auto-generated method stub } @Override public <T extends DataObject> void updateObject(T... object) { // TODO Auto-generated method stub } @Deprecated public void setStatus(Class<? extends DataObject> clazz, URI id, String opId, String status) throws DatabaseException { checkStarted(); } @Deprecated public void setStatus(Class<? extends DataObject> clazz, URI id, String opId, String status, String message) throws DatabaseException { checkStarted(); } @Override public void markForDeletion(DataObject object) throws DatabaseException { checkStarted(); object.setInactive(true); } @Override public void markForDeletion(Collection<? extends DataObject> object) throws DatabaseException { checkStarted(); for (DataObject o : object) { o.setInactive(true); } } @Override public <T extends DataObject> void markForDeletion(T... object) throws DatabaseException { checkStarted(); for (DataObject o : object) { o.setInactive(true); } } @Override public void removeObject(DataObject... object) throws DatabaseException { checkStarted(); for (DataObject oneObject : object) { _idToObjectMap.remove(oneObject.getId()); } } @Override public <T extends DataPoint> String insertTimeSeries(Class<? extends TimeSeries> tsType, T... data) throws DatabaseException { // TODO Auto-generated method stub return null; } @Override public <T extends DataPoint> String insertTimeSeries(Class<? extends TimeSeries> tsType, DateTime time, T data) throws DatabaseException { // TODO Auto-generated method stub return null; } @Override public <T extends DataPoint> void queryTimeSeries(Class<? extends TimeSeries> tsType, DateTime timeBucket, TimeSeriesQueryResult<T> callback, ExecutorService workerThreads) throws DatabaseException { // TODO Auto-generated method stub } @Override public <T extends DataPoint> void queryTimeSeries(Class<? extends TimeSeries> tsType, DateTime timeBucket, TimeBucket bucket, TimeSeriesQueryResult<T> callback, ExecutorService workerThreads) throws DatabaseException { if (timeBucket != null) { MicrosecondsClock clock = new MicrosecondsClock(); UUID uuid = TimeUUIDUtils.getTimeUUID(clock); // For timeBucket 2012-01-01T00:00 we retirn 10 stats // For timeBucket 2012-01-02T00:00 we return I/O exception // For timeBucket 2012-01-03T00:00 we set value data.error // For timeBucket 2012-01-04T00:00 we return 10 events if (timeBucket.toString().contains("2012-01-01T00:00")) { try { // TODO Auto-generated method stub for (int i = 0; i < 10; i++) { Stat st = new Stat(); st.setProject(new URI("http://project" + i)); st.setTenant(new URI("http://t." + i)); st.setUser(new URI("http://u." + i)); st.setVirtualPool(new URI("http://vpool.gold" + i)); callback.data((T) st, TimeUUIDUtils.getTimeFromUUID(uuid)); } } catch (URISyntaxException e) { _logger.error(e.getMessage(), e); } callback.done(); } else if (timeBucket.toString().contains("2012-01-02T00:00")) { throw DatabaseException.retryables.dummyClientFailed(); } else if (timeBucket.toString().contains("2012-01-03T00:00")) { callback.error(null); } else if (timeBucket.toString().contains("2012-01-04T00:00")) { try { // TODO Auto-generated method stub for (int i = 0; i < 10; i++) { Event evt = new Event(); evt.setProjectId(new URI("http://project" + i)); evt.setEventId(String.valueOf(i)); evt.setTenantId(new URI("http://t." + i)); evt.setUserId(new URI("http://u." + i)); evt.setVirtualPool(new URI("http://vpool.gold" + i)); callback.data((T) evt, TimeUUIDUtils.getTimeFromUUID(uuid)); } } catch (URISyntaxException e) { _logger.error(e.getMessage(), e); } callback.done(); } else if (timeBucket.toString().contains("2012-01-05T00:00")) { try { throw new MarshallingExcetion("marshalling Exception", null); } catch (MarshallingExcetion e) { _logger.error(e.getMessage(), e); } } else if (timeBucket.toString().contains("2012-01-06T00:00")) { callback.error(null); } else if (timeBucket.toString().contains("2012-01-07T00:00")) { try { // TODO Auto-generated method stub for (int i = 0; i < 10; i++) { AuditLog log = new AuditLog(); log.setProductId("productId." + i); log.setTenantId(new URI("http://tenant." + i)); log.setUserId(new URI("http://user." + i)); log.setServiceType("serviceType" + i); log.setAuditType("auditType" + i); log.setDescription("description" + i); callback.data((T) log, TimeUUIDUtils.getTimeFromUUID(uuid)); } } catch (URISyntaxException e) { _logger.error(e.getMessage(), e); } callback.done(); } else if (timeBucket.toString().contains("2012-01-08T00:00")) { try { throw new MarshallingExcetion("marshalling Exception", null); } catch (MarshallingExcetion e) { _logger.error(e.getMessage(), e); } } } } @Override public TimeSeriesMetadata queryTimeSeriesMetadata(Class<? extends TimeSeries> tsType) throws DatabaseException { // TODO Auto-generated method stub return null; } @Override public void start() { _idToObjectMap = new HashMap<URI, DataObject>(); } @Override public void stop() { // TODO Auto-generated method stub } @Override public <T> void queryByConstraint(Constraint constraint, QueryResultList<T> result) throws DatabaseException { checkStarted(); } @Override public <T> void queryByConstraint(Constraint constraint, QueryResultList<T> result, URI startId, int count) throws DatabaseException { } @Override public Operation createTaskOpStatus(Class<? extends DataObject> clazz, URI id, String opId, Operation newOperation) throws DatabaseException { // TODO Auto-generated method stub return null; } @Override public Operation createTaskOpStatus(Class<? extends DataObject> clazz, URI id, String opId, ResourceOperationTypeEnum type) throws DatabaseException { // TODO Auto-generated method stub return null; } @Override public Operation createTaskOpStatus(Class<? extends DataObject> clazz, URI id, String opId, ResourceOperationTypeEnum type, String associatedResources) throws DatabaseException { // TODO Auto-generated method stub return null; } @Override public Operation updateTaskOpStatus(Class<? extends DataObject> clazz, URI id, String opId, Operation updateOperation) throws DatabaseException { // TODO Auto-generated method stub return null; } @Override public Operation ready(Class<? extends DataObject> clazz, URI id, String opId) throws DatabaseException { checkStarted(); return null; } @Override public Operation ready(Class<? extends DataObject> clazz, URI id, String opId, String message) throws DatabaseException { return ready(clazz, id, opId); } @Override public Operation error(Class<? extends DataObject> clazz, URI id, String opId, ServiceCoded serviceCoded) throws DatabaseException { checkStarted(); return null; } @Override public Operation pending(Class<? extends DataObject> clazz, URI id, String opId, String message) throws DatabaseException { checkStarted(); return null; } /* (non-Javadoc) * @see com.emc.storageos.db.client.DbClient#pending(java.lang.Class, java.net.URI, java.lang.String, java.lang.String, boolean) */ @Override public Operation pending(Class<? extends DataObject> clazz, URI id, String opId, String message, boolean resetStartTime) { checkStarted(); return null; } @Override public Integer countObjects(Class<? extends DataObject> type, String columnField, URI uri) throws DatabaseException { return 0; } private void checkStarted() { if (null == _idToObjectMap) { throw DatabaseException.retryables.dummyClientNotStarted(); } } @Override public String getSchemaVersion() { return "1"; } @Override public <T extends DataObject> List<T> queryObject(Class<T> clazz, Collection<URI> ids, boolean activeOnly) throws DatabaseException { // TODO Auto-generated method stub return null; } @Override public <T extends DataObject> Iterator<T> queryIterativeObjects( Class<T> clazz, Collection<URI> ids, boolean activeOnly) throws DatabaseException { // TODO Auto-generated method stub return null; } @Override public Operation suspended_no_error(Class<? extends DataObject> clazz, URI id, String opId, String message) throws DatabaseException { // TODO Auto-generated method stub return null; } @Override public Operation suspended_no_error(Class<? extends DataObject> clazz, URI id, String opId) throws DatabaseException { // TODO Auto-generated method stub return null; } public String getLocalShortVdcId() { return "vdc1"; } @Override public URI getVdcUrn(String shortVdcId) { return null; } @Override public void invalidateVdcUrnCache() { } @Override public boolean checkGeoCompatible(String expectVersion) { return true; } @Override public boolean hasUsefulData() { // TODO Auto-generated method stub return false; } @Override public Operation suspended_error(Class<? extends DataObject> clazz, URI id, String opId, ServiceCoded serviceCoded) throws DatabaseException { // TODO Auto-generated method stub return null; } }