Search in sources :

Example 26 with PathsPromoteRequest

use of org.commonjava.indy.promote.model.PathsPromoteRequest in project indy by Commonjava.

the class EventAuditListener method transformFileGroupingEvent.

private void transformFileGroupingEvent(PromoteCompleteEvent event, FileGroupingEvent fileGroupingEvent) {
    PathsPromoteCompleteEvent pathsPromoteCompleteEvent = (PathsPromoteCompleteEvent) event;
    PathsPromoteResult promoteResult = pathsPromoteCompleteEvent.getPromoteResult();
    String error = promoteResult.getError();
    if (error != null) {
        logger.trace("Error in promoteResult, skip audit.");
        return;
    }
    Set<String> paths = promoteResult.getCompletedPaths();
    if (paths.isEmpty()) {
        logger.trace("No completedPaths, skip audit.");
        return;
    }
    PathsPromoteRequest req = promoteResult.getRequest();
    StoreKey source = req.getSource();
    StoreKey target = req.getTarget();
    // TODO How about generating the key if it does not exist.
    TrackingKey trackingKey = getTrackingKey(source);
    if (trackingKey == null) {
        logger.trace("No tracking key found to: {}", source);
        return;
    }
    Map<String, String> extra = new HashMap<>();
    extra.put(EventConstants.SOURCE, source.toString());
    extra.put(EventConstants.TARGET, target.toString());
    fileGroupingEvent.setExtra(extra);
    fileGroupingEvent.setTimestamp(new Date());
    fileGroupingEvent.setSessionId(trackingKey.getId());
}
Also used : PathsPromoteCompleteEvent(org.commonjava.indy.promote.change.event.PathsPromoteCompleteEvent) HashMap(java.util.HashMap) PathsPromoteResult(org.commonjava.indy.promote.model.PathsPromoteResult) PathsPromoteRequest(org.commonjava.indy.promote.model.PathsPromoteRequest) StoreKey(org.commonjava.indy.model.core.StoreKey) Date(java.util.Date) TrackingKey(org.commonjava.indy.folo.model.TrackingKey)

Example 27 with PathsPromoteRequest

use of org.commonjava.indy.promote.model.PathsPromoteRequest in project indy by Commonjava.

the class IndyPromoteClientModule method promoteByPath.

public PathsPromoteResult promoteByPath(final StoreKey src, final StoreKey target, final boolean purgeSource, final String... paths) throws IndyClientException {
    final PathsPromoteRequest req = new PathsPromoteRequest(src, target, new HashSet<String>(Arrays.asList(paths))).setPurgeSource(purgeSource);
    final PathsPromoteResult result = http.postWithResponse(PATHS_PROMOTE_PATH, req, PathsPromoteResult.class, HttpStatus.SC_OK);
    return result;
}
Also used : PathsPromoteResult(org.commonjava.indy.promote.model.PathsPromoteResult) PathsPromoteRequest(org.commonjava.indy.promote.model.PathsPromoteRequest) HashSet(java.util.HashSet)

Example 28 with PathsPromoteRequest

use of org.commonjava.indy.promote.model.PathsPromoteRequest in project indy by Commonjava.

the class PromotionManager method doPathsPromotion.

