示例#1
0
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()
示例#2
0
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())
示例#3
0
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
示例#4
0
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() == []
示例#5
0
def test_RestartController():
    with requests_mock.Mocker() as mock:
        mock.post('http://controller/restartserver/')
        ControllerClient('http://controller', 'mujin', 'mujin').RestartController()
示例#6
0
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)