diff --git a/robot/resources/lib/gates.py b/robot/resources/lib/gates.py index 5400f55..cf04f32 100644 --- a/robot/resources/lib/gates.py +++ b/robot/resources/lib/gates.py @@ -9,6 +9,7 @@ import subprocess import boto3 import uuid import io +import pexpect from robot.api.deco import keyword from robot.api import logger @@ -20,24 +21,25 @@ from common import * ROBOT_AUTO_KEYWORDS = False -CDNAUTH_EXEC = os.getenv('CDNAUTH_EXEC', 'cdn-authmate') +NEOFS_EXEC = os.getenv('NEOFS_EXEC', 'neofs-authmate') @keyword('Init S3 Credentials') -def init_s3_credentials(private_key: str, s3_key): +def init_s3_credentials(wallet): bucket = str(uuid.uuid4()) + records = ' \' {"records":[{"operation":"PUT","action":"ALLOW","filters":[],"targets":[{"role":"OTHERS","keys":[]}]}, {"operation":"SEARCH","action":"ALLOW","filters":[],"targets":[{"role":"OTHERS","keys":[]}]}, {"operation":"GET","action":"ALLOW","filters":[],"targets":[{"role":"OTHERS","keys":[]}]}]} \' ' Cmd = ( - f'{CDNAUTH_EXEC} --debug --with-log issue-secret --neofs-key {private_key} ' - f'--gate-public-key={s3_key} --peer {NEOFS_ENDPOINT} ' - f'--container-friendly-name {bucket}' + f'{NEOFS_EXEC} --debug --with-log issue-secret --wallet {wallet} ' + f'--gate-public-key={GATE_PUB_KEY} --peer {NEOFS_ENDPOINT} ' + f'--container-friendly-name {bucket} --create-session-token ' + f'--bearer-rules {records}' ) - logger.info("Cmd: %s" % Cmd) - try: - complProc = subprocess.run(Cmd, check=True, universal_newlines=True, - stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=360, shell=True) - output = complProc.stdout - logger.info("Output: %s" % output) + logger.info(f"Executing command: {Cmd}") - m = re.search(r'"cid":\s+"(\w+)"', output) + try: + output = _run_with_passwd(Cmd) + logger.info(f"Command completed with output: {output}") + + m = re.search(r'"container_id":\s+"(\w+)"', output) cid = m.group(1) logger.info("cid: %s" % cid) @@ -56,8 +58,15 @@ def init_s3_credentials(private_key: str, s3_key): return cid, bucket, access_key_id, secret_access_key, owner_private_key except subprocess.CalledProcessError as e: - raise Exception("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output)) + raise Exception(f"Error: \nreturn code: {e.returncode}. \nOutput: {e.stderr}") +def _run_with_passwd(cmd): + p = pexpect.spawn(cmd) + p.expect(".*") + p.sendline('\r') + p.wait() + cmd = p.read() + return cmd.decode() @keyword('Config S3 client') def config_s3_client(access_key_id, secret_access_key): @@ -72,7 +81,6 @@ def config_s3_client(access_key_id, secret_access_key): return s3_client - @keyword('List objects S3 v2') def list_objects_s3_v2(s3_client, bucket): response = s3_client.list_objects_v2(Bucket=bucket) @@ -94,6 +102,12 @@ def list_objects_s3(s3_client, bucket): logger.info("Found s3 objects: %s" % obj_list) return obj_list +@keyword('Create bucket S3') +def create_bucket_s3(s3_client): + bucket_name = str(uuid.uuid4()) + s3_bucket = s3_client.create_bucket(Bucket=bucket_name) + logger.info("Created S3 bucket: %s" % s3_bucket) + return bucket_name @keyword('List buckets S3') def list_buckets_s3(s3_client): @@ -106,7 +120,6 @@ def list_buckets_s3(s3_client): return found_buckets - @keyword('Put object S3') def put_object_s3(s3_client, bucket, filepath): filename = os.path.basename(filepath) diff --git a/robot/resources/lib/neofs.py b/robot/resources/lib/neofs.py index 2019a0b..16f57aa 100644 --- a/robot/resources/lib/neofs.py +++ b/robot/resources/lib/neofs.py @@ -294,7 +294,6 @@ def create_container(private_key: str, basic_acl:str, rule:str, user_headers: st except subprocess.CalledProcessError as e: raise Exception("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output)) - @keyword('Container List') def container_list(private_key: str): Cmd = ( @@ -1004,7 +1003,7 @@ def get_object(private_key: str, cid: str, oid: str, bearer_token: str, stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=120, shell=True) logger.info("Output: %s" % complProc.stdout) except subprocess.CalledProcessError as e: - raise Exception("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output)) + raise Exception("Error: \nreturn code: {}. \nOutput: {}".format(e.returncode, e.stderr)) return file_path diff --git a/robot/testsuites/integration/services/http_gate.robot b/robot/testsuites/integration/services/http_gate.robot index 8a27dbf..7378239 100644 --- a/robot/testsuites/integration/services/http_gate.robot +++ b/robot/testsuites/integration/services/http_gate.robot @@ -10,7 +10,7 @@ Library ${KEYWORDS}/rpc_call_keywords.py Resource ../${RESOURCES}/setup_teardown.robot *** Variables *** -${PLACEMENT_RULE} = "REP 1 IN X CBF 1 SELECT 1 FROM * AS X" +${PLACEMENT_RULE} = REP 1 IN X CBF 1 SELECT 1 FROM * AS X ${TRANSFER_AMOUNT} = ${6} ${DEPOSIT_AMOUNT} = ${5} @@ -34,7 +34,7 @@ NeoFS HTTP Gateway Wait Until Keyword Succeeds ${MAINNET_TIMEOUT} ${MAINNET_BLOCK_TIME} ... Transaction accepted in block ${TX_DEPOSIT} - ${CID} = Create container ${WIF} public ${PLACEMENT_RULE} + ${CID} = Create container ${WIF} 0x0FFFFFFF ${PLACEMENT_RULE} Wait Until Keyword Succeeds 2 min 30 sec ... Container Existing ${WIF} ${CID} diff --git a/robot/testsuites/integration/services/s3_gate.robot b/robot/testsuites/integration/services/s3_gate.robot index dc9ac4a..0be69ea 100644 --- a/robot/testsuites/integration/services/s3_gate.robot +++ b/robot/testsuites/integration/services/s3_gate.robot @@ -14,8 +14,9 @@ ${WIF} = ${MAINNET_WALLET_WIF} *** Test cases *** NeoFS S3 Gateway + # TODO: check uploading an s3 object via neofs-cli and a neofs object via s3-gate [Documentation] Execute operations via S3 Gate - [Timeout] 5 min + [Timeout] 10 min [Setup] Setup @@ -36,51 +37,40 @@ NeoFS S3 Gateway ... ${BUCKET} ... ${ACCESS_KEY_ID} ... ${SEC_ACCESS_KEY} - ... ${OWNER_PRIV_KEY} = Init S3 Credentials ${WIF} keys/s3_docker_hcs.pub.key + ... ${OWNER_PRIV_KEY} = Init S3 Credentials ${WALLET} ${CONTEINERS_LIST} = Container List ${WIF} List Should Contain Value ${CONTEINERS_LIST} ${CID} ${S3_CLIENT} = Config S3 client ${ACCESS_KEY_ID} ${SEC_ACCESS_KEY} + ${S3_BUCKET} = Create Bucket S3 ${S3_CLIENT} + ${LIST_S3_BUCKETS} = List buckets S3 ${S3_CLIENT} List Should Contain Value ${LIST_S3_BUCKETS} ${BUCKET} + List Should Contain Value ${LIST_S3_BUCKETS} ${S3_BUCKET} - Put object S3 ${S3_CLIENT} ${BUCKET} ${FILE_S3} - Head object S3 ${S3_CLIENT} ${BUCKET} ${FILE_S3_NAME} + ${OID_S3} = Put object S3 ${S3_CLIENT} ${S3_BUCKET} ${FILE_S3} + Head object S3 ${S3_CLIENT} ${S3_BUCKET} ${FILE_S3_NAME} ${OID_FS} = Put object ${WIF} ${FILE_FS} ${CID} ${EMPTY} ${EMPTY} Head object ${WIF} ${CID} ${OID_FS} ${EMPTY} - - ${LIST_S3_OBJECTS} = List objects S3 ${S3_CLIENT} ${BUCKET} + ${LIST_S3_OBJECTS} = List objects S3 ${S3_CLIENT} ${S3_BUCKET} List Should Contain Value ${LIST_S3_OBJECTS} ${FILE_S3_NAME} - List Should Contain Value ${LIST_S3_OBJECTS} ${FILE_FS_NAME} - ${LIST_V2_S3_OBJECTS} = List objects S3 v2 ${S3_CLIENT} ${BUCKET} + ${LIST_V2_S3_OBJECTS} = List objects S3 v2 ${S3_CLIENT} ${S3_BUCKET} List Should Contain Value ${LIST_V2_S3_OBJECTS} ${FILE_S3_NAME} List Should Contain Value ${LIST_V2_S3_OBJECTS} ${FILE_S3_NAME} - ${OID_LIST_S3} = Search object ${WIF} ${CID} ${EMPTY} ${EMPTY} FileName=${FILE_S3_NAME} - ${OID_S3} = Get From List ${OID_LIST_S3} 0 - - Get object S3 ${S3_CLIENT} ${BUCKET} ${FILE_S3_NAME} s3_obj_get_s3 - Get object S3 ${S3_CLIENT} ${BUCKET} ${FILE_FS_NAME} fs_obj_get_s3 + Get object S3 ${S3_CLIENT} ${S3_BUCKET} ${FILE_S3_NAME} s3_obj_get_s3 Verify file hash s3_obj_get_s3 ${FILE_S3_HASH} - Verify file hash fs_obj_get_s3 ${FILE_FS_HASH} - Get object ${WIF} ${CID} ${OID_S3} ${EMPTY} s3_obj_get_fs - Get object ${WIF} ${CID} ${OID_FS} ${EMPTY} fs_obj_get_fs - - Verify file hash s3_obj_get_fs ${FILE_S3_HASH} - Verify file hash fs_obj_get_fs ${FILE_FS_HASH} - - Copy object S3 ${S3_CLIENT} ${BUCKET} ${FILE_S3_NAME} NewName - ${LIST_S3_OBJECTS} = List objects S3 ${S3_CLIENT} ${BUCKET} + Copy object S3 ${S3_CLIENT} ${S3_BUCKET} ${FILE_S3_NAME} NewName + ${LIST_S3_OBJECTS} = List objects S3 ${S3_CLIENT} ${S3_BUCKET} List Should Contain Value ${LIST_S3_OBJECTS} NewName Delete object S3 ${S3_CLIENT} ${BUCKET} ${FILE_S3_NAME} - ${LIST_S3_OBJECTS} = List objects S3 ${S3_CLIENT} ${BUCKET} + ${LIST_S3_OBJECTS} = List objects S3 ${S3_CLIENT} ${S3_BUCKET} List Should Not Contain Value ${LIST_S3_OBJECTS} FILE_S3_NAME - [Teardown] Teardown s3_gate diff --git a/robot/variables/common.py b/robot/variables/common.py index 7691aad..a951976 100644 --- a/robot/variables/common.py +++ b/robot/variables/common.py @@ -46,3 +46,4 @@ COMMON_PLACEMENT_RULE = "REP 2 IN X CBF 1 SELECT 4 FROM * AS X" ASSETS_DIR = os.getenv("ASSETS_DIR", "TemporaryDir/") MORPH_MAGIC = os.environ["MORPH_MAGIC"] +GATE_PUB_KEY = '0313b1ac3a8076e155a7e797b24f0b650cccad5941ea59d7cfd51a024a8b2a06bf' \ No newline at end of file