示例#1
0
def test_create_isa(ids, session):
    """ASTM Compliance Test: DSS0030_A_PUT_ISA."""
    time_start = datetime.datetime.utcnow()
    time_end = time_start + datetime.timedelta(minutes=60)

    req_body = {
        'extents': {
            'spatial_volume': {
                'footprint': {
                    'vertices': common.VERTICES,
                },
                'altitude_lo': 20,
                'altitude_hi': 400,
            },
            'time_start': time_start.strftime(rid.DATE_FORMAT),
            'time_end': time_end.strftime(rid.DATE_FORMAT),
        },
        'flights_url': 'https://example.com/dss',
    }
    resp = session.put('/identification_service_areas/{}'.format(
        ids(ISA_TYPE)),
                       json=req_body)
    assert resp.status_code == 200, resp.content

    data = resp.json()
    assert data['service_area']['id'] == ids(ISA_TYPE)
    assert data['service_area']['flights_url'] == 'https://example.com/dss'
    assert_datetimes_are_equal(data['service_area']['time_start'],
                               req_body['extents']['time_start'])
    assert_datetimes_are_equal(data['service_area']['time_end'],
                               req_body['extents']['time_end'])
    assert re.match(r'[a-z0-9]{10,}$', data['service_area']['version'])
    assert 'subscribers' in data
示例#2
0
def test_mutate_sub(ids, scd_api, scd_session):
  if scd_session is None:
    return

  # GET current sub1 before mutation
  resp = scd_session.get('/subscriptions/{}'.format(ids(SUB_TYPE)))
  assert resp.status_code == 200, resp.content
  existing_sub = resp.json().get('subscription', None)
  assert existing_sub is not None

  req = _make_sub1_req(scd_api)
  req['notify_for_constraints'] = True

  if scd_api == scd.API_0_3_5:
    req['old_version'] = existing_sub['version']
    resp = scd_session.put('/subscriptions/{}'.format(ids(SUB_TYPE)), json=req)
  elif scd_api == scd.API_0_3_17:
    resp = scd_session.put('/subscriptions/{}/{}'.format(ids(SUB_TYPE), existing_sub['version']), json=req)
  else:
    raise NotImplementedError('Unsupported API version {}'.format(scd_api))
  assert resp.status_code == 200, resp.content

  data = resp.json()
  assert_datetimes_are_equal(data['subscription']['time_start']['value'], req['extents']['time_start']['value'])
  assert_datetimes_are_equal(data['subscription']['time_end']['value'], req['extents']['time_end']['value'])
def test_create_constraint(ids, scd_api, scd_session):
    id = ids(CONSTRAINT_TYPE)
    req = _make_c1_request()

    resp = scd_session.put('/constraint_references/{}'.format(id),
                           json=req,
                           scope=SCOPE_SC)
    assert resp.status_code == 403, resp.content

    resp = scd_session.put(
        '/constraint_references/{}'.format(id),
        json=req,
        scope=SCOPE_CI if scd_api == scd.API_0_3_5 else SCOPE_CP)
    assert resp.status_code == 403, resp.content

    resp = scd_session.put('/constraint_references/{}'.format(id),
                           json=req,
                           scope=SCOPE_CM)
    assert resp.status_code == 200, resp.content

    data = resp.json()
    constraint = data['constraint_reference']
    assert constraint['id'] == id
    assert constraint['uss_base_url'] == BASE_URL
    assert_datetimes_are_equal(constraint['time_start']['value'],
                               req['extents'][0]['time_start']['value'])
    assert_datetimes_are_equal(constraint['time_end']['value'],
                               req['extents'][0]['time_end']['value'])
    assert constraint['version'] == 1
def test_create_ops_v15(ids, scd_api, scd_session):
    assert len(ovn_map) == 0

    for idx, op_id in enumerate(map(ids, OP_TYPES)):
        req = _make_op_request(idx)
        req['key'] = list(ovn_map.values())

        resp = scd_session.put(
            '/operational_intent_references/{}'.format(op_id),
            json=req,
            scope=SCOPE_SC)
        assert resp.status_code == 200, resp.content

        data = resp.json()
        op = data['operational_intent_reference']
        assert op['id'] == op_id
        assert op['uss_base_url'] == BASE_URL
        assert op['uss_availability'] == "Unknown"
        assert_datetimes_are_equal(op['time_start']['value'],
                                   req['extents'][0]['time_start']['value'])
        assert_datetimes_are_equal(op['time_end']['value'],
                                   req['extents'][0]['time_end']['value'])
        assert op['version'] == 1
        assert op['ovn']
        assert 'subscription_id' in op

        ovn_map[op_id] = op['ovn']

    assert len(ovn_map) == len(OP_TYPES)
