Skip to content

Commit

Permalink
Merge pull request #275 from andamian/sia2fix
Browse files Browse the repository at this point in the history
Fixed issue with access urls for SIA2
  • Loading branch information
tomdonaldson authored Oct 28, 2021
2 parents dd3914e + ee21f34 commit fb16970
Show file tree
Hide file tree
Showing 7 changed files with 123 additions and 4 deletions.
5 changes: 5 additions & 0 deletions docs/requirements.txt
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
sphinx-astropy
# 27/Oct/2021 - docutils pinned due to:
# https://github.com/readthedocs/readthedocs.org/issues/8616
# https://github.com/sphinx-doc/sphinx/issues/9727

docutils<0.18
10 changes: 7 additions & 3 deletions pyvo/dal/sia2.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,12 +168,16 @@ def __init__(self, baseurl, session=None):
# in pyvo. So pick any access url as long as it's not
if cap.standardid.lower() == SIA2_STANDARD_ID.lower():
for interface in cap.interfaces:
if interface.accessurls and not \
[m for m in interface.securitymethods if
m.standardid != 'ivo://ivoa.net/sso#BasicAA']:
if interface.accessurls and \
not (len(interface.securitymethods) == 1 and
interface.securitymethods[0].standardid ==
'ivo://ivoa.net/sso#BasicAA'):
self.query_ep = interface.accessurls[0].content
break

if not self.query_ep:
raise AttributeError('No valid end point found')

