Use repository id as id for import log

This commit is contained in:
René Pfeuffer
2021-02-24 14:32:56 +01:00
parent d42560aba3
commit 75ed038084
6 changed files with 29 additions and 30 deletions

View File

@@ -39,12 +39,10 @@ import sonia.scm.event.Event;
@EqualsAndHashCode(callSuper = true)
public class RepositoryImportEvent extends RepositoryEvent {
private final String logId;
private final boolean failed;
public RepositoryImportEvent(HandlerEventType eventType, Repository repository, String logId, boolean failed) {
public RepositoryImportEvent(HandlerEventType eventType, Repository repository, boolean failed) {
super(eventType, repository);
this.logId = logId;
this.failed = failed;
}
}

View File

@@ -86,21 +86,21 @@ public class FromBundleImporter {
RepositoryImportLogger logger = loggerFactory.createLogger();
try {
logger.start(DUMP, repository);
repository = manager.create(repository, unbundleImport(inputStream, compressed, logger));
logger.finished();
} catch (Exception e) {
logger.failed(e);
eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, logger.getLogId(), true));
eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, true));
throw e;
}
eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, logger.getLogId(), false));
eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, false));
return repository;
}
private Consumer<Repository> unbundleImport(InputStream inputStream, boolean compressed, RepositoryImportLogger logger) {
return repository -> {
logger.start(DUMP, repository);
File workdir = workdirProvider.createNewWorkdir(repository.getId());
try (RepositoryService service = serviceFactory.create(repository)) {
logger.step("writing temporary dump file");

View File

@@ -81,25 +81,24 @@ public class FromUrlImporter {
repository.setPermissions(singletonList(new RepositoryPermission(SecurityUtils.getSubject().getPrincipal().toString(), "OWNER", false)));
RepositoryImportLogger logger = loggerFactory.createLogger();
logger.start(RepositoryImportLog.ImportType.URL, repository);
Repository createdRepository;
try {
logger.step("creating repository");
createdRepository = manager.create(
repository,
pullChangesFromRemoteUrl(parameters, logger)
);
} catch (Exception e) {
logger.failed(e);
eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, logger.getLogId(), true));
eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, true));
throw new ImportFailedException(noContext(), "Could not import repository from url " + parameters.getImportUrl(), e);
}
eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, createdRepository, logger.getLogId(), false));
eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, createdRepository, false));
return createdRepository;
}
private Consumer<Repository> pullChangesFromRemoteUrl(RepositoryImportParameters parameters, RepositoryImportLogger logger) {
return repository -> {
logger.start(RepositoryImportLog.ImportType.URL, repository);
try (RepositoryService service = serviceFactory.create(repository)) {
PullCommandBuilder pullCommand = service.getPullCommand();
if (!Strings.isNullOrEmpty(parameters.getUsername()) && !Strings.isNullOrEmpty(parameters.getPassword())) {
@@ -124,6 +123,5 @@ public class FromUrlImporter {
private String importUrl;
private String username;
private String password;
}
}

View File

@@ -77,7 +77,6 @@ public class FullScmRepositoryImporter {
public Repository importFromStream(Repository repository, InputStream inputStream, String password) {
RepositoryPermissions.create().check();
RepositoryImportLogger logger = startLogger(repository);
try {
if (inputStream.available() > 0) {
try (
@@ -86,7 +85,7 @@ public class FullScmRepositoryImporter {
GzipCompressorInputStream gcis = new GzipCompressorInputStream(cif);
TarArchiveInputStream tais = createTarInputStream(gcis)
) {
return run(repository, tais, logger);
return run(repository, tais);
}
} else {
throw new ImportFailedException(
@@ -117,8 +116,10 @@ public class FullScmRepositoryImporter {
return logger;
}
private Repository run(Repository repository, TarArchiveInputStream tais, RepositoryImportLogger logger) throws IOException {
ImportState state = new ImportState(repositoryManager.create(repository), logger);
private Repository run(Repository repository, TarArchiveInputStream tais) throws IOException {
Repository createdRepository = repositoryManager.create(repository);
RepositoryImportLogger logger = startLogger(repository);
ImportState state = new ImportState(createdRepository, logger);
logger.repositoryCreated(state.getRepository());
try {
TarArchiveEntry tarArchiveEntry;
@@ -127,10 +128,10 @@ public class FullScmRepositoryImporter {
handle(tais, state, tarArchiveEntry);
}
stream(importSteps).forEach(step -> step.finish(state));
logger.finished();
state.getLogger().finished();
return state.getRepository();
} catch (RuntimeException | IOException e) {
logger.failed(e);
state.getLogger().failed(e);
throw e;
} finally {
stream(importSteps).forEach(step -> step.cleanup(state));
@@ -140,7 +141,7 @@ public class FullScmRepositoryImporter {
} else {
// Delete the repository if any error occurs during the import
repositoryManager.delete(state.getRepository());
eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, logger.getLogId(), true));
eventBus.post(new RepositoryImportEvent(HandlerEventType.CREATE, repository, true));
}
}

View File

@@ -34,7 +34,7 @@ class RepositoryImportLogger {
private final DataStore<RepositoryImportLog> logStore;
private RepositoryImportLog log;
private String logId;
private String repositoryId;
RepositoryImportLogger(DataStore<RepositoryImportLog> logStore) {
this.logStore = logStore;
@@ -42,6 +42,7 @@ class RepositoryImportLogger {
void start(ImportType importType, Repository repository) {
User user = SecurityUtils.getSubject().getPrincipals().oneByType(User.class);
repositoryId = repository.getId();
log = new RepositoryImportLog();
log.setType(importType);
log.setUserId(user.getId());
@@ -50,14 +51,10 @@ class RepositoryImportLogger {
log.setNamespace(repository.getNamespace());
log.setName(repository.getName());
log.setRepositoryType(repository.getType());
logId = logStore.put(log);
logStore.put(repositoryId, log);
addLogEntry(new RepositoryImportLog.Entry("import started"));
}
public String getLogId() {
return logId;
}
public void finished() {
log.setSuccess(true);
step("import finished successfully");
@@ -83,7 +80,7 @@ class RepositoryImportLogger {
}
private void writeLog() {
logStore.put(logId, log);
logStore.put(repositoryId, log);
}
private void addLogEntry(RepositoryImportLog.Entry entry) {

View File

@@ -28,7 +28,6 @@ import com.google.common.io.Resources;
import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.ThreadContext;
import org.assertj.core.api.InstanceOfAssertFactories;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
@@ -62,6 +61,7 @@ import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collection;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
import static org.assertj.core.api.Assertions.assertThat;
@@ -239,15 +239,20 @@ class FullScmRepositoryImporterTest {
@Test
void shouldSendImportedEventForImportedRepository() throws IOException {
InputStream stream = Resources.getResource("sonia/scm/repository/import/scm-import.tar.gz").openStream();
when(unbundleCommandBuilder.setPostEventSink(any())).thenAnswer(
invocation -> {
invocation.getArgument(0, Consumer.class).accept(new RepositoryHookEvent(null, REPOSITORY, null));
return null;
}
);
fullImporter.importFromStream(REPOSITORY, stream, null);
verify(eventBus).post(argThat(
event -> {
assertThat(event).isInstanceOf(RepositoryImportEvent.class);
RepositoryImportEvent repositoryImportEvent = (RepositoryImportEvent) event;
assertThat(repositoryImportEvent.getItem()).isEqualTo(REPOSITORY);
assertThat(repositoryImportEvent.isFailed()).isFalse();
assertThat(event).isInstanceOf(ImportRepositoryHookEvent.class);
ImportRepositoryHookEvent repositoryImportEvent = (ImportRepositoryHookEvent) event;
assertThat(repositoryImportEvent.getRepository()).isEqualTo(REPOSITORY);
return true;
}
));