示例#5
0
def test_create_op1_v17(ids, scd_api, scd_session, scd_session2):
    req = _make_op1_request()
    resp = scd_session.put('/operational_intent_references/{}'.format(
        ids(OP1_TYPE)),
                           json=req)
    assert resp.status_code == 200, resp.content

    data = resp.json()
    op = data['operational_intent_reference']
    assert op['id'] == ids(OP1_TYPE)
    assert op['uss_base_url'] == URL_OP1
    assert op['uss_availability'] == "Unknown"
    assert_datetimes_are_equal(op['time_start']['value'],
                               req['extents'][0]['time_start']['value'])
    assert_datetimes_are_equal(op['time_end']['value'],
                               req['extents'][0]['time_end']['value'])
    assert op['version'] == 1
    assert 'subscription_id' in op
    assert op['state'] == 'Accepted'
    assert op.get('ovn', '')

    # Make sure the implicit Subscription exists when queried separately
    resp = scd_session.get('/subscriptions/{}'.format(op['subscription_id']))
    assert resp.status_code == 200, resp.content

    global op1_ovn
    op1_ovn = op['ovn']
示例#6
0
def test_create_op(ids, scd_api, scd_session):
  if scd_api == scd.API_0_3_5:
    entity_name = 'operation_reference'
  elif scd_api == scd.API_0_3_17:
    entity_name = 'operational_intent_reference'
  req = _make_op_req()
  resp = scd_session.put('/{}s/{}'.format(entity_name, ids(OP_TYPE)), json=req)
  assert resp.status_code == 200, resp.content

  data = resp.json()
  op = data[entity_name]
  assert op['id'] == ids(OP_TYPE)
  assert op['uss_base_url'] == BASE_URL
  assert_datetimes_are_equal(op['time_start']['value'], req['extents'][0]['time_start']['value'])
  assert_datetimes_are_equal(op['time_end']['value'], req['extents'][0]['time_end']['value'])
  assert op['version'] == 1
  assert 'subscription_id' in op

  if scd_api == scd.API_0_3_5:
    assert 'state' not in op
  elif scd_api == scd.API_0_3_17:
    assert op['state'] == 'Accepted'

  # Make sure the implicit Subscription exists when queried separately
  global sub_id
  sub_id = op['subscription_id']

  resp = scd_session.get('/subscriptions/{}'.format(sub_id))
  assert resp.status_code == 200, resp.content
示例#7
0
def test_create_op(ids, scd_api, scd_session, scd_session_cp, scd_session_cm):
    req = _make_op1_request()

    if scd_session_cp:
        resp = scd_session.put('/operational_intent_references/{}'.format(
            ids(OP_TYPE)),
                               json=req,
                               scope=SCOPE_CP)
        assert resp.status_code == 403, resp.content

    if scd_session_cm:
        resp = scd_session.put('/operational_intent_references/{}'.format(
            ids(OP_TYPE)),
                               json=req,
                               scope=SCOPE_CM)
        assert resp.status_code == 403, resp.content

    resp = scd_session.put('/operational_intent_references/{}'.format(
        ids(OP_TYPE)),
                           json=req,
                           scope=SCOPE_SC)
    assert resp.status_code == 200, resp.content

    data = resp.json()
    op = data['operational_intent_reference']
    assert op['id'] == ids(OP_TYPE)
    assert op['uss_base_url'] == BASE_URL
    assert op['uss_availability'] == "Unknown"
    assert_datetimes_are_equal(op['time_start']['value'],
                               req['extents'][0]['time_start']['value'])
    assert_datetimes_are_equal(op['time_end']['value'],
                               req['extents'][0]['time_end']['value'])
    assert op['version'] == 1
    assert 'subscription_id' in op
    assert op['state'] == 'Accepted'
示例#8
0
def test_create_ops_concurrent(ids, scd_api, scd_session):
    assert len(ovn_map) == 0
    op_req_map = {}
    op_resp_map = {}
    # Create opetions concurrently
    with ThreadPoolExecutor(max_workers=THREAD_COUNT) as executor:
        for idx, op_id in enumerate(map(ids, OP_TYPES)):
            req = _make_op_request(idx)
            op_req_map[op_id] = req

            future = executor.submit(_put_operation, req, op_id, scd_session,
                                     scd_api, True)
            future.add_done_callback(
                functools.partial(_collect_resp_callback, op_id, op_resp_map))
    for op_id, resp in op_resp_map.items():
        assert resp.status_code == 200, resp.content
        req = op_req_map[op_id]
        data = resp.json()
        if scd_api == scd.API_0_3_5:
            op = data['operation_reference']
        else:
            op = data['operational_intent_reference']
        assert op['id'] == op_id
        assert op['uss_base_url'] == BASE_URL
        assert_datetimes_are_equal(op['time_start']['value'],
                                   req['extents'][0]['time_start']['value'])
        assert_datetimes_are_equal(op['time_end']['value'],
                                   req['extents'][0]['time_end']['value'])
        assert op['version'] == 1
        assert op['ovn']
        assert 'subscription_id' in op
        ovn_map[op_id] = op['ovn']
    assert len(ovn_map) == len(OP_TYPES)
