From 6ed7c49ebb099a2ae90c7282e97ac9021b718881 Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 18 Oct 2018 13:10:30 -0800 Subject: [PATCH 01/23] Happy path on MODULE_RELEASE_BY_NAME_AND_VERSION Co-authored-by: Daniel Sauble --- .../repository/puppet/internal/AssetKind.java | 43 ++++ .../internal/PuppetContentValidator.java | 76 +++++++ .../internal/PuppetRecipeSupport.groovy | 66 +++++- .../internal/proxy/PuppetProxyFacetImpl.java | 189 ++++++++++++++++++ .../internal/proxy/PuppetProxyRecipe.groovy | 110 ++++++++++ .../internal/util/PuppetDataAccess.java | 149 ++++++++++++++ .../puppet/internal/util/PuppetPathUtils.java | 57 ++++++ .../view/repository/recipe/PuppetProxy.js | 43 ++++ .../puppet/view/repository/recipe/placeholder | 0 .../internal/PuppetContentValidatorTest.java | 99 +++++++++ .../internal/util/PuppetPathUtilsTest.java | 72 +++++++ 11 files changed, 898 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/sonatype/nexus/repository/puppet/internal/AssetKind.java create mode 100644 src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidator.java create mode 100644 src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java create mode 100644 src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyRecipe.groovy create mode 100644 src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetDataAccess.java create mode 100644 src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtils.java create mode 100644 src/main/resources/static/rapture/NX/puppet/view/repository/recipe/PuppetProxy.js delete mode 100644 src/main/resources/static/rapture/NX/puppet/view/repository/recipe/placeholder create mode 100644 src/test/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidatorTest.java create mode 100644 src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtilsTest.java diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/AssetKind.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/AssetKind.java new file mode 100644 index 0000000..3f90fef --- /dev/null +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/AssetKind.java @@ -0,0 +1,43 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2018-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ +package org.sonatype.nexus.repository.puppet.internal; + +import javax.annotation.Nonnull; + +import org.sonatype.nexus.repository.cache.CacheControllerHolder.CacheType; + +import static org.sonatype.nexus.repository.cache.CacheControllerHolder.*; + +/** + * Asset kinds for Puppet + * + * Examples of all can be found at: https://forgeapi.puppetlabs.com/#interactive-demonstration + * @since 0.0.1 + */ +public enum AssetKind +{ + MODULE_RELEASES_BY_NAME(METADATA), + MODULE_RELEASE_BY_NAME_AND_VERSION(METADATA), + MODULE_DOWNLOAD(CONTENT); + + private final CacheType cacheType; + + AssetKind(final CacheType cacheType) { + this.cacheType = cacheType; + } + + @Nonnull + public CacheType getCacheType() { + return cacheType; + } +} diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidator.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidator.java new file mode 100644 index 0000000..61cf412 --- /dev/null +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidator.java @@ -0,0 +1,76 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2018-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ +package org.sonatype.nexus.repository.puppet.internal; + +import java.io.IOException; +import java.io.InputStream; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.sonatype.goodies.common.ComponentSupport; +import org.sonatype.nexus.mime.MimeRulesSource; +import org.sonatype.nexus.repository.storage.ContentValidator; +import org.sonatype.nexus.repository.storage.DefaultContentValidator; + +import com.google.common.base.Supplier; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * @since 0.0.1 + */ +@Named(PuppetFormat.NAME) +@Singleton +public class PuppetContentValidator + extends ComponentSupport + implements ContentValidator +{ + private final DefaultContentValidator defaultContentValidator; + + @Inject + public PuppetContentValidator(final DefaultContentValidator defaultContentValidator) { + this.defaultContentValidator = checkNotNull(defaultContentValidator); + } + + @Nonnull + @Override + public String determineContentType(boolean strictContentTypeValidation, + Supplier contentSupplier, + @Nullable MimeRulesSource mimeRulesSource, + @Nullable String contentName, + @Nullable String declaredContentType) throws IOException + { + if (contentName != null) { + if (!contentName.endsWith(".tar.gz")) { + // Note: Tika thinks the puppet json responses are text/plain since we aren't getting them as .json files + return defaultContentValidator.determineContentType( + false, + contentSupplier, + mimeRulesSource, + contentName + ".json", + declaredContentType); + } + } + return defaultContentValidator.determineContentType( + strictContentTypeValidation, + contentSupplier, + mimeRulesSource, + contentName, + declaredContentType + ); + } +} diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetRecipeSupport.groovy b/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetRecipeSupport.groovy index 01d5f02..2cb3068 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetRecipeSupport.groovy +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetRecipeSupport.groovy @@ -32,12 +32,21 @@ import org.sonatype.nexus.repository.storage.DefaultComponentMaintenanceImpl import org.sonatype.nexus.repository.storage.StorageFacet import org.sonatype.nexus.repository.storage.UnitOfWorkHandler import org.sonatype.nexus.repository.view.ConfigurableViewFacet +import org.sonatype.nexus.repository.view.Context +import org.sonatype.nexus.repository.view.Matcher import org.sonatype.nexus.repository.view.handlers.BrowseUnsupportedHandler import org.sonatype.nexus.repository.view.handlers.ConditionalRequestHandler import org.sonatype.nexus.repository.view.handlers.ContentHeadersHandler import org.sonatype.nexus.repository.view.handlers.ExceptionHandler import org.sonatype.nexus.repository.view.handlers.HandlerContributor import org.sonatype.nexus.repository.view.handlers.TimingHandler +import org.sonatype.nexus.repository.view.matchers.ActionMatcher +import org.sonatype.nexus.repository.view.matchers.LiteralMatcher +import org.sonatype.nexus.repository.view.matchers.logic.LogicMatchers +import org.sonatype.nexus.repository.view.matchers.token.TokenMatcher + +import static org.sonatype.nexus.repository.http.HttpMethods.GET +import static org.sonatype.nexus.repository.http.HttpMethods.HEAD /** * Support for Puppet recipes. @@ -96,13 +105,58 @@ abstract class PuppetRecipeSupport @Inject Provider purgeUnusedFacet - @Inject - Provider negativeCacheFacet - - @Inject - NegativeCacheHandler negativeCacheHandler - protected PuppetRecipeSupport(final Type type, final Format format) { super(type, format) } + + /** + * Matcher for module releases. + */ + static Matcher moduleReleasesSearchByNameMatcher() { + LogicMatchers.and( + new ActionMatcher(GET, HEAD), + new TokenMatcher('/v3/releases'), + new Matcher() { + @Override + boolean matches(final Context context) { + context.attributes.set(AssetKind.class, AssetKind.MODULE_RELEASES_BY_NAME) + return true + } + } + ) + } + + /** + * Matcher for a module release details. + */ + static Matcher moduleReleaseByNameAndVersionMatcher() { + LogicMatchers.and( + new ActionMatcher(GET, HEAD), + new TokenMatcher('/v3/releases/{user:.+}-{module:.+}-{version:.+}'), + new Matcher() { + @Override + boolean matches(final Context context) { + context.attributes.set(AssetKind.class, AssetKind.MODULE_RELEASE_BY_NAME_AND_VERSION) + return true + } + } + ) + } + + /** + * Matcher for a downloading a module file. + */ + static Matcher moduleDownloadMatcher() { + LogicMatchers.and( + new ActionMatcher(GET, HEAD), + new TokenMatcher('/v3/files/{user:.+}-{module:.+}-{version:.+}.tar.gz'), + new Matcher() { + @Override + boolean matches(final Context context) { + context.attributes.set(AssetKind.class, AssetKind.MODULE_DOWNLOAD) + return true + } + } + ) + } } diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java new file mode 100644 index 0000000..5d994d7 --- /dev/null +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java @@ -0,0 +1,189 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2018-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ +package org.sonatype.nexus.repository.puppet.internal.proxy; + +import java.io.IOException; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.inject.Inject; +import javax.inject.Named; + +import org.sonatype.nexus.repository.cache.CacheInfo; +import org.sonatype.nexus.repository.config.Configuration; +import org.sonatype.nexus.repository.proxy.ProxyFacet; +import org.sonatype.nexus.repository.proxy.ProxyFacetSupport; +import org.sonatype.nexus.repository.puppet.internal.AssetKind; +import org.sonatype.nexus.repository.puppet.internal.util.PuppetDataAccess; +import org.sonatype.nexus.repository.puppet.internal.util.PuppetPathUtils; +import org.sonatype.nexus.repository.storage.Asset; +import org.sonatype.nexus.repository.storage.Bucket; +import org.sonatype.nexus.repository.storage.StorageFacet; +import org.sonatype.nexus.repository.storage.StorageTx; +import org.sonatype.nexus.repository.storage.TempBlob; +import org.sonatype.nexus.repository.transaction.TransactionalStoreBlob; +import org.sonatype.nexus.repository.transaction.TransactionalTouchBlob; +import org.sonatype.nexus.repository.transaction.TransactionalTouchMetadata; +import org.sonatype.nexus.repository.view.Content; +import org.sonatype.nexus.repository.view.ContentTypes; +import org.sonatype.nexus.repository.view.Context; +import org.sonatype.nexus.repository.view.Parameters; +import org.sonatype.nexus.repository.view.matchers.token.TokenMatcher; +import org.sonatype.nexus.transaction.UnitOfWork; + +import com.google.common.base.Joiner; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.sonatype.nexus.repository.storage.AssetEntityAdapter.P_ASSET_KIND; + +/** + * Puppet {@link ProxyFacet} implementation. + * + * @since 0.0.1 + */ +@Named +public class PuppetProxyFacetImpl + extends ProxyFacetSupport +{ + private PuppetPathUtils puppetPathUtils; + + private PuppetDataAccess puppetDataAccess; + + @Inject + public PuppetProxyFacetImpl(final PuppetPathUtils puppetPathUtils, + final PuppetDataAccess puppetDataAccess) { + this.puppetPathUtils = checkNotNull(puppetPathUtils); + this.puppetDataAccess = checkNotNull(puppetDataAccess); + } + + // HACK: Workaround for known CGLIB issue, forces an Import-Package for org.sonatype.nexus.repository.config + @Override + protected void doValidate(final Configuration configuration) throws Exception { + super.doValidate(configuration); + } + + @Nullable + @Override + protected Content getCachedContent(final Context context) throws IOException { + AssetKind assetKind = context.getAttributes().require(AssetKind.class); + TokenMatcher.State matcherState = puppetPathUtils.matcherState(context); + switch (assetKind) { + case MODULE_RELEASES_BY_NAME: + return null; + case MODULE_RELEASE_BY_NAME_AND_VERSION: + return getAsset(puppetPathUtils.buildModuleReleaseByNameAndVersionPath(matcherState)); + case MODULE_DOWNLOAD: + return null; + default: + throw new IllegalStateException("Received an invalid AssetKind of type: " + assetKind.name()); + } + } + + @TransactionalTouchBlob + protected Content getAsset(final String assetPath) { + StorageTx tx = UnitOfWork.currentTx(); + + Asset asset = puppetDataAccess.findAsset(tx, tx.findBucket(getRepository()), assetPath); + if (asset == null) { + return null; + } + if (asset.markAsDownloaded()) { + tx.saveAsset(asset); + } + return puppetDataAccess.toContent(asset, tx.requireBlob(asset.requireBlobRef())); + } + + @Override + protected Content store(final Context context, final Content content) throws IOException { + AssetKind assetKind = context.getAttributes().require(AssetKind.class); + TokenMatcher.State matcherState = puppetPathUtils.matcherState(context); + switch (assetKind) { + case MODULE_RELEASES_BY_NAME: + return null; + case MODULE_RELEASE_BY_NAME_AND_VERSION: + return putMetadata(content, + assetKind, + puppetPathUtils.buildModuleReleaseByNameAndVersionPath(matcherState)); + case MODULE_DOWNLOAD: + return null; + default: + throw new IllegalStateException("Received an invalid AssetKind of type: " + assetKind.name()); + } + } + + private Content putMetadata(final Content content, + final AssetKind assetKind, + final String assetPath) throws IOException + { + StorageFacet storageFacet = facet(StorageFacet.class); + + try (TempBlob tempBlob = storageFacet.createTempBlob(content.openInputStream(), PuppetDataAccess.HASH_ALGORITHMS)) { + return doPutMetadata(tempBlob, content, assetKind, assetPath); + } + } + + @TransactionalStoreBlob + protected Content doPutMetadata(final TempBlob tempBlob, + final Content content, + final AssetKind assetKind, + final String assetPath) throws IOException + { + StorageTx tx = UnitOfWork.currentTx(); + Bucket bucket = tx.findBucket(getRepository()); + + Asset asset = puppetDataAccess.findAsset(tx, bucket, assetPath); + if (asset == null) { + asset = tx.createAsset(bucket, getRepository().getFormat()); + asset.name(assetPath); + asset.contentType(ContentTypes.APPLICATION_JSON); + asset.formatAttributes().set(P_ASSET_KIND, assetKind.name()); + } + + return puppetDataAccess.saveAsset(tx, asset, tempBlob, content); + } + + @Override + protected void indicateVerified(final Context context, final Content content, final CacheInfo cacheInfo) + throws IOException + { + setCacheInfo(content, cacheInfo); + } + + @TransactionalTouchMetadata + public void setCacheInfo(final Content content, final CacheInfo cacheInfo) throws IOException { + StorageTx tx = UnitOfWork.currentTx(); + Asset asset = Content.findAsset(tx, tx.findBucket(getRepository()), content); + if (asset == null) { + log.debug( + "Attempting to set cache info for non-existent Puppet asset {}", content.getAttributes().require(Asset.class) + ); + return; + } + log.debug("Updating cacheInfo of {} to {}", asset, cacheInfo); + CacheInfo.applyToAsset(asset, cacheInfo); + tx.saveAsset(asset); + } + + @Override + protected String getUrl(@Nonnull final Context context) { + String url = context.getRequest().getPath().substring(1); + AssetKind assetKind = context.getAttributes().require(AssetKind.class); + + if (assetKind.equals(AssetKind.MODULE_RELEASES_BY_NAME)) { + Parameters parameters = context.getRequest().getParameters(); + url += "?" + Joiner.on("&").withKeyValueSeparator("=").join(parameters); + } + + return url; + } +} diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyRecipe.groovy b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyRecipe.groovy new file mode 100644 index 0000000..2fa8adf --- /dev/null +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyRecipe.groovy @@ -0,0 +1,110 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2018-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ +package org.sonatype.nexus.repository.puppet.internal.proxy + +import javax.annotation.Nonnull +import javax.inject.Inject +import javax.inject.Named +import javax.inject.Provider +import javax.inject.Singleton + +import org.sonatype.nexus.repository.Format +import org.sonatype.nexus.repository.Repository +import org.sonatype.nexus.repository.Type +import org.sonatype.nexus.repository.cache.NegativeCacheFacet +import org.sonatype.nexus.repository.cache.NegativeCacheHandler +import org.sonatype.nexus.repository.http.HttpHandlers +import org.sonatype.nexus.repository.proxy.ProxyHandler +import org.sonatype.nexus.repository.puppet.internal.PuppetFormat +import org.sonatype.nexus.repository.puppet.internal.PuppetRecipeSupport +import org.sonatype.nexus.repository.types.ProxyType +import org.sonatype.nexus.repository.view.ConfigurableViewFacet +import org.sonatype.nexus.repository.view.Route +import org.sonatype.nexus.repository.view.Router +import org.sonatype.nexus.repository.view.ViewFacet +import org.sonatype.nexus.repository.view.handlers.BrowseUnsupportedHandler + +/** + * @since 0.0.1 + */ +@Named(PuppetProxyRecipe.NAME) +@Singleton +class PuppetProxyRecipe + extends PuppetRecipeSupport +{ + public static final String NAME = 'puppet-proxy' + + @Inject + Provider proxyFacet + + @Inject + ProxyHandler proxyHandler + + @Inject + Provider negativeCacheFacet + + @Inject + NegativeCacheHandler negativeCacheHandler + + @Inject + PuppetProxyRecipe(@Named(ProxyType.NAME) final Type type, + @Named(PuppetFormat.NAME) final Format format) { + super(type, format) + } + + @Override + void apply(@Nonnull final Repository repository) throws Exception { + repository.attach(securityFacet.get()) + repository.attach(configure(viewFacet.get())) + repository.attach(httpClientFacet.get()) + repository.attach(negativeCacheFacet.get()) + repository.attach(componentMaintenanceFacet.get()) + repository.attach(proxyFacet.get()) + repository.attach(storageFacet.get()) + repository.attach(searchFacet.get()) + repository.attach(purgeUnusedFacet.get()) + repository.attach(attributesFacet.get()) + } + + /** + * Configure {@link ViewFacet}. + */ + private ViewFacet configure(final ConfigurableViewFacet facet) { + Router.Builder builder = new Router.Builder() + + [moduleReleaseByNameAndVersionMatcher(), moduleReleasesSearchByNameMatcher(), moduleDownloadMatcher()].each { matcher -> + builder.route(new Route.Builder().matcher(matcher) + .handler(timingHandler) + .handler(securityHandler) + .handler(exceptionHandler) + .handler(handlerContributor) + .handler(negativeCacheHandler) + .handler(partialFetchHandler) + .handler(contentHeadersHandler) + .handler(unitOfWorkHandler) + .handler(proxyHandler) + .create()) + } + + builder.route(new Route.Builder() + .matcher(BrowseUnsupportedHandler.MATCHER) + .handler(browseUnsupportedHandler) + .create()) + + builder.defaultHandlers(HttpHandlers.notFound()) + + facet.configure(builder.create()) + + return facet + } +} diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetDataAccess.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetDataAccess.java new file mode 100644 index 0000000..7085359 --- /dev/null +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetDataAccess.java @@ -0,0 +1,149 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2018-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ +package org.sonatype.nexus.repository.puppet.internal.util; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +import javax.annotation.Nullable; +import javax.inject.Named; + +import org.sonatype.nexus.blobstore.api.Blob; +import org.sonatype.nexus.common.collect.AttributesMap; +import org.sonatype.nexus.common.hash.HashAlgorithm; +import org.sonatype.nexus.repository.Repository; +import org.sonatype.nexus.repository.storage.Asset; +import org.sonatype.nexus.repository.storage.AssetBlob; +import org.sonatype.nexus.repository.storage.Bucket; +import org.sonatype.nexus.repository.storage.Component; +import org.sonatype.nexus.repository.storage.MetadataNodeEntityAdapter; +import org.sonatype.nexus.repository.storage.Query; +import org.sonatype.nexus.repository.storage.StorageTx; +import org.sonatype.nexus.repository.view.Content; +import org.sonatype.nexus.repository.view.Payload; +import org.sonatype.nexus.repository.view.payloads.BlobPayload; +import org.sonatype.nexus.repository.view.payloads.StreamPayload; +import org.sonatype.nexus.repository.view.payloads.StreamPayload.InputStreamSupplier; + +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableList; + +import static java.util.Collections.singletonList; +import static org.sonatype.nexus.repository.storage.ComponentEntityAdapter.P_VERSION; +import static org.sonatype.nexus.repository.storage.MetadataNodeEntityAdapter.P_NAME; + +/** + * @since 0.0.1 + */ +@Named +public class PuppetDataAccess +{ + public static final List HASH_ALGORITHMS = ImmutableList.of(HashAlgorithm.SHA1); + + /** + * Find a component by its name and tag (version) + * + * @return found component or null if not found + */ + @Nullable + public Component findComponent(final StorageTx tx, + final Repository repository, + final String name, + final String version) + { + Iterable components = tx.findComponents( + Query.builder() + .where(P_NAME).eq(name) + .and(P_VERSION).eq(version) + .build(), + singletonList(repository) + ); + if (components.iterator().hasNext()) { + return components.iterator().next(); + } + return null; + } + + /** + * Find an asset by its name. + * + * @return found asset or null if not found + */ + @Nullable + public Asset findAsset(final StorageTx tx, final Bucket bucket, final String assetName) { + return tx.findAssetWithProperty(MetadataNodeEntityAdapter.P_NAME, assetName, bucket); + } + + /** + * Save an asset and create blob. + * + * @return blob content + */ + public Content saveAsset(final StorageTx tx, + final Asset asset, + final Supplier contentSupplier, + final Payload payload) throws IOException + { + AttributesMap contentAttributes = null; + String contentType = null; + if (payload instanceof Content) { + contentAttributes = ((Content) payload).getAttributes(); + contentType = payload.getContentType(); + } + return saveAsset(tx, asset, contentSupplier, contentType, contentAttributes); + } + + /** + * Save an asset and create blob. + * + * @return blob content + */ + public Content saveAsset(final StorageTx tx, + final Asset asset, + final Supplier contentSupplier, + final String contentType, + @Nullable final AttributesMap contentAttributes) throws IOException + { + Content.applyToAsset(asset, Content.maintainLastModified(asset, contentAttributes)); + AssetBlob assetBlob = tx.setBlob( + asset, asset.name(), contentSupplier, HASH_ALGORITHMS, null, contentType, false + ); + asset.markAsDownloaded(); + tx.saveAsset(asset); + return toContent(asset, assetBlob.getBlob()); + } + + /** + * Convert an asset blob to {@link Content}. + * + * @return content of asset blob + */ + public Content toContent(final Asset asset, final Blob blob) { + Content content = new Content(new BlobPayload(blob, asset.requireContentType())); + Content.extractFromAsset(asset, HASH_ALGORITHMS, content.getAttributes()); + return content; + } + + /** + * Convert an InputStreamSupplier to {@link Content}. + * + * @return content of InputStreamSupplier + */ + public Content toContent(final InputStreamSupplier is, final long size, final String contentType) { + Payload payload = new StreamPayload(is, size, contentType); + Content content = new Content(payload); + + return content; + } +} diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtils.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtils.java new file mode 100644 index 0000000..c790777 --- /dev/null +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtils.java @@ -0,0 +1,57 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2018-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ +package org.sonatype.nexus.repository.puppet.internal.util; + +import javax.inject.Named; +import javax.inject.Singleton; + +import org.sonatype.nexus.repository.view.Context; +import org.sonatype.nexus.repository.view.matchers.token.TokenMatcher; +import org.sonatype.nexus.repository.view.matchers.token.TokenMatcher.State; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * @since 0.0.1 + */ +@Named +@Singleton +public class PuppetPathUtils +{ + public TokenMatcher.State matcherState(final Context context) { + return context.getAttributes().require(TokenMatcher.State.class); + } + + public String user(final TokenMatcher.State state) { + return match(state, "user"); + } + + public String module(final TokenMatcher.State state) { + return match(state, "module"); + } + + public String version(final TokenMatcher.State state) { + return match(state, "version"); + } + + private String match(final TokenMatcher.State state, final String name) { + checkNotNull(state); + String result = state.getTokens().get(name); + checkNotNull(result); + return result; + } + + public String buildModuleReleaseByNameAndVersionPath(final State matcherState) { + return String.format("/v3/releases/%s-%s-%s", user(matcherState), module(matcherState), version(matcherState)); + } +} diff --git a/src/main/resources/static/rapture/NX/puppet/view/repository/recipe/PuppetProxy.js b/src/main/resources/static/rapture/NX/puppet/view/repository/recipe/PuppetProxy.js new file mode 100644 index 0000000..964991c --- /dev/null +++ b/src/main/resources/static/rapture/NX/puppet/view/repository/recipe/PuppetProxy.js @@ -0,0 +1,43 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2018-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ +/*global Ext, NX*/ + +/** + * Repository "Settings" form for a Puppet Proxy repository + */ +Ext.define('NX.helm.view.repository.recipe.PuppetProxy', { + extend: 'NX.coreui.view.repository.RepositorySettingsForm', + alias: 'widget.nx-coreui-repository-puppet-proxy', + requires: [ + 'NX.coreui.view.repository.facet.ProxyFacet', + 'NX.coreui.view.repository.facet.StorageFacet', + 'NX.coreui.view.repository.facet.HttpClientFacet', + 'NX.coreui.view.repository.facet.NegativeCacheFacet' + ], + + /** + * @override + */ + initComponent: function () { + var me = this; + + me.items = [ + {xtype: 'nx-coreui-repository-proxy-facet'}, + {xtype: 'nx-coreui-repository-storage-facet'}, + {xtype: 'nx-coreui-repository-negativecache-facet'}, + {xtype: 'nx-coreui-repository-httpclient-facet'} + ]; + + me.callParent(); + } +}); diff --git a/src/main/resources/static/rapture/NX/puppet/view/repository/recipe/placeholder b/src/main/resources/static/rapture/NX/puppet/view/repository/recipe/placeholder deleted file mode 100644 index e69de29..0000000 diff --git a/src/test/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidatorTest.java b/src/test/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidatorTest.java new file mode 100644 index 0000000..de23225 --- /dev/null +++ b/src/test/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidatorTest.java @@ -0,0 +1,99 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2018-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ +package org.sonatype.nexus.repository.puppet.internal; + +import java.io.InputStream; + +import org.sonatype.goodies.testsupport.TestSupport; +import org.sonatype.nexus.mime.MimeRulesSource; +import org.sonatype.nexus.repository.storage.DefaultContentValidator; +import org.sonatype.nexus.repository.view.ContentTypes; + +import com.google.common.base.Supplier; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.when; + +public class PuppetContentValidatorTest + extends TestSupport +{ + private PuppetContentValidator underTest; + + @Mock + DefaultContentValidator defaultContentValidator; + + @Mock + Supplier contentStream; + + @Mock + MimeRulesSource mimeRulesSource; + + private final static String TEST_JSON_CONTENT_NAME = "testjsonwithoutextension"; + + private final static String TEST_TAR_GZ_CONTENT_NAME = "test.tar.gz"; + + @Before + public void setUp() throws Exception { + underTest = new PuppetContentValidator(defaultContentValidator); + } + + @Test + public void testContentValidatorJson() throws Exception { + setUpMock( + TEST_JSON_CONTENT_NAME + ".json", + ContentTypes.APPLICATION_JSON, + false); + String result = underTest.determineContentType( + true, + contentStream, + mimeRulesSource, + TEST_JSON_CONTENT_NAME, + ContentTypes.APPLICATION_JSON); + + assertThat(result, is(equalTo(ContentTypes.APPLICATION_JSON))); + } + + @Test + public void testContentValidatorTarGz() throws Exception { + setUpMock( + TEST_TAR_GZ_CONTENT_NAME, + ContentTypes.APPLICATION_GZIP, + true); + String result = underTest.determineContentType( + true, + contentStream, + mimeRulesSource, + TEST_TAR_GZ_CONTENT_NAME, + ContentTypes.APPLICATION_GZIP); + + assertThat(result, is(equalTo(ContentTypes.APPLICATION_GZIP))); + } + + private void setUpMock(final String contentName, + final String contentType, + final boolean strictContentTypeValidation) throws Exception + { + when(defaultContentValidator.determineContentType( + strictContentTypeValidation, + contentStream, + mimeRulesSource, + contentName, + contentType)) + .thenReturn(contentType); + } +} diff --git a/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtilsTest.java b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtilsTest.java new file mode 100644 index 0000000..d1baadf --- /dev/null +++ b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtilsTest.java @@ -0,0 +1,72 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2018-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ +package org.sonatype.nexus.repository.puppet.internal.util; + +import java.util.HashMap; +import java.util.Map; + +import org.sonatype.goodies.testsupport.TestSupport; +import org.sonatype.nexus.common.collect.AttributesMap; +import org.sonatype.nexus.repository.view.Context; +import org.sonatype.nexus.repository.view.matchers.token.TokenMatcher; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class PuppetPathUtilsTest + extends TestSupport +{ + private PuppetPathUtils underTest; + + @Mock + Context context; + + @Mock + AttributesMap attributesMap; + + @Mock + TokenMatcher.State mockState; + + @Before + public void setUp() throws Exception { + underTest = new PuppetPathUtils(); + } + + @Test + public void testGetMatcherState() throws Exception { + when(context.getAttributes()).thenReturn(attributesMap); + when(attributesMap.require(TokenMatcher.State.class)).thenReturn(mockState); + TokenMatcher.State state = underTest.matcherState(context); + + assertThat(state, is(equalTo(mockState))); + } + + @Test + public void buildModuleReleaseByNameAndVersionPath() throws Exception { + Map tokens = new HashMap<>(); + tokens.put("user", "puppetlabs"); + tokens.put("module", "stdlib"); + tokens.put("version", "5.1.0"); + when(mockState.getTokens()).thenReturn(tokens); + String result = underTest.buildModuleReleaseByNameAndVersionPath(mockState); + + assertThat(result, is(equalTo("/v3/releases/puppetlabs-stdlib-5.1.0"))); + } +} From 9ce41b2a27caa4c3887d5e3365f67e65e7186557 Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 18 Oct 2018 14:18:56 -0800 Subject: [PATCH 02/23] Voila! Working proxy implementation Co-authored-by: Daniel Sauble --- .../internal/metadata/PuppetAttributes.java | 62 ++++++++++++++++ .../internal/proxy/PuppetProxyFacetImpl.java | 66 ++++++++++++++++-- .../internal/util/PuppetAttributeParser.java | 38 ++++++++++ .../puppet/internal/util/PuppetPathUtils.java | 11 +++ .../puppet/internal/util/TgzParser.java | 52 ++++++++++++++ .../internal/util/PuppetPathUtilsTest.java | 36 ++++++++-- .../puppet/internal/util/TgzParserTest.java | 38 ++++++++++ .../util/puppetlabs-stdlib-5.1.0.tar.gz | Bin 0 -> 247769 bytes 8 files changed, 294 insertions(+), 9 deletions(-) create mode 100644 src/main/java/org/sonatype/nexus/repository/puppet/internal/metadata/PuppetAttributes.java create mode 100644 src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java create mode 100644 src/main/java/org/sonatype/nexus/repository/puppet/internal/util/TgzParser.java create mode 100644 src/test/java/org/sonatype/nexus/repository/puppet/internal/util/TgzParserTest.java create mode 100644 src/test/resources/org/sonatype/nexus/repository/puppet/internal/util/puppetlabs-stdlib-5.1.0.tar.gz diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/metadata/PuppetAttributes.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/metadata/PuppetAttributes.java new file mode 100644 index 0000000..5ba1fb9 --- /dev/null +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/metadata/PuppetAttributes.java @@ -0,0 +1,62 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2018-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ +package org.sonatype.nexus.repository.puppet.internal.metadata; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * @since 0.0.1 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public final class PuppetAttributes +{ + private String name; + + private String version; + + private String summary; + + private String description; + + public String getSummary() { + return summary; + } + + public void setSummary(final String summary) { + this.summary = summary; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getVersion() { + return version; + } + + public void setVersion(final String version) { + this.version = version; + } + + public String getDescription() { + return description; + } + + public void setDescription(final String description) { + this.description = description; + } +} diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java index 5d994d7..5cab1e3 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java @@ -24,10 +24,13 @@ import org.sonatype.nexus.repository.proxy.ProxyFacet; import org.sonatype.nexus.repository.proxy.ProxyFacetSupport; import org.sonatype.nexus.repository.puppet.internal.AssetKind; +import org.sonatype.nexus.repository.puppet.internal.metadata.PuppetAttributes; +import org.sonatype.nexus.repository.puppet.internal.util.PuppetAttributeParser; import org.sonatype.nexus.repository.puppet.internal.util.PuppetDataAccess; import org.sonatype.nexus.repository.puppet.internal.util.PuppetPathUtils; import org.sonatype.nexus.repository.storage.Asset; import org.sonatype.nexus.repository.storage.Bucket; +import org.sonatype.nexus.repository.storage.Component; import org.sonatype.nexus.repository.storage.StorageFacet; import org.sonatype.nexus.repository.storage.StorageTx; import org.sonatype.nexus.repository.storage.TempBlob; @@ -59,11 +62,15 @@ public class PuppetProxyFacetImpl private PuppetDataAccess puppetDataAccess; + private PuppetAttributeParser puppetAttributeParser; + @Inject public PuppetProxyFacetImpl(final PuppetPathUtils puppetPathUtils, - final PuppetDataAccess puppetDataAccess) { + final PuppetDataAccess puppetDataAccess, + final PuppetAttributeParser puppetAttributeParser) { this.puppetPathUtils = checkNotNull(puppetPathUtils); this.puppetDataAccess = checkNotNull(puppetDataAccess); + this.puppetAttributeParser = checkNotNull(puppetAttributeParser); } // HACK: Workaround for known CGLIB issue, forces an Import-Package for org.sonatype.nexus.repository.config @@ -79,11 +86,12 @@ protected Content getCachedContent(final Context context) throws IOException { TokenMatcher.State matcherState = puppetPathUtils.matcherState(context); switch (assetKind) { case MODULE_RELEASES_BY_NAME: - return null; + Parameters parameters = context.getRequest().getParameters(); + return getAsset(puppetPathUtils.buildModuleReleaseByNamePath(parameters)); case MODULE_RELEASE_BY_NAME_AND_VERSION: return getAsset(puppetPathUtils.buildModuleReleaseByNameAndVersionPath(matcherState)); case MODULE_DOWNLOAD: - return null; + return getAsset(puppetPathUtils.buildModuleDownloadPath(matcherState)); default: throw new IllegalStateException("Received an invalid AssetKind of type: " + assetKind.name()); } @@ -109,18 +117,66 @@ protected Content store(final Context context, final Content content) throws IOE TokenMatcher.State matcherState = puppetPathUtils.matcherState(context); switch (assetKind) { case MODULE_RELEASES_BY_NAME: - return null; + return putMetadata(content, + assetKind, + puppetPathUtils.buildModuleReleaseByNamePath(context.getRequest().getParameters())); case MODULE_RELEASE_BY_NAME_AND_VERSION: return putMetadata(content, assetKind, puppetPathUtils.buildModuleReleaseByNameAndVersionPath(matcherState)); case MODULE_DOWNLOAD: - return null; + return putModule(content, + assetKind, + puppetPathUtils.buildModuleDownloadPath(matcherState)); default: throw new IllegalStateException("Received an invalid AssetKind of type: " + assetKind.name()); } } + private Content putModule(final Content content, + final AssetKind assetKind, + final String assetPath) throws IOException + { + StorageFacet storageFacet = facet(StorageFacet.class); + + try (TempBlob tempBlob = storageFacet.createTempBlob(content.openInputStream(), PuppetDataAccess.HASH_ALGORITHMS)) { + PuppetAttributes puppetAttributes = puppetAttributeParser.getAttributesFromInputStream(tempBlob.get()); + return doPutCookbook(puppetAttributes, tempBlob, content, assetKind, assetPath); + } + } + + @TransactionalStoreBlob + protected Content doPutCookbook(final PuppetAttributes puppetAttributes, + final TempBlob tempBlob, + final Content content, + final AssetKind assetKind, + final String assetPath) throws IOException + { + StorageTx tx = UnitOfWork.currentTx(); + Bucket bucket = tx.findBucket(getRepository()); + + Component component = puppetDataAccess.findComponent(tx, + getRepository(), + puppetAttributes.getName(), + puppetAttributes.getVersion()); + + if (component == null) { + component = tx.createComponent(bucket, getRepository().getFormat()) + .name(puppetAttributes.getName()) + .version(puppetAttributes.getVersion()); + } + tx.saveComponent(component); + + Asset asset = puppetDataAccess.findAsset(tx, bucket, assetPath); + if (asset == null) { + asset = tx.createAsset(bucket, component); + asset.name(assetPath); + asset.formatAttributes().set(P_ASSET_KIND, assetKind.name()); + } + + return puppetDataAccess.saveAsset(tx, asset, tempBlob, content); + } + private Content putMetadata(final Content content, final AssetKind assetKind, final String assetPath) throws IOException diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java new file mode 100644 index 0000000..c47eadd --- /dev/null +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java @@ -0,0 +1,38 @@ +package org.sonatype.nexus.repository.puppet.internal.util; + +import java.io.IOException; +import java.io.InputStream; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.sonatype.nexus.repository.puppet.internal.metadata.PuppetAttributes; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import static com.google.common.base.Preconditions.checkNotNull; + +@Named +@Singleton +public class PuppetAttributeParser +{ + private TgzParser tgzParser; + + private ObjectMapper objectMapper; + + @Inject + public PuppetAttributeParser(final TgzParser tgzParser, + final ObjectMapper objectMapper) { + this.tgzParser = checkNotNull(tgzParser); + this.objectMapper = checkNotNull(objectMapper); + } + + public PuppetAttributes getAttributesFromInputStream(final InputStream inputStream) throws IOException { + try (InputStream is = tgzParser.getMetadataFromInputStream(inputStream)) { + PuppetAttributes puppetAttributes = this.objectMapper.readValue(is, PuppetAttributes.class); + + return puppetAttributes; + } + } +} diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtils.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtils.java index c790777..c091479 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtils.java +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtils.java @@ -16,9 +16,12 @@ import javax.inject.Singleton; import org.sonatype.nexus.repository.view.Context; +import org.sonatype.nexus.repository.view.Parameters; import org.sonatype.nexus.repository.view.matchers.token.TokenMatcher; import org.sonatype.nexus.repository.view.matchers.token.TokenMatcher.State; +import com.google.common.base.Joiner; + import static com.google.common.base.Preconditions.checkNotNull; /** @@ -54,4 +57,12 @@ private String match(final TokenMatcher.State state, final String name) { public String buildModuleReleaseByNameAndVersionPath(final State matcherState) { return String.format("/v3/releases/%s-%s-%s", user(matcherState), module(matcherState), version(matcherState)); } + + public String buildModuleReleaseByNamePath(final Parameters parameters) { + return String.format("/v3/releases?%s", Joiner.on("&").withKeyValueSeparator("=").join(parameters)); + } + + public String buildModuleDownloadPath(final State matcherState) { + return String.format("/v3/files/%s-%s-%s.tar.gz", user(matcherState), module(matcherState), version(matcherState)); + } } diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/TgzParser.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/TgzParser.java new file mode 100644 index 0000000..6789057 --- /dev/null +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/TgzParser.java @@ -0,0 +1,52 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2018-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ +package org.sonatype.nexus.repository.puppet.internal.util; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.annotation.Nullable; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.apache.commons.compress.archivers.ArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; +import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; + +@Named +@Singleton +public class TgzParser +{ + private static final String METADATA_JSON = "metadata.json"; + + @Nullable + public InputStream getMetadataFromInputStream(final InputStream is) throws IOException { + try (GzipCompressorInputStream gzis = new GzipCompressorInputStream(is)) { + try (TarArchiveInputStream tais = new TarArchiveInputStream(gzis)) { + ArchiveEntry currentEntry; + + while ((currentEntry = tais.getNextEntry()) != null) { + if (currentEntry.getName().contains(METADATA_JSON)) { + byte[] buf = new byte[(int) currentEntry.getSize()]; + + tais.read(buf, 0, buf.length); + + return new ByteArrayInputStream(buf); + } + } + } + } + return null; + } +} diff --git a/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtilsTest.java b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtilsTest.java index d1baadf..eeeb8aa 100644 --- a/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtilsTest.java +++ b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtilsTest.java @@ -18,8 +18,11 @@ import org.sonatype.goodies.testsupport.TestSupport; import org.sonatype.nexus.common.collect.AttributesMap; import org.sonatype.nexus.repository.view.Context; +import org.sonatype.nexus.repository.view.Parameters; import org.sonatype.nexus.repository.view.matchers.token.TokenMatcher; +import com.google.common.collect.ListMultimap; +import com.google.common.collect.MultimapBuilder; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; @@ -27,7 +30,6 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class PuppetPathUtilsTest @@ -60,13 +62,39 @@ public void testGetMatcherState() throws Exception { @Test public void buildModuleReleaseByNameAndVersionPath() throws Exception { + setupTokens(); + String result = underTest.buildModuleReleaseByNameAndVersionPath(mockState); + + assertThat(result, is(equalTo("/v3/releases/puppetlabs-stdlib-5.1.0"))); + } + + @Test + public void buildModuleReleaseByNamePath() throws Exception { + // ?module=puppetlabs-stdlib&sort_by=version + ListMultimap entries = MultimapBuilder.linkedHashKeys().arrayListValues().build(); + entries.put("module", "puppetlabs-stdlib"); + entries.put("sort_by", "version"); + Parameters parameters = new Parameters(entries); + + String result = underTest.buildModuleReleaseByNamePath(parameters); + + assertThat(result, is(equalTo("/v3/releases?module=puppetlabs-stdlib&sort_by=version"))); + } + + @Test + public void buildModuleDownloadPath() throws Exception { + setupTokens(); + + String result = underTest.buildModuleDownloadPath(mockState); + + assertThat(result, is(equalTo("/v3/files/puppetlabs-stdlib-5.1.0.tar.gz"))); + } + + private void setupTokens() { Map tokens = new HashMap<>(); tokens.put("user", "puppetlabs"); tokens.put("module", "stdlib"); tokens.put("version", "5.1.0"); when(mockState.getTokens()).thenReturn(tokens); - String result = underTest.buildModuleReleaseByNameAndVersionPath(mockState); - - assertThat(result, is(equalTo("/v3/releases/puppetlabs-stdlib-5.1.0"))); } } diff --git a/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/TgzParserTest.java b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/TgzParserTest.java new file mode 100644 index 0000000..13096fb --- /dev/null +++ b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/TgzParserTest.java @@ -0,0 +1,38 @@ +package org.sonatype.nexus.repository.puppet.internal.util; + +import java.io.InputStream; + +import org.sonatype.goodies.testsupport.TestSupport; +import org.sonatype.nexus.repository.storage.TempBlob; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; + +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.mockito.Mockito.when; + +public class TgzParserTest + extends TestSupport +{ + private TgzParser underTest; + + @Mock + private TempBlob tempBlob; + + @Before + public void setUp() throws Exception { + this.underTest = new TgzParser(); + } + + @Test + public void getMetadataFromTgzTest() throws Exception { + InputStream is = getClass().getResourceAsStream("puppetlabs-stdlib-5.1.0.tar.gz"); + when(tempBlob.get()).thenReturn(is); + + InputStream metadata = underTest.getMetadataFromInputStream(tempBlob.get()); + assertThat(metadata, is(instanceOf(InputStream.class))); + } +} \ No newline at end of file diff --git a/src/test/resources/org/sonatype/nexus/repository/puppet/internal/util/puppetlabs-stdlib-5.1.0.tar.gz b/src/test/resources/org/sonatype/nexus/repository/puppet/internal/util/puppetlabs-stdlib-5.1.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..ebb0a6bc689bccbc5aead6984d834039d930db58 GIT binary patch literal 247769 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
  • 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
    org.sonatype.nexus.plugins:nexus-repository-puppet
    + + mvn:org.sonatype.nexus.plugins/nexus-repository-puppet/0.0.1 + + + + ``` +This will cause the plugin to be loaded and started with each startup of Nexus Repository. + +## The Fine Print + +It is worth noting that this is **NOT SUPPORTED** by Sonatype, and is a contribution of ours +to the open source community (read: you!) + +Remember: + +* Use this contribution at the risk tolerance that you have +* Do NOT file Sonatype support tickets related to puppet support in regard to this plugin +* DO file issues here on GitHub, so that the community can pitch in + +Phew, that was easier than I thought. Last but not least of all: + +Have fun creating and using this plugin and the Nexus platform, we are glad to have you here! + +## Getting help + +Looking to contribute to our code but need some help? There's a few ways to get information: + +* Chat with us on [Gitter](https://gitter.im/sonatype/nexus-developers) +* Check out the [Nexus3](http://stackoverflow.com/questions/tagged/nexus3) tag on Stack Overflow +* Check out the [Nexus Repository User List](https://groups.google.com/a/glists.sonatype.com/forum/?hl=en#!forum/nexus-users) \ No newline at end of file diff --git a/docs/PUPPET_USER_DOCUMENTATION.md b/docs/PUPPET_USER_DOCUMENTATION.md new file mode 100644 index 0000000..038c8b0 --- /dev/null +++ b/docs/PUPPET_USER_DOCUMENTATION.md @@ -0,0 +1,56 @@ + +## Puppet Repositories + +### Introduction + +[Puppet](https://www.puppet.com/) is a application management format used to help automate and run an organizations +infrastructure, using Puppet Modules, which are effectively recipes for running an application. + +### Proxying The Puppet Forge + +You can set up a Puppet proxy repository to access a remote repository location, for example to proxy the stable Puppet +Modules at [the Puppet Forge](https://forge.puppet.com/) + +To proxy a Puppet repository, you simply create a new 'puppet (proxy)' as documented in +[Repository Management](https://help.sonatype.com/repomanager3/configuration/repository-management) in +detail. Minimal configuration steps are: + +- Define 'Name' +- Define URL for 'Remote storage' e.g. [https://forgeapi.puppet.com/](https://forgeapi.puppet.com/) +- Select a 'Blob store' for 'Storage' + +### Configuring Puppet + +Configuring Puppet to use Nexus Repository is fairly easy! + +You'll need to have Puppet installed, for interaction with the Puppet Forge. + +Once you have Puppet up and running you'll want to run commands similar to the following: + +You'll need to create a `puppet.conf` file at the following location if it does not exist: + +`~/.puppet/puppet.conf` + +In this file you'll need to add: + +`module_repository = 'http://nexushostname:nexusport/repository/puppet-proxy-name'` + +Once you've done this, you should be ready to install Puppet modules via puppet install module ! + +### Browsing Puppet Repository Packages + +You can browse Puppet repositories in the user interface inspecting the components and assets and their details, as +described in [Browsing Repositories and Repository Groups](https://help.sonatype.com/display/NXRM3/Browsing+Repositories+and+Repository+Groups). diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java index c47eadd..5a405db 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java @@ -1,3 +1,15 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2018-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ package org.sonatype.nexus.repository.puppet.internal.util; import java.io.IOException; diff --git a/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/TgzParserTest.java b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/TgzParserTest.java index 13096fb..5d8b06b 100644 --- a/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/TgzParserTest.java +++ b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/TgzParserTest.java @@ -1,3 +1,15 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2018-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ package org.sonatype.nexus.repository.puppet.internal.util; import java.io.InputStream; From 925b7be24d6a8453f8c4e8b7499ef39f9670dd97 Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Wed, 31 Oct 2018 14:21:40 -0800 Subject: [PATCH 04/23] final (destination) --- .../repository/puppet/internal/util/PuppetAttributeParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java index 5a405db..397f8e8 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java @@ -29,7 +29,7 @@ @Singleton public class PuppetAttributeParser { - private TgzParser tgzParser; + private final TgzParser tgzParser; private ObjectMapper objectMapper; From 9c17287bfb7c8471a9b3ddd2ef87f1f281a0bf1c Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Wed, 31 Oct 2018 14:22:29 -0800 Subject: [PATCH 05/23] Newline (cimnea) --- .../nexus/repository/puppet/internal/util/TgzParserTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/TgzParserTest.java b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/TgzParserTest.java index 5d8b06b..33dbd89 100644 --- a/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/TgzParserTest.java +++ b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/TgzParserTest.java @@ -47,4 +47,4 @@ public void getMetadataFromTgzTest() throws Exception { InputStream metadata = underTest.getMetadataFromInputStream(tempBlob.get()); assertThat(metadata, is(instanceOf(InputStream.class))); } -} \ No newline at end of file +} From 0ff384e3029e276c62c7f1fd66997e81b3cc05ed Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 1 Nov 2018 13:00:11 -0800 Subject: [PATCH 06/23] Feedback from @jlstephens89 --- .../puppet/internal/PuppetContentValidator.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidator.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidator.java index 61cf412..a36a546 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidator.java +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidator.java @@ -46,13 +46,12 @@ public PuppetContentValidator(final DefaultContentValidator defaultContentValida this.defaultContentValidator = checkNotNull(defaultContentValidator); } - @Nonnull @Override - public String determineContentType(boolean strictContentTypeValidation, - Supplier contentSupplier, - @Nullable MimeRulesSource mimeRulesSource, - @Nullable String contentName, - @Nullable String declaredContentType) throws IOException + public String determineContentType(final boolean strictContentTypeValidation, + final Supplier contentSupplier, + final @Nullable MimeRulesSource mimeRulesSource, + final @Nullable String contentName, + final @Nullable String declaredContentType) throws IOException { if (contentName != null) { if (!contentName.endsWith(".tar.gz")) { From de5e7615d87af42d58667cf7ee09ca8d2cddb494 Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 1 Nov 2018 13:01:45 -0800 Subject: [PATCH 07/23] Move constants up, set access modifiers --- .../internal/PuppetContentValidatorTest.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidatorTest.java b/src/test/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidatorTest.java index de23225..b38081f 100644 --- a/src/test/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidatorTest.java +++ b/src/test/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidatorTest.java @@ -32,20 +32,20 @@ public class PuppetContentValidatorTest extends TestSupport { + private final static String TEST_JSON_CONTENT_NAME = "testjsonwithoutextension"; + + private final static String TEST_TAR_GZ_CONTENT_NAME = "test.tar.gz"; + private PuppetContentValidator underTest; @Mock - DefaultContentValidator defaultContentValidator; + private DefaultContentValidator defaultContentValidator; @Mock - Supplier contentStream; + private Supplier contentStream; @Mock - MimeRulesSource mimeRulesSource; - - private final static String TEST_JSON_CONTENT_NAME = "testjsonwithoutextension"; - - private final static String TEST_TAR_GZ_CONTENT_NAME = "test.tar.gz"; + private MimeRulesSource mimeRulesSource; @Before public void setUp() throws Exception { From e63634f8182bf718687dc81c1b3b1fc5e6bf5618 Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 1 Nov 2018 13:06:03 -0800 Subject: [PATCH 08/23] Some spacing, etc... fixes --- .../internal/PuppetContentValidatorTest.java | 40 ++++++------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/src/test/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidatorTest.java b/src/test/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidatorTest.java index b38081f..d81e778 100644 --- a/src/test/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidatorTest.java +++ b/src/test/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidatorTest.java @@ -17,7 +17,6 @@ import org.sonatype.goodies.testsupport.TestSupport; import org.sonatype.nexus.mime.MimeRulesSource; import org.sonatype.nexus.repository.storage.DefaultContentValidator; -import org.sonatype.nexus.repository.view.ContentTypes; import com.google.common.base.Supplier; import org.junit.Before; @@ -28,6 +27,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.when; +import static org.sonatype.nexus.repository.view.ContentTypes.*; public class PuppetContentValidatorTest extends TestSupport @@ -54,34 +54,24 @@ public void setUp() throws Exception { @Test public void testContentValidatorJson() throws Exception { - setUpMock( - TEST_JSON_CONTENT_NAME + ".json", - ContentTypes.APPLICATION_JSON, - false); + setUpMock(TEST_JSON_CONTENT_NAME + ".json", APPLICATION_JSON, false); + String result = underTest.determineContentType( - true, - contentStream, - mimeRulesSource, - TEST_JSON_CONTENT_NAME, - ContentTypes.APPLICATION_JSON); + true, contentStream, mimeRulesSource, TEST_JSON_CONTENT_NAME, APPLICATION_JSON + ); - assertThat(result, is(equalTo(ContentTypes.APPLICATION_JSON))); + assertThat(result, is(equalTo(APPLICATION_JSON))); } @Test public void testContentValidatorTarGz() throws Exception { - setUpMock( - TEST_TAR_GZ_CONTENT_NAME, - ContentTypes.APPLICATION_GZIP, - true); + setUpMock(TEST_TAR_GZ_CONTENT_NAME, APPLICATION_GZIP, true); + String result = underTest.determineContentType( - true, - contentStream, - mimeRulesSource, - TEST_TAR_GZ_CONTENT_NAME, - ContentTypes.APPLICATION_GZIP); + true, contentStream, mimeRulesSource, TEST_TAR_GZ_CONTENT_NAME, APPLICATION_GZIP + ); - assertThat(result, is(equalTo(ContentTypes.APPLICATION_GZIP))); + assertThat(result, is(equalTo(APPLICATION_GZIP))); } private void setUpMock(final String contentName, @@ -89,11 +79,7 @@ private void setUpMock(final String contentName, final boolean strictContentTypeValidation) throws Exception { when(defaultContentValidator.determineContentType( - strictContentTypeValidation, - contentStream, - mimeRulesSource, - contentName, - contentType)) - .thenReturn(contentType); + strictContentTypeValidation, contentStream, mimeRulesSource, contentName, contentType) + ).thenReturn(contentType); } } From 1c7f2b8d29481d5c3cdeed875c75b67dae9c69b6 Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 1 Nov 2018 13:07:03 -0800 Subject: [PATCH 09/23] Better test method names --- .../puppet/internal/PuppetContentValidatorTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidatorTest.java b/src/test/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidatorTest.java index d81e778..cf9d95c 100644 --- a/src/test/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidatorTest.java +++ b/src/test/java/org/sonatype/nexus/repository/puppet/internal/PuppetContentValidatorTest.java @@ -53,7 +53,7 @@ public void setUp() throws Exception { } @Test - public void testContentValidatorJson() throws Exception { + public void returnJsonTypeWhenValidatingJson() throws Exception { setUpMock(TEST_JSON_CONTENT_NAME + ".json", APPLICATION_JSON, false); String result = underTest.determineContentType( @@ -64,7 +64,7 @@ public void testContentValidatorJson() throws Exception { } @Test - public void testContentValidatorTarGz() throws Exception { + public void returnGzipTypeWhenValidatingTarGz() throws Exception { setUpMock(TEST_TAR_GZ_CONTENT_NAME, APPLICATION_GZIP, true); String result = underTest.determineContentType( From 007ef998e7f0cb4a6242f70e2ee19c1edc3a7d7c Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 1 Nov 2018 13:12:25 -0800 Subject: [PATCH 10/23] Add buildTokenMatcherForPatternAndAssetKind method --- .../internal/PuppetRecipeSupport.groovy | 36 ++++++------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetRecipeSupport.groovy b/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetRecipeSupport.groovy index 2cb3068..fa6df5e 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetRecipeSupport.groovy +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetRecipeSupport.groovy @@ -113,47 +113,33 @@ abstract class PuppetRecipeSupport * Matcher for module releases. */ static Matcher moduleReleasesSearchByNameMatcher() { - LogicMatchers.and( - new ActionMatcher(GET, HEAD), - new TokenMatcher('/v3/releases'), - new Matcher() { - @Override - boolean matches(final Context context) { - context.attributes.set(AssetKind.class, AssetKind.MODULE_RELEASES_BY_NAME) - return true - } - } - ) + buildTokenMatcherForPatternAndAssetKind('/v3/releases', AssetKind.MODULE_RELEASES_BY_NAME, GET, HEAD) } /** * Matcher for a module release details. */ static Matcher moduleReleaseByNameAndVersionMatcher() { - LogicMatchers.and( - new ActionMatcher(GET, HEAD), - new TokenMatcher('/v3/releases/{user:.+}-{module:.+}-{version:.+}'), - new Matcher() { - @Override - boolean matches(final Context context) { - context.attributes.set(AssetKind.class, AssetKind.MODULE_RELEASE_BY_NAME_AND_VERSION) - return true - } - } - ) + buildTokenMatcherForPatternAndAssetKind('/v3/releases/{user:.+}-{module:.+}-{version:.+}', AssetKind.MODULE_RELEASE_BY_NAME_AND_VERSION, GET, HEAD) } /** * Matcher for a downloading a module file. */ static Matcher moduleDownloadMatcher() { + buildTokenMatcherForPatternAndAssetKind('/v3/files/{user:.+}-{module:.+}-{version:.+}.tar.gz', AssetKind.MODULE_DOWNLOAD, GET, HEAD) + } + + static Matcher buildTokenMatcherForPatternAndAssetKind(final String pattern, + final AssetKind assetKind, + final String... actions) { LogicMatchers.and( - new ActionMatcher(GET, HEAD), - new TokenMatcher('/v3/files/{user:.+}-{module:.+}-{version:.+}.tar.gz'), + new ActionMatcher(actions), + new TokenMatcher(pattern), new Matcher() { @Override boolean matches(final Context context) { - context.attributes.set(AssetKind.class, AssetKind.MODULE_DOWNLOAD) + context.attributes.set(AssetKind.class, assetKind) return true } } From ac8268c00e70f4edc7e259dad5e6e896be39c939 Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 1 Nov 2018 13:37:59 -0800 Subject: [PATCH 11/23] Remove throws --- .../repository/puppet/internal/proxy/PuppetProxyFacetImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java index 5cab1e3..5882f0c 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java @@ -81,7 +81,7 @@ protected void doValidate(final Configuration configuration) throws Exception { @Nullable @Override - protected Content getCachedContent(final Context context) throws IOException { + protected Content getCachedContent(final Context context) { AssetKind assetKind = context.getAttributes().require(AssetKind.class); TokenMatcher.State matcherState = puppetPathUtils.matcherState(context); switch (assetKind) { From e679c6f588ae5629184137c957004b489970f3c1 Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 1 Nov 2018 13:46:24 -0800 Subject: [PATCH 12/23] Add in conditional Request Handler --- .../repository/puppet/internal/proxy/PuppetProxyRecipe.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyRecipe.groovy b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyRecipe.groovy index 2fa8adf..6134708 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyRecipe.groovy +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyRecipe.groovy @@ -91,6 +91,7 @@ class PuppetProxyRecipe .handler(negativeCacheHandler) .handler(partialFetchHandler) .handler(contentHeadersHandler) + .handler(conditionalRequestHandler) .handler(unitOfWorkHandler) .handler(proxyHandler) .create()) From c1a163283eaab9570a8f023c23af6d2c919e89d2 Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 1 Nov 2018 13:47:33 -0800 Subject: [PATCH 13/23] Remove this --- .../puppet/internal/util/PuppetDataAccess.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetDataAccess.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetDataAccess.java index 7085359..6e0e98c 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetDataAccess.java +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetDataAccess.java @@ -33,8 +33,6 @@ import org.sonatype.nexus.repository.view.Content; import org.sonatype.nexus.repository.view.Payload; import org.sonatype.nexus.repository.view.payloads.BlobPayload; -import org.sonatype.nexus.repository.view.payloads.StreamPayload; -import org.sonatype.nexus.repository.view.payloads.StreamPayload.InputStreamSupplier; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableList; @@ -134,16 +132,4 @@ public Content toContent(final Asset asset, final Blob blob) { Content.extractFromAsset(asset, HASH_ALGORITHMS, content.getAttributes()); return content; } - - /** - * Convert an InputStreamSupplier to {@link Content}. - * - * @return content of InputStreamSupplier - */ - public Content toContent(final InputStreamSupplier is, final long size, final String contentType) { - Payload payload = new StreamPayload(is, size, contentType); - Content content = new Content(payload); - - return content; - } } From 84707ee193263f87323a1325e29c6bd69936b714 Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 1 Nov 2018 13:51:18 -0800 Subject: [PATCH 14/23] Formatting --- .../repository/puppet/internal/proxy/PuppetProxyFacetImpl.java | 3 ++- .../repository/puppet/internal/proxy/PuppetProxyRecipe.groovy | 3 ++- .../repository/puppet/internal/util/PuppetAttributeParser.java | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java index 5882f0c..82f231d 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java @@ -67,7 +67,8 @@ public class PuppetProxyFacetImpl @Inject public PuppetProxyFacetImpl(final PuppetPathUtils puppetPathUtils, final PuppetDataAccess puppetDataAccess, - final PuppetAttributeParser puppetAttributeParser) { + final PuppetAttributeParser puppetAttributeParser) + { this.puppetPathUtils = checkNotNull(puppetPathUtils); this.puppetDataAccess = checkNotNull(puppetDataAccess); this.puppetAttributeParser = checkNotNull(puppetAttributeParser); diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyRecipe.groovy b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyRecipe.groovy index 6134708..aef9799 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyRecipe.groovy +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyRecipe.groovy @@ -58,7 +58,8 @@ class PuppetProxyRecipe @Inject PuppetProxyRecipe(@Named(ProxyType.NAME) final Type type, - @Named(PuppetFormat.NAME) final Format format) { + @Named(PuppetFormat.NAME) final Format format) + { super(type, format) } diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java index 397f8e8..8cd3d12 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java @@ -35,7 +35,8 @@ public class PuppetAttributeParser @Inject public PuppetAttributeParser(final TgzParser tgzParser, - final ObjectMapper objectMapper) { + final ObjectMapper objectMapper) + { this.tgzParser = checkNotNull(tgzParser); this.objectMapper = checkNotNull(objectMapper); } From 38e041aacf89094c223ce9531e905a89130afc08 Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 1 Nov 2018 14:02:21 -0800 Subject: [PATCH 15/23] Handle if parameters is empty --- .../puppet/internal/util/PuppetPathUtils.java | 3 +++ .../puppet/internal/util/PuppetPathUtilsTest.java | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtils.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtils.java index c091479..a10a9d9 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtils.java +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtils.java @@ -59,6 +59,9 @@ public String buildModuleReleaseByNameAndVersionPath(final State matcherState) { } public String buildModuleReleaseByNamePath(final Parameters parameters) { + if (parameters.isEmpty()) { + return "/v3/releases"; + } return String.format("/v3/releases?%s", Joiner.on("&").withKeyValueSeparator("=").join(parameters)); } diff --git a/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtilsTest.java b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtilsTest.java index eeeb8aa..5de8aa0 100644 --- a/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtilsTest.java +++ b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetPathUtilsTest.java @@ -81,6 +81,16 @@ public void buildModuleReleaseByNamePath() throws Exception { assertThat(result, is(equalTo("/v3/releases?module=puppetlabs-stdlib&sort_by=version"))); } + @Test + public void buildModuleReleaseByNamePathNoParameters() throws Exception { + ListMultimap entries = MultimapBuilder.linkedHashKeys().arrayListValues().build(); + Parameters parameters = new Parameters(entries); + + String result = underTest.buildModuleReleaseByNamePath(parameters); + + assertThat(result, is(equalTo("/v3/releases"))); + } + @Test public void buildModuleDownloadPath() throws Exception { setupTokens(); From 328f76ce6a2f8c126bcbd35719abbf102c2262ef Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 1 Nov 2018 14:04:35 -0800 Subject: [PATCH 16/23] Handle case where parameters is empty --- .../puppet/internal/proxy/PuppetProxyFacetImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java index 82f231d..6cd5c27 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java @@ -238,7 +238,9 @@ protected String getUrl(@Nonnull final Context context) { if (assetKind.equals(AssetKind.MODULE_RELEASES_BY_NAME)) { Parameters parameters = context.getRequest().getParameters(); - url += "?" + Joiner.on("&").withKeyValueSeparator("=").join(parameters); + if (!parameters.isEmpty()) { + url += "?" + Joiner.on("&").withKeyValueSeparator("=").join(parameters); + } } return url; From 812f296d69c053b0de1fe2e25f9d1f9fb3acd4ed Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 1 Nov 2018 14:20:51 -0800 Subject: [PATCH 17/23] Test getUrl --- .../proxy/PuppetProxyFacetImplTest.java | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 src/test/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImplTest.java diff --git a/src/test/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImplTest.java b/src/test/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImplTest.java new file mode 100644 index 0000000..c00dd36 --- /dev/null +++ b/src/test/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImplTest.java @@ -0,0 +1,99 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2018-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ +package org.sonatype.nexus.repository.puppet.internal.proxy; + +import org.sonatype.goodies.testsupport.TestSupport; +import org.sonatype.nexus.common.collect.AttributesMap; +import org.sonatype.nexus.repository.puppet.internal.AssetKind; +import org.sonatype.nexus.repository.puppet.internal.util.PuppetAttributeParser; +import org.sonatype.nexus.repository.puppet.internal.util.PuppetDataAccess; +import org.sonatype.nexus.repository.puppet.internal.util.PuppetPathUtils; +import org.sonatype.nexus.repository.view.Context; +import org.sonatype.nexus.repository.view.Parameters; +import org.sonatype.nexus.repository.view.Request; + +import com.google.common.collect.ListMultimap; +import com.google.common.collect.MultimapBuilder; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.when; + +public class PuppetProxyFacetImplTest + extends TestSupport +{ + private PuppetProxyFacetImpl underTest; + + @Mock + private PuppetPathUtils puppetPathUtils; + + @Mock + private PuppetDataAccess puppetDataAccess; + + @Mock + private PuppetAttributeParser puppetAttributeParser; + + @Mock + private Context context; + + @Mock + private Request request; + + @Mock + private AttributesMap attributesMap; + + @Before + public void setUp() throws Exception { + underTest = new PuppetProxyFacetImpl(puppetPathUtils, puppetDataAccess, puppetAttributeParser); + } + + @Test + public void returnUrlWithParametersIfModuleReleaseByName() throws Exception { + setupMocks("/do/a/thing", AssetKind.MODULE_RELEASES_BY_NAME); + setupParameters(); + String result = underTest.getUrl(context); + + assertThat(result, is(equalTo("do/a/thing?module=puppetlabs-stdlib&sort_by=version"))); + } + + @Test + public void returnUrlWithoutParametersIfNotModuleReleaseByName() throws Exception { + setupMocks("/do/a/different/thing", AssetKind.MODULE_RELEASE_BY_NAME_AND_VERSION); + String result = underTest.getUrl(context); + + assertThat(result, is(equalTo("do/a/different/thing"))); + } + + private void setupMocks(final String path, + final AssetKind assetKind) + { + when(context.getRequest()).thenReturn(request); + when(request.getPath()).thenReturn(path); + when(context.getAttributes()).thenReturn(attributesMap); + when(attributesMap.require(AssetKind.class)).thenReturn(assetKind); + } + + private void setupParameters() { + ListMultimap entries = MultimapBuilder.linkedHashKeys().arrayListValues().build(); + entries.put("module", "puppetlabs-stdlib"); + entries.put("sort_by", "version"); + Parameters parameters = new Parameters(entries); + + when(request.getParameters()).thenReturn(parameters); + } + +} From e6365f2e2437cfc3ad86c256308b8248a1d67c38 Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 1 Nov 2018 14:28:38 -0800 Subject: [PATCH 18/23] Test PuppetAttributeParser --- .../util/PuppetAttributeParserTest.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParserTest.java diff --git a/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParserTest.java b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParserTest.java new file mode 100644 index 0000000..c454115 --- /dev/null +++ b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParserTest.java @@ -0,0 +1,54 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2018-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ +package org.sonatype.nexus.repository.puppet.internal.util; + +import java.io.InputStream; + +import org.sonatype.goodies.testsupport.TestSupport; +import org.sonatype.nexus.repository.puppet.internal.metadata.PuppetAttributes; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Before; +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +public class PuppetAttributeParserTest + extends TestSupport +{ + private TgzParser tgzParser; + + private ObjectMapper objectMapper; + + private PuppetAttributeParser underTest; + + @Before + public void setUp() throws Exception { + tgzParser = new TgzParser(); + objectMapper = new ObjectMapper(); + underTest = new PuppetAttributeParser(tgzParser, objectMapper); + } + + @Test + public void getAttributesFromPuppetModule() throws Exception { + InputStream module = getClass().getResourceAsStream("puppetlabs-stdlib-5.1.0.tar.gz"); + PuppetAttributes result = underTest.getAttributesFromInputStream(module); + + assertThat(result.getName(), is(notNullValue())); + assertThat(result.getVersion(), is(notNullValue())); + assertThat(result.getDescription(), is(notNullValue())); + assertThat(result.getSummary(), is(notNullValue())); + } +} From f4fe030c3fa8e265e08ce53f15abfe1bd48928b0 Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 1 Nov 2018 14:35:12 -0800 Subject: [PATCH 19/23] Make this final --- .../repository/puppet/internal/util/PuppetAttributeParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java index 8cd3d12..7e28583 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetAttributeParser.java @@ -31,7 +31,7 @@ public class PuppetAttributeParser { private final TgzParser tgzParser; - private ObjectMapper objectMapper; + private final ObjectMapper objectMapper; @Inject public PuppetAttributeParser(final TgzParser tgzParser, From 16bb3d663cb3f3e5ac5dc17d98be0be04d434ed2 Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 1 Nov 2018 17:28:55 -0800 Subject: [PATCH 20/23] Docs FEEDBACK --- docs/PUPPET_USER_DOCUMENTATION.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/PUPPET_USER_DOCUMENTATION.md b/docs/PUPPET_USER_DOCUMENTATION.md index 038c8b0..b4a8926 100644 --- a/docs/PUPPET_USER_DOCUMENTATION.md +++ b/docs/PUPPET_USER_DOCUMENTATION.md @@ -34,10 +34,12 @@ detail. Minimal configuration steps are: ### Configuring Puppet -Configuring Puppet to use Nexus Repository is fairly easy! +There are relatively few steps for configuring Puppet to use Nexus Repository: You'll need to have Puppet installed, for interaction with the Puppet Forge. +NOTE: These instructions are Linux/OS X specific. + Once you have Puppet up and running you'll want to run commands similar to the following: You'll need to create a `puppet.conf` file at the following location if it does not exist: @@ -48,7 +50,7 @@ In this file you'll need to add: `module_repository = 'http://nexushostname:nexusport/repository/puppet-proxy-name'` -Once you've done this, you should be ready to install Puppet modules via puppet install module ! +Once you've done this, you should be ready to install Puppet modules via `puppet install module`! ### Browsing Puppet Repository Packages From fd16090486b83989d7d45adce6ea5887d7d33068 Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Thu, 1 Nov 2018 17:45:37 -0800 Subject: [PATCH 21/23] I think this is what you meant @jlstephens89 --- .../internal/proxy/PuppetProxyFacetImpl.java | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java index 6cd5c27..509d9e8 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java @@ -18,6 +18,7 @@ import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Named; +import javax.validation.constraints.Null; import org.sonatype.nexus.repository.cache.CacheInfo; import org.sonatype.nexus.repository.config.Configuration; @@ -142,17 +143,14 @@ private Content putModule(final Content content, try (TempBlob tempBlob = storageFacet.createTempBlob(content.openInputStream(), PuppetDataAccess.HASH_ALGORITHMS)) { PuppetAttributes puppetAttributes = puppetAttributeParser.getAttributesFromInputStream(tempBlob.get()); - return doPutCookbook(puppetAttributes, tempBlob, content, assetKind, assetPath); + Component component = findOrCreateComponent(puppetAttributes); + + return findOrCreateAsset(tempBlob, content, assetKind, assetPath, component, null); } } @TransactionalStoreBlob - protected Content doPutCookbook(final PuppetAttributes puppetAttributes, - final TempBlob tempBlob, - final Content content, - final AssetKind assetKind, - final String assetPath) throws IOException - { + protected Component findOrCreateComponent(final PuppetAttributes puppetAttributes) { StorageTx tx = UnitOfWork.currentTx(); Bucket bucket = tx.findBucket(getRepository()); @@ -168,14 +166,7 @@ protected Content doPutCookbook(final PuppetAttributes puppetAttributes, } tx.saveComponent(component); - Asset asset = puppetDataAccess.findAsset(tx, bucket, assetPath); - if (asset == null) { - asset = tx.createAsset(bucket, component); - asset.name(assetPath); - asset.formatAttributes().set(P_ASSET_KIND, assetKind.name()); - } - - return puppetDataAccess.saveAsset(tx, asset, tempBlob, content); + return component; } private Content putMetadata(final Content content, @@ -185,25 +176,36 @@ private Content putMetadata(final Content content, StorageFacet storageFacet = facet(StorageFacet.class); try (TempBlob tempBlob = storageFacet.createTempBlob(content.openInputStream(), PuppetDataAccess.HASH_ALGORITHMS)) { - return doPutMetadata(tempBlob, content, assetKind, assetPath); + return findOrCreateAsset(tempBlob, content, assetKind, assetPath, null, ContentTypes.APPLICATION_JSON); } } @TransactionalStoreBlob - protected Content doPutMetadata(final TempBlob tempBlob, - final Content content, - final AssetKind assetKind, - final String assetPath) throws IOException + protected Content findOrCreateAsset(final TempBlob tempBlob, + final Content content, + final AssetKind assetKind, + final String assetPath, + @Nullable final Component component, + @Nullable final String contentType) throws IOException { StorageTx tx = UnitOfWork.currentTx(); Bucket bucket = tx.findBucket(getRepository()); Asset asset = puppetDataAccess.findAsset(tx, bucket, assetPath); - if (asset == null) { - asset = tx.createAsset(bucket, getRepository().getFormat()); - asset.name(assetPath); - asset.contentType(ContentTypes.APPLICATION_JSON); - asset.formatAttributes().set(P_ASSET_KIND, assetKind.name()); + + if (assetKind.equals(AssetKind.MODULE_DOWNLOAD)) { + if (asset == null) { + asset = tx.createAsset(bucket, component); + asset.name(assetPath); + asset.formatAttributes().set(P_ASSET_KIND, assetKind.name()); + } + } else { + if (asset == null) { + asset = tx.createAsset(bucket, getRepository().getFormat()); + asset.name(assetPath); + asset.contentType(contentType); + asset.formatAttributes().set(P_ASSET_KIND, assetKind.name()); + } } return puppetDataAccess.saveAsset(tx, asset, tempBlob, content); From 18ea5e3ecc148dcb0711c0b8468c396efed1e181 Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Fri, 2 Nov 2018 08:04:58 -0800 Subject: [PATCH 22/23] Tests for PuppetDataAccess --- .../internal/PuppetRecipeSupport.groovy | 2 - .../internal/proxy/PuppetProxyFacetImpl.java | 1 - .../internal/util/PuppetDataAccessTest.java | 126 ++++++++++++++++++ 3 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetDataAccessTest.java diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetRecipeSupport.groovy b/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetRecipeSupport.groovy index fa6df5e..0205317 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetRecipeSupport.groovy +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/PuppetRecipeSupport.groovy @@ -21,8 +21,6 @@ import org.sonatype.nexus.repository.Format import org.sonatype.nexus.repository.RecipeSupport import org.sonatype.nexus.repository.Type import org.sonatype.nexus.repository.attributes.AttributesFacet -import org.sonatype.nexus.repository.cache.NegativeCacheFacet -import org.sonatype.nexus.repository.cache.NegativeCacheHandler import org.sonatype.nexus.repository.http.PartialFetchHandler import org.sonatype.nexus.repository.httpclient.HttpClientFacet import org.sonatype.nexus.repository.purge.PurgeUnusedFacet diff --git a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java index 509d9e8..a0f4d68 100644 --- a/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java +++ b/src/main/java/org/sonatype/nexus/repository/puppet/internal/proxy/PuppetProxyFacetImpl.java @@ -18,7 +18,6 @@ import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Named; -import javax.validation.constraints.Null; import org.sonatype.nexus.repository.cache.CacheInfo; import org.sonatype.nexus.repository.config.Configuration; diff --git a/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetDataAccessTest.java b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetDataAccessTest.java new file mode 100644 index 0000000..1edf686 --- /dev/null +++ b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetDataAccessTest.java @@ -0,0 +1,126 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2018-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ +package org.sonatype.nexus.repository.puppet.internal.util; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.sonatype.goodies.testsupport.TestSupport; +import org.sonatype.nexus.blobstore.api.Blob; +import org.sonatype.nexus.common.collect.NestedAttributesMap; +import org.sonatype.nexus.repository.Repository; +import org.sonatype.nexus.repository.storage.Asset; +import org.sonatype.nexus.repository.storage.AssetBlob; +import org.sonatype.nexus.repository.storage.Bucket; +import org.sonatype.nexus.repository.storage.Component; +import org.sonatype.nexus.repository.storage.StorageTx; +import org.sonatype.nexus.repository.view.Content; +import org.sonatype.nexus.repository.view.Payload; + +import com.google.common.base.Supplier; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.when; + +public class PuppetDataAccessTest + extends TestSupport +{ + @Mock + private StorageTx tx; + + @Mock + private Repository repository; + + @Mock + private Component component; + + @Mock + private Asset asset; + + @Mock + private Bucket bucket; + + @Mock + private Supplier sis; + + @Mock + private Payload payload; + + @Mock + private AssetBlob assetBlob; + + @Mock + private Blob blob; + + private NestedAttributesMap nestedAttributesMap; + + private PuppetDataAccess underTest; + + @Before + public void setUp() throws Exception { + underTest = new PuppetDataAccess(); + } + + @Test + public void findComponentReturnsComponent() throws Exception { + List list = new ArrayList<>(); + list.add(component); + when(tx.findComponents(any(), any())).thenReturn(list); + Component result = underTest.findComponent(tx, repository, "test", "1.0.0"); + + assertThat(result, is(notNullValue())); + } + + @Test + public void findComponentReturnsNull() throws Exception { + List list = new ArrayList<>(); + when(tx.findComponents(any(), any())).thenReturn(list); + Component result = underTest.findComponent(tx, repository, "test", "1.0.0"); + + assertThat(result, is(nullValue())); + } + + @Test + public void findAssetReturnsAsset() throws Exception { + when(tx.findAssetWithProperty("name", "test", bucket)).thenReturn(asset); + + Asset result = underTest.findAsset(tx, bucket, "test"); + + assertThat(result, is(notNullValue())); + } + + @Test + public void saveAssetReturnsContent() throws Exception { + InputStream is = getClass().getResourceAsStream("puppetlabs-stdlib-5.1.0.tar.gz"); + when(sis.get()).thenReturn(is); + Map map = new HashMap<>(); + nestedAttributesMap = new NestedAttributesMap("content", map); + when(asset.name()).thenReturn("name"); + when(tx.setBlob(asset, "name", sis, PuppetDataAccess.HASH_ALGORITHMS, null, null, false )).thenReturn(assetBlob); + when(assetBlob.getBlob()).thenReturn(blob); + when(asset.attributes()).thenReturn(nestedAttributesMap); + Content result = underTest.saveAsset(tx, asset, sis, payload); + + assertThat(result, is(notNullValue())); + } +} From bf2a8cacf234f191ed59f069e98f9102de2385cb Mon Sep 17 00:00:00 2001 From: Jeffry Hesse Date: Fri, 2 Nov 2018 08:14:19 -0800 Subject: [PATCH 23/23] Dry out test a bit --- .../internal/util/PuppetDataAccessTest.java | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetDataAccessTest.java b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetDataAccessTest.java index 1edf686..7631f89 100644 --- a/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetDataAccessTest.java +++ b/src/test/java/org/sonatype/nexus/repository/puppet/internal/util/PuppetDataAccessTest.java @@ -45,6 +45,14 @@ public class PuppetDataAccessTest extends TestSupport { + private static final String NAME = "test"; + + private static final String VERSION = "1.0.0"; + + private static final String CONTENT = "content"; + + private static final String PUPPET_LABS_STDLIB_5_1_0_TAR_GZ = "puppetlabs-stdlib-5.1.0.tar.gz"; + @Mock private StorageTx tx; @@ -86,7 +94,7 @@ public void findComponentReturnsComponent() throws Exception { List list = new ArrayList<>(); list.add(component); when(tx.findComponents(any(), any())).thenReturn(list); - Component result = underTest.findComponent(tx, repository, "test", "1.0.0"); + Component result = underTest.findComponent(tx, repository, NAME, VERSION); assertThat(result, is(notNullValue())); } @@ -95,28 +103,28 @@ public void findComponentReturnsComponent() throws Exception { public void findComponentReturnsNull() throws Exception { List list = new ArrayList<>(); when(tx.findComponents(any(), any())).thenReturn(list); - Component result = underTest.findComponent(tx, repository, "test", "1.0.0"); + Component result = underTest.findComponent(tx, repository, NAME, VERSION); assertThat(result, is(nullValue())); } @Test public void findAssetReturnsAsset() throws Exception { - when(tx.findAssetWithProperty("name", "test", bucket)).thenReturn(asset); + when(tx.findAssetWithProperty("name", NAME, bucket)).thenReturn(asset); - Asset result = underTest.findAsset(tx, bucket, "test"); + Asset result = underTest.findAsset(tx, bucket, NAME); assertThat(result, is(notNullValue())); } @Test public void saveAssetReturnsContent() throws Exception { - InputStream is = getClass().getResourceAsStream("puppetlabs-stdlib-5.1.0.tar.gz"); + InputStream is = getClass().getResourceAsStream(PUPPET_LABS_STDLIB_5_1_0_TAR_GZ); when(sis.get()).thenReturn(is); Map map = new HashMap<>(); - nestedAttributesMap = new NestedAttributesMap("content", map); - when(asset.name()).thenReturn("name"); - when(tx.setBlob(asset, "name", sis, PuppetDataAccess.HASH_ALGORITHMS, null, null, false )).thenReturn(assetBlob); + nestedAttributesMap = new NestedAttributesMap(CONTENT, map); + when(asset.name()).thenReturn(NAME); + when(tx.setBlob(asset, NAME, sis, PuppetDataAccess.HASH_ALGORITHMS, null, null, false )).thenReturn(assetBlob); when(assetBlob.getBlob()).thenReturn(blob); when(asset.attributes()).thenReturn(nestedAttributesMap); Content result = underTest.saveAsset(tx, asset, sis, payload);

    M6xE8J~w3lSbHPx57g`m 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 Date: Thu, 18 Oct 2018 14:45:27 -0800 Subject: [PATCH 03/23] Adds initial docs for the format Co-authored-by: Daniel Sauble --- README.md | 154 +++++++++++++++++- docs/PUPPET_USER_DOCUMENTATION.md | 56 +++++++ .../internal/util/PuppetAttributeParser.java | 12 ++ .../puppet/internal/util/TgzParserTest.java | 12 ++ 4 files changed, 232 insertions(+), 2 deletions(-) create mode 100644 docs/PUPPET_USER_DOCUMENTATION.md diff --git a/README.md b/README.md index 8902803..6f23929 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,156 @@ --> -# Nexus Repository Puppet +# Nexus Repository Puppet Format -TBD +## Developing + +### Requirements + +* [Apache Maven 3.3.3+](https://maven.apache.org/install.html) +* [Java 8+](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) +* Network access to https://repository.sonatype.org/content/groups/sonatype-public-grid + +Also, there is a good amount of information available at [Bundle Development](https://help.sonatype.com/display/NXRM3/Bundle+Development) + +### Building + +To build the project and generate the bundle use Maven + + mvn clean package + +If everything checks out, the bundle for puppet should be available in the `target` folder + +#### Build with Docker + +`docker build -t nexus-repository-puppet:0.0.1 .` + +#### Run as a Docker container + +`docker run -d -p 8081:8081 --name nexus nexus-repository-puppet:0.0.1` + +For further information like how to persist volumes check out [the GitHub repo for our official image](https://github.com/sonatype/docker-nexus3). + +The application will now be available from your browser at http://localhost:8081 + +## Using Puppet With Nexus Repository Manager 3 + +[We have detailed instructions on how to get started here!](docs/PUPPET_USER_DOCUMENTATION.md) + +## Compatibility with Nexus Repository Manager 3 Versions + +The table below outlines what version of Nexus Repository the plugin was built against + +| Plugin Version | Nexus Repository Version | +|----------------|--------------------------| +| v0.0.1 | 3.14.0-04 | + +If a new version of Nexus Repository is released and the plugin needs changes, a new release will be made, and this +table will be updated to indicate which version of Nexus Repository it will function against. This is done on a time +available basis, as this is community supported. If you see a new version of Nexus Repository, go ahead and update the +plugin and send us a PR after testing it out! + +All released versions can be found [here](https://github.com/sonatype-nexus-community/nexus-repository-puppet/releases). + +## Features Implemented In This Plugin + +| Feature | Implemented | +|---------|----------------------| +| Proxy | :heavy_check_mark: * | +| Hosted | | +| Group | | + +`* tested primarily against the Puppet Forge, not guaranteed to work on the wide wild world of Puppet repositories.` + +### Supported Puppet Commands + +#### Proxy + +| Plugin Version | Nexus Repository Version | +|------------------------------|--------------------------| +| `puppet module install` | :heavy_check_mark: | + +`* these commands are not applicable to a proxy` + +## Installing the plugin + +There are a range of options for installing the puppet plugin. You'll need to build it first, and +then install the plugin with the options shown below: + +### Temporary Install + +Installations done via the Karaf console will be wiped out with every restart of Nexus Repository. This is a +good installation path if you are just testing or doing development on the plugin. + +* Enable Nexus Repo console: edit `/bin/nexus.vmoptions` and change `karaf.startLocalConsole` to `true`. + + More details here: [Bundle Development](https://help.sonatype.com/display/NXRM3/Bundle+Development+Overview) + +* Run Nexus Repo console: + ``` + # sudo su - nexus + $ cd /bin + $ ./nexus run + > bundle:install file:///tmp/nexus-repository-puppet-0.0.1.jar + > bundle:list + ``` + (look for org.sonatype.nexus.plugins:nexus-repository-puppet ID, should be the last one) + ``` + > bundle:start + ``` + +### (more) Permanent Install + +For more permanent installs of the nexus-repository-puppet plugin, follow these instructions: + +* Copy the bundle (nexus-repository-puppet-0.0.1.jar) into /deploy + +This will cause the plugin to be loaded with each restart of Nexus Repository. As well, this folder is monitored +by Nexus Repository and the plugin should load within 60 seconds of being copied there if Nexus Repository +is running. You will still need to start the bundle using the karaf commands mentioned in the temporary install. + +### (most) Permanent Install + +If you are trying to use the puppet plugin permanently, it likely makes more sense to do the following: + +* Copy the bundle into `/system/org/sonatype/nexus/plugins/nexus-repository-puppet/0.0.1/nexus-repository-puppet-0.0.1.jar` +* Make the following additions marked with + to `/system/org/sonatype/nexus/assemblies/nexus-core-feature/3.x.y/nexus-core-feature-3.x.y-features.xml` + + ``` + nexus-repository-rubygems + + nexus-repository-puppet + nexus-repository-gitlfs + + ``` + And + ``` + + + +