Skip to content

Commit 1d3e96f

Browse files
authored
add support oracle oci object storage (langgenius#5616)
1 parent b7b1396 commit 1d3e96f

File tree

6 files changed

+118
-0
lines changed

6 files changed

+118
-0
lines changed

api/.env.example

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,13 @@ TENCENT_COS_SECRET_ID=your-secret-id
7272
TENCENT_COS_REGION=your-region
7373
TENCENT_COS_SCHEME=your-scheme
7474

75+
# OCI Storage configuration
76+
OCI_ENDPOINT=your-endpoint
77+
OCI_BUCKET_NAME=your-bucket-name
78+
OCI_ACCESS_KEY=your-access-key
79+
OCI_SECRET_KEY=your-secret-key
80+
OCI_REGION=your-region
81+
7582
# CORS configuration
7683
WEB_API_CORS_ALLOW_ORIGINS=http://127.0.0.1:3000,*
7784
CONSOLE_CORS_ALLOW_ORIGINS=http://127.0.0.1:3000,*

api/configs/middleware/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from configs.middleware.storage.amazon_s3_storage_config import S3StorageConfig
88
from configs.middleware.storage.azure_blob_storage_config import AzureBlobStorageConfig
99
from configs.middleware.storage.google_cloud_storage_config import GoogleCloudStorageConfig
10+
from configs.middleware.storage.oci_storage_config import OCIStorageConfig
1011
from configs.middleware.storage.tencent_cos_storage_config import TencentCloudCOSStorageConfig
1112
from configs.middleware.vdb.chroma_config import ChromaConfig
1213
from configs.middleware.vdb.milvus_config import MilvusConfig
@@ -167,6 +168,7 @@ class MiddlewareConfig(
167168
GoogleCloudStorageConfig,
168169
TencentCloudCOSStorageConfig,
169170
S3StorageConfig,
171+
OCIStorageConfig,
170172

171173
# configs of vdb and vdb providers
172174
VectorStoreConfig,
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from typing import Optional
2+
3+
from pydantic import BaseModel, Field
4+
5+
6+
class OCIStorageConfig(BaseModel):
7+
"""
8+
OCI storage configs
9+
"""
10+
11+
OCI_ENDPOINT: Optional[str] = Field(
12+
description='OCI storage endpoint',
13+
default=None,
14+
)
15+
16+
OCI_REGION: Optional[str] = Field(
17+
description='OCI storage region',
18+
default=None,
19+
)
20+
21+
OCI_BUCKET_NAME: Optional[str] = Field(
22+
description='OCI storage bucket name',
23+
default=None,
24+
)
25+
26+
OCI_ACCESS_KEY: Optional[str] = Field(
27+
description='OCI storage access key',
28+
default=None,
29+
)
30+
31+
OCI_SECRET_KEY: Optional[str] = Field(
32+
description='OCI storage secret key',
33+
default=None,
34+
)
35+

api/extensions/ext_storage.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from extensions.storage.azure_storage import AzureStorage
88
from extensions.storage.google_storage import GoogleStorage
99
from extensions.storage.local_storage import LocalStorage
10+
from extensions.storage.oci_storage import OCIStorage
1011
from extensions.storage.s3_storage import S3Storage
1112
from extensions.storage.tencent_storage import TencentStorage
1213

@@ -37,6 +38,10 @@ def init_app(self, app: Flask):
3738
self.storage_runner = TencentStorage(
3839
app=app
3940
)
41+
elif storage_type == 'oci-storage':
42+
self.storage_runner = OCIStorage(
43+
app=app
44+
)
4045
else:
4146
self.storage_runner = LocalStorage(app=app)
4247

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
from collections.abc import Generator
2+
from contextlib import closing
3+
4+
import boto3
5+
from botocore.exceptions import ClientError
6+
from flask import Flask
7+
8+
from extensions.storage.base_storage import BaseStorage
9+
10+
11+
class OCIStorage(BaseStorage):
12+
def __init__(self, app: Flask):
13+
super().__init__(app)
14+
app_config = self.app.config
15+
self.bucket_name = app_config.get('OCI_BUCKET_NAME')
16+
self.client = boto3.client(
17+
's3',
18+
aws_secret_access_key=app_config.get('OCI_SECRET_KEY'),
19+
aws_access_key_id=app_config.get('OCI_ACCESS_KEY'),
20+
endpoint_url=app_config.get('OCI_ENDPOINT'),
21+
region_name=app_config.get('OCI_REGION')
22+
)
23+
24+
def save(self, filename, data):
25+
self.client.put_object(Bucket=self.bucket_name, Key=filename, Body=data)
26+
27+
def load_once(self, filename: str) -> bytes:
28+
try:
29+
with closing(self.client) as client:
30+
data = client.get_object(Bucket=self.bucket_name, Key=filename)['Body'].read()
31+
except ClientError as ex:
32+
if ex.response['Error']['Code'] == 'NoSuchKey':
33+
raise FileNotFoundError("File not found")
34+
else:
35+
raise
36+
return data
37+
38+
def load_stream(self, filename: str) -> Generator:
39+
def generate(filename: str = filename) -> Generator:
40+
try:
41+
with closing(self.client) as client:
42+
response = client.get_object(Bucket=self.bucket_name, Key=filename)
43+
yield from response['Body'].iter_chunks()
44+
except ClientError as ex:
45+
if ex.response['Error']['Code'] == 'NoSuchKey':
46+
raise FileNotFoundError("File not found")
47+
else:
48+
raise
49+
return generate()
50+
51+
def download(self, filename, target_filepath):
52+
with closing(self.client) as client:
53+
client.download_file(self.bucket_name, filename, target_filepath)
54+
55+
def exists(self, filename):
56+
with closing(self.client) as client:
57+
try:
58+
client.head_object(Bucket=self.bucket_name, Key=filename)
59+
return True
60+
except:
61+
return False
62+
63+
def delete(self, filename):
64+
self.client.delete_object(Bucket=self.bucket_name, Key=filename)

docker/docker-compose.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ x-shared-env: &shared-api-worker-env
6464
TENCENT_COS_SECRET_ID: ${TENCENT_COS_SECRET_ID:-}
6565
TENCENT_COS_REGION: ${TENCENT_COS_REGION:-}
6666
TENCENT_COS_SCHEME: ${TENCENT_COS_SCHEME:-}
67+
OCI_ENDPOINT: ${OCI_ENDPOINT:-}
68+
OCI_BUCKET_NAME: ${OCI_BUCKET_NAME:-}
69+
OCI_ACCESS_KEY: ${OCI_ACCESS_KEY:-}
70+
OCI_SECRET_KEY: ${OCI_SECRET_KEY:-}
71+
OCI_REGION: ${OCI_REGION:-}
6772
VECTOR_STORE: ${VECTOR_STORE:-weaviate}
6873
WEAVIATE_ENDPOINT: ${WEAVIATE_ENDPOINT:-http://weaviate:8080}
6974
WEAVIATE_API_KEY: ${WEAVIATE_API_KEY:-WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih}

0 commit comments

Comments
 (0)