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
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)
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']
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
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'
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)
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)
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']
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'])
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
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}')