Current section

Files

Jump to
opencadc_registry_client lib opencadc_registry_client.ex
Raw

lib/opencadc_registry_client.ex

defmodule OpencadcRegistryClient do
@moduledoc """
IVOA compliant Registry client to lookup service URL endpoints.
"""
@doc """
Lookup the URL that can be used to obtain the Capabilities ASCII document. Specify the REGISTRY_ENDPOINT_HOST
environment variable as <http(s)://myhost.com> or leave the default to use the CADC's Production host address.
This assumes that the host will support the /reg/resource-caps endpoint.
Capability XML document specification here: http://www.ivoa.net/xml/VOSICapabilities/v1.0
Sample CADC document containing Capabilities URLs: http://www.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/reg/resource-caps
Returns a string URL.
## Examples
iex> OpencadcRegistryClient.lookupCapabilitiesURL("ivo://cadc.nrc.ca/vospace")
"http://www.canfar.phys.uvic.ca/vospace/capabilities"
@param resourceURI The Resource URI to use to lookup the URL.
"""
def lookupCapabilitiesURL(resourceURI) do
registryEntries(
System.get_env("REGISTRY_ENDPOINT_HOST") || "http://www.cadc-ccda.hia-iha.nrc-cnrc.gc.ca"
)
|> handleResponse(resourceURI)
end
@doc """
Lookup the Service URL to be used to issue requests to. This function will navigate the Capabilities XML document
and pull the appropriate public (non-secure) service URL.
Capability XML document specification here: http://www.ivoa.net/xml/VOSICapabilities/v1.0
Sample CADC document containing Capabilities URLs: http://www.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/reg/resource-caps
Returns a string URL.
## Examples
iex> OpencadcRegistryClient.lookupServiceURL("ivo://cadc.nrc.ca/vospace", "ivo://ivoa.net/std/VOSpace/v2.0#nodes", "vs:ParamHTTP")
"http://www.canfar.phys.uvic.ca/vospace/nodes"
@param resourceURI The Resource URI to use to lookup the Capabilities URL.
@param standardURI The Standard URI identified on the capability.
@param xsiType The XSI value used in the capability's interface attribute.
"""
def lookupServiceURL(resourceURI, standardURI, xsiType) do
with capResponse = lookupCapabilitiesURL(resourceURI) |> HTTPoison.get!() do
Parser.all(
Parser.from_string(capResponse.body),
"//capability[@standardID=\"" <>
standardURI <>
"\"]/interface[@xsi:type=\"" <> xsiType <> "\"][not(securityMethod)]/accessURL"
)
|> extractServiceURL
end
end
@doc """
Lookup the Service URL to be used to issue requests to. This function will navigate the Capabilities XML document
and pull the appropriate public secure service URL. The
Capability XML document specification here: http://www.ivoa.net/xml/VOSICapabilities/v1.0
Sample CADC document containing Capabilities URLs: http://www.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/reg/resource-caps
Returns a string URL.
## Examples
iex> OpencadcRegistryClient.lookupServiceURL("ivo://cadc.nrc.ca/vospace", "ivo://ivoa.net/std/VOSpace/v2.0#nodes", "vs:ParamHTTP", "ivo://ivoa.net/sso#tls-with-certificate")
"https://www.canfar.phys.uvic.ca/vospace/nodes"
@param resourceURI The Resource URI to use to lookup the Capabilities URL.
@param standardURI The Standard URI identified on the capability.
@param xsiType The XSI value used in the capability's interface attribute.
@param securityURI The URI identifying what kind of security to use. Valid values are
"""
def lookupServiceURL(resourceURI, standardURI, xsiType, securityURI) do
with capResponse = lookupCapabilitiesURL(resourceURI) |> HTTPoison.get!(),
capabilitiesURL = capResponse.body do
Parser.all(
Parser.from_string(capabilitiesURL),
"//capability[@standardID=\"" <>
standardURI <>
"\"]/interface[@xsi:type=\"" <>
xsiType <> "\"][securityMethod[@standardID=\"" <> securityURI <> "\"]]/accessURL"
)
|> extractServiceURL
end
end
defp registryEntries(host) do
(host <> "/reg/resource-caps") |> HTTPoison.get!()
end
defp extractCapabilitiesURL([]) do
raise ArgumentError, message: "No capabilities found"
end
defp extractCapabilitiesURL(capabilities) do
capabilities |> Enum.at(0) |> String.split("=") |> Enum.at(1) |> String.trim()
end
defp handleResponse(%HTTPoison.Response{status_code: 200} = response, resourceURI) do
response.body
|> String.split("\n", trim: true)
|> Enum.filter(fn str -> String.starts_with?(str, resourceURI) == true end)
|> extractCapabilitiesURL
end
defp handleResponse(response, _) do
raise ArgumentError,
message: "Unable to query service registry: Response code " <> response.status_code
end
defp extractServiceURL([]) do
raise ArgumentError, message: "No service endpoints found"
end
defp extractServiceURL(endpoints) do
endpoints |> Enum.at(0) |> Parser.text()
end
end