Skip to content

Commit

Permalink
List private definitions endpoint (#11339)
Browse files Browse the repository at this point in the history
* listGrantableActorDefinitions

* listPrivateSourceDefinitions

* listPrivateDestinationDefinitions
  • Loading branch information
git-phu authored Mar 24, 2022
1 parent 05605c6 commit 7b316d4
Show file tree
Hide file tree
Showing 7 changed files with 192 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
Expand Down Expand Up @@ -207,6 +208,18 @@ public List<StandardSourceDefinition> listGrantedSourceDefinitions(final UUID wo
includeTombstones(ACTOR_DEFINITION.TOMBSTONE, includeTombstones));
}

public List<Entry<StandardSourceDefinition, Boolean>> listGrantableSourceDefinitions(final UUID workspaceId,
final boolean includeTombstones)
throws IOException {
return listActorDefinitionsJoinedWithGrants(
workspaceId,
JoinType.LEFT_OUTER_JOIN,
ActorType.source,
record -> actorDefinitionWithGrantStatus(record, DbConverter::buildStandardSourceDefinition),
ACTOR_DEFINITION.CUSTOM.eq(false),
includeTombstones(ACTOR_DEFINITION.TOMBSTONE, includeTombstones));
}

public void writeStandardSourceDefinition(final StandardSourceDefinition sourceDefinition) throws JsonValidationException, IOException {
persistence.writeConfig(ConfigSchema.STANDARD_SOURCE_DEFINITION, sourceDefinition.getSourceDefinitionId().toString(), sourceDefinition);
}
Expand Down Expand Up @@ -286,6 +299,18 @@ public List<StandardDestinationDefinition> listGrantedDestinationDefinitions(fin
includeTombstones(ACTOR_DEFINITION.TOMBSTONE, includeTombstones));
}

public List<Entry<StandardDestinationDefinition, Boolean>> listGrantableDestinationDefinitions(final UUID workspaceId,
final boolean includeTombstones)
throws IOException {
return listActorDefinitionsJoinedWithGrants(
workspaceId,
JoinType.LEFT_OUTER_JOIN,
ActorType.destination,
record -> actorDefinitionWithGrantStatus(record, DbConverter::buildStandardDestinationDefinition),
ACTOR_DEFINITION.CUSTOM.eq(false),
includeTombstones(ACTOR_DEFINITION.TOMBSTONE, includeTombstones));
}

