원시 파일 가져오기 생성(Create File Import) (V2)
지정한 Connection에서 외부 원시 파일을 가져오는 FileImport 구성을 만듭니다. 출력 데이터셋 RID와 수집 모드, 표시 이름이 필요합니다. 연결이 파일 가져오기를 지원해야 합니다.
출력 datasetRid와 branchName은 생성 후 바꿀 수 없습니다. 대부분의 플랫폼 인스턴스에서 브랜치 기본값은 master이며, 실제 대상 브랜치를 확인하여 지정합니다. 수집을 시작할 때는 Execute File Import를 사용합니다.
HTTP 요청
POST /api/v2/connectivity/connections/{connectionRid}/fileImports
작업 식별자는 v2.createFileImport입니다. OAuth2로 호출하는 타사 애플리케이션에는 api:connectivity-file-import-write 권한 범위가 필요합니다. 각 요청에 Authorization: Bearer <접근 토큰>을 전달합니다.
경로 매개변수
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
connectionRid | string | 필수 | 소스라고도 부르는 Connection의 RID입니다. | ri.magritte..source.c078b71b-92f9-41b6-b0df-3760f411120b |
쿼리 매개변수
지정할 쿼리 매개변수가 없습니다.
요청 본문
CreateFileImportRequest 본문은 필수입니다. subfolder를 생략하면 원천 루트 폴더가 대상이 됩니다. 필터의 정규식도 소스 루트 기준의 상대 경로를 사용합니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
datasetRid | string | 필수 | 출력 데이터셋의 RID입니다. 파일 가져오기를 생성한 뒤에는 바꿀 수 없습니다. | ri.foundry.main.dataset.c26f11c8-cdb3-4f44-9f5d-9816ea1c82da |
importMode | enum | 필수 | 원시 파일을 읽고 출력 데이터셋에 반영하는 방식입니다. SNAPSHOT은 이번 실행의 파일만으로 새 데이터셋 상태를 구성합니다. APPEND는 이전 실행의 데이터에 새 파일을 추가합니다. UPDATE는 파일 이름을 기준으로 기존 파일을 교체합니다. 허용값: SNAPSHOT, APPEND, UPDATE. | SNAPSHOT |
displayName | string | 필수 | My file import | |
branchName | string | 선택 | 수집한 데이터를 담을 출력 데이터셋 브랜치입니다. 대부분의 플랫폼 인스턴스에서는 기본값이 master입니다. 파일 가져오기를 생성한 뒤에는 바꿀 수 없습니다. | master |
subfolder | string | 선택 | 외부 시스템에서 가져올 하위 폴더입니다. 생략하면 외부 시스템의 루트 폴더를 사용합니다. | subfolder1/subfolder2 |
fileImportFilters | list<FileImportFilter> | 선택 | 가져올 파일을 제한하는 필터 목록입니다. 지정한 순서대로 적용하며 순서에 따라 가져오기 성능이 달라질 수 있습니다. |
fileImportFilters의 구조
파일 가져오기 필터의 9가지 유형은 type 필드로 구분합니다. 배열 순서대로 원천 파일에 적용하며 customFilter는 조회 전용입니다.
다음 본문의 식별자와 값은 가상 예시입니다.
{
"datasetRid": "ri.foundry.main.dataset.c26f11c8-cdb3-4f44-9f5d-9816ea1c82da",
"importMode": "SNAPSHOT",
"displayName": "My file import",
"branchName": "master",
"subfolder": "subfolder1/subfolder2",
"fileImportFilters": [
{
"type": "pathMatchesFilter",
"regex": "subfolder1/subfolder2/.*"
}
]
}
응답
응답 형식은 FileImport입니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
rid | string | 필수 | 배치 동기화라고도 부르는 FileImport의 RID입니다. | ri.magritte..extract.27bb4f2b-63b8-44b8-a579-4e2bd65ba158 |
connectionRid | string | 필수 | 이 파일 가져오기가 사용하는 Connection, 즉 소스의 RID입니다. | ri.magritte..source.c078b71b-92f9-41b6-b0df-3760f411120b |
datasetRid | string | 필수 | 출력 데이터셋의 RID입니다. 파일 가져오기를 생성한 뒤에는 바꿀 수 없습니다. | ri.foundry.main.dataset.c26f11c8-cdb3-4f44-9f5d-9816ea1c82da |
branchName | string | 선택 | 수집한 데이터를 담을 출력 데이터셋 브랜치입니다. 대부분의 플랫폼 인스턴스에서는 기본값이 master입니다. 파일 가져오기를 생성한 뒤에는 바꿀 수 없습니다. | master |
displayName | string | 필수 | My file import | |
fileImportFilters | list<FileImportFilter> | 선택 | 가져올 파일을 제한하는 필터 목록입니다. 지정한 순서대로 적용하며 순서에 따라 가져오기 성능이 달라질 수 있습니다. | |
importMode | enum | 필수 | 원시 파일을 읽고 출력 데이터셋에 반영하는 방식입니다. SNAPSHOT은 이번 실행의 파일만으로 새 데이터셋 상태를 구성합니다. APPEND는 이전 실행의 데이터에 새 파일을 추가합니다. UPDATE는 파일 이름을 기준으로 기존 파일을 교체합니다. 허용값: SNAPSHOT, APPEND, UPDATE. | SNAPSHOT |
subfolder | string | 선택 | 외부 시스템에서 가져올 하위 폴더입니다. 생략하면 외부 시스템의 루트 폴더를 사용합니다. | subfolder1/subfolder2 |
fileImportFilters의 구조
필터 항목의 구조는 요청과 같습니다. 기존 설정의 customFilter도 조회할 수 있습니다.
가상 파일 가져오기 구성의 응답 예시입니다.
{
"datasetRid": "ri.foundry.main.dataset.c26f11c8-cdb3-4f44-9f5d-9816ea1c82da",
"importMode": "SNAPSHOT",
"displayName": "My file import",
"connectionRid": "ri.magritte..source.c078b71b-92f9-41b6-b0df-3760f411120b",
"branchName": "master",
"subfolder": "subfolder1/subfolder2",
"rid": "ri.magritte..extract.27bb4f2b-63b8-44b8-a579-4e2bd65ba158",
"fileImportFilters": [
{
"type": "pathMatchesFilter",
"regex": "subfolder1/subfolder2/.*"
}
]
}
개별 오류
| 오류 이름 | 오류 코드 | HTTP | 의미와 조건 | 추가 매개변수 |
|---|---|---|---|---|
ConnectionDetailsNotDetermined | INTERNAL | 500 | 연결이 지원하는 가져오기 유형 등의 연결 정보를 확인하지 못했습니다. | connectionRid, connectionType |
FileSizeFilterMissingGreaterThanAndLessThan | INVALID_ARGUMENT | 400 | 파일 크기 필터의 gt와 lt가 모두 없습니다. 하나 이상을 지정해야 합니다. | |
FileSizeFilterGreaterThanCannotBeNegative | INVALID_ARGUMENT | 400 | 파일 크기 필터의 gt는 음수일 수 없습니다. | gt |
FileSizeFilterLessThanMustBeOneByteOrLarger | INVALID_ARGUMENT | 400 | 파일 크기 필터의 lt는 1바이트 이상이어야 합니다. | lt |
FileSizeFilterInvalidGreaterThanAndLessThanRange | INVALID_ARGUMENT | 400 | gt와 lt 범위를 만족할 파일 크기가 없습니다. gt < lt - 1을 충족해야 합니다. | gt, lt |
FileAtLeastCountFilterInvalidMinCount | INVALID_ARGUMENT | 400 | 최소 파일 수 필터의 minFilesCount는 0보다 커야 합니다. | minFilesCount |
FileImportCustomFilterCannotBeUsedToCreateOrUpdateFileImports | INVALID_ARGUMENT | 400 | 사용자 지정 필터는 조회만 가능하며 현재 파일 가져오기 생성이나 갱신에 사용할 수 없습니다. | config |
FileImportNotSupportedForConnection | INVALID_ARGUMENT | 400 | 해당 연결은 파일 가져오기를 지원하지 않습니다. | connectionRid |
DatasetNotFound | NOT_FOUND | 404 | 데이터셋이 없거나 호출 토큰으로 접근할 수 없습니다. | datasetRid |
CreateFileImportPermissionDenied | PERMISSION_DENIED | 403 | 파일 가져오기를 생성할 수 없습니다. | connectionRid |
ConnectionNotFound | NOT_FOUND | 404 | 지정한 연결을 찾을 수 없습니다. | connectionRid |
요청 예제
FOUNDRY_HOST에는 https://를 제외한 Foundry 호스트를, FOUNDRY_TOKEN에는 유효한 토큰을 환경 변수로 제공합니다. 예시 식별자와 매개변수 값은 실제 작업 대상에 맞게 바꿉니다.
가상 하위 폴더 subfolder1/subfolder2를 선택하는 예제입니다. 정규식 subfolder1/subfolder2/.*도 같은 루트 기준 경로에 맞췄습니다. 데이터셋 RID, 브랜치, 폴더와 선택 조건은 실제 작업 대상으로 바꿉니다.
cURL
curl -X POST \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${FOUNDRY_TOKEN}" \
"https://${FOUNDRY_HOST}/api/v2/connectivity/connections/ri.magritte..source.c078b71b-92f9-41b6-b0df-3760f411120b/fileImports" \
-d '{"datasetRid":"ri.foundry.main.dataset.c26f11c8-cdb3-4f44-9f5d-9816ea1c82da","importMode":"SNAPSHOT","displayName":"My file import","branchName":"master","subfolder":"subfolder1/subfolder2","fileImportFilters":[{"type":"pathMatchesFilter","regex":"subfolder1/subfolder2/.*"}]}'
Python
Requests 라이브러리가 설치된 Python 환경에서 사용합니다.
import os
import requests
HOSTNAME = os.environ["FOUNDRY_HOST"]
TOKEN = os.environ["FOUNDRY_TOKEN"]
headers = {
"content-type": "application/json",
"authorization": "Bearer {}".format(TOKEN)
}
request_body = {
"datasetRid": "ri.foundry.main.dataset.c26f11c8-cdb3-4f44-9f5d-9816ea1c82da",
"importMode": "SNAPSHOT",
"displayName": "My file import",
"branchName": "master",
"subfolder": "subfolder1/subfolder2",
"fileImportFilters": [
{
"type": "pathMatchesFilter",
"regex": "subfolder1/subfolder2/.*"
}
]
}
response = requests.post('https://{}/api/v2/connectivity/connections/ri.magritte..source.c078b71b-92f9-41b6-b0df-3760f411120b/fileImports'.format(HOSTNAME), headers=headers, json=request_body)
print(response)
Java
Apache HttpClient 4.5 API와 try-with-resources를 사용합니다. 클래스 이름에 맞는 CreateFileImportExample.java 파일에서 사용합니다.
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
public class CreateFileImportExample {
public static void main(String[] args) throws Exception {
String HOSTNAME = System.getenv("FOUNDRY_HOST");
String TOKEN = System.getenv("FOUNDRY_TOKEN");
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
HttpPost request = new HttpPost("https://" + HOSTNAME + "/api/v2/connectivity/connections/ri.magritte..source.c078b71b-92f9-41b6-b0df-3760f411120b/fileImports");
request.addHeader("content-type", "application/json");
request.addHeader("authorization", String.format("Bearer %s", TOKEN));
request.setEntity(new StringEntity("{\"datasetRid\":\"ri.foundry.main.dataset.c26f11c8-cdb3-4f44-9f5d-9816ea1c82da\",\"importMode\":\"SNAPSHOT\",\"displayName\":\"My file import\",\"branchName\":\"master\",\"subfolder\":\"subfolder1/subfolder2\",\"fileImportFilters\":[{\"type\":\"pathMatchesFilter\",\"regex\":\"subfolder1/subfolder2/.*\"}]}", ContentType.APPLICATION_JSON));
try (CloseableHttpResponse response = httpClient.execute(request)) {
System.out.println(response);
}
}
}
}
JavaScript
fetch를 제공하는 Node.js 환경에서 사용합니다. 서비스 사용자 토큰을 브라우저로 전달하지 않습니다.
const HOSTNAME = process.env.FOUNDRY_HOST;
const TOKEN = process.env.FOUNDRY_TOKEN;
fetch(`https://${HOSTNAME}/api/v2/connectivity/connections/ri.magritte..source.c078b71b-92f9-41b6-b0df-3760f411120b/fileImports`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${TOKEN}`,
},
body: '{"datasetRid":"ri.foundry.main.dataset.c26f11c8-cdb3-4f44-9f5d-9816ea1c82da","importMode":"SNAPSHOT","displayName":"My file import","branchName":"master","subfolder":"subfolder1/subfolder2","fileImportFilters":[{"type":"pathMatchesFilter","regex":"subfolder1/subfolder2/.*"}]}'
}).then((response) => {
console.log(response)
});
PowerShell
$ErrorActionPreference = 'Stop'
$TOKEN = $env:FOUNDRY_TOKEN
$HOSTNAME = $env:FOUNDRY_HOST
$headers = @{
"authorization" = "Bearer $TOKEN"
}
$response = Invoke-WebRequest -Uri "https://$HOSTNAME/api/v2/connectivity/connections/ri.magritte..source.c078b71b-92f9-41b6-b0df-3760f411120b/fileImports" `
-Method Post `
-Headers $headers `
-ContentType application/json `
-Body "{`"datasetRid`":`"ri.foundry.main.dataset.c26f11c8-cdb3-4f44-9f5d-9816ea1c82da`",`"importMode`":`"SNAPSHOT`",`"displayName`":`"My file import`",`"branchName`":`"master`",`"subfolder`":`"subfolder1/subfolder2`",`"fileImportFilters`":[{`"type`":`"pathMatchesFilter`",`"regex`":`"subfolder1/subfolder2/.*`"}]}"
$response.content