private PathsPromoteResult doPathsPromotion(PathsPromoteRequest request, boolean skipValidation, String baseUrl) throws IndyWorkflowException, PromotionValidationException {
    final Set<String> paths = request.getPaths();
    final StoreKey source = request.getSource();
    logger.info("Do paths promotion, promotionId: {}, source: {}, target: {}, size: {}", request.getPromotionId(), source, request.getTarget(), paths != null ? paths.size() : -1);
    List<Transfer> contents;
    if (paths == null || paths.isEmpty()) {
        // This is used to let galley ignore the NPMPathStorageCalculator handling,
        // which will append package.json to a directory transfer and make listing not applicable.
        ThreadContext context = ThreadContext.getContext(true);
        context.put(RequestContextHelper.IS_RAW_VIEW, Boolean.TRUE);
        contents = downloadManager.listRecursively(source, DownloadManager.ROOT_PATH);
        context.put(RequestContextHelper.IS_RAW_VIEW, Boolean.FALSE);
    } else {
        contents = promotionHelper.getTransfersForPaths(source, paths);
    }
    final Set<String> pending = contents.stream().map(Transfer::getPath).collect(Collectors.toSet());
    if (pending.isEmpty()) {
        return new PathsPromoteResult(request, pending, emptySet(), emptySet(), null);
    }
    AtomicReference<Exception> ex = new AtomicReference<>();
    StoreKeyPaths plk = new StoreKeyPaths(request.getTargetKey(), pending);
    PathsPromoteResult promoteResult;
    if (request.isFailWhenExists()) {
        promoteResult = conflictManager.checkAnd(plk, pathsLockKey -> runValidationAndPathPromotions(skipValidation, request, baseUrl, ex, pending, contents), pathsLockKey -> {
            String msg = String.format("Conflict detected, store: %s, paths: %s", pathsLockKey.getTarget(), pending);
            logger.warn(msg);
            return new PathsPromoteResult(request, pending, emptySet(), emptySet(), msg, null);
        });
    } else {
        promoteResult = runValidationAndPathPromotions(skipValidation, request, baseUrl, ex, pending, contents);
    }
    if (ex.get() != null) {
        throwProperException(ex.get());
    }
    // purge only if all paths were promoted successfully
    if (promoteResult != null && promoteResult.succeeded() && request.isPurgeSource()) {
        promotionHelper.purgeSourceQuietly(request.getSource(), pending);
    }
    return promoteResult;
}
Also used : GroupMembershipLocks(org.commonjava.indy.core.inject.GroupMembershipLocks) ValidationResult(org.commonjava.indy.promote.model.ValidationResult) ChangeSummary(org.commonjava.indy.audit.ChangeSummary) LoggerFactory(org.slf4j.LoggerFactory) PathsPromoteCompleteEvent(org.commonjava.indy.promote.change.event.PathsPromoteCompleteEvent) StringUtils(org.apache.commons.lang3.StringUtils) SpecialPathInfo(org.commonjava.maven.galley.model.SpecialPathInfo) WeftExecutorService(org.commonjava.cdi.util.weft.WeftExecutorService) Batcher.getParalleledBatchSize(org.commonjava.indy.promote.util.Batcher.getParalleledBatchSize) Future(java.util.concurrent.Future) WeftManaged(org.commonjava.cdi.util.weft.WeftManaged) Map(java.util.Map) StoreKey(org.commonjava.indy.model.core.StoreKey) PathsPromoteRequest(org.commonjava.indy.promote.model.PathsPromoteRequest) PromotionCallbackHelper(org.commonjava.indy.promote.callback.PromotionCallbackHelper) Collection(java.util.Collection) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) StoreType(org.commonjava.indy.model.core.StoreType) Set(java.util.Set) ExceptionUtils.getStackTrace(org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace) Collectors(java.util.stream.Collectors) ContentManager(org.commonjava.indy.content.ContentManager) List(java.util.List) EventMetadata(org.commonjava.maven.galley.event.EventMetadata) PromotionHelper.throwProperException(org.commonjava.indy.promote.data.PromotionHelper.throwProperException) GroupPromoteRequest(org.commonjava.indy.promote.model.GroupPromoteRequest) ApplicationScoped(javax.enterprise.context.ApplicationScoped) StoreType.hosted(org.commonjava.indy.model.core.StoreType.hosted) IndyDataException(org.commonjava.indy.data.IndyDataException) PoolUtils.detectOverloadVoid(org.commonjava.indy.core.ctl.PoolUtils.detectOverloadVoid) AFFECTED_GROUPS(org.commonjava.indy.data.StoreDataManager.AFFECTED_GROUPS) TARGET_STORE(org.commonjava.indy.data.StoreDataManager.TARGET_STORE) ValidationRequest(org.commonjava.indy.promote.validate.model.ValidationRequest) Locker(org.commonjava.cdi.util.weft.Locker) Callable(java.util.concurrent.Callable) Batcher.batch(org.commonjava.indy.promote.util.Batcher.batch) AtomicReference(java.util.concurrent.atomic.AtomicReference) UPLOAD(org.commonjava.maven.galley.model.TransferOperation.UPLOAD) ThreadContext(org.commonjava.cdi.util.weft.ThreadContext) Group(org.commonjava.indy.model.core.Group) ArrayList(java.util.ArrayList) Inject(javax.inject.Inject) HashSet(java.util.HashSet) Transfer(org.commonjava.maven.galley.model.Transfer) Measure(org.commonjava.o11yphant.metrics.annotation.Measure) ExecutorConfig(org.commonjava.cdi.util.weft.ExecutorConfig) IndyWorkflowException(org.commonjava.indy.IndyWorkflowException) PromotionValidator(org.commonjava.indy.promote.validate.PromotionValidator) EventUtils.fireEvent(org.commonjava.indy.change.EventUtils.fireEvent) DrainingExecutorCompletionService(org.commonjava.cdi.util.weft.DrainingExecutorCompletionService) DownloadManager(org.commonjava.indy.content.DownloadManager) Event(javax.enterprise.event.Event) PoolUtils.detectOverload(org.commonjava.indy.core.ctl.PoolUtils.detectOverload) PromoteCompleteEvent(org.commonjava.indy.promote.change.event.PromoteCompleteEvent) PromotionHelper.timeInMillSeconds(org.commonjava.indy.promote.data.PromotionHelper.timeInMillSeconds) GroupPromoteResult(org.commonjava.indy.promote.model.GroupPromoteResult) PromotionValidationException(org.commonjava.indy.promote.validate.PromotionValidationException) Logger(org.slf4j.Logger) ArtifactStore(org.commonjava.indy.model.core.ArtifactStore) Collections.emptySet(java.util.Collections.emptySet) PromoteConfig(org.commonjava.indy.promote.conf.PromoteConfig) SpecialPathManager(org.commonjava.maven.galley.spi.io.SpecialPathManager) IOException(java.io.IOException) PathsPromoteResult(org.commonjava.indy.promote.model.PathsPromoteResult) ValuePipe(org.commonjava.indy.util.ValuePipe) NotFoundCache(org.commonjava.maven.galley.spi.nfc.NotFoundCache) ExecutionException(java.util.concurrent.ExecutionException) IGNORE_READONLY(org.commonjava.indy.data.StoreDataManager.IGNORE_READONLY) HostedRepository(org.commonjava.indy.model.core.HostedRepository) PromotionHelper.timeInSeconds(org.commonjava.indy.promote.data.PromotionHelper.timeInSeconds) RequestContextHelper(org.commonjava.indy.util.RequestContextHelper) StoreDataManager(org.commonjava.indy.data.StoreDataManager) InputStream(java.io.InputStream) PathsPromoteResult(org.commonjava.indy.promote.model.PathsPromoteResult) Transfer(org.commonjava.maven.galley.model.Transfer) ThreadContext(org.commonjava.cdi.util.weft.ThreadContext) AtomicReference(java.util.concurrent.atomic.AtomicReference) StoreKey(org.commonjava.indy.model.core.StoreKey) PromotionHelper.throwProperException(org.commonjava.indy.promote.data.PromotionHelper.throwProperException) IndyDataException(org.commonjava.indy.data.IndyDataException) IndyWorkflowException(org.commonjava.indy.IndyWorkflowException) PromotionValidationException(org.commonjava.indy.promote.validate.PromotionValidationException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException)

