Beispiel #1
0
def validate_serial(req_data):
    """Verify serial in data validates

    Args:
        req_data (dict): request with serial and possibly models
    """
    if req_data.get('version') != SCHEMA_COMMON.version:
        raise util.SRException('serverUpgraded', None)
    with _global_lock:
        sim_type = sirepo.template.assert_sim_type(req_data.simulationType)
        sid = req_data.models.simulation.simulationId
        req_ser = req_data.models.simulation.simulationSerial
        curr = read_simulation_json(sim_type, sid=sid)
        curr_ser = curr.models.simulation.simulationSerial
        if not req_ser is None:
            if req_ser == curr_ser:
                return
            status = 'newer' if req_ser > curr_ser else 'older'
        raise util.Error(
            PKDict(
                sim_type=sim_type,
                error='invalidSerial',
                simulationData=req_data,
            ),
            '{}: incoming serial {} than stored serial={} sid={}, resetting client',
            req_ser,
            status,
            curr_ser,
            sid,
        )
Beispiel #2
0
def api_updateFolder():
    #TODO(robnagler) Folder should have a serial, or should it be on data
    req = http_request.parse_post()
    o = srschema.parse_folder(req.req_data['oldName'])
    if o == '/':
        raise util.Error('cannot rename root ("/") folder')
    n = srschema.parse_folder(req.req_data['newName'])
    if n == '/':
        raise util.Error('cannot folder to root ("/")')
    for r in simulation_db.iterate_simulation_datafiles(
            req.type, _simulation_data_iterator):
        f = r.models.simulation.folder
        l = o.lower()
        if f.lower() == o.lower():
            r.models.simulation.folder = n
        elif f.lower().startswith(o.lower() + '/'):
            r.models.simulation.folder = n + f[len():]
        else:
            continue
        simulation_db.save_simulation_json(r)
    return http_reply.gen_json_ok()
Beispiel #3
0
def parse_folder(folder):
    """Verifies syntax of folder is correct

    Args:
        folder (str): what to validate
    Returns:
        str: cleaned up folder name
    """
    if folder is None or len(folder) == 0:
        raise util.Error('blank folder')
    res = []
    for f in folder.split('/'):
        if len(f):
            res.append(parse_name(f))
    return '/' + '/'.join(res)
Beispiel #4
0
def parse_name(name):
    """Verifies syntax of simulation is correct

    Args:
        folder (str): what to validate
    Returns:
        str: cleaned up folder name
    """
    if name is None:
        name = ''
    else:
        # ignore leading and trailing spaces
        name = name.strip()
    if len(name) == 0:
        raise util.Error('blank name')
    if not _NAME_ILLEGALS_RE.search(name):
        raise util.Error(
            '"{}" contains an illegal character (one of "{}"'.format(
                name, _NAME_ILLEGALS), )
    if name.startswith('.'):
        raise util.Error('"{}" may not start with a dot (".")'.format(name), )
    if name.endswith('.'):
        raise util.Error('"{}" may not end with a dot (".")'.format(name), )
    return name
Beispiel #5
0
def parse_name(name):
    """Verifies syntax of simulation is correct

    Args:
        folder (str): what to validate
    Returns:
        str: cleaned up folder name
    """
    if name is None:
        name = ''
    else:
        # ignore leading and trailing spaces
        name = name.strip()
    # don't raise an error on invalid name - the client is not looking for them
    # instead, remove illegal characters and throw an error if nothing is left
    name = re.sub(_NAME_ILLEGALS_RE, '', name)
    name = re.sub(_NAME_ILLEGAL_PERIOD, '', name)
    if len(name) == 0:
        raise util.Error('blank name')
    return name