This commit is contained in:
anatoly@nspcc.ru 2020-11-28 06:41:35 +03:00
parent b7a30c763d
commit 0857de8f77
2 changed files with 52 additions and 139 deletions

View file

@ -54,7 +54,6 @@ def get_scripthash(privkey: str):
return scripthash return scripthash
@keyword('Get nodes with object') @keyword('Get nodes with object')
def get_nodes_with_object(private_key: str, cid, oid): def get_nodes_with_object(private_key: str, cid, oid):
storage_nodes = _get_storage_nodes(private_key) 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') @keyword('Set eACL')
def set_eacl(private_key: str, cid: str, eacl: str, add_keys: str = ""): 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) cid = _parse_cid(output)
logger.info("Created container %s with rule '%s'" % (cid, rule)) 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 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: except subprocess.CalledProcessError as e:
raise Exception("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output)) raise Exception("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
'''
@keyword('Verify Head Tombstone') @keyword('Verify Head Tombstone')
def verify_head_tombstone(private_key: str, cid: str, oid: str): 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) logger.info("Cmd: %s" % ObjectCmd)
try: try:
complProc = subprocess.run(ObjectCmd, check=True, universal_newlines=True, 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: except subprocess.CalledProcessError as e:
raise Exception("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output)) 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') @keyword('Verify linked objects')
def verify_linked_objects(private_key: bytes, cid: str, oid: str, payload_size: float): 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() 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): 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] 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: else:
raise Exception("Can not get Next object ID for the object %s." % obj) raise Exception("Can not get Next object ID for the object %s." % obj)
'''
@keyword('Head object') @keyword('Head object')
def head_object(private_key: str, cid: str, oid: str, bearer: str, user_headers:str=""): 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: else:
raise Exception("no PayloadLength was parsed from object header: \t%s" % output) raise Exception("no PayloadLength was parsed from object header: \t%s" % output)
# CreatedAtUnixTime # CreatedAtUnixTime
m = re.search(r'Timestamp=(\d+)', header) m = re.search(r'Timestamp=(\d+)', header)
if m.start() != m.end(): # e.g., if match found something if m.start() != m.end(): # e.g., if match found something
@ -780,26 +749,6 @@ def parse_object_system_header(header: str):
return 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') @keyword('Delete object')
def delete_object(private_key: str, cid: str, oid: str, bearer: str): def delete_object(private_key: str, cid: str, oid: str, bearer: str):
@ -830,7 +779,7 @@ def verify_file_hash(filename, expected_hash):
else: else:
raise Exception("File hash '{}' is not equal to {}".format(file_hash, expected_hash)) raise Exception("File hash '{}' is not equal to {}".format(file_hash, expected_hash))
'''
@keyword('Create storage group') @keyword('Create storage group')
def create_storage_group(private_key: bytes, cid: str, *objects_list): def create_storage_group(private_key: bytes, cid: str, *objects_list):
objects = "" objects = ""
@ -856,6 +805,7 @@ def get_storage_group(private_key: bytes, cid: str, sgid: str):
logger.info("Output: %s" % complProc.stdout) logger.info("Output: %s" % complProc.stdout)
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
raise Exception("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output)) raise Exception("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
'''
@keyword('Cleanup File') @keyword('Cleanup File')
@ -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)) 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): def _get_file_hash(filename):
blocksize = 65536 blocksize = 65536
hash = hashlib.md5() hash = hashlib.md5()

View file

@ -31,7 +31,7 @@ def init_wallet():
cmd = ( f"{NEOGO_CLI_PREFIX} wallet init -w {filename}" ) cmd = ( f"{NEOGO_CLI_PREFIX} wallet init -w {filename}" )
logger.info(f"Executing shell command: {cmd}") logger.info(f"Executing shell command: {cmd}")
out = run_sh(cmd) out = _run_sh(cmd)
logger.info(f"Command completed with output: {out}") logger.info(f"Command completed with output: {out}")
return filename return filename
@ -56,7 +56,7 @@ def dump_address(wallet: str):
cmd = ( f"{NEOGO_CLI_PREFIX} wallet dump -w {wallet}" ) cmd = ( f"{NEOGO_CLI_PREFIX} wallet dump -w {wallet}" )
logger.info(f"Executing command: {cmd}") logger.info(f"Executing command: {cmd}")
out = run_sh(cmd) out = _run_sh(cmd)
logger.info(f"Command completed with output: {out}") logger.info(f"Command completed with output: {out}")
m = re.search(r'"address": "(\w+)"', 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}" ) cmd = ( f"{NEOGO_CLI_PREFIX} wallet export -w {wallet} --decrypt {address}" )
logger.info(f"Executing command: {cmd}") 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}") logger.info(f"Command completed with output: {out}")
return 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}" ) f"--to {address_to} --token gas --amount {amount}" )
logger.info(f"Executing command: {cmd}") 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}") logger.info(f"Command completed with output: {out}")
if not re.match(r'^(\w{64})$', 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}" ) f"{NEOFS_CONTRACT} withdraw {scripthash} int:{amount} -- {scripthash}" )
logger.info(f"Executing command: {cmd}") 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}") logger.info(f"Command completed with output: {out}")
#if not re.match(r'^(\w{64})$', 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 return out
@keyword('Mainnet Balance') @keyword('Mainnet Balance')
def mainnet_balance(address: str): 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+'\"] }\'' 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 return amount
@keyword('Expexted Mainnet Balance') @keyword('Expexted Mainnet Balance')
def expected_mainnet_balance(address: str, expected: int): def expected_mainnet_balance(address: str, expected: int):
@ -138,7 +138,6 @@ def expected_mainnet_balance(address: str, expected: int):
return True return True
@keyword('NeoFS Deposit') @keyword('NeoFS Deposit')
def neofs_deposit(wallet: str, address: str, scripthash: str, amount: int): def neofs_deposit(wallet: str, address: str, scripthash: str, amount: int):
cmd = ( f"{NEOGO_CLI_PREFIX} contract invokefunction -w {wallet} -a {address} " 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}") f"deposit {scripthash} int:{amount} bytes: -- {scripthash}")
logger.info(f"Executing command: {cmd}") 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}") logger.info(f"Command completed with output: {out}")
m = re.match(r'^Sent invocation transaction (\w{64})$', 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) 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') @keyword('Request NeoFS Deposit')
def request_neofs_deposit(public_key: str): def request_neofs_deposit(public_key: str):
""" """
@ -334,10 +268,22 @@ def _get_balance_request(privkey: str):
return balance 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", def _run_sh_with_passwd(passwd, cmd):
# !!!!!!!!!!! p = pexpect.spawn(cmd)
#"vmstate":"FAULT" p.expect(".*")
# !!!!!!!!!!! p.sendline(passwd)
#,"gasconsumed":"11328110","stack":[],"notifications":[]}} p.wait()
# throw a string with password prompt
# take a string with tx hash
tx_hash = p.read().splitlines()[-1]
return tx_hash.decode()