package jetbrains.buildServer.clouds.base.stubs;
import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import jetbrains.buildServer.clouds.InstanceStatus;
import jetbrains.buildServer.clouds.base.connector.AbstractInstance;
import jetbrains.buildServer.clouds.base.connector.CloudApiConnector;
import jetbrains.buildServer.clouds.base.errors.CheckedCloudException;
import jetbrains.buildServer.clouds.base.errors.TypedCloudErrorInfo;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Created by Sergey.Pak on 3/4/2016.
*/
public class DummyApiConnector implements CloudApiConnector<DummyCloudImage, DummyCloudInstance> {
private final Map<String, DummyRealInstance> myRealInstanceMap;
private final Map<String, CountDownLatch> myLatchMap;
public DummyApiConnector(final Map<String, DummyRealInstance> realInstanceMap){
myRealInstanceMap = realInstanceMap;
myLatchMap = new HashMap<>();
}
@Override
public void test() throws CheckedCloudException {
checkLatch("test");
}
/**
* A special key of the cloud connector. Used to determine whether this cloud connector can be used in several cloud profiles.
* <br/>
* <p>
* It is supposed to represent the same username and server url/region/instance
*
* @return see above.
*/
@NotNull
@Override
public String getKey() {
return "dummy_connector";
}
@NotNull
@Override
public Map<String, InstanceStatus> getInstanceStatusesIfExists(@NotNull final Set<String> instanceNames) {
checkLatch("getInstanceStatusesIfExists");
//final DummyRealInstance instance = myRealInstanceMap.get(instanceName);
//return instance == null ? null : instance.getInstanceStatus();
return Collections.emptyMap();
}
@NotNull
@Override
public <R extends AbstractInstance> Map<DummyCloudImage, Map<String, R>> fetchInstances(@NotNull final Collection<DummyCloudImage> images) throws CheckedCloudException {
Map<DummyCloudImage, Map<String, R>> result = new HashMap<>();
for (DummyCloudImage image: images) {
if (fetchInstances(image).size() > 0)
result.put(image, fetchInstances(image));
}
return result;
}
@NotNull
@Override
public <R extends AbstractInstance> Map<String, R> fetchInstances(@NotNull final DummyCloudImage image) throws CheckedCloudException {
checkLatch("listImageInstances");
return myRealInstanceMap.entrySet().stream()
.filter(e->e.getValue().getDummyImageName().equals(image.getId()))
.collect(Collectors.toMap(e->e.getKey(), e->(R)e.getValue()));
}
@NotNull
@Override
public TypedCloudErrorInfo[] checkImage(@NotNull final DummyCloudImage image) {
checkLatch("checkImage");
return new TypedCloudErrorInfo[0];
}
@NotNull
@Override
public TypedCloudErrorInfo[] checkInstance(@NotNull final DummyCloudInstance instance) {
checkLatch("checkInstance");
return new TypedCloudErrorInfo[0];
}
private void checkLatch(String methodName){
final CountDownLatch methodLatch = myLatchMap.get(methodName);
if (methodLatch != null){
try {
//avoid waiting for too long in tests
final boolean result = methodLatch.await(2, TimeUnit.SECONDS);
if (!result){
throw new RuntimeException("Timeout (2 sec) on waiting for latch '" + methodName+"'");
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
public Map<String, CountDownLatch> getLatchMap() {
return myLatchMap;
}
}