def test_PingAndLogin(url, username, password): with requests_mock.Mocker() as mock: mock.head('%s/u/%s' % (url, username)) controllerclient = ControllerClient(url, username, password) controllerclient.Ping() controllerclient.Login() assert controllerclient.IsLoggedIn()
def _Main(): options = _ParseArguments() _ConfigureLogging(options.loglevel) self = ControllerClient(options.url, options.username, options.password) from IPython.terminal import embed ipshell = embed.InteractiveShellEmbed(config=embed.load_default_config())(local_ns=locals())
def test_GetScenes(): with requests_mock.Mocker() as mock: mock.get( 'http://controller/api/v1/scene/?format=json&limit=0&offset=0', json={ 'objects': [], 'meta': { 'total_count': 101, 'limit': 20, 'offset': 0, }, }) scenes = ControllerClient('http://controller', 'mujin', 'mujin').GetScenes() assert len(scenes) == 0 assert scenes.offset == 0 assert scenes.limit == 20 assert scenes.totalCount == 101
def test_GetScenes(): with requests_mock.Mocker() as mock: mock.get('http://controller/api/v1/scene/?format=json&limit=0&offset=0', json={'objects': []}) ControllerClient('http://controller', 'mujin', 'mujin').GetScenes() == []
def test_RestartController(): with requests_mock.Mocker() as mock: mock.post('http://controller/restartserver/') ControllerClient('http://controller', 'mujin', 'mujin').RestartController()
def _RunMain(): parser = argparse.ArgumentParser(description='Apply configuration on controller from template') parser.add_argument('--loglevel', action='store', type=str, dest='loglevel', default=None, help='the python log level, e.g. DEBUG, VERBOSE, ERROR, INFO, WARNING, CRITICAL [default=%(default)s]') parser.add_argument('--template', action='store', type=str, dest='template', required=True, help='path to template config file [default=%(default)s]') parser.add_argument('--preserve', action='store', type=str, dest='preserve', default=None, help='path to a file containing the list of additional keys to preserve while merging template [default=%(default)s]') parser.add_argument('--controller', action='store', type=str, dest='controller', default=None, help='controller ip or hostname, e.g controller123 [default=%(default)s]') parser.add_argument('--username', action='store', type=str, dest='username', default='mujin', help='controller username [default=%(default)s]') parser.add_argument('--password', action='store', type=str, dest='password', default='mujin', help='controller password [default=%(default)s]') parser.add_argument('--config', action='store', type=str, dest='config', default=None, help='path to input config file. If specified, the config file is loaded as input instead of obtaining from controller [default=%(default)s]') parser.add_argument('--force', action='store_true', dest='force', default=False, help='apply without confirmation [default=%(default)s]') parser.add_argument('--dryrun', action='store_true', dest='dryrun', default=False, help='shows differences and quit [default=%(default)s]') parser.add_argument('--oneline', action='store_true', dest='oneline', default=False, help='shows each difference in one line [default=%(default)s]') options = parser.parse_args() # configure logging try: from mujincommon import ConfigureRootLogger ConfigureRootLogger(level=options.loglevel) except ImportError: logging.basicConfig(format='%(asctime)s %(name)s [%(levelname)s] [%(filename)s:%(lineno)s %(funcName)s] %(message)s', level=options.loglevel) # load template with open(options.template, 'r') as f: template = json.load(f) # load preservelist preservedpaths = None if options.preserve: preservedpaths = [] with open(options.preserve, 'r') as f: for line in f.read().strip().split('\n'): line = line.split('#')[0].strip() if line: preservedpaths.append(line) # construct client if options.controller: client = ControllerClient('http://%s' % options.controller, options.username, options.password) client.Ping() config = client.GetConfig() target = client.controllerIp elif options.config: with open(options.config, 'r') as f: config = json.load(f) target = options.config else: log.error('need to supply either --controller or --config to continue') return # apply template newconfig = _ApplyTemplate(config, template, preservedpaths=preservedpaths) # if the config is different, prompt the user if not _DiffConfig(config, newconfig, showInOneLine=options.oneline): log.debug('configuration already up-to-date on %s', target) return try: if options.dryrun: return log.warn('configuration will be changed on %s', target) if not options.force: six.moves.input('Are you sure about applying the above changes to %s? Press ENTER to continue ...' % target) except KeyboardInterrupt: print('') log.warn('canceled by user') return # apply the configuration changes log.debug('applying configuration on %s', target) if options.controller: client.SetConfig(newconfig) elif options.config: with open(options.config, 'w') as f: f.write(_PrettifyConfig(newconfig)) log.debug('done')
def _RunMain(): parser = argparse.ArgumentParser( description='Run registration task on remote controller') parser.add_argument( '--logLevel', action='store', type=str, dest='logLevel', default='INFO', help= 'the python log level, e.g. DEBUG, VERBOSE, ERROR, INFO, WARNING, CRITICAL [default=%(default)s]' ) parser.add_argument( '--controllerUrl', action='store', type=str, dest='controllerUrl', required=True, help='controller url e.g http://controller123 [default=%(default)s]') parser.add_argument('--controllerUsername', action='store', type=str, dest='controllerUsername', default='mujin', help='controller username [default=%(default)s]') parser.add_argument('--controllerPassword', action='store', type=str, dest='controllerPassword', default='mujin', help='controller password [default=%(default)s]') parser.add_argument( '--scenepk', action='store', type=str, dest='scenepk', default=None, help= 'scene primary key, if not specified, will determine from remote system [default=%(default)s]' ) parser.add_argument( '--ftpHost', action='store', type=str, dest='ftpHost', required=True, help='ftp server hostname or ip address [default=%(default)s]') parser.add_argument('--ftpPort', action='store', type=int, dest='ftpPort', default=21, help='ftp server port [default=%(default)r]') parser.add_argument('--ftpUsername', action='store', type=str, dest='ftpUsername', default='anonymous', help='ftp username [default=%(default)s]') parser.add_argument('--ftpPassword', action='store', type=str, dest='ftpPassword', default='', help='ftp password [default=%(default)s]') parser.add_argument( '--ftpPath', action='store', type=str, dest='ftpPath', default='', help= 'path on ftp server, if not supplied, will use home directory of the user [default=%(default)s]' ) parser.add_argument( '--syncMasterFile', action='store', type=str, dest='syncMasterFile', default=None, help= 'if supplied, will sync this master file on FTP, e.g. /somewhere/masterfile.txt [default=%(default)s]' ) parser.add_argument( '--backup', action='store_true', dest='backup', default=False, help='backup registration objects to ftp [default=%(default)s]') parser.add_argument( '--outputFilename', action='store', type=str, dest='outputFilename', default=None, help= 'If supplied, will output to file specified, otherwise file will be named after task name [default=%(default)s]' ) options = parser.parse_args() # configure logging try: from mujincommon import ConfigureRootLogger ConfigureRootLogger(level=options.logLevel) except ImportError: logging.basicConfig( format= '%(asctime)s %(name)s [%(levelname)s] [%(filename)s:%(lineno)s %(funcName)s] %(message)s', level=options.logLevel) taskType = 'registration' command = None if options.syncMasterFile: command = 'SyncMasterFile' elif options.backup: command = 'Backup' else: raise Exception('Have to sepecify either --syncMasterFile or --backup') taskName = 'registration-%s-%s' % ( command.lower(), datetime.datetime.now().strftime('%Y%m%d-%H%M%S')) controllerclient = ControllerClient(options.controllerUrl, options.controllerUsername, options.controllerPassword) controllerclient.Ping() # cancel previous jobs for job in controllerclient.GetJobs(): if '/registration-' in job['description']: controllerclient.DeleteJob(job['pk']) # determine scenepk if options.scenepk is None: options.scenepk = uriutils.GetPrimaryKeyFromURI( controllerclient.GetConfig()['sceneuri']) # delete previous task for task in controllerclient.GetSceneTasks(options.scenepk): if task['tasktype'] == taskType: controllerclient.DeleteSceneTask(options.scenepk, task['pk']) # create task task = controllerclient.CreateSceneTask( options.scenepk, { 'tasktype': taskType, 'name': taskName, 'taskparameters': { 'command': command, 'fileStorageInfo': { 'type': 'ftp', 'username': options.ftpUsername, 'password': options.ftpPassword, 'host': options.ftpHost, 'port': options.ftpPort, 'remotePath': options.ftpPath, }, 'remoteMasterFilePath': options.syncMasterFile, } }) taskpk = task['pk'] log.info('task created: %s: %s', taskpk, task['name']) # run task async jobpk = controllerclient._webclient.APICall( 'POST', 'job/', data={ 'scenepk': options.scenepk, 'target_pk': taskpk, 'resource_type': 'task', }, expectedStatusCode=200)['jobpk'] log.info('job started: %s', jobpk) # wait for job startTime = time.time() jobProgress = None while True: job = ([j for j in controllerclient.GetJobs() if j['pk'] == jobpk] or [None])[0] if job is None: if jobProgress is not None: # job has been seen before, so must be done now break if time.time() - startTime > 2.0: # perhaps job finished too quickly break # wait a little bit and check for job again time.sleep(0.05) continue newProgress = (min( 1.0, max(jobProgress[0] if jobProgress else 0.0, float(job['progress']))), job['status'], job['status_text']) if newProgress != jobProgress: jobProgress = newProgress log.info('progress %.02f%%: %s: %s', jobProgress[0] * 100.0, jobProgress[1], jobProgress[2]) if job['status'] in ('succeeded', 'aborted'): break if job['status'] in ('lost', 'preempted'): raise Exception('Job has stopped unexpectedly: %s' % job['status']) time.sleep(0.5) # wait for result result = None startTime = time.time() while True: task = controllerclient.GetSceneTask(options.scenepk, taskpk) if len(task['binpickingresults']) > 0: result = controllerclient.GetBinpickingResult( task['binpickingresults'][0]['pk']) break if time.time() - startTime > 5.0: raise Exception('Timed out waiting for task result') # write result if not options.outputFilename: options.outputFilename = '%s.json' % taskName with open(options.outputFilename, 'w') as f: json.dump(result, f, ensure_ascii=False, indent=2, separators=(',', ': '), sort_keys=True) f.write('\n') log.info('result written to: %s', options.outputFilename)