chenrj
2 years ago
committed by
GitHub
19 changed files with 839 additions and 19 deletions
@ -0,0 +1,46 @@ |
|||||||
|
.. Licensed to the Apache Software Foundation (ASF) under one |
||||||
|
or more contributor license agreements. See the NOTICE file |
||||||
|
distributed with this work for additional information |
||||||
|
regarding copyright ownership. The ASF licenses this file |
||||||
|
to you under the Apache License, Version 2.0 (the |
||||||
|
"License"); you may not use this file except in compliance |
||||||
|
with the License. You may obtain a copy of the License at |
||||||
|
|
||||||
|
.. http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
|
||||||
|
.. Unless required by applicable law or agreed to in writing, |
||||||
|
software distributed under the License is distributed on an |
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
||||||
|
KIND, either express or implied. See the License for the |
||||||
|
specific language governing permissions and limitations |
||||||
|
under the License. |
||||||
|
|
||||||
|
GitLab |
||||||
|
====== |
||||||
|
|
||||||
|
`GitLab` is a gitlab resource plugin for pydolphinscheduler. |
||||||
|
|
||||||
|
When using a gitlab resource plugin, you only need to add the `resource_plugin` parameter in the task subclass or workflow definition, |
||||||
|
such as `resource_plugin=GitLab(prefix="xxx")`, if it is a public repository. |
||||||
|
|
||||||
|
If it is a private or Internal repository, you can use three ways to obtain authentication. |
||||||
|
|
||||||
|
The first is `Personal Access Tokens`, using `resource_plugin=GitLab(prefix="xxx", private_token="xxx")`. |
||||||
|
|
||||||
|
The second method is to obtain authentication through `username` and `password`: |
||||||
|
|
||||||
|
using `resource_plugin=GitLab(prefix="xxx", username="username", password="pwd")`. |
||||||
|
|
||||||
|
The third method is to obtain authentication through `OAuth Token`: |
||||||
|
|
||||||
|
using `resource_plugin=GitLab(prefix="xxx", oauth_token="xx")`. |
||||||
|
|
||||||
|
You can view this `document <https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#create-a-personal-access-token>`_ |
||||||
|
when creating a `Personal Access Tokens`. |
||||||
|
|
||||||
|
For the specific use of resource plugins, you can see `How to use` in :doc:`resource-plugin` |
||||||
|
|
||||||
|
Dive Into |
||||||
|
--------- |
||||||
|
|
||||||
|
.. automodule:: pydolphinscheduler.resources_plugin.gitlab |
@ -0,0 +1,44 @@ |
|||||||
|
.. Licensed to the Apache Software Foundation (ASF) under one |
||||||
|
or more contributor license agreements. See the NOTICE file |
||||||
|
distributed with this work for additional information |
||||||
|
regarding copyright ownership. The ASF licenses this file |
||||||
|
to you under the Apache License, Version 2.0 (the |
||||||
|
"License"); you may not use this file except in compliance |
||||||
|
with the License. You may obtain a copy of the License at |
||||||
|
|
||||||
|
.. http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
|
||||||
|
.. Unless required by applicable law or agreed to in writing, |
||||||
|
software distributed under the License is distributed on an |
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
||||||
|
KIND, either express or implied. See the License for the |
||||||
|
specific language governing permissions and limitations |
||||||
|
under the License. |
||||||
|
|
||||||
|
OSS |
||||||
|
=== |
||||||
|
|
||||||
|
`OSS` is a Aliyun OSS resource plugin for pydolphinscheduler. |
||||||
|
|
||||||
|
When using a OSS resource plugin, you only need to add the `resource_plugin` parameter in the task subclass or workflow definition, |
||||||
|
such as `resource_plugin=OSS(prefix="xxx")`, if the file is publicly readable. |
||||||
|
|
||||||
|
When the file is private, using `resource_plugin=OSS(prefix="xxx", access_key_id="xxx", access_key_secret="xxx")` |
||||||
|
|
||||||
|
Notice |
||||||
|
The read permission of files in a bucket is inherited from the bucket by default. In other words, if the bucket is private, |
||||||
|
the files in it are also private. |
||||||
|
|
||||||
|
But the read permission of the files in the bucket can be changed, in other words, the files in the private bucket can also be read publicly. |
||||||
|
|
||||||
|
So whether the `AccessKey` is needed depends on whether the file is private or not. |
||||||
|
|
||||||
|
You can view this `document <https://www.alibabacloud.com/help/en/tablestore/latest/how-can-i-obtain-an-accesskey-pair>`_ |
||||||
|
when creating a pair `AccessKey`. |
||||||
|
|
||||||
|
For the specific use of resource plugins, you can see `How to use` in :doc:`resource-plugin` |
||||||
|
|
||||||
|
Dive Into |
||||||
|
--------- |
||||||
|
|
||||||
|
.. automodule:: pydolphinscheduler.resources_plugin.OSS |
@ -0,0 +1,36 @@ |
|||||||
|
.. Licensed to the Apache Software Foundation (ASF) under one |
||||||
|
or more contributor license agreements. See the NOTICE file |
||||||
|
distributed with this work for additional information |
||||||
|
regarding copyright ownership. The ASF licenses this file |
||||||
|
to you under the Apache License, Version 2.0 (the |
||||||
|
"License"); you may not use this file except in compliance |
||||||
|
with the License. You may obtain a copy of the License at |
||||||
|
|
||||||
|
.. http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
|
||||||
|
.. Unless required by applicable law or agreed to in writing, |
||||||
|
software distributed under the License is distributed on an |
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
||||||
|
KIND, either express or implied. See the License for the |
||||||
|
specific language governing permissions and limitations |
||||||
|
under the License. |
||||||
|
|
||||||
|
S3 |
||||||
|
== |
||||||
|
|
||||||
|
`S3` is a Amazon S3 resource plugin for pydolphinscheduler. |
||||||
|
|
||||||
|
When using a Amazon S3 resource plugin, you only need to add the `resource_plugin` parameter in the task subclass or workflow definition, |
||||||
|
such as `resource_plugin=S3(prefix="xxx")`, if the file is publicly readable. |
||||||
|
|
||||||
|
When the file is private, using `resource_plugin=S3(prefix="xxx", access_key_id="xxx", access_key_secret="xxx")` |
||||||
|
|
||||||
|
You can view this `document <https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html>`_ |
||||||
|
when creating a pair `AccessKey`. |
||||||
|
|
||||||
|
For the specific use of resource plugins, you can see `How to use` in :doc:`resource-plugin` |
||||||
|
|
||||||
|
Dive Into |
||||||
|
--------- |
||||||
|
|
||||||
|
.. automodule:: pydolphinscheduler.resources_plugin.S3 |
@ -0,0 +1,86 @@ |
|||||||
|
# Licensed to the Apache Software Foundation (ASF) under one |
||||||
|
# or more contributor license agreements. See the NOTICE file |
||||||
|
# distributed with this work for additional information |
||||||
|
# regarding copyright ownership. The ASF licenses this file |
||||||
|
# to you under the Apache License, Version 2.0 (the |
||||||
|
# "License"); you may not use this file except in compliance |
||||||
|
# with the License. You may obtain a copy of the License at |
||||||
|
# |
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
# |
||||||
|
# Unless required by applicable law or agreed to in writing, |
||||||
|
# software distributed under the License is distributed on an |
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
||||||
|
# KIND, either express or implied. See the License for the |
||||||
|
# specific language governing permissions and limitations |
||||||
|
# under the License. |
||||||
|
|
||||||
|
"""DolphinScheduler BucketFileInfo and Bucket object.""" |
||||||
|
from abc import ABCMeta, abstractmethod |
||||||
|
from typing import Optional |
||||||
|
|
||||||
|
|
||||||
|
class BucketFileInfo: |
||||||
|
"""A class that defines the details of BUCKET files. |
||||||
|
|
||||||
|
:param bucket: A string representing the bucket to which the bucket file belongs. |
||||||
|
:param file_path: A string representing the bucket file path. |
||||||
|
""" |
||||||
|
|
||||||
|
def __init__( |
||||||
|
self, |
||||||
|
bucket: Optional[str] = None, |
||||||
|
file_path: Optional[str] = None, |
||||||
|
*args, |
||||||
|
**kwargs |
||||||
|
): |
||||||
|
self.bucket = bucket |
||||||
|
self.file_path = file_path |
||||||
|
|
||||||
|
|
||||||
|
class OSSFileInfo(BucketFileInfo): |
||||||
|
"""A class that defines the details of OSS files. |
||||||
|
|
||||||
|
:param endpoint: A string representing the OSS file endpoint. |
||||||
|
:param bucket: A string representing the bucket to which the OSS file belongs. |
||||||
|
:param file_path: A string representing the OSS file path. |
||||||
|
""" |
||||||
|
|
||||||
|
def __init__( |
||||||
|
self, |
||||||
|
endpoint: Optional[str] = None, |
||||||
|
bucket: Optional[str] = None, |
||||||
|
file_path: Optional[str] = None, |
||||||
|
*args, |
||||||
|
**kwargs |
||||||
|
): |
||||||
|
super().__init__(bucket=bucket, file_path=file_path, *args, **kwargs) |
||||||
|
self.endpoint = endpoint |
||||||
|
|
||||||
|
|
||||||
|
class S3FileInfo(BucketFileInfo): |
||||||
|
"""A class that defines the details of S3 files. |
||||||
|
|
||||||
|
:param bucket: A string representing the bucket to which the S3 file belongs. |
||||||
|
:param file_path: A string representing the S3 file path. |
||||||
|
""" |
||||||
|
|
||||||
|
def __init__( |
||||||
|
self, |
||||||
|
bucket: Optional[str] = None, |
||||||
|
file_path: Optional[str] = None, |
||||||
|
*args, |
||||||
|
**kwargs |
||||||
|
): |
||||||
|
super().__init__(bucket=bucket, file_path=file_path, *args, **kwargs) |
||||||
|
|
||||||
|
|
||||||
|
class Bucket(object, metaclass=ABCMeta): |
||||||
|
"""An abstract class of online code repository based on git implementation.""" |
||||||
|
|
||||||
|
_bucket_file_info: Optional = None |
||||||
|
|
||||||
|
@abstractmethod |
||||||
|
def get_bucket_file_info(self, path: str): |
||||||
|
"""Get the detailed information of BUCKET file according to the file URL.""" |
||||||
|
raise NotImplementedError |
@ -0,0 +1,112 @@ |
|||||||
|
# Licensed to the Apache Software Foundation (ASF) under one |
||||||
|
# or more contributor license agreements. See the NOTICE file |
||||||
|
# distributed with this work for additional information |
||||||
|
# regarding copyright ownership. The ASF licenses this file |
||||||
|
# to you under the Apache License, Version 2.0 (the |
||||||
|
# "License"); you may not use this file except in compliance |
||||||
|
# with the License. You may obtain a copy of the License at |
||||||
|
# |
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
# |
||||||
|
# Unless required by applicable law or agreed to in writing, |
||||||
|
# software distributed under the License is distributed on an |
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
||||||
|
# KIND, either express or implied. See the License for the |
||||||
|
# specific language governing permissions and limitations |
||||||
|
# under the License. |
||||||
|
|
||||||
|
"""DolphinScheduler gitlab resource plugin.""" |
||||||
|
from typing import Optional |
||||||
|
from urllib.parse import urljoin, urlparse |
||||||
|
|
||||||
|
import gitlab |
||||||
|
import requests |
||||||
|
|
||||||
|
from pydolphinscheduler.constants import Symbol |
||||||
|
from pydolphinscheduler.core.resource_plugin import ResourcePlugin |
||||||
|
from pydolphinscheduler.resources_plugin.base.git import Git, GitLabFileInfo |
||||||
|
|
||||||
|
|
||||||
|
class GitLab(ResourcePlugin, Git): |
||||||
|
"""GitLab object, declare GitLab resource plugin for task and workflow to dolphinscheduler. |
||||||
|
|
||||||
|
:param prefix: A string representing the prefix of GitLab. |
||||||
|
:param private_token: A string used for identity authentication of GitLab private or Internal repository. |
||||||
|
:param oauth_token: A string used for identity authentication of GitLab private or Internal repository. |
||||||
|
:param username: A string representing the user of the repository. |
||||||
|
:param password: A string representing the user password. |
||||||
|
""" |
||||||
|
|
||||||
|
def __init__( |
||||||
|
self, |
||||||
|
prefix: str, |
||||||
|
private_token: Optional[str] = None, |
||||||
|
oauth_token: Optional[str] = None, |
||||||
|
username: Optional[str] = None, |
||||||
|
password: Optional[str] = None, |
||||||
|
*args, |
||||||
|
**kwargs, |
||||||
|
): |
||||||
|
super().__init__(prefix, *args, **kwargs) |
||||||
|
self.private_token = private_token |
||||||
|
self.oauth_token = oauth_token |
||||||
|
self.username = username |
||||||
|
self.password = password |
||||||
|
|
||||||
|
def get_git_file_info(self, path: str): |
||||||
|
"""Get file information from the file url, like repository name, user, branch, and file path.""" |
||||||
|
self.get_index(path, Symbol.SLASH, 8) |
||||||
|
result = urlparse(path) |
||||||
|
elements = result.path.split(Symbol.SLASH) |
||||||
|
self._git_file_info = GitLabFileInfo( |
||||||
|
host=f"{result.scheme}://{result.hostname}", |
||||||
|
repo_name=elements[2], |
||||||
|
branch=elements[5], |
||||||
|
file_path=Symbol.SLASH.join( |
||||||
|
str(elements[i]) for i in range(6, len(elements)) |
||||||
|
), |
||||||
|
user=elements[1], |
||||||
|
) |
||||||
|
|
||||||
|
def authentication(self): |
||||||
|
"""Gitlab authentication.""" |
||||||
|
host = self._git_file_info.host |
||||||
|
if self.private_token is not None: |
||||||
|
return gitlab.Gitlab(host, private_token=self.private_token) |
||||||
|
if self.oauth_token is not None: |
||||||
|
return gitlab.Gitlab(host, oauth_token=self.oauth_token) |
||||||
|
if self.username is not None and self.password is not None: |
||||||
|
oauth_token = self.OAuth_token() |
||||||
|
return gitlab.Gitlab(host, oauth_token=oauth_token) |
||||||
|
return gitlab.Gitlab(host) |
||||||
|
|
||||||
|
def OAuth_token(self): |
||||||
|
"""Obtain OAuth Token.""" |
||||||
|
data = { |
||||||
|
"grant_type": "password", |
||||||
|
"username": self.username, |
||||||
|
"password": self.password, |
||||||
|
} |
||||||
|
host = self._git_file_info.host |
||||||
|
resp = requests.post("%s/oauth/token" % host, data=data) |
||||||
|
oauth_token = resp.json()["access_token"] |
||||||
|
return oauth_token |
||||||
|
|
||||||
|
def read_file(self, suf: str): |
||||||
|
"""Get the content of the file. |
||||||
|
|
||||||
|
The address of the file is the prefix of the resource plugin plus the parameter suf. |
||||||
|
""" |
||||||
|
path = urljoin(self.prefix, suf) |
||||||
|
self.get_git_file_info(path) |
||||||
|
gl = self.authentication() |
||||||
|
project = gl.projects.get( |
||||||
|
"%s/%s" % (self._git_file_info.user, self._git_file_info.repo_name) |
||||||
|
) |
||||||
|
return ( |
||||||
|
project.files.get( |
||||||
|
file_path=self._git_file_info.file_path, ref=self._git_file_info.branch |
||||||
|
) |
||||||
|
.decode() |
||||||
|
.decode() |
||||||
|
) |
@ -0,0 +1,76 @@ |
|||||||
|
# Licensed to the Apache Software Foundation (ASF) under one |
||||||
|
# or more contributor license agreements. See the NOTICE file |
||||||
|
# distributed with this work for additional information |
||||||
|
# regarding copyright ownership. The ASF licenses this file |
||||||
|
# to you under the Apache License, Version 2.0 (the |
||||||
|
# "License"); you may not use this file except in compliance |
||||||
|
# with the License. You may obtain a copy of the License at |
||||||
|
# |
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
# |
||||||
|
# Unless required by applicable law or agreed to in writing, |
||||||
|
# software distributed under the License is distributed on an |
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
||||||
|
# KIND, either express or implied. See the License for the |
||||||
|
# specific language governing permissions and limitations |
||||||
|
# under the License. |
||||||
|
|
||||||
|
"""DolphinScheduler oss resource plugin.""" |
||||||
|
from typing import Optional |
||||||
|
from urllib.parse import urljoin, urlparse |
||||||
|
|
||||||
|
import oss2 |
||||||
|
|
||||||
|
from pydolphinscheduler.constants import Symbol |
||||||
|
from pydolphinscheduler.core.resource_plugin import ResourcePlugin |
||||||
|
from pydolphinscheduler.resources_plugin.base.bucket import Bucket, OSSFileInfo |
||||||
|
|
||||||
|
|
||||||
|
class OSS(ResourcePlugin, Bucket): |
||||||
|
"""OSS object, declare OSS resource plugin for task and workflow to dolphinscheduler. |
||||||
|
|
||||||
|
:param prefix: A string representing the prefix of OSS. |
||||||
|
:param access_key_id: A string representing the ID of AccessKey for AliCloud OSS. |
||||||
|
:param access_key_secret: A string representing the secret of AccessKey for AliCloud OSS. |
||||||
|
""" |
||||||
|
|
||||||
|
def __init__( |
||||||
|
self, |
||||||
|
prefix: str, |
||||||
|
access_key_id: Optional[str] = None, |
||||||
|
access_key_secret: Optional[str] = None, |
||||||
|
*args, |
||||||
|
**kwargs, |
||||||
|
): |
||||||
|
super().__init__(prefix, *args, **kwargs) |
||||||
|
self.access_key_id = access_key_id |
||||||
|
self.access_key_secret = access_key_secret |
||||||
|
|
||||||
|
_bucket_file_info: Optional[OSSFileInfo] = None |
||||||
|
|
||||||
|
def get_bucket_file_info(self, path: str): |
||||||
|
"""Get file information from the file url, like repository name, user, branch, and file path.""" |
||||||
|
self.get_index(path, Symbol.SLASH, 3) |
||||||
|
result = urlparse(path) |
||||||
|
hostname = result.hostname |
||||||
|
elements = hostname.split(Symbol.POINT) |
||||||
|
self._bucket_file_info = OSSFileInfo( |
||||||
|
endpoint=f"{result.scheme}://" |
||||||
|
f"{Symbol.POINT.join(str(elements[i]) for i in range(1, len(elements)))}", |
||||||
|
bucket=hostname.split(Symbol.POINT)[0], |
||||||
|
file_path=result.path[1:], |
||||||
|
) |
||||||
|
|
||||||
|
def read_file(self, suf: str): |
||||||
|
"""Get the content of the file. |
||||||
|
|
||||||
|
The address of the file is the prefix of the resource plugin plus the parameter suf. |
||||||
|
""" |
||||||
|
path = urljoin(self.prefix, suf) |
||||||
|
self.get_bucket_file_info(path) |
||||||
|
auth = oss2.Auth(self.access_key_id, self.access_key_secret) |
||||||
|
bucket = oss2.Bucket( |
||||||
|
auth, self._bucket_file_info.endpoint, self._bucket_file_info.bucket |
||||||
|
) |
||||||
|
result = bucket.get_object(self._bucket_file_info.file_path).read().decode() |
||||||
|
return result.read().decode() |
@ -0,0 +1,74 @@ |
|||||||
|
# Licensed to the Apache Software Foundation (ASF) under one |
||||||
|
# or more contributor license agreements. See the NOTICE file |
||||||
|
# distributed with this work for additional information |
||||||
|
# regarding copyright ownership. The ASF licenses this file |
||||||
|
# to you under the Apache License, Version 2.0 (the |
||||||
|
# "License"); you may not use this file except in compliance |
||||||
|
# with the License. You may obtain a copy of the License at |
||||||
|
# |
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
# |
||||||
|
# Unless required by applicable law or agreed to in writing, |
||||||
|
# software distributed under the License is distributed on an |
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
||||||
|
# KIND, either express or implied. See the License for the |
||||||
|
# specific language governing permissions and limitations |
||||||
|
# under the License. |
||||||
|
|
||||||
|
"""DolphinScheduler S3 resource plugin.""" |
||||||
|
|
||||||
|
from typing import Optional |
||||||
|
from urllib.parse import urljoin |
||||||
|
|
||||||
|
import boto3 |
||||||
|
|
||||||
|
from pydolphinscheduler.constants import Symbol |
||||||
|
from pydolphinscheduler.core.resource_plugin import ResourcePlugin |
||||||
|
from pydolphinscheduler.resources_plugin.base.bucket import Bucket, S3FileInfo |
||||||
|
|
||||||
|
|
||||||
|
class S3(ResourcePlugin, Bucket): |
||||||
|
"""S3 object, declare S3 resource plugin for task and workflow to dolphinscheduler. |
||||||
|
|
||||||
|
:param prefix: A string representing the prefix of S3. |
||||||
|
:param access_key_id: A string representing the ID of AccessKey for Amazon S3. |
||||||
|
:param access_key_secret: A string representing the secret of AccessKey for Amazon S3. |
||||||
|
""" |
||||||
|
|
||||||
|
def __init__( |
||||||
|
self, |
||||||
|
prefix: str, |
||||||
|
access_key_id: Optional[str] = None, |
||||||
|
access_key_secret: Optional[str] = None, |
||||||
|
*args, |
||||||
|
**kwargs |
||||||
|
): |
||||||
|
super().__init__(prefix, *args, **kwargs) |
||||||
|
self.access_key_id = access_key_id |
||||||
|
self.access_key_secret = access_key_secret |
||||||
|
|
||||||
|
_bucket_file_info: Optional[S3FileInfo] = None |
||||||
|
|
||||||
|
def get_bucket_file_info(self, path: str): |
||||||
|
"""Get file information from the file url, like repository name, user, branch, and file path.""" |
||||||
|
elements = path.split(Symbol.SLASH) |
||||||
|
self.get_index(path, Symbol.SLASH, 3) |
||||||
|
self._bucket_file_info = S3FileInfo( |
||||||
|
bucket=elements[2].split(Symbol.POINT)[0], |
||||||
|
file_path=Symbol.SLASH.join( |
||||||
|
str(elements[i]) for i in range(3, len(elements)) |
||||||
|
), |
||||||
|
) |
||||||
|
|
||||||
|
def read_file(self, suf: str): |
||||||
|
"""Get the content of the file. |
||||||
|
|
||||||
|
The address of the file is the prefix of the resource plugin plus the parameter suf. |
||||||
|
""" |
||||||
|
path = urljoin(self.prefix, suf) |
||||||
|
self.get_bucket_file_info(path) |
||||||
|
bucket = self._bucket_file_info.bucket |
||||||
|
key = self._bucket_file_info.file_path |
||||||
|
s3_resource = boto3.resource("s3") |
||||||
|
s3_object = s3_resource.Object(bucket, key) |
||||||
|
return s3_object.get()["Body"].read().decode("utf-8") |
@ -0,0 +1,116 @@ |
|||||||
|
# Licensed to the Apache Software Foundation (ASF) under one |
||||||
|
# or more contributor license agreements. See the NOTICE file |
||||||
|
# distributed with this work for additional information |
||||||
|
# regarding copyright ownership. The ASF licenses this file |
||||||
|
# to you under the Apache License, Version 2.0 (the |
||||||
|
# "License"); you may not use this file except in compliance |
||||||
|
# with the License. You may obtain a copy of the License at |
||||||
|
# |
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
# |
||||||
|
# Unless required by applicable law or agreed to in writing, |
||||||
|
# software distributed under the License is distributed on an |
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
||||||
|
# KIND, either express or implied. See the License for the |
||||||
|
# specific language governing permissions and limitations |
||||||
|
# under the License. |
||||||
|
|
||||||
|
"""Test github resource plugin.""" |
||||||
|
import pytest |
||||||
|
|
||||||
|
from pydolphinscheduler.resources_plugin.gitlab import GitLab |
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize( |
||||||
|
"attr, expected", |
||||||
|
[ |
||||||
|
( |
||||||
|
"https://gitlab.com/pydolphinscheduler/ds-gitlab/-/blob/main/union.sh", |
||||||
|
{ |
||||||
|
"branch": "main", |
||||||
|
"file_path": "union.sh", |
||||||
|
"host": "https://gitlab.com", |
||||||
|
"repo_name": "ds-gitlab", |
||||||
|
"user": "pydolphinscheduler", |
||||||
|
}, |
||||||
|
), |
||||||
|
( |
||||||
|
"https://gitlab.com/pydolphinscheduler/ds/-/blob/dev/test/exc.sh", |
||||||
|
{ |
||||||
|
"branch": "dev", |
||||||
|
"file_path": "test/exc.sh", |
||||||
|
"host": "https://gitlab.com", |
||||||
|
"repo_name": "ds", |
||||||
|
"user": "pydolphinscheduler", |
||||||
|
}, |
||||||
|
), |
||||||
|
], |
||||||
|
) |
||||||
|
def test_gitlab_get_git_file_info(attr, expected): |
||||||
|
"""Test the get_file_info function of the gitlab resource plugin.""" |
||||||
|
gitlab = GitLab(prefix="prefix") |
||||||
|
gitlab.get_git_file_info(attr) |
||||||
|
assert expected == gitlab._git_file_info.__dict__ |
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skip(reason="This test needs gitlab service") |
||||||
|
@pytest.mark.parametrize( |
||||||
|
"attr, expected", |
||||||
|
[ |
||||||
|
( |
||||||
|
{ |
||||||
|
"init": { |
||||||
|
"prefix": "https://gitlab.com/pydolphinscheduler/ds-internal/-/blob/main", |
||||||
|
"oauth_token": "24518bd4cf5bfe9xx", |
||||||
|
}, |
||||||
|
"file_path": "union.sh", |
||||||
|
}, |
||||||
|
"test gitlab resource plugin\n", |
||||||
|
), |
||||||
|
( |
||||||
|
{ |
||||||
|
"init": { |
||||||
|
"prefix": "https://gitlab.com/pydolphinscheduler/ds/-/blob/main", |
||||||
|
"private_token": "9TyTe2xx", |
||||||
|
}, |
||||||
|
"file_path": "union.sh", |
||||||
|
}, |
||||||
|
"test gitlab resource plugin\n", |
||||||
|
), |
||||||
|
( |
||||||
|
{ |
||||||
|
"init": { |
||||||
|
"prefix": "https://gitlab.com/pydolphinscheduler/ds-gitlab/-/blob/main", |
||||||
|
"username": "pydolphinscheduler", |
||||||
|
"password": "4295xx", |
||||||
|
}, |
||||||
|
"file_path": "union.sh", |
||||||
|
}, |
||||||
|
"test gitlab resource plugin\n", |
||||||
|
), |
||||||
|
( |
||||||
|
{ |
||||||
|
"init": { |
||||||
|
"prefix": "https://gitlab.com/pydolphinscheduler/ds-public/-/blob/main", |
||||||
|
}, |
||||||
|
"file_path": "union.sh", |
||||||
|
}, |
||||||
|
"test gitlab resource plugin\n", |
||||||
|
), |
||||||
|
( |
||||||
|
{ |
||||||
|
"init": { |
||||||
|
"prefix": "https://gitlab.com/pydolphinscheduler/ds-internal/-/blob/main", |
||||||
|
"username": "pydolphinscheduler", |
||||||
|
"password": "429xxx", |
||||||
|
}, |
||||||
|
"file_path": "union.sh", |
||||||
|
}, |
||||||
|
"test gitlab resource plugin\n", |
||||||
|
), |
||||||
|
], |
||||||
|
) |
||||||
|
def test_gitlab_read_file(attr, expected): |
||||||
|
"""Test the read_file function of the gitlab resource plug-in.""" |
||||||
|
gitlab = GitLab(**attr.get("init")) |
||||||
|
assert expected == gitlab.read_file(attr.get("file_path")) |
@ -0,0 +1,112 @@ |
|||||||
|
# Licensed to the Apache Software Foundation (ASF) under one |
||||||
|
# or more contributor license agreements. See the NOTICE file |
||||||
|
# distributed with this work for additional information |
||||||
|
# regarding copyright ownership. The ASF licenses this file |
||||||
|
# to you under the Apache License, Version 2.0 (the |
||||||
|
# "License"); you may not use this file except in compliance |
||||||
|
# with the License. You may obtain a copy of the License at |
||||||
|
# |
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
# |
||||||
|
# Unless required by applicable law or agreed to in writing, |
||||||
|
# software distributed under the License is distributed on an |
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
||||||
|
# KIND, either express or implied. See the License for the |
||||||
|
# specific language governing permissions and limitations |
||||||
|
# under the License. |
||||||
|
|
||||||
|
"""Test oss resource plugin.""" |
||||||
|
import pytest |
||||||
|
|
||||||
|
from pydolphinscheduler.resources_plugin.oss import OSS |
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize( |
||||||
|
"attr, expected", |
||||||
|
[ |
||||||
|
( |
||||||
|
"https://ospp-ds-private.oss-cn-hangzhou.aliyuncs.com/a.sh", |
||||||
|
{ |
||||||
|
"endpoint": "https://oss-cn-hangzhou.aliyuncs.com", |
||||||
|
"file_path": "a.sh", |
||||||
|
"bucket": "ospp-ds-private", |
||||||
|
}, |
||||||
|
), |
||||||
|
( |
||||||
|
"https://ospp-ds-public.oss-cn-hangzhou.aliyuncs.com/dir/a.sh", |
||||||
|
{ |
||||||
|
"endpoint": "https://oss-cn-hangzhou.aliyuncs.com", |
||||||
|
"file_path": "dir/a.sh", |
||||||
|
"bucket": "ospp-ds-public", |
||||||
|
}, |
||||||
|
), |
||||||
|
], |
||||||
|
) |
||||||
|
def test_oss_get_bucket_file_info(attr, expected): |
||||||
|
"""Test the get_bucket_file_info function of the oss resource plugin.""" |
||||||
|
oss = OSS(prefix="prefix") |
||||||
|
oss.get_bucket_file_info(attr) |
||||||
|
assert expected == oss._bucket_file_info.__dict__ |
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skip(reason="This test requires OSS services") |
||||||
|
@pytest.mark.parametrize( |
||||||
|
"attr, expected", |
||||||
|
[ |
||||||
|
( |
||||||
|
{ |
||||||
|
"init": { |
||||||
|
"prefix": "https://ospp-ds-private.oss-cn-hangzhou.aliyuncs.com", |
||||||
|
"access_key_id": "LTAI5tP25Mxx", |
||||||
|
"access_key_secret": "cSur23Qbxx", |
||||||
|
}, |
||||||
|
"file_path": "a.sh", |
||||||
|
}, |
||||||
|
"test oss resource plugin\n", |
||||||
|
), |
||||||
|
( |
||||||
|
{ |
||||||
|
"init": { |
||||||
|
"prefix": "https://ospp-ds-private.oss-cn-hangzhou.aliyuncs.com/dir/", |
||||||
|
"access_key_id": "LTAxx", |
||||||
|
"access_key_secret": "cSur23Qxx", |
||||||
|
}, |
||||||
|
"file_path": "b.sh", |
||||||
|
}, |
||||||
|
"test oss resource plugin\n", |
||||||
|
), |
||||||
|
( |
||||||
|
{ |
||||||
|
"init": { |
||||||
|
"prefix": "https://ospp-ds-private.oss-cn-hangzhou.aliyuncs.com", |
||||||
|
}, |
||||||
|
"file_path": "b.sh", |
||||||
|
}, |
||||||
|
"test oss resource plugin\n", |
||||||
|
), |
||||||
|
( |
||||||
|
{ |
||||||
|
"init": { |
||||||
|
"prefix": "https://ospp-ds-public.oss-cn-hangzhou.aliyuncs.com", |
||||||
|
}, |
||||||
|
"file_path": "b.sh", |
||||||
|
}, |
||||||
|
"test oss resource plugin\n", |
||||||
|
), |
||||||
|
( |
||||||
|
{ |
||||||
|
"init": { |
||||||
|
"prefix": "https://ospp-ds-public.oss-cn-hangzhou.aliyuncs.com/dir/", |
||||||
|
"access_key_id": "LTAIxx", |
||||||
|
"access_key_secret": "cSurxx", |
||||||
|
}, |
||||||
|
"file_path": "a.sh", |
||||||
|
}, |
||||||
|
"test oss resource plugin\n", |
||||||
|
), |
||||||
|
], |
||||||
|
) |
||||||
|
def test_oss_read_file(attr, expected): |
||||||
|
"""Test the read_file function of the oss resource plug-in.""" |
||||||
|
oss = OSS(**attr.get("init")) |
||||||
|
assert expected == oss.read_file(attr.get("file_path")) |
@ -0,0 +1,79 @@ |
|||||||
|
# Licensed to the Apache Software Foundation (ASF) under one |
||||||
|
# or more contributor license agreements. See the NOTICE file |
||||||
|
# distributed with this work for additional information |
||||||
|
# regarding copyright ownership. The ASF licenses this file |
||||||
|
# to you under the Apache License, Version 2.0 (the |
||||||
|
# "License"); you may not use this file except in compliance |
||||||
|
# with the License. You may obtain a copy of the License at |
||||||
|
# |
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
# |
||||||
|
# Unless required by applicable law or agreed to in writing, |
||||||
|
# software distributed under the License is distributed on an |
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
||||||
|
# KIND, either express or implied. See the License for the |
||||||
|
# specific language governing permissions and limitations |
||||||
|
# under the License. |
||||||
|
|
||||||
|
"""Test oss resource plugin.""" |
||||||
|
import pytest |
||||||
|
|
||||||
|
from pydolphinscheduler.resources_plugin import S3 |
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize( |
||||||
|
"attr, expected", |
||||||
|
[ |
||||||
|
( |
||||||
|
"https://ds-resource-plugin-private.s3.amazonaws.com/a.sh", |
||||||
|
{ |
||||||
|
"file_path": "a.sh", |
||||||
|
"bucket": "ds-resource-plugin-private", |
||||||
|
}, |
||||||
|
), |
||||||
|
( |
||||||
|
"https://ds-resource-plugin-public.s3.amazonaws.com/dir/a.sh", |
||||||
|
{ |
||||||
|
"file_path": "dir/a.sh", |
||||||
|
"bucket": "ds-resource-plugin-public", |
||||||
|
}, |
||||||
|
), |
||||||
|
], |
||||||
|
) |
||||||
|
def test_s3_get_bucket_file_info(attr, expected): |
||||||
|
"""Test the get_bucket_file_info function of the s3 resource plugin.""" |
||||||
|
s3 = S3(prefix="prefix") |
||||||
|
s3.get_bucket_file_info(attr) |
||||||
|
assert expected == s3._bucket_file_info.__dict__ |
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skip(reason="This test requires s3 services") |
||||||
|
@pytest.mark.parametrize( |
||||||
|
"attr, expected", |
||||||
|
[ |
||||||
|
( |
||||||
|
{ |
||||||
|
"init": { |
||||||
|
"prefix": "https://ds-resource-plugin-private.s3.amazonaws.com/dir/", |
||||||
|
"access_key_id": "LTAI5tP25Mxx", |
||||||
|
"access_key_secret": "cSur23Qbxx", |
||||||
|
}, |
||||||
|
"file_path": "a.sh", |
||||||
|
}, |
||||||
|
"test s3 resource plugin\n", |
||||||
|
), |
||||||
|
( |
||||||
|
{ |
||||||
|
"init": { |
||||||
|
"prefix": "https://ds-resource-plugin-public.s3.amazonaws.com/", |
||||||
|
}, |
||||||
|
"file_path": "a.sh", |
||||||
|
}, |
||||||
|
"test s3 resource plugin\n", |
||||||
|
), |
||||||
|
], |
||||||
|
) |
||||||
|
def test_s3_read_file(attr, expected): |
||||||
|
"""Test the read_file function of the s3 resource plug-in.""" |
||||||
|
s3 = S3(**attr.get("init")) |
||||||
|
assert expected == s3.read_file(attr.get("file_path")) |
Loading…
Reference in new issue