public void writeStandardDestinationDefinition(final StandardDestinationDefinition destinationDefinition)
throws JsonValidationException, IOException {
persistence.writeConfig(
Expand Down Expand Up @@ -404,6 +429,13 @@ private <T> List<T> listActorDefinitionsJoinedWithGrants(final UUID workspaceId,
.toList();
}

private <T> Entry<T, Boolean> actorDefinitionWithGrantStatus(final Record outerJoinRecord,
final Function<Record, T> recordToActorDefinition) {
final T actorDefinition = recordToActorDefinition.apply(outerJoinRecord);
final boolean granted = outerJoinRecord.get(ACTOR_DEFINITION_WORKSPACE_GRANT.WORKSPACE_ID) != null;
return Map.entry(actorDefinition, granted);
}

/**
* Returns source with a given id. Does not contain secrets. To hydrate with secrets see { @link
* SecretsRepositoryReader#getSourceConnectionWithSecrets(final UUID sourceId) }.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
Expand Down Expand Up @@ -248,13 +250,20 @@ public void testListPublicSourceDefinitions() throws IOException {
public void testSourceDefinitionGrants() throws IOException {
final UUID workspaceId = MockData.standardWorkspaces().get(0).getWorkspaceId();
final StandardSourceDefinition grantableDefinition1 = MockData.grantableSourceDefinition1();
final StandardSourceDefinition grantableDefinition2 = MockData.grantableSourceDefinition2();
final StandardSourceDefinition customDefinition = MockData.customSourceDefinition();

configRepository.writeActorDefinitionWorkspaceGrant(customDefinition.getSourceDefinitionId(), workspaceId);
configRepository.writeActorDefinitionWorkspaceGrant(grantableDefinition1.getSourceDefinitionId(), workspaceId);
final List<StandardSourceDefinition> actualGrantedDefinitions = configRepository
.listGrantedSourceDefinitions(workspaceId, false);
assertThat(actualGrantedDefinitions).hasSameElementsAs(List.of(grantableDefinition1, customDefinition));

final List<Entry<StandardSourceDefinition, Boolean>> actualGrantableDefinitions = configRepository
.listGrantableSourceDefinitions(workspaceId, false);
assertThat(actualGrantableDefinitions).hasSameElementsAs(List.of(
Map.entry(grantableDefinition1, true),
Map.entry(grantableDefinition2, false)));
}

@Test
Expand All @@ -267,13 +276,20 @@ public void testListPublicDestinationDefinitions() throws IOException {
public void testDestinationDefinitionGrants() throws IOException {
final UUID workspaceId = MockData.standardWorkspaces().get(0).getWorkspaceId();
final StandardDestinationDefinition grantableDefinition1 = MockData.grantableDestinationDefinition1();
final StandardDestinationDefinition grantableDefinition2 = MockData.grantableDestinationDefinition2();
final StandardDestinationDefinition customDefinition = MockData.cusstomDestinationDefinition();

configRepository.writeActorDefinitionWorkspaceGrant(customDefinition.getDestinationDefinitionId(), workspaceId);
configRepository.writeActorDefinitionWorkspaceGrant(grantableDefinition1.getDestinationDefinitionId(), workspaceId);
final List<StandardDestinationDefinition> actualGrantedDefinitions = configRepository
.listGrantedDestinationDefinitions(workspaceId, false);
assertThat(actualGrantedDefinitions).hasSameElementsAs(List.of(grantableDefinition1, customDefinition));

final List<Entry<StandardDestinationDefinition, Boolean>> actualGrantableDefinitions = configRepository
.listGrantableDestinationDefinitions(workspaceId, false);
assertThat(actualGrantableDefinitions).hasSameElementsAs(List.of(
Map.entry(grantableDefinition1, true),
Map.entry(grantableDefinition2, false)));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ public SourceDefinitionReadList listLatestSourceDefinitions() {

@Override
public PrivateSourceDefinitionReadList listPrivateSourceDefinitions(final WorkspaceIdRequestBody workspaceIdRequestBody) {
return null;
return execute(() -> sourceDefinitionsHandler.listPrivateSourceDefinitions(workspaceIdRequestBody));
}

@Override
Expand Down Expand Up @@ -521,7 +521,7 @@ public DestinationDefinitionReadList listLatestDestinationDefinitions() {

@Override
public PrivateDestinationDefinitionReadList listPrivateDestinationDefinitions(final WorkspaceIdRequestBody workspaceIdRequestBody) {
return null;
return execute(() -> destinationDefinitionsHandler.listPrivateDestinationDefinitions(workspaceIdRequestBody));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import io.airbyte.api.model.DestinationDefinitionUpdate;
import io.airbyte.api.model.DestinationRead;
import io.airbyte.api.model.PrivateDestinationDefinitionRead;
import io.airbyte.api.model.PrivateDestinationDefinitionReadList;
import io.airbyte.api.model.ReleaseStage;
import io.airbyte.api.model.WorkspaceIdRequestBody;
import io.airbyte.commons.docker.DockerUtils;
Expand All @@ -37,6 +38,7 @@
import java.net.URISyntaxException;
import java.time.LocalDate;
import java.util.List;
import java.util.Map.Entry;
import java.util.UUID;
import java.util.function.Supplier;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -135,6 +137,23 @@ public DestinationDefinitionReadList listDestinationDefinitionsForWorkspace(fina
configRepository.listGrantedDestinationDefinitions(workspaceIdRequestBody.getWorkspaceId(), false)));
}

public PrivateDestinationDefinitionReadList listPrivateDestinationDefinitions(final WorkspaceIdRequestBody workspaceIdRequestBody)
throws IOException {
final List<Entry<StandardDestinationDefinition, Boolean>> standardDestinationDefinitionBooleanMap =
configRepository.listGrantableDestinationDefinitions(workspaceIdRequestBody.getWorkspaceId(), false);
return toPrivateDestinationDefinitionReadList(standardDestinationDefinitionBooleanMap);
}

private static PrivateDestinationDefinitionReadList toPrivateDestinationDefinitionReadList(
final List<Entry<StandardDestinationDefinition, Boolean>> defs) {
final List<PrivateDestinationDefinitionRead> reads = defs.stream()
.map(entry -> new PrivateDestinationDefinitionRead()
.destinationDefinition(buildDestinationDefinitionRead(entry.getKey()))
.granted(entry.getValue()))
.collect(Collectors.toList());
return new PrivateDestinationDefinitionReadList().destinationDefinitions(reads);
}

public DestinationDefinitionRead getDestinationDefinition(final DestinationDefinitionIdRequestBody destinationDefinitionIdRequestBody)
throws ConfigNotFoundException, IOException, JsonValidationException {
return buildDestinationDefinitionRead(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import com.google.common.annotations.VisibleForTesting;
import io.airbyte.api.model.PrivateSourceDefinitionRead;
import io.airbyte.api.model.PrivateSourceDefinitionReadList;
import io.airbyte.api.model.ReleaseStage;
import io.airbyte.api.model.SourceDefinitionCreate;
import io.airbyte.api.model.SourceDefinitionIdRequestBody;
Expand Down Expand Up @@ -37,6 +38,7 @@
import java.net.URISyntaxException;
import java.time.LocalDate;
import java.util.List;
import java.util.Map.Entry;
import java.util.UUID;
import java.util.function.Supplier;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -131,6 +133,22 @@ public SourceDefinitionReadList listSourceDefinitionsForWorkspace(final Workspac
configRepository.listGrantedSourceDefinitions(workspaceIdRequestBody.getWorkspaceId(), false)));
}

public PrivateSourceDefinitionReadList listPrivateSourceDefinitions(final WorkspaceIdRequestBody workspaceIdRequestBody)
throws IOException {
final List<Entry<StandardSourceDefinition, Boolean>> standardSourceDefinitionBooleanMap =
configRepository.listGrantableSourceDefinitions(workspaceIdRequestBody.getWorkspaceId(), false);
return toPrivateSourceDefinitionReadList(standardSourceDefinitionBooleanMap);
}

private static PrivateSourceDefinitionReadList toPrivateSourceDefinitionReadList(final List<Entry<StandardSourceDefinition, Boolean>> defs) {
final List<PrivateSourceDefinitionRead> reads = defs.stream()
.map(entry -> new PrivateSourceDefinitionRead()
.sourceDefinition(buildSourceDefinitionRead(entry.getKey()))
.granted(entry.getValue()))
.collect(Collectors.toList());
return new PrivateSourceDefinitionReadList().sourceDefinitions(reads);
}

public SourceDefinitionRead getSourceDefinition(final SourceDefinitionIdRequestBody sourceDefinitionIdRequestBody)
throws ConfigNotFoundException, IOException, JsonValidationException {
return buildSourceDefinitionRead(configRepository.getStandardSourceDefinition(sourceDefinitionIdRequestBody.getSourceDefinitionId()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import io.airbyte.api.model.DestinationRead;
import io.airbyte.api.model.DestinationReadList;
import io.airbyte.api.model.PrivateDestinationDefinitionRead;
import io.airbyte.api.model.PrivateDestinationDefinitionReadList;
import io.airbyte.api.model.ReleaseStage;
import io.airbyte.api.model.WorkspaceIdRequestBody;
import io.airbyte.commons.docker.DockerUtils;
Expand All @@ -44,6 +45,7 @@
import java.net.URISyntaxException;
import java.time.LocalDate;
import java.util.Collections;
import java.util.Map;
import java.util.UUID;
import java.util.function.Supplier;
import org.junit.jupiter.api.BeforeEach;
Expand Down Expand Up @@ -183,6 +185,57 @@ void testListDestinationDefinitionsForWorkspace() throws IOException, URISyntaxE
actualDestinationDefinitionReadList.getDestinationDefinitions());
}

@Test
@DisplayName("listPrivateDestinationDefinitions should return the right list")
void testListPrivateDestinationDefinitions() throws IOException, URISyntaxException {
final StandardDestinationDefinition destinationDefinition2 = generateDestinationDefinition();

when(configRepository.listGrantableDestinationDefinitions(workspaceId, false)).thenReturn(
Lists.newArrayList(
Map.entry(destinationDefinition, false),
Map.entry(destinationDefinition2, true)));

final DestinationDefinitionRead expectedDestinationDefinitionRead1 = new DestinationDefinitionRead()
.destinationDefinitionId(destinationDefinition.getDestinationDefinitionId())
.name(destinationDefinition.getName())
.dockerRepository(destinationDefinition.getDockerRepository())
.dockerImageTag(destinationDefinition.getDockerImageTag())
.documentationUrl(new URI(destinationDefinition.getDocumentationUrl()))
.icon(DestinationDefinitionsHandler.loadIcon(destinationDefinition.getIcon()))
.releaseStage(ReleaseStage.fromValue(destinationDefinition.getReleaseStage().value()))
.releaseDate(LocalDate.parse(destinationDefinition.getReleaseDate()))
.resourceRequirements(new io.airbyte.api.model.ActorDefinitionResourceRequirements()
._default(new io.airbyte.api.model.ResourceRequirements()
.cpuRequest(destinationDefinition.getResourceRequirements().getDefault().getCpuRequest())));

final DestinationDefinitionRead expectedDestinationDefinitionRead2 = new DestinationDefinitionRead()
.destinationDefinitionId(destinationDefinition2.getDestinationDefinitionId())
.name(destinationDefinition2.getName())
.dockerRepository(destinationDefinition.getDockerRepository())
.dockerImageTag(destinationDefinition.getDockerImageTag())
.documentationUrl(new URI(destinationDefinition.getDocumentationUrl()))
.icon(DestinationDefinitionsHandler.loadIcon(destinationDefinition.getIcon()))
.releaseStage(ReleaseStage.fromValue(destinationDefinition.getReleaseStage().value()))
.releaseDate(LocalDate.parse(destinationDefinition.getReleaseDate()))
.resourceRequirements(new io.airbyte.api.model.ActorDefinitionResourceRequirements()
._default(new io.airbyte.api.model.ResourceRequirements()
.cpuRequest(destinationDefinition2.getResourceRequirements().getDefault().getCpuRequest())));

final PrivateDestinationDefinitionRead expectedDestinationDefinitionOptInRead1 =
new PrivateDestinationDefinitionRead().destinationDefinition(expectedDestinationDefinitionRead1).granted(false);

final PrivateDestinationDefinitionRead expectedDestinationDefinitionOptInRead2 =
new PrivateDestinationDefinitionRead().destinationDefinition(expectedDestinationDefinitionRead2).granted(true);

final PrivateDestinationDefinitionReadList actualDestinationDefinitionOptInReadList =
destinationDefinitionsHandler.listPrivateDestinationDefinitions(
new WorkspaceIdRequestBody().workspaceId(workspaceId));

assertEquals(
Lists.newArrayList(expectedDestinationDefinitionOptInRead1, expectedDestinationDefinitionOptInRead2),
actualDestinationDefinitionOptInReadList.getDestinationDefinitions());
}

@Test
@DisplayName("getDestinationDefinition should return the right destination")
void testGetDestination() throws JsonValidationException, ConfigNotFoundException, IOException, URISyntaxException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import io.airbyte.api.model.PrivateSourceDefinitionRead;
import io.airbyte.api.model.PrivateSourceDefinitionReadList;
import io.airbyte.api.model.ReleaseStage;
import io.airbyte.api.model.SourceDefinitionCreate;
import io.airbyte.api.model.SourceDefinitionIdRequestBody;
Expand Down Expand Up @@ -45,6 +46,7 @@
import java.net.URISyntaxException;
import java.time.LocalDate;
import java.util.Collections;
import java.util.Map;
import java.util.UUID;
import java.util.function.Supplier;
import org.junit.jupiter.api.BeforeEach;
Expand Down Expand Up @@ -182,6 +184,56 @@ void testListSourceDefinitionsForWorkspace() throws IOException, URISyntaxExcept
actualSourceDefinitionReadList.getSourceDefinitions());
}

@Test
@DisplayName("listPrivateSourceDefinitions should return the right list")
void testListPrivateSourceDefinitions() throws IOException, URISyntaxException {
final StandardSourceDefinition sourceDefinition2 = generateSourceDefinition();

when(configRepository.listGrantableSourceDefinitions(workspaceId, false)).thenReturn(
Lists.newArrayList(
Map.entry(sourceDefinition, false),
Map.entry(sourceDefinition2, true)));

final SourceDefinitionRead expectedSourceDefinitionRead1 = new SourceDefinitionRead()
.sourceDefinitionId(sourceDefinition.getSourceDefinitionId())
.name(sourceDefinition.getName())
.dockerRepository(sourceDefinition.getDockerRepository())
.dockerImageTag(sourceDefinition.getDockerImageTag())
.documentationUrl(new URI(sourceDefinition.getDocumentationUrl()))
.icon(SourceDefinitionsHandler.loadIcon(sourceDefinition.getIcon()))
.releaseStage(ReleaseStage.fromValue(sourceDefinition.getReleaseStage().value()))
.releaseDate(LocalDate.parse(sourceDefinition.getReleaseDate()))
.resourceRequirements(new io.airbyte.api.model.ActorDefinitionResourceRequirements()
._default(new io.airbyte.api.model.ResourceRequirements()
.cpuRequest(sourceDefinition.getResourceRequirements().getDefault().getCpuRequest())));

final SourceDefinitionRead expectedSourceDefinitionRead2 = new SourceDefinitionRead()
.sourceDefinitionId(sourceDefinition2.getSourceDefinitionId())
.name(sourceDefinition2.getName())
.dockerRepository(sourceDefinition.getDockerRepository())
.dockerImageTag(sourceDefinition.getDockerImageTag())
.documentationUrl(new URI(sourceDefinition.getDocumentationUrl()))
.icon(SourceDefinitionsHandler.loadIcon(sourceDefinition.getIcon()))
.releaseStage(ReleaseStage.fromValue(sourceDefinition.getReleaseStage().value()))
.releaseDate(LocalDate.parse(sourceDefinition.getReleaseDate()))
.resourceRequirements(new io.airbyte.api.model.ActorDefinitionResourceRequirements()
._default(new io.airbyte.api.model.ResourceRequirements()
.cpuRequest(sourceDefinition2.getResourceRequirements().getDefault().getCpuRequest())));

final PrivateSourceDefinitionRead expectedSourceDefinitionOptInRead1 =
new PrivateSourceDefinitionRead().sourceDefinition(expectedSourceDefinitionRead1).granted(false);

final PrivateSourceDefinitionRead expectedSourceDefinitionOptInRead2 =
new PrivateSourceDefinitionRead().sourceDefinition(expectedSourceDefinitionRead2).granted(true);

final PrivateSourceDefinitionReadList actualSourceDefinitionOptInReadList = sourceDefinitionsHandler.listPrivateSourceDefinitions(
new WorkspaceIdRequestBody().workspaceId(workspaceId));

assertEquals(
Lists.newArrayList(expectedSourceDefinitionOptInRead1, expectedSourceDefinitionOptInRead2),
actualSourceDefinitionOptInReadList.getSourceDefinitions());
}

@Test
@DisplayName("getSourceDefinition should return the right source")
void testGetSourceDefinition() throws JsonValidationException, ConfigNotFoundException, IOException, URISyntaxException {
Expand Down

0 comments on commit 7b316d4

Please sign in to comment.