class TestMRFC: """ This test cases cover selected functions from the MRFC function group. """ def setup_method(self, test_method): self.conn = Connection(**params) assert self.conn.alive def test_info(self): connection_info = self.conn.get_connection_attributes() assert connection_info["isoLanguage"] == u"EN" def teardown_method(self, test_method): self.conn.close() assert not self.conn.alive """ @unittest.skip("not remote-enabled") def test_ABAP4_CALL_TRANSACTION_VB(self): # ABAP4_CALL_TRANSACTION_VB pass @unittest.skip("not remote-enabled") def test_IS_VERIRUN_ACTIVE(self): # IS_VERIRUN_ACTIVE Determine Whether a Verification Run is Active pass @unittest.skip("not supported yet (trfc)") def test_RFC_CALL_TRANSACTION_USING(self): # RFC_CALL_TRANSACTION_USING Verification Program for Execution of RFCs via CALL TRANSACTION USING pass # ToDo: Class based exceptions def test_RFC_CLASS_BASED_EXCP(self): # RFC_CLASS_BASED_EXCP RFC mit klassenbasierten Exceptions pass # TODO: How to test? @unittest.skip("not supported yet") def test_RFC_PING_AND_WAIT(self): # RFC_PING_AND_WAIT Aufruf und Warten pass """ """
class R3rfcconn(object): def __init__(self, r3user, r3pwd, r3ashost, r3sysnr, r3client): self.conn = Connection(user=r3user, passwd=r3pwd, ashost=r3ashost, sysnr=r3sysnr, client=r3client) def get_connection_attributes(self): return self.conn.get_connection_attributes() def get_function_description(self, func_name): return self.conn.get_function_description(func_name) def get_table_data( self, tablename: str, offset: int = 0, limit: int = 0, options: List = [], fields: List = [], ): read_table_fm = 'RFC_READ_TABLE' kwparam = {} kwparam['QUERY_TABLE'] = tablename kwparam['ROWSKIPS'] = offset kwparam['ROWCOUNT'] = limit kwparam['OPTIONS'] = options kwparam['FIELDS'] = fields result = self.conn.call(read_table_fm, **kwparam) return result def get_rfc_data(self, fm: str, **kwparam: dict): result = self.conn.call(fm, **kwparam) # return json.dumps(result, cls=JsonCustomEncoder) return result def get_server_wp_list(self, servername): ''' get workprocess list and info by servername :param servername: s4ides1_DM0_00 :return: ''' kwparam = {} kwparam['SRVNAME'] = servername kwparam['WITH_CPU'] = b'00' kwparam['WITH_MTX_INFO'] = 0 kwparam['MAX_ELEMS'] = 0 return self.get_rfc_data('TH_WPINFO', **kwparam)['WPLIST'] def get_user_list(self): ''' get SID overall wp info :return: ''' kwparam = {} return self.get_rfc_data('TH_USER_LIST', **kwparam)['USRLIST'] def get_bkjob_status_count(self): ''' tables: TBTCP,TBTCO and TBTCS, views: V_OP get per 15s by promethues define scrawl The statuses have the following meanings: Scheduled: not yet been released to run. P Released: released to run. S Ready: start date and time have come: awaiting execution. Active: currently running. R After a system failure, can indicate that a job was interrupted by the failure and must be manually restarted. Finished: successfully completed. F Aborted: not successfully completed. A :param servername: :return: ''' job_finish = self.get_table_data( 'V_OP', options=[ f"STATUS EQ 'F' AND ENDDATE EQ '{date.today()}' AND ENDTIME GT '{(datetime.now()-timedelta(seconds=15)).strftime('%H%M%S')}'" ], fields=[ 'JOBNAME', 'STRTDATE', 'STRTTIME', 'ENDDATE', 'ENDTIME', 'PRDMINS', 'PRDHOURS', 'STATUS' ]) job_running = self.get_table_data('V_OP', options=[f"STATUS EQ 'R'"], fields=[ 'JOBNAME', 'STRTDATE', 'STRTTIME', 'ENDDATE', 'ENDTIME', 'PRDMINS', 'PRDHOURS', 'STATUS' ]) job_cancel = self.get_table_data( 'V_OP', options=[ f"STATUS EQ 'A' AND ENDDATE EQ '{date.today()}' AND ENDTIME GT '{(datetime.now()-timedelta(seconds=15)).strftime('%H%M%S')}'" ], fields=[ 'JOBNAME', 'STRTDATE', 'STRTTIME', 'ENDDATE', 'ENDTIME', 'PRDMINS', 'PRDHOURS', 'STATUS' ]) return { "finish": len(job_finish['DATA']), "running": len(job_running['DATA']), "cancel": len(job_cancel['DATA']) } def get_dump_list(self): # date.today() - timedelta(1), DATE_TO = date.today(), TIME_FROM = '000000', TIME_TO = '235959') kwparam = {} kwparam['DATE_FROM'] = date.today() kwparam['TIME_FROM'] = b'000000' kwparam['DATE_TO'] = date.today() kwparam['TIME_TO'] = b'235959' try: return self.get_rfc_data('/SDF/GET_DUMP_LOG', **kwparam)['ET_E2E_LOG'] except: return [] def get_rfcresource_list(self, servername): ''' need confirm :param servername: :return: ''' kwparam = {} return self.get_rfc_data('RFC_SERVER_GROUP_RESOURCES', **kwparam) def get_transport_list(self): tablename = 'E070' return self.get_table_data(tablename) def get_st02_data(self): kwparam = {} st02data = self.get_rfc_data('SAPTUNE_GET_SUMMARY_STATISTIC') del st02data['TABLE_QUALITIES'] del st02data['TABLE_STATISTIC'] del st02data['TABLE_STATISTIC_64'] del st02data['CURSOR_CACHE_INFO'] del st02data['MODE_MEMORY_HISTORY'] del st02data['INTERNAL_EXTERNAL_MODES_MEMORY'] del st02data['BUFFER_STATISTIC_64'] st02data_json = json.dumps(st02data, cls=DecimalEncoder) return json.loads(st02data_json) def get_st03_data_summary(self): kwparam = {} kwparam['READ_START_DATE'] = date.today() kwparam['READ_END_DATE'] = date.today() kwparam['READ_START_TIME'] = (datetime.now() - timedelta(seconds=60)).strftime('%H%M%S') kwparam['READ_END_TIME'] = (datetime.now() - timedelta(seconds=0)).strftime('%H%M%S') st03datadetail = self.get_rfc_data('SAPWL_SNAPSHOT_FROM_REMOTE_SYS', **kwparam) st03datadetail_json = json.dumps(st03datadetail['SUMMARY'], cls=DecimalEncoder) return json.loads(st03datadetail_json) def close(self): self.conn.close()