Skip to content

Commit 9df162d

Browse files
authored
Merge pull request #3 from larhauga/add-routing-rules
add routing rule support
2 parents bad167e + 71cca90 commit 9df162d

File tree

4 files changed

+116
-1
lines changed

4 files changed

+116
-1
lines changed

src/main/java/com/weareadaptive/nexus/casc/plugin/internal/NexusCascPlugin.java

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.weareadaptive.nexus.casc.plugin.internal.config.*;
44
import org.apache.shiro.util.ThreadContext;
55
import org.eclipse.sisu.Description;
6+
import org.elasticsearch.cluster.metadata.MappingMetaData;
67
import org.sonatype.nexus.CoreApi;
78
import org.sonatype.nexus.blobstore.api.BlobStore;
89
import org.sonatype.nexus.blobstore.api.BlobStoreConfiguration;
@@ -14,10 +15,13 @@
1415
import org.sonatype.nexus.common.app.BaseUrlManager;
1516
import org.sonatype.nexus.common.app.ManagedLifecycle;
1617
import org.sonatype.nexus.common.app.NotWritableException;
18+
import org.sonatype.nexus.common.entity.EntityId;
1719
import org.sonatype.nexus.common.stateguard.StateGuardLifecycleSupport;
1820
import org.sonatype.nexus.repository.Repository;
21+
import org.sonatype.nexus.repository.routing.*;
1922
import org.sonatype.nexus.repository.config.Configuration;
2023
import org.sonatype.nexus.repository.manager.RepositoryManager;
24+
import org.sonatype.nexus.repository.security.RepositoryPermissionChecker;
2125
import org.sonatype.nexus.security.SecurityApi;
2226
import org.sonatype.nexus.security.SecuritySystem;
2327
import org.sonatype.nexus.security.authz.AuthorizationManager;
@@ -62,6 +66,9 @@ public class NexusCascPlugin extends StateGuardLifecycleSupport {
6266
private final BlobStoreManager blobStoreManager;
6367
private final RealmManager realmManager;
6468
private final CapabilityRegistry capabilityRegistry;
69+
private final RoutingRuleStore routingRuleStore;
70+
private final RoutingRuleHelper routingRuleHelper;
71+
private final RepositoryPermissionChecker repositoryPermissionChecker;
6572

6673
@Inject
6774
public NexusCascPlugin(
@@ -74,7 +81,11 @@ public NexusCascPlugin(
7481
final RepositoryManager repositoryManager,
7582
final BlobStoreManager blobStoreManager,
7683
final RealmManager realmManager,
77-
final CapabilityRegistry capabilityRegistry) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
84+
final CapabilityRegistry capabilityRegistry,
85+
final RoutingRuleStore routingRuleStore,
86+
final RoutingRuleHelper routingRuleHelper,
87+
final RepositoryPermissionChecker repositoryPermissionChecker
88+
) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
7889
this.baseUrlManager = baseUrlManager;
7990
this.coreApi = coreApi;
8091
this.securityApi = securityApi;
@@ -85,6 +96,9 @@ public NexusCascPlugin(
8596
this.repositoryManager = repositoryManager;
8697
this.realmManager = realmManager;
8798
this.capabilityRegistry = capabilityRegistry;
99+
this.routingRuleStore = routingRuleStore;
100+
this.routingRuleHelper = routingRuleHelper;
101+
this.repositoryPermissionChecker = repositoryPermissionChecker;
88102
}
89103

90104
@Override
@@ -381,6 +395,16 @@ private void applyRepositoryConfig(ConfigRepository repository) {
381395
log.warn("repository.pruneCleanupPolicies has no effect when no cleanup policies are configured!");
382396
}
383397

398+
if (repository.getRoutingRules() != null && !repository.getRoutingRules().isEmpty()) {
399+
repository.getRoutingRules().forEach(this::applyRoutingRuleConfig);
400+
routingRuleStore.list().forEach(existingRule -> {
401+
if (repository.getRoutingRules().stream().noneMatch(rr -> existingRule.name().equals(rr.getName()))) {
402+
log.info("Pruning routing rule {}", existingRule.name());
403+
routingRuleStore.delete(existingRule);
404+
}
405+
});
406+
}
407+
384408
if (repository.getRepositories() != null) {
385409
repository.getRepositories().forEach(repoConfig -> {
386410
Repository existingRepo = repositoryManager.get(repoConfig.getName());
@@ -396,6 +420,16 @@ private void applyRepositoryConfig(ConfigRepository repository) {
396420

397421
configuration.setAttributes(repoConfig.getAttributes());
398422

423+
if ( repoConfig.getRoutingRuleName() != null) {
424+
String ruleName = repoConfig.getRoutingRuleName();
425+
RoutingRule rule = routingRuleStore.getByName(ruleName);
426+
if (rule != null) {
427+
configuration.setRoutingRuleId(rule.id());
428+
} else {
429+
log.error("Routing rule {} does not exist", ruleName);
430+
}
431+
}
432+
399433
patchRepoAttributes(repoConfig.getAttributes());
400434

401435
if (repoConfig.getOnline() != null) {
@@ -476,6 +510,22 @@ private void patchRepoAttributes(Map<String, Map<String, Object>> attributes) {
476510
}
477511
}
478512

513+
private void applyRoutingRuleConfig(ConfigRoutingRule routingRuleConfig) {
514+
RoutingRule existingRule = routingRuleStore.getByName(routingRuleConfig.getName());
515+
if (existingRule != null) {
516+
existingRule.matchers(routingRuleConfig.getMatchers());
517+
existingRule.description(routingRuleConfig.getDescription());
518+
existingRule.mode(RoutingMode.valueOf(routingRuleConfig.getMode()));
519+
routingRuleStore.update(existingRule);
520+
} else {
521+
RoutingRule rule = routingRuleStore.newRoutingRule()
522+
.name(routingRuleConfig.getName())
523+
.description(routingRuleConfig.getDescription())
524+
.mode(RoutingMode.valueOf(routingRuleConfig.getMode()))
525+
.matchers(routingRuleConfig.getMatchers());
526+
routingRuleStore.create(rule);
527+
}
528+
}
479529
/**
480530
* Apply all configs related to security
481531
*

src/main/java/com/weareadaptive/nexus/casc/plugin/internal/config/ConfigRepository.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ public class ConfigRepository {
1010
private Boolean pruneRepositories;
1111
private List<ConfigRepositoryEntry> repositories;
1212

13+
private List<ConfigRoutingRule> routingRules;
14+
1315
public Boolean getPruneBlobStores() {
1416
return pruneBlobStores;
1517
}
@@ -57,4 +59,13 @@ public List<ConfigRepositoryEntry> getRepositories() {
5759
public void setRepositories(List<ConfigRepositoryEntry> repositories) {
5860
this.repositories = repositories;
5961
}
62+
63+
public List<ConfigRoutingRule> getRoutingRules() {
64+
return routingRules;
65+
}
66+
67+
public void setRoutingRules(List<ConfigRoutingRule> routingRules) {
68+
this.routingRules = routingRules;
69+
}
70+
6071
}

src/main/java/com/weareadaptive/nexus/casc/plugin/internal/config/ConfigRepositoryEntry.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.weareadaptive.nexus.casc.plugin.internal.config;
22

3+
import org.sonatype.nexus.common.entity.EntityId;
4+
35
import java.util.HashMap;
46
import java.util.Map;
57

@@ -9,6 +11,8 @@ public class ConfigRepositoryEntry {
911
private Boolean online;
1012
private Map<String, Map<String, Object>> attributes = new HashMap<>();
1113

14+
private String routingRuleName;
15+
1216
public String getName() {
1317
return name;
1418
}
@@ -40,4 +44,12 @@ public Map<String, Map<String, Object>> getAttributes() {
4044
public void setAttributes(Map<String, Map<String, Object>> attributes) {
4145
this.attributes = attributes;
4246
}
47+
public String getRoutingRuleName() {
48+
return routingRuleName;
49+
}
50+
51+
public void setRoutingRuleName(String routingRuleName) {
52+
this.routingRuleName = routingRuleName;
53+
}
54+
4355
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.weareadaptive.nexus.casc.plugin.internal.config;
2+
3+
import java.util.List;
4+
5+
public class ConfigRoutingRule {
6+
private String name;
7+
private String description;
8+
private String mode;
9+
private List<String> matchers;
10+
11+
public String getDescription() {
12+
return description;
13+
}
14+
15+
public void setDescription(String description) {
16+
this.description = description;
17+
}
18+
19+
public String getMode() {
20+
return mode;
21+
}
22+
23+
public void setMode(String mode) {
24+
this.mode = mode;
25+
}
26+
27+
public List<String> getMatchers() {
28+
return matchers;
29+
}
30+
31+
public void setMatchers(List<String> matchers) {
32+
this.matchers = matchers;
33+
}
34+
public String getName() {
35+
return name;
36+
}
37+
38+
public void setName(String name) {
39+
this.name = name;
40+
}
41+
42+
}

0 commit comments

Comments
 (0)