Example 29 with PathsPromoteRequest

use of org.commonjava.indy.promote.model.PathsPromoteRequest in project indy by Commonjava.

the class PromotionManagerTest method promoteAllByPath_RaceToPromote_FirstLocksTargetStore.

@Test
@Ignore("volatile, owing to galley fs locks")
public void promoteAllByPath_RaceToPromote_FirstLocksTargetStore() throws Exception {
    Random rand = new Random();
    final HostedRepository[] sources = { new HostedRepository(MAVEN_PKG_KEY, "source1"), new HostedRepository(MAVEN_PKG_KEY, "source2") };
    final String[] paths = { "/path/path1", "/path/path2", "/path3", "/path/path/4" };
    Stream.of(sources).forEach((source) -> {
        try {
            storeManager.storeArtifactStore(source, new ChangeSummary(ChangeSummary.SYSTEM_USER, "test setup"), false, true, new EventMetadata());
            Stream.of(paths).forEach((path) -> {
                byte[] buf = new byte[1024 * 1024 * 2];
                rand.nextBytes(buf);
                try {
                    contentManager.store(source, path, new ByteArrayInputStream(buf), TransferOperation.UPLOAD, new EventMetadata());
                } catch (IndyWorkflowException e) {
                    e.printStackTrace();
                    Assert.fail("failed to store generated file to: " + source + path);
                }
            });
        } catch (IndyDataException e) {
            e.printStackTrace();
            Assert.fail("failed to store hosted repository: " + source);
        }
    });
    final HostedRepository target = new HostedRepository(MAVEN_PKG_KEY, "target");
    storeManager.storeArtifactStore(target, new ChangeSummary(ChangeSummary.SYSTEM_USER, "test setup"), false, true, new EventMetadata());
    PathsPromoteResult[] results = new PathsPromoteResult[2];
    CountDownLatch cdl = new CountDownLatch(2);
    AtomicInteger counter = new AtomicInteger(0);
    Stream.of(sources).forEach((source) -> {
        int idx = counter.getAndIncrement();
        executor.execute(() -> {
            try {
                results[idx] = manager.promotePaths(new PathsPromoteRequest(source.getKey(), target.getKey(), paths), FAKE_BASE_URL);
            } catch (Exception e) {
                e.printStackTrace();
                Assert.fail("Promotion from source: " + source + " failed.");
            } finally {
                cdl.countDown();
            }
        });
        try {
            Thread.sleep(25);
        } catch (InterruptedException e) {
            Assert.fail("Test interrupted");
        }
    });
    assertThat("Promotions failed to finish.", cdl.await(30, TimeUnit.SECONDS), equalTo(true));
    // first one should succeed.
    PathsPromoteResult result = results[0];
    assertThat(result.getRequest().getSource(), equalTo(sources[0].getKey()));
    assertThat(result.getRequest().getTarget(), equalTo(target.getKey()));
    Set<String> pending = result.getPendingPaths();
    assertThat(pending == null || pending.isEmpty(), equalTo(true));
    Set<String> skipped = result.getSkippedPaths();
    assertThat(skipped == null || skipped.isEmpty(), equalTo(true));
    Set<String> completed = result.getCompletedPaths();
    assertThat(completed, notNullValue());
    assertThat(completed.size(), equalTo(paths.length));
    assertThat(result.getError(), nullValue());
    Stream.of(paths).forEach((path) -> {
        HostedRepository src = sources[0];
        Transfer sourceRef = downloadManager.getStorageReference(src, path);
        Transfer targetRef = downloadManager.getStorageReference(target, path);
        assertThat(targetRef.exists(), equalTo(true));
        try (InputStream sourceIn = sourceRef.openInputStream();
            InputStream targetIn = targetRef.openInputStream()) {
            int s, t;
            while ((s = sourceIn.read()) == targetIn.read()) {
                if (s == -1) {
                    break;
                }
            }
            if (s != -1) {
                Assert.fail(path + " doesn't match between source: " + src + " and target: " + target);
            }
        } catch (IOException e) {
            e.printStackTrace();
            Assert.fail("Failed to compare contents of: " + path + " between source: " + src + " and target: " + target);
        }
    });
    // second one should be completely skipped.
    result = results[1];
    assertThat(result.getRequest().getSource(), equalTo(sources[1].getKey()));
    assertThat(result.getRequest().getTarget(), equalTo(target.getKey()));
    pending = result.getPendingPaths();
    assertThat(pending == null || pending.isEmpty(), equalTo(true));
    skipped = result.getSkippedPaths();
    assertThat(skipped, notNullValue());
    assertThat(skipped.size(), equalTo(paths.length));
    completed = result.getCompletedPaths();
    assertThat(completed == null || completed.isEmpty(), equalTo(true));
    assertThat(result.getError(), nullValue());
}
Also used : PathsPromoteResult(org.commonjava.indy.promote.model.PathsPromoteResult) ByteArrayInputStream(java.io.ByteArrayInputStream) InputStream(java.io.InputStream) PathsPromoteRequest(org.commonjava.indy.promote.model.PathsPromoteRequest) IOException(java.io.IOException) CountDownLatch(java.util.concurrent.CountDownLatch) IndyDataException(org.commonjava.indy.data.IndyDataException) IndyWorkflowException(org.commonjava.indy.IndyWorkflowException) IOException(java.io.IOException) EventMetadata(org.commonjava.maven.galley.event.EventMetadata) IndyDataException(org.commonjava.indy.data.IndyDataException) Random(java.util.Random) ByteArrayInputStream(java.io.ByteArrayInputStream) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) IndyWorkflowException(org.commonjava.indy.IndyWorkflowException) Transfer(org.commonjava.maven.galley.model.Transfer) ChangeSummary(org.commonjava.indy.audit.ChangeSummary) HostedRepository(org.commonjava.indy.model.core.HostedRepository) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 30 with PathsPromoteRequest

