From 0857de8f77f90e88fb3d58fd20b746e995094f9c Mon Sep 17 00:00:00 2001 From: "anatoly@nspcc.ru" Date: Sat, 28 Nov 2020 06:41:35 +0300 Subject: [PATCH] update --- robot/resources/lib/neofs.py | 87 +++++++--------------- robot/resources/lib/payment_neogo.py | 104 +++++++-------------------- 2 files changed, 52 insertions(+), 139 deletions(-) diff --git a/robot/resources/lib/neofs.py b/robot/resources/lib/neofs.py index 4d92a95..39edd18 100644 --- a/robot/resources/lib/neofs.py +++ b/robot/resources/lib/neofs.py @@ -54,7 +54,6 @@ def get_scripthash(privkey: str): return scripthash - @keyword('Get nodes with object') def get_nodes_with_object(private_key: str, cid, oid): storage_nodes = _get_storage_nodes(private_key) @@ -140,17 +139,6 @@ def get_eacl(private_key: bytes, cid: str): - -@keyword('Convert Str to Hex Str with Len') -def conver_str_to_hex(string_convert: str): - converted = binascii.hexlify(bytes(string_convert, encoding= 'utf-8')).decode("utf-8") - prev_len_2 = '{:04x}'.format(int(len(converted)/2)) - - return str(prev_len_2)+str(converted) - - - - @keyword('Set eACL') def set_eacl(private_key: str, cid: str, eacl: str, add_keys: str = ""): @@ -504,10 +492,6 @@ def create_container(private_key: str, basic_acl:str="", rule:str="REP 2 IN X CB cid = _parse_cid(output) logger.info("Created container %s with rule '%s'" % (cid, rule)) -#$ ./bin/neofs-cli -c config.yml container create --policy rule.ql --await -#container ID: GePis2sDpYqYPh4F8vfGUqoujtNcqdXhipbLx2pKbUwX - -# REP 1 IN X CBF 1 SELECT 2 IN SAME Location FROM * AS X return cid @@ -574,11 +558,11 @@ def search_object(private_key: str, cid: str, keys: str, bearer: str, filters: s except subprocess.CalledProcessError as e: raise Exception("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output)) - +''' @keyword('Verify Head Tombstone') def verify_head_tombstone(private_key: str, cid: str, oid: str): - ObjectCmd = f'{CLI_PREFIX}neofs-cli --host {NEOFS_ENDPOINT} --key {binascii.hexlify(private_key).decode()} object head --cid {cid} --oid {oid} --full-headers' + ObjectCmd = f'neofs-cli --rpc-endpoint {NEOFS_ENDPOINT} --key {private_key} object head --cid {cid} --oid {oid} --full-headers' logger.info("Cmd: %s" % ObjectCmd) try: complProc = subprocess.run(ObjectCmd, check=True, universal_newlines=True, @@ -592,26 +576,10 @@ def verify_head_tombstone(private_key: str, cid: str, oid: str): except subprocess.CalledProcessError as e: raise Exception("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output)) +''' - - -def _exec_cli_cmd(private_key: bytes, postfix: str): - - # Get linked objects from first - ObjectCmd = f'{CLI_PREFIX}neofs-cli --raw --host {NEOFS_ENDPOINT} --key {binascii.hexlify(private_key).decode()} {postfix}' - logger.info("Cmd: %s" % ObjectCmd) - try: - complProc = subprocess.run(ObjectCmd, check=True, universal_newlines=True, - stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=15, 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)) - - return complProc.stdout - - +''' @keyword('Verify linked objects') def verify_linked_objects(private_key: bytes, cid: str, oid: str, payload_size: float): @@ -655,6 +623,7 @@ def verify_linked_objects(private_key: bytes, cid: str, oid: str, payload_size: return child_obj_list_headers.keys() + def _check_linked_object(obj:str, child_obj_list_headers:dict, payload_size:int, payload:int, parent_id:str): output = child_obj_list_headers[obj] @@ -695,6 +664,8 @@ def _check_linked_object(obj:str, child_obj_list_headers:dict, payload_size:int, else: raise Exception("Can not get Next object ID for the object %s." % obj) +''' + @keyword('Head object') def head_object(private_key: str, cid: str, oid: str, bearer: str, user_headers:str=""): @@ -760,8 +731,6 @@ def parse_object_system_header(header: str): else: raise Exception("no PayloadLength was parsed from object header: \t%s" % output) - - # CreatedAtUnixTime m = re.search(r'Timestamp=(\d+)', header) if m.start() != m.end(): # e.g., if match found something @@ -779,26 +748,6 @@ def parse_object_system_header(header: str): logger.info("Result: %s" % result_header) return result_header - - -@keyword('Parse Object Extended Header') -def parse_object_extended_header(header: str): - result_header = dict() - - - pattern = re.compile(r'- Type=(\w+)\n.+Value=(.+)\n') - - - for (f_type, f_val) in re.findall(pattern, header): - logger.info("found: %s - %s" % (f_type, f_val)) - if f_type not in result_header.keys(): - result_header[f_type] = [] - - result_header[f_type].append(f_val) - - logger.info("Result: %s" % result_header) - return result_header - @keyword('Delete object') def delete_object(private_key: str, cid: str, oid: str, bearer: str): @@ -830,7 +779,7 @@ def verify_file_hash(filename, expected_hash): else: raise Exception("File hash '{}' is not equal to {}".format(file_hash, expected_hash)) - +''' @keyword('Create storage group') def create_storage_group(private_key: bytes, cid: str, *objects_list): objects = "" @@ -856,7 +805,8 @@ def get_storage_group(private_key: bytes, cid: str, sgid: str): 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)) - +''' + @keyword('Cleanup File') # remove temp files @@ -930,6 +880,23 @@ def get_object(private_key: str, cid: str, oid: str, bearer_token: str, read_obj raise Exception("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output)) + +def _exec_cli_cmd(private_key: bytes, postfix: str): + + # Get linked objects from first + ObjectCmd = f'{CLI_PREFIX}neofs-cli --raw --host {NEOFS_ENDPOINT} --key {binascii.hexlify(private_key).decode()} {postfix}' + logger.info("Cmd: %s" % ObjectCmd) + try: + complProc = subprocess.run(ObjectCmd, check=True, universal_newlines=True, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=15, 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)) + + return complProc.stdout + + def _get_file_hash(filename): blocksize = 65536 hash = hashlib.md5() diff --git a/robot/resources/lib/payment_neogo.py b/robot/resources/lib/payment_neogo.py index 39f10bb..401cfa9 100644 --- a/robot/resources/lib/payment_neogo.py +++ b/robot/resources/lib/payment_neogo.py @@ -31,7 +31,7 @@ def init_wallet(): cmd = ( f"{NEOGO_CLI_PREFIX} wallet init -w {filename}" ) logger.info(f"Executing shell command: {cmd}") - out = run_sh(cmd) + out = _run_sh(cmd) logger.info(f"Command completed with output: {out}") return filename @@ -56,7 +56,7 @@ def dump_address(wallet: str): cmd = ( f"{NEOGO_CLI_PREFIX} wallet dump -w {wallet}" ) logger.info(f"Executing command: {cmd}") - out = run_sh(cmd) + out = _run_sh(cmd) logger.info(f"Command completed with output: {out}") m = re.search(r'"address": "(\w+)"', out) @@ -72,7 +72,7 @@ def dump_privkey(wallet: str, address: str): cmd = ( f"{NEOGO_CLI_PREFIX} wallet export -w {wallet} --decrypt {address}" ) logger.info(f"Executing command: {cmd}") - out = run_sh_with_passwd('', cmd) + out = _run_sh_with_passwd('', cmd) logger.info(f"Command completed with output: {out}") return out @@ -84,7 +84,7 @@ def transfer_mainnet_gas(wallet: str, address: str, address_to: str, amount: int f"--to {address_to} --token gas --amount {amount}" ) logger.info(f"Executing command: {cmd}") - out = run_sh_with_passwd('', cmd) + out = _run_sh_with_passwd('', cmd) logger.info(f"Command completed with output: {out}") if not re.match(r'^(\w{64})$', out): @@ -98,7 +98,7 @@ def withdraw_mainnet_gas(wallet: str, address: str, scripthash: str, amount: int f"{NEOFS_CONTRACT} withdraw {scripthash} int:{amount} -- {scripthash}" ) logger.info(f"Executing command: {cmd}") - out = run_sh_with_passwd('', cmd) + out = _run_sh_with_passwd('', cmd) logger.info(f"Command completed with output: {out}") #if not re.match(r'^(\w{64})$', out): @@ -107,7 +107,6 @@ def withdraw_mainnet_gas(wallet: str, address: str, scripthash: str, amount: int return out - @keyword('Mainnet Balance') def mainnet_balance(address: str): request = 'curl -X POST '+NEO_MAINNET_ENDPOINT+' --cacert ca/nspcc-ca.pem -H \'Content-Type: application/json\' -d \'{ "jsonrpc": "2.0", "id": 5, "method": "getnep5balances", "params": [\"'+address+'\"] }\'' @@ -127,6 +126,7 @@ def mainnet_balance(address: str): return amount + @keyword('Expexted Mainnet Balance') def expected_mainnet_balance(address: str, expected: int): @@ -138,7 +138,6 @@ def expected_mainnet_balance(address: str, expected: int): return True - @keyword('NeoFS Deposit') def neofs_deposit(wallet: str, address: str, scripthash: str, amount: int): cmd = ( f"{NEOGO_CLI_PREFIX} contract invokefunction -w {wallet} -a {address} " @@ -146,7 +145,7 @@ def neofs_deposit(wallet: str, address: str, scripthash: str, amount: int): f"deposit {scripthash} int:{amount} bytes: -- {scripthash}") logger.info(f"Executing command: {cmd}") - out = run_sh_with_passwd('', cmd) + out = _run_sh_with_passwd('', cmd) logger.info(f"Command completed with output: {out}") m = re.match(r'^Sent invocation transaction (\w{64})$', out) @@ -200,71 +199,6 @@ def get_transaction(tx_id: str): logger.info(complProc.stdout) - - - - - - - - -def run_sh(args): - complProc = subprocess.run(args, check=True, universal_newlines=True, - stdout=subprocess.PIPE, stderr=subprocess.PIPE, - timeout=150, shell=True) - output, errors = complProc.stdout, complProc.stderr - if errors: - return errors - return output - - -def run_sh_with_passwd(passwd, cmd): - p = pexpect.spawn(cmd) - p.expect(".*") - p.sendline(passwd) - p.wait() - # throw a string with password prompt - # take a string with tx hash - tx_hash = p.read().splitlines()[-1] - return tx_hash.decode() - - - -#@keyword('Transfer Mainnet Gas') -#def transfer_mainnet_gas(wallet_to: str, amount: int): - -# -# Cmd = f'docker exec -it main_chain neo-go wallet nep5 transfer -w wallets/wallet.json -r http://main_chain.neofs.devenv:30333 --from NTrezR3C4X8aMLVg7vozt5wguyNfFhwuFx --to {wallet_to} --token gas --amount {amount}' -# command = ['docker', 'exec', '-it', 'main_chain', 'neo-go', 'wallet', 'nep5', 'transfer', '-w', 'wallets/wallet.json', '-r', 'http://main_chain.neofs.devenv:30333', '--from NTrezR3C4X8aMLVg7vozt5wguyNfFhwuFx', '--to', 'NULwe3UAHckN2fzNdcVg31tDiaYtMDwANt', '--token gas', '--amount', '5'] - - - -# logger.info("Cmd: %s" % Cmd) - -#import subprocess -#command = ['myapp', '--arg1', 'value_for_arg1'] -#p = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) -#output = p.communicate(input='some data'.encode())[0] - -#a=subprocess.Popen("docker run -t -i fedora bash", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE) -#4. >>> a.stdin.write("exit\n") -#5. >>> print a.poll() - - complProc = subprocess.Popen(Cmd.split(), stdin=subprocess.PIPE, - stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) - complProc.stdin.write("\n".encode()) - - output = complProc.stdout.read() #.communicate(input=''.encode())[0] - - logger.info("Output: %s" % output) - - -#from subprocess import Popen, PIPE -#p = Popen(['python test_enter.py'], stdin=PIPE, shell=True) -#p.communicate(input='\n') - - - @keyword('Request NeoFS Deposit') def request_neofs_deposit(public_key: str): """ @@ -333,11 +267,23 @@ def _get_balance_request(privkey: str): return balance - + +def _run_sh(args): + complProc = subprocess.run(args, check=True, universal_newlines=True, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + timeout=150, shell=True) + output, errors = complProc.stdout, complProc.stderr + if errors: + return errors + return output - # {"id":5,"jsonrpc":"2.0","result":{"txid":"0x02c178803258a9dbbcce80acfece2f6abb4f51c122e7ce2ddcad332d6a810e5f","trigger":"Application", - # !!!!!!!!!!! - #"vmstate":"FAULT" - # !!!!!!!!!!! - #,"gasconsumed":"11328110","stack":[],"notifications":[]}} \ No newline at end of file +def _run_sh_with_passwd(passwd, cmd): + p = pexpect.spawn(cmd) + p.expect(".*") + p.sendline(passwd) + p.wait() + # throw a string with password prompt + # take a string with tx hash + tx_hash = p.read().splitlines()[-1] + return tx_hash.decode()