Skip to content

Commit

Permalink
workspaceId should be part of spec request (#12112)
Browse files Browse the repository at this point in the history
* workspaceId should be part of spec request

* address review comment

* fix test

* format

* update octavia according to API changes

* create integration test for definition generation

* fix test

* fix test

Co-authored-by: alafanechere <augustin.lafanechere@gmail.com>
  • Loading branch information
subodh1810 and alafanechere committed Apr 22, 2022
1 parent e846743 commit 405bf4d
Show file tree
Hide file tree
Showing 15 changed files with 122 additions and 57 deletions.
4 changes: 2 additions & 2 deletions airbyte-api/src/main/openapi/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -533,7 +533,7 @@ paths:
content:
application/json:
schema:
$ref: "#/components/schemas/SourceDefinitionIdRequestBody"
$ref: "#/components/schemas/SourceDefinitionIdWithWorkspaceId"
required: true
responses:
"200":
Expand Down Expand Up @@ -1055,7 +1055,7 @@ paths:
content:
application/json:
schema:
$ref: "#/components/schemas/DestinationDefinitionIdRequestBody"
$ref: "#/components/schemas/DestinationDefinitionIdWithWorkspaceId"
required: true
responses:
"200":
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -401,8 +401,8 @@ public void revokeSourceDefinitionFromWorkspace(final SourceDefinitionIdWithWork
// SOURCE SPECIFICATION

@Override
public SourceDefinitionSpecificationRead getSourceDefinitionSpecification(final SourceDefinitionIdRequestBody sourceDefinitionIdRequestBody) {
return execute(() -> schedulerHandler.getSourceDefinitionSpecification(sourceDefinitionIdRequestBody));
public SourceDefinitionSpecificationRead getSourceDefinitionSpecification(final SourceDefinitionIdWithWorkspaceId sourceDefinitionIdWithWorkspaceId) {
return execute(() -> schedulerHandler.getSourceDefinitionSpecification(sourceDefinitionIdWithWorkspaceId));
}

// OAUTH
Expand Down Expand Up @@ -599,8 +599,8 @@ public void revokeDestinationDefinitionFromWorkspace(final DestinationDefinition

@Override
public DestinationDefinitionSpecificationRead getDestinationDefinitionSpecification(
final DestinationDefinitionIdRequestBody destinationDefinitionIdRequestBody) {
return execute(() -> schedulerHandler.getDestinationSpecification(destinationDefinitionIdRequestBody));
final DestinationDefinitionIdWithWorkspaceId destinationDefinitionIdWithWorkspaceId) {
return execute(() -> schedulerHandler.getDestinationSpecification(destinationDefinitionIdWithWorkspaceId));
}

// DESTINATION IMPLEMENTATION
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import io.airbyte.api.model.ConnectionIdRequestBody;
import io.airbyte.api.model.ConnectionState;
import io.airbyte.api.model.DestinationCoreConfig;
import io.airbyte.api.model.DestinationDefinitionIdRequestBody;
import io.airbyte.api.model.DestinationDefinitionIdWithWorkspaceId;
import io.airbyte.api.model.DestinationDefinitionSpecificationRead;
import io.airbyte.api.model.DestinationIdRequestBody;
import io.airbyte.api.model.DestinationSyncMode;
Expand All @@ -27,7 +27,7 @@
import io.airbyte.api.model.JobInfoRead;
import io.airbyte.api.model.LogRead;
import io.airbyte.api.model.SourceCoreConfig;
import io.airbyte.api.model.SourceDefinitionIdRequestBody;
import io.airbyte.api.model.SourceDefinitionIdWithWorkspaceId;
import io.airbyte.api.model.SourceDefinitionSpecificationRead;
import io.airbyte.api.model.SourceDiscoverSchemaRead;
import io.airbyte.api.model.SourceDiscoverSchemaRequestBody;
Expand Down Expand Up @@ -316,9 +316,9 @@ private SourceDiscoverSchemaRead discoverJobToOutput(final SynchronousResponse<A
return sourceDiscoverSchemaRead;
}

public SourceDefinitionSpecificationRead getSourceDefinitionSpecification(final SourceDefinitionIdRequestBody sourceDefinitionIdRequestBody)
public SourceDefinitionSpecificationRead getSourceDefinitionSpecification(final SourceDefinitionIdWithWorkspaceId sourceDefinitionIdWithWorkspaceId)
throws ConfigNotFoundException, IOException, JsonValidationException {
final UUID sourceDefinitionId = sourceDefinitionIdRequestBody.getSourceDefinitionId();
final UUID sourceDefinitionId = sourceDefinitionIdWithWorkspaceId.getSourceDefinitionId();
final StandardSourceDefinition source = configRepository.getStandardSourceDefinition(sourceDefinitionId);
final ConnectorSpecification spec = source.getSpec();
final SourceDefinitionSpecificationRead specRead = new SourceDefinitionSpecificationRead()
Expand All @@ -337,9 +337,9 @@ public SourceDefinitionSpecificationRead getSourceDefinitionSpecification(final
}

public DestinationDefinitionSpecificationRead getDestinationSpecification(
final DestinationDefinitionIdRequestBody destinationDefinitionIdRequestBody)
final DestinationDefinitionIdWithWorkspaceId destinationDefinitionIdWithWorkspaceId)
throws ConfigNotFoundException, IOException, JsonValidationException {
final UUID destinationDefinitionId = destinationDefinitionIdRequestBody.getDestinationDefinitionId();
final UUID destinationDefinitionId = destinationDefinitionIdWithWorkspaceId.getDestinationDefinitionId();
final StandardDestinationDefinition destination = configRepository.getStandardDestinationDefinition(destinationDefinitionId);
final ConnectorSpecification spec = destination.getSpec();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@
import io.airbyte.api.model.ConnectionIdRequestBody;
import io.airbyte.api.model.ConnectionState;
import io.airbyte.api.model.DestinationCoreConfig;
import io.airbyte.api.model.DestinationDefinitionIdRequestBody;
import io.airbyte.api.model.DestinationDefinitionIdWithWorkspaceId;
import io.airbyte.api.model.DestinationDefinitionSpecificationRead;
import io.airbyte.api.model.DestinationIdRequestBody;
import io.airbyte.api.model.DestinationUpdate;
import io.airbyte.api.model.JobInfoRead;
import io.airbyte.api.model.SourceCoreConfig;
import io.airbyte.api.model.SourceDefinitionIdRequestBody;
import io.airbyte.api.model.SourceDefinitionIdWithWorkspaceId;
import io.airbyte.api.model.SourceDefinitionSpecificationRead;
import io.airbyte.api.model.SourceDiscoverSchemaRead;
import io.airbyte.api.model.SourceDiscoverSchemaRequestBody;
Expand Down Expand Up @@ -266,41 +266,42 @@ void testCheckSourceConnectionFromUpdate() throws IOException, JsonValidationExc

@Test
void testGetSourceSpec() throws JsonValidationException, IOException, ConfigNotFoundException {
final SourceDefinitionIdRequestBody sourceDefinitionIdRequestBody = new SourceDefinitionIdRequestBody().sourceDefinitionId(UUID.randomUUID());
final SourceDefinitionIdWithWorkspaceId sourceDefinitionIdWithWorkspaceId =
new SourceDefinitionIdWithWorkspaceId().sourceDefinitionId(UUID.randomUUID()).workspaceId(UUID.randomUUID());

final SynchronousResponse<ConnectorSpecification> specResponse = (SynchronousResponse<ConnectorSpecification>) jobResponse;
final StandardSourceDefinition sourceDefinition = new StandardSourceDefinition()
.withName("name")
.withDockerRepository(SOURCE_DOCKER_REPO)
.withDockerImageTag(SOURCE_DOCKER_TAG)
.withSourceDefinitionId(sourceDefinitionIdRequestBody.getSourceDefinitionId())
.withSourceDefinitionId(sourceDefinitionIdWithWorkspaceId.getSourceDefinitionId())
.withSpec(CONNECTOR_SPECIFICATION);
when(configRepository.getStandardSourceDefinition(sourceDefinitionIdRequestBody.getSourceDefinitionId()))
when(configRepository.getStandardSourceDefinition(sourceDefinitionIdWithWorkspaceId.getSourceDefinitionId()))
.thenReturn(sourceDefinition);

final SourceDefinitionSpecificationRead response = schedulerHandler.getSourceDefinitionSpecification(sourceDefinitionIdRequestBody);
final SourceDefinitionSpecificationRead response = schedulerHandler.getSourceDefinitionSpecification(sourceDefinitionIdWithWorkspaceId);

verify(configRepository).getStandardSourceDefinition(sourceDefinitionIdRequestBody.getSourceDefinitionId());
verify(configRepository).getStandardSourceDefinition(sourceDefinitionIdWithWorkspaceId.getSourceDefinitionId());
assertEquals(CONNECTOR_SPECIFICATION.getConnectionSpecification(), response.getConnectionSpecification());
}

@Test
void testGetDestinationSpec() throws JsonValidationException, IOException, ConfigNotFoundException {
final DestinationDefinitionIdRequestBody destinationDefinitionIdRequestBody =
new DestinationDefinitionIdRequestBody().destinationDefinitionId(UUID.randomUUID());
final DestinationDefinitionIdWithWorkspaceId destinationDefinitionIdWithWorkspaceId =
new DestinationDefinitionIdWithWorkspaceId().destinationDefinitionId(UUID.randomUUID()).workspaceId(UUID.randomUUID());

final StandardDestinationDefinition destinationDefinition = new StandardDestinationDefinition()
.withName("name")
.withDockerRepository(DESTINATION_DOCKER_REPO)
.withDockerImageTag(DESTINATION_DOCKER_TAG)
.withDestinationDefinitionId(destinationDefinitionIdRequestBody.getDestinationDefinitionId())
.withDestinationDefinitionId(destinationDefinitionIdWithWorkspaceId.getDestinationDefinitionId())
.withSpec(CONNECTOR_SPECIFICATION);
when(configRepository.getStandardDestinationDefinition(destinationDefinitionIdRequestBody.getDestinationDefinitionId()))
when(configRepository.getStandardDestinationDefinition(destinationDefinitionIdWithWorkspaceId.getDestinationDefinitionId()))
.thenReturn(destinationDefinition);

final DestinationDefinitionSpecificationRead response = schedulerHandler.getDestinationSpecification(destinationDefinitionIdRequestBody);
final DestinationDefinitionSpecificationRead response = schedulerHandler.getDestinationSpecification(destinationDefinitionIdWithWorkspaceId);

verify(configRepository).getStandardDestinationDefinition(destinationDefinitionIdRequestBody.getDestinationDefinitionId());
verify(configRepository).getStandardDestinationDefinition(destinationDefinitionIdWithWorkspaceId.getDestinationDefinitionId());
assertEquals(CONNECTOR_SPECIFICATION.getConnectionSpecification(), response.getConnectionSpecification());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import io.airbyte.api.client.model.DestinationCreate;
import io.airbyte.api.client.model.DestinationDefinitionCreate;
import io.airbyte.api.client.model.DestinationDefinitionIdRequestBody;
import io.airbyte.api.client.model.DestinationDefinitionIdWithWorkspaceId;
import io.airbyte.api.client.model.DestinationDefinitionRead;
import io.airbyte.api.client.model.DestinationDefinitionSpecificationRead;
import io.airbyte.api.client.model.DestinationIdRequestBody;
Expand All @@ -64,6 +65,7 @@
import io.airbyte.api.client.model.SourceCreate;
import io.airbyte.api.client.model.SourceDefinitionCreate;
import io.airbyte.api.client.model.SourceDefinitionIdRequestBody;
import io.airbyte.api.client.model.SourceDefinitionIdWithWorkspaceId;
import io.airbyte.api.client.model.SourceDefinitionRead;
import io.airbyte.api.client.model.SourceDefinitionSpecificationRead;
import io.airbyte.api.client.model.SourceDiscoverSchemaRequestBody;
Expand Down Expand Up @@ -332,7 +334,8 @@ public void tearDown() throws ApiException, SQLException {
public void testGetDestinationSpec() throws ApiException {
final UUID destinationDefinitionId = getDestinationDefId();
final DestinationDefinitionSpecificationRead spec = apiClient.getDestinationDefinitionSpecificationApi()
.getDestinationDefinitionSpecification(new DestinationDefinitionIdRequestBody().destinationDefinitionId(destinationDefinitionId));
.getDestinationDefinitionSpecification(
new DestinationDefinitionIdWithWorkspaceId().destinationDefinitionId(destinationDefinitionId).workspaceId(UUID.randomUUID()));
assertEquals(destinationDefinitionId, spec.getDestinationDefinitionId());
assertNotNull(spec.getConnectionSpecification());
}
Expand All @@ -343,7 +346,8 @@ public void testGetDestinationSpec() throws ApiException {
matches = "true")
public void testFailedGet404() {
final var e = assertThrows(ApiException.class, () -> apiClient.getDestinationDefinitionSpecificationApi()
.getDestinationDefinitionSpecification(new DestinationDefinitionIdRequestBody().destinationDefinitionId(UUID.randomUUID())));
.getDestinationDefinitionSpecification(
new DestinationDefinitionIdWithWorkspaceId().destinationDefinitionId(UUID.randomUUID()).workspaceId(UUID.randomUUID())));
assertEquals(404, e.getCode());
}

Expand All @@ -354,7 +358,7 @@ public void testFailedGet404() {
public void testGetSourceSpec() throws ApiException {
final UUID sourceDefId = getPostgresSourceDefinitionId();
final SourceDefinitionSpecificationRead spec = apiClient.getSourceDefinitionSpecificationApi()
.getSourceDefinitionSpecification(new SourceDefinitionIdRequestBody().sourceDefinitionId(sourceDefId));
.getSourceDefinitionSpecification(new SourceDefinitionIdWithWorkspaceId().sourceDefinitionId(sourceDefId).workspaceId(UUID.randomUUID()));
assertEquals(sourceDefId, spec.getSourceDefinitionId());
assertNotNull(spec.getConnectionSpecification());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ class DestinationDefinitionSpecificationService extends AirbyteRequestService {
return "destination_definition_specifications";
}

public get(destinationDefinitionId: string): Promise<DestinationDefinitionSpecification> {
public get(destinationDefinitionId: string, workspaceId: string): Promise<DestinationDefinitionSpecification> {
return this.fetch<DestinationDefinitionSpecification>(`${this.url}/get`, {
destinationDefinitionId,
workspaceId,
});
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ class SourceDefinitionSpecificationService extends AirbyteRequestService {
return "source_definition_specifications";
}

public get(sourceDefinitionId: string): Promise<SourceDefinitionSpecification> {
public get(sourceDefinitionId: string, workspaceId: string): Promise<SourceDefinitionSpecification> {
return this.fetch<SourceDefinitionSpecification>(`${this.url}/get`, {
sourceDefinitionId,
workspaceId,
});
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { useDefaultRequestMiddlewares } from "services/useDefaultRequestMiddlewa
import { useInitService } from "services/useInitService";
import { DestinationDefinitionSpecificationService } from "core/domain/connector/DestinationDefinitionSpecificationService";
import { isDefined } from "utils/common";
import { useCurrentWorkspace } from "services/workspaces/WorkspacesService";

import { SCOPE_WORKSPACE } from "../Scope";
import { useSuspenseQuery } from "./useSuspenseQuery";
Expand All @@ -28,17 +29,19 @@ function useGetService(): DestinationDefinitionSpecificationService {

export const useGetDestinationDefinitionSpecification = (id: string): DestinationDefinitionSpecification => {
const service = useGetService();
const { workspaceId } = useCurrentWorkspace();

return useSuspenseQuery(destinationDefinitionSpecificationKeys.detail(id), () => service.get(id));
return useSuspenseQuery(destinationDefinitionSpecificationKeys.detail(id), () => service.get(id, workspaceId));
};

export const useGetDestinationDefinitionSpecificationAsync = (
id: string | null
): QueryObserverResult<DestinationDefinitionSpecification, Error> => {
const service = useGetService();
const { workspaceId } = useCurrentWorkspace();

const escapedId = id ?? "";
return useQuery(destinationDefinitionSpecificationKeys.detail(escapedId), () => service.get(escapedId), {
return useQuery(destinationDefinitionSpecificationKeys.detail(escapedId), () => service.get(escapedId, workspaceId), {
enabled: isDefined(id),
});
};
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { useConfig } from "config";
import { useDefaultRequestMiddlewares } from "services/useDefaultRequestMiddlewares";
import { useInitService } from "services/useInitService";
import { SourceDefinitionSpecificationService } from "core/domain/connector/SourceDefinitionSpecificationService";
import { useCurrentWorkspace } from "services/workspaces/WorkspacesService";
import { isDefined } from "utils/common";

import { SCOPE_WORKSPACE } from "../Scope";
Expand All @@ -28,17 +29,19 @@ function useGetService(): SourceDefinitionSpecificationService {

export const useGetSourceDefinitionSpecification = (id: string): SourceDefinitionSpecification => {
const service = useGetService();
const { workspaceId } = useCurrentWorkspace();

return useSuspenseQuery(sourceDefinitionSpecificationKeys.detail(id), () => service.get(id));
return useSuspenseQuery(sourceDefinitionSpecificationKeys.detail(id), () => service.get(id, workspaceId));
};

export const useGetSourceDefinitionSpecificationAsync = (
id: string | null
): QueryObserverResult<SourceDefinitionSpecification, Error> => {
const service = useGetService();
const { workspaceId } = useCurrentWorkspace();

const escapedId = id ?? "";
return useQuery(sourceDefinitionSpecificationKeys.detail(escapedId), () => service.get(escapedId), {
return useQuery(sourceDefinitionSpecificationKeys.detail(escapedId), () => service.get(escapedId, workspaceId), {
enabled: isDefined(id),
});
};
4 changes: 2 additions & 2 deletions docs/reference/api/generated-api-html/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3792,7 +3792,7 @@ <h3 class="field-label">Consumes</h3>

<h3 class="field-label">Request body</h3>
<div class="field-items">
<div class="param">DestinationDefinitionIdRequestBody <a href="#DestinationDefinitionIdRequestBody">DestinationDefinitionIdRequestBody</a> (required)</div>
<div class="param">DestinationDefinitionIdWithWorkspaceId <a href="#DestinationDefinitionIdWithWorkspaceId">DestinationDefinitionIdWithWorkspaceId</a> (required)</div>

<div class="param-desc"><span class="param-type">Body Parameter</span> &mdash; </div>

Expand Down Expand Up @@ -7709,7 +7709,7 @@ <h3 class="field-label">Consumes</h3>

<h3 class="field-label">Request body</h3>
<div class="field-items">
<div class="param">SourceDefinitionIdRequestBody <a href="#SourceDefinitionIdRequestBody">SourceDefinitionIdRequestBody</a> (required)</div>
<div class="param">SourceDefinitionIdWithWorkspaceId <a href="#SourceDefinitionIdWithWorkspaceId">SourceDefinitionIdWithWorkspaceId</a> (required)</div>

<div class="param-desc"><span class="param-type">Body Parameter</span> &mdash; </div>

Expand Down
33 changes: 33 additions & 0 deletions octavia-cli/integration_tests/test_generate/test_definitions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#
# Copyright (c) 2021 Airbyte, Inc., all rights reserved.
#

import os

import pytest
import yaml
from octavia_cli.generate.commands import generate_source_or_destination

pytestmark = pytest.mark.integration


@pytest.mark.parametrize(
("definition_type, definition_id, resource_name"),
[
("source", "6371b14b-bc68-4236-bfbd-468e8df8e968", "test_generate_source"),
("destination", "22f6c74f-5699-40ff-833c-4a879ea40133", "test_generate_destination"),
],
)
def test_generate_source_or_destination(
octavia_tmp_project_directory, api_client, workspace_id, definition_type, definition_id, resource_name
):
current_path = os.getcwd()
os.chdir(octavia_tmp_project_directory)
generate_source_or_destination(definition_type, api_client, workspace_id, definition_id, resource_name)
expected_output_path = f"{definition_type}s/{resource_name}/configuration.yaml"
with open(expected_output_path, "r") as f:
parsed_yaml = yaml.safe_load(f)
assert parsed_yaml["resource_name"] == resource_name
assert parsed_yaml["definition_type"] == definition_type
assert parsed_yaml["definition_id"] == definition_id
os.chdir(current_path)
Loading

0 comments on commit 405bf4d

Please sign in to comment.