use of org.commonjava.indy.promote.model.PathsPromoteRequest in project indy by Commonjava.

the class PromotionManagerTest method promoteAllByPath_PurgeSource_PushTwoArtifactsToHostedRepo_VerifyCopiedToOtherHostedRepo.

@Test
public void promoteAllByPath_PurgeSource_PushTwoArtifactsToHostedRepo_VerifyCopiedToOtherHostedRepo() throws Exception {
    prepareHostedReposAndTwoPaths();
    final PathsPromoteResult result = manager.promotePaths(new PathsPromoteRequest(source.getKey(), target.getKey()).setPurgeSource(true), FAKE_BASE_URL);
    assertThat(result.getRequest().getSource(), equalTo(source.getKey()));
    assertThat(result.getRequest().getTarget(), equalTo(target.getKey()));
    final Set<String> pending = result.getPendingPaths();
    assertThat(pending == null || pending.isEmpty(), equalTo(true));
    final Set<String> completed = result.getCompletedPaths();
    assertThat(completed, notNullValue());
    assertThat(completed.size(), equalTo(2));
    assertThat(result.getError(), nullValue());
    verifyExistence(true, true, false, false);
}
Also used : PathsPromoteResult(org.commonjava.indy.promote.model.PathsPromoteResult) PathsPromoteRequest(org.commonjava.indy.promote.model.PathsPromoteRequest) Test(org.junit.Test)

