diff --git a/filers/default/pom.xml b/filers/default/pom.xml index 8a97354e33..8cae3c5d30 100644 --- a/filers/default/pom.xml +++ b/filers/default/pom.xml @@ -52,5 +52,14 @@ org.commonjava.indy indy-subsys-metrics + + org.commonjava.indy + indy-subsys-jaxrs + + + io.swagger + swagger-annotations + compile + diff --git a/filers/default/src/main/java/org/commonjava/indy/filer/def/DefaultGalleyStorageProvider.java b/filers/default/src/main/java/org/commonjava/indy/filer/def/DefaultGalleyStorageProvider.java index 3e13dc6d5d..a0b106bcea 100644 --- a/filers/default/src/main/java/org/commonjava/indy/filer/def/DefaultGalleyStorageProvider.java +++ b/filers/default/src/main/java/org/commonjava/indy/filer/def/DefaultGalleyStorageProvider.java @@ -23,17 +23,13 @@ import org.commonjava.indy.content.IndyChecksumAdvisor; import org.commonjava.indy.content.SpecialPathSetProducer; import org.commonjava.indy.filer.def.conf.DefaultStorageProviderConfiguration; -import org.commonjava.maven.galley.cache.pathmapped.PathMappedCacheProviderConfig; -import org.commonjava.o11yphant.metrics.api.Meter; -import org.commonjava.o11yphant.metrics.api.MetricRegistry; -import org.commonjava.o11yphant.metrics.api.Timer; -import org.commonjava.o11yphant.metrics.DefaultMetricsManager; -import org.commonjava.indy.subsys.metrics.conf.IndyMetricsConfig; import org.commonjava.indy.subsys.cassandra.CassandraClient; import org.commonjava.indy.subsys.cassandra.config.CassandraConfig; +import org.commonjava.indy.subsys.metrics.conf.IndyMetricsConfig; import org.commonjava.maven.galley.GalleyInitException; import org.commonjava.maven.galley.cache.CacheProviderFactory; import org.commonjava.maven.galley.cache.partyline.PartyLineCacheProviderFactory; +import org.commonjava.maven.galley.cache.pathmapped.PathMappedCacheProviderConfig; import org.commonjava.maven.galley.cache.pathmapped.PathMappedCacheProviderFactory; import org.commonjava.maven.galley.config.TransportManagerConfig; import org.commonjava.maven.galley.io.ChecksummingTransferDecorator; @@ -54,10 +50,14 @@ import org.commonjava.maven.galley.spi.io.TransferDecorator; import org.commonjava.maven.galley.spi.metrics.TimingProvider; import org.commonjava.maven.galley.transport.htcli.UploadMetadataGenTransferDecorator; +import org.commonjava.o11yphant.metrics.DefaultMetricsManager; +import org.commonjava.o11yphant.metrics.api.Meter; +import org.commonjava.o11yphant.metrics.api.MetricRegistry; +import org.commonjava.o11yphant.metrics.api.Timer; import org.commonjava.storage.pathmapped.config.DefaultPathMappedStorageConfig; import org.commonjava.storage.pathmapped.config.PathMappedStorageConfig; -import org.commonjava.storage.pathmapped.pathdb.datastax.CassandraPathDB; import org.commonjava.storage.pathmapped.metrics.MeasuredPathDB; +import org.commonjava.storage.pathmapped.pathdb.datastax.CassandraPathDB; import org.commonjava.storage.pathmapped.spi.PathDB; import org.commonjava.storage.pathmapped.spi.PhysicalStore; import org.slf4j.Logger; @@ -75,6 +75,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -82,10 +83,15 @@ import java.util.function.Function; import static org.apache.commons.lang3.StringUtils.isBlank; -import static org.commonjava.o11yphant.metrics.util.NameUtils.getSupername; import static org.commonjava.maven.galley.io.checksum.ChecksummingDecoratorAdvisor.ChecksumAdvice.CALCULATE_AND_WRITE; import static org.commonjava.maven.galley.io.checksum.ChecksummingDecoratorAdvisor.ChecksumAdvice.NO_DECORATE; -import static org.commonjava.storage.pathmapped.pathdb.datastax.util.CassandraPathDBUtils.*; +import static org.commonjava.o11yphant.metrics.util.NameUtils.getSupername; +import static org.commonjava.storage.pathmapped.pathdb.datastax.util.CassandraPathDBUtils.PROP_CASSANDRA_HOST; +import static org.commonjava.storage.pathmapped.pathdb.datastax.util.CassandraPathDBUtils.PROP_CASSANDRA_KEYSPACE; +import static org.commonjava.storage.pathmapped.pathdb.datastax.util.CassandraPathDBUtils.PROP_CASSANDRA_PASS; +import static org.commonjava.storage.pathmapped.pathdb.datastax.util.CassandraPathDBUtils.PROP_CASSANDRA_PORT; +import static org.commonjava.storage.pathmapped.pathdb.datastax.util.CassandraPathDBUtils.PROP_CASSANDRA_REPLICATION_FACTOR; +import static org.commonjava.storage.pathmapped.pathdb.datastax.util.CassandraPathDBUtils.PROP_CASSANDRA_USER; @SuppressWarnings( "unused" ) @ApplicationScoped @@ -148,6 +154,8 @@ public class DefaultGalleyStorageProvider private CacheProviderFactory cacheProviderFactory; + PathDB pathDB = null; + public DefaultGalleyStorageProvider() { } @@ -205,7 +213,6 @@ private void setupCacheProviderFactory() logger.info( "Initializing Cassandra-based path-mapping database for content storage." ); - PathDB pathDB = null; PathMappedStorageConfig pathMappedStorageConfig = getPathMappedStorageConfig(); if ( cassandraClient != null ) { @@ -411,4 +418,35 @@ public synchronized CacheProvider getCacheProvider() return cacheProvider; } + + public Set getProxySitesCache() + { + return pathDB.getProxySitesCache(); + } + + public List getProxySiteList() + { + return pathDB.getProxySiteList(); + } + + public boolean isProxySite( String site ) + { + return pathDB.isProxySite( site ); + } + + public void saveProxySite( String site ) + { + pathDB.saveProxySite( site ); + } + + public void deleteProxySite( String site ) + { + pathDB.deleteProxySite( site ); + } + + public void deleteAllProxySite() + { + pathDB.deleteAllProxySite(); + } + } diff --git a/filers/default/src/main/java/org/commonjava/indy/filer/def/jaxrs/ProxySiteAccessResource.java b/filers/default/src/main/java/org/commonjava/indy/filer/def/jaxrs/ProxySiteAccessResource.java new file mode 100644 index 0000000000..886086157c --- /dev/null +++ b/filers/default/src/main/java/org/commonjava/indy/filer/def/jaxrs/ProxySiteAccessResource.java @@ -0,0 +1,90 @@ +package org.commonjava.indy.filer.def.jaxrs; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import org.commonjava.indy.bind.jaxrs.IndyResources; +import org.commonjava.indy.bind.jaxrs.util.REST; +import org.commonjava.indy.filer.def.DefaultGalleyStorageProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.StreamingOutput; +import javax.ws.rs.core.UriInfo; +import java.util.List; +import java.util.Set; + +@Api( value = "Proxy Site Cache Access and Storage" ) +@Path( "/api/proxysite" ) +@ApplicationScoped +@REST +public class ProxySiteAccessResource + implements IndyResources +{ + protected final Logger logger = LoggerFactory.getLogger( getClass() ); + + @Inject + DefaultGalleyStorageProvider provider; + + @ApiOperation( "Retrieve All Proxy Sites." ) + @ApiResponses( { @ApiResponse( code = 404, message = "Site is not available" ), + @ApiResponse( code = 200, response = StreamingOutput.class, message = "Site stream" ), } ) + @Produces( "application/json" ) + @Path( "/all" ) + @GET + public Response doGet( @Context final UriInfo uriInfo, @Context final HttpServletRequest request ) + { + Set cache = provider.getProxySitesCache(); + logger.info( "Proxy Site Cache list: {}", cache ); + List result = provider.getProxySiteList(); + return ( result == null || result.isEmpty() ) ? + Response.status( Response.Status.NOT_FOUND ).build() : + Response.ok( result ).build(); + } + + @ApiOperation( "Store Proxy Site." ) + @ApiResponses( { @ApiResponse( code = 201, message = "Site was stored successfully" ) } ) + @PUT + @Path( "/{site}" ) + public Response doCreate( @PathParam( "site" ) final String site, @Context final HttpServletRequest request, + @Context final UriInfo uriInfo ) + { + provider.saveProxySite( site ); + return Response.created( uriInfo.getRequestUri() ).build(); + } + + @ApiOperation( "Delete Proxy Site." ) + @ApiResponse( code = 200, message = "Delete complete." ) + @Path( "/{site}" ) + @DELETE + public Response doDelete( @PathParam( "site" ) final String site ) + { + provider.deleteProxySite( site ); + provider.getProxySitesCache().remove( site ); + return Response.ok().build(); + } + + @ApiOperation( "Delete All Proxy Sites." ) + @ApiResponse( code = 200, message = "Delete complete." ) + @Path( "/all" ) + @DELETE + public Response doDeleteAll() + { + provider.deleteAllProxySite(); + provider.getProxySitesCache().clear(); + return Response.ok().build(); + } + +} diff --git a/pom.xml b/pom.xml index e00e6a97fc..6db5568f6c 100644 --- a/pom.xml +++ b/pom.xml @@ -94,7 +94,7 @@ 1.5 3.4.0 1.1.4 - 1.17 + 1.18-SNAPSHOT 1.24 3.2.1 diff --git a/test/fixtures-core/src/main/java/org/commonjava/indy/test/fixture/core/TestCacheProvider.java b/test/fixtures-core/src/main/java/org/commonjava/indy/test/fixture/core/TestCacheProvider.java index 9699e52dc7..12c04ecc4a 100644 --- a/test/fixtures-core/src/main/java/org/commonjava/indy/test/fixture/core/TestCacheProvider.java +++ b/test/fixtures-core/src/main/java/org/commonjava/indy/test/fixture/core/TestCacheProvider.java @@ -31,6 +31,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.Set; public class TestCacheProvider implements CacheProvider @@ -299,4 +300,22 @@ public void stopReporting() { lockingSupport.stopReporting(); } + + @Override + public Set getProxySitesCache() + { + return null; + } + + @Override + public boolean isProxySite( String s ) + { + return false; + } + + @Override + public void saveProxySite( String s ) + { + + } }