use of org.craftercms.studio.api.v1.exception.repository.InvalidRemoteRepositoryException in project studio by craftercms.
the class GitContentRepository method createSiteCloneRemote.
@Override
public boolean createSiteCloneRemote(String siteId, String sandboxBranch, String remoteName, String remoteUrl, String remoteBranch, boolean singleBranch, String authenticationType, String remoteUsername, String remotePassword, String remoteToken, String remotePrivateKey, Map<String, String> params, boolean createAsOrphan) throws InvalidRemoteRepositoryException, InvalidRemoteRepositoryCredentialsException, RemoteRepositoryNotFoundException, ServiceLayerException {
boolean toReturn = false;
// clone remote git repository for site content
logger.debug("Creating site " + siteId + " as a clone of remote repository " + remoteName + " (" + remoteUrl + ").");
String gitLockKey = SITE_SANDBOX_REPOSITORY_GIT_LOCK.replaceAll(PATTERN_SITE, siteId);
generalLockService.lock(gitLockKey);
try {
GitRepositoryHelper helper = GitRepositoryHelper.getHelper(studioConfiguration, securityService, userServiceInternal, encryptor, generalLockService, retryingRepositoryOperationFacade);
toReturn = helper.createSiteCloneRemoteGitRepo(siteId, sandboxBranch, remoteName, remoteUrl, remoteBranch, singleBranch, authenticationType, remoteUsername, remotePassword, remoteToken, remotePrivateKey, createAsOrphan);
if (toReturn) {
try {
if (createAsOrphan) {
removeRemote(siteId, remoteName);
} else {
insertRemoteToDb(siteId, remoteName, remoteUrl, authenticationType, remoteUsername, remotePassword, remoteToken, remotePrivateKey);
}
} catch (CryptoException e) {
throw new ServiceLayerException(e);
}
// update site name variable inside config files
logger.debug("Update site name configuration variables for site " + siteId);
toReturn = helper.updateSiteNameConfigVar(siteId);
if (toReturn) {
toReturn = helper.replaceParameters(siteId, params);
}
if (toReturn) {
// commit everything so it is visible
logger.debug("Perform initial commit for site " + siteId);
toReturn = helper.performInitialCommit(siteId, helper.getCommitMessage(REPO_INITIAL_COMMIT_COMMIT_MESSAGE), sandboxBranch);
}
} else {
logger.error("Error while creating site " + siteId + " by cloning remote repository " + remoteName + " (" + remoteUrl + ").");
}
} catch (CryptoException e) {
logger.error("Error while creating site " + siteId + " by cloning remote repository " + remoteName + " (" + remoteUrl + ").", e);
} finally {
generalLockService.unlock(gitLockKey);
}
return toReturn;
}
use of org.craftercms.studio.api.v1.exception.repository.InvalidRemoteRepositoryException in project studio by craftercms.
the class GitContentRepository method createSitePushToRemote.
@Override
public boolean createSitePushToRemote(String siteId, String remoteName, String remoteUrl, String authenticationType, String remoteUsername, String remotePassword, String remoteToken, String remotePrivateKey, boolean createAsOrphan) throws InvalidRemoteRepositoryException, InvalidRemoteRepositoryCredentialsException, RemoteRepositoryNotFoundException, RemoteRepositoryNotBareException, ServiceLayerException {
boolean toRet = true;
String gitLockKey = SITE_SANDBOX_REPOSITORY_GIT_LOCK.replaceAll(PATTERN_SITE, siteId);
generalLockService.lock(gitLockKey);
try {
GitRepositoryHelper helper = GitRepositoryHelper.getHelper(studioConfiguration, securityService, userServiceInternal, encryptor, generalLockService, retryingRepositoryOperationFacade);
try (Repository repo = helper.getRepository(siteId, SANDBOX)) {
try (Git git = new Git(repo)) {
boolean pkauth = false;
final Path tempKey = Files.createTempFile(UUID.randomUUID().toString(), ".tmp");
PushCommand pushCommand = git.push();
switch(authenticationType) {
case NONE:
logger.debug("No authentication");
break;
case BASIC:
logger.debug("Basic authentication");
pushCommand.setCredentialsProvider(new UsernamePasswordCredentialsProvider(remoteUsername, remotePassword));
break;
case TOKEN:
logger.debug("Token based authentication");
pushCommand.setCredentialsProvider(new UsernamePasswordCredentialsProvider(remoteToken, EMPTY));
break;
case PRIVATE_KEY:
logger.debug("Private key authentication");
tempKey.toFile().deleteOnExit();
pushCommand.setTransportConfigCallback(new TransportConfigCallback() {
@Override
public void configure(Transport transport) {
SshTransport sshTransport = (SshTransport) transport;
sshTransport.setSshSessionFactory(getSshSessionFactory(remotePrivateKey, tempKey));
}
});
pkauth = true;
break;
default:
throw new ServiceLayerException("Unsupported authentication type " + authenticationType);
}
logger.debug("Push site " + siteId + " to remote repository " + remoteName + "(" + remoteUrl + ")");
pushCommand.setPushAll().setRemote(remoteName);
Iterable<PushResult> result = retryingRepositoryOperationFacade.call(pushCommand);
if (pkauth)
Files.delete(tempKey);
logger.debug("Check push result to verify it was success");
Iterator<PushResult> resultIter = result.iterator();
if (resultIter.hasNext()) {
PushResult pushResult = resultIter.next();
Iterator<RemoteRefUpdate> remoteRefUpdateIterator = pushResult.getRemoteUpdates().iterator();
if (remoteRefUpdateIterator.hasNext()) {
RemoteRefUpdate update = remoteRefUpdateIterator.next();
if (update.getStatus().equals(REJECTED_NONFASTFORWARD)) {
logger.error("Remote repository: " + remoteName + " (" + remoteUrl + ") is not bare repository");
throw new RemoteRepositoryNotBareException("Remote repository: " + remoteName + " (" + remoteUrl + ") is not bare repository");
}
}
}
} catch (InvalidRemoteException e) {
logger.error("Invalid remote repository: " + remoteName + " (" + remoteUrl + ")", e);
throw new InvalidRemoteRepositoryException("Invalid remote repository: " + remoteName + " (" + remoteUrl + ")");
} catch (TransportException e) {
if (StringUtils.endsWithIgnoreCase(e.getMessage(), "not authorized")) {
logger.error("Bad credentials or read only repository: " + remoteName + " (" + remoteUrl + ")", e);
throw new InvalidRemoteRepositoryCredentialsException("Bad credentials or read only repository: " + remoteName + " (" + remoteUrl + ") for username " + remoteUsername, e);
} else {
logger.error("Remote repository not found: " + remoteName + " (" + remoteUrl + ")", e);
throw new RemoteRepositoryNotFoundException("Remote repository not found: " + remoteName + " (" + remoteUrl + ")");
}
} catch (ClassCastException e) {
logger.error("Wrong protocol used to access repository: " + remoteName + " (" + remoteUrl + ")", e);
throw new InvalidRemoteRepositoryCredentialsException("Wrong protocol used to access repository: " + remoteName + " (" + remoteUrl + ")", e);
} catch (ServiceLayerException | IOException e) {
logger.error("Failed to push newly created site " + siteId + " to remote repository " + remoteUrl, e);
throw new ServiceLayerException(e);
}
}
} catch (GitAPIException | CryptoException e) {
logger.error("Failed to push newly created site " + siteId + " to remote repository " + remoteUrl, e);
toRet = false;
} finally {
generalLockService.unlock(gitLockKey);
}
return toRet;
}
use of org.craftercms.studio.api.v1.exception.repository.InvalidRemoteRepositoryException in project studio by craftercms.
the class SiteServiceImpl method createSiteWithRemoteOption.
@Override
@ValidateParams
public void createSiteWithRemoteOption(@ValidateStringParam(name = "siteId", maxLength = 50, whitelistedPatterns = "[a-z0-9\\-]*") String siteId, @ValidateStringParam(name = "sandboxBranch") String sandboxBranch, @ValidateNoTagsParam(name = "description") String description, String blueprintName, @ValidateStringParam(name = "remoteName") String remoteName, @ValidateStringParam(name = "remoteUrl") String remoteUrl, String remoteBranch, boolean singleBranch, String authenticationType, String remoteUsername, String remotePassword, String remoteToken, String remotePrivateKey, @ValidateStringParam(name = "createOption") String createOption, Map<String, String> params, boolean createAsOrphan) throws ServiceLayerException, InvalidRemoteRepositoryException, InvalidRemoteRepositoryCredentialsException, RemoteRepositoryNotFoundException, RemoteRepositoryNotBareException, InvalidRemoteUrlException {
if (exists(siteId)) {
throw new SiteAlreadyExistsException();
}
logger.debug("Validate site entitlements");
try {
entitlementValidator.validateEntitlement(EntitlementType.SITE, 1);
} catch (EntitlementException e) {
throw new SiteCreationException("Unable to complete request due to entitlement limits. Please contact your " + "system administrator.", e);
}
switch(createOption) {
case REMOTE_REPOSITORY_CREATE_OPTION_CLONE:
logger.info("Clone from remote repository create option selected");
createSiteCloneRemote(siteId, sandboxBranch, description, remoteName, remoteUrl, remoteBranch, singleBranch, authenticationType, remoteUsername, remotePassword, remoteToken, remotePrivateKey, params, createAsOrphan);
break;
case REMOTE_REPOSITORY_CREATE_OPTION_PUSH:
logger.info("Push to remote repository create option selected");
createSitePushToRemote(siteId, sandboxBranch, description, blueprintName, remoteName, remoteUrl, remoteBranch, authenticationType, remoteUsername, remotePassword, remoteToken, remotePrivateKey, params, createAsOrphan);
break;
default:
logger.error("Invalid create option for create site using remote repository: " + createOption + "\nAvailable options: [" + REMOTE_REPOSITORY_CREATE_OPTION_CLONE + ", " + REMOTE_REPOSITORY_CREATE_OPTION_PUSH + "]");
break;
}
}
use of org.craftercms.studio.api.v1.exception.repository.InvalidRemoteRepositoryException in project studio by craftercms.
the class SiteServiceImpl method createSiteCloneRemote.
@SuppressWarnings("deprecation")
private void createSiteCloneRemote(String siteId, String sandboxBranch, String description, String remoteName, String remoteUrl, String remoteBranch, boolean singleBranch, String authenticationType, String remoteUsername, String remotePassword, String remoteToken, String remotePrivateKey, Map<String, String> params, boolean createAsOrphan) throws ServiceLayerException, InvalidRemoteRepositoryException, InvalidRemoteRepositoryCredentialsException, RemoteRepositoryNotFoundException, InvalidRemoteUrlException {
boolean success = true;
// We must fail site creation if any of the site creations steps fail and rollback
// For example: Create site => create Deployer Target (fail) = fail
// and rollback the whole thing.
// What we need to do for site creation and the order of execution:
// 1) git repo, 2) deployer target, 3) database, 4) kick deployer
String siteUuid = UUID.randomUUID().toString();
try {
// create site by cloning remote git repo
logger.info("Creating site " + siteId + " by cloning remote repository " + remoteName + " (" + remoteUrl + ")");
success = contentRepositoryV2.createSiteCloneRemote(siteId, sandboxBranch, remoteName, remoteUrl, remoteBranch, singleBranch, authenticationType, remoteUsername, remotePassword, remoteToken, remotePrivateKey, params, createAsOrphan);
} catch (InvalidRemoteRepositoryException | InvalidRemoteRepositoryCredentialsException | RemoteRepositoryNotFoundException | InvalidRemoteUrlException | ServiceLayerException e) {
contentRepository.deleteSite(siteId);
logger.error("Error while creating site: " + siteId + " ID: " + siteId + " as clone from " + "remote repository: " + remoteName + " (" + remoteUrl + "). Rolling back.", e);
throw e;
}
if (!success) {
contentRepository.removeRemoteRepositoriesForSite(siteId);
contentRepository.deleteSite(siteId);
throw new ServiceLayerException("Failed to create site: " + siteId + " ID: " + siteId + " as clone from " + "remote repository: " + remoteName + " (" + remoteUrl + ")");
}
// try to get the search engine from the blueprint descriptor file
String searchEngine = studioConfiguration.getProperty(StudioConfiguration.PREVIEW_SEARCH_ENGINE);
PluginDescriptor descriptor = sitesServiceInternal.getSiteBlueprintDescriptor(siteId);
if (Objects.nonNull(descriptor) && Objects.nonNull(descriptor.getPlugin())) {
searchEngine = descriptor.getPlugin().getSearchEngine();
logger.info("Using search engine {0} from plugin descriptor", searchEngine);
} else if (Objects.nonNull(descriptor) && Objects.nonNull(descriptor.getBlueprint())) {
searchEngine = descriptor.getBlueprint().getSearchEngine();
logger.info("Using search engine {0} from blueprint descriptor", searchEngine);
} else {
logger.info("Missing descriptor, using default search engine {0}", searchEngine);
}
if (success) {
// Create the site in the preview deployer
try {
logger.info("Creating Deployer targets for site " + siteId);
deployer.createTargets(siteId, searchEngine);
} catch (Exception e) {
logger.error("Error while creating site: " + siteId + " ID: " + siteId + " as clone from" + " remote repository: " + remoteName + " (" + remoteUrl + "). Rolling back...", e);
contentRepositoryV2.removeRemote(siteId, remoteName);
boolean deleted = contentRepository.deleteSite(siteId);
if (!deleted) {
logger.error("Error while rolling back site: " + siteId);
}
throw new DeployerTargetException("Error while creating site: " + siteId + " ID: " + siteId + " as clone from remote repository: " + remoteName + " (" + remoteUrl + "). The required Deployer targets couldn't " + "be created", e);
}
}
if (success) {
ZonedDateTime now = ZonedDateTime.now();
String creator = securityService.getCurrentUser();
try {
logger.debug("Adding site UUID.");
addSiteUuidFile(siteId, siteUuid);
// insert database records
logger.info("Adding site record to database for site " + siteId);
SiteFeed siteFeed = new SiteFeed();
siteFeed.setName(siteId);
siteFeed.setSiteId(siteId);
siteFeed.setSiteUuid(siteUuid);
siteFeed.setDescription(description);
siteFeed.setPublishingStatus(READY);
siteFeed.setPublishingStatusMessage(studioConfiguration.getProperty(JOB_DEPLOY_CONTENT_TO_ENVIRONMENT_STATUS_MESSAGE_DEFAULT));
siteFeed.setSandboxBranch(sandboxBranch);
siteFeed.setSearchEngine(searchEngine);
siteFeedMapper.createSite(siteFeed);
upgradeManager.upgradeSite(siteId);
// Add default groups
logger.info("Adding default groups for site " + siteId);
addDefaultGroupsForNewSite(siteId);
String lastCommitId = contentRepositoryV2.getRepoLastCommitId(siteId);
String firstCommitId = contentRepositoryV2.getRepoFirstCommitId(siteId);
long startGetChangeSetCreatedFilesMark = logger.isDebugEnabled() ? System.currentTimeMillis() : 0;
Map<String, String> createdFiles = contentRepositoryV2.getChangeSetPathsFromDelta(siteId, null, lastCommitId);
if (logger.isDebugEnabled()) {
logger.debug("Get change set created files finished in " + (System.currentTimeMillis() - startGetChangeSetCreatedFilesMark) + " milliseconds");
}
insertCreateSiteAuditLog(siteId, siteId, createdFiles);
contentRepositoryV2.insertGitLog(siteId, firstCommitId, 1, 1);
processCreatedFiles(siteId, createdFiles, creator, now, lastCommitId);
updateLastCommitId(siteId, lastCommitId);
updateLastVerifiedGitlogCommitId(siteId, lastCommitId);
updateLastSyncedGitlogCommitId(siteId, firstCommitId);
logger.info("Loading configuration for site " + siteId);
reloadSiteConfiguration(siteId);
} catch (Exception e) {
success = false;
logger.error("Error while creating site: " + siteId + " ID: " + siteId + " as clone from " + "remote repository: " + remoteName + " (" + remoteUrl + "). Rolling back.", e);
deleteSite(siteId);
throw new SiteCreationException("Error while creating site: " + siteId + " ID: " + siteId + " as clone from remote repository: " + remoteName + " (" + remoteUrl + "). Rolling back.");
}
}
if (success) {
// Now that everything is created, we can sync the preview deployer with the new content
logger.info("Sync all site content to preview for " + siteId);
try {
deploymentService.syncAllContentToPreview(siteId, true);
} catch (ServiceLayerException e) {
logger.error("Error while syncing site: " + siteId + " ID: " + siteId + " to preview. Site was " + "successfully created otherwise. Ignoring.", e);
throw new SiteCreationException("Error while syncing site: " + siteId + " ID: " + siteId + " to preview. Site was successfully created, but it won't be preview-able until the " + "Preview Deployer is reachable.");
}
setSiteState(siteId, STATE_CREATED);
} else {
throw new SiteCreationException("Error while creating site: " + siteId + " ID: " + siteId + ".");
}
logger.info("Finished creating site " + siteId);
}
use of org.craftercms.studio.api.v1.exception.repository.InvalidRemoteRepositoryException in project studio by craftercms.
the class SiteServiceImpl method createSitePushToRemote.
private void createSitePushToRemote(String siteId, String sandboxBranch, String description, String blueprintId, String remoteName, String remoteUrl, String remoteBranch, String authenticationType, String remoteUsername, String remotePassword, String remoteToken, String remotePrivateKey, Map<String, String> params, boolean createAsOrphan) throws ServiceLayerException {
if (exists(siteId)) {
throw new SiteAlreadyExistsException();
}
logger.debug("Get blueprint descriptor for " + blueprintId);
PluginDescriptor descriptor = sitesServiceInternal.getBlueprintDescriptor(blueprintId);
if (Objects.isNull(descriptor)) {
throw new BlueprintNotFoundException();
}
logger.debug("Validate blueprint parameters");
sitesServiceInternal.validateBlueprintParameters(descriptor, params);
String blueprintLocation = sitesServiceInternal.getBlueprintLocation(blueprintId);
String searchEngine = descriptor.getPlugin().getSearchEngine();
boolean success = true;
// We must fail site creation if any of the site creations steps fail and rollback
// For example: Create site => create Deployer Target (fail) = fail
// and rollback the whole thing.
// What we need to do for site creation and the order of execution:
// 1) deployer target, 2) git repo, 3) database, 4) kick deployer
String siteUuid = UUID.randomUUID().toString();
logger.info("Starting site creation process for site " + siteId + " from " + blueprintId + " blueprint.");
// Create the site in the preview deployer
try {
logger.info("Creating Deployer targets for site " + siteId);
deployer.createTargets(siteId, searchEngine);
} catch (RestServiceException e) {
String msg = "Error while creating site: " + siteId + " ID: " + siteId + " from blueprint: " + blueprintId + ". The required Deployer targets couldn't be created";
logger.error(msg, e);
throw new DeployerTargetException(msg, e);
}
if (success) {
try {
logger.info("Creating site " + siteId + " from blueprint " + blueprintId);
success = createSiteFromBlueprintGit(blueprintLocation, siteId, siteId, sandboxBranch, description, params);
addSiteUuidFile(siteId, siteUuid);
// insert database records
logger.info("Adding site record to database for site " + siteId);
SiteFeed siteFeed = new SiteFeed();
siteFeed.setName(siteId);
siteFeed.setSiteId(siteId);
siteFeed.setSiteUuid(siteUuid);
siteFeed.setDescription(description);
siteFeed.setPublishingStatus(READY);
siteFeed.setPublishingStatusMessage(studioConfiguration.getProperty(JOB_DEPLOY_CONTENT_TO_ENVIRONMENT_STATUS_MESSAGE_DEFAULT));
siteFeed.setSandboxBranch(sandboxBranch);
siteFeed.setSearchEngine(searchEngine);
siteFeedMapper.createSite(siteFeed);
logger.info("Upgrading site");
upgradeManager.upgradeSite(siteId);
} catch (Exception e) {
success = false;
logger.error("Error while creating site: " + siteId + " ID: " + siteId + " from blueprint: " + blueprintId + ". Rolling back...", e);
contentRepository.deleteSite(siteId);
try {
deployer.deleteTargets(siteId);
} catch (Exception ex) {
logger.error("Error while rolling back/deleting site: " + siteId + " ID: " + siteId + " from blueprint: " + blueprintId + ". This means the site's Deployer " + "targets are still present, but the site was not successfully created", e);
}
throw new SiteCreationException("Error while creating site: " + siteId + " ID: " + siteId + " from blueprint: " + blueprintId, e);
}
if (success) {
ZonedDateTime now = ZonedDateTime.now();
String creator = securityService.getCurrentUser();
try {
logger.info("Pushing site " + siteId + " to remote repository " + remoteName + " (" + remoteUrl + ")");
contentRepository.addRemote(siteId, remoteName, remoteUrl, authenticationType, remoteUsername, remotePassword, remoteToken, remotePrivateKey);
contentRepository.createSitePushToRemote(siteId, remoteName, remoteUrl, authenticationType, remoteUsername, remotePassword, remoteToken, remotePrivateKey, createAsOrphan);
} catch (RemoteRepositoryNotFoundException | InvalidRemoteRepositoryException | InvalidRemoteRepositoryCredentialsException | RemoteRepositoryNotBareException | InvalidRemoteUrlException | ServiceLayerException e) {
logger.error("Error while pushing site: " + siteId + " ID: " + siteId + " to remote repository " + remoteName + " (" + remoteUrl + ")", e);
contentRepositoryV2.removeRemote(siteId, remoteName);
}
try {
// Add default groups
logger.info("Adding default groups for site " + siteId);
addDefaultGroupsForNewSite(siteId);
logger.debug("Adding audit logs.");
String lastCommitId = contentRepositoryV2.getRepoLastCommitId(siteId);
Map<String, String> createdFiles = contentRepositoryV2.getChangeSetPathsFromDelta(siteId, null, lastCommitId);
insertCreateSiteAuditLog(siteId, siteId, createdFiles);
insertAddRemoteAuditLog(siteId, remoteName);
processCreatedFiles(siteId, createdFiles, creator, now, lastCommitId);
contentRepositoryV2.insertGitLog(siteId, lastCommitId, 1, 1);
updateLastCommitId(siteId, lastCommitId);
updateLastVerifiedGitlogCommitId(siteId, lastCommitId);
updateLastSyncedGitlogCommitId(siteId, lastCommitId);
logger.info("Loading configuration for site " + siteId);
reloadSiteConfiguration(siteId);
} catch (Exception e) {
success = false;
logger.error("Error while creating site: " + siteId + " ID: " + siteId + " from blueprint: " + blueprintId + ". Rolling back.", e);
deleteSite(siteId);
throw new SiteCreationException("Error while creating site: " + siteId + " ID: " + siteId + " from blueprint: " + blueprintId + ". Rolling back.");
}
}
}
if (success) {
// Now that everything is created, we can sync the preview deployer with the new content
logger.info("Sync all content to preview for site " + siteId);
try {
deploymentService.syncAllContentToPreview(siteId, true);
} catch (ServiceLayerException e) {
logger.error("Error while syncing site: " + siteId + " ID: " + siteId + " to preview. Site was " + "successfully created otherwise. Ignoring.", e);
throw new SiteCreationException("Error while syncing site: " + siteId + " ID: " + siteId + " to preview. Site was successfully created, but it won't be preview-able until the " + "Preview Deployer is reachable.");
}
setSiteState(siteId, STATE_CREATED);
} else {
throw new SiteCreationException("Error while creating site: " + siteId + " ID: " + siteId + ".");
}
logger.info("Finished creating site " + siteId);
}
Aggregations