Author: tommaso
Date: Fri Sep 19 12:31:46 2014
New Revision: 1626190
URL: http://svn.apache.org/r1626190
Log:
SLING-3953 - removed password info from agent config, using a service user
Modified:
sling/trunk/contrib/extensions/replication/core/README.md
sling/trunk/contrib/extensions/replication/core/pom.xml
sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/serialization/impl/AbstractReplicationPackageBuilder.java
sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/serialization/impl/vlt/FileVaultReplicationPackageBuilder.java
sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/serialization/impl/vlt/FileVaultReplicationPackageBuilderFactory.java
sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install.author/org.apache.sling.replication.agent.impl.CompactSimpleReplicationAgentFactory-publish-reverse.json
sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install.author/org.apache.sling.replication.agent.impl.CompactSimpleReplicationAgentFactory-publish.json
sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install.publish/org.apache.sling.replication.agent.impl.CompactSimpleReplicationAgentFactory-reverse.json
sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install/org.apache.sling.replication.serialization.impl.vlt.FileVaultReplicationPackageBuilderFactory-vlt.json
sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/serialization/impl/vlt/FileVaultReplicationPackageBuilderTest.java
sling/trunk/contrib/extensions/replication/it/src/test/java/org/apache/sling/replication/it/ReplicationIntegrationTestBase.java
Modified: sling/trunk/contrib/extensions/replication/core/README.md
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/README.md?rev=1626190&r1=1626189&r2=1626190&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/replication/core/README.md (original)
+++ sling/trunk/contrib/extensions/replication/core/README.md Fri Sep 19
12:31:46 2014
@@ -6,14 +6,21 @@ This is the README for the Sling Replica
Overview
========
-Configuration
-=============
+Replication agents
+------------------
+
+Each replication agent is an OSGi service and is resolved using a [Sling
Resource Provider](#Resource_Providers) who locate it under
`libs/sling/replication/services/agents`.
+Replication agents can be triggered by sending `HTTP POST` requests to
+
+`http://$host:$port/libs/sling/replication/services/agents/$agentname`
+
+with HTTP parameters `action` and `path`.
Resource providers
==================
One can configure a resource provider for a replication resource to give
access to OSGI replication services.
-Already configured ones are: ReplicationAgents, ReplicationPackageExporters
and ReplicationPackageImporters.
+Already configured ones are: _ReplicationAgents_,
_ReplicationPackageExporters_ and _ReplicationPackageImporters_.
Here is an example of the configuration for exposing _ReplicationAgent_
services as resources:
{
@@ -48,3 +55,75 @@ HTTP API
========
See the
[wiki](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=38572805).
+
+Replication agents configuration
+--------------------------------
+
+Replication agents configurations are proper OSGi configurations (backed by
nodes of type `sling:OsgiConfig` in the repository), see
[ReplicationAgentServiceFactory-publish.json](src/main/resources/SLING-CONTENT/libs/sling/replication/install.author/org.apache.sling.replication.agent.impl.CompactSimpleReplicationAgentFactory-publish.json).
+Replication agents configuration include:
+- Transport handlers: currently only basic HTTP is supported
+- Package builders: currently only FileVault packages are supported
+- Queue types: current implementations are:
+-- In memory
+-- Sling Job Handling based
+- Endpoint: URI of the resource to replicate to
+- Name: the name of the agent
+- Authentication handlers: currently supported user/password and `nop`
authentication handlers for HTTP transport
+- Queue distribution: how items (packages) to be replicated are distributed to
agent's queues
+
+Replication agents' configurations can be retrieved via `HTTP GET`:
+
+- `http -a admin:admin -v -f GET
http://localhost:8080/system/replication/agent/publish/configuration`
+- Replication agents' configurations can be updated via `HTTP POST`
+- `http -a admin:admin -v -f POST
http://localhost:8080/system/replication/agent/publish/configuration
enpoint=newendpoint`
+- Replication queues
+- In Memory queue
+- draft implementation using an in memory blocking queue together with a Sling
scheduled processor which periodically fetches the first item of each queue and
trigger a replication of such an item
+- not suitable for production as it's currently not persisted and therefore
restarting the bundle / platform would remove the queue
+- Sling Job Handling based queue
+- each queue addition triggers a Sling job creation
+- requires the creation of a Sling JobConsumer for the replication agent when
a replication agent is created / updated
+- by default Sling queues for replication are
+- ordered
+- with max priority
+- with infinite retries
+- keeping job history
+- Distribution of packages among queues:
+- a replication agent can be configured to use a specific queue distribution
mechanism
+- the queue distribution strategy defines how packages are routed into agent's
queues
+- current distribution strategies:
+- single: the agent has one only queue and all the items are routed there
+- priority path: the agent can route a configurable set of paths (note that
this configuration is global for the system, not per agent) to a dedicated
priority queue while all the others go to the default queue
+- error aware: the agent has one default queue for all the items, items
failing for a configurable amount of times are either dropped or moved to an
error queue
+- Direct replication use case
+- User makes an `HTTP POST`request to
`http://localhost:8080/system/replication/agent/publish` with parameter
`X-replication-action=ACTIVATE` and `X-replication-path=/content`
+- `ReplicationAgentServlet` servlet is triggered
+- `ReplicationAgentServlet` servlet provides the resource to a
`ReplicationAgent` by `ReplicationAgentResourceProvider`
+- Replication agent resource provider gets the OSGi service with name `publish`
+- `ReplicationAgent` executes the replication request (activate the node at
path /content)
+- `ReplicationAgent` get the status of the request and update the response
accordingly
+- `ReplicationAgentServlet` maps the agent response to an HTTP status
accordingly
+
+How to use it
+--------------
+
+- install the dependency bundles on all Sling instances
+- install Sling Replication core on all Sling instances
+- create some content on author (e.g. /content/sample1)
+- activate 'content' by sending an HTTP POST on sender:
+
+```http -a admin:admin -v -f POST
http://localhost:8080/libs/sling/replication/services/agents/publish action=ADD
path=/content```
+
+- deactivate 'content' by sending an HTTP POST on sender:
+
+```http -a admin:admin -v -f POST
http://localhost:8080/libs/sling/replication/services/agents/publish
action=DELETE path=/content```
+
+Open Tasks
+------------------------
+
+- [] distributed configuration
+- [] pushing to / pulling from JMS (pros: established pattern for
producers/consumers problems, cons: other library / systems involved as a
possible PoF)
+- [] WebSocket support (pros: once established it's bidirectional and
therefore also publish can directly push stuff to author)
+- [] asynchronous import of packages (pros: parallel transport and import,
cons: complex management of multiple queues on different publish instances)
+
+
Modified: sling/trunk/contrib/extensions/replication/core/pom.xml
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/pom.xml?rev=1626190&r1=1626189&r2=1626190&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/replication/core/pom.xml (original)
+++ sling/trunk/contrib/extensions/replication/core/pom.xml Fri Sep 19 12:31:46
2014
@@ -121,7 +121,7 @@
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.jcr.api</artifactId>
- <version>2.1.0</version>
+ <version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
Modified:
sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/serialization/impl/AbstractReplicationPackageBuilder.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/serialization/impl/AbstractReplicationPackageBuilder.java?rev=1626190&r1=1626189&r2=1626190&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/serialization/impl/AbstractReplicationPackageBuilder.java
(original)
+++
sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/serialization/impl/AbstractReplicationPackageBuilder.java
Fri Sep 19 12:31:46 2014
@@ -40,6 +40,11 @@ import org.slf4j.LoggerFactory;
public abstract class AbstractReplicationPackageBuilder implements
ReplicationPackageBuilder {
private final Logger log = LoggerFactory.getLogger(getClass());
+ private final String type;
+
+ public AbstractReplicationPackageBuilder(String type) {
+ this.type = type;
+ }
public ReplicationPackage createPackage(ReplicationRequest request)
throws ReplicationPackageBuildingException {
@@ -47,9 +52,9 @@ public abstract class AbstractReplicatio
if (ReplicationActionType.ADD.equals(request.getAction())) {
replicationPackage = createPackageForAdd(request);
} else if (ReplicationActionType.DELETE.equals(request.getAction())) {
- replicationPackage = new VoidReplicationPackage(request,
getName());
+ replicationPackage = new VoidReplicationPackage(request, type);
} else if (ReplicationActionType.POLL.equals(request.getAction())) {
- replicationPackage = new VoidReplicationPackage(request,
getName()); // TODO : change this
+ replicationPackage = new VoidReplicationPackage(request, type); //
TODO : change this
} else {
throw new ReplicationPackageBuildingException("unknown action type
"
+ request.getAction());
@@ -134,8 +139,6 @@ public abstract class AbstractReplicatio
return replicationPackage;
}
- protected abstract String getName();
-
protected abstract Session getSession() throws RepositoryException;
protected abstract ReplicationPackage readPackageInternal(InputStream
stream)
Modified:
sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/serialization/impl/vlt/FileVaultReplicationPackageBuilder.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/serialization/impl/vlt/FileVaultReplicationPackageBuilder.java?rev=1626190&r1=1626189&r2=1626190&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/serialization/impl/vlt/FileVaultReplicationPackageBuilder.java
(original)
+++
sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/serialization/impl/vlt/FileVaultReplicationPackageBuilder.java
Fri Sep 19 12:31:46 2014
@@ -61,18 +61,16 @@ public class FileVaultReplicationPackage
private SlingRepository repository;
- private Packaging packaging;
+ private final Packaging packaging;
- private String username;
- private String password;
- private String type;
-
- public FileVaultReplicationPackageBuilder(String type, String username,
String password,
- SlingRepository repository,
Packaging packaging) {
- this.type = type;
+ private final String subServiceName;
- this.username = username;
- this.password = password;
+ private static final String TYPE = "vlt";
+
+ public FileVaultReplicationPackageBuilder(String subServiceName,
SlingRepository repository, Packaging packaging) {
+ super(TYPE);
+
+ this.subServiceName = subServiceName;
this.repository = repository;
this.packaging = packaging;
}
@@ -117,13 +115,8 @@ public class FileVaultReplicationPackage
}
@Override
- protected String getName() {
- return type;
- }
-
- @Override
protected Session getSession() throws RepositoryException {
- return repository.login(new SimpleCredentials(username,
password.toCharArray()));
+ return repository.loginService(subServiceName, null);
}
@Override
Modified:
sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/serialization/impl/vlt/FileVaultReplicationPackageBuilderFactory.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/serialization/impl/vlt/FileVaultReplicationPackageBuilderFactory.java?rev=1626190&r1=1626189&r2=1626190&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/serialization/impl/vlt/FileVaultReplicationPackageBuilderFactory.java
(original)
+++
sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/serialization/impl/vlt/FileVaultReplicationPackageBuilderFactory.java
Fri Sep 19 12:31:46 2014
@@ -64,10 +64,7 @@ public class FileVaultReplicationPackage
public static final String NAME = "name";
@Property
- public static final String USERNAME = "username";
-
- @Property
- public static final String PASSWORD = "password";
+ public static final String SERVICENAME = "servicename";
@Reference
private SlingRepository repository;
@@ -83,20 +80,14 @@ public class FileVaultReplicationPackage
String name = PropertiesUtil.toString(config.get(NAME), "").trim();
- String username = PropertiesUtil.toString(config.get(USERNAME),
"").trim();
- String password = PropertiesUtil.toString(config.get(PASSWORD),
"").trim();
if (name.length() == 0) {
throw new IllegalArgumentException("name must not be empty");
}
- if (username.length() == 0 || password.length() == 0) {
- throw new IllegalArgumentException("Username and password cannot
be empty");
- }
+
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(NAME, name);
- props.put(USERNAME, username);
- props.put(PASSWORD, password);
- ReplicationPackageBuilder replicationPackageBuilder = new
FileVaultReplicationPackageBuilder(name, username, password, repository,
packaging);
+ ReplicationPackageBuilder replicationPackageBuilder =
getInstance(config, repository, packaging);
builderReg =
context.registerService(ReplicationPackageBuilder.class.getName(),
replicationPackageBuilder, props);
}
@@ -112,12 +103,15 @@ public class FileVaultReplicationPackage
public static FileVaultReplicationPackageBuilder getInstance(Map<String,
Object> config,
SlingRepository repository, Packaging packaging) {
- String username = PropertiesUtil.toString(config.get(USERNAME),
"").trim();
- String password = PropertiesUtil.toString(config.get(PASSWORD),
"").trim();
- if (username.length() == 0 || password.length() == 0) {
- throw new IllegalArgumentException("Username and password cannot
be empty");
+
+
+ String serviceName = PropertiesUtil.toString(config.get(SERVICENAME),
"").trim();
+
+ if (serviceName.length() == 0) {
+ throw new IllegalArgumentException("Service Name cannot be empty");
}
- return new FileVaultReplicationPackageBuilder(NAME, username,
password, repository, packaging);
+
+ return new FileVaultReplicationPackageBuilder(serviceName, repository,
packaging);
}
Modified:
sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install.author/org.apache.sling.replication.agent.impl.CompactSimpleReplicationAgentFactory-publish-reverse.json
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install.author/org.apache.sling.replication.agent.impl.CompactSimpleReplicationAgentFactory-publish-reverse.json?rev=1626190&r1=1626189&r2=1626190&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install.author/org.apache.sling.replication.agent.impl.CompactSimpleReplicationAgentFactory-publish-reverse.json
(original)
+++
sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install.author/org.apache.sling.replication.agent.impl.CompactSimpleReplicationAgentFactory-publish-reverse.json
Fri Sep 19 12:31:46 2014
@@ -13,15 +13,13 @@
"authenticationFactory/name=user",
"packageBuilder/type=vlt",
- "packageBuilder/username=admin",
- "packageBuilder/password=admin"
+ "packageBuilder/servicename=replicationService"
],
"packageImporter": [
"type=local",
"packageBuilder/type=vlt",
- "packageBuilder/username=admin",
- "packageBuilder/password=admin"
+ "packageBuilder/servicename=replicationService"
],
"queueProvider" : [
Modified:
sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install.author/org.apache.sling.replication.agent.impl.CompactSimpleReplicationAgentFactory-publish.json
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install.author/org.apache.sling.replication.agent.impl.CompactSimpleReplicationAgentFactory-publish.json?rev=1626190&r1=1626189&r2=1626190&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install.author/org.apache.sling.replication.agent.impl.CompactSimpleReplicationAgentFactory-publish.json
(original)
+++
sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install.author/org.apache.sling.replication.agent.impl.CompactSimpleReplicationAgentFactory-publish.json
Fri Sep 19 12:31:46 2014
@@ -6,8 +6,7 @@
"packageExporter" : [
"type=local",
"packageBuilder/type=vlt",
- "packageBuilder/username=admin",
- "packageBuilder/password=admin"
+ "packageBuilder/servicename=replicationService"
],
"packageImporter": [
@@ -18,8 +17,7 @@
"authenticationFactory/type=service",
"authenticationFactory/name=user",
"packageBuilder/type=vlt",
- "packageBuilder/username=admin",
- "packageBuilder/password=admin"
+ "packageBuilder/servicename=replicationService"
],
"queueProvider" : [
Modified:
sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install.publish/org.apache.sling.replication.agent.impl.CompactSimpleReplicationAgentFactory-reverse.json
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install.publish/org.apache.sling.replication.agent.impl.CompactSimpleReplicationAgentFactory-reverse.json?rev=1626190&r1=1626189&r2=1626190&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install.publish/org.apache.sling.replication.agent.impl.CompactSimpleReplicationAgentFactory-reverse.json
(original)
+++
sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install.publish/org.apache.sling.replication.agent.impl.CompactSimpleReplicationAgentFactory-reverse.json
Fri Sep 19 12:31:46 2014
@@ -8,15 +8,13 @@
"packageExporter" : [
"type=local",
"packageBuilder/type=vlt",
- "packageBuilder/username=admin",
- "packageBuilder/password=admin"
+ "packageBuilder/servicename=replicationService"
],
"packageImporter": [
"type=local",
"packageBuilder/type=vlt",
- "packageBuilder/username=admin",
- "packageBuilder/password=admin"
+ "packageBuilder/servicename=replicationService"
],
"queueProvider" : [
Modified:
sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install/org.apache.sling.replication.serialization.impl.vlt.FileVaultReplicationPackageBuilderFactory-vlt.json
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install/org.apache.sling.replication.serialization.impl.vlt.FileVaultReplicationPackageBuilderFactory-vlt.json?rev=1626190&r1=1626189&r2=1626190&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install/org.apache.sling.replication.serialization.impl.vlt.FileVaultReplicationPackageBuilderFactory-vlt.json
(original)
+++
sling/trunk/contrib/extensions/replication/core/src/main/resources/SLING-CONTENT/libs/sling/replication/install/org.apache.sling.replication.serialization.impl.vlt.FileVaultReplicationPackageBuilderFactory-vlt.json
Fri Sep 19 12:31:46 2014
@@ -1,6 +1,5 @@
{
"jcr:primaryType" : "sling:OsgiConfig",
"name" : "vlt",
- "username" : "admin",
- "password" : "admin"
+ "servicename" : "replicationService"
}
\ No newline at end of file
Modified:
sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/serialization/impl/vlt/FileVaultReplicationPackageBuilderTest.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/serialization/impl/vlt/FileVaultReplicationPackageBuilderTest.java?rev=1626190&r1=1626189&r2=1626190&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/serialization/impl/vlt/FileVaultReplicationPackageBuilderTest.java
(original)
+++
sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/serialization/impl/vlt/FileVaultReplicationPackageBuilderTest.java
Fri Sep 19 12:31:46 2014
@@ -38,8 +38,7 @@ public class FileVaultReplicationPackage
SlingRepository repository = mock(SlingRepository.class);
Packaging packaging = mock(Packaging.class);
- FileVaultReplicationPackageBuilder
fileVaultReplicationPackageBuilder = new
FileVaultReplicationPackageBuilder("vlt",
- null, null, repository, packaging);
+ FileVaultReplicationPackageBuilder
fileVaultReplicationPackageBuilder = new
FileVaultReplicationPackageBuilder(null, repository, packaging);
ReplicationRequest request = mock(ReplicationRequest.class);
fileVaultReplicationPackageBuilder.createPackageForAdd(request);
Modified:
sling/trunk/contrib/extensions/replication/it/src/test/java/org/apache/sling/replication/it/ReplicationIntegrationTestBase.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/it/src/test/java/org/apache/sling/replication/it/ReplicationIntegrationTestBase.java?rev=1626190&r1=1626189&r2=1626190&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/replication/it/src/test/java/org/apache/sling/replication/it/ReplicationIntegrationTestBase.java
(original)
+++
sling/trunk/contrib/extensions/replication/it/src/test/java/org/apache/sling/replication/it/ReplicationIntegrationTestBase.java
Fri Sep 19 12:31:46 2014
@@ -65,8 +65,7 @@ public abstract class ReplicationIntegra
"packageImporter", "authenticationFactory/type=service",
"packageImporter", "authenticationFactory/name=user",
"packageImporter", "packageBuilder/type=vlt",
- "packageImporter", "packageBuilder/username=admin",
- "packageImporter", "packageBuilder/password=admin");
+ "packageImporter",
"packageBuilder/servicename=replicationService");
Thread.sleep(3000);
@@ -83,8 +82,7 @@ public abstract class ReplicationIntegra
"packageExporter", "authenticationFactory/type=service",
"packageExporter", "authenticationFactory/name=user",
"packageExporter", "packageBuilder/type=vlt",
- "packageExporter", "packageBuilder/username=admin",
- "packageExporter", "packageBuilder/password=admin");
+ "packageExporter",
"packageBuilder/servicename=replicationService");
Thread.sleep(3000);
assertExists(authorClient, agentUrl("publish-reverse"));