Aggregations

PathsPromoteRequest (org.commonjava.indy.promote.model.PathsPromoteRequest)47 PathsPromoteResult (org.commonjava.indy.promote.model.PathsPromoteResult)40 Test (org.junit.Test)34 IndyPromoteClientModule (org.commonjava.indy.promote.client.IndyPromoteClientModule)15 Category (org.junit.experimental.categories.Category)10 InputStream (java.io.InputStream)8 StoreKey (org.commonjava.indy.model.core.StoreKey)8 IndyWorkflowException (org.commonjava.indy.IndyWorkflowException)7 ByteArrayInputStream (java.io.ByteArrayInputStream)6 HashSet (java.util.HashSet)6 IndyDataException (org.commonjava.indy.data.IndyDataException)6 AbstractContentManagementTest (org.commonjava.indy.ftest.core.AbstractContentManagementTest)6 EventMetadata (org.commonjava.maven.galley.event.EventMetadata)6 IOException (java.io.IOException)5 HostedRepository (org.commonjava.indy.model.core.HostedRepository)5 PromotionValidationException (org.commonjava.indy.promote.validate.PromotionValidationException)5 Transfer (org.commonjava.maven.galley.model.Transfer)5 ExecutionException (java.util.concurrent.ExecutionException)4 ChangeSummary (org.commonjava.indy.audit.ChangeSummary)4 ArtifactStore (org.commonjava.indy.model.core.ArtifactStore)4