示例#9
0
def test_create_sub(ids, scd_api, scd_session):
  if scd_session is None:
    return
  req = _make_sub1_req(scd_api)
  resp = scd_session.put('/subscriptions/{}'.format(ids(SUB_TYPE)), json=req)
  assert resp.status_code == 200, resp.content

  data = resp.json()
  assert_datetimes_are_equal(data['subscription']['time_start']['value'], req['extents']['time_start']['value'])
  assert_datetimes_are_equal(data['subscription']['time_end']['value'], req['extents']['time_end']['value'])
  _check_sub1(data, ids(SUB_TYPE), scd_api)
示例#10
0
def test_create_op2_v17(ids, scd_api, scd_session, scd_session2):
    req = _make_op2_request()
    req['subscription_id'] = ids(SUB2_TYPE)
    req['key'] = [op1_ovn]
    resp = scd_session2.put('/operational_intent_references/{}'.format(
        ids(OP2_TYPE)),
                            json=req)
    assert resp.status_code == 200, resp.content

    data = resp.json()
    op = data['operational_intent_reference']
    assert op['id'] == ids(OP2_TYPE)
    assert op['uss_base_url'] == URL_OP2
    assert_datetimes_are_equal(op['time_start']['value'],
                               req['extents'][0]['time_start']['value'])
    assert_datetimes_are_equal(op['time_end']['value'],
                               req['extents'][0]['time_end']['value'])
    assert op['version'] == 1
    assert 'subscription_id' in op
    assert op['state'] == 'Accepted'
    assert op.get('ovn', '')

    resp = scd_session2.get('/operational_intent_references/{}'.format(
        ids(OP1_TYPE)))
    assert resp.status_code == 200, resp.content
    implicit_sub_id = resp.json(
    )['operational_intent_reference']['subscription_id']

    # USS2 should definitely be instructed to notify USS1's implicit Subscription of the new Operation
    subscribers = _parse_subscribers(data.get('subscribers', []))
    assert URL_SUB1 in subscribers, subscribers
    assert implicit_sub_id in subscribers[URL_SUB1], subscribers[URL_SUB1]

    # USS2 should also be instructed to notify USS2's explicit Subscription of the new Operation
    assert URL_SUB2 in subscribers, subscribers
    assert ids(SUB2_TYPE) in subscribers[URL_SUB2], subscribers[URL_SUB2]
    assert subscribers[URL_SUB2][ids(SUB2_TYPE)] == 1

    global op2_ovn
    op2_ovn = op['ovn']
示例#11
0
def test_mutate_sub_not_shrink(scd_api, scd_session):
  # GET current sub before mutation
  resp = scd_session.get('/subscriptions/{}'.format(sub_id))
  assert resp.status_code == 200, resp.content
  existing_sub = resp.json().get('subscription', None)
  assert existing_sub is not None

  time_start = datetime.datetime.utcnow() + datetime.timedelta(minutes=20)
  time_end = time_start + datetime.timedelta(minutes=60)
  req = _make_sub_req(time_start, time_end, 0, 1000, 500, scd_api)
  if scd_api == scd.API_0_3_5:
    req['old_version'] = existing_sub['version']
  req['notify_for_constraints'] = True

  if scd_api == scd.API_0_3_5:
    resp = scd_session.put('/subscriptions/{}'.format(sub_id), json=req)
  elif scd_api == scd.API_0_3_17:
    resp = scd_session.put('/subscriptions/{}/{}'.format(sub_id, existing_sub['version']), json=req)
  assert resp.status_code == 200, resp.content

  data = resp.json()
  assert_datetimes_are_equal(data['subscription']['time_start']['value'], req['extents']['time_start']['value'])
  assert_datetimes_are_equal(data['subscription']['time_end']['value'], req['extents']['time_end']['value'])
