##// END OF EJS Templates
feat(artifacts): new artifact storage engines allowing an s3 based uploads
feat(artifacts): new artifact storage engines allowing an s3 based uploads

File last commit:

r5516:3496180b default
r5516:3496180b default
Show More
add_artifact.py
104 lines | 3.6 KiB | text/x-python | PythonLexer
# Copyright (C) 2016-2023 RhodeCode GmbH
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License, version 3
# (only), as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# This program is dual-licensed. If you wish to learn more about the
# RhodeCode Enterprise Edition, including its added features, Support services,
# and proprietary license terms, please see https://rhodecode.com/licenses/
import sys
import logging
import click
from rhodecode.lib.pyramid_utils import bootstrap
from rhodecode.model.db import Session, User, Repository
from rhodecode.model.user import UserModel
from rhodecode.apps.file_store import utils as store_utils
log = logging.getLogger(__name__)
@click.command()
@click.argument('ini_path', type=click.Path(exists=True))
@click.option(
'--filename',
required=True,
help='Filename for artifact.')
@click.option(
'--file-path',
required=True,
type=click.Path(exists=True, dir_okay=False, readable=True),
help='Path to a file to be added as artifact')
@click.option(
'--repo-id',
required=True,
type=int,
help='ID of repository to add this artifact to.')
@click.option(
'--user-id',
default=None,
type=int,
help='User ID for creator of artifact. '
'Default would be first super admin.')
@click.option(
'--description',
default=None,
type=str,
help='Add description to this artifact')
def main(ini_path, filename, file_path, repo_id, user_id, description):
return command(ini_path, filename, file_path, repo_id, user_id, description)
def command(ini_path, filename, file_path, repo_id, user_id, description):
with bootstrap(ini_path, env={'RC_CMD_SETUP_RC': '1'}) as env:
try:
from rc_ee.api.views.store_api import _store_file
except ImportError:
click.secho('ERROR: Unable to import store_api. '
'store_api is only available in EE edition of RhodeCode',
fg='red')
sys.exit(-1)
request = env['request']
repo = Repository.get(repo_id)
if not repo:
click.secho(f'ERROR: Unable to find repository with id `{repo_id}`',
fg='red')
sys.exit(-1)
# if we don't give user, or it's "DEFAULT" user we pick super-admin
if user_id is not None or user_id == 1:
db_user = User.get(user_id)
else:
db_user = User.get_first_super_admin()
if not db_user:
click.secho(f'ERROR: Unable to find user with id/username `{user_id}`',
fg='red')
sys.exit(-1)
auth_user = db_user.AuthUser(ip_addr='127.0.0.1')
f_store = store_utils.get_filestore_backend(request.registry.settings)
with open(file_path, 'rb') as f:
click.secho(f'Adding new artifact from path: `{file_path}`',
fg='green')
file_data = _store_file(
f_store, auth_user, filename, content=None, check_acl=True,
file_obj=f, description=description,
scope_repo_id=repo.repo_id)
click.secho(f'File Data: {file_data}', fg='green')