package com.sequenceiq.cloudbreak.cloud.event;
import java.util.concurrent.TimeUnit;
import com.sequenceiq.cloudbreak.cloud.context.CloudContext;
import com.sequenceiq.cloudbreak.cloud.model.CloudCredential;
import reactor.rx.Promise;
import reactor.rx.Promises;
public class CloudPlatformRequest<T> implements Selectable {
private CloudContext cloudContext;
private CloudCredential cloudCredential;
private Promise<T> result;
public CloudPlatformRequest(CloudContext cloudContext, CloudCredential cloudCredential) {
this.cloudContext = cloudContext;
this.cloudCredential = cloudCredential;
this.result = Promises.prepare();
}
public static String selector(Class clazz) {
return clazz.getSimpleName().toUpperCase();
}
@Override
public String selector() {
return selector(getClass());
}
@Override
public Long getStackId() {
return cloudContext.getId();
}
public CloudContext getCloudContext() {
return cloudContext;
}
public CloudCredential getCloudCredential() {
return cloudCredential;
}
public Promise<T> getResult() {
return result;
}
public T await() throws InterruptedException {
return await(1, TimeUnit.HOURS);
}
public T await(long timeout, TimeUnit unit) throws InterruptedException {
T result = this.result.await(timeout, unit);
if (result == null) {
throw new InterruptedException("Operation timed out, couldn't retrieve result");
}
return result;
}
@Override
public String toString() {
return "CloudPlatformRequest{"
+ "cloudContext=" + cloudContext
+ ", cloudCredential=" + cloudCredential
+ '}';
}
}