Skip to content

Commit

Permalink
SONAR-8474 set organization uuid of components to uuid of task
Browse files Browse the repository at this point in the history
for the time being, the organization uuid of a task is either the one of the component the task is associated to, or the default organization
  • Loading branch information
sns-seb committed Jan 16, 2017
1 parent db3a220 commit 14944eb
Show file tree
Hide file tree
Showing 22 changed files with 404 additions and 137 deletions.
Expand Up @@ -37,25 +37,29 @@
import org.sonar.db.ce.CeActivityDto; import org.sonar.db.ce.CeActivityDto;
import org.sonar.db.ce.CeQueueDto; import org.sonar.db.ce.CeQueueDto;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.server.organization.DefaultOrganizationProvider;


import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Preconditions.checkState;
import static com.google.common.base.Predicates.notNull; import static com.google.common.base.Predicates.notNull;
import static com.google.common.collect.FluentIterable.from; import static com.google.common.collect.FluentIterable.from;
import static java.util.Collections.singleton; import static java.util.Collections.singleton;
import static java.util.Objects.requireNonNull;
import static org.sonar.db.component.ComponentDtoFunctions.toUuid; import static org.sonar.db.component.ComponentDtoFunctions.toUuid;


@ComputeEngineSide @ComputeEngineSide
public class CeQueueImpl implements CeQueue { public class CeQueueImpl implements CeQueue {


private final DbClient dbClient; private final DbClient dbClient;
private final UuidFactory uuidFactory; private final UuidFactory uuidFactory;
private final DefaultOrganizationProvider defaultOrganizationProvider;


// state // state
private AtomicBoolean submitPaused = new AtomicBoolean(false); private AtomicBoolean submitPaused = new AtomicBoolean(false);


public CeQueueImpl(DbClient dbClient, UuidFactory uuidFactory) { public CeQueueImpl(DbClient dbClient, UuidFactory uuidFactory, DefaultOrganizationProvider defaultOrganizationProvider) {
this.dbClient = dbClient; this.dbClient = dbClient;
this.uuidFactory = uuidFactory; this.uuidFactory = uuidFactory;
this.defaultOrganizationProvider = defaultOrganizationProvider;
} }


@Override @Override
Expand Down Expand Up @@ -102,13 +106,13 @@ public List<CeTask> massSubmit(Collection<CeTaskSubmit> submissions) {


protected CeTask loadTask(DbSession dbSession, CeQueueDto dto) { protected CeTask loadTask(DbSession dbSession, CeQueueDto dto) {
if (dto.getComponentUuid() == null) { if (dto.getComponentUuid() == null) {
return new CeQueueDtoToCeTask().apply(dto); return new CeQueueDtoToCeTask(defaultOrganizationProvider.get().getUuid()).apply(dto);
} }
Optional<ComponentDto> componentDto = dbClient.componentDao().selectByUuid(dbSession, dto.getComponentUuid()); Optional<ComponentDto> componentDto = dbClient.componentDao().selectByUuid(dbSession, dto.getComponentUuid());
if (componentDto.isPresent()) { if (componentDto.isPresent()) {
return new CeQueueDtoToCeTask(ImmutableMap.of(dto.getComponentUuid(), componentDto.get())).apply(dto); return new CeQueueDtoToCeTask(defaultOrganizationProvider.get().getUuid(), ImmutableMap.of(dto.getComponentUuid(), componentDto.get())).apply(dto);
} }
return new CeQueueDtoToCeTask().apply(dto); return new CeQueueDtoToCeTask(defaultOrganizationProvider.get().getUuid()).apply(dto);
} }


private List<CeTask> loadTasks(DbSession dbSession, List<CeQueueDto> dtos) { private List<CeTask> loadTasks(DbSession dbSession, List<CeQueueDto> dtos) {
Expand All @@ -121,7 +125,7 @@ private List<CeTask> loadTasks(DbSession dbSession, List<CeQueueDto> dtos) {
.uniqueIndex(toUuid()); .uniqueIndex(toUuid());


return from(dtos) return from(dtos)
.transform(new CeQueueDtoToCeTask(componentDtoByUuid)) .transform(new CeQueueDtoToCeTask(defaultOrganizationProvider.get().getUuid(), componentDtoByUuid))
.toList(); .toList();
} }


Expand Down Expand Up @@ -191,13 +195,15 @@ public boolean isSubmitPaused() {
} }


private static class CeQueueDtoToCeTask implements Function<CeQueueDto, CeTask> { private static class CeQueueDtoToCeTask implements Function<CeQueueDto, CeTask> {
private final String defaultOrganizationUuid;
private final Map<String, ComponentDto> componentDtoByUuid; private final Map<String, ComponentDto> componentDtoByUuid;


public CeQueueDtoToCeTask() { public CeQueueDtoToCeTask(String defaultOrganizationUuid) {
this.componentDtoByUuid = Collections.emptyMap(); this(defaultOrganizationUuid, Collections.emptyMap());
} }


public CeQueueDtoToCeTask(Map<String, ComponentDto> componentDtoByUuid) { public CeQueueDtoToCeTask(String defaultOrganizationUuid, Map<String, ComponentDto> componentDtoByUuid) {
this.defaultOrganizationUuid = requireNonNull(defaultOrganizationUuid, "defaultOrganizationUuid can't be null");
this.componentDtoByUuid = componentDtoByUuid; this.componentDtoByUuid = componentDtoByUuid;
} }


Expand All @@ -213,10 +219,15 @@ public CeTask apply(@Nonnull CeQueueDto dto) {
builder.setComponentUuid(componentUuid); builder.setComponentUuid(componentUuid);
ComponentDto component = componentDtoByUuid.get(componentUuid); ComponentDto component = componentDtoByUuid.get(componentUuid);
if (component != null) { if (component != null) {
builder.setOrganizationUuid(component.getOrganizationUuid());
builder.setComponentKey(component.getKey()); builder.setComponentKey(component.getKey());
builder.setComponentName(component.name()); builder.setComponentName(component.name());
} }
} }
// fixme this should be set from the CeQueueDto
if (!builder.hasOrganizationUuid()) {
builder.setOrganizationUuid(defaultOrganizationUuid);
}
return builder.build(); return builder.build();
} }
} }
Expand Down
28 changes: 24 additions & 4 deletions server/sonar-server/src/main/java/org/sonar/ce/queue/CeTask.java
Expand Up @@ -30,6 +30,7 @@
@Immutable @Immutable
public class CeTask { public class CeTask {


private final String organizationUuid;
private final String type; private final String type;
private final String uuid; private final String uuid;
private final String componentUuid; private final String componentUuid;
Expand All @@ -38,14 +39,19 @@ public class CeTask {
private final String submitterLogin; private final String submitterLogin;


private CeTask(Builder builder) { private CeTask(Builder builder) {
this.uuid = requireNonNull(emptyToNull(builder.uuid)); this.organizationUuid = requireNonNull(emptyToNull(builder.organizationUuid), "organizationUuid can't be null nor empty");
this.type = requireNonNull(emptyToNull(builder.type)); this.uuid = requireNonNull(emptyToNull(builder.uuid), "uuid can't be null nor empty");
this.type = requireNonNull(emptyToNull(builder.type), "type can't be null nor empty");
this.componentUuid = emptyToNull(builder.componentUuid); this.componentUuid = emptyToNull(builder.componentUuid);
this.componentKey = emptyToNull(builder.componentKey); this.componentKey = emptyToNull(builder.componentKey);
this.componentName = emptyToNull(builder.componentName); this.componentName = emptyToNull(builder.componentName);
this.submitterLogin = emptyToNull(builder.submitterLogin); this.submitterLogin = emptyToNull(builder.submitterLogin);
} }


public String getOrganizationUuid() {
return organizationUuid;
}

public String getUuid() { public String getUuid() {
return uuid; return uuid;
} }
Expand Down Expand Up @@ -77,9 +83,12 @@ public String getSubmitterLogin() {
@Override @Override
public String toString() { public String toString() {
return MoreObjects.toStringHelper(this) return MoreObjects.toStringHelper(this)
.add("componentUuid", componentUuid) .add("organizationUuid", organizationUuid)
.add("uuid", uuid)
.add("type", type) .add("type", type)
.add("uuid", uuid)
.add("componentUuid", componentUuid)
.add("componentKey", componentKey)
.add("componentName", componentName)
.add("submitterLogin", submitterLogin) .add("submitterLogin", submitterLogin)
.toString(); .toString();
} }
Expand All @@ -102,13 +111,24 @@ public int hashCode() {
} }


public static final class Builder { public static final class Builder {
private String organizationUuid;
private String uuid; private String uuid;
private String type; private String type;
private String componentUuid; private String componentUuid;
private String componentKey; private String componentKey;
private String componentName; private String componentName;
private String submitterLogin; private String submitterLogin;


public Builder setOrganizationUuid(String organizationUuid) {
this.organizationUuid = organizationUuid;
return this;
}

// FIXME remove this method when organization support is added to the Compute Engine queue
public boolean hasOrganizationUuid() {
return organizationUuid != null;
}

public Builder setUuid(String uuid) { public Builder setUuid(String uuid) {
this.uuid = uuid; this.uuid = uuid;
return this; return this;
Expand Down
Expand Up @@ -39,6 +39,7 @@
import org.sonar.db.DbSession; import org.sonar.db.DbSession;
import org.sonar.db.ce.CeActivityDto; import org.sonar.db.ce.CeActivityDto;
import org.sonar.db.ce.CeQueueDto; import org.sonar.db.ce.CeQueueDto;
import org.sonar.server.organization.DefaultOrganizationProvider;


import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Preconditions.checkState;
Expand All @@ -53,8 +54,9 @@ public class InternalCeQueueImpl extends CeQueueImpl implements InternalCeQueue
// state // state
private AtomicBoolean peekPaused = new AtomicBoolean(false); private AtomicBoolean peekPaused = new AtomicBoolean(false);


public InternalCeQueueImpl(System2 system2, DbClient dbClient, UuidFactory uuidFactory, CEQueueStatus queueStatus) { public InternalCeQueueImpl(System2 system2, DbClient dbClient, UuidFactory uuidFactory, CEQueueStatus queueStatus,
super(dbClient, uuidFactory); DefaultOrganizationProvider defaultOrganizationProvider) {
super(dbClient, uuidFactory, defaultOrganizationProvider);
this.system2 = system2; this.system2 = system2;
this.dbClient = dbClient; this.dbClient = dbClient;
this.queueStatus = queueStatus; this.queueStatus = queueStatus;
Expand Down Expand Up @@ -127,7 +129,7 @@ private static void updateError(CeActivityDto activityDto, @Nullable Throwable e
@CheckForNull @CheckForNull
private static String getStackTraceForPersistence(Throwable error) { private static String getStackTraceForPersistence(Throwable error) {
try (ByteArrayOutputStream out = new ByteArrayOutputStream(); try (ByteArrayOutputStream out = new ByteArrayOutputStream();
LineReturnEnforcedPrintStream printStream = new LineReturnEnforcedPrintStream(out)) { LineReturnEnforcedPrintStream printStream = new LineReturnEnforcedPrintStream(out)) {
error.printStackTrace(printStream); error.printStackTrace(printStream);
printStream.flush(); printStream.flush();
return out.toString(); return out.toString();
Expand Down
Expand Up @@ -25,6 +25,12 @@


public interface AnalysisMetadataHolder { public interface AnalysisMetadataHolder {


/**
* Returns the UUID of the organization the analysis belongs to.
* @throws IllegalStateException if organization uuid has not been set
*/
String getOrganizationUuid();

/** /**
* Returns the UUID generated for this analysis. * Returns the UUID generated for this analysis.
* @throws IllegalStateException if uuid has not been set * @throws IllegalStateException if uuid has not been set
Expand Down
Expand Up @@ -27,34 +27,38 @@
import org.sonar.server.qualityprofile.QualityProfile; import org.sonar.server.qualityprofile.QualityProfile;


import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Preconditions.checkState;
import static java.util.Objects.requireNonNull;


public class AnalysisMetadataHolderImpl implements MutableAnalysisMetadataHolder { public class AnalysisMetadataHolderImpl implements MutableAnalysisMetadataHolder {


private final InitializedProperty<String> organizationUuid = new InitializedProperty<>();
private final InitializedProperty<String> uuid = new InitializedProperty<>(); private final InitializedProperty<String> uuid = new InitializedProperty<>();

private final InitializedProperty<Long> analysisDate = new InitializedProperty<>(); private final InitializedProperty<Long> analysisDate = new InitializedProperty<>();

private final InitializedProperty<Analysis> baseProjectSnapshot = new InitializedProperty<>(); private final InitializedProperty<Analysis> baseProjectSnapshot = new InitializedProperty<>();

private final InitializedProperty<Boolean> crossProjectDuplicationEnabled = new InitializedProperty<>(); private final InitializedProperty<Boolean> crossProjectDuplicationEnabled = new InitializedProperty<>();

private final InitializedProperty<String> branch = new InitializedProperty<>(); private final InitializedProperty<String> branch = new InitializedProperty<>();

private final InitializedProperty<Integer> rootComponentRef = new InitializedProperty<>(); private final InitializedProperty<Integer> rootComponentRef = new InitializedProperty<>();

private final InitializedProperty<Map<String, QualityProfile>> qProfilesPerLanguage = new InitializedProperty<>(); private final InitializedProperty<Map<String, QualityProfile>> qProfilesPerLanguage = new InitializedProperty<>();


@Override @Override
public MutableAnalysisMetadataHolder setUuid(String s) { public MutableAnalysisMetadataHolder setOrganizationUuid(String organizationUuid) {
checkState(!uuid.isInitialized(), "Analysis uuid has already been set"); checkState(!this.organizationUuid.isInitialized(), "Organization uuid has already been set");
this.uuid.setProperty(s); requireNonNull(organizationUuid, "Organization uuid can't be null");
this.organizationUuid.setProperty(organizationUuid);
return this; return this;
} }


@Override @Override
public MutableAnalysisMetadataHolder setAnalysisDate(long date) { public String getOrganizationUuid() {
checkState(!analysisDate.isInitialized(), "Analysis date has already been set"); checkState(organizationUuid.isInitialized(), "Organization uuid has not been set");
this.analysisDate.setProperty(date); return organizationUuid.getProperty();
}

@Override
public MutableAnalysisMetadataHolder setUuid(String s) {
checkState(!uuid.isInitialized(), "Analysis uuid has already been set");
requireNonNull(s, "Analysis uuid can't be null");
this.uuid.setProperty(s);
return this; return this;
} }


Expand All @@ -64,6 +68,13 @@ public String getUuid() {
return this.uuid.getProperty(); return this.uuid.getProperty();
} }


@Override
public MutableAnalysisMetadataHolder setAnalysisDate(long date) {
checkState(!analysisDate.isInitialized(), "Analysis date has already been set");
this.analysisDate.setProperty(date);
return this;
}

@Override @Override
public long getAnalysisDate() { public long getAnalysisDate() {
checkState(analysisDate.isInitialized(), "Analysis date has not been set"); checkState(analysisDate.isInitialized(), "Analysis date has not been set");
Expand Down
Expand Up @@ -25,6 +25,11 @@


public interface MutableAnalysisMetadataHolder extends AnalysisMetadataHolder { public interface MutableAnalysisMetadataHolder extends AnalysisMetadataHolder {


/**
* @throws IllegalStateException if the organization uuid has already been set
*/
MutableAnalysisMetadataHolder setOrganizationUuid(String organizationUuid);

/** /**
* @throws IllegalStateException if the analysis uuid has already been set * @throws IllegalStateException if the analysis uuid has already been set
*/ */
Expand Down
Expand Up @@ -69,6 +69,7 @@ public void execute() {
mutableAnalysisMetadataHolder.setBranch(isNotEmpty(reportMetadata.getBranch()) ? reportMetadata.getBranch() : null); mutableAnalysisMetadataHolder.setBranch(isNotEmpty(reportMetadata.getBranch()) ? reportMetadata.getBranch() : null);
mutableAnalysisMetadataHolder.setCrossProjectDuplicationEnabled(reportMetadata.getCrossProjectDuplicationActivated()); mutableAnalysisMetadataHolder.setCrossProjectDuplicationEnabled(reportMetadata.getCrossProjectDuplicationActivated());
mutableAnalysisMetadataHolder.setQProfilesByLanguage(transformValues(reportMetadata.getQprofilesPerLanguage(), TO_COMPUTE_QPROFILE)); mutableAnalysisMetadataHolder.setQProfilesByLanguage(transformValues(reportMetadata.getQprofilesPerLanguage(), TO_COMPUTE_QPROFILE));
mutableAnalysisMetadataHolder.setOrganizationUuid(ceTask.getOrganizationUuid());
} }


private void checkProjectKeyConsistency(ScannerReport.Metadata reportMetadata) { private void checkProjectKeyConsistency(ScannerReport.Metadata reportMetadata) {
Expand Down
Expand Up @@ -37,6 +37,7 @@
import org.sonar.db.DbSession; import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentUpdateDto; import org.sonar.db.component.ComponentUpdateDto;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.server.computation.task.projectanalysis.component.Component; import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.component.CrawlerDepthLimit; import org.sonar.server.computation.task.projectanalysis.component.CrawlerDepthLimit;
import org.sonar.server.computation.task.projectanalysis.component.DbIdsRepositoryImpl; import org.sonar.server.computation.task.projectanalysis.component.DbIdsRepositoryImpl;
Expand All @@ -47,7 +48,6 @@
import org.sonar.server.computation.task.projectanalysis.component.PathAwareVisitorAdapter; import org.sonar.server.computation.task.projectanalysis.component.PathAwareVisitorAdapter;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolder; import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolder;
import org.sonar.server.computation.task.step.ComputationStep; import org.sonar.server.computation.task.step.ComputationStep;
import org.sonar.server.organization.DefaultOrganizationProvider;


import static com.google.common.collect.FluentIterable.from; import static com.google.common.collect.FluentIterable.from;
import static org.sonar.db.component.ComponentDto.UUID_PATH_OF_ROOT; import static org.sonar.db.component.ComponentDto.UUID_PATH_OF_ROOT;
Expand All @@ -65,18 +65,17 @@ public class PersistComponentsStep implements ComputationStep {
private final MutableDbIdsRepository dbIdsRepository; private final MutableDbIdsRepository dbIdsRepository;
private final System2 system2; private final System2 system2;
private final MutableDisabledComponentsHolder disabledComponentsHolder; private final MutableDisabledComponentsHolder disabledComponentsHolder;
private final DefaultOrganizationProvider defaultOrganizationProvider; private final AnalysisMetadataHolder analysisMetadataHolder;


public PersistComponentsStep(DbClient dbClient, TreeRootHolder treeRootHolder, public PersistComponentsStep(DbClient dbClient, TreeRootHolder treeRootHolder,
MutableDbIdsRepository dbIdsRepository, System2 system2, MutableDbIdsRepository dbIdsRepository, System2 system2,
MutableDisabledComponentsHolder disabledComponentsHolder, MutableDisabledComponentsHolder disabledComponentsHolder, AnalysisMetadataHolder analysisMetadataHolder) {
DefaultOrganizationProvider defaultOrganizationProvider) {
this.dbClient = dbClient; this.dbClient = dbClient;
this.treeRootHolder = treeRootHolder; this.treeRootHolder = treeRootHolder;
this.dbIdsRepository = dbIdsRepository; this.dbIdsRepository = dbIdsRepository;
this.system2 = system2; this.system2 = system2;
this.disabledComponentsHolder = disabledComponentsHolder; this.disabledComponentsHolder = disabledComponentsHolder;
this.defaultOrganizationProvider = defaultOrganizationProvider; this.analysisMetadataHolder = analysisMetadataHolder;
} }


@Override @Override
Expand Down Expand Up @@ -349,7 +348,7 @@ private ComponentDto createBase(Component component) {
String componentUuid = component.getUuid(); String componentUuid = component.getUuid();


ComponentDto componentDto = new ComponentDto(); ComponentDto componentDto = new ComponentDto();
componentDto.setOrganizationUuid(defaultOrganizationProvider.get().getUuid()); componentDto.setOrganizationUuid(analysisMetadataHolder.getOrganizationUuid());
componentDto.setUuid(componentUuid); componentDto.setUuid(componentUuid);
componentDto.setKey(componentKey); componentDto.setKey(componentKey);
componentDto.setDeprecatedKey(componentKey); componentDto.setDeprecatedKey(componentKey);
Expand Down
Expand Up @@ -36,24 +36,28 @@
import org.sonar.db.ce.CeTaskTypes; import org.sonar.db.ce.CeTaskTypes;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentTesting; import org.sonar.db.component.ComponentTesting;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.organization.TestDefaultOrganizationProvider;


import static java.util.Arrays.asList; import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.Matchers.startsWith; import static org.hamcrest.Matchers.startsWith;


public class CeQueueImplTest { public class CeQueueImplTest {


private System2 system2 = new TestSystem2().setNow(1_450_000_000_000L);

@Rule @Rule
public ExpectedException expectedException = ExpectedException.none(); public ExpectedException expectedException = ExpectedException.none();

System2 system2 = new TestSystem2().setNow(1_450_000_000_000L);

@Rule @Rule
public DbTester dbTester = DbTester.create(system2); public DbTester dbTester = DbTester.create(system2);
DbSession session = dbTester.getSession();


UuidFactory uuidFactory = UuidFactoryImpl.INSTANCE; private DbSession session = dbTester.getSession();
CeQueue underTest = new CeQueueImpl(dbTester.getDbClient(), uuidFactory);
private UuidFactory uuidFactory = UuidFactoryImpl.INSTANCE;
private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester);

private CeQueue underTest = new CeQueueImpl(dbTester.getDbClient(), uuidFactory, defaultOrganizationProvider);


@Test @Test
public void submit_returns_task_populated_from_CeTaskSubmit_and_creates_CeQueue_row() { public void submit_returns_task_populated_from_CeTaskSubmit_and_creates_CeQueue_row() {
Expand Down Expand Up @@ -176,6 +180,11 @@ public void pause_and_resume_submits() throws Exception {
} }


private void verifyCeTask(CeTaskSubmit taskSubmit, CeTask task, @Nullable ComponentDto componentDto) { private void verifyCeTask(CeTaskSubmit taskSubmit, CeTask task, @Nullable ComponentDto componentDto) {
if (componentDto == null) {
assertThat(task.getOrganizationUuid()).isEqualTo(defaultOrganizationProvider.get().getUuid());
} else {
assertThat(task.getOrganizationUuid()).isEqualTo(componentDto.getOrganizationUuid());
}
assertThat(task.getUuid()).isEqualTo(taskSubmit.getUuid()); assertThat(task.getUuid()).isEqualTo(taskSubmit.getUuid());
assertThat(task.getComponentUuid()).isEqualTo(task.getComponentUuid()); assertThat(task.getComponentUuid()).isEqualTo(task.getComponentUuid());
assertThat(task.getType()).isEqualTo(taskSubmit.getType()); assertThat(task.getType()).isEqualTo(taskSubmit.getType());
Expand Down

0 comments on commit 14944eb

Please sign in to comment.