33import com .weareadaptive .nexus .casc .plugin .internal .config .*;
44import org .apache .shiro .util .ThreadContext ;
55import org .eclipse .sisu .Description ;
6+ import org .elasticsearch .cluster .metadata .MappingMetaData ;
67import org .sonatype .nexus .CoreApi ;
78import org .sonatype .nexus .blobstore .api .BlobStore ;
89import org .sonatype .nexus .blobstore .api .BlobStoreConfiguration ;
1415import org .sonatype .nexus .common .app .BaseUrlManager ;
1516import org .sonatype .nexus .common .app .ManagedLifecycle ;
1617import org .sonatype .nexus .common .app .NotWritableException ;
18+ import org .sonatype .nexus .common .entity .EntityId ;
1719import org .sonatype .nexus .common .stateguard .StateGuardLifecycleSupport ;
1820import org .sonatype .nexus .repository .Repository ;
21+ import org .sonatype .nexus .repository .routing .*;
1922import org .sonatype .nexus .repository .config .Configuration ;
2023import org .sonatype .nexus .repository .manager .RepositoryManager ;
24+ import org .sonatype .nexus .repository .security .RepositoryPermissionChecker ;
2125import org .sonatype .nexus .security .SecurityApi ;
2226import org .sonatype .nexus .security .SecuritySystem ;
2327import 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 *
0 commit comments