Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
<parent>
<groupId>org.sonatype.nexus.plugins</groupId>
<artifactId>nexus-plugins</artifactId>
<version>2.11.2-06</version>
<version>2.11.3-01</version>
</parent>

<properties>
Expand All @@ -67,6 +67,13 @@
<version>${nexus.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.sonatype.nexus.plugins</groupId>
<artifactId>nexus-capabilities-plugin</artifactId>
<type>${nexus-plugin.type}</type>
<version>${nexus.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.sonatype.nexus</groupId>
<artifactId>nexus-plugin-testsupport</artifactId>
Expand Down Expand Up @@ -136,6 +143,11 @@
<artifactId>jackson-jaxrs</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.sonatype.nexus</groupId>
<artifactId>nexus-client-core</artifactId>
Expand Down
5 changes: 4 additions & 1 deletion replication-plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ requestsQueueSize and requestsSendingThreadsCount attributes define thread pool
requests from master to peers asynchronously.
The default values are: 500 for requestsQueueSize and 1 for requestsSendingThreadsCount
-->
<configurations myUrl="http://localhost:8081/nexus" requestsQueueSize="500" requestsSendingThreadsCount="1" queueDumpFileName="/tmp/nexus-replication-plugin-queue-backup">
<configurations myUrl="http://localhost:8081/nexus"
requestsQueueSize="500"
requestsSendingThreadsCount="1"
queueDumpFileName="/tmp/nexus-replication-plugin-queue-backup">
<servers>
<server>
<url>http://localhost:8083/nexus</url>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.griddynamics.cd.nrp.internal.capabilities;

import javax.inject.Named;

import org.sonatype.nexus.plugins.capabilities.CapabilityRegistry;
import org.sonatype.nexus.plugins.capabilities.support.CapabilityBooterSupport;

import org.eclipse.sisu.EagerSingleton;

import java.util.Collections;

@Named
@EagerSingleton
public class ReplicationPluginCapabilitiesBooter
extends CapabilityBooterSupport
{

@Override
protected void boot(final CapabilityRegistry registry)
throws Exception
{
maybeAddCapability(
registry,
ReplicationPluginCapabilityDescriptor.TYPE,
true, // enabled
null, // no notes
Collections.<String,String>emptyMap());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package com.griddynamics.cd.nrp.internal.capabilities;

import com.griddynamics.cd.nrp.internal.model.config.ReplicationPluginConfigurationStorage;
import com.griddynamics.cd.nrp.internal.uploading.ArtifactUpdateApiClient;
import com.griddynamics.cd.nrp.internal.uploading.impl.ArtifactUpdateApiClientImpl;
import com.griddynamics.cd.nrp.internal.uploading.impl.factories.JerseyClientFactory;
import org.jetbrains.annotations.NonNls;
import org.sonatype.nexus.capability.support.CapabilitySupport;
import org.sonatype.nexus.plugins.capabilities.Condition;
import org.sonatype.nexus.plugins.capabilities.Evaluable;

import javax.inject.Inject;
import javax.inject.Named;
import java.util.HashMap;
import java.util.Map;

import static com.google.common.base.Preconditions.checkNotNull;

@Named(ReplicationPluginCapabilityDescriptor.TYPE_ID)
public class ReplicationPluginCapability
extends CapabilitySupport<ReplicationPluginCapabilityConfiguration> {
@NonNls
public static final String NL = System.getProperty("line.separator");

private final ReplicationPluginConfigurationStorage gridRegistry;
private final ArtifactUpdateApiClientImpl artifactUpdateApiClient;
private final JerseyClientFactory jerseyClientFactory;

@Inject
public ReplicationPluginCapability(ReplicationPluginConfigurationStorage replicationPluginConfigurationStorage,
ArtifactUpdateApiClientImpl artifactUpdateApiClient,
JerseyClientFactory jerseyClientFactory) {
this.gridRegistry = checkNotNull(replicationPluginConfigurationStorage);
this.artifactUpdateApiClient = artifactUpdateApiClient;
this.jerseyClientFactory = jerseyClientFactory;
}

@Override
protected ReplicationPluginCapabilityConfiguration createConfig(final Map<String, String> properties) throws Exception {
Map<String, String> newProperties = new HashMap<>(properties);
return new ReplicationPluginCapabilityConfiguration(newProperties);
}

@Override
public void configure(final ReplicationPluginCapabilityConfiguration config){
gridRegistry.setMasterServerURLPrefix(config.getMasterServerURLPrefix());
gridRegistry.setRequestQueueSize(config.getRequestQueueSize());
gridRegistry.setRequestSendingThreadCount(config.getRequestSendingThreadCount());
gridRegistry.setRequestQueueDumpFileName(config.getRequestQueueDumpFileName());
gridRegistry.setServers(config.getNexusServers());
jerseyClientFactory.onActivate();
artifactUpdateApiClient.onActivate();
}

@Override
public Condition activationCondition() {
return conditions().capabilities().evaluable(
new Evaluable() {
@Override
public boolean isSatisfied() {
return true;
}

@Override
public String explainSatisfied() {
return "\"createrepo\" and \"mergerepo\" are available";
}

@Override
public String explainUnsatisfied() {
return "";
}
}
);
}

@Override
protected String renderStatus() {
return "Sample Nexus replication plugin status";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package com.griddynamics.cd.nrp.internal.capabilities;

import com.google.common.collect.Maps;
import com.griddynamics.cd.nrp.internal.model.config.ReplicationPluginConfigurationStorage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;

import static com.google.common.base.Strings.isNullOrEmpty;

public class ReplicationPluginCapabilityConfiguration {

public static final String MASTER_SERVER_URL_PREFIX = "myUrl";
public static final String REQUESTS_QUEUE_SIZE = "requestsQueueSize";
public static final String REQUESTS_SENDING_THREADS_COUNT = "requestsSendingThreadsCount";
public static final String QUEUE_DUMP_FILE_NAME = "queueDumpFileName";
public static final String SERVER_URL = "server_url";
public static final String SERVER_LOGIN = "server_user";
public static final String SERVER_PASSWORD = "server_password";

private final String masterServerURLPrefix;
private final int requestQueueSize;
private final int requestSendingThreadCount;
private final String requestQueueDumpFileName;
private final Set<ReplicationPluginConfigurationStorage.NexusServer> nexusServers;
Logger logger =
LoggerFactory.getLogger(ReplicationPluginCapabilityConfiguration.class);

public ReplicationPluginCapabilityConfiguration(final Map<String, String> properties) {
this.masterServerURLPrefix = properties.get(MASTER_SERVER_URL_PREFIX);
this.requestQueueSize = Integer.parseInt(properties.get(REQUESTS_QUEUE_SIZE));
this.requestSendingThreadCount = Integer.parseInt(properties.get(REQUESTS_SENDING_THREADS_COUNT));
this.requestQueueDumpFileName = properties.get(QUEUE_DUMP_FILE_NAME);
this.nexusServers = new LinkedHashSet<>();

for (int i = 0; i < 5; i++) {
String serverUrl = properties.get(SERVER_URL + "_" + i);
String serverLogin = properties.get(SERVER_LOGIN + "_" + i);
String serverPassword = properties.get(SERVER_PASSWORD + "_" + i);

if (isNullOrEmpty(serverUrl) ||
isNullOrEmpty(serverLogin) ||
isNullOrEmpty(serverPassword)) {
continue;
}

ReplicationPluginConfigurationStorage.NexusServer nexusServer = new ReplicationPluginConfigurationStorage.NexusServer(
serverUrl,
serverLogin,
serverPassword
);
nexusServers.add(nexusServer);
}
}

public Map<String, String> asMap() {
final Map<String, String> props = Maps.newHashMap();
props.put(MASTER_SERVER_URL_PREFIX, masterServerURLPrefix);
props.put(REQUESTS_QUEUE_SIZE, String.valueOf(requestQueueSize));
props.put(REQUESTS_SENDING_THREADS_COUNT, String.valueOf(requestSendingThreadCount));
props.put(QUEUE_DUMP_FILE_NAME, requestQueueDumpFileName);
Iterator<ReplicationPluginConfigurationStorage.NexusServer> nexusServerIterator = nexusServers.iterator();
for (int i = 0; nexusServerIterator.hasNext(); i++) {
ReplicationPluginConfigurationStorage.NexusServer nexusServer = nexusServerIterator.next();
props.put(SERVER_URL + "_" + i, nexusServer.getUrl());
props.put(SERVER_LOGIN + "_" + i, nexusServer.getUser());
props.put(SERVER_PASSWORD + "_" + i, nexusServer.getPassword());
}
return props;
}

public String getMasterServerURLPrefix() {
return masterServerURLPrefix;
}

public int getRequestQueueSize() {
return requestQueueSize;
}

public int getRequestSendingThreadCount() {
return requestSendingThreadCount;
}

public String getRequestQueueDumpFileName() {
return requestQueueDumpFileName;
}

public Set<ReplicationPluginConfigurationStorage.NexusServer> getNexusServers() {
return nexusServers;
}
}
Loading