示例#12
0
def test_create_isa_concurrent(ids, session):
    time_start = datetime.datetime.utcnow()
    time_end = time_start + datetime.timedelta(minutes=60)
    req = _make_isa_request(time_start, time_end)
    resp_map = {}

    # Create ISAs concurrently
    with ThreadPoolExecutor(max_workers=THREAD_COUNT) as executor:
        for isa_id in map(ids, ISA_TYPES):
            future = executor.submit(_put_isa, isa_id, req, session)
            future.add_done_callback(
                functools.partial(_collect_resp_callback, isa_id, resp_map))

    for isa_id, resp in resp_map.items():
        assert resp.status_code == 200, resp.content
        data = resp.json()
        assert data['service_area']['id'] == isa_id
        assert data['service_area']['flights_url'] == 'https://example.com/dss'
        assert_datetimes_are_equal(data['service_area']['time_start'],
                                   req['extents']['time_start'])
        assert_datetimes_are_equal(data['service_area']['time_end'],
                                   req['extents']['time_end'])
        assert re.match(r'[a-z0-9]{10,}$', data['service_area']['version'])
        assert 'subscribers' in data
示例#13
0
def test_create_isa_concurrent(ids, session_async):
    time_start = datetime.datetime.utcnow()
    time_end = time_start + datetime.timedelta(minutes=60)
    req = _make_isa_request(time_start, time_end)
    resp_map = {}

    # Create ISAs concurrently
    loop = asyncio.get_event_loop()
    results = loop.run_until_complete(
        asyncio.gather(*[
            _put_isa(isa_id, req, session_async)
            for isa_id in map(ids, ISA_TYPES)
        ]))
    for isa_id, resp in results:
        assert resp[0] == 200, resp[1]
        data = resp[1]
        assert data['service_area']['id'] == isa_id
        assert data['service_area']['flights_url'] == 'https://example.com/dss'
        assert_datetimes_are_equal(data['service_area']['time_start'],
                                   req['extents']['time_start'])
        assert_datetimes_are_equal(data['service_area']['time_end'],
                                   req['extents']['time_end'])
        assert re.match(r'[a-z0-9]{10,}$', data['service_area']['version'])
        assert 'subscribers' in data
def test_create_ops_concurrent(ids, scd_api, scd_session_async):
  start_time = datetime.datetime.utcnow()
  assert len(ovn_map) == 0
  op_req_map = {}
  op_resp_map = {}
  for idx, op_id in enumerate(map(ids, OP_TYPES)):
    req = _make_op_request(idx)
    op_req_map[op_id] = req

  # Get operations concurrently
  loop = asyncio.get_event_loop()
  results = loop.run_until_complete(
    asyncio.gather(*[_put_operation_async(req, op_id, scd_session_async, scd_api, True) for op_id, req in op_req_map.items()]))
  for req_map, resp in zip(op_req_map.items(), results):
    op_id = req_map[0]
    op_resp_map[op_id] = {}
    op_resp_map[op_id]['status_code'] = resp[0][0]
    op_resp_map[op_id]['content'] = resp[0][1]
  for op_id, resp in op_resp_map.items():
    if resp['status_code'] != 200:
        try:
            owner_name, id_code = IDFactory.decode(op_id)
        except ValueError:
            owner_name = '<Unknown owner>'
            id_code = '<Unknown resource ID>'
        print('Error with op_id {}: {}\'s {}'.format(op_id, owner_name, resource_type_code_descriptions.get(id_code, '<Unknown purpose>')))
        print('=== Request ===')
        print(json.dumps(op_req_map[op_id]))
        print('=== Response ===')
        print(json.dumps(resp['content']))
        print('=== Missing operational intents ===')
        if 'missing_operational_intents' in resp['content']:
            for missing_op in resp['content']['missing_operational_intents']:
                missing_id = missing_op.get('id', '<Unknown ID>')
                try:
                    owner_name, id_code = IDFactory.decode(missing_id)
                except ValueError:
                    owner_name = '<Unknown owner>'
                    id_code = '<Unknown resource ID>'
                print('--- Missing op {}: {}\'s {}'.format(missing_id, owner_name, resource_type_code_descriptions.get(id_code, '<Unknown purpose>')))
                print('--- Request:')
                print(json.dumps(op_req_map[missing_id]))
                print('--- Response:')
                print(json.dumps(op_resp_map[missing_id]))
    assert resp['status_code'] == 200, resp['content']
    req = op_req_map[op_id]
    data = resp['content']
    if scd_api == scd.API_0_3_5:
      op = data['operation_reference']
    else:
      op = data['operational_intent_reference']
    assert op['id'] == op_id
    assert op['uss_base_url'] == BASE_URL
    assert_datetimes_are_equal(op['time_start']['value'], req['extents'][0]['time_start']['value'])
    assert_datetimes_are_equal(op['time_end']['value'], req['extents'][0]['time_end']['value'])
    assert op['version'] == 1
    assert op['ovn']
    assert 'subscription_id' in op
    ovn_map[op_id] = op['ovn']
  assert len(ovn_map) == len(OP_TYPES)
  print(f'\n{inspect.stack()[0][3]} time_taken: {datetime.datetime.utcnow() - start_time}')