package com.sequenceiq.cloudbreak.cloud.openstack.auth;
import static com.sequenceiq.cloudbreak.cloud.model.CloudCredential.SMART_SENSE_ID;
import java.util.Map;
import javax.inject.Inject;
import org.apache.commons.lang3.StringUtils;
import org.openstack4j.api.OSClient;
import org.openstack4j.model.compute.Keypair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.sequenceiq.cloudbreak.cloud.CredentialConnector;
import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext;
import com.sequenceiq.cloudbreak.cloud.context.CloudContext;
import com.sequenceiq.cloudbreak.cloud.credential.CredentialNotifier;
import com.sequenceiq.cloudbreak.cloud.model.CloudCredential;
import com.sequenceiq.cloudbreak.cloud.model.CloudCredentialStatus;
import com.sequenceiq.cloudbreak.cloud.model.CredentialStatus;
import com.sequenceiq.cloudbreak.cloud.model.ExtendedCloudCredential;
import com.sequenceiq.cloudbreak.cloud.openstack.OpenStackSmartSenseIdGenerator;
import com.sequenceiq.cloudbreak.cloud.openstack.view.KeystoneCredentialView;
@Service
public class OpenStackCredentialConnector implements CredentialConnector {
private static final Logger LOGGER = LoggerFactory.getLogger(OpenStackCredentialConnector.class);
@Inject
private OpenStackClient openStackClient;
@Inject
private OpenStackSmartSenseIdGenerator smartSenseIdGenerator;
@Override
public CloudCredentialStatus verify(AuthenticatedContext authenticatedContext) {
CloudCredential credential = authenticatedContext.getCloudCredential();
String smartSenseId = smartSenseIdGenerator.getSmartSenseId();
if (StringUtils.isNoneEmpty(smartSenseId)) {
credential.putParameter(SMART_SENSE_ID, smartSenseId);
}
return new CloudCredentialStatus(credential, CredentialStatus.VERIFIED);
}
@Override
public CloudCredentialStatus create(AuthenticatedContext auth) {
LOGGER.info("Create credential: {}", auth.getCloudCredential());
OSClient client = openStackClient.createOSClient(auth);
KeystoneCredentialView keystoneCredential = openStackClient.createKeystoneCredential(auth);
String keyPairName = keystoneCredential.getKeyPairName();
if (client.compute().keypairs().get(keyPairName) == null) {
try {
Keypair keyPair = client.compute().keypairs().create(keyPairName, keystoneCredential.getPublicKey());
LOGGER.info("Credential has been created: {}, kp: {}", auth.getCloudCredential(), keyPair);
} catch (Exception e) {
LOGGER.error("Failed to create credential", e);
return new CloudCredentialStatus(auth.getCloudCredential(), CredentialStatus.FAILED, e, e.getMessage());
}
} else {
LOGGER.info("Credential already exists: {}", keyPairName);
}
return new CloudCredentialStatus(auth.getCloudCredential(), CredentialStatus.CREATED);
}
@Override
public Map<String, String> interactiveLogin(CloudContext cloudContext, ExtendedCloudCredential extendedCloudCredential,
CredentialNotifier credentialNotifier) {
throw new UnsupportedOperationException("Interactive login not supported on Openstack");
}
@Override
public CloudCredentialStatus delete(AuthenticatedContext auth) {
LOGGER.info("Delete credential: {}", auth.getCloudCredential());
OSClient client = openStackClient.createOSClient(auth);
KeystoneCredentialView keystoneCredential = openStackClient.createKeystoneCredential(auth);
String keyPairName = keystoneCredential.getKeyPairName();
client.compute().keypairs().delete(keyPairName);
LOGGER.info("Credential has been deleted: {}", auth.getCloudCredential());
return new CloudCredentialStatus(auth.getCloudCredential(), CredentialStatus.DELETED);
}
}