def search(self, pos=None, band=None, time=None, pol=None,
field_of_view=None, spatial_resolution=None,
spectral_resolving_power=None, exptime=None,
Expand Down
20 changes: 20 additions & 0 deletions pyvo/dal/tests/data/sia2/capabilities-basicauth.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<vosi:capabilities xmlns:vosi="http://www.ivoa.net/xml/VOSICapabilities/v1.0" xmlns:vs="http://www.ivoa.net/xml/VODataService/v1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<capability standardID="ivo://ivoa.net/std/VOSI#capabilities">
<interface xsi:type="vs:ParamHTTP">
<accessURL use="full">https://example.com/sia/capabilities</accessURL>
</interface>
</capability>
<capability standardID="ivo://ivoa.net/std/VOSI#availability">
<interface xsi:type="vs:ParamHTTP">
<accessURL use="full">https://example.com/sia/availability</accessURL>
</interface>
</capability>
<!-- SIA-2.0 query capability -->
<capability standardID="ivo://ivoa.net/std/SIA#query-2.0">
<interface xsi:type="vs:ParamHTTP" role="std" version="2.0">
<accessURL use="base">https://example.com/sia/auth-v2query</accessURL>
<securityMethod standardID="ivo://ivoa.net/sso#BasicAA" />
</interface>
</capability>
</vosi:capabilities>
23 changes: 23 additions & 0 deletions pyvo/dal/tests/data/sia2/capabilities-newformat.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<vosi:capabilities xmlns:vosi="http://www.ivoa.net/xml/VOSICapabilities/v1.0" xmlns:vs="http://www.ivoa.net/xml/VODataService/v1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<capability standardID="ivo://ivoa.net/std/VOSI#capabilities">
<interface xsi:type="vs:ParamHTTP">
<accessURL use="full">https://example.com/sia/capabilities</accessURL>
</interface>
</capability>
<capability standardID="ivo://ivoa.net/std/VOSI#availability">
<interface xsi:type="vs:ParamHTTP">
<accessURL use="full">https://example.com/sia/availability</accessURL>
</interface>
</capability>
<!-- SIA-2.0 query capability -->
<capability standardID="ivo://ivoa.net/std/SIA#query-2.0">
<interface xsi:type="vs:ParamHTTP" role="std" version="2.0">
<accessURL use="base">https://example.com/sia/v2query</accessURL>
<securityMethod />
<securityMethod standardID="ivo://ivoa.net/sso#BasicAA" />
<securityMethod standardID="ivo://ivoa.net/sso#cookie" />
<securityMethod standardID="ivo://ivoa.net/sso#tls-with-certificate" />
</interface>
</capability>
</vosi:capabilities>
28 changes: 28 additions & 0 deletions pyvo/dal/tests/data/sia2/capabilities-priv.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<vosi:capabilities xmlns:vosi="http://www.ivoa.net/xml/VOSICapabilities/v1.0" xmlns:vs="http://www.ivoa.net/xml/VODataService/v1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<capability standardID="ivo://ivoa.net/std/VOSI#capabilities">
<interface xsi:type="vs:ParamHTTP">
<accessURL use="full">https://example.com/sia/capabilities</accessURL>
</interface>
</capability>
<capability standardID="ivo://ivoa.net/std/VOSI#availability">
<interface xsi:type="vs:ParamHTTP">
<accessURL use="full">https://example.com/sia/availability</accessURL>
</interface>
</capability>
<!-- SIA-2.0 query capability -->
<capability standardID="ivo://ivoa.net/std/SIA#query-2.0">
<interface xsi:type="vs:ParamHTTP" role="std" version="2.0">
<accessURL use="base">https://example.com/sia/auth-v2query</accessURL>
<securityMethod standardID="ivo://ivoa.net/sso#BasicAA" />
</interface>
<interface xsi:type="vs:ParamHTTP" role="std" version="2.0">
<accessURL use="base">https://example.com/sia/v2query</accessURL>
<securityMethod standardID="ivo://ivoa.net/sso#cookie" />
</interface>
<interface xsi:type="vs:ParamHTTP" role="std" version="2.0">
<accessURL use="base">https://example.com/sia/v2query</accessURL>
<securityMethod standardID="ivo://ivoa.net/sso#tls-with-certificate" />
</interface>
</capability>
</vosi:capabilities>
39 changes: 39 additions & 0 deletions pyvo/dal/tests/test_sia2.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"""
from functools import partial
import re
import requests_mock

import pytest

Expand Down Expand Up @@ -56,6 +57,44 @@ def test_search():


class TestSIAService:

def test_capabilities(self):
# this tests the SIA2 capabilities with various combinations:

# - sia-basicauth - one interfaces with BasicAA security method - this
# should fail because pyvo does not support BasicAA

with requests_mock.Mocker() as cm:
cm.get('https://example.com/sia/capabilities',
content=get_pkg_data_contents('data/sia2/capabilities.xml'))
cm.get('https://example.com/sia-basicauth/capabilities',
content=get_pkg_data_contents(
'data/sia2/capabilities-basicauth.xml'))
cm.get('https://example.com/sia-newformat/capabilities',
content=get_pkg_data_contents(
'data/sia2/capabilities-newformat.xml'))
cm.get('https://example.com/sia-priv/capabilities',
content=get_pkg_data_contents(
'data/sia2/capabilities-priv.xml'))

# multiple interfaces with single security method each and
# anonymous access.
service = SIAService('https://example.com/sia')
assert service.query_ep == 'https://example.com/sia/v2query'

# one interfaces with BasicAA security method - this should fail
# because pyvo does not support BasicAA
with pytest.raises(AttributeError):
service = SIAService('https://example.com/sia-basicauth')

# one interface with multiple security methods
service = SIAService('https://example.com/sia-newformat')
assert service.query_ep == 'https://example.com/sia/v2query'

# multiple interfaces with single security method each (no anon)
service = SIAService('https://example.com/sia-priv')
assert service.query_ep == 'https://example.com/sia/v2query'

@pytest.mark.usefixtures('sia')
@pytest.mark.usefixtures('capabilities')
@pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06")
Expand Down
2 changes: 1 addition & 1 deletion pyvo/dal/tests/test_sia2_remote.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

import astropy.units as u

CADC_SIA_URL = 'https://www.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/sia'
CADC_SIA_URL = 'https://ws.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/sia'


@pytest.mark.remote_data
Expand Down

0 comments on commit fb16970

Please sign in to comment.