package com.sequenceiq.cloudbreak.cloud.mock;
import static com.sequenceiq.cloudbreak.cloud.model.ResourceStatus.CREATED;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;
import com.sequenceiq.cloudbreak.api.model.AdjustmentType;
import com.sequenceiq.cloudbreak.cloud.ResourceConnector;
import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext;
import com.sequenceiq.cloudbreak.cloud.exception.TemplatingDoesNotSupportedException;
import com.sequenceiq.cloudbreak.cloud.model.CloudInstance;
import com.sequenceiq.cloudbreak.cloud.model.CloudResource;
import com.sequenceiq.cloudbreak.cloud.model.CloudResourceStatus;
import com.sequenceiq.cloudbreak.cloud.model.CloudStack;
import com.sequenceiq.cloudbreak.cloud.model.Group;
import com.sequenceiq.cloudbreak.cloud.model.TlsInfo;
import com.sequenceiq.cloudbreak.cloud.notification.PersistenceNotifier;
import com.sequenceiq.cloudbreak.common.type.CommonStatus;
import com.sequenceiq.cloudbreak.common.type.ResourceType;
@Service
public class MockResourceConnector implements ResourceConnector<Object> {
@Value("${mock.spi.endpoint:https://localhost:9443}")
private String mockServerAddress;
@Override
public List<CloudResourceStatus> launch(AuthenticatedContext authenticatedContext, CloudStack stack, PersistenceNotifier persistenceNotifier,
AdjustmentType adjustmentType, Long threshold) throws Exception {
List<CloudResourceStatus> cloudResourceStatuses = new ArrayList<>();
for (Group group : stack.getGroups()) {
for (int i = 0; i < group.getInstancesSize(); i++) {
CloudResource cloudResource = new CloudResource.Builder()
.type(ResourceType.MOCK_INSTANCE)
.status(CommonStatus.CREATED)
.name("cloudinstance" + cloudResourceStatuses.size())
.reference("")
.persistent(true)
.build();
cloudResourceStatuses.add(new CloudResourceStatus(cloudResource, CREATED));
}
}
return cloudResourceStatuses;
}
@Override
public List<CloudResourceStatus> check(AuthenticatedContext authenticatedContext, List<CloudResource> resources) {
return new ArrayList<>();
}
@Override
public List<CloudResourceStatus> terminate(AuthenticatedContext authenticatedContext, CloudStack stack, List<CloudResource> cloudResources)
throws Exception {
return new ArrayList<>();
}
@Override
public List<CloudResourceStatus> update(AuthenticatedContext authenticatedContext, CloudStack stack, List<CloudResource> resources) throws Exception {
return new ArrayList<>();
}
@Override
public List<CloudResourceStatus> upscale(AuthenticatedContext authenticatedContext, CloudStack stack, List<CloudResource> resources) throws Exception {
List<CloudResourceStatus> cloudResourceStatuses = new ArrayList<>();
for (CloudResource cloudResource : resources) {
CloudResourceStatus cloudResourceStatus = new CloudResourceStatus(cloudResource, CREATED);
cloudResourceStatuses.add(cloudResourceStatus);
}
int createResourceCount = 0;
for (int i = 0; i < stack.getGroups().size(); i++) {
createResourceCount += stack.getGroups().get(i).getInstancesSize();
}
createResourceCount -= resources.size();
if (createResourceCount > 0) {
for (int i = 0; i < createResourceCount; i++) {
CloudResource cloudResource = new CloudResource.Builder()
.type(ResourceType.MOCK_INSTANCE)
.status(CommonStatus.CREATED)
.name("cloudinstance" + cloudResourceStatuses.size())
.reference("")
.persistent(true)
.build();
cloudResourceStatuses.add(new CloudResourceStatus(cloudResource, CREATED));
}
}
return cloudResourceStatuses;
}
@Override
public Object collectResourcesToRemove(AuthenticatedContext authenticatedContext, CloudStack stack,
List<CloudResource> resources, List<CloudInstance> vms) {
return null;
}
@Override
public List<CloudResourceStatus> downscale(AuthenticatedContext authenticatedContext, CloudStack stack, List<CloudResource> resources,
List<CloudInstance> vms, Object resourcesToRemove) {
try {
Unirest.post(mockServerAddress + "/spi/terminate_instances").body(vms).asString();
} catch (UnirestException e) {
throw new RuntimeException("rest error", e);
}
return new ArrayList<>();
}
@Override
public TlsInfo getTlsInfo(AuthenticatedContext authenticatedContext, CloudStack cloudStack) {
return new TlsInfo(false);
}
@Override
public String getStackTemplate() throws TemplatingDoesNotSupportedException {
throw new TemplatingDoesNotSupportedException();
}
}