package com.sequenceiq.cloudbreak.cloud.openstack.common;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
import org.openstack4j.api.OSClient;
import org.openstack4j.model.compute.Flavor;
import org.openstack4j.model.image.Image;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.sequenceiq.cloudbreak.cloud.Setup;
import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext;
import com.sequenceiq.cloudbreak.cloud.exception.CloudConnectorException;
import com.sequenceiq.cloudbreak.cloud.model.CloudCredential;
import com.sequenceiq.cloudbreak.cloud.model.CloudStack;
import com.sequenceiq.cloudbreak.cloud.model.FileSystem;
import com.sequenceiq.cloudbreak.cloud.model.Group;
import com.sequenceiq.cloudbreak.cloud.notification.PersistenceNotifier;
import com.sequenceiq.cloudbreak.cloud.openstack.auth.OpenStackClient;
import com.sequenceiq.cloudbreak.common.type.ImageStatus;
import com.sequenceiq.cloudbreak.common.type.ImageStatusResult;
@Component
public class OpenStackSetup implements Setup {
private static final Logger LOGGER = LoggerFactory.getLogger(OpenStackSetup.class);
@Inject
private OpenStackClient openStackClient;
@Override
public void prepareImage(AuthenticatedContext authenticatedContext, CloudStack stack, com.sequenceiq.cloudbreak.cloud.model.Image image) {
String imageName = image.getImageName();
OSClient osClient = openStackClient.createOSClient(authenticatedContext);
verifyImage(osClient, imageName);
}
@Override
public ImageStatusResult checkImageStatus(AuthenticatedContext authenticatedContext, CloudStack stack, com.sequenceiq.cloudbreak.cloud.model.Image image) {
return new ImageStatusResult(ImageStatus.CREATE_FINISHED, ImageStatusResult.COMPLETED);
}
@Override
public void prerequisites(AuthenticatedContext authenticatedContext, CloudStack stack, PersistenceNotifier persistenceNotifier) {
OSClient osClient = openStackClient.createOSClient(authenticatedContext);
verifyFlavors(osClient, stack.getGroups());
LOGGER.debug("setup has been executed");
}
@Override
public void validateFileSystem(CloudCredential credential, FileSystem fileSystem) throws Exception {
}
private void verifyFlavors(OSClient osClient, List<Group> instanceGroups) {
List<? extends Flavor> flavors = osClient.compute().flavors().list();
Set<String> notFoundFlavors = new HashSet<>();
for (Group instanceGroup : instanceGroups) {
String instanceType = instanceGroup.getReferenceInstanceConfiguration().getTemplate().getFlavor();
boolean found = false;
for (Flavor flavor : flavors) {
if (flavor.getName().equalsIgnoreCase(instanceType)) {
found = true;
break;
}
}
if (!found) {
notFoundFlavors.add(instanceType);
}
}
if (!notFoundFlavors.isEmpty()) {
throw new CloudConnectorException(String.format("Not found flavors: %s", notFoundFlavors));
}
}
private void verifyImage(OSClient osClient, String name) {
List<? extends Image> images = osClient.images().listAll();
for (Image image : images) {
LOGGER.debug("Found image: {}", image.getName());
if (name.equalsIgnoreCase(image.getName())) {
return;
}
}
throw new CloudConnectorException(String.format("OpenStack image: %s not found", name));
}
}