]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8952 fix rules: initialize uninitialized indexes on startup
authorDaniel Schwarz <daniel.schwarz@sonarsource.com>
Mon, 10 Apr 2017 09:28:39 +0000 (11:28 +0200)
committerDaniel Schwarz <bartfastiel@users.noreply.github.com>
Mon, 10 Apr 2017 16:05:42 +0000 (18:05 +0200)
server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexDefinition.java
server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexer.java
server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/ws/TagsActionTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangeParentActionTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/CreateActionTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/InheritanceActionTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java

index 9f94a9042f8497711fc55c83f27947806650d05d..9d15fea2e19a54de81bae4ea3f8a01ba4d5479b8 100644 (file)
@@ -38,7 +38,7 @@ import static org.sonar.server.es.DefaultIndexSettingsElement.SORTABLE_ANALYZER;
  */
 public class RuleIndexDefinition implements IndexDefinition {
 
-  private static final String INDEX = "rules";
+  static final String INDEX = "rules";
 
   public static final IndexType INDEX_TYPE_RULE = new IndexType(INDEX, "rule");
   public static final String FIELD_RULE_KEY = "key";
index 63e8ef982ac7431fabec691047cc6eb7031d2fdc..5c46815529ee16d26422e1eff7888416a559c834 100644 (file)
 package org.sonar.server.rule.index;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 import org.elasticsearch.action.index.IndexRequest;
 import org.sonar.api.rule.RuleKey;
+import org.sonar.db.DbClient;
+import org.sonar.db.DbSession;
 import org.sonar.db.organization.OrganizationDto;
 import org.sonar.server.es.BulkIndexer;
 import org.sonar.server.es.BulkIndexer.Size;
 import org.sonar.server.es.EsClient;
+import org.sonar.server.es.IndexType;
+import org.sonar.server.es.StartupIndexer;
+import org.sonar.server.organization.DefaultOrganizationProvider;
 
 import static org.sonar.server.rule.index.RuleIndexDefinition.INDEX_TYPE_RULE;
 
-public class RuleIndexer {
+public class RuleIndexer implements StartupIndexer {
 
   private final EsClient esClient;
+  private final DbClient dbClient;
   private final RuleIteratorFactory ruleIteratorFactory;
+  private final DefaultOrganizationProvider defaultOrganizationProvider;
 
-  public RuleIndexer(EsClient esClient, RuleIteratorFactory ruleIteratorFactory) {
+  public RuleIndexer(EsClient esClient, DbClient dbClient, RuleIteratorFactory ruleIteratorFactory, DefaultOrganizationProvider defaultOrganizationProvider) {
     this.esClient = esClient;
+    this.dbClient = dbClient;
     this.ruleIteratorFactory = ruleIteratorFactory;
+    this.defaultOrganizationProvider = defaultOrganizationProvider;
+  }
+
+  @Override
+  public Set<IndexType> getIndexTypes() {
+    return ImmutableSet.of(INDEX_TYPE_RULE);
+  }
+
+  @Override
+  public void indexOnStartup(Set<IndexType> uninitializedIndexTypes) {
+    BulkIndexer bulk = new BulkIndexer(esClient, RuleIndexDefinition.INDEX).setSize(Size.LARGE);
+
+    // index all definitions and system extensions
+    if (uninitializedIndexTypes.contains(INDEX_TYPE_RULE)) {
+      try(DbSession dbSession = dbClient.openSession(false)) {
+
+        String defaultOrganizationUuid = defaultOrganizationProvider.get().getUuid();
+        OrganizationDto defaultOrganization = dbClient.organizationDao().selectByUuid(dbSession, defaultOrganizationUuid)
+          .orElseThrow(() -> new IllegalStateException(String.format("Cannot load default organization for uuid '%s'", defaultOrganizationUuid)));
+
+        try (RuleIterator rules = new RuleIteratorForSingleChunk(dbClient, defaultOrganization, null)) {
+          doIndex(bulk, rules);
+        }
+      }
+    }
   }
 
   public void index(OrganizationDto organization, RuleKey ruleKey) {
index 2d58d6dd5bbdbff51deab31effc0b1f6df142d4a..4b86f20ec2067f65d9fbbc2d56c9f88d962fdc0d 100644 (file)
@@ -95,7 +95,7 @@ public class IssueIndexTest {
 
   private IssueIndexer issueIndexer = new IssueIndexer(tester.client(), new IssueIteratorFactory(null));
   private ViewIndexer viewIndexer = new ViewIndexer(null, tester.client());
-  private RuleIndexer ruleIndexer = new RuleIndexer(tester.client(), null);
+  private RuleIndexer ruleIndexer = new RuleIndexer(tester.client(), null, null, null);
   private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(tester, issueIndexer);
 
   private IssueIndex underTest = new IssueIndex(tester.client(), system2, userSessionRule, new AuthorizationTypeSupport(userSessionRule));
index 38b12219a5e7e372ab6d3308f3173b26d1c280c0..25410a41e22d2bf60ce918f35d0566c7969320bc 100644 (file)
@@ -63,7 +63,7 @@ public class TagsActionTest {
   public EsTester es = new EsTester(new IssueIndexDefinition(new MapSettings()), new RuleIndexDefinition(new MapSettings()));
 
   private IssueIndexer issueIndexer = new IssueIndexer(es.client(), new IssueIteratorFactory(db.getDbClient()));
-  private RuleIndexer ruleIndexer = new RuleIndexer(es.client(), new RuleIteratorFactory(db.getDbClient()));
+  private RuleIndexer ruleIndexer = new RuleIndexer(es.client(), null, new RuleIteratorFactory(db.getDbClient()), null);
   private IssueIndex issueIndex = new IssueIndex(es.client(), System2.INSTANCE, userSession, new AuthorizationTypeSupport(userSession));
 
   private WsActionTester tester = new WsActionTester(new TagsAction(issueIndex));
index faf25a4e75b11102bb79c907099b395ae5ab3ac0..bf47fd48f424029ae855e88549506e0627827c21 100644 (file)
@@ -105,7 +105,9 @@ public class ChangeParentActionTest {
     TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester);
     ruleIndexer = new RuleIndexer(
       esClient,
-      new RuleIteratorFactory(dbClient)
+      null,
+      new RuleIteratorFactory(dbClient),
+      null
     );
     activeRuleIndexer = new ActiveRuleIndexer(
       System2.INSTANCE,
index 24626a4b1f0d343a34fc62ce07d52afa8aab4ca2..f8af26088bd09c1082533a4964ed2ce8c146ae02 100644 (file)
@@ -94,7 +94,7 @@ public class CreateActionTest {
   private DbSession dbSession = dbTester.getSession();
   private RuleIndex ruleIndex = new RuleIndex(esTester.client());
   private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester);
-  private RuleIndexer ruleIndexer = new RuleIndexer(esTester.client(), new RuleIteratorFactory(dbClient));
+  private RuleIndexer ruleIndexer = new RuleIndexer(esTester.client(), null, new RuleIteratorFactory(dbClient), null);
   private ActiveRuleIndexer activeRuleIndexer = new ActiveRuleIndexer(system2, dbClient, esTester.client());
   private ProfileImporter[] profileImporters = createImporters();
   private QProfileExporters qProfileExporters = new QProfileExporters(dbClient, null,
index 8114a77021590f2f038e3992461787dacb156eca..e97f2e6c1f33257f6713592399974246e57abbf0 100644 (file)
@@ -85,7 +85,7 @@ public class InheritanceActionTest {
     dbClient = dbTester.getDbClient();
     dbSession = dbTester.getSession();
     esClient = esTester.client();
-    ruleIndexer = new RuleIndexer(esClient, new RuleIteratorFactory(dbClient));
+    ruleIndexer = new RuleIndexer(esClient, null, new RuleIteratorFactory(dbClient), null);
     activeRuleIndexer = new ActiveRuleIndexer(System2.INSTANCE, dbClient, esClient);
     TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester);
     underTest = new InheritanceAction(
index 11ed26165b79cf5f74c1d055e8f95b07aa7c4b3a..5264385530c0b8e1b958154f251ce3b9135a6f22 100644 (file)
@@ -86,7 +86,7 @@ public class RegisterRulesTest {
   @Before
   public void before() {
     when(system.now()).thenReturn(DATE1.getTime());
-    ruleIndexer = new RuleIndexer(esTester.client(), new RuleIteratorFactory(dbClient));
+    ruleIndexer = new RuleIndexer(esTester.client(), null, new RuleIteratorFactory(dbClient), null);
     ruleIndex = new RuleIndex(esTester.client());
     activeRuleIndexer = new ActiveRuleIndexer(system, dbClient, esTester.client());
   }
index f20dfc7dc5a3933607faf34cd1f13ec6f637d725..2e14dd23c996afa9074b6eb961784550f0d074a9 100644 (file)
@@ -85,7 +85,7 @@ public class RuleIndexTest {
 
   @Before
   public void setUp() {
-    ruleIndexer = new RuleIndexer(tester.client(), null);
+    ruleIndexer = new RuleIndexer(tester.client(), null, null, null);
     activeRuleIndexer = new ActiveRuleIndexer(system2, null, tester.client());
     index = new RuleIndex(tester.client());
   }
index fc9323266b3333ffcf17753ff462adf9ad0b6f86..f4581fd1e961af833a69a7e1b64a64b235b5d996 100644 (file)
@@ -34,6 +34,7 @@ import org.sonar.db.organization.OrganizationDto;
 import org.sonar.db.rule.RuleDefinitionDto;
 import org.sonar.db.rule.RuleDto;
 import org.sonar.server.es.EsTester;
+import org.sonar.server.organization.TestDefaultOrganizationProvider;
 
 import static com.google.common.collect.Sets.newHashSet;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -108,8 +109,20 @@ public class RuleIndexerTest {
     assertThat(esTester.countDocuments(RuleIndexDefinition.INDEX_TYPE_RULE)).isEqualTo(1);
   }
 
+  @Test
+  public void index_on_startup() {
+    RuleIndexer indexer = createIndexer();
+
+    // Create and Index rule
+    dbClient.ruleDao().insert(dbSession, rule.setStatus(RuleStatus.READY));
+    dbSession.commit();
+
+    indexer.indexOnStartup(indexer.getIndexTypes());
+    assertThat(esTester.countDocuments(RuleIndexDefinition.INDEX_TYPE_RULE)).isEqualTo(1);
+  }
+
   private RuleIndexer createIndexer() {
-    return new RuleIndexer(esTester.client(), new RuleIteratorFactory(dbTester.getDbClient()));
+    return new RuleIndexer(esTester.client(), dbClient, new RuleIteratorFactory(dbTester.getDbClient()), TestDefaultOrganizationProvider.from(dbTester));
   }
 
 }