package com.emc.storageos.db.client.upgrade.callbacks;
import java.net.URI;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.impl.EncryptionProviderImpl;
import com.emc.storageos.db.client.model.ComputeImage;
import com.emc.storageos.db.client.model.EncryptionProvider;
import com.emc.storageos.db.client.upgrade.BaseCustomMigrationCallback;
import com.emc.storageos.svcs.errorhandling.resources.MigrationCallbackException;
public class ComputeImageMigration extends BaseCustomMigrationCallback {
private static final Logger log = LoggerFactory
.getLogger(ComputeImageMigration.class);
private EncryptionProvider encryptionProvider;
private static final String IMAGEURL_PASSWORD_SPLIT_REGEX = "(.*?:){2}((?<=\\:).*(?=\\@))";
private static final String IMAGEURL_HOST_REGEX = "^*(?<=@)([^/@]++)/.*+$";
@Override
public void process() throws MigrationCallbackException {
log.info("Starting Compute Image Migration");
if (null == encryptionProvider) {
EncryptionProviderImpl encryptionProviderImpl = new EncryptionProviderImpl();
encryptionProviderImpl.setCoordinator(coordinatorClient);
encryptionProviderImpl.start();
encryptionProvider = encryptionProviderImpl;
}
List<URI> computeImageURIList = dbClient.queryByType(
ComputeImage.class, true);
Iterator<ComputeImage> computeImageItr = dbClient
.queryIterativeObjects(ComputeImage.class, computeImageURIList,
true);
while (computeImageItr.hasNext()) {
ComputeImage image = computeImageItr.next();
String imageUrl = image.getImageUrl();
String password = extractPasswordFromImageUrl(imageUrl);
String encryptedPassword = password;
if (StringUtils.isNotBlank(password)) {
encryptedPassword = encryptionProvider
.getEncryptedString(password);
imageUrl = StringUtils.replace(imageUrl, ":" + password + "@",
":" + encryptedPassword + "@");
}
image.setImageUrl(imageUrl);
dbClient.updateObject(image);
log.info("Successfully migrated compute image : {} - {}",
image.getLabel(), image.getId());
}
log.info("Completed Compute Image Migration");
}
/**
* Extract password if present from the given imageUrl string
* @param imageUrl {@link String} image url
* @return {@link String} password
*/
private String extractPasswordFromImageUrl(String imageUrl)
{
Pattern r = Pattern.compile(IMAGEURL_PASSWORD_SPLIT_REGEX);
Matcher m = r.matcher(imageUrl);
String password = null;
if (m.find() && m.groupCount() >= 2
&& StringUtils.isNotBlank(m.group(2))) {
password = m.group(2);
Pattern hostpattern = Pattern.compile(IMAGEURL_HOST_REGEX);
Matcher hostMatcher = hostpattern.matcher(password);
if(hostMatcher.find()) {
String preHostregex = "^(.*?)\\@"+hostMatcher.group(1);
Pattern pwdPattern = Pattern.compile(preHostregex);
Matcher pwdMatcher = pwdPattern.matcher(password);
if(pwdMatcher.find())
{
password = pwdMatcher.group(1);
}
}
}
return password;
}
}