diff --git a/.gitattributes b/.gitattributes index 7f2e3c6ceedbecfea7dec07e74461dd98857c169..849af24790eb3d89cda1a4542461afe86e458a5d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5774,6 +5774,72 @@ SAS/Scheduler/test/unittest/testGui/testGui.sh eol=lf SAS/Scheduler/test/unittest/testqstring/testqstring.run eol=lf SAS/Scheduler/test/unittest/testqstring/testqstring.sh eol=lf SAS/Scheduler/test/unittest/tojunit.xslt -text +SAS/Specification_Services/CMakeLists.txt -text +SAS/Specification_Services/bin/CMakeLists.txt -text +SAS/Specification_Services/bin/specificationservice -text +SAS/Specification_Services/bin/specificationtranslationservice -text +SAS/Specification_Services/bin/specificationvalidationservice -text +SAS/Specification_Services/lib/CMakeLists.txt -text +SAS/Specification_Services/lib/LofarBase.xsd -text +SAS/Specification_Services/lib/LofarHistorical.xsd -text +SAS/Specification_Services/lib/LofarMoM2.xsd -text +SAS/Specification_Services/lib/LofarProject.xsd -text +SAS/Specification_Services/lib/LofarSpecification.xsd -text +SAS/Specification_Services/lib/LofarTrigger.xsd -text +SAS/Specification_Services/lib/MoM2.xsd -text +SAS/Specification_Services/lib/PersistentObjects.xsd -text +SAS/Specification_Services/lib/UserAdmin.xsd -text +SAS/Specification_Services/lib/__init__.py -text +SAS/Specification_Services/lib/config.py -text +SAS/Specification_Services/lib/specification_service.py -text +SAS/Specification_Services/lib/specification_service_rpc.py -text +SAS/Specification_Services/lib/translation_service.py -text +SAS/Specification_Services/lib/translation_service_rpc.py -text +SAS/Specification_Services/lib/validation_service.py -text +SAS/Specification_Services/lib/validation_service_rpc.py -text +SAS/Specification_Services/test/CMakeLists.txt -text +SAS/Specification_Services/test/setup_queues_and_services.sh -text +SAS/Trigger_Services/CMakeLists.txt -text +SAS/Trigger_Services/TriggerReceptionService/CMakeLists.txt -text +SAS/Trigger_Services/TriggerReceptionService/__init__.py -text +SAS/Trigger_Services/TriggerReceptionService/bin/CMakeLists.txt -text +SAS/Trigger_Services/TriggerReceptionService/bin/triggerrestinterface -text +SAS/Trigger_Services/TriggerReceptionService/bin/triggerservice -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/db.sqlite3 -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/manage.py -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/.name -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/encodings.xml -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/inspectionProfiles/Project_Default.xml -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/inspectionProfiles/profiles_settings.xml -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/misc.xml -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/modules.xml -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/scopes/scope_settings.xml -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/triggerservice.iml -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/vcs.xml -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/workspace.xml -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/__init__.py -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/credentials.py -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/settings.py -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/__init__.py -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/admin.py -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/apps.py -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/migrations/__init__.py -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/models.py -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/serializers.py -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/tests.py -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/views.py -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/urls.py -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/wsgi.py -text +SAS/Trigger_Services/TriggerReceptionService/django_rest/urls.py -text +SAS/Trigger_Services/TriggerReceptionService/lib/CMakeLists.txt -text +SAS/Trigger_Services/TriggerReceptionService/lib/__init__.py -text +SAS/Trigger_Services/TriggerReceptionService/lib/config.py -text +SAS/Trigger_Services/TriggerReceptionService/lib/trigger_service.py -text +SAS/Trigger_Services/TriggerReceptionService/lib/trigger_service_rpc.py -text +SAS/Trigger_Services/TriggerReceptionService/test/CMakeLists.txt -text +SAS/Trigger_Services/TriggerReceptionService/test/setup_queues_and_services.sh -text +SAS/Trigger_Services/TriggerReceptionService/test/trigger-testing.xml -text +SAS/Trigger_Services/TriggerReceptionService/test/trigger_misc_testing_nov2016.xml -text SAS/XML_generator/CMakeLists.txt -text SAS/XML_generator/src/CMakeLists.txt -text SAS/XML_generator/src/xmlgen -text diff --git a/SAS/CMakeLists.txt b/SAS/CMakeLists.txt index 3a8abf77552f5717f4514cb20993309714eb882d..7e9c5853d0ccd801a595209e5240ef032edc6148 100644 --- a/SAS/CMakeLists.txt +++ b/SAS/CMakeLists.txt @@ -10,6 +10,7 @@ lofar_add_package(CleanupTool) lofar_add_package(OTDB_Services) lofar_add_package(XML_generator) lofar_add_package(Trigger_Services) +lofar_add_package(Specification_Services) add_subdirectory(MoM) add_subdirectory(ResourceAssignment) diff --git a/SAS/Specification_Services/CMakeLists.txt b/SAS/Specification_Services/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..dc4f4b12f303d3152c94ba713954b332e035af69 --- /dev/null +++ b/SAS/Specification_Services/CMakeLists.txt @@ -0,0 +1,9 @@ + +lofar_find_package(Python 2.7 REQUIRED) +lofar_package(sip 0.1 DEPENDS PyCommon) + +include(PythonInstall) + +add_subdirectory(lib) +add_subdirectory(bin) +add_subdirectory(test) diff --git a/SAS/Specification_Services/bin/CMakeLists.txt b/SAS/Specification_Services/bin/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..952d5db669105243b02b37b1d5e5ce03abc8d736 --- /dev/null +++ b/SAS/Specification_Services/bin/CMakeLists.txt @@ -0,0 +1,3 @@ +lofar_add_bin_scripts(specificationservice) +lofar_add_bin_scripts(specificationtranslationservice) +lofar_add_bin_scripts(specificationvalidationservice) diff --git a/SAS/Specification_Services/bin/specificationservice b/SAS/Specification_Services/bin/specificationservice new file mode 100755 index 0000000000000000000000000000000000000000..0f241fea0f4bbf5ac42b55e3b2a8416dcbd41ec1 --- /dev/null +++ b/SAS/Specification_Services/bin/specificationservice @@ -0,0 +1,32 @@ +#!/usr/bin/python + +# Copyright (C) 2012-2015 ASTRON (Netherlands Institute for Radio Astronomy) +# P.O. Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. + + +# Executable for the Lofar specification service + +from lofar.specificationservices.specification_service import main + +import sys +import logging + +logger = logging.getLogger(__name__) + +if __name__ == '__main__': + logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) + main() diff --git a/SAS/Specification_Services/bin/specificationtranslationservice b/SAS/Specification_Services/bin/specificationtranslationservice new file mode 100755 index 0000000000000000000000000000000000000000..78f5a4b46cdd310dad5e4918f844944460e1dd8d --- /dev/null +++ b/SAS/Specification_Services/bin/specificationtranslationservice @@ -0,0 +1,32 @@ +#!/usr/bin/python + +# Copyright (C) 2012-2015 ASTRON (Netherlands Institute for Radio Astronomy) +# P.O. Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. + + +# Executable for the specification translation service +# The service converts different specification formats + +from lofar.specificationservices.translation_service import main +import sys +import logging + +logger = logging.getLogger(__name__) + +if __name__ == '__main__': + logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) + main() diff --git a/SAS/Specification_Services/bin/specificationvalidationservice b/SAS/Specification_Services/bin/specificationvalidationservice new file mode 100755 index 0000000000000000000000000000000000000000..3260a87155efb896b721c85d31d80980aab9df20 --- /dev/null +++ b/SAS/Specification_Services/bin/specificationvalidationservice @@ -0,0 +1,31 @@ +#!/usr/bin/python + +# Copyright (C) 2012-2015 ASTRON (Netherlands Institute for Radio Astronomy) +# P.O. Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. + + +# Executable for the specification validation service + +from lofar.specificationservices.validation_service import main +import sys +import logging + +logger = logging.getLogger(__name__) + +if __name__ == '__main__': + logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) + main() diff --git a/SAS/Specification_Services/lib/CMakeLists.txt b/SAS/Specification_Services/lib/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..ee05c4690ffa9e26dfe26aedbac0d848f812218e --- /dev/null +++ b/SAS/Specification_Services/lib/CMakeLists.txt @@ -0,0 +1,33 @@ +# $Id$ + +lofar_find_package(Python 2.7 REQUIRED) +include(PythonInstall) + +set(_py_files + __init__.py + config.py + specification_service.py + specification_service_rpc.py + translation_service.py + translation_service_rpc.py + validation_service.py + validation_service_rpc.py +) + +python_install(${_py_files} + DESTINATION lofar/specificationservices) + +set(xsd_files + LofarTrigger.xsd + LofarBase.xsd + LofarProject.xsd + LofarMoM2.xsd + MoM2.xsd + PersistentObjects.xsd + LofarHistorical.xsd + LofarSpecification.xsd + UserAdmin.xsd + ) + +install(FILES ${xsd_files} + DESTINATION ${PYTHON_INSTALL_DIR}/lofar/specificationservices) \ No newline at end of file diff --git a/SAS/Specification_Services/lib/LofarBase.xsd b/SAS/Specification_Services/lib/LofarBase.xsd new file mode 100644 index 0000000000000000000000000000000000000000..f57e33e1461ce57e0c8b4175aa7907d03a542449 --- /dev/null +++ b/SAS/Specification_Services/lib/LofarBase.xsd @@ -0,0 +1,472 @@ +<?xml version="1.0" encoding="utf-8" ?> +<xsd:schema targetNamespace="http://www.astron.nl/LofarBase" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.astron.nl/LofarBase"> + <xsd:annotation> + <xsd:documentation>Definitions of base types for LOFAR XML objects</xsd:documentation> + </xsd:annotation> + <xsd:annotation> + <xsd:documentation>============================LOFAR common simple types============================ + + This section is for types used by multiple sections + </xsd:documentation> + </xsd:annotation> + <xsd:simpleType name="IdentifierSource"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="MoM"/> + <xsd:enumeration value="SAS"/> + <xsd:enumeration value="Temporary"/><!--Only needs to be unique within a single XML. Parser will need to assign permanent Ids--> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="Identifier"> + <xsd:sequence> + <xsd:element name="source" type="xsd:string"/> + <xsd:choice> + <xsd:element name="identifier" type="xsd:nonNegativeInteger"/> + <xsd:element name="topology" type="xsd:string"/><!--For backward compatibility with MoM 3--> + </xsd:choice> + <xsd:element name="description" minOccurs="0" type="xsd:string"/><!-- mostly for debugging --> + </xsd:sequence> + </xsd:complexType> + <xsd:annotation> + <xsd:documentation>============================Project related types============================ + + This section describes types related to projects and users. Currently only implements some things for the specification of triggers. + </xsd:documentation> + </xsd:annotation> + <xsd:complexType name="ProjectReference"> + <xsd:choice> + <xsd:element name="identifier" type="Identifier"/> <!-- MoM Id --> + <xsd:element name="ProjectCode" type="xsd:string"/> <!-- Something like LC5_009 --> + </xsd:choice> + </xsd:complexType> + <xsd:complexType name="ContactInformation"> + <xsd:sequence> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="email" type="xsd:string"/> + <xsd:element name="affiliation" minOccurs="0" type="xsd:string"/> <!-- Does this need to point to an affiliation record--> + <!-- Do we need anything else like address or phone number? --> + </xsd:sequence> + </xsd:complexType> + <xsd:annotation> + <xsd:documentation>============================Event related types============================ + + This section describes ... information. + </xsd:documentation> + </xsd:annotation> + <xsd:simpleType name="EventType"> <!-- just some guesses right now --> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="VOEvent"/> + <xsd:enumeration value="LOFAREvent"/> + <xsd:enumeration value="Magic"/> + <xsd:enumeration value="LIGO"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="Event"> + <xsd:sequence> + <xsd:element name="identification" type="xsd:string"/><!-- Probably doesn't need to be machine interpretable, so basically free form just to inform the user --> + <xsd:element name="description" type="xsd:string"/> + <xsd:element name="type" type="EventType"/> <!-- This implicitly determines the source of the identification --> + </xsd:sequence> + </xsd:complexType> + <xsd:annotation> + <xsd:documentation>============================Container related types============================ + + This section describes ... information. + </xsd:documentation> + </xsd:annotation> + <xsd:complexType name="Folder"> + <xsd:sequence> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="description" type="xsd:string"/> + <!--xsd:element name="type" minOccurs="0" type="FolderType"/--> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + </xsd:sequence> + <!--xsd:attribute name="topology_parent" type="xsd:boolean"/> + <xsd:attribute name="update_folder" type="xsd:boolean"/ --> + </xsd:complexType> + <xsd:annotation> + <xsd:documentation>============================Observation related types============================ + + This section describes ... information. + </xsd:documentation> + </xsd:annotation> + <xsd:complexType name="Observation"> + <xsd:sequence> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="description" type="xsd:string"/> + <xsd:element name="processingCluster" type="ProcessingCluster"/> + <xsd:element name="instrument" type="Instrument"/> + <xsd:element name="defaultTemplate" type="xsd:string"/> <!-- user Strategy, to not be OTDB specific ? --> + <xsd:element name="tbbPiggybackAllowed" type="xsd:boolean"/> + <xsd:element name="aartfaacPiggybackAllowed" type="xsd:boolean"/> + <xsd:element name="correlatedData" type="xsd:boolean"/> + <xsd:element name="filteredData" type="xsd:boolean"/> + <xsd:element name="beamformedData" type="xsd:boolean"/> + <xsd:element name="coherentStokesData" type="xsd:boolean"/> + <xsd:element name="incoherentStokesData" type="xsd:boolean"/> + <xsd:element name="antenna" type="AntennaSet"/> + <xsd:element name="clock" type="Clock"/> + <xsd:element name="instrumentFilter" type="BandFilter"/> + <xsd:element minOccurs="0" name="integrationInterval" type="xsd:double"/> + <xsd:element minOccurs="0" name="channelsPerSubband" type="xsd:short"/> + <xsd:element minOccurs="0" name="coherentDedisperseChannels" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="tiedArrayBeams" type="ArrayBeams"/> + <xsd:element minOccurs="0" name="stokes" type="Stokes"/> + <xsd:element minOccurs="0" name="bypassPff" type="xsd:boolean"/> + <xsd:element name="enableSuperterp" type="xsd:boolean"/> + <xsd:element name="numberOfBitsPerSample" type="xsd:nonNegativeInteger"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="MemoryStorageUnit"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="byte"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="MemoryStorage"> + <xsd:simpleContent> + <xsd:extension base="xsd:nonNegativeInteger"> + <xsd:attribute name="unit" type="MemoryStorageUnit" use="required"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:complexType name="ProcessingCluster"> + <xsd:sequence> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="partition" type="xsd:string"/> + <xsd:element name="numberOfTasks" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="minRAMPerTask" type="MemoryStorage"/> + <xsd:element minOccurs="0" name="minScratchPerTask" type="MemoryStorage"/> + <xsd:element minOccurs="0" name="maxDurationPerTask" type="xsd:duration"/> + <xsd:element name="numberOfCoresPerTask" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="runSimultaneous" type="xsd:boolean"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="ArrayBeams"> + <xsd:sequence> + <xsd:element minOccurs="0" name="flyseye" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="nrTabRings" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="tabRingSize" type="xsd:double" nillable="true"/> + <xsd:element minOccurs="0" name="tiedArrayBeamList" type="ArrayBeamList"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="ArrayBeamList"> + <xsd:sequence> + <xsd:element minOccurs="0" maxOccurs="unbounded" name="pencilBeam"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="angle1" type="xsd:double"/> + <xsd:element name="angle2" type="xsd:double"/> + </xsd:sequence> + <xsd:attribute name="index" type="xsd:integer"/> + </xsd:complexType> + </xsd:element> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="StokesSelection"><!-- I think we support more XXYY ???--> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="I"/> + <xsd:enumeration value="IQUV"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="Stokes"> + <xsd:sequence> + <xsd:element name="integrateChannels" type="xsd:boolean"/> + <xsd:element name="subbandsPerFileCS" type="xsd:nonNegativeInteger" nillable="true"/> + <xsd:element name="numberCollapsedChannelsCS" type="xsd:nonNegativeInteger" nillable="true"/> + <xsd:element name="stokesDownsamplingStepsCS" type="xsd:nonNegativeInteger" nillable="true"/> + <xsd:element name="whichCS" type="StokesSelection" nillable="true"/> + <xsd:element name="subbandsPerFileIS" type="xsd:nonNegativeInteger" nillable="true"/> + <xsd:element name="numberCollapsedChannelsIS" type="xsd:nonNegativeInteger" nillable="true"/> + <xsd:element name="stokesDownsamplingStepsIS" type="xsd:nonNegativeInteger" nillable="true"/> + <xsd:element name="whichIS" type="StokesSelection" nillable="true"/> + <!-- xsd:element minOccurs="0" name="integrationSteps" type="xsd:nonNegativeInteger" nillable="true"/ --> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="Stations"> + <xsd:sequence> + <xsd:element minOccurs="0" maxOccurs="unbounded" name="station" type="Station"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="Station"> + <xsd:sequence> + <xsd:element name="name" type="xsd:string"/><!--xsd:attribute name="name" type="xsd:string" use="required"/--> + <!--xsd:element minOccurs="0" name="location" type="Coordinates/--> + <xsd:element minOccurs="0" maxOccurs="2" name="antennaField" type="AntennaField"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="AntennaFieldType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="HBA0"/> + <xsd:enumeration value="HBA1"/> + <xsd:enumeration value="HBA0+1"/> + <xsd:enumeration value="HBA"/> + <xsd:enumeration value="LBA"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="AntennaField"> + <xsd:sequence> + <xsd:element name="name" type="AntennaFieldType"/> + <!--xsd:element name="location" type="Coordinates/--> + </xsd:sequence> + </xsd:complexType> + <!-- xsd:complexType name="Coordinates> + <xsd:sequence> + <xsd:element name="coordinateSystem"> + <xsd:simpleType> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="WGS84"/> + <xsd:enumeration value="ITRF2000"/> + </xsd:restriction> + </xsd:simpleType> + </xsd:element> + <xsd:element name="x" type="xsd:double"/> + <xsd:element name="y" type="xsd:double"/> + <xsd:element name="z" type="xsd:double"/> + </xsd:sequence> + </xsd:complexType--> + <xsd:simpleType name="AntennaSet"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="HBA Zero"/> + <xsd:enumeration value="HBA One"/> + <xsd:enumeration value="HBA Dual"/> + <xsd:enumeration value="HBA Joined"/> + <xsd:enumeration value="LBA Outer"/> + <xsd:enumeration value="LBA Inner"/> + <xsd:enumeration value="LBA Sparse Even"/> + <xsd:enumeration value="LBA Sparse Odd"/> + <xsd:enumeration value="LBA X"/> + <xsd:enumeration value="LBA Y"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="Instrument"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="Beam Observation"/> + <xsd:enumeration value="Interferometer"/> + <xsd:enumeration value="Tied Array"/> + <xsd:enumeration value="Transient Buffer Board"/> + <xsd:enumeration value="Direct Data Storage"/> + <xsd:enumeration value="Non Standard"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="BandFilter"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="10-70 MHz"/> + <xsd:enumeration value="30-70 MHz"/> + <xsd:enumeration value="10-90 MHz"/> + <xsd:enumeration value="30-90 MHz"/> + <xsd:enumeration value="110-190 MHz"/> + <xsd:enumeration value="170-230 MHz"/> + <xsd:enumeration value="210-250 MHz"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="Clock"> + <xsd:sequence> + <xsd:element minOccurs="0" name="channelWidth" type="Frequency"/> + <xsd:element minOccurs="0" name="samplesPerSecond" type="xsd:double"/> + <xsd:element minOccurs="0" name="subbandWidth" type="Frequency"/> + <xsd:element minOccurs="0" name="systemClock" type="Frequency"/> + </xsd:sequence> + <xsd:attribute name="mode" use="required"> + <xsd:simpleType> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="160 MHz"/> + <xsd:enumeration value="200 MHz"/> + </xsd:restriction> + </xsd:simpleType> + </xsd:attribute> + </xsd:complexType> + <xsd:simpleType name="FrequencyUnit"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="Hz"/> + <xsd:enumeration value="kHz"/> + <xsd:enumeration value="MHz"/> + <xsd:enumeration value="GHz"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="Frequency"> + <xsd:simpleContent> + <xsd:extension base="xsd:double"> + <xsd:attribute name="unit" type="FrequencyUnit" use="required"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:annotation> + <xsd:documentation>============================Measurement related types============================ + + This section describes ... information. + </xsd:documentation><!-- Measurement related declarations --> + </xsd:annotation> + <xsd:complexType name="Measurement" abstract="true"/><!-- Beam Measurement related declarations --> + <xsd:complexType name="BeamMeasurement"> + <xsd:complexContent> + <xsd:extension base="Measurement"><!-- SAP --> + <xsd:sequence> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="description" type="xsd:string"/> + <xsd:element name="ra" type="xsd:double"/> + <xsd:element name="dec" type="xsd:double"/> + <xsd:element name="equinox" type="Equinox"/> + <!-- xsd:element name="duration" type="xsd:duration"/> + <xsd:element name="startTime" type="xsd:dateTime"/> + <xsd:element name="endTime" type="xsd:dateTime"/ --> + <!-- xsd:element name="centralFrequency" type="mom2:Frequency"/> + <xsd:element name="bandWidth" type="mom2:Frequency"/ --> + <xsd:element name="subbandsSpecification" type="SubbandsSpecification"/> + <xsd:element minOccurs="0" name="tiedArrayBeams" type="ArrayBeams"/><!--Need to remove for UVMeasurement --> + <xsd:element name="measurementType"> + <xsd:simpleType> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="Target"/> + <xsd:enumeration value="Calibration"/> + <xsd:enumeration value="Tune Up"/> + <xsd:enumeration value="Miscellaneous"/> + </xsd:restriction> + </xsd:simpleType> + </xsd:element> + <!--FIXME distinction between spec and actual lost/omitted --> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="SubbandsSpecification"><!-- FIXME what do we need?--> + <xsd:sequence> + <xsd:element minOccurs="0" name="bandWidth" type="Frequency"/> + <xsd:element minOccurs="0" name="centralFrequency" type="Frequency"/> + <xsd:element minOccurs="0" name="contiguous" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="subbands" type="SubbandArray"/> + </xsd:sequence> + </xsd:complexType><!-- xsd:complexType name="CustomSubbandsSpecification"/ --> + <xsd:simpleType name="SubbandArray"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="\d{1,3}(,\d{1,3})*|\d{1,3}\.\.\d{1,3}"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="Equinox"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="J2000"/> + <xsd:enumeration value="B1950"/> + <xsd:enumeration value="Other"/> + </xsd:restriction> + </xsd:simpleType> +<!-- TBB Measurement, UV Measurement BF Measurement and Generic Measurement don't seem to get used at the moment --> + <xsd:annotation> + <xsd:documentation>============================Pipeline related types============================ + + This section describes ... information. + </xsd:documentation> + </xsd:annotation> +<!-- General Pipeline related declarations --> + <xsd:complexType name="Pipeline" abstract="true"/> +<!-- Averaging Pipeline related declarations --> + <xsd:complexType name="AveragingPipeline"> + <xsd:complexContent> + <xsd:extension base="Pipeline"> + <xsd:sequence> + <xsd:element name="name" type="xsd:string"/> <!-- Should go to higher/base class level? --> + <xsd:element name="description" type="xsd:string"/> + <xsd:element name="processingCluster" type="ProcessingCluster"/> + <xsd:element name="defaultTemplate" type="xsd:string"/> + <!--xsd:element minOccurs="0" name="duration" type="xsd:duration"/> + <xsd:element minOccurs="0" name="startTime" type="xsd:dateTime"/> + <xsd:element minOccurs="0" name="endTime" type="xsd:dateTime" nillable="true"/--> + <xsd:element minOccurs="0" name="demixingParameters" type="DemixingParameters"/> + <xsd:element minOccurs="0" name="bbsParameters" type="BbsParameters"/> + <xsd:element minOccurs="0" name="flaggingStrategy" type="xsd:string"/> + <!-- xsd:element minOccurs="0" name="frequencyIntegrationStep" type="xsd:nonNegativeInteger"/ --> + <!-- xsd:element minOccurs="0" name="timeIntegrationStep" type="xsd:nonNegativeInteger"/ --> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="DemixingParameters"><!-- These two types are basically the same !! Probably not correct. I made all of it mandatory--> + <xsd:sequence> + <xsd:element name="averagingFreqStep" type="xsd:nonNegativeInteger"/> + <xsd:element name="averagingTimeStep" type="xsd:nonNegativeInteger"/> + <xsd:element name="demixFreqStep" type="xsd:nonNegativeInteger"/> + <xsd:element name="demixTimeStep" type="xsd:nonNegativeInteger"/> + <xsd:element name="demixAlways" type="xsd:string"/> + <xsd:element name="demixIfNeeded" type="xsd:string"/> + <xsd:element name="ignoreTarget" type="xsd:boolean" nillable="true"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="BbsParameters"><!-- BBS should be in a CalibrationPipeline !--> + <xsd:sequence> + <xsd:element name="averagingFreqStep" type="xsd:nonNegativeInteger"/> + <xsd:element name="averagingTimeStep" type="xsd:nonNegativeInteger"/> + <xsd:element name="demixFreqStep" type="xsd:nonNegativeInteger"/> + <xsd:element name="demixTimeStep" type="xsd:nonNegativeInteger"/> + <xsd:element name="demixAlways" type="xsd:string"/> + <xsd:element name="demixIfNeeded" type="xsd:string"/> + <xsd:element name="ignoreTarget" type="xsd:boolean"/> + </xsd:sequence> + </xsd:complexType> +<!-- Imaging Pipeline related declarations --> + <xsd:complexType name="ImagingPipeline"> + <xsd:complexContent> + <xsd:extension base="Pipeline"><!-- Should maybe derive from AveragingPipeline or CalibrationPipeline--> + <xsd:sequence> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="description" type="xsd:string"/> + <xsd:element name="processingCluster" type="ProcessingCluster"/> + <xsd:element minOccurs="0" name="imagerIntegrationTime" type="xsd:double"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> +<!-- Pulsar Pipeline related declarations --> + <xsd:complexType name="PulsarPipeline"> + <xsd:complexContent> + <xsd:extension base="Pipeline"> + <xsd:sequence> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="description" type="xsd:string"/> + <xsd:element name="processingCluster" type="ProcessingCluster"/> + <xsd:element name="defaultTemplate" type="xsd:string"/> + <!--xsd:element minOccurs="0" name="duration" type="xsd:string"/ --> + <xsd:element minOccurs="0" name="_2bf2fitsExtraOpts" type="xsd:string"/> + <xsd:element name="_8bitConversionSigma" type="xsd:string"/> + <xsd:element name="decodeNblocks" type="xsd:string"/> + <xsd:element name="decodeSigma" type="xsd:string"/> + <xsd:element name="digifilExtraOpts" type="xsd:string"/> + <xsd:element name="dspsrExtraOpts" type="xsd:string"/> + <xsd:element name="dynamicSpectrumTimeAverage" type="xsd:string"/> + <xsd:element name="nofold" type="xsd:string"/> + <xsd:element name="nopdmp" type="xsd:string"/> + <xsd:element name="norfi" type="xsd:string"/> + <xsd:element name="prepdataExtraOpts" type="xsd:string"/> + <xsd:element name="prepfoldExtraOpts" type="xsd:string"/> + <xsd:element name="prepsubbandExtraOpts" type="xsd:string"/> + <xsd:element name="pulsar" type="xsd:string"/> + <xsd:element name="rawTo8bit" type="xsd:string"/> + <xsd:element name="rfifindExtraOpts" type="xsd:string"/> + <xsd:element name="rrats" type="xsd:string"/> + <xsd:element name="singlePulse" type="xsd:string"/> + <xsd:element name="skipDsps" type="xsd:string"/> + <xsd:element name="skipDynamicSpectrum" type="xsd:string"/> + <xsd:element name="skipPrepfold" type="xsd:string"/> + <xsd:element name="tsubint" type="xsd:string"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:annotation> + <xsd:documentation>============================System task related types============================ + + This section describes ... information. + </xsd:documentation> + </xsd:annotation> + <xsd:complexType name="Ingest" abstract="true"/> + <xsd:complexType name="Cleanup" abstract="true"/> + <xsd:annotation> + <xsd:documentation>============================Dataproduct related types============================ + + This section describes ... information. + </xsd:documentation> + </xsd:annotation> + <xsd:complexType name="DataProduct" abstract="true"/> + <xsd:complexType name="StorageCluster"> + <xsd:sequence> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="partition" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType> +</xsd:schema> diff --git a/SAS/Specification_Services/lib/LofarHistorical.xsd b/SAS/Specification_Services/lib/LofarHistorical.xsd new file mode 100644 index 0000000000000000000000000000000000000000..25e446e4f0f5e4c34bc8e3d19ae6d9086df83ce2 --- /dev/null +++ b/SAS/Specification_Services/lib/LofarHistorical.xsd @@ -0,0 +1,308 @@ +<?xml version="1.0" encoding="utf-8" ?> +<xsd:schema targetNamespace="http://www.astron.nl/LofarTrigger" version="0.1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.astron.nl/LofarTrigger" xmlns:spec="http://www.astron.nl/LofarSpecification" xmlns:base="http://www.astron.nl/LofarBase"> + <xsd:import schemaLocation="LofarSpecification.xsd" namespace="http://www.astron.nl/LofarSpecification"/> + <xsd:import schemaLocation="LofarBase.xsd" namespace="http://www.astron.nl/LofarBase"/> + <xsd:annotation> + <xsd:documentation>Definitions for LOFAR historical storage + + This contains extentions of base objects that are needed to track and report the history of these objects. + </xsd:documentation> + </xsd:annotation> + <xsd:annotation> + <xsd:documentation>============================LOFAR ============================ + + TBD + </xsd:documentation> + </xsd:annotation> +<!-- UV DataProduct related declarations --> + <!--xsd:element name="uvDataProduct" substitutionGroup="mom2:anyDataProduct" type="UVDataProduct"/> + <xsd:complexType name="UVDataProduct"> + <xsd:complexContent> + <xsd:extension base="DataProduct"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="status" type="xsd:string"/> + <xsd:element minOccurs="0" name="storageCluster" type="StorageCluster"/> + <xsd:element minOccurs="0" name="ownerMom2Object" type="mom2:Mom2ObjectRef"/> + <xsd:choice> + <xsd:element minOccurs="0" name="uri" type="xsd:string"/> + <xsd:element minOccurs="0" name="locations" type="mom2:DataProductLocations"/> + </xsd:choice> + <xsd:element minOccurs="0" name="fileFormat" type="xsd:string"/> + <xsd:element minOccurs="0" name="type" type="xsd:string"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + <xsd:element minOccurs="0" default="false" name="released" type="xsd:boolean"/> + <xsd:element minOccurs="0" default="false" name="exported" type="xsd:boolean"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="specificUVDataProductAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="storageTicket" type="xsd:string"/> + <xsd:element minOccurs="0" name="fileSize" type="xsd:unsignedLong"/> + <xsd:element minOccurs="0" name="checksums" type="ChecksumTypes"/> + </xsd:sequence--> + <!-- xsd:attribute name="id" type="xsd:integer" default="0"/ --> + <!-- xsd:attribute name="mom2DPId" type="xsd:nonNegativeInteger"/ --> + <!--xsd:attribute name="topology" type="xsd:string"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType--> + <!--xsd:element name="specificUVDataProductAttributes" substitutionGroup="mom2:specificAttributes" type="SpecificUVDataProductAttributes"/> + <xsd:complexType name="SpecificUVDataProductAttributes"> + <xsd:complexContent> + <xsd:extension base="mom2:SpecificAttributes"> + <xsd:sequence> + <xsd:element minOccurs="0" name="subband" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="stationSubband" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="centralFrequency" type="mom2:Frequency"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType--><!-- Beamformed DataProduct related declarations --> + <!--xsd:element name="bfDataProduct" substitutionGroup="mom2:anyDataProduct" type="BFDataProduct"/> + <xsd:complexType name="BFDataProduct"> + <xsd:complexContent> + <xsd:extension base="DataProduct"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="status" type="xsd:string"/> + <xsd:element minOccurs="0" name="storageCluster" type="StorageCluster"/> + <xsd:element minOccurs="0" name="ownerMom2Object" type="mom2:Mom2ObjectRef"/> + <xsd:choice> + <xsd:element minOccurs="0" name="uri" type="xsd:string"/> + <xsd:element minOccurs="0" name="locations" type="mom2:DataProductLocations"/> + </xsd:choice> + <xsd:element minOccurs="0" name="fileFormat" type="xsd:string"/> + <xsd:element minOccurs="0" name="type" type="xsd:string"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + <xsd:element minOccurs="0" default="false" name="released" type="xsd:boolean"/> + <xsd:element minOccurs="0" default="false" name="exported" type="xsd:boolean"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="specificBFDataProductAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="storageTicket" type="xsd:string"/> + <xsd:element minOccurs="0" name="fileSize" type="xsd:unsignedLong"/> + <xsd:element minOccurs="0" name="checksums" type="ChecksumTypes"/> + </xsd:sequence--> + <!-- xsd:attribute name="id" type="xsd:integer" default="0"/ --> + <!-- xsd:attribute name="mom2DPId" type="xsd:nonNegativeInteger"/ --> + <!--xsd:attribute name="topology" type="xsd:string"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType--> + <!--xsd:element name="specificBFDataProductAttributes" substitutionGroup="mom2:specificAttributes" type="SpecificBFDataProductAttributes"/> + <xsd:complexType name="SpecificBFDataProductAttributes"> + <xsd:complexContent> + <xsd:extension base="mom2:SpecificAttributes"> + <xsd:sequence/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType--><!-- TBB DataProduct related declarations --> + <!--xsd:element name="tbbDataProduct" substitutionGroup="mom2:anyDataProduct" type="TBBDataProduct"/> + <xsd:complexType name="TBBDataProduct"> + <xsd:complexContent> + <xsd:restriction base="DataProduct"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="status" type="xsd:string"/> + <xsd:element minOccurs="0" name="storageCluster" type="StorageCluster"/> + <xsd:element minOccurs="0" name="ownerMom2Object" type="mom2:Mom2ObjectRef"/> + <xsd:choice> + <xsd:element minOccurs="0" name="uri" type="xsd:string"/> + <xsd:element minOccurs="0" name="locations" type="mom2:DataProductLocations"/> + </xsd:choice> + <xsd:element minOccurs="0" name="fileFormat" type="xsd:string"/> + <xsd:element minOccurs="0" name="type" type="xsd:string"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + <xsd:element minOccurs="0" default="false" name="released" type="xsd:boolean"/> + <xsd:element minOccurs="0" default="false" name="exported" type="xsd:boolean"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="specificTBBDataProductAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="storageTicket" type="xsd:string"/> + <xsd:element minOccurs="0" name="fileSize" type="xsd:unsignedLong"/> + <xsd:element minOccurs="0" name="checksums" type="ChecksumTypes"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:integer" default="0"/> + <xsd:attribute name="mom2DPId" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="specificTBBDataProductAttributes" substitutionGroup="mom2:specificAttributes" type="SpecificTBBDataProductAttributes"/> + <xsd:complexType name="SpecificTBBDataProductAttributes"> + <xsd:complexContent> + <xsd:extension base="mom2:SpecificAttributes"> + <xsd:sequence> + <xsd:element minOccurs="0" name="numberOfSamples" type="xsd:positiveInteger"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType--><!-- PixelMap DataProduct related declarations --> + <!--xsd:complexType name="PixelMapDataProduct" abstract="true"> + <xsd:complexContent> + <xsd:restriction base="DataProduct"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="status" type="xsd:string"/> + <xsd:element minOccurs="0" name="storageCluster" type="StorageCluster"/> + <xsd:element minOccurs="0" name="ownerMom2Object" type="mom2:Mom2ObjectRef"/> + <xsd:choice> + <xsd:element minOccurs="0" name="uri" type="xsd:string"/> + <xsd:element minOccurs="0" name="locations" type="mom2:DataProductLocations"/> + </xsd:choice> + <xsd:element minOccurs="0" name="fileFormat" type="xsd:string"/> + <xsd:element minOccurs="0" name="type" type="xsd:string"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + <xsd:element minOccurs="0" default="false" name="released" type="xsd:boolean"/> + <xsd:element minOccurs="0" default="false" name="exported" type="xsd:boolean"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="specificPixelMapDataProductAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="storageTicket" type="xsd:string"/> + <xsd:element minOccurs="0" name="fileSize" type="xsd:unsignedLong"/> + <xsd:element minOccurs="0" name="checksums" type="ChecksumTypes"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:integer" default="0"/> + <xsd:attribute name="mom2DPId" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="specificPixelMapDataProductAttributes" substitutionGroup="mom2:specificAttributes" type="SpecificPixelMapDataProductAttributes"/> + <xsd:complexType name="SpecificPixelMapDataProductAttributes"> + <xsd:complexContent> + <xsd:extension base="mom2:SpecificAttributes"> + <xsd:sequence> + <xsd:element minOccurs="0" name="numberOfAxes" type="xsd:positiveInteger"/> + <xsd:element minOccurs="0" maxOccurs="unbounded" name="axis" type="Axis"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="Axis"> + <xsd:sequence> + <xsd:element minOccurs="0" name="number" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="unit" type="xsd:string"/> + <xsd:element minOccurs="0" name="length" type="xsd:nonNegativeInteger"/> + </xsd:sequence> + </xsd:complexType--><!-- Sky Image DataProduct related declarations --> + <!--xsd:element name="skyImageDataProduct" substitutionGroup="mom2:anyDataProduct" type="SkyImageDataProduct"/> + <xsd:complexType name="SkyImageDataProduct"> + <xsd:complexContent> + <xsd:restriction base="DataProduct"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="status" type="xsd:string"/> + <xsd:element minOccurs="0" name="storageCluster" type="StorageCluster"/> + <xsd:element minOccurs="0" name="ownerMom2Object" type="mom2:Mom2ObjectRef"/> + <xsd:choice> + <xsd:element minOccurs="0" name="uri" type="xsd:string"/> + <xsd:element minOccurs="0" name="locations" type="mom2:DataProductLocations"/> + </xsd:choice> + <xsd:element minOccurs="0" name="fileFormat" type="xsd:string"/> + <xsd:element minOccurs="0" name="type" type="xsd:string"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + <xsd:element minOccurs="0" default="false" name="released" type="xsd:boolean"/> + <xsd:element minOccurs="0" default="false" name="exported" type="xsd:boolean"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="specificSkyImageDataProductAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="storageTicket" type="xsd:string"/> + <xsd:element minOccurs="0" name="fileSize" type="xsd:unsignedLong"/> + <xsd:element minOccurs="0" name="checksums" type="ChecksumTypes"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:integer" default="0"/> + <xsd:attribute name="mom2DPId" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="specificSkyImageDataProductAttributes" substitutionGroup="mom2:specificAttributes" type="SpecificSkyImageDataProductAttributes"/> + <xsd:complexType name="SpecificSkyImageDataProductAttributes"> + <xsd:complexContent> + <xsd:extension base="SpecificPixelMapDataProductAttributes"> + <xsd:sequence> + <xsd:element minOccurs="0" name="pointing" type="Pointing"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="Pointing"> + <xsd:sequence> + <xsd:element minOccurs="0" name="rightAscension" type="xsd:double"/> + <xsd:element minOccurs="0" name="declination" type="xsd:double"/> + <xsd:element minOccurs="0" name="equinox" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType--><!-- Pulsar Pipeline DataProduct related declarations --> + <!--xsd:element name="pulsarDataProduct" substitutionGroup="mom2:anyDataProduct" type="PulsarDataProduct"/> + <xsd:complexType name="PulsarDataProduct"> + <xsd:complexContent> + <xsd:extension base="DataProduct"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="status" type="xsd:string"/> + <xsd:element minOccurs="0" name="storageCluster" type="StorageCluster"/> + <xsd:element minOccurs="0" name="ownerMom2Object" type="mom2:Mom2ObjectRef"/> + <xsd:choice> + <xsd:element minOccurs="0" name="uri" type="xsd:string"/> + <xsd:element minOccurs="0" name="locations" type="mom2:DataProductLocations"/> + </xsd:choice> + <xsd:element minOccurs="0" name="fileFormat" type="xsd:string"/> + <xsd:element minOccurs="0" name="type" type="xsd:string"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + <xsd:element minOccurs="0" default="false" name="released" type="xsd:boolean"/> + <xsd:element minOccurs="0" default="false" name="exported" type="xsd:boolean"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="specificBFDataProductAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="storageTicket" type="xsd:string"/> + <xsd:element minOccurs="0" name="fileSize" type="xsd:unsignedLong"/> + <xsd:element minOccurs="0" name="checksums" type="ChecksumTypes"/> + </xsd:sequence--> + <!-- xsd:attribute name="id" type="xsd:integer" default="0"/ --> + <!-- xsd:attribute name="mom2DPId" type="xsd:nonNegativeInteger"/ --> + <!-- xsd:attribute name="topology" type="xsd:string"/ --> + <!--/xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="specificPulsarDataProductAttributes" substitutionGroup="mom2:specificAttributes" type="SpecificPulsarDataProductAttributes"/> + <xsd:complexType name="SpecificPulsarDataProductAttributes"> + <xsd:complexContent> + <xsd:extension base="mom2:SpecificAttributes"> + <xsd:sequence/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType--><!-- Generic DataProduct related declarations --> + <!--xsd:element name="genericDataProduct" substitutionGroup="mom2:anyDataProduct" type="GenericDataProduct"/> + <xsd:complexType name="GenericDataProduct"> + <xsd:complexContent> + <xsd:restriction base="DataProduct"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="status" type="xsd:string"/> + <xsd:element minOccurs="0" name="storageCluster" type="StorageCluster"/> + <xsd:element minOccurs="0" name="ownerMom2Object" type="mom2:Mom2ObjectRef"/> + <xsd:choice> + <xsd:element minOccurs="0" name="uri" type="xsd:string"/> + <xsd:element minOccurs="0" name="locations" type="mom2:DataProductLocations"/> + </xsd:choice> + <xsd:element minOccurs="0" name="fileFormat" type="xsd:string"/> + <xsd:element minOccurs="0" name="type" type="xsd:string"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + <xsd:element minOccurs="0" default="false" name="released" type="xsd:boolean"/> + <xsd:element minOccurs="0" default="false" name="exported" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="storageTicket" type="xsd:string"/> + <xsd:element minOccurs="0" name="fileSize" type="xsd:unsignedLong"/> + <xsd:element minOccurs="0" name="checksums" type="ChecksumTypes"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:integer" default="0"/> + <xsd:attribute name="mom2DPId" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType--> +</xsd:schema> diff --git a/SAS/Specification_Services/lib/LofarMoM2.xsd b/SAS/Specification_Services/lib/LofarMoM2.xsd new file mode 100644 index 0000000000000000000000000000000000000000..ba4adc331ebe0b0260eb4f4da23672f1286ea056 --- /dev/null +++ b/SAS/Specification_Services/lib/LofarMoM2.xsd @@ -0,0 +1,1305 @@ +<?xml version="1.0" encoding="utf-8" ?> +<xsd:schema targetNamespace="http://www.astron.nl/MoM2-Lofar" version="3.0" xmlns:persistent="http://www.astron.nl/PersistentObjects" xmlns:mom2="http://www.astron.nl/MoM2" xmlns="http://www.astron.nl/MoM2-Lofar" xmlns:user="http://www.astron.nl/useradmin" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <xsd:import schemaLocation="MoM2.xsd" namespace="http://www.astron.nl/MoM2"/> + <xsd:import schemaLocation="UserAdmin.xsd" namespace="http://www.astron.nl/useradmin"/> + <xsd:import schemaLocation="PersistentObjects.xsd" namespace="http://www.astron.nl/PersistentObjects"/> + <xsd:annotation> + <xsd:documentation> + XML Schema for the MoM3 datamodel of Lofar + </xsd:documentation> + </xsd:annotation><!-- Project related declarations --> + <xsd:element name="project" substitutionGroup="mom2:project" type="LofarProjectType"/> + <xsd:complexType name="LofarProjectType"> + <xsd:complexContent> + <xsd:restriction base="mom2:ProjectType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="version" type="xsd:string"/> + <xsd:element minOccurs="0" name="template" type="LofarTemplateType"/> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="description" type="xsd:string"/> + <xsd:element minOccurs="0" name="statusHistory" type="mom2:StatusHistoryType"/> + <xsd:element minOccurs="0" name="currentStatus" type="mom2:CurrentStatusType"/> + <xsd:element minOccurs="0" name="generalRemarks" nillable="true" type="mom2:IndexedGeneralRemarkListType"/> + <xsd:element minOccurs="0" name="inspectionReports" nillable="true" type="mom2:IndexedInspectionReportListType"/> + <xsd:element minOccurs="0" name="specificationRemarks" nillable="true" type="mom2:IndexedSpecificationRemarkListType"/> + <xsd:element minOccurs="0" name="schedulingRemarks" nillable="true" type="mom2:IndexedSchedulingRemarkListType"/> + <xsd:element minOccurs="0" name="usedDataProducts" nillable="true" type="IndexedLofarProjectInputListType"/> + <xsd:element minOccurs="0" name="children" type="IndexedLofarCollectionChildListType"/> + <xsd:element minOccurs="0" name="members" nillable="true" type="mom2:IndexedMemberListType"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="allocation"/> + </xsd:choice> + <xsd:element minOccurs="0" name="releaseDate" type="xsd:date"/> + </xsd:sequence> + <xsd:attribute name="mom2Id" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="LofarTemplateType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="description" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute name="version" type="xsd:string" use="required"/> + <xsd:attribute name="author" type="xsd:string" use="required"/> + <xsd:attribute name="changedBy" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:element name="allocation" substitutionGroup="mom2:allocation" type="LofarAllocationType"/> + <xsd:complexType name="LofarAllocationType"> + <xsd:complexContent> + <xsd:extension base="mom2:AllocationType"> + <xsd:sequence> + <xsd:element ref="resource" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="resource" type="LofarResourceType"/> + <xsd:complexType name="LofarResourceType"> + <xsd:complexContent> + <xsd:extension base="mom2:ResourceType"> + <xsd:attribute name="queue" type="xsd:string"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="LofarProjectRefType"> + <xsd:complexContent> + <xsd:restriction base="LofarProjectType"> + <xsd:attribute name="id" type="xsd:integer" use="required"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedLofarProjectInputListType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedDataProductListType"> + <xsd:sequence> + <xsd:element name="item" type="IndexedLofarProjectInputItemType"/> + </xsd:sequence> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedLofarProjectInputItemType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedDataProductItemType"> + <xsd:choice> + <xsd:element ref="proposalDocument"/> + </xsd:choice> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="proposalDocument" substitutionGroup="mom2:anyDataProduct" type="LofarProposalDocumentType"/> + <xsd:complexType name="LofarProposalDocumentType"> + <xsd:complexContent> + <xsd:restriction base="mom2:DataProductType"> + <xsd:sequence> + <xsd:element name="name" type="xsd:string"/><!-- + The current LofarProject will be the owner! <xsd:element name="ownerMom2Object" type="Mom2ObjectRefType" + minOccurs="0"> </xsd:element> + --> + <xsd:element minOccurs="0" name="uri" type="xsd:string"/> + <xsd:element minOccurs="0" fixed="PROPOSAL" name="type" type="xsd:string"/><!-- + timeStamp to be set equal to time of upload! <xsd:element name="timeStamp" type="xsd:dateTime" minOccurs="0"> + </xsd:element> + --> + <xsd:element minOccurs="0" default="false" name="released" type="xsd:boolean"/> + </xsd:sequence> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType><!-- Collection related declarations --> + <xsd:element name="folder" substitutionGroup="mom2:anyMom2Object" type="LofarCollectionType"/> + <xsd:complexType name="LofarCollectionType"> + <xsd:complexContent> + <xsd:extension base="mom2:CollectionType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="description" type="xsd:string"/> + <xsd:element minOccurs="0" name="parent" type="mom2:CollectionRefType"/> + <xsd:element minOccurs="0" name="ownerProject" type="mom2:ProjectRefType"/> + <xsd:element minOccurs="0" name="statusHistory" type="mom2:StatusHistoryType"/> + <xsd:element minOccurs="0" name="currentStatus" type="mom2:CurrentStatusType"/> + <xsd:element minOccurs="0" name="generalRemarks" nillable="true" type="mom2:IndexedGeneralRemarkListType"/> + <xsd:element minOccurs="0" name="inspectionReports" nillable="true" type="mom2:IndexedInspectionReportListType"/> + <xsd:element minOccurs="0" name="specificationRemarks" nillable="true" type="mom2:IndexedSpecificationRemarkListType"/> + <xsd:element minOccurs="0" name="schedulingRemarks" nillable="true" type="mom2:IndexedSchedulingRemarkListType"/> + <xsd:element minOccurs="0" name="children" nillable="true" type="IndexedLofarCollectionChildListType"/> + </xsd:sequence> + <xsd:attribute name="topology_parent" type="xsd:boolean"/> + <xsd:attribute name="update_folder" type="xsd:boolean"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedLofarCollectionChildListType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedMom2ObjectListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedLofarCollectionChildItemType"/> + </xsd:sequence> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedLofarCollectionChildItemType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedMom2ObjectItemType"> + <xsd:choice> + <xsd:element ref="folder"/> + <xsd:element ref="observation"/> + <xsd:element ref="pipeline"/> + </xsd:choice> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType><!-- Observation related declarations --> + <xsd:element name="observation" substitutionGroup="mom2:anyMom2Object" type="LofarObservationType"/> + <xsd:complexType name="LofarObservationType"> + <xsd:complexContent> + <xsd:restriction base="mom2:CollectionType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="description" type="xsd:string"/> + <xsd:element minOccurs="0" name="processingCluster" type="ProcessingClusterType"/> + <xsd:element minOccurs="0" name="parent" type="mom2:CollectionRefType"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="predecessor_topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="ownerProject" type="mom2:ProjectRefType"/> + <xsd:element minOccurs="0" name="statusHistory" type="mom2:StatusHistoryType"/> + <xsd:element minOccurs="0" name="currentStatus" type="mom2:CurrentStatusType"/> + <xsd:element minOccurs="0" name="generalRemarks" nillable="true" type="mom2:IndexedGeneralRemarkListType"/> + <xsd:element minOccurs="0" name="inspectionReports" nillable="true" type="mom2:IndexedInspectionReportListType"/> + <xsd:element minOccurs="0" name="specificationRemarks" nillable="true" type="mom2:IndexedSpecificationRemarkListType"/> + <xsd:element minOccurs="0" name="schedulingRemarks" nillable="true" type="mom2:IndexedSchedulingRemarkListType"/> + <xsd:element minOccurs="0" name="usedDataProducts" nillable="true" type="mom2:IndexedDataProductListType"/> + <xsd:element minOccurs="0" name="resultDataProducts" nillable="true" type="mom2:IndexedDataProductListType"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="observationAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="children" type="IndexedLofarObservationChildListType"/> + </xsd:sequence> + <xsd:attribute name="mom2Id" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:simpleType name="MemoryStorageUnit"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="byte"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="MemoryStorageType"> + <xsd:simpleContent> + <xsd:extension base="xsd:nonNegativeInteger"> + <xsd:attribute name="unit" type="MemoryStorageUnit" use="required"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:complexType name="ProcessingClusterType"> + <xsd:sequence> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="partition" type="xsd:string"/> + <xsd:element name="numberOfTasks" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="minRAMPerTask" type="MemoryStorageType"/> + <xsd:element minOccurs="0" name="minScratchPerTask" type="MemoryStorageType"/> + <xsd:element minOccurs="0" name="maxDurationPerTask" type="xsd:duration"/> + <xsd:element name="numberOfCoresPerTask" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="runSimultaneous" type="xsd:boolean"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="observationAttributes" substitutionGroup="mom2:specificAttributes" type="LofarObservationAttributesType"/> + <xsd:complexType name="LofarObservationAttributesType"> + <xsd:complexContent> + <xsd:extension base="mom2:SpecificAttributesType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="observationId" type="xsd:nonNegativeInteger" nillable="true"/> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="projectName" type="xsd:string"/> + <xsd:element minOccurs="0" name="instrument" type="LofarInstrumentType"/> + <xsd:element minOccurs="0" name="defaultTemplate" type="xsd:string"/> + <xsd:element minOccurs="0" name="tbbPiggybackAllowed" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="aartfaacPiggybackAllowed" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="userSpecification" type="LofarObservationSpecificationType"/> + <xsd:element minOccurs="0" name="systemSpecification" type="LofarObservationSpecificationType"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="LofarObservationSpecificationType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="correlatedData" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="filteredData" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="beamformedData" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="coherentStokesData" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="incoherentStokesData" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="antenna" type="LofarAntennaSetType"/> + <xsd:element minOccurs="0" name="clock" type="LofarClockType"/> + <xsd:element minOccurs="0" name="instrumentFilter" type="LofarBandFilterType"/> + <xsd:element minOccurs="0" name="integrationInterval" type="xsd:double"/> + <xsd:element minOccurs="0" name="channelsPerSubband" type="xsd:short"/> + <xsd:element minOccurs="0" name="coherentDedisperseChannels" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="tiedArrayBeams" type="LofarArrayBeamsType"/> + <xsd:element minOccurs="0" name="stokes" type="LofarStokesType"/> + <xsd:element minOccurs="0" name="stationSet" type="LofarStationSelectionType"/><!-- xsd:element minOccurs="0" name="stations" type="xsd:string"/ --> + <xsd:element minOccurs="0" name="stations" type="LofarStationsType"/> + <xsd:element minOccurs="0" name="timeFrame"> + <xsd:simpleType> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="UT"/> + <xsd:enumeration value="LST"/> + </xsd:restriction> + </xsd:simpleType> + </xsd:element> + <xsd:element minOccurs="0" name="startTime" type="xsd:dateTime"/> + <xsd:element minOccurs="0" name="endTime" type="xsd:dateTime"/> + <xsd:element minOccurs="0" name="duration" type="xsd:duration"/> + <xsd:element minOccurs="0" name="bypassPff" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="enableSuperterp" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="numberOfBitsPerSample" type="xsd:nonNegativeInteger"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="LofarArrayBeamsType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="flyseye" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="nrTabRings" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="tabRingSize" type="xsd:double" nillable="true"/> + <xsd:element minOccurs="0" name="tiedArrayBeamList" type="LofarArrayBeamListType"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="LofarArrayBeamListType"> + <xsd:sequence> + <xsd:element minOccurs="0" maxOccurs="unbounded" name="tiedArrayBeam"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="coherent" type="xsd:boolean"/> + <xsd:element name="angle1" type="xsd:double"/> + <xsd:element name="angle2" type="xsd:double"/> + </xsd:sequence> + <xsd:attribute name="index" type="xsd:integer"/> + </xsd:complexType> + </xsd:element> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="StokesSelectionType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="I"/> + <xsd:enumeration value="IQUV"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="LofarStokesType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="integrateChannels" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="subbandsPerFileCS" type="xsd:nonNegativeInteger" nillable="true"/> + <xsd:element minOccurs="0" name="numberCollapsedChannelsCS" type="xsd:nonNegativeInteger" nillable="true"/> + <xsd:element minOccurs="0" name="stokesDownsamplingStepsCS" type="xsd:nonNegativeInteger" nillable="true"/> + <xsd:element minOccurs="0" name="whichCS" type="StokesSelectionType" nillable="true"/> + <xsd:element minOccurs="0" name="subbandsPerFileIS" type="xsd:nonNegativeInteger" nillable="true"/> + <xsd:element minOccurs="0" name="numberCollapsedChannelsIS" type="xsd:nonNegativeInteger" nillable="true"/> + <xsd:element minOccurs="0" name="stokesDownsamplingStepsIS" type="xsd:nonNegativeInteger" nillable="true"/> + <xsd:element minOccurs="0" name="whichIS" type="StokesSelectionType" nillable="true"/><!-- xsd:element minOccurs="0" name="integrationSteps" type="xsd:nonNegativeInteger" nillable="true"/ --> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="LofarStationSelectionType"> + <xsd:simpleContent> + <xsd:restriction base="AbstractLofarStationSelectionType"> + <xsd:enumeration value="Single"/> + <xsd:enumeration value="Core"/> + <xsd:enumeration value="Dutch"/> + <xsd:enumeration value="All"/> + <xsd:enumeration value="Custom"/> + </xsd:restriction> + </xsd:simpleContent> + </xsd:complexType> + <xsd:complexType name="AbstractLofarStationSelectionType" abstract="true"> + <xsd:simpleContent> + <xsd:extension base="xsd:string"> + <xsd:attribute name="min" type="xsd:nonNegativeInteger"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:complexType name="LofarStationsType"> + <xsd:sequence> + <xsd:element minOccurs="0" maxOccurs="unbounded" name="station" type="LofarStationType"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="LofarStationType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="location" type="LofarCoordinatesType"/> + <xsd:element minOccurs="0" maxOccurs="2" name="antennaField" type="LofarAntennaFieldType"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:simpleType name="LofarAntennaField"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="HBA0"/> + <xsd:enumeration value="HBA1"/> + <xsd:enumeration value="HBA0+1"/> + <xsd:enumeration value="HBA"/> + <xsd:enumeration value="LBA"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="LofarAntennaFieldType"> + <xsd:sequence> + <xsd:element name="name" type="LofarAntennaField"/> + <xsd:element name="location" type="LofarCoordinatesType"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="LofarCoordinatesType"> + <xsd:sequence> + <xsd:element name="coordinateSystem"> + <xsd:simpleType> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="WGS84"/> + <xsd:enumeration value="ITRF2000"/> + </xsd:restriction> + </xsd:simpleType> + </xsd:element> + <xsd:element name="x" type="xsd:double"/> + <xsd:element name="y" type="xsd:double"/> + <xsd:element name="z" type="xsd:double"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="LofarAntennaSetType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="HBA Zero"/> + <xsd:enumeration value="HBA One"/> + <xsd:enumeration value="HBA Dual"/> + <xsd:enumeration value="HBA Joined"/> + <xsd:enumeration value="LBA Outer"/> + <xsd:enumeration value="LBA Inner"/> + <xsd:enumeration value="LBA Sparse Even"/> + <xsd:enumeration value="LBA Sparse Odd"/> + <xsd:enumeration value="LBA X"/> + <xsd:enumeration value="LBA Y"/> + <xsd:enumeration value="HBA Zero Inner"/> + <xsd:enumeration value="HBA One Inner"/> + <xsd:enumeration value="HBA Dual Inner"/> + <xsd:enumeration value="HBA Joined Inner"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="LofarInstrumentType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="Beam Observation"/> + <xsd:enumeration value="Interferometer"/> + <xsd:enumeration value="Tied Array"/> + <xsd:enumeration value="Transient Buffer Board"/> + <xsd:enumeration value="Direct Data Storage"/> + <xsd:enumeration value="Non Standard"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="LofarBandFilterType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="10-70 MHz"/> + <xsd:enumeration value="30-70 MHz"/> + <xsd:enumeration value="10-90 MHz"/> + <xsd:enumeration value="30-90 MHz"/> + <xsd:enumeration value="110-190 MHz"/> + <xsd:enumeration value="170-230 MHz"/> + <xsd:enumeration value="210-250 MHz"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="LofarClockType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="channelWidth" type="mom2:Frequency"/> + <xsd:element minOccurs="0" name="samplesPerSecond" type="xsd:double"/> + <xsd:element minOccurs="0" name="subbandWidth" type="mom2:Frequency"/> + <xsd:element minOccurs="0" name="systemClock" type="mom2:Frequency"/> + </xsd:sequence> + <xsd:attribute name="mode" use="required"> + <xsd:simpleType> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="160 MHz"/> + <xsd:enumeration value="200 MHz"/> + </xsd:restriction> + </xsd:simpleType> + </xsd:attribute> + </xsd:complexType> + <xsd:complexType name="IndexedLofarObservationChildListType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedMom2ObjectListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedLofarObservationChildItemType"/> + </xsd:sequence> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedLofarObservationChildItemType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedMom2ObjectItemType"> + <xsd:choice> + <xsd:element ref="measurement"/> + <xsd:element ref="pipeline"/><!-- WTF --> + </xsd:choice> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType><!-- Measurement related declarations --> + <xsd:element name="measurement" substitutionGroup="mom2:anyMom2Object" type="LofarMeasurementType"/> + <xsd:complexType name="LofarMeasurementType" abstract="true"> + <xsd:complexContent> + <xsd:extension base="mom2:Mom2ObjectType"/> + </xsd:complexContent> + </xsd:complexType><!-- Beam Measurement related declarations --><!-- xsd:complexType name="BeamMeasurementType"> + <xsd:complexContent> + <xsd:restriction base="LofarMeasurementType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="description" type="xsd:string"/> + <xsd:element minOccurs="0" name="parent" type="mom2:CollectionRefType"/> + <xsd:element minOccurs="0" name="ownerProject" type="mom2:ProjectRefType"/> + <xsd:element minOccurs="0" name="statusHistory" type="mom2:StatusHistoryType"/> + <xsd:element minOccurs="0" name="currentStatus" type="mom2:CurrentStatusType"/> + <xsd:element minOccurs="0" name="generalRemarks" nillable="true" type="mom2:IndexedGeneralRemarkListType"/> + <xsd:element minOccurs="0" name="inspectionReports" nillable="true" type="mom2:IndexedInspectionReportListType"/> + <xsd:element minOccurs="0" name="specificationRemarks" nillable="true" type="mom2:IndexedSpecificationRemarkListType"/> + <xsd:element minOccurs="0" name="schedulingRemarks" nillable="true" type="mom2:IndexedSchedulingRemarkListType"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="beamMeasurementAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="resultDataProducts" nillable="true" type="IndexedLofarBeamResultDataProductListType"/> + </xsd:sequence> + <xsd:attribute name="mom2Id" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType --> + <xsd:element name="beamMeasurementAttributes" substitutionGroup="mom2:specificAttributes" type="LofarBeamMeasurementAttributesType"/> + <xsd:complexType name="LofarBeamMeasurementAttributesType"> + <xsd:complexContent> + <xsd:extension base="mom2:SpecificAttributesType"><!--WTF !!!!1One!! --> + <xsd:sequence> + <xsd:element minOccurs="0" name="ra" type="xsd:double"/> + <xsd:element minOccurs="0" name="dec" type="xsd:double"/> + <xsd:element minOccurs="0" name="equinox" type="EquinoxType"/> + <xsd:element minOccurs="0" name="duration" type="xsd:duration"/> + <xsd:element minOccurs="0" name="startTime" type="xsd:dateTime"/> + <xsd:element minOccurs="0" name="endTime" type="xsd:dateTime"/> + <xsd:element minOccurs="0" name="centralFrequency" type="mom2:Frequency"/> + <xsd:element minOccurs="0" name="bandWidth" type="mom2:Frequency"/> + <xsd:element minOccurs="0" name="subbandsSpecification" type="LofarSubbandsSpecificationType"/> + <xsd:element minOccurs="0" name="measurementType"> + <xsd:simpleType> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="Target"/> + <xsd:enumeration value="Calibration"/> + <xsd:enumeration value="Tune Up"/> + <xsd:enumeration value="Miscellaneous"/> + </xsd:restriction> + </xsd:simpleType> + </xsd:element> + <xsd:element minOccurs="0" name="specification" type="LofarBeamMeasurementSpecificationAttributesType"/><!--WTF !!!!1One!! --> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="LofarBeamMeasurementSpecificationAttributesType"> + <xsd:sequence> + <xsd:element name="targetName" type="xsd:string"/> + <xsd:element name="ra" type="xsd:double"/> + <xsd:element name="dec" type="xsd:double"/> + <xsd:element name="equinox" type="EquinoxType"/> + <xsd:element name="duration" type="xsd:duration"/> + <xsd:element name="subbandsSpecification" type="LofarSubbandsSpecificationType"/> + <xsd:element minOccurs="0" name="tiedArrayBeams" type="LofarArrayBeamsType"/><!--Need to remove for UVMeasurement --> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="LofarSubbandsSpecificationType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="bandWidth" type="mom2:Frequency"/> + <xsd:element minOccurs="0" name="centralFrequency" type="mom2:Frequency"/> + <xsd:element minOccurs="0" name="contiguous" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="subbands" type="SubbandArrayType"/> + </xsd:sequence> + </xsd:complexType><!-- xsd:complexType name="LofarCustomSubbandsSpecificationType"/ --> + <xsd:simpleType name="SubbandArrayType"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="\d{1,3}(,\d{1,3})*|\d{1,3}\.\.\d{1,3}"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="EquinoxType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="J2000"/> + <xsd:enumeration value="B1950"/> + <xsd:enumeration value="Other"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="IndexedLofarBeamResultDataProductListType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedDataProductListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedLofarBeamResultDataProductType"/> + </xsd:sequence> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedLofarBeamResultDataProductType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedDataProductItemType"> + <xsd:choice> + <xsd:element ref="uvDataProduct"/> + <xsd:element ref="bfDataProduct"/> + </xsd:choice> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType><!-- UV Measurement related declarations --> + <xsd:complexType name="UVMeasurementType"> + <xsd:complexContent> + <xsd:restriction base="LofarMeasurementType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="description" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="parent" type="mom2:CollectionRefType"/> + <xsd:element minOccurs="0" name="ownerProject" type="mom2:ProjectRefType"/> + <xsd:element minOccurs="0" name="statusHistory" type="mom2:StatusHistoryType"/> + <xsd:element minOccurs="0" name="currentStatus" type="mom2:CurrentStatusType"/> + <xsd:element minOccurs="0" name="generalRemarks" nillable="true" type="mom2:IndexedGeneralRemarkListType"/> + <xsd:element minOccurs="0" name="inspectionReports" nillable="true" type="mom2:IndexedInspectionReportListType"/> + <xsd:element minOccurs="0" name="specificationRemarks" nillable="true" type="mom2:IndexedSpecificationRemarkListType"/> + <xsd:element minOccurs="0" name="schedulingRemarks" nillable="true" type="mom2:IndexedSchedulingRemarkListType"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="uvMeasurementAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="resultDataProducts" nillable="true" type="IndexedLofarUVResultDataProductListType"/> + </xsd:sequence> + <xsd:attribute name="mom2Id" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="uvMeasurementAttributes" substitutionGroup="mom2:specificAttributes" type="LofarBeamMeasurementAttributesType"/> + <xsd:complexType name="LofarUVMeasurementAttributesType"> + <xsd:complexContent> + <xsd:extension base="LofarBeamMeasurementAttributesType"/> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedLofarUVResultDataProductListType"> + <xsd:complexContent> + <xsd:restriction base="IndexedLofarBeamResultDataProductListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedLofarUVResultDataProductType"/> + </xsd:sequence> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedLofarUVResultDataProductType"> + <xsd:complexContent> + <xsd:restriction base="IndexedLofarBeamResultDataProductType"> + <xsd:choice> + <xsd:element ref="uvDataProduct"/> + </xsd:choice> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType><!-- BeamFormed Measurement related declarations --> + <xsd:complexType name="BFMeasurementType"> + <xsd:complexContent> + <xsd:restriction base="LofarMeasurementType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="description" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="parent" type="mom2:CollectionRefType"/> + <xsd:element minOccurs="0" name="ownerProject" type="mom2:ProjectRefType"/> + <xsd:element minOccurs="0" name="statusHistory" type="mom2:StatusHistoryType"/> + <xsd:element minOccurs="0" name="currentStatus" type="mom2:CurrentStatusType"/> + <xsd:element minOccurs="0" name="generalRemarks" nillable="true" type="mom2:IndexedGeneralRemarkListType"/> + <xsd:element minOccurs="0" name="inspectionReports" nillable="true" type="mom2:IndexedInspectionReportListType"/> + <xsd:element minOccurs="0" name="specificationRemarks" nillable="true" type="mom2:IndexedSpecificationRemarkListType"/> + <xsd:element minOccurs="0" name="schedulingRemarks" nillable="true" type="mom2:IndexedSchedulingRemarkListType"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="bfMeasurementAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="resultDataProducts" nillable="true" type="IndexedLofarBFResultDataProductListType"/> + </xsd:sequence> + <xsd:attribute name="mom2Id" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="bfMeasurementAttributes" substitutionGroup="mom2:specificAttributes" type="LofarBFMeasurementAttributesType"/> + <xsd:complexType name="LofarBFMeasurementAttributesType"> + <xsd:complexContent> + <xsd:extension base="LofarBeamMeasurementAttributesType"/> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedLofarBFResultDataProductListType"> + <xsd:complexContent> + <xsd:restriction base="IndexedLofarBeamResultDataProductListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedLofarBFResultDataProductType"/> + </xsd:sequence> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedLofarBFResultDataProductType"> + <xsd:complexContent> + <xsd:restriction base="IndexedLofarBeamResultDataProductType"> + <xsd:choice> + <xsd:element ref="uvDataProduct"/> + <xsd:element ref="bfDataProduct"/> + </xsd:choice> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType><!-- TBB Measurement (Event?) related declarations --> + <xsd:complexType name="TBBMeasurementType"> + <xsd:complexContent> + <xsd:restriction base="LofarMeasurementType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="description" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="parent" type="mom2:CollectionRefType"/> + <xsd:element minOccurs="0" name="ownerProject" type="mom2:ProjectRefType"/> + <xsd:element minOccurs="0" name="statusHistory" type="mom2:StatusHistoryType"/> + <xsd:element minOccurs="0" name="currentStatus" type="mom2:CurrentStatusType"/> + <xsd:element minOccurs="0" name="generalRemarks" nillable="true" type="mom2:IndexedGeneralRemarkListType"/> + <xsd:element minOccurs="0" name="inspectionReports" nillable="true" type="mom2:IndexedInspectionReportListType"/> + <xsd:element minOccurs="0" name="specificationRemarks" nillable="true" type="mom2:IndexedSpecificationRemarkListType"/> + <xsd:element minOccurs="0" name="schedulingRemarks" nillable="true" type="mom2:IndexedSchedulingRemarkListType"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="tbbMeasurementAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="resultDataProducts" nillable="true" type="IndexedLofarTBBResultDataProductListType"/> + </xsd:sequence> + <xsd:attribute name="mom2Id" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="tbbMeasurementAttributes" substitutionGroup="mom2:specificAttributes" type="LofarTBBMeasurementAttributesType"/> + <xsd:complexType name="LofarTBBMeasurementAttributesType"> + <xsd:complexContent> + <xsd:extension base="mom2:SpecificAttributesType"> + <xsd:sequence/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedLofarTBBResultDataProductListType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedDataProductListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedLofarTBBResultDataProductType"/> + </xsd:sequence> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedLofarTBBResultDataProductType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedDataProductItemType"> + <xsd:choice> + <xsd:element ref="tbbDataProduct"/> + </xsd:choice> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType><!-- Generic Measurement related declarations --> + <xsd:complexType name="GenericMeasurementType"> + <xsd:complexContent> + <xsd:restriction base="LofarMeasurementType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="description" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="parent" type="mom2:CollectionRefType"/> + <xsd:element minOccurs="0" name="ownerProject" type="mom2:ProjectRefType"/> + <xsd:element minOccurs="0" name="statusHistory" type="mom2:StatusHistoryType"/> + <xsd:element minOccurs="0" name="currentStatus" type="mom2:CurrentStatusType"/> + <xsd:element minOccurs="0" name="generalRemarks" nillable="true" type="mom2:IndexedGeneralRemarkListType"/> + <xsd:element minOccurs="0" name="inspectionReports" nillable="true" type="mom2:IndexedInspectionReportListType"/> + <xsd:element minOccurs="0" name="specificationRemarks" nillable="true" type="mom2:IndexedSpecificationRemarkListType"/> + <xsd:element minOccurs="0" name="schedulingRemarks" nillable="true" type="mom2:IndexedSchedulingRemarkListType"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="genericMeasurementAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="resultDataProducts" nillable="true" type="IndexedLofarGenericResultDataProductListType"/> + </xsd:sequence> + <xsd:attribute name="mom2Id" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="genericMeasurementAttributes" substitutionGroup="mom2:specificAttributes" type="LofarTBBMeasurementAttributesType"/> + <xsd:complexType name="LofarGenericMeasurementAttributesType"> + <xsd:complexContent> + <xsd:extension base="mom2:SpecificAttributesType"> + <xsd:sequence/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedLofarGenericResultDataProductListType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedDataProductListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedLofarGenericResultDataProductType"/> + </xsd:sequence> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedLofarGenericResultDataProductType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedDataProductItemType"> + <xsd:choice> + <xsd:element ref="genericDataProduct"/> + </xsd:choice> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType><!-- General Pipeline related declarations --> + <xsd:element name="pipeline" substitutionGroup="mom2:anyMom2Object" type="LofarPipelineType"/> + <xsd:complexType name="LofarPipelineType" abstract="true"> + <xsd:complexContent> + <xsd:extension base="mom2:CollectionType"/> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="LofarPipelineAttributesType"> + <xsd:complexContent> + <xsd:extension base="mom2:SpecificAttributesType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="pipelineId" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="userSpecification" type="LofarPipelineSpecificationType"/> + <xsd:element minOccurs="0" name="systemSpecification" type="LofarPipelineSpecificationType"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="LofarPipelineSpecificationType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="startTime" type="xsd:dateTime"/> + <xsd:element minOccurs="0" name="endTime" type="xsd:dateTime"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="IndexedLofarPipelineChildListType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedMom2ObjectListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedLofarPipelineChildItemType"/> + </xsd:sequence> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedLofarPipelineChildItemType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedMom2ObjectItemType"> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType><!-- Averaging Pipeline related declarations --> + <xsd:complexType name="AveragingPipelineType"> + <xsd:complexContent> + <xsd:restriction base="LofarPipelineType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="predecessor_topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="description" type="xsd:string"/> + <xsd:element minOccurs="0" name="processingCluster" type="ProcessingClusterType"/> + <xsd:element minOccurs="0" name="parent" type="mom2:CollectionRefType"/> + <xsd:element minOccurs="0" name="ownerProject" type="mom2:ProjectRefType"/> + <xsd:element minOccurs="0" name="statusHistory" type="mom2:StatusHistoryType"/> + <xsd:element minOccurs="0" name="currentStatus" type="mom2:CurrentStatusType"/> + <xsd:element minOccurs="0" name="generalRemarks" nillable="true" type="mom2:IndexedGeneralRemarkListType"/> + <xsd:element minOccurs="0" name="inspectionReports" nillable="true" type="mom2:IndexedInspectionReportListType"/> + <xsd:element minOccurs="0" name="specificationRemarks" nillable="true" type="mom2:IndexedSpecificationRemarkListType"/> + <xsd:element minOccurs="0" name="schedulingRemarks" nillable="true" type="mom2:IndexedSchedulingRemarkListType"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="averagingPipelineAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="usedDataProducts" nillable="true" type="mom2:IndexedDataProductListType"/> + <xsd:element minOccurs="0" name="resultDataProducts" nillable="true" type="mom2:IndexedDataProductListType"/><!-- xsd:element minOccurs="0" name="children" type="IndexedLofarPipelineChildListType"/ --><!--WTF--> + </xsd:sequence> + <xsd:attribute name="mom2Id" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="DemixingParametersType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="averagingFreqStep" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="averagingTimeStep" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="demixFreqStep" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="demixTimeStep" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="demixAlways" type="xsd:string"/> + <xsd:element minOccurs="0" name="demixIfNeeded" type="xsd:string"/> + <xsd:element minOccurs="0" name="ignoreTarget" type="xsd:boolean" nillable="true"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="BbsParametersType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="averagingFreqStep" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="averagingTimeStep" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="demixFreqStep" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="demixTimeStep" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="demixAlways" type="xsd:string"/> + <xsd:element minOccurs="0" name="demixIfNeeded" type="xsd:string"/> + <xsd:element minOccurs="0" name="ignoreTarget" type="xsd:boolean"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="averagingPipelineAttributes" substitutionGroup="mom2:specificAttributes" type="AveragingPipelineAttributesType"/> + <xsd:complexType name="AveragingPipelineAttributesType"> + <xsd:complexContent> + <xsd:extension base="LofarPipelineAttributesType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="defaultTemplate" type="xsd:string"/> + <xsd:element minOccurs="0" name="duration" type="xsd:duration"/> + <xsd:element minOccurs="0" name="startTime" type="xsd:dateTime"/> + <xsd:element minOccurs="0" name="endTime" type="xsd:dateTime" nillable="true"/> + <xsd:element minOccurs="0" name="demixingParameters" type="DemixingParametersType"/> + <xsd:element minOccurs="0" name="bbsParameters" type="BbsParametersType"/> + <xsd:element minOccurs="0" name="flaggingStrategy" type="xsd:string"/><!-- xsd:element minOccurs="0" name="frequencyIntegrationStep" type="xsd:nonNegativeInteger"/ --><!-- xsd:element minOccurs="0" name="timeIntegrationStep" type="xsd:nonNegativeInteger"/ --> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType><!-- Imaging Pipeline related declarations --> + <xsd:complexType name="ImagingPipelineType"> + <xsd:complexContent> + <xsd:restriction base="LofarPipelineType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="predecessor_topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="description" type="xsd:string"/> + <xsd:element minOccurs="0" name="processingCluster" type="ProcessingClusterType"/> + <xsd:element minOccurs="0" name="parent" type="mom2:CollectionRefType"/> + <xsd:element minOccurs="0" name="ownerProject" type="mom2:ProjectRefType"/> + <xsd:element minOccurs="0" name="statusHistory" type="mom2:StatusHistoryType"/> + <xsd:element minOccurs="0" name="currentStatus" type="mom2:CurrentStatusType"/> + <xsd:element minOccurs="0" name="generalRemarks" nillable="true" type="mom2:IndexedGeneralRemarkListType"/> + <xsd:element minOccurs="0" name="inspectionReports" nillable="true" type="mom2:IndexedInspectionReportListType"/> + <xsd:element minOccurs="0" name="specificationRemarks" nillable="true" type="mom2:IndexedSpecificationRemarkListType"/> + <xsd:element minOccurs="0" name="schedulingRemarks" nillable="true" type="mom2:IndexedSchedulingRemarkListType"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="imagingPipelineAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="usedDataProducts" nillable="true" type="IndexedImagingPipelineUsedDataProductListType"/> + <xsd:element minOccurs="0" name="resultDataProducts" nillable="true" type="IndexedImagingPipelineResultDataProductListType"/><!-- xsd:element minOccurs="0" name="children" type="IndexedLofarPipelineChildListType"/ --><!--WTF--> + </xsd:sequence> + <xsd:attribute name="mom2Id" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="imagingPipelineAttributes" substitutionGroup="mom2:specificAttributes" type="ImagingPipelineAttributesType"/> + <xsd:complexType name="ImagingPipelineAttributesType"> + <xsd:complexContent> + <xsd:extension base="AveragingPipelineAttributesType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="imagerIntegrationTime" type="xsd:double"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedImagingPipelineUsedDataProductListType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedDataProductListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedImagingPipelineUsedDataProductType"/> + </xsd:sequence> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedImagingPipelineUsedDataProductType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedDataProductItemType"> + <xsd:choice> + <xsd:element ref="uvDataProduct"/> + </xsd:choice> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedImagingPipelineResultDataProductListType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedDataProductListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedImagingPipelineResultDataProductType"/> + </xsd:sequence> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedImagingPipelineResultDataProductType"> + <xsd:complexContent> + <xsd:restriction base="mom2:IndexedDataProductItemType"> + <xsd:choice> + <xsd:element ref="uvDataProduct"/> + <xsd:element ref="skyImageDataProduct"/> + </xsd:choice> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType><!-- Pulsar Pipeline related declarations --> + <xsd:complexType name="PulsarPipelineType"> + <xsd:complexContent> + <xsd:restriction base="LofarPipelineType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="predecessor_topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="description" type="xsd:string"/> + <xsd:element minOccurs="0" name="processingCluster" type="ProcessingClusterType"/> + <xsd:element minOccurs="0" name="parent" type="mom2:CollectionRefType"/> + <xsd:element minOccurs="0" name="ownerProject" type="mom2:ProjectRefType"/> + <xsd:element minOccurs="0" name="statusHistory" type="mom2:StatusHistoryType"/> + <xsd:element minOccurs="0" name="currentStatus" type="mom2:CurrentStatusType"/> + <xsd:element minOccurs="0" name="generalRemarks" nillable="true" type="mom2:IndexedGeneralRemarkListType"/> + <xsd:element minOccurs="0" name="inspectionReports" nillable="true" type="mom2:IndexedInspectionReportListType"/> + <xsd:element minOccurs="0" name="specificationRemarks" nillable="true" type="mom2:IndexedSpecificationRemarkListType"/> + <xsd:element minOccurs="0" name="schedulingRemarks" nillable="true" type="mom2:IndexedSchedulingRemarkListType"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="pulsarPipelineAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="usedDataProducts" nillable="true" type="mom2:IndexedDataProductListType"/> + <xsd:element minOccurs="0" name="resultDataProducts" nillable="true" type="mom2:IndexedDataProductListType"/> + <xsd:element minOccurs="0" name="children" type="IndexedLofarPipelineChildListType"/> + </xsd:sequence> + <xsd:attribute name="mom2Id" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="pulsarPipelineAttributes" substitutionGroup="mom2:specificAttributes" type="PulsarPipelineAttributesType"/> + <xsd:complexType name="PulsarPipelineAttributesType"> + <xsd:complexContent> + <xsd:extension base="LofarPipelineAttributesType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="defaultTemplate" type="xsd:string"/> + <xsd:element minOccurs="0" name="duration" type="xsd:string"/> + <xsd:element minOccurs="0" name="_2bf2fitsExtraOpts" type="xsd:string"/> + <xsd:element minOccurs="0" name="_8bitConversionSigma" type="xsd:string"/> + <xsd:element minOccurs="0" name="decodeNblocks" type="xsd:string"/> + <xsd:element minOccurs="0" name="decodeSigma" type="xsd:string"/> + <xsd:element minOccurs="0" name="digifilExtraOpts" type="xsd:string"/> + <xsd:element minOccurs="0" name="dspsrExtraOpts" type="xsd:string"/> + <xsd:element minOccurs="0" name="dynamicSpectrumTimeAverage" type="xsd:string"/> + <xsd:element minOccurs="0" name="nofold" type="xsd:string"/> + <xsd:element minOccurs="0" name="nopdmp" type="xsd:string"/> + <xsd:element minOccurs="0" name="norfi" type="xsd:string"/> + <xsd:element minOccurs="0" name="prepdataExtraOpts" type="xsd:string"/> + <xsd:element minOccurs="0" name="prepfoldExtraOpts" type="xsd:string"/> + <xsd:element minOccurs="0" name="prepsubbandExtraOpts" type="xsd:string"/> + <xsd:element minOccurs="0" name="pulsar" type="xsd:string"/> + <xsd:element minOccurs="0" name="rawTo8bit" type="xsd:string"/> + <xsd:element minOccurs="0" name="rfifindExtraOpts" type="xsd:string"/> + <xsd:element minOccurs="0" name="rrats" type="xsd:string"/> + <xsd:element minOccurs="0" name="singlePulse" type="xsd:string"/> + <xsd:element minOccurs="0" name="skipDsps" type="xsd:string"/> + <xsd:element minOccurs="0" name="skipDynamicSpectrum" type="xsd:string"/> + <xsd:element minOccurs="0" name="skipPrepfold" type="xsd:string"/> + <xsd:element minOccurs="0" name="tsubint" type="xsd:string"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType><!-- DataProduct related declarations --> + <xsd:complexType name="LofarDataProductType" abstract="true"> + <xsd:complexContent> + <xsd:extension base="mom2:DataProductType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="storageTicket" type="xsd:string"/> + <xsd:element minOccurs="0" name="fileSize" type="xsd:unsignedLong"/> + <xsd:element minOccurs="0" name="checksums" type="ChecksumTypes"/> + </xsd:sequence> + <xsd:attribute name="mom2DPId" type="xsd:nonNegativeInteger"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:simpleType name="ChecksumAlgorithm"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="MD5"/> + <xsd:enumeration value="Adler32"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="ChecksumTypes"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="checksum" type="ChecksumType"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="ChecksumType"> + <xsd:sequence> + <xsd:element name="algorithm" type="ChecksumAlgorithm"/> + <xsd:element name="value" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType><!-- UV DataProduct related declarations --> + <xsd:element name="uvDataProduct" substitutionGroup="mom2:anyDataProduct" type="UVDataProductType"/> + <xsd:complexType name="UVDataProductType"> + <xsd:complexContent> + <xsd:extension base="LofarDataProductType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="status" type="xsd:string"/> + <xsd:element minOccurs="0" name="storageCluster" type="StorageClusterType"/> + <xsd:element minOccurs="0" name="ownerMom2Object" type="mom2:Mom2ObjectRefType"/> + <xsd:choice> + <xsd:element minOccurs="0" name="uri" type="xsd:string"/> + <xsd:element minOccurs="0" name="locations" type="mom2:DataProductLocationsType"/> + </xsd:choice> + <xsd:element minOccurs="0" name="fileFormat" type="xsd:string"/> + <xsd:element minOccurs="0" name="type" type="xsd:string"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + <xsd:element minOccurs="0" default="false" name="released" type="xsd:boolean"/> + <xsd:element minOccurs="0" default="false" name="exported" type="xsd:boolean"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="specificUVDataProductAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="storageTicket" type="xsd:string"/> + <xsd:element minOccurs="0" name="fileSize" type="xsd:unsignedLong"/> + <xsd:element minOccurs="0" name="checksums" type="ChecksumTypes"/> + </xsd:sequence> + <!-- xsd:attribute name="id" type="xsd:integer" default="0"/ --> + <!-- xsd:attribute name="mom2DPId" type="xsd:nonNegativeInteger"/ --> + <xsd:attribute name="topology" type="xsd:string"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="StorageClusterType"> + <xsd:sequence> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="partition" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="specificUVDataProductAttributes" substitutionGroup="mom2:specificAttributes" type="SpecificUVDataProductAttributesType"/> + <xsd:complexType name="SpecificUVDataProductAttributesType"> + <xsd:complexContent> + <xsd:extension base="mom2:SpecificAttributesType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="subband" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="stationSubband" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="centralFrequency" type="mom2:Frequency"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType><!-- Beamformed DataProduct related declarations --> + <xsd:element name="bfDataProduct" substitutionGroup="mom2:anyDataProduct" type="BFDataProductType"/> + <xsd:complexType name="BFDataProductType"> + <xsd:complexContent> + <xsd:extension base="LofarDataProductType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="status" type="xsd:string"/> + <xsd:element minOccurs="0" name="storageCluster" type="StorageClusterType"/> + <xsd:element minOccurs="0" name="ownerMom2Object" type="mom2:Mom2ObjectRefType"/> + <xsd:choice> + <xsd:element minOccurs="0" name="uri" type="xsd:string"/> + <xsd:element minOccurs="0" name="locations" type="mom2:DataProductLocationsType"/> + </xsd:choice> + <xsd:element minOccurs="0" name="fileFormat" type="xsd:string"/> + <xsd:element minOccurs="0" name="type" type="xsd:string"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + <xsd:element minOccurs="0" default="false" name="released" type="xsd:boolean"/> + <xsd:element minOccurs="0" default="false" name="exported" type="xsd:boolean"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="specificBFDataProductAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="storageTicket" type="xsd:string"/> + <xsd:element minOccurs="0" name="fileSize" type="xsd:unsignedLong"/> + <xsd:element minOccurs="0" name="checksums" type="ChecksumTypes"/> + </xsd:sequence> + <!-- xsd:attribute name="id" type="xsd:integer" default="0"/ --> + <!-- xsd:attribute name="mom2DPId" type="xsd:nonNegativeInteger"/ --> + <xsd:attribute name="topology" type="xsd:string"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="specificBFDataProductAttributes" substitutionGroup="mom2:specificAttributes" type="SpecificBFDataProductAttributesType"/> + <xsd:complexType name="SpecificBFDataProductAttributesType"> + <xsd:complexContent> + <xsd:extension base="mom2:SpecificAttributesType"> + <xsd:sequence/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType><!-- TBB DataProduct related declarations --> + <xsd:element name="tbbDataProduct" substitutionGroup="mom2:anyDataProduct" type="TBBDataProductType"/> + <xsd:complexType name="TBBDataProductType"> + <xsd:complexContent> + <xsd:restriction base="LofarDataProductType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="status" type="xsd:string"/> + <xsd:element minOccurs="0" name="storageCluster" type="StorageClusterType"/> + <xsd:element minOccurs="0" name="ownerMom2Object" type="mom2:Mom2ObjectRefType"/> + <xsd:choice> + <xsd:element minOccurs="0" name="uri" type="xsd:string"/> + <xsd:element minOccurs="0" name="locations" type="mom2:DataProductLocationsType"/> + </xsd:choice> + <xsd:element minOccurs="0" name="fileFormat" type="xsd:string"/> + <xsd:element minOccurs="0" name="type" type="xsd:string"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + <xsd:element minOccurs="0" default="false" name="released" type="xsd:boolean"/> + <xsd:element minOccurs="0" default="false" name="exported" type="xsd:boolean"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="specificTBBDataProductAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="storageTicket" type="xsd:string"/> + <xsd:element minOccurs="0" name="fileSize" type="xsd:unsignedLong"/> + <xsd:element minOccurs="0" name="checksums" type="ChecksumTypes"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:integer" default="0"/> + <xsd:attribute name="mom2DPId" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="specificTBBDataProductAttributes" substitutionGroup="mom2:specificAttributes" type="SpecificTBBDataProductAttributesType"/> + <xsd:complexType name="SpecificTBBDataProductAttributesType"> + <xsd:complexContent> + <xsd:extension base="mom2:SpecificAttributesType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="numberOfSamples" type="xsd:positiveInteger"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType><!-- PixelMap DataProduct related declarations --> + <xsd:complexType name="PixelMapDataProductType" abstract="true"> + <xsd:complexContent> + <xsd:restriction base="LofarDataProductType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="status" type="xsd:string"/> + <xsd:element minOccurs="0" name="storageCluster" type="StorageClusterType"/> + <xsd:element minOccurs="0" name="ownerMom2Object" type="mom2:Mom2ObjectRefType"/> + <xsd:choice> + <xsd:element minOccurs="0" name="uri" type="xsd:string"/> + <xsd:element minOccurs="0" name="locations" type="mom2:DataProductLocationsType"/> + </xsd:choice> + <xsd:element minOccurs="0" name="fileFormat" type="xsd:string"/> + <xsd:element minOccurs="0" name="type" type="xsd:string"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + <xsd:element minOccurs="0" default="false" name="released" type="xsd:boolean"/> + <xsd:element minOccurs="0" default="false" name="exported" type="xsd:boolean"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="specificPixelMapDataProductAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="storageTicket" type="xsd:string"/> + <xsd:element minOccurs="0" name="fileSize" type="xsd:unsignedLong"/> + <xsd:element minOccurs="0" name="checksums" type="ChecksumTypes"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:integer" default="0"/> + <xsd:attribute name="mom2DPId" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="specificPixelMapDataProductAttributes" substitutionGroup="mom2:specificAttributes" type="SpecificPixelMapDataProductAttributesType"/> + <xsd:complexType name="SpecificPixelMapDataProductAttributesType"> + <xsd:complexContent> + <xsd:extension base="mom2:SpecificAttributesType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="numberOfAxes" type="xsd:positiveInteger"/> + <xsd:element minOccurs="0" maxOccurs="unbounded" name="axis" type="AxisType"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="AxisType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="number" type="xsd:nonNegativeInteger"/> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="unit" type="xsd:string"/> + <xsd:element minOccurs="0" name="length" type="xsd:nonNegativeInteger"/> + </xsd:sequence> + </xsd:complexType><!-- Sky Image DataProduct related declarations --> + <xsd:element name="skyImageDataProduct" substitutionGroup="mom2:anyDataProduct" type="SkyImageDataProductType"/> + <xsd:complexType name="SkyImageDataProductType"> + <xsd:complexContent> + <xsd:restriction base="LofarDataProductType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="status" type="xsd:string"/> + <xsd:element minOccurs="0" name="storageCluster" type="StorageClusterType"/> + <xsd:element minOccurs="0" name="ownerMom2Object" type="mom2:Mom2ObjectRefType"/> + <xsd:choice> + <xsd:element minOccurs="0" name="uri" type="xsd:string"/> + <xsd:element minOccurs="0" name="locations" type="mom2:DataProductLocationsType"/> + </xsd:choice> + <xsd:element minOccurs="0" name="fileFormat" type="xsd:string"/> + <xsd:element minOccurs="0" name="type" type="xsd:string"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + <xsd:element minOccurs="0" default="false" name="released" type="xsd:boolean"/> + <xsd:element minOccurs="0" default="false" name="exported" type="xsd:boolean"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="specificSkyImageDataProductAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="storageTicket" type="xsd:string"/> + <xsd:element minOccurs="0" name="fileSize" type="xsd:unsignedLong"/> + <xsd:element minOccurs="0" name="checksums" type="ChecksumTypes"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:integer" default="0"/> + <xsd:attribute name="mom2DPId" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="specificSkyImageDataProductAttributes" substitutionGroup="mom2:specificAttributes" type="SpecificSkyImageDataProductAttributesType"/> + <xsd:complexType name="SpecificSkyImageDataProductAttributesType"> + <xsd:complexContent> + <xsd:extension base="SpecificPixelMapDataProductAttributesType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="pointing" type="PointingType"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="PointingType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="rightAscension" type="xsd:double"/> + <xsd:element minOccurs="0" name="declination" type="xsd:double"/> + <xsd:element minOccurs="0" name="equinox" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType><!-- Pulsar Pipeline DataProduct related declarations --> + <xsd:element name="pulsarDataProduct" substitutionGroup="mom2:anyDataProduct" type="PulsarDataProductType"/> + <xsd:complexType name="PulsarDataProductType"> + <xsd:complexContent> + <xsd:extension base="LofarDataProductType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="status" type="xsd:string"/> + <xsd:element minOccurs="0" name="storageCluster" type="StorageClusterType"/> + <xsd:element minOccurs="0" name="ownerMom2Object" type="mom2:Mom2ObjectRefType"/> + <xsd:choice> + <xsd:element minOccurs="0" name="uri" type="xsd:string"/> + <xsd:element minOccurs="0" name="locations" type="mom2:DataProductLocationsType"/> + </xsd:choice> + <xsd:element minOccurs="0" name="fileFormat" type="xsd:string"/> + <xsd:element minOccurs="0" name="type" type="xsd:string"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + <xsd:element minOccurs="0" default="false" name="released" type="xsd:boolean"/> + <xsd:element minOccurs="0" default="false" name="exported" type="xsd:boolean"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="specificBFDataProductAttributes"/> + </xsd:choice> + <xsd:element minOccurs="0" name="storageTicket" type="xsd:string"/> + <xsd:element minOccurs="0" name="fileSize" type="xsd:unsignedLong"/> + <xsd:element minOccurs="0" name="checksums" type="ChecksumTypes"/> + </xsd:sequence><!-- xsd:attribute name="id" type="xsd:integer" default="0"/ --><!-- xsd:attribute name="mom2DPId" type="xsd:nonNegativeInteger"/ --><!-- xsd:attribute name="topology" type="xsd:string"/ --> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="specificPulsarDataProductAttributes" substitutionGroup="mom2:specificAttributes" type="SpecificPulsarDataProductAttributesType"/> + <xsd:complexType name="SpecificPulsarDataProductAttributesType"> + <xsd:complexContent> + <xsd:extension base="mom2:SpecificAttributesType"> + <xsd:sequence/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType><!-- Generic DataProduct related declarations --> + <xsd:element name="genericDataProduct" substitutionGroup="mom2:anyDataProduct" type="GenericDataProductType"/> + <xsd:complexType name="GenericDataProductType"> + <xsd:complexContent> + <xsd:restriction base="LofarDataProductType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="topology" type="xsd:string"/> + <xsd:element minOccurs="0" name="status" type="xsd:string"/> + <xsd:element minOccurs="0" name="storageCluster" type="StorageClusterType"/> + <xsd:element minOccurs="0" name="ownerMom2Object" type="mom2:Mom2ObjectRefType"/> + <xsd:choice> + <xsd:element minOccurs="0" name="uri" type="xsd:string"/> + <xsd:element minOccurs="0" name="locations" type="mom2:DataProductLocationsType"/> + </xsd:choice> + <xsd:element minOccurs="0" name="fileFormat" type="xsd:string"/> + <xsd:element minOccurs="0" name="type" type="xsd:string"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + <xsd:element minOccurs="0" default="false" name="released" type="xsd:boolean"/> + <xsd:element minOccurs="0" default="false" name="exported" type="xsd:boolean"/> + <xsd:element minOccurs="0" name="storageTicket" type="xsd:string"/> + <xsd:element minOccurs="0" name="fileSize" type="xsd:unsignedLong"/> + <xsd:element minOccurs="0" name="checksums" type="ChecksumTypes"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:integer" default="0"/> + <xsd:attribute name="mom2DPId" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> +</xsd:schema> diff --git a/SAS/Specification_Services/lib/LofarProject.xsd b/SAS/Specification_Services/lib/LofarProject.xsd new file mode 100644 index 0000000000000000000000000000000000000000..5c5bd60b635e2113e39295614988951a2114266c --- /dev/null +++ b/SAS/Specification_Services/lib/LofarProject.xsd @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8" ?> +<xsd:schema targetNamespace="http://www.astron.nl/LofarTrigger" version="0.1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.astron.nl/LofarTrigger" xmlns:base="http://www.astron.nl/LofarBase"> + <xsd:import schemaLocation="LofarBase.xsd" namespace="http://www.astron.nl/LofarBase"/> + <xsd:annotation> + <xsd:documentation>Definitions for LOFAR project and user submission</xsd:documentation> + </xsd:annotation> + <xsd:annotation> + <xsd:documentation>============================LOFAR Project entities============================ + + Project and user related objects. + </xsd:documentation> + </xsd:annotation> + <xsd:complexType name="Project"> + <xsd:sequence> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="description" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="project" type="Project"/> +</xsd:schema> diff --git a/SAS/Specification_Services/lib/LofarSpecification.xsd b/SAS/Specification_Services/lib/LofarSpecification.xsd new file mode 100644 index 0000000000000000000000000000000000000000..f6a30b1184b01c36029971b75f1737f129d932e3 --- /dev/null +++ b/SAS/Specification_Services/lib/LofarSpecification.xsd @@ -0,0 +1,249 @@ +<?xml version="1.0" encoding="utf-8" ?> +<xsd:schema targetNamespace="http://www.astron.nl/LofarSpecification" version="0.1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.astron.nl/LofarSpecification" xmlns:base="http://www.astron.nl/LofarBase"> + <xsd:import schemaLocation="LofarBase.xsd" namespace="http://www.astron.nl/LofarBase"/> + <xsd:annotation> + <xsd:documentation>Definitions for LOFAR specification submission + + This is a document that uses the LofarBase and extends that with objects that are specific to the needs of being able to + specify activities, their relations and entities. This is partially compatible with the W3C provenance model in its naming. + + Compared to the old MoM XSD, this does not contain a project object. It is assumed the project exists, a specification should + not be able to edit it or add a new one. Thus only a reference to a project is in the specification. + </xsd:documentation> + </xsd:annotation> + <xsd:annotation> + <xsd:documentation>============================LOFAR Specification containers============================ + + Currently we only support MoM folders as a container. + </xsd:documentation> + </xsd:annotation> + <xsd:complexType name="Container"> + <xsd:sequence> + <xsd:element name="temporaryIdentifier" type="base:Identifier"/> + <xsd:choice><!--Or should we be specific to the subtypes here?--> + <xsd:element name="folder" type="base:Folder"/> + <!-- Might be a SchedulingBlock and other types of containers in the future --> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:annotation> + <xsd:documentation>============================LOFAR Specification activities============================ + + Activities that the system can do and their related types and objects. + </xsd:documentation> + </xsd:annotation> + <xsd:complexType name="DurationSpecification"> + <xsd:sequence> + <xsd:element name="duration" type="xsd:duration"/><!-- FIXME we need to think about this some more, it might need to be a choice--> + <xsd:element name="minimumDuration" minOccurs="0" type="xsd:duration"/> + <xsd:element name="maximumDuration" minOccurs="0" type="xsd:duration"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="TimeFrameType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="UT"/> + <xsd:enumeration value="LST"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="ActivityTimeWindowSpecification"> <!-- An activity will also have an actual (resolved/allocated) time window, this is specific to specifying it --> + <xsd:sequence> + <xsd:element name="timeFrame" default="UT"> + </xsd:element> + <xsd:choice><!--How much flexibility do we want to support? --> + <xsd:sequence><!-- Specifies a window larger than duration --> + <xsd:element name="minStartTime" type="xsd:dateTime"/> + <xsd:element name="maxEndTime" type="xsd:dateTime"/> + <xsd:element name="duration" type="DurationSpecification"/><!-- Should be less than End - Start, othterwise use one of the other options --> + </xsd:sequence> + <!-- xsd:sequence><This one seems redundant with startTime/duration?> + <xsd:element name="startTime" type="xsd:dateTime"/> + <xsd:element name="endTime" type="xsd:dateTime"/> + </xsd:sequence --> + <xsd:sequence><!-- EndTime is implicit as startTime+duration --> + <xsd:element name="startTime" type="xsd:dateTime"/> + <xsd:element name="duration" type="DurationSpecification"/> + </xsd:sequence> + <xsd:sequence> <!-- Start time is dependent on other activities/events --> + <xsd:element name="duration" type="DurationSpecification"/> + </xsd:sequence> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="LofarStationSelectionType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="Single"/> + <xsd:enumeration value="Core"/> + <xsd:enumeration value="Dutch"/> + <xsd:enumeration value="All"/> + <xsd:enumeration value="Custom"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="StationSelection"> + <xsd:sequence> + <xsd:element name="stationSet" type="LofarStationSelectionType"/> + <xsd:choice> + <xsd:sequence> + <xsd:element name="minimumConstraint" type="xsd:integer"/> + <xsd:element name="maximumConstraint" minOccurs="0" type="xsd:integer"/> + </xsd:sequence> + <xsd:element name="stations" type="base:Stations"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="StationSelectionSpecification"> + <xsd:sequence> + <xsd:element name="stationSelection" maxOccurs="4" type="StationSelection"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="Observation"> + <xsd:complexContent> + <xsd:extension base="base:Observation"> + <xsd:sequence> + <xsd:element name="stationSelectionSpecification" type="StationSelectionSpecification"/> + <xsd:element name="timeWindowSpecification" type="ActivityTimeWindowSpecification"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="Activity"> + <xsd:sequence> + <xsd:element name="temporaryIdentifier" type="base:Identifier"/> + <xsd:choice><!--Or should we be specific to the subtypes here?--> + <xsd:element name="observation" type="Observation"/> + <xsd:element name="measurement" type="base:Measurement"/><!-- maybe explicit part of Observation but makes it hard to make Relations?--> + <!-- we want to be specific about which types can generate wich types of dataproducts/entities --> + <xsd:element name="pipeline" type="base:Pipeline"/> + <xsd:element name="ingest" type="base:Ingest"/> + <xsd:element name="cleanup" type="base:Cleanup"/> + </xsd:choice> + <xsd:element name="status" minOccurs="0" type="xsd:string"/><!-- default would be opened, might need to be come an enum --> + </xsd:sequence> + </xsd:complexType> + <xsd:annotation> + <xsd:documentation>============================LOFAR Specification entities============================ + + TBD + </xsd:documentation> + </xsd:annotation> + <xsd:simpleType name="DataProductType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="UVDataProduct"/> + <xsd:enumeration value="BFDataProduct"/> + <xsd:enumeration value="TBBDataProduct"/> + <xsd:enumeration value="PixelMapDataProduct"/> + <xsd:enumeration value="SkyImageDataProduct"/> + <xsd:enumeration value="PulsarDataProduct"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="Entity"> + <xsd:sequence> + <xsd:element name="temporaryIdentifier" type="base:Identifier"/> + <xsd:element name="dataproductType" type="DataProductType"/> + <xsd:element name="storageCluster" type="base:StorageCluster"/> + </xsd:sequence> + </xsd:complexType> + <xsd:annotation> + <xsd:documentation>============================LOFAR Specification relations============================ + + These relations allow more flexibility than a purely nested structure. They can show the different ways that objects are related + to allow for different types of visualisation. + </xsd:documentation> + </xsd:annotation> + <xsd:simpleType name="ChildRelationType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="folder-folder"/> <!-- should be made more specific --> + <xsd:enumeration value="folder-activity"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="ChildRelation"> + <xsd:complexContent> + <xsd:extension base="Relation"> + <xsd:sequence> + <xsd:element name="parent" type="base:Identifier"/> + <xsd:element name="child" type="base:Identifier"/> + <xsd:element name="type" type="ChildRelationType"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:simpleType name="SibblingRelationType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="group"/> + <xsd:enumeration value="calibrator"/><!-- Not correct FIXME--> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="SibblingRelation"><!-- We need to make this smarter for other sibbling relations--> + <xsd:complexContent> + <xsd:extension base="Relation"> + <xsd:sequence> + <xsd:element name="sibbling" minOccurs="1" maxOccurs="unbounded" type="base:Identifier"/> + <xsd:element name="type" type="SibblingRelationType"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:simpleType name="ProducerRelationType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="output"/><!-- ProducedBy, needs better name?--> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="ProducerRelation"> + <xsd:complexContent> + <xsd:extension base="Relation"> + <xsd:sequence> + <xsd:element name="activity" type="base:Identifier"/> + <xsd:element name="entity" type="base:Identifier"/> + <xsd:element name="type" type="ProducerRelationType"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:simpleType name="UserRelationType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="input"/><!-- UsedBy, needs better name?--> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="UserRelation"> + <xsd:complexContent> + <xsd:extension base="Relation"> + <xsd:sequence> + <xsd:element name="entity" type="base:Identifier"/> + <xsd:element name="activity" type="base:Identifier"/> + <xsd:element name="type" type="UserRelationType"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="Relation" abstract="true"/> + <xsd:annotation> + <xsd:documentation>============================LOFAR Specification root element============================ + + This contains the other objects in the specification and their relations. It also contains properties that pertain to the whole + specification and not a specific object. It needs to have at least one container/folder to put into the project in MoM that will then + contain other objects. Activities and entities should and can't be related to the project directly. + </xsd:documentation> + </xsd:annotation> + <xsd:simpleType name="QualityOfServiceType"> + <xsd:restriction base="xsd:string"><!-- These names are not very clear to me without explanation --> + <xsd:enumeration value="THROUGHPUT"/> <!-- The current and default behavior --> + <xsd:enumeration value="LATENCY"/> <!-- This job needs to be optimized for fast data delivery --> + <xsd:enumeration value="IDLE"/> <!-- Jobs that should only be ran if the telescope is idle (test jobs for example). --> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="Specification"> + <xsd:sequence> + <xsd:element name="version" type="xsd:string"/> + <xsd:element name="projectReference" type="base:ProjectReference"/> + <xsd:element name="userName" type="xsd:string"/> + <xsd:element name="comment" type="xsd:string" minOccurs="0"/><!--Might not be needed?--> + <xsd:element name="generatorVersion" type="xsd:string"/> + <xsd:element name="priority" type="xsd:nonNegativeInteger"/> + <xsd:element name="qualityOfService" type="QualityOfServiceType" default="THROUGHPUT"/> + <xsd:element name="container" type="Container" maxOccurs="unbounded"/> <!-- do we want it all in one container? without maxOccurs="unbounded"--> + <xsd:element name="activity" type="Activity" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="entity" type="Entity" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="relation" type="Relation" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="specification" type="Specification"/> +</xsd:schema> diff --git a/SAS/Specification_Services/lib/LofarTrigger.xsd b/SAS/Specification_Services/lib/LofarTrigger.xsd new file mode 100644 index 0000000000000000000000000000000000000000..31a71e228d4385e8f879c9d69501dd92ecdbde5a --- /dev/null +++ b/SAS/Specification_Services/lib/LofarTrigger.xsd @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" ?> +<xsd:schema targetNamespace="http://www.astron.nl/LofarTrigger" version="0.1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.astron.nl/LofarTrigger" xmlns:spec="http://www.astron.nl/LofarSpecification" xmlns:base="http://www.astron.nl/LofarBase"> + <xsd:import schemaLocation="LofarSpecification.xsd" namespace="http://www.astron.nl/LofarSpecification"/> + <xsd:import schemaLocation="LofarBase.xsd" namespace="http://www.astron.nl/LofarBase"/> + <xsd:annotation> + <xsd:documentation>Definitions for LOFAR trigger submission</xsd:documentation> + </xsd:annotation> + <xsd:annotation> + <xsd:documentation>============================LOFAR Trigger root element============================ + + Class for submission of a specification based on a trigger, with the relevant trigger information. + </xsd:documentation> + </xsd:annotation> + <xsd:complexType name="Trigger"> + <xsd:sequence> + <xsd:element name="version" type="xsd:string"/> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="description" type="xsd:string"/> + <xsd:element name="projectReference" type="base:ProjectReference"/> + <xsd:element name="submitter" type="base:ContactInformation"/><!-- Do we want to enforce this as the authenticated user? --> + <xsd:element name="userName" type="xsd:string"/><!-- The same as the authenticated user? --> + <xsd:element name="comment" type="xsd:string" minOccurs="0"/><!--Might not be needed?--> + <xsd:element name="qualityOfService" type="spec:QualityOfServiceType"/><!--Might not be needed?--> + <xsd:element name="event" type="base:Event" maxOccurs="unbounded"/><!--Maybe there should be EventList?--> + <xsd:element name="specification" type="spec:Specification"/> + <xsd:element name="generatorVersion" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="trigger" type="Trigger"/> +</xsd:schema> diff --git a/SAS/Specification_Services/lib/MoM2.xsd b/SAS/Specification_Services/lib/MoM2.xsd new file mode 100644 index 0000000000000000000000000000000000000000..b004ea503e155ccbf7e76bcdf412d8fc83b2a347 --- /dev/null +++ b/SAS/Specification_Services/lib/MoM2.xsd @@ -0,0 +1,704 @@ +<?xml version="1.0" encoding="utf-8" ?> +<xsd:schema targetNamespace="http://www.astron.nl/MoM2" version="1.0" xmlns:persistent="http://www.astron.nl/PersistentObjects" xmlns="http://www.astron.nl/MoM2" xmlns:user="http://www.astron.nl/useradmin" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <xsd:import schemaLocation="UserAdmin.xsd" namespace="http://www.astron.nl/useradmin"/> + <xsd:import schemaLocation="PersistentObjects.xsd" namespace="http://www.astron.nl/PersistentObjects"/> + <xsd:annotation> + <xsd:documentation> + XML Schema for the MoM2 datamodel + </xsd:documentation> + </xsd:annotation> + <xsd:element name="projects"> + <xsd:complexType> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" ref="project"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + <xsd:element name="project" type="ProjectType"/> + <xsd:complexType name="ProjectType" abstract="true"> + <xsd:complexContent mixed="false"> + <xsd:extension base="CollectionType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="members" nillable="true" type="IndexedMemberListType"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="allocation"/> + </xsd:choice> + <xsd:element minOccurs="0" name="releaseDate" type="xsd:date"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="ProjectRefType"> + <xsd:complexContent mixed="false"> + <xsd:restriction base="ProjectType"><!-- + Project reference is unique if either mom2Id or name is given NB exactly one of these should be provided but no + validation in the schema (fundamental schema definition problem)! + --> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute name="mom2Id" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedMemberListType"> + <xsd:sequence> + <xsd:element minOccurs="0" maxOccurs="unbounded" name="item"> + <xsd:complexType> + <xsd:choice> + <xsd:element name="registeredMember" type="RegisteredMemberType"/> + <xsd:element name="nonRegisteredMember" type="NonRegisteredMemberType"/> + </xsd:choice> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:complexType> + </xsd:element> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="MemberType" abstract="true"> + <xsd:complexContent mixed="false"> + <xsd:extension base="persistent:PersistentObjectType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="affilliation" type="xsd:string"/> + <xsd:element minOccurs="0" name="email" type="xsd:string"/> + <xsd:element minOccurs="0" name="country" type="xsd:string"/> + <xsd:element minOccurs="0" name="roles"> + <xsd:complexType> + <xsd:sequence maxOccurs="unbounded"> + <xsd:element ref="anyRole"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="ProjectRoleType"> + <xsd:complexContent mixed="false"> + <xsd:extension base="persistent:PersistentObjectType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="description" type="xsd:string"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="ProjectRoleRefType"> + <xsd:complexContent mixed="false"> + <xsd:restriction base="ProjectRoleType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:element abstract="true" name="anyRole" type="ProjectRoleRefType"/> + <xsd:element name="pi" substitutionGroup="anyRole"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="ProjectRoleRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="Pi" name="name" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="1" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="coi" substitutionGroup="anyRole"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="ProjectRoleRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="Co-I" name="name" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="2" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="friend" substitutionGroup="anyRole"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="ProjectRoleRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="Friend" name="name" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="3" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="contactAuthor" substitutionGroup="anyRole"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="ProjectRoleRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="Contact author" name="name" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="4" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="potentialObserver" substitutionGroup="anyRole"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="ProjectRoleRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="Potential observer" name="name" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="5" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:complexType name="RegisteredMemberType"> + <xsd:complexContent mixed="false"> + <xsd:extension base="MemberType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="user" type="user:UserRefType"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="NonRegisteredMemberType"> + <xsd:complexContent mixed="false"> + <xsd:extension base="MemberType"> + <xsd:sequence/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="AllocationType"> + <xsd:sequence> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element ref="anyResource"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:element abstract="true" name="allocation" type="AllocationType"/> + <xsd:complexType name="ResourceType" abstract="true"> + <xsd:simpleContent> + <xsd:extension base="xsd:double"> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="unit" type="xsd:string"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:element abstract="true" name="anyResource" type="ResourceType"/> + <xsd:element name="observingTime" substitutionGroup="anyResource"> + <xsd:complexType> + <xsd:simpleContent> + <xsd:restriction base="ResourceType"> + <xsd:simpleType> + <xsd:restriction base="xsd:double"/> + </xsd:simpleType> + <xsd:attribute fixed="time" name="name" type="xsd:string"/> + <xsd:attribute fixed="seconds" name="unit" type="xsd:string"/> + </xsd:restriction> + </xsd:simpleContent> + </xsd:complexType> + </xsd:element> + <xsd:complexType name="CollectionType" abstract="true"> + <xsd:complexContent mixed="false"> + <xsd:extension base="Mom2ObjectType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="children" nillable="true" type="IndexedMom2ObjectListType"/> + <xsd:element minOccurs="0" name="references" nillable="true" type="IndexedMom2ObjectRefListType"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CollectionRefType" abstract="true"> + <xsd:complexContent mixed="false"> + <xsd:restriction base="CollectionType"> + <xsd:attribute name="mom2Id" type="xsd:nonNegativeInteger" use="required"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedMom2ObjectListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedMom2ObjectItemType"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="IndexedMom2ObjectItemType"> + <xsd:complexContent mixed="false"> + <xsd:extension base="persistent:IndexedListItemType"> + <xsd:choice> + <xsd:any minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element abstract="true" name="anyMom2Object" type="Mom2ObjectType"/> + <xsd:complexType name="IndexedMom2ObjectRefListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedMom2ObjectRefItemType"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="IndexedMom2ObjectRefItemType"> + <xsd:complexContent mixed="false"> + <xsd:extension base="persistent:IndexedListItemType"> + <xsd:choice minOccurs="0"> + <xsd:element ref="anyMom2ObjectRef"/> + </xsd:choice> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element abstract="true" name="anyMom2ObjectRef" type="Mom2ObjectRefType"/> + <xsd:complexType name="Mom2ObjectType" abstract="true"> + <xsd:complexContent mixed="false"> + <xsd:extension base="persistent:PersistentObjectType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="description" type="xsd:string"/> + <xsd:element minOccurs="0" name="parent" type="CollectionRefType"/> + <xsd:element minOccurs="0" name="ownerProject" type="ProjectRefType"/> + <xsd:element minOccurs="0" name="statusHistory" type="StatusHistoryType"/> + <xsd:element minOccurs="0" name="currentStatus" type="CurrentStatusType"/> + <xsd:element minOccurs="0" name="generalRemarks" nillable="true" type="IndexedGeneralRemarkListType"/> + <xsd:element minOccurs="0" name="inspectionReports" nillable="true" type="IndexedInspectionReportListType"/> + <xsd:element minOccurs="0" name="specificationRemarks" nillable="true" type="IndexedSpecificationRemarkListType"/> + <xsd:element minOccurs="0" name="schedulingRemarks" nillable="true" type="IndexedSchedulingRemarkListType"/> + <xsd:element minOccurs="0" name="usedDataProducts" nillable="true" type="IndexedDataProductListType"/> + <xsd:element minOccurs="0" name="resultDataProducts" nillable="true" type="IndexedDataProductListType"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="specificAttributes"/> + </xsd:choice> + </xsd:sequence> + <xsd:attribute name="mom2Id" type="xsd:nonNegativeInteger"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="Mom2ObjectRefType"> + <xsd:complexContent mixed="false"> + <xsd:restriction base="Mom2ObjectType"> + <xsd:attribute name="mom2Id" type="xsd:nonNegativeInteger" use="required"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="Mom2ObjectStatusType"> + <xsd:complexContent mixed="false"> + <xsd:extension base="persistent:PersistentObjectType"> + <xsd:all> + <xsd:element minOccurs="0" name="user" type="user:UserRefType"/> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="roles" type="xsd:string"/> + <xsd:element minOccurs="0" ref="anyStatus"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + </xsd:all> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="Mom2ObjectStatusRefType"> + <xsd:complexContent mixed="false"> + <xsd:restriction base="persistent:PersistentObjectType"> + <xsd:attribute name="id" type="xsd:integer" use="required"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="StatusType" abstract="true"> + <xsd:complexContent mixed="false"> + <xsd:extension base="persistent:PersistentObjectType"> + <xsd:all> + <xsd:element minOccurs="0" name="code" type="xsd:string"/> + <xsd:element minOccurs="0" name="type" type="xsd:string"/> + <xsd:element minOccurs="0" name="description" type="xsd:string"/> + </xsd:all> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="StatusRefType"> + <xsd:complexContent mixed="false"> + <xsd:restriction base="StatusType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="code" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:element abstract="true" name="anyStatus" type="StatusRefType"/> + <xsd:complexType name="StatusHistoryType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="StatusHistoryItemType"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="StatusHistoryItemType"> + <xsd:complexContent mixed="false"> + <xsd:restriction base="IndexedMom2ObjectStatusItemType"> + <xsd:choice> + <xsd:element name="mom2ObjectStatus" type="Mom2ObjectStatusType"/> + </xsd:choice> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedMom2ObjectStatusItemType"> + <xsd:complexContent mixed="false"> + <xsd:extension base="persistent:IndexedListItemType"> + <xsd:choice> + <xsd:element minOccurs="0" name="mom2ObjectStatus" type="Mom2ObjectStatusType"/> + </xsd:choice> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CurrentStatusType"> + <xsd:choice> + <xsd:element name="mom2ObjectStatus" type="Mom2ObjectStatusRefType"/> + <xsd:element name="statusHistoryItem" type="StatusHistoryRefType"/> + <xsd:element ref="anyStatus"/> + </xsd:choice> + </xsd:complexType> + <xsd:complexType name="StatusHistoryRefType"> + <xsd:complexContent mixed="false"> + <xsd:restriction base="IndexedMom2ObjectStatusItemType"> + <xsd:attribute name="index" type="xsd:nonNegativeInteger" use="required"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="openedStatus" substitutionGroup="anyStatus"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="StatusRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="opened" name="code" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="1" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="describedStatus" substitutionGroup="anyStatus"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="StatusRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="described" name="code" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="2" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="preparedStatus" substitutionGroup="anyStatus"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="StatusRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="prepared" name="code" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="3" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="approvedStatus" substitutionGroup="anyStatus"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="StatusRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="approved" name="code" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="4" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="scheduledStatus" substitutionGroup="anyStatus"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="StatusRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="scheduled" name="code" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="5" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="activeStatus" substitutionGroup="anyStatus"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="StatusRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="active" name="code" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="6" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="runningStatus" substitutionGroup="anyStatus"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="StatusRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="running" name="code" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="7" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="holdStatus" substitutionGroup="anyStatus"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="StatusRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="hold" name="code" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="8" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="suspendedStatus" substitutionGroup="anyStatus"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="StatusRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="suspended" name="code" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="9" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="finishedStatus" substitutionGroup="anyStatus"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="StatusRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="finished" name="code" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="10" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="abortedStatus" substitutionGroup="anyStatus"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="StatusRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="aborted" name="code" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="11" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="failedStatus" substitutionGroup="anyStatus"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="StatusRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="failed" name="code" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="12" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="successfulStatus" substitutionGroup="anyStatus"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="StatusRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="successful" name="code" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="13" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="notSchedulableStatus" substitutionGroup="anyStatus"> + <xsd:complexType> + <xsd:complexContent mixed="false"> + <xsd:restriction base="StatusRefType"> + <xsd:sequence> + <xsd:element minOccurs="0" fixed="not schedulable" name="code" type="xsd:string"/> + </xsd:sequence> + <xsd:attribute fixed="14" name="id" type="xsd:integer"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + </xsd:element> + <xsd:complexType name="IndexedGeneralRemarkListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedGeneralRemarkItemType"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="IndexedGeneralRemarkItemType"> + <xsd:complexContent mixed="false"> + <xsd:restriction base="IndexedTextItemType"> + <xsd:choice> + <xsd:element ref="generalRemark"/> + </xsd:choice> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedInspectionReportListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedInspectionReportItemType"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="IndexedInspectionReportItemType"> + <xsd:complexContent mixed="false"> + <xsd:restriction base="IndexedTextItemType"> + <xsd:choice> + <xsd:element ref="inspectionReport"/> + </xsd:choice> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedSpecificationRemarkListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedSpecificationRemarkItemType"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="IndexedSpecificationRemarkItemType"> + <xsd:complexContent mixed="false"> + <xsd:restriction base="IndexedTextItemType"> + <xsd:choice> + <xsd:element ref="specificationRemark"/> + </xsd:choice> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedSchedulingRemarkListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedSchedulingRemarkItemType"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="IndexedSchedulingRemarkItemType"> + <xsd:complexContent mixed="false"> + <xsd:restriction base="IndexedTextItemType"> + <xsd:choice> + <xsd:element ref="schedulingRemark"/> + </xsd:choice> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="IndexedTextItemType"> + <xsd:complexContent mixed="false"> + <xsd:extension base="persistent:IndexedListItemType"> + <xsd:choice> + <xsd:element ref="anyText"/> + </xsd:choice> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="TextType"> + <xsd:complexContent mixed="false"> + <xsd:extension base="persistent:PersistentObjectType"> + <xsd:all> + <xsd:element minOccurs="0" name="user" type="user:UserRefType"/> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="roles" type="xsd:string"/> + <xsd:element minOccurs="0" name="text" type="xsd:string"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + </xsd:all> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="GeneralRemarkType"> + <xsd:complexContent mixed="false"> + <xsd:extension base="TextType"/> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="SchedulingRemarkType"> + <xsd:complexContent mixed="false"> + <xsd:extension base="TextType"/> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="SpecificationRemarkType"> + <xsd:complexContent mixed="false"> + <xsd:extension base="TextType"/> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="InspectionReportType"> + <xsd:complexContent mixed="false"> + <xsd:extension base="TextType"/> + </xsd:complexContent> + </xsd:complexType> + <xsd:element abstract="true" name="anyText" type="TextType"/> + <xsd:element name="generalRemark" substitutionGroup="anyText" type="GeneralRemarkType"/> + <xsd:element name="inspectionReport" substitutionGroup="anyText" type="InspectionReportType"/> + <xsd:element name="specificationRemark" substitutionGroup="anyText" type="SpecificationRemarkType"/> + <xsd:element name="schedulingRemark" substitutionGroup="anyText" type="SchedulingRemarkType"/> + <xsd:complexType name="IndexedDataProductListType"> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" name="item" type="IndexedDataProductItemType"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="IndexedDataProductItemType"> + <xsd:complexContent mixed="false"> + <xsd:extension base="persistent:IndexedListItemType"> + <xsd:choice> + <xsd:any minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="DataProductType"> + <xsd:complexContent mixed="false"> + <xsd:extension base="persistent:PersistentObjectType"> + <xsd:sequence> + <xsd:element minOccurs="0" name="name" type="xsd:string"/> + <xsd:element minOccurs="0" name="ownerMom2Object" type="Mom2ObjectRefType"/> + <xsd:choice> + <xsd:element minOccurs="0" name="uri" type="xsd:string"/> + <xsd:element minOccurs="0" name="locations" type="DataProductLocationsType"/> + </xsd:choice> + <xsd:element minOccurs="0" name="fileFormat" type="xsd:string"/> + <xsd:element minOccurs="0" name="type" type="xsd:string"/> + <xsd:element minOccurs="0" name="timeStamp" type="xsd:dateTime"/> + <xsd:element minOccurs="0" default="false" name="released" type="xsd:boolean"/> + <xsd:element minOccurs="0" default="false" name="exported" type="xsd:boolean"/> + <xsd:choice minOccurs="0"> + <xsd:element ref="specificAttributes"/> + </xsd:choice> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="DataProductLocationsType"> + <xsd:sequence> + <xsd:element minOccurs="0" maxOccurs="unbounded" name="location" type="DataProductLocationType"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="DataProductLocationType"> + <xsd:complexContent mixed="false"> + <xsd:extension base="persistent:PersistentObjectType"> + <xsd:sequence> + <xsd:element name="uri" type="xsd:string"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element abstract="true" name="anyDataProduct" type="DataProductType"/> + <xsd:element abstract="true" name="specificAttributes" type="SpecificAttributesType"/> + <xsd:complexType name="SpecificAttributesType"/> + <xsd:simpleType name="FrequencyUnit"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="Hz"/> + <xsd:enumeration value="kHz"/> + <xsd:enumeration value="MHz"/> + <xsd:enumeration value="GHz"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="Frequency"> + <xsd:simpleContent> + <xsd:extension base="xsd:double"> + <xsd:attribute name="unit" type="FrequencyUnit" use="required"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> +</xsd:schema> diff --git a/SAS/Specification_Services/lib/PersistentObjects.xsd b/SAS/Specification_Services/lib/PersistentObjects.xsd new file mode 100644 index 0000000000000000000000000000000000000000..399e27f5e4bb903052ed2743b88ac82a47c32b60 --- /dev/null +++ b/SAS/Specification_Services/lib/PersistentObjects.xsd @@ -0,0 +1,40 @@ + +<xsd:schema targetNamespace="http://www.astron.nl/PersistentObjects" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.astron.nl/PersistentObjects"> + <xsd:annotation> + <xsd:documentation>Definition of base types for astron web application persistent objects</xsd:documentation> + </xsd:annotation> + <xsd:complexType name="PersistentObjectType" abstract="true"> + <xsd:annotation> + <xsd:documentation> + Base persistent object type + </xsd:documentation> + </xsd:annotation> + <xsd:attribute name="id" type="xsd:integer" default="0"/> + </xsd:complexType> + <xsd:complexType name="IndexedListType" abstract="true"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element ref="indexedListItem"/> + </xsd:choice> + </xsd:complexType> + <xsd:complexType name="IndexedListItemType" abstract="true"> + <xsd:attribute name="index" type="xsd:nonNegativeInteger"/> + </xsd:complexType> + <xsd:complexType name="PersistentListType" abstract="true"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:annotation> + <xsd:documentation> + A choice group with min/max occurences is used since + the intention is that the referenced (abstract) + element ""persistentListElement"" is + replaced by a member of it's substitution group. (A + sequence with an unbouded number of these elemets + will not work as the substitution group is treated + as a choice group.) + </xsd:documentation> + </xsd:annotation> + <xsd:element ref="persistentObject"/> + </xsd:choice> + </xsd:complexType> + <xsd:element name="indexedListItem" type="IndexedListItemType" abstract="true"/> + <xsd:element name="persistentObject" type="PersistentObjectType" abstract="true"/> +</xsd:schema> diff --git a/SAS/Specification_Services/lib/UserAdmin.xsd b/SAS/Specification_Services/lib/UserAdmin.xsd new file mode 100644 index 0000000000000000000000000000000000000000..ac228d2a3e8099bdcefe04955e92be0ca228f194 --- /dev/null +++ b/SAS/Specification_Services/lib/UserAdmin.xsd @@ -0,0 +1,16 @@ + +<xsd:schema targetNamespace="http://www.astron.nl/useradmin" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:persistent="http://www.astron.nl/PersistentObjects"> + <xsd:import namespace="http://www.astron.nl/PersistentObjects" schemaLocation="PersistentObjects.xsd"/> + <xsd:annotation> + <xsd:documentation> + XML Schema for the WSRT user administration datamodel + </xsd:documentation> + </xsd:annotation> + <xsd:complexType name="UserRefType"> + <xsd:complexContent> + <xsd:restriction base="persistent:PersistentObjectType"> + <xsd:attribute name="id" type="xsd:integer" use="required"/> + </xsd:restriction> + </xsd:complexContent> + </xsd:complexType> +</xsd:schema> diff --git a/SAS/Specification_Services/lib/__init__.py b/SAS/Specification_Services/lib/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/SAS/Specification_Services/lib/config.py b/SAS/Specification_Services/lib/config.py new file mode 100644 index 0000000000000000000000000000000000000000..a8f3af3eeaf1bc5c8ce73eedfee23dd7b2160e2c --- /dev/null +++ b/SAS/Specification_Services/lib/config.py @@ -0,0 +1,35 @@ + +""" Config file for specification services. """ + +# Messaging + +CONNECTION_STRING = '127.0.0.1' + +MOMQUERY_BUSNAME = "momquerybus" +MOMQUERY_SERVICENAME = "momqueryservice" + +VALIDATION_BUSNAME = "validationbus" +VALIDATION_SERVICENAME = "validationservice" + +SPECIFICATION_BUSNAME = "specificationbus" +SPECIFICATION_SERVICENAME = "specificationservice" + +SPECIFICATIONTRANSLATION_BUSNAME = "specificationtranslationbus" +SPECIFICATIONTRANSLATION_SERVICENAME = "specificationtranslationservice" + + +# XSD paths (for validation service) + +TRIGGER_XSD = "LofarTrigger.xsd" +LOFARSPEC_XSD = "LofarSpecification.xsd" +MOMSPEC_XSD = "LofarMoM2.xsd" + + +# These specification elements are to be recoded for MoM as json + +MOM_EXTRASPECS = ["triggerid", + "priority", + "qualityOfService", + "activity.observation.timeWindowSpecification", + "activity.observation.stationSelectionSpecification", + "comment"] \ No newline at end of file diff --git a/SAS/Specification_Services/lib/specification_service.py b/SAS/Specification_Services/lib/specification_service.py new file mode 100644 index 0000000000000000000000000000000000000000..660f6a5890a17bbd7885594f9d2d22738fd30408 --- /dev/null +++ b/SAS/Specification_Services/lib/specification_service.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python + +# specification_service.py +# +# Copyright (C) 2015 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. + + +XMLPATH_TRIGGER="../test/trigger.xml" + +from lxml import etree +from StringIO import StringIO +from lofar.specificationservices.validation_service_rpc import ValidationRPC +from lofar.specificationservices.translation_service_rpc import TranslationRPC +from lofar.mom.momqueryservice.momqueryrpc import MoMQueryRPC + +from lofar.messaging import Service +from lofar.messaging.Service import MessageHandlerInterface +from lofar.common.util import waitForInterrupt + +from config import MOMQUERY_BUSNAME, MOMQUERY_SERVICENAME, VALIDATION_BUSNAME, VALIDATION_SERVICENAME, SPECIFICATION_SERVICENAME, SPECIFICATION_BUSNAME, SPECIFICATIONTRANSLATION_SERVICENAME, SPECIFICATIONTRANSLATION_BUSNAME + +momqueryrpc = MoMQueryRPC(MOMQUERY_BUSNAME, MOMQUERY_SERVICENAME) +validationrpc = ValidationRPC(VALIDATION_BUSNAME, VALIDATION_SERVICENAME) +specificationtranslationrpc = TranslationRPC(SPECIFICATIONTRANSLATION_BUSNAME, SPECIFICATIONTRANSLATION_SERVICENAME) + + +import logging +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + + +def _check_specification(lofar_xml): + folder = "innermost" # where to find this in xml??? + #if momqueryrpc.folderExists(folder): + # raise Exception("Folder already exists!") + processes = [] # where to obtain these? + for process in processes: + pass + # todo: i. Check whether the specifications are in folder(s), return ERROR if not. + # todo: ii. Whether the specifications are observations or pipelines + # todo: iii. Whether the specifications go to opened or approved + # todo: iv. Queries the MoMQueryService whether user can open or approve specifications in the selected project(s), return ERROR if not. + return True + +def _authenticate(user, project, jobtype, state): + # todo: momqueryrpc.authState(user,project,jobtype,state) + return True + +def _validate_lofarspec(lofar_xml): + return validationrpc.validate_specification(lofar_xml) + #return validationhandler.validate_specification(lofar_xml) + +def _validate_momspec(mom_xml): + return validationrpc.validate_mom_specification(mom_xml) + #return validationhandler.validate_mom_specification(mom_xml) + +def _add_spec_to_mom(mom_xml): + # todo: momrpc.importXML(mom_xml) -- which service is this? + return True + +def _lofarxml_to_momxml(lofarxml): + momxml = specificationtranslationrpc.specification_to_momspecification(lofarxml) + return momxml + +class SpecificationHandler(MessageHandlerInterface): + + def __init__(self, **kwargs): + super(SpecificationHandler, self).__init__(**kwargs) + + self.service2MethodMap = { + 'add_specification': self.add_specification, + } + + def add_specification(self, user, lofar_xml): + logger.info("got specification from user " + str(user)) + logger.debug("LOFAR-XML: " + lofar_xml) + id = None + if _authenticate(None, None, None, None): + logger.info("authenticated!") + if _validate_lofarspec(lofar_xml): + logger.info("lofar xml validates!") + if _check_specification(lofar_xml): + logger.info("lofar xml check successful!") + mom_xml = _lofarxml_to_momxml(lofar_xml) + if _validate_momspec(mom_xml): + logger.info("mom xml validates!") + _add_spec_to_mom(mom_xml) + else: + logger.error("Could not create valid LOFAR XML: "+lofar_xml) + + return id + + def get_specification(self, id): + logger.info("getting spec of id "+str(id)) + # todo: return real trigger info as xml + # for testing: + with open(XMLPATH_TRIGGER) as xml: + return xml.read() + + +def create_service(servicename=SPECIFICATION_SERVICENAME, busname=SPECIFICATION_BUSNAME): + return Service(servicename, + SpecificationHandler, + busname=busname, + use_service_methods=True, + ) + + +def main(): + with create_service(): + waitForInterrupt() + diff --git a/SAS/Specification_Services/lib/specification_service_rpc.py b/SAS/Specification_Services/lib/specification_service_rpc.py new file mode 100644 index 0000000000000000000000000000000000000000..ffffd259de10e1a2620932cd77620c498d644918 --- /dev/null +++ b/SAS/Specification_Services/lib/specification_service_rpc.py @@ -0,0 +1,23 @@ + +from lofar.messaging.RPC import RPC, RPCException, RPCWrapper +from config import SPECIFICATION_BUSNAME, SPECIFICATION_SERVICENAME +import logging +logger = logging.getLogger(__file__) + + +class SpecificationRPC(RPCWrapper): + + def __init__(self, busname=SPECIFICATION_BUSNAME, + servicename=SPECIFICATION_SERVICENAME, + broker=None, + timeout=120): + super(SpecificationRPC, self).__init__(busname, servicename, broker, timeout=timeout) + + + def add_specification(self, user, lofar_xml): + logger.info("Requesting addition of specification XML for user -> "+user) + result = self.rpc('add_specification', user, lofar_xml=lofar_xml) + logger.info("Received addition result -> " +str(result)) + return result + + diff --git a/SAS/Specification_Services/lib/translation_service.py b/SAS/Specification_Services/lib/translation_service.py new file mode 100644 index 0000000000000000000000000000000000000000..ba0b50c5ff6cf65709a00d0c241c9253cb05494d --- /dev/null +++ b/SAS/Specification_Services/lib/translation_service.py @@ -0,0 +1,163 @@ +#!/usr/bin/env python + +# translation_service.py +# +# Copyright (C) 2015 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. + + +# This Service translates specifications, e.g. from a generic LOFAR spec to MoM spec. + + +import logging +logger = logging.getLogger(__name__) +from json import dumps +from collections import OrderedDict +from lxml import etree +from xmljson import BadgerFish +from StringIO import StringIO + +from lofar.messaging import Service +from lofar.messaging.Service import MessageHandlerInterface +from lofar.common.util import waitForInterrupt + +from config import MOM_EXTRASPECS, SPECIFICATIONTRANSLATION_SERVICENAME, SPECIFICATIONTRANSLATION_BUSNAME, VALIDATION_SERVICENAME, VALIDATION_BUSNAME + +from validation_service_rpc import ValidationRPC +validationrpc = ValidationRPC(VALIDATION_BUSNAME, VALIDATION_SERVICENAME) + + +def _jsonify(xml): + """encodes an element/subtree as json in the misc field (for MoM)""" + bf = BadgerFish(dict_type=OrderedDict) + data = bf.data(etree.fromstring(xml)) + json = dumps(data) + return json + + +class SpecificationTranslationHandler(MessageHandlerInterface): + + def __init__(self, **kwargs): + super(SpecificationTranslationHandler, self).__init__(**kwargs) + + self.service2MethodMap = { + 'trigger_to_specification': self.trigger_to_specification, + 'specification_to_momspecification': self.specification_to_momspecification, + } + + def trigger_to_specification(self, trigger_spec, trigger_id, job_priority): + + logger.info("Translating Trigger spec to Lofar spec") + logger.debug('trigger before translation ->' + trigger_spec) + + # pick the specification element + doc = etree.parse(StringIO(trigger_spec.encode('UTF-8'))) + spec = doc.getroot().find('specification') + logger.debug("root is "+spec.tag) + + # inject priority # todo: if optional item, move to trigger service + priority = spec.find("priority") + priority.text = str(job_priority) + + # inject identifier # todo: if optional item, move to trigger service + identifier = spec.find("activity").find("temporaryIdentifier") # todo: discuss where this is supposed to really go! + source = identifier.find("source") + ident = identifier.find("identifier") + source.text = "Trigger" + ident.text = str(trigger_id) + + # create new document with correct namespace and return xml as string: + # todo: check whether a type reference can be used to have the correct namespace on specification! + lofar_spec = etree.Element("{http://www.astron.nl/LofarSpecification}specification") + for child in spec.getchildren(): + lofar_spec.append(child) + specification_xml = etree.tostring(lofar_spec) + + logger.debug("specification after translation from trigger -> "+specification_xml) + if validationrpc.validate_specification(specification_xml): + logger.info("Translation successful") + return specification_xml + else: + raise Exception("Lofar specification validation after translation failed!") + + + + def specification_to_momspecification(self, spec): + + logger.info("Translating Lofar spec to MoM spec") + logger.debug("Specification before translation -> " + spec) + + # Remove and jsonify extra specs from specification + spectree = etree.parse(StringIO(spec.encode('UTF-8'))) + extraspectree = etree.Element("extraspec") + + for extraspec in MOM_EXTRASPECS: + elements = extraspec.split(".") + source = spectree + target = extraspectree + prevelement = None + for element in elements: + # walk to source: + source = source.find(element) + # create parents in data for misc: + if prevelement: + if target.find(prevelement) is None: + target = etree.SubElement(target, prevelement) + else: + target = target.find(prevelement) + prevelement = element + if source is not None: + source.getparent().remove(source) + target.append(source) + + # Add json text to misc element: + m = spectree.find("misc") + if m is not None: + misc = str(m.text+"\n") + else: + m = etree.SubElement(spectree.getroot(), "misc") + misc = "" + misc = misc + _jsonify(etree.tostring(extraspectree)) + m.text = misc + + # create new document with correct namespace and return xml as string: + # todo: check whether a type reference can be used to have the correct namespace on specification! + momspec = etree.Element("{http://www.astron.nl/MoM2-Lofar}observation", nsmap={}) + for child in spectree.getroot().find("activity").find("observation").getchildren(): + momspec.append(child) + + momspec_xml = etree.tostring(momspec) + logger.debug("MoM spec after translation -> " + momspec_xml) + if validationrpc.validate_mom_specification(momspec_xml): + logger.info("Translation successful") + return momspec_xml + else: + raise Exception("MoM specification validation after translation failed!") + +def create_service(servicename=SPECIFICATIONTRANSLATION_SERVICENAME, busname=SPECIFICATIONTRANSLATION_BUSNAME): + return Service(servicename, + SpecificationTranslationHandler, + busname=busname, + use_service_methods=True, + ) + + +def main(): + with create_service(): + waitForInterrupt() + diff --git a/SAS/Specification_Services/lib/translation_service_rpc.py b/SAS/Specification_Services/lib/translation_service_rpc.py new file mode 100644 index 0000000000000000000000000000000000000000..dbcf03abd7a21cd82db0968285c0ccadda1a4254 --- /dev/null +++ b/SAS/Specification_Services/lib/translation_service_rpc.py @@ -0,0 +1,28 @@ + +from lofar.messaging.RPC import RPC, RPCException, RPCWrapper +from config import SPECIFICATIONTRANSLATION_BUSNAME, SPECIFICATIONTRANSLATION_SERVICENAME +import logging +logger = logging.getLogger(__file__) + + +class TranslationRPC(RPCWrapper): + + def __init__(self, busname=SPECIFICATIONTRANSLATION_BUSNAME, + servicename=SPECIFICATIONTRANSLATION_SERVICENAME, + broker=None, + timeout=120): + super(TranslationRPC, self).__init__(busname, servicename, broker, timeout=timeout) + + + def trigger_to_specification(self, trigger_spec, trigger_id, job_priority): + logger.info("Requesting validation of trigger XML") + result = self.rpc('trigger_to_specification', trigger_spec=trigger_spec, trigger_id=trigger_id, job_priority=job_priority) + logger.info("Received validation result -> " +result) + return result + + + def specification_to_momspecification(self, spec): + logger.info("Requesting validation of trigger XML") + result = self.rpc('specification_to_momspecification', spec=spec) + logger.info("Received validation result -> " +result) + return result diff --git a/SAS/Specification_Services/lib/validation_service.py b/SAS/Specification_Services/lib/validation_service.py new file mode 100644 index 0000000000000000000000000000000000000000..ea982cad6d89ac21e2d0b0f60529a7ab0a1cb152 --- /dev/null +++ b/SAS/Specification_Services/lib/validation_service.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python + +# validation_service.py +# +# Copyright (C) 2015 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. + + +# This service validates specifications provided as XML against according XSD definitions. + + +import logging +from StringIO import StringIO +from lxml import etree +import os +from lofar.messaging import Service +from lofar.messaging.Service import MessageHandlerInterface +from lofar.common.util import waitForInterrupt + +from config import TRIGGER_XSD, LOFARSPEC_XSD, MOMSPEC_XSD, VALIDATION_SERVICENAME, VALIDATION_BUSNAME + +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + +def _validateXSD(xml, xsdpath): + '''validates given xml against given xsd file''' + + logger.debug("validating against -> " + str(xsdpath)) + logger.debug("xml -> "+xml) + pwd, file = os.path.split(os.path.realpath(__file__)) + xsdpath = pwd + "/" +xsdpath + with open(xsdpath) as xsd: + xmlschema_doc = etree.parse(xsd) + xmlschema = etree.XMLSchema(xmlschema_doc) + doc = etree.parse(StringIO(xml.encode('utf8'))) + valid = xmlschema.validate(doc) + + if not valid: + try: + xmlschema.assertValid(doc) + except Exception as err: + logger.error(err) + logger.debug("valid -> "+str(valid)) + return valid + +#class ValidationHandler(): +class ValidationHandler(MessageHandlerInterface): + def __init__(self, **kwargs): + super(ValidationHandler, self).__init__(**kwargs) + + self.service2MethodMap = { + 'validate_trigger_specification': self.validate_trigger_specification, + 'validate_specification': self.validate_specification, + 'validate_mom_specification': self.validate_mom_specification, + } + + def validate_trigger_specification(self, xml): + return str(_validateXSD(xml, TRIGGER_XSD)) + + def validate_specification(self, xml): + # todo: further checks + return str(_validateXSD(xml, LOFARSPEC_XSD)) + + def validate_mom_specification(self, xml): + # todo: further checks + return str(_validateXSD(xml, MOMSPEC_XSD)) + + + +def create_service(servicename=VALIDATION_SERVICENAME, busname=VALIDATION_BUSNAME): + return Service(servicename, + ValidationHandler, + busname=busname, + use_service_methods=True, + ) + + +def main(): + with create_service(): + waitForInterrupt() \ No newline at end of file diff --git a/SAS/Specification_Services/lib/validation_service_rpc.py b/SAS/Specification_Services/lib/validation_service_rpc.py new file mode 100644 index 0000000000000000000000000000000000000000..9ba8582da428657b9ef4ddaa6bd700da09b67de2 --- /dev/null +++ b/SAS/Specification_Services/lib/validation_service_rpc.py @@ -0,0 +1,34 @@ + +from lofar.messaging.RPC import RPC, RPCException, RPCWrapper +from config import VALIDATION_BUSNAME, VALIDATION_SERVICENAME +import logging +logger = logging.getLogger(__file__) + + +class ValidationRPC(RPCWrapper): + + def __init__(self, busname=VALIDATION_BUSNAME, + servicename=VALIDATION_SERVICENAME, + broker=None, + timeout=120): + super(ValidationRPC, self).__init__(busname, servicename, broker, timeout=timeout) + + def validate_trigger_specification(self, xml): + logger.info("Requesting validation of trigger XML") + result = self.rpc('validate_trigger_specification', xml=xml) + logger.info("Received validation result -> " +result) + return bool(result) + + def validate_specification(self, xml): + logger.info("Requesting validation of specification XML") + result = self.rpc('validate_specification', xml=xml) + logger.info("Received validation result -> " +result) + return bool(result) + + def validate_mom_specification(self, xml): + logger.info("Requesting validation of MoM specification XML") + result = self.rpc('validate_mom_specification', xml=xml) + logger.info("Received validation result -> " +result) + return bool(result) + + diff --git a/SAS/Specification_Services/test/CMakeLists.txt b/SAS/Specification_Services/test/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/SAS/Specification_Services/test/setup_queues_and_services.sh b/SAS/Specification_Services/test/setup_queues_and_services.sh new file mode 100644 index 0000000000000000000000000000000000000000..fcfd4120abf3f323c2d3299e7a61623a9c5544cc --- /dev/null +++ b/SAS/Specification_Services/test/setup_queues_and_services.sh @@ -0,0 +1,17 @@ +#/bin/sh + +echo "Setting up queues" +./qpid-config add exchange topic translationbus +./qpid-config add exchange topic specificationtranslationbus +./qpid-config add exchange topic specificationbus +./qpid-config add exchange topic triggerbus +./qpid-config add exchange topic validationbus + +echo "Starting spec service" +specificationservice & + +echo "Starting spec translation service" +specificationtranslationservice & + +echo "Starting spec validation service" +specificationvalidationservice & \ No newline at end of file diff --git a/SAS/Trigger_Services/CMakeLists.txt b/SAS/Trigger_Services/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..35e78fb6a128d4be003ea671e066f0c819c6fa1a --- /dev/null +++ b/SAS/Trigger_Services/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(TriggerReceptionService) diff --git a/SAS/Trigger_Services/TriggerReceptionService/CMakeLists.txt b/SAS/Trigger_Services/TriggerReceptionService/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..dc4f4b12f303d3152c94ba713954b332e035af69 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/CMakeLists.txt @@ -0,0 +1,9 @@ + +lofar_find_package(Python 2.7 REQUIRED) +lofar_package(sip 0.1 DEPENDS PyCommon) + +include(PythonInstall) + +add_subdirectory(lib) +add_subdirectory(bin) +add_subdirectory(test) diff --git a/SAS/Trigger_Services/TriggerReceptionService/__init__.py b/SAS/Trigger_Services/TriggerReceptionService/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/SAS/Trigger_Services/TriggerReceptionService/bin/CMakeLists.txt b/SAS/Trigger_Services/TriggerReceptionService/bin/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..a174651b633676510c572bb8b2084f3d2894ea72 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/bin/CMakeLists.txt @@ -0,0 +1,2 @@ +lofar_add_bin_scripts(triggerrestinterface) +lofar_add_bin_scripts(triggerservice) \ No newline at end of file diff --git a/SAS/Trigger_Services/TriggerReceptionService/bin/triggerrestinterface b/SAS/Trigger_Services/TriggerReceptionService/bin/triggerrestinterface new file mode 100755 index 0000000000000000000000000000000000000000..f24434e3e3bde16fe4c5221098573e7d2f5cfb7e --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/bin/triggerrestinterface @@ -0,0 +1,29 @@ +#!/bin/bash + +# Copyright (C) 2012-2015 ASTRON (Netherlands Institute for Radio Astronomy) +# P.O. Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. + + +# Startup script for the external trigger rest webservice + +echo "---" +echo "! This is for testing only, properly deploy in Apache for production use!" +echo "---" +python ../django_rest/manage.py runserver + + + diff --git a/SAS/Trigger_Services/TriggerReceptionService/bin/triggerservice b/SAS/Trigger_Services/TriggerReceptionService/bin/triggerservice new file mode 100755 index 0000000000000000000000000000000000000000..8354503b39194c53d45814ddd3062ce655cc94f0 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/bin/triggerservice @@ -0,0 +1,38 @@ +#!/usr/bin/python + +# Copyright (C) 2012-2015 ASTRON (Netherlands Institute for Radio Astronomy) +# P.O. Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. + + +# Executable for the trigger reception service +# The service glues together a bunch of services to +# - read trigger XML from Qpid, +# - validate the trigger XML through a validation service +# - authorize the action through a authorization service, +# - create a trigger entry in MoM db through MoM query service, +# - convert the trigger XML to valid LOFAR specification XML, +# - add the LOFAR specification to MoM through the LofarSpecificationService. + +from lofar.triggerservices.trigger_service import main +import sys +import logging + +logger = logging.getLogger(__name__) + +if __name__ == '__main__': + logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) + main() diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/db.sqlite3 b/SAS/Trigger_Services/TriggerReceptionService/django_rest/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..655c393e299d1d653bc0f15b07ea8325f54dcc6e Binary files /dev/null and b/SAS/Trigger_Services/TriggerReceptionService/django_rest/db.sqlite3 differ diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/manage.py b/SAS/Trigger_Services/TriggerReceptionService/django_rest/manage.py new file mode 100755 index 0000000000000000000000000000000000000000..db7262f3817cb93b7227b496948d7e6f2c9ef5b1 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "restinterface.settings") + try: + from django.core.management import execute_from_command_line + except ImportError: + # The above import may fail for some other reason. Ensure that the + # issue is really that Django is missing to avoid masking other + # exceptions on Python 2. + try: + import django + except ImportError: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) + raise + execute_from_command_line(sys.argv) diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/.name b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/.name new file mode 100644 index 0000000000000000000000000000000000000000..3bb6909635d0e9dd2250bb13e0d6b1f0cc0603f1 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/.name @@ -0,0 +1 @@ +triggerservice \ No newline at end of file diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/encodings.xml b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/encodings.xml new file mode 100644 index 0000000000000000000000000000000000000000..e206d70d8595e2a50675ba11de48efcfa012497d --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/encodings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" /> +</project> + diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/inspectionProfiles/Project_Default.xml b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000000000000000000000000000000000000..c66df0037a79ba66bcfee856db73688a71cc708e --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,11 @@ +<component name="InspectionProjectProfileManager"> + <profile version="1.0" is_locked="false"> + <option name="myName" value="Project Default" /> + <option name="myLocal" value="false" /> + <inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false"> + <option name="processCode" value="true" /> + <option name="processLiterals" value="true" /> + <option name="processComments" value="true" /> + </inspection_tool> + </profile> +</component> \ No newline at end of file diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/inspectionProfiles/profiles_settings.xml b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..3b312839bf2e939fea3ebdef15630a4b33e57caf --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,7 @@ +<component name="InspectionProjectProfileManager"> + <settings> + <option name="PROJECT_PROFILE" value="Project Default" /> + <option name="USE_PROJECT_PROFILE" value="true" /> + <version value="1.0" /> + </settings> +</component> \ No newline at end of file diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/misc.xml b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/misc.xml new file mode 100644 index 0000000000000000000000000000000000000000..a5a06bffb5d49f398b4ba0cadff6e2d5c603f832 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/misc.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7.3 (/usr/bin/python2.7)" project-jdk-type="Python SDK" /> +</project> + diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/modules.xml b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/modules.xml new file mode 100644 index 0000000000000000000000000000000000000000..6800723c32af6027a1e7c00007bfff3ed19948de --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/modules.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectModuleManager"> + <modules> + <module fileurl="file://$PROJECT_DIR$/.idea/triggerservice.iml" filepath="$PROJECT_DIR$/.idea/triggerservice.iml" /> + </modules> + </component> +</project> + diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/scopes/scope_settings.xml b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/scopes/scope_settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..922003b8433bcad6ce9778a37628d738faa26389 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ +<component name="DependencyValidationManager"> + <state> + <option name="SKIP_IMPORT_STATEMENTS" value="false" /> + </state> +</component> \ No newline at end of file diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/triggerservice.iml b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/triggerservice.iml new file mode 100644 index 0000000000000000000000000000000000000000..a34a85703f063917904e9e958b91cf9f4a2504e1 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/triggerservice.iml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="PYTHON_MODULE" version="4"> + <component name="NewModuleRootManager"> + <content url="file://$MODULE_DIR$" /> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + </component> +</module> + diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/vcs.xml b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/vcs.xml new file mode 100644 index 0000000000000000000000000000000000000000..def6a6a18457989c7d18825c7c1bbfeefc8b261d --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/vcs.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="VcsDirectoryMappings"> + <mapping directory="" vcs="" /> + </component> +</project> + diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/workspace.xml b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/workspace.xml new file mode 100644 index 0000000000000000000000000000000000000000..38834218dc87cf04b949da82500b63b2bb4a707c --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/.idea/workspace.xml @@ -0,0 +1,439 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ChangeListManager"> + <list default="true" id="916e11f9-b552-4cfd-aa22-d5d742c85ce5" name="Default" comment="" /> + <ignored path="triggerservice.iws" /> + <ignored path=".idea/workspace.xml" /> + <option name="TRACKING_ENABLED" value="true" /> + <option name="SHOW_DIALOG" value="false" /> + <option name="HIGHLIGHT_CONFLICTS" value="true" /> + <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> + <option name="LAST_RESOLUTION" value="IGNORE" /> + </component> + <component name="ChangesViewManager" flattened_view="true" show_ignored="false" /> + <component name="CreatePatchCommitExecutor"> + <option name="PATCH_PATH" value="" /> + </component> + <component name="DaemonCodeAnalyzer"> + <disable_hints /> + </component> + <component name="ExecutionTargetManager" SELECTED_TARGET="default_target" /> + <component name="FavoritesManager"> + <favorites_list name="triggerservice" /> + </component> + <component name="FileEditorManager"> + <leaf> + <file leaf-file-name="views.py" pinned="false" current="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/triggerinterface/views.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="10" column="0" selection-start="437" selection-end="437" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1065"> + <folding> + <element signature="e#0#35#0" expanded="true" /> + </folding> + </state> + </provider> + </entry> + </file> + <file leaf-file-name="settings.py" pinned="false" current="true" current-in-tab="true"> + <entry file="file://$PROJECT_DIR$/settings.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="84" column="0" selection-start="2347" selection-end="2347" vertical-scroll-proportion="0.14239483" vertical-offset="1128" max-vertical-offset="2100"> + <folding /> + </state> + </provider> + </entry> + </file> + <file leaf-file-name="serializers.py" pinned="false" current="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/triggerinterface/serializers.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="17" column="0" selection-start="587" selection-end="587" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="405"> + <folding /> + </state> + </provider> + </entry> + </file> + <file leaf-file-name="mom.py" pinned="false" current="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/triggerinterface/mom.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="3" column="30" selection-start="61" selection-end="61" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="675"> + <folding /> + </state> + </provider> + </entry> + </file> + <file leaf-file-name="models.py" pinned="false" current="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/triggerinterface/models.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="6" column="28" selection-start="160" selection-end="160" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="285"> + <folding /> + </state> + </provider> + </entry> + </file> + <file leaf-file-name="urls.py" pinned="false" current="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/urls.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="16" column="0" selection-start="649" selection-end="649" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="525"> + <folding /> + </state> + </provider> + </entry> + </file> + </leaf> + </component> + <component name="FindManager"> + <FindUsagesManager> + <setting name="OPEN_NEW_TAB" value="false" /> + </FindUsagesManager> + </component> + <component name="IdeDocumentHistory"> + <option name="changedFiles"> + <list> + <option value="$PROJECT_DIR$/urls.py" /> + <option value="$PROJECT_DIR$/triggerinterface/models.py" /> + <option value="$PROJECT_DIR$/triggerinterface/serializers.py" /> + <option value="$PROJECT_DIR$/settings.py" /> + <option value="$PROJECT_DIR$/triggerinterface/views.py" /> + <option value="$PROJECT_DIR$/triggerinterface/mom.py" /> + </list> + </option> + </component> + <component name="ProjectFrameBounds"> + <option name="width" value="1920" /> + <option name="height" value="1055" /> + </component> + <component name="ProjectLevelVcsManager" settingsEditedManually="false"> + <OptionsSetting value="true" id="Add" /> + <OptionsSetting value="true" id="Remove" /> + <OptionsSetting value="true" id="Checkout" /> + <OptionsSetting value="true" id="Update" /> + <OptionsSetting value="true" id="Status" /> + <OptionsSetting value="true" id="Edit" /> + <ConfirmationsSetting value="0" id="Add" /> + <ConfirmationsSetting value="0" id="Remove" /> + </component> + <component name="ProjectReloadState"> + <option name="STATE" value="0" /> + </component> + <component name="ProjectView"> + <navigator currentView="ProjectPane" proportions="" version="1" splitterProportion="0.5"> + <flattenPackages /> + <showMembers /> + <showModules /> + <showLibraryContents /> + <hideEmptyPackages /> + <abbreviatePackageNames /> + <autoscrollToSource /> + <autoscrollFromSource /> + <sortByType /> + </navigator> + <panes> + <pane id="ProjectPane"> + <subPane> + <PATH> + <PATH_ELEMENT> + <option name="myItemId" value="triggerservice" /> + <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" /> + </PATH_ELEMENT> + </PATH> + <PATH> + <PATH_ELEMENT> + <option name="myItemId" value="triggerservice" /> + <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" /> + </PATH_ELEMENT> + <PATH_ELEMENT> + <option name="myItemId" value="triggerservice" /> + <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> + </PATH_ELEMENT> + </PATH> + <PATH> + <PATH_ELEMENT> + <option name="myItemId" value="triggerservice" /> + <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" /> + </PATH_ELEMENT> + <PATH_ELEMENT> + <option name="myItemId" value="triggerservice" /> + <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> + </PATH_ELEMENT> + <PATH_ELEMENT> + <option name="myItemId" value="triggerinterface" /> + <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> + </PATH_ELEMENT> + </PATH> + </subPane> + </pane> + <pane id="Scope" /> + </panes> + </component> + <component name="PropertiesComponent"> + <property name="last_opened_file_path" value="$PROJECT_DIR$/../../SIP-lib" /> + </component> + <component name="RunManager"> + <configuration default="true" type="PythonConfigurationType" factoryName="Python"> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="" /> + <option name="IS_MODULE_SDK" value="false" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <module name="triggerservice" /> + <option name="SCRIPT_NAME" value="" /> + <option name="PARAMETERS" value="" /> + <method /> + </configuration> + <configuration default="true" type="tests" factoryName="Unittests"> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs /> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="" /> + <option name="IS_MODULE_SDK" value="false" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <module name="triggerservice" /> + <option name="SCRIPT_NAME" value="" /> + <option name="CLASS_NAME" value="" /> + <option name="METHOD_NAME" value="" /> + <option name="FOLDER_NAME" value="" /> + <option name="TEST_TYPE" value="TEST_SCRIPT" /> + <option name="PATTERN" value="" /> + <option name="USE_PATTERN" value="false" /> + <option name="PUREUNITTEST" value="true" /> + <option name="PARAMS" value="" /> + <option name="USE_PARAM" value="false" /> + <method /> + </configuration> + <configuration default="true" type="tests" factoryName="py.test"> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs /> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="" /> + <option name="IS_MODULE_SDK" value="false" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <module name="triggerservice" /> + <option name="SCRIPT_NAME" value="" /> + <option name="CLASS_NAME" value="" /> + <option name="METHOD_NAME" value="" /> + <option name="FOLDER_NAME" value="" /> + <option name="TEST_TYPE" value="TEST_SCRIPT" /> + <option name="PATTERN" value="" /> + <option name="USE_PATTERN" value="false" /> + <option name="testToRun" value="" /> + <option name="keywords" value="" /> + <option name="params" value="" /> + <option name="USE_PARAM" value="false" /> + <option name="USE_KEYWORD" value="false" /> + <method /> + </configuration> + <configuration default="true" type="tests" factoryName="Attests"> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs /> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="" /> + <option name="IS_MODULE_SDK" value="false" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <module name="triggerservice" /> + <option name="SCRIPT_NAME" value="" /> + <option name="CLASS_NAME" value="" /> + <option name="METHOD_NAME" value="" /> + <option name="FOLDER_NAME" value="" /> + <option name="TEST_TYPE" value="TEST_SCRIPT" /> + <option name="PATTERN" value="" /> + <option name="USE_PATTERN" value="false" /> + <method /> + </configuration> + <configuration default="true" type="tests" factoryName="Doctests"> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs /> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="" /> + <option name="IS_MODULE_SDK" value="false" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <module name="triggerservice" /> + <option name="SCRIPT_NAME" value="" /> + <option name="CLASS_NAME" value="" /> + <option name="METHOD_NAME" value="" /> + <option name="FOLDER_NAME" value="" /> + <option name="TEST_TYPE" value="TEST_SCRIPT" /> + <option name="PATTERN" value="" /> + <option name="USE_PATTERN" value="false" /> + <method /> + </configuration> + <configuration default="true" type="tests" factoryName="Nosetests"> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs /> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="" /> + <option name="IS_MODULE_SDK" value="false" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <module name="triggerservice" /> + <option name="SCRIPT_NAME" value="" /> + <option name="CLASS_NAME" value="" /> + <option name="METHOD_NAME" value="" /> + <option name="FOLDER_NAME" value="" /> + <option name="TEST_TYPE" value="TEST_SCRIPT" /> + <option name="PATTERN" value="" /> + <option name="USE_PATTERN" value="false" /> + <option name="PARAMS" value="" /> + <option name="USE_PARAM" value="false" /> + <method /> + </configuration> + <list size="0" /> + </component> + <component name="ShelveChangesManager" show_recycled="false" /> + <component name="TaskManager"> + <task active="true" id="Default" summary="Default task"> + <changelist id="916e11f9-b552-4cfd-aa22-d5d742c85ce5" name="Default" comment="" /> + <created>1478766676565</created> + <updated>1478766676565</updated> + </task> + <servers /> + </component> + <component name="ToolWindowManager"> + <frame x="0" y="0" width="1920" height="1055" extended-state="0" /> + <editor active="true" /> + <layout> + <window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> + <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.24869384" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" /> + <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" /> + <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" /> + <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> + <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> + <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> + <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> + <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> + <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" /> + <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" /> + <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> + <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> + <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" /> + <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" /> + <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> + <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> + </layout> + </component> + <component name="Vcs.Log.UiProperties"> + <option name="RECENTLY_FILTERED_USER_GROUPS"> + <collection /> + </option> + </component> + <component name="VcsContentAnnotationSettings"> + <option name="myLimit" value="2678400000" /> + </component> + <component name="VcsManagerConfiguration"> + <option name="myTodoPanelSettings"> + <TodoPanelSettings /> + </option> + </component> + <component name="XDebuggerManager"> + <breakpoint-manager /> + </component> + <component name="editorHistoryManager"> + <entry file="file://$PROJECT_DIR$/triggerinterface/views.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="9" column="22" selection-start="416" selection-end="416" vertical-scroll-proportion="0.0" vertical-offset="135" max-vertical-offset="1065"> + <folding> + <element signature="e#0#35#0" expanded="true" /> + </folding> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/settings.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="86" column="5" selection-start="2375" selection-end="2375" vertical-scroll-proportion="0.0" vertical-offset="1203" max-vertical-offset="2100"> + <folding /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/triggerinterface/serializers.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="3" column="0" selection-start="99" selection-end="99" vertical-scroll-proportion="0.0" vertical-offset="45" max-vertical-offset="420"> + <folding /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/triggerinterface/mom.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="26" column="0" selection-start="635" selection-end="635" vertical-scroll-proportion="0.0" vertical-offset="390" max-vertical-offset="675"> + <folding /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/triggerinterface/models.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="8" column="48" selection-start="258" selection-end="258" vertical-scroll-proportion="0.0" vertical-offset="120" max-vertical-offset="315"> + <folding /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/urls.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="31" column="0" selection-start="1202" selection-end="1202" vertical-scroll-proportion="0.0" vertical-offset="465" max-vertical-offset="555"> + <folding /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/triggerinterface/apps.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="929" /> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/triggerinterface/views.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="10" column="0" selection-start="437" selection-end="437" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1065"> + <folding> + <element signature="e#0#35#0" expanded="true" /> + </folding> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/triggerinterface/serializers.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="17" column="0" selection-start="587" selection-end="587" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="405"> + <folding /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/triggerinterface/mom.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="3" column="30" selection-start="61" selection-end="61" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="675"> + <folding /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/triggerinterface/models.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="6" column="28" selection-start="160" selection-end="160" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="285"> + <folding /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/urls.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="16" column="0" selection-start="649" selection-end="649" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="525"> + <folding /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/settings.py"> + <provider selected="true" editor-type-id="text-editor"> + <state line="84" column="0" selection-start="2347" selection-end="2347" vertical-scroll-proportion="0.14239483" vertical-offset="1128" max-vertical-offset="2100"> + <folding /> + </state> + </provider> + </entry> + </component> +</project> + diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/__init__.py b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/credentials.py b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/credentials.py new file mode 100644 index 0000000000000000000000000000000000000000..7a459457fe3b396245d0cb1166376115ce28b4fa --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/credentials.py @@ -0,0 +1,9 @@ +SECRET_KEY = 'c0m_v*ghv5-^+xy@dm7-skg5d7#q(q+*pl!@rie)6+h$ln!zoi' + +AUTH_LDAP_SERVER_URI = "ldaps://webportal.astron.nl:30636" +#AUTH_LDAP_SERVER_URI = "ldaps://dop225.astron.nl:636" +#AUTH_LDAP_SERVER_URI = "ldap://10.87.2.225" +AUTH_LDAP_USER_DN_TEMPLATE="uid=%(user)s,ou=Users,o=lofar,c=eu?cn" + +AUTH_LDAP_BIND_DN = "cn=ltadownload,o=services" +AUTH_LDAP_BIND_PASSWORD = "<redacted>" diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/settings.py b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/settings.py new file mode 100644 index 0000000000000000000000000000000000000000..8d4545d5ed512522ee3b5a24738f0e0cd37aac5a --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/settings.py @@ -0,0 +1,189 @@ +""" +Django settings for the trigger rest interface project. + +Generated by 'django-admin startproject' using Django 1.10.3. + +For more information on this file, see +https://docs.djangoproject.com/en/1.10/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.10/ref/settings/ +""" + +import os +import ldap +import credentials +import logging +logger = logging.getLogger('django_auth_ldap') +logger.addHandler(logging.StreamHandler()) +logger.setLevel(logging.INFO) + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = credentials.SECRET_KEY + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'rest_framework', + 'restinterface' +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'restinterface.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'restinterface.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/1.10/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), #':memory:', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/1.10/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.10/howto/static-files/ + +STATIC_URL = BASE_DIR+'/static/' + + +REST_FRAMEWORK = { + + 'DEFAULT_PARSER_CLASSES': ( + 'rest_framework_xml.parsers.XMLParser', + 'rest_framework.parsers.JSONParser', + ), + 'DEFAULT_RENDERER_CLASSES': ( + 'rest_framework.renderers.BrowsableAPIRenderer', + 'rest_framework_xml.renderers.XMLRenderer', + 'rest_framework.renderers.JSONRenderer', + ), + + 'DEFAULT_AUTHENTICATION_CLASSES': ( + 'rest_framework.authentication.BasicAuthentication', + 'rest_framework.authentication.SessionAuthentication', + ), + #'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',), + 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.AllowAny',), # todo: CHANGE FOR PRODUCTION TO --> IsAuthenticated + #'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated',), + 'PAGE_SIZE': 10, +} + +# LDAP DEBUG: +#import logging, logging.handlers +#logfile = "/tmp/django-ldap-debug.log" +#my_logger = logging.getLogger('django_auth_ldap') +#my_logger.setLevel(logging.DEBUG) +#handler = logging.handlers.RotatingFileHandler( +# logfile, maxBytes=1024 * 500, backupCount=5) +#my_logger.addHandler(handler) +#import ldap +#print "---" +#server = 'ldap://10.87.2.225' +#user_dn = credentials.AUTH_LDAP_BIND_DN +#password = credentials.AUTH_LDAP_BIND_PASSWORD +#con = ldap.initialize(server) +#print "---" +#con.simple_bind_s(user_dn, password) +#print "---" + +#AUTH_LDAP_CONNECTION_OPTIONS = { ldap.OPT_X_TLS_REQUIRE_CERT : ldap.OPT_X_TLS_NEVER } +AUTH_LDAP_SERVER_URI = credentials.AUTH_LDAP_SERVER_URI +AUTH_LDAP_BIND_DN = credentials.AUTH_LDAP_BIND_DN +AUTH_LDAP_BIND_PASSWORD = credentials.AUTH_LDAP_BIND_PASSWORD +AUTH_LDAP_USER_DN_TEMPLATE = credentials.AUTH_LDAP_USER_DN_TEMPLATE +#AUTH_LDAP_CACHE_GROUPS = True +#AUTH_LDAP_GROUP_CACHE_TIMEOUT = 3600 + +AUTH_LDAP_USER_ATTR_MAP = { + "first_name": "givenName", + "last_name": "sn", + "email": "mail" +} + + +AUTHENTICATION_BACKENDS = ( + 'django_auth_ldap.backend.LDAPBackend', + 'django.contrib.auth.backends.ModelBackend', +) diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/__init__.py b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/admin.py b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/admin.py new file mode 100644 index 0000000000000000000000000000000000000000..8c38f3f3dad51e4585f3984282c2a4bec5349c1e --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/apps.py b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/apps.py new file mode 100644 index 0000000000000000000000000000000000000000..f507d9de68cacd4e5f8f33aedd8ea138c1d32559 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/apps.py @@ -0,0 +1,7 @@ +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class TriggerinterfaceConfig(AppConfig): + name = 'triggerinterface' diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/migrations/__init__.py b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/migrations/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/models.py b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/models.py new file mode 100644 index 0000000000000000000000000000000000000000..762d0536e82467b131664dcc9b271983ea53807d --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/models.py @@ -0,0 +1,28 @@ +""" +This is a stub. Currently not used, but can be implemented to get some better control on data in the interface, +do type checks, conversion, configure defaults, etc. +""" + + +from __future__ import unicode_literals +from django.db import models +from django.utils import timezone + +# Create your models here. + +class Trigger(models.Model): + + pass # see note above + + # read-only: + #submittedby= models.CharField(max_length=200,default='request.user', editable=False) + #receivedat = models.DateTimeField(max_length=200,default=timezone.now, editable=False) + # view_injected_get = models.CharField(max_length=200) # injection example + + # writable: + #project_id = models.CharField(max_length=200) + #metadata = models.CharField(max_length=20000, blank=True) + #station_list = models.CharField(max_length=2000, blank=True) + #qos = models.CharField(max_length=2000, blank=True ) + #spec = models.CharField(max_length=20000) + #priority = models.IntegerField(max_length=200, default = 1000) diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/serializers.py b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/serializers.py new file mode 100644 index 0000000000000000000000000000000000000000..81dd88583fc609d3d9d9cd2da7af0e5e259c7c2b --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/serializers.py @@ -0,0 +1,39 @@ +""" +This is a stub. +Currently not used, but can be implemented to populate and validate the trigger data model. +Check views.py for data parsing and rendering on get/post. +""" + + +from rest_framework import serializers +from models import Trigger +from rest_framework_xml.renderers import XMLRenderer +from django.utils import timezone + +import trigger_handler +import logging +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + + +class TriggerSerializer(serializers.ModelSerializer): + + #submittedby= serializers.CharField(max_length=200, read_only=True) + #receivedat = serializers.DateTimeField(default=timezone.now) + + def save(self, user): + logger.debug('saving data') + logger.debug('data ->' + str(self.data)) + logger.debug('validated data ->' + str(self.validated_data)) + logger.debug('fields ->' + str(self.fields)) + logger.debug('errors ->' + str(self.errors)) + logger.debug('rendering XML') + xml = XMLRenderer().render(self.validated_data) + logger.debug('calling trigger handler') + id = trigger_handler.handle_trigger(user, xml) + return id + + class Meta: + model = Trigger + fields = '__all__' + diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/tests.py b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/tests.py new file mode 100644 index 0000000000000000000000000000000000000000..7ce503c2dd97ba78597f6ff6e4393132753573f6 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/views.py b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/views.py new file mode 100644 index 0000000000000000000000000000000000000000..ca6fb0923a5a9bdfe637004307ba787b4e251556 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/triggerinterface/views.py @@ -0,0 +1,136 @@ +""" +Handles GET / POST requests by users. +""" + + +from rest_framework import viewsets +from rest_framework import views +from rest_framework.response import Response +from rest_framework import status +#from serializers import TriggerSerializer +from rest_framework.renderers import JSONRenderer +from rest_framework.parsers import JSONParser +from rest_framework_xml.parsers import XMLParser +from rest_framework_xml.renderers import XMLRenderer + +from io import BytesIO +from rest_framework.fields import CurrentUserDefault +from lxml import etree +from StringIO import StringIO + +form lofar.triggerservices.trigger_service_rpc import TriggerRPC +from lofar.specificationservices.specification_service_rpc import SpecificationRPC + +import logging +import traceback +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + + +class TriggerListView(views.APIView): + + def get(self,request, format=None, **kwargs): + logger.debug('got GET from -> '+str(request.META['REMOTE_ADDR'])) + return Response("Listing not implemented yet, sorry! Post trigger XML on this URL to add a new trigger.", status=status.HTTP_501_NOT_IMPLEMENTED) + + + + def post(self, request, format=None, **kwargs): + logger.debug('got POST from -> '+str(request.META['REMOTE_ADDR'])) + #logger.debug('received text -> '+str(request.body)) + #logger.debug('received data -> '+str(request.data)) + logger.debug('from user -> '+str( request.user)) + + + # OPTIONALLY USE DATA MODEL: + #serializer = TriggerSerializer(data=request.data) + #logger.debug('data is valid -> ' +str(serializer.is_valid())) + #if serializer.is_valid(): + # id = serializer.save(request.user) + # #r = serializer.validated_data + # #r["trigger_id"]=id + + # EITHER: RENDER FRESH XML FROM PARSED DATA: + #xml = XMLRenderer().render(request.data) # ! django replaces the root element + #xml = self._renameXMLroot(xml, "lofar:trigger") + #print xml + + # OR: USE RECEIVED XML DIRECTLY: + xml = str(request.body) + + + logger.debug('calling trigger handler') + try: + id = self._handle_trigger(request.user, xml) + except Exception as err: + traceback.print_exc() + return Response('Provided data has some issues! (Details: '+str(err)+")", status=status.HTTP_400_BAD_REQUEST) + # for use with data model: return Response('Provided data has some issues: ' +str(serializer.errors)+" (Accepted were: "+str(serializer.data)+")", status=status.HTTP_400_BAD_REQUEST) + + + return Response(id, status=status.HTTP_201_CREATED) + + def _renameXMLroot(self, xml, newname): + root = etree.parse(StringIO(xml)) + root.tag = newname + return etree.tostring(root) + + def _handle_trigger(self, user, xml): + return TriggerRPC.handle_trigger(user, xml) + + +class TriggerView(views.APIView): + + + #def post(self, request, format=None, **kwargs): + # return Response("It is not possible to alter an existing trigger (i.e. POST for an existing trigger ID), sorry!", status=status.HTTP_405_METHOD_NOT_ALLOWED) + + + def get(self,request, format=None, **kwargs): + logger.debug('got GET from: '+str(request.META['REMOTE_ADDR'])) + try: + if 'pk' in kwargs: + identifier = kwargs.get('pk') + logger.info('requested id is: '+str(id)) + logger.info('requesting user is:'+ str(request.user)) + + xml = self._get_specification(identifier) + + # EITHER DIRECT RESPONSE: + return Response(xml) + + # OR USE DATA MODEL: + # data = XMLParser().parse(BytesIO(xml)) + + # example: data injection with validation: + # data['view_injected_get'] = 'pre-serializing' + + #serializer = TriggerSerializer(data=data) + #logger.debug('returning valid data:' + str(serializer.is_valid())) + #r = serializer.validated_data + + # example: data injection after validation: + # r['view_injected_get_2'] = 'post-validation' + + #return Response(r) + else: + return Response("No ID provided!") + except Exception as err: + print err + return Response("Unable to retrieve the requested trigger, sorry!", status=status.HTTP_404_NOT_FOUND) + + + def _get_specification(self, identifier): + + logger.info("Getting spec from specification service") + + response = SpecificationRPC.get_specification(identifier) + return response + + # test json data: + #json = '{"project_id": "p1", "triggerid": "t1", "triggerxml": "<trigger />", "status": "new", "momid": "m1", "sasid": "s1", "submittedby":"user"}' + #stream = BytesIO(json) + #data = JSONParser().parse(stream) + # return XMLRenderer().render(data) + + diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/urls.py b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..f8367292e911cffd1fe22d6439341a4efc1759c4 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/urls.py @@ -0,0 +1,31 @@ +"""restinterface URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/1.10/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.conf.urls import url, include + 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) +""" + + +from django.conf.urls import url, include +from rest_framework import routers +from triggerinterface.views import TriggerListView, TriggerView + +router = routers.DefaultRouter() + +# Wire up our API using automatic URL routing. +# Additionally, we include login URLs for the browsable API. +urlpatterns = [ + url(r'^', include(router.urls)), + url(r'^triggers/$', TriggerListView.as_view()), + url(r'^triggers/(?P<pk>[0-9]+)/$', TriggerView.as_view()), + url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) +] diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/wsgi.py b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/wsgi.py new file mode 100644 index 0000000000000000000000000000000000000000..2e66ebf284a882d31b630103305d9345a40850ef --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/restinterface/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for triggerservice project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "restinterface.settings") + +application = get_wsgi_application() diff --git a/SAS/Trigger_Services/TriggerReceptionService/django_rest/urls.py b/SAS/Trigger_Services/TriggerReceptionService/django_rest/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..4cb07ff2e69264a2b059be4a9521c83ad52fed90 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/django_rest/urls.py @@ -0,0 +1,25 @@ +from django.conf.urls import url, include +from django.contrib.auth.models import User +from rest_framework import routers, serializers, viewsets + +# Serializers define the API representation. +class UserSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = User + fields = ('url', 'username', 'email', 'is_staff') + +# ViewSets define the view behavior. +class UserViewSet(viewsets.ModelViewSet): + queryset = User.objects.all() + serializer_class = UserSerializer + +# Routers provide an easy way of automatically determining the URL conf. +router = routers.DefaultRouter() +router.register(r'users', UserViewSet) + +# Wire up our API using automatic URL routing. +# Additionally, we include login URLs for the browsable API. +urlpatterns = [ + url(r'^', include(router.urls)), + url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) +] diff --git a/SAS/Trigger_Services/TriggerReceptionService/lib/CMakeLists.txt b/SAS/Trigger_Services/TriggerReceptionService/lib/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..5ff5fef8c959439108fab2958ad6de4f25c328cb --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/lib/CMakeLists.txt @@ -0,0 +1,11 @@ +lofar_find_package(Python 2.7 REQUIRED) +include(PythonInstall) + +set(_py_files + trigger_service.py + trigger_service_rpc.py + config.py + ) + +python_install(${_py_files} + DESTINATION lofar/triggerservices) \ No newline at end of file diff --git a/SAS/Trigger_Services/TriggerReceptionService/lib/__init__.py b/SAS/Trigger_Services/TriggerReceptionService/lib/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/SAS/Trigger_Services/TriggerReceptionService/lib/config.py b/SAS/Trigger_Services/TriggerReceptionService/lib/config.py new file mode 100644 index 0000000000000000000000000000000000000000..8632b3f747dc2a4fb99f1fda0165aab732df73c2 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/lib/config.py @@ -0,0 +1,21 @@ + +""" Config file for trigger services. """ + +# Messaging + +CONNECTION_STRING = '127.0.0.1' + +MOMQUERY_BUSNAME = "momquerybus" +MOMQUERY_SERVICENAME = "momqueryservice" + +VALIDATION_BUSNAME = "validationbus" +VALIDATION_SERVICENAME = "validationservice" + +SPECIFICATION_BUSNAME = "specificationbus" +SPECIFICATION_SERVICENAME = "specificationservice" + +SPECIFICATIONTRANSLATION_BUSNAME = "specificationtranslationbus" +SPECIFICATIONTRANSLATION_SERVICENAME = "specificationtranslationservice" + +TRIGGER_BUSNAME = "triggerbus" +TRIGGER_SERVICENAME = "triggerservice" diff --git a/SAS/Trigger_Services/TriggerReceptionService/lib/trigger_service.py b/SAS/Trigger_Services/TriggerReceptionService/lib/trigger_service.py new file mode 100644 index 0000000000000000000000000000000000000000..cd46427368e683fe8ab88a50c8d9c37ab8c88bc4 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/lib/trigger_service.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python + +# trigger_handler.py +# +# Copyright (C) 2015 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. + + +from StringIO import StringIO +from lxml import etree + +from lofar.messaging import Service +from lofar.messaging.Service import MessageHandlerInterface +from lofar.common.util import waitForInterrupt + +from lofar.mom.momqueryservice.momqueryrpc import MoMQueryRPC +from lofar.specificationservices.specification_service_rpc import SpecificationRPC +from lofar.specificationservices.validation_service_rpc import ValidationRPC +from lofar.specificationservices.translation_service_rpc import TranslationRPC + +from config import MOMQUERY_BUSNAME, MOMQUERY_SERVICENAME, SPECIFICATION_BUSNAME, SPECIFICATION_SERVICENAME, VALIDATION_BUSNAME, VALIDATION_SERVICENAME, SPECIFICATIONTRANSLATION_BUSNAME, SPECIFICATIONTRANSLATION_SERVICENAME, TRIGGER_SERVICENAME, TRIGGER_BUSNAME + +import logging +logger = logging.getLogger(__name__) + +momqueryrpc = MoMQueryRPC(MOMQUERY_BUSNAME, MOMQUERY_SERVICENAME) +validationrpc = ValidationRPC(VALIDATION_BUSNAME, VALIDATION_SERVICENAME) +specificationrpc = SpecificationRPC(SPECIFICATION_BUSNAME, SPECIFICATION_SERVICENAME) +translationrpc = TranslationRPC(SPECIFICATIONTRANSLATION_BUSNAME, SPECIFICATIONTRANSLATION_SERVICENAME) + + +def _auth_allows_triggers(project): + # todo: momqueryrpc.authAllowsTriggers(project) + return True + + +def _validate_trigger(trigger_xml): + return validationrpc.validate_trigger_specification(trigger_xml) + + +def _validate_lofarspec(lofar_xml): + return validationrpc.validate_specification(lofar_xml) + +def _add_trigger(trigger_xml): + logger.info("Adding trigger") + # trigger_id = momqueryrp.addTrigger(xml) + trigger_id = 42 + return trigger_id + +def _get_job_priority(project): + # prio = momqueryrp.getProjectPriority(project) + prio = 20 + return prio + +def _add_specification(user, lofar_xml): + logger.info("Sending spec to specification service") + specificationrpc.add_specification(user, lofar_xml) + + +def _translate_trigger_to_specification(trigger_xml, trigger_id, job_priority): + logger.info("translating trigger to spec") + specification_xml = translationrpc.trigger_to_specification(trigger_xml, trigger_id, job_priority) + return specification_xml + + +def _send_notification(text): + logger.info("sending notification") + # todo: send notification to bus + + +def _parse_project_id(trigger_xml): + doc = etree.parse(StringIO(trigger_xml.encode('utf-8'))) + ref = doc.find("projectReference") + return ref.find("identifier").find("identifier").text + +class TriggerHandler(MessageHandlerInterface): + + def __init__(self, **kwargs): + super(TriggerHandler, self).__init__(**kwargs) + + self.service2MethodMap = { + 'handle_trigger': self.handle_trigger, + } + + def handle_trigger(self, user, trigger_xml): + logger.info("Handling trigger from user -> "+str(user)) + trigger_id = None + if _validate_trigger(trigger_xml): + logger.info("Trigger XML is valid") + project = _parse_project_id(trigger_xml) + logger.debug('project is -> ' + str(project)) + priority = _get_job_priority(project) #todo: how to determine job_prio based on project prio? Consider priority from trigger xml? + logger.debug('project priority is ->' + str(priority)) + if _auth_allows_triggers(project): + logger.info("trigger is authorized, adding to trigger and specification") + trigger_id = _add_trigger(trigger_xml) + logger.debug("Trigger was assigned id -> "+str(trigger_id)) + if trigger_id: + lofar_xml = _translate_trigger_to_specification(trigger_xml, trigger_id, priority) + if _validate_lofarspec(lofar_xml): + logger.debug("Lofar specification is valid!") + _add_specification(user, lofar_xml) + else: + msg = "Translation to Lofar specification failed!" + logger.error(msg) + raise Exception(msg) + else: + msg = "There was a problem adding the trigger!" + logger.error(msg) + raise Exception(msg) + else: + msg = "Trigger authorization failed!" + logger.error(msg) + raise Exception(msg) + + else: + msg = "Got invalid trigger XML" + logger.error(msg) + raise Exception(msg) + + logger.info("trigger handling done. -> "+str(trigger_id)) + return str(trigger_id) + +def create_service(servicename=TRIGGER_SERVICENAME, busname=TRIGGER_BUSNAME): + return Service(servicename, + TriggerHandler, + busname=busname, + use_service_methods=True, + ) + + +def main(): + with create_service(): + waitForInterrupt() + diff --git a/SAS/Trigger_Services/TriggerReceptionService/lib/trigger_service_rpc.py b/SAS/Trigger_Services/TriggerReceptionService/lib/trigger_service_rpc.py new file mode 100644 index 0000000000000000000000000000000000000000..8950742932b3238a99d326f6084189473c3e0ea8 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/lib/trigger_service_rpc.py @@ -0,0 +1,21 @@ + +from lofar.messaging.RPC import RPC, RPCException, RPCWrapper +from config import TRIGGER_BUSNAME, TRIGGER_SERVICENAME +import logging +logger = logging.getLogger(__file__) + + +class TriggerRPC(RPCWrapper): + + def __init__(self, busname=TRIGGER_BUSNAME, + servicename=TRIGGER_SERVICENAME, + broker=None, + timeout=120): + super(TriggerRPC, self).__init__(busname, servicename, broker, timeout=timeout) + + + def handle_trigger(self, user, trigger_xml): + logger.info("Requesting handling of trigger") + result = self.rpc('handle_trigger', user=user, trigger_xml=trigger_xml) + logger.info("Received trigger handling result -> " +result) + return result diff --git a/SAS/Trigger_Services/TriggerReceptionService/test/CMakeLists.txt b/SAS/Trigger_Services/TriggerReceptionService/test/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/SAS/Trigger_Services/TriggerReceptionService/test/setup_queues_and_services.sh b/SAS/Trigger_Services/TriggerReceptionService/test/setup_queues_and_services.sh new file mode 100644 index 0000000000000000000000000000000000000000..a40643b3c0a0bfe1624f2fcfd00d22148e3c6a1f --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/test/setup_queues_and_services.sh @@ -0,0 +1,7 @@ +#/bin/sh + +echo "Setting up queues" +./qpid-config add exchange topic triggerbus + +echo "Starting trigger service" +triggerservice & \ No newline at end of file diff --git a/SAS/Trigger_Services/TriggerReceptionService/test/trigger-testing.xml b/SAS/Trigger_Services/TriggerReceptionService/test/trigger-testing.xml new file mode 100644 index 0000000000000000000000000000000000000000..2cda3788b5a5798652e10b2bb718b3476849f131 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/test/trigger-testing.xml @@ -0,0 +1,143 @@ +<?xml version="1.0" encoding="UTF-8"?> +<p:trigger xmlns:p="http://www.astron.nl/LofarTrigger" xmlns:p1="http://www.astron.nl/LofarBase" xmlns:p2="http://www.astron.nl/LofarSpecification" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.astron.nl/LofarTrigger LofarTrigger.xsd "> + <version>version</version> + <name>name</name> + <description>description</description> + <projectReference> + <identifier> + <source>source</source> + <identifier>0</identifier> + <description>description</description> + </identifier> + </projectReference> + <submitter> + <name>name</name> + <email>email</email> + <affiliation>affiliation</affiliation> + </submitter> + <userName>userName</userName> + <comment>comment</comment> + <qualityOfService>THROUGHPUT</qualityOfService> + <event> + <identification>identification</identification> + <description>description</description> + <type>VOEvent</type> + </event> + <specification> + <version>version</version> + <projectReference> + <identifier> + <source>source</source> + <identifier>0</identifier> + <description>description</description> + </identifier> + </projectReference> + <userName>userName</userName> + <comment>comment</comment> + <generatorVersion>generatorVersion</generatorVersion> + <priority>0</priority> + <qualityOfService>THROUGHPUT</qualityOfService> + <container> + <temporaryIdentifier> + <source>source</source> + <identifier>0</identifier> + <description>description</description> + </temporaryIdentifier> + <folder> + <name>name</name> + <description>description</description> + <topology>topology</topology> + </folder> + </container> + <activity> + <temporaryIdentifier> + <source>source</source> + <identifier>0</identifier> + <description>description</description> + </temporaryIdentifier> + <observation> + <name>name</name> + <description>description</description> + <processingCluster> + <name>name</name> + <partition>partition</partition> + <numberOfTasks>0</numberOfTasks> + <minRAMPerTask unit="byte">0</minRAMPerTask> + <minScratchPerTask unit="byte">0</minScratchPerTask> + <maxDurationPerTask>P1D</maxDurationPerTask> + <numberOfCoresPerTask>0</numberOfCoresPerTask> + <runSimultaneous>true</runSimultaneous> + </processingCluster> + <instrument>Beam Observation</instrument> + <defaultTemplate>defaultTemplate</defaultTemplate> + <tbbPiggybackAllowed>true</tbbPiggybackAllowed> + <aartfaacPiggybackAllowed>true</aartfaacPiggybackAllowed> + <correlatedData>true</correlatedData> + <filteredData>true</filteredData> + <beamformedData>true</beamformedData> + <coherentStokesData>true</coherentStokesData> + <incoherentStokesData>true</incoherentStokesData> + <antenna>HBA Zero</antenna> + <clock mode="160 MHz"> + <channelWidth unit="Hz">0.0</channelWidth> + <samplesPerSecond>0.0</samplesPerSecond> + <subbandWidth unit="Hz">0.0</subbandWidth> + <systemClock unit="Hz">0.0</systemClock> + </clock> + <instrumentFilter>10-70 MHz</instrumentFilter> + <integrationInterval>0.0</integrationInterval> + <channelsPerSubband>0</channelsPerSubband> + <coherentDedisperseChannels>true</coherentDedisperseChannels> + <tiedArrayBeams> + <flyseye>true</flyseye> + <nrTabRings>0</nrTabRings> + <tabRingSize>0.0</tabRingSize> + <tiedArrayBeamList> + <pencilBeam index="0"> + <angle1>0.0</angle1> + <angle2>0.0</angle2> + </pencilBeam> + </tiedArrayBeamList> + </tiedArrayBeams> + <stokes> + <integrateChannels>true</integrateChannels> + <subbandsPerFileCS>0</subbandsPerFileCS> + <numberCollapsedChannelsCS>0</numberCollapsedChannelsCS> + <stokesDownsamplingStepsCS>0</stokesDownsamplingStepsCS> + <whichCS>I</whichCS> + <subbandsPerFileIS>0</subbandsPerFileIS> + <numberCollapsedChannelsIS>0</numberCollapsedChannelsIS> + <stokesDownsamplingStepsIS>0</stokesDownsamplingStepsIS> + <whichIS>I</whichIS> + </stokes> + <bypassPff>true</bypassPff> + <enableSuperterp>true</enableSuperterp> + <numberOfBitsPerSample>0</numberOfBitsPerSample> + <stationSelectionSpecification> + <stationSelection> + <stationSet>Single</stationSet> + <minimumConstraint>1</minimumConstraint> + </stationSelection> + </stationSelectionSpecification> + <timeWindowSpecification> + <timeFrame>UT</timeFrame> + <duration><duration>P5Y</duration></duration> + </timeWindowSpecification> + </observation> + <status>status</status> + </activity> + <entity> + <temporaryIdentifier> + <source>source</source> + <identifier>0</identifier> + <description>description</description> + </temporaryIdentifier> + <dataproductType>UVDataProduct</dataproductType> + <storageCluster> + <name>name</name> + <partition>partition</partition> + </storageCluster> + </entity> + </specification> + <generatorVersion>generatorVersion</generatorVersion> +</p:trigger> diff --git a/SAS/Trigger_Services/TriggerReceptionService/test/trigger_misc_testing_nov2016.xml b/SAS/Trigger_Services/TriggerReceptionService/test/trigger_misc_testing_nov2016.xml new file mode 100644 index 0000000000000000000000000000000000000000..97445e398355b68cb25b8d5ef91ed324cb01b963 --- /dev/null +++ b/SAS/Trigger_Services/TriggerReceptionService/test/trigger_misc_testing_nov2016.xml @@ -0,0 +1,466 @@ +<?xml version="1.0" encoding="UTF-8"?> + <lofar:project xmlns:lofar="http://www.astron.nl/MoM2-Lofar" xmlns:mom2="http://www.astron.nl/MoM2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.astron.nl/MoM2-Lofar http://lofar.astron.nl:8080/mom3/schemas/LofarMoM2.xsd http://www.astron.nl/MoM2 http://lofar.astron.nl:8080/mom3/schemas/MoM2.xsd "> + <version>2.16.3</version> + <template version="2.16.3" author="Alwin de Jong,Adriaan Renting" changedBy="Adriaan Renting"> + <description>XML Template generator version 2.16.3</description> + </template> + <name>test-lofar</name> + <children> + <item index="0"> + <lofar:folder topology_parent="false"> + <name>MISC-trigger-testing NV</name> + <description>MISC-trigger-testing NV (8 nov 2016)</description> + <children> + <item index="0"> + <lofar:folder topology_parent="true"> + <topology>0</topology> + <name>TheParentFolder</name> + <description>3C196/3C147 LBA standard imaging (Imaging)</description> + <children> + <item index="0"> + <lofar:observation> + <name>TargetObservation</name> + <description>3C147/1/TO (Target Observation)</description> + <topology>B0.1.T</topology> + <predecessor_topology></predecessor_topology> + <currentStatus> + <mom2:openedStatus/> + </currentStatus> + <lofar:observationAttributes> + <observationId> + </observationId> + <name>3C147/1/TO</name> + <projectName>CEP4tests</projectName> + <instrument>Beam Observation</instrument> + <defaultTemplate>BeamObservation</defaultTemplate> + <tbbPiggybackAllowed>true</tbbPiggybackAllowed> + <aartfaacPiggybackAllowed>true</aartfaacPiggybackAllowed> + <userSpecification> + <correlatedData>true</correlatedData> + <coherentStokesData>true</coherentStokesData> + <incoherentStokesData>false</incoherentStokesData> + <antenna>LBA Outer</antenna> + <clock mode="200 MHz"/> + <instrumentFilter>10-90 MHz</instrumentFilter> + <integrationInterval>1.0</integrationInterval> + <channelsPerSubband>64</channelsPerSubband> + <coherentDedisperseChannels>false</coherentDedisperseChannels> + <tiedArrayBeams> + <flyseye>false</flyseye> + </tiedArrayBeams> + <stokes> + <integrateChannels>false</integrateChannels> + <subbandsPerFileCS>512</subbandsPerFileCS> + <numberCollapsedChannelsCS>16</numberCollapsedChannelsCS> + <stokesDownsamplingStepsCS>128</stokesDownsamplingStepsCS> + <whichCS>IQUV</whichCS> + <subbandsPerFileIS></subbandsPerFileIS> + <numberCollapsedChannelsIS></numberCollapsedChannelsIS> + <stokesDownsamplingStepsIS></stokesDownsamplingStepsIS> + <whichIS></whichIS> + </stokes> + <stationSet>Custom</stationSet> + <stations>CS001,CS002,CS003,CS004,CS005,CS006,CS007,CS011,CS013,CS017,CS021,CS024,CS026,CS028,CS030,CS031,CS032,CS101,CS103,CS201,CS301,CS302,CS401,CS501,RS106,RS205,RS208,RS210,RS305,RS306,RS307,RS310,RS406,RS407,RS409,RS503,RS508,RS509</stations> + <timeFrame>UT</timeFrame> + <startTime>2016-06-10T14:29:27</startTime> + <endTime>2016-06-10T14:34:27</endTime> + <duration>300</duration> + <bypassPff>false</bypassPff> + <enableSuperterp>false</enableSuperterp> + <numberOfBitsPerSample>8</numberOfBitsPerSample> + <misc> + {"employees":[ + {"firstName":"John", "lastName":"Doe"}, + {"firstName":"Anna", "lastName":"Smith"}, + {"firstName":"Peter", "lastName":"Jones"} +]} + </misc> + + </userSpecification> + </lofar:observationAttributes> + <storageCluster> + <name>CEP666_obs_level</name> + <partition>/data/projects/observation</partition> + </storageCluster> + <children> +<item index="0"> + <lofar:measurement xsi:type="lofar:BFMeasurementType"> + <name>3C147</name> + <description>3C147</description> + <topology>B0.1.T.SAP000</topology> + <currentStatus> + <mom2:openedStatus/> + </currentStatus> + <lofar:bfMeasurementAttributes> + <measurementType>Target</measurementType> + <specification> + <targetName>3C147</targetName> + <ra>85.6510833333</ra> + <dec>49.8519666667</dec> + <equinox>J2000</equinox> + <duration>0</duration> + <subbandsSpecification> + <subbands>114..353</subbands> + </subbandsSpecification> + <tiedArrayBeams> + <flyseye>false</flyseye> + <nrTabRings>0</nrTabRings> + <tabRingSize></tabRingSize> + <tiedArrayBeamList> + + </tiedArrayBeamList> + </tiedArrayBeams> + </specification> + </lofar:bfMeasurementAttributes> + <resultDataProducts> + <item> + <lofar:uvDataProduct> + <name>B0.1.T.SAP000.dps.uv</name> + <topology>B0.1.T.SAP000.dps.uv</topology> + <status>no_data</status> + <storageCluster> + <name>CEP4</name> + <partition>/data/projects/</partition> + <remark>this will not overwrite the settings on observation level</remark> + </storageCluster> + </lofar:uvDataProduct> + </item> + <item> + <lofar:bfDataProduct> + <name>B0.1.T.SAP000.dps.cs</name> + <topology>B0.1.T.SAP000.dps.cs</topology> + <status>no_data</status> + <storageCluster> + <name>CEP4</name> + <partition>/data/projects/</partition> + <remark>this will not overwrite the settings on observation level</remark> + </storageCluster> + </lofar:bfDataProduct> + </item> + </resultDataProducts> + </lofar:measurement> + </item> +<item index="0"> + <lofar:measurement xsi:type="lofar:BFMeasurementType"> + <name>3C196</name> + <description>3C196</description> + <topology>B0.1.T.SAP001</topology> + <currentStatus> + <mom2:openedStatus/> + </currentStatus> + <lofar:bfMeasurementAttributes> + <measurementType>Calibration</measurementType> + <specification> + <targetName>3C196</targetName> + <ra>123.400291667</ra> + <dec>48.2173833333</dec> + <equinox>J2000</equinox> + <duration>0</duration> + <subbandsSpecification> + <subbands>114..353</subbands> + </subbandsSpecification> + <tiedArrayBeams> + <flyseye>false</flyseye> + <nrTabRings></nrTabRings> + <tabRingSize></tabRingSize> + <tiedArrayBeamList> + <tiedArrayBeam> + <coherent>true</coherent> + <angle1>1.4611271088</angle1> + <angle2>0.38422550818</angle2> + </tiedArrayBeam> + </tiedArrayBeamList> + </tiedArrayBeams> + </specification> + </lofar:bfMeasurementAttributes> + <resultDataProducts> + <item> + <lofar:uvDataProduct> + <name>B0.1.T.SAP001.dps.uv</name> + <topology>B0.1.T.SAP001.dps.uv</topology> + <status>no_data</status> + <storageCluster> + <name>CEP4</name> + <partition>/data/projects/</partition> + </storageCluster> + </lofar:uvDataProduct> + </item> + </resultDataProducts> + </lofar:measurement> + </item> + </children> + </lofar:observation> + </item> + <item index="0"> + + <lofar:pipeline xsi:type="lofar:CalibrationPipelineType"> + <topology>B0.1.CPT</topology> + <predecessor_topology>B0.1.T</predecessor_topology> + <name>3C196/1/CPT</name> + <description>3C196/1/CPT (Cal Pipe Target)</description> + <currentStatus> + <mom2:openedStatus/> + </currentStatus> + + <processingCluster> + <name>CEP4</name> + <partition>/data/projects/</partition> + <numberOfTasks>244</numberOfTasks> + <minRAMPerTask unit="byte">1000000000</minRAMPerTask> + <minScratchPerTask unit="byte">100000000</minScratchPerTask> + <maxDurationPerTask>PT600S</maxDurationPerTask> + <numberOfCoresPerTask>20</numberOfCoresPerTask> + <runSimultaneous>true</runSimultaneous> + </processingCluster> + + <pipelineAttributes> + <defaultTemplate>Calibrator Pipeline (no export)</defaultTemplate> + <flaggingStrategy>LBAdefault</flaggingStrategy> + <duration>600</duration> + <skyModelDatabase>3C196</skyModelDatabase> + <demixingParameters> + <averagingFreqStep>16</averagingFreqStep> + <averagingTimeStep>5</averagingTimeStep> + <demixFreqStep>64</demixFreqStep> + <demixTimeStep>10</demixTimeStep> + <demixAlways>CasA,CygA</demixAlways> + <demixIfNeeded></demixIfNeeded> + <ignoreTarget></ignoreTarget> + </demixingParameters> + <bbsParameters> + <baselines></baselines> + <correlations></correlations> + <beamModelEnable>true</beamModelEnable> + <solveParms></solveParms> + <solveUVRange></solveUVRange> + <strategyBaselines></strategyBaselines> + <strategyTimeRange></strategyTimeRange> + </bbsParameters> + <misc> + {"employees":[ + {"firstName":"John", "lastName":"Doe"}, + {"firstName":"Anna", "lastName":"Smith"}, + {"firstName":"Peter", "lastName":"Jones"} + ]} + </misc> + + </pipelineAttributes> + <storageCluster> + <name>CEP666_pip</name> + <partition>/data/projects/</partition> + </storageCluster> + + <generic> + <additional-otdb-keys> + Version=2.18 + Cluster.ProcessingCluster.clusterName=CEP4 + Cluster.ProcessingCluster.clusterPartition=/data/projects/ + Cluster.ProcessingCluster.numberOfTasks=244 + Cluster.ProcessingCluster.minRAMPerTask=1000000000 + Cluster.ProcessingCluster.minScratchPerTask=100000000 + Cluster.ProcessingCluster.maxDurationPerTask=PT600S + Cluster.ProcessingCluster.numberOfCoresPerTask=20 + Cluster.ProcessingCluster.runSimultaneous=true + + DataProducts.Output_Correlated.storageClusterName=CEP4 + DataProducts.Output_Correlated.storageClusterPartition=/data/projects/ + </additional-otdb-keys> + </generic> + <usedDataProducts> + <item> + <lofar:uvDataProduct topology="B0.1.T.SAP001.dps.uv"> + </lofar:uvDataProduct> + </item> + </usedDataProducts> + <resultDataProducts> + <item> + <lofar:instrumentModelDataProduct> + <name>B0.1.CPT.dps.im</name> + <topology>B0.1.CPT.dps.im</topology> + <status>no_data</status> + <storageCluster> + <name>CEP4_dps_im</name> + <partition>/data/projects/</partition> + </storageCluster> + </lofar:instrumentModelDataProduct> + </item> + <item> + <lofar:uvDataProduct> + <name>B0.1.CPT.dps.uv</name> + <topology>B0.1.CPT.dps.uv</topology> + <status>no_data</status> + <storageCluster> + <name>CEP4_dps_uv</name> + <partition>/data/projects/</partition> + </storageCluster> + </lofar:uvDataProduct> + </item> + </resultDataProducts> + </lofar:pipeline> + </item> +<item index="0"> + <lofar:pipeline xsi:type="lofar:CalibrationPipelineType"> + <topology>B0.1.PT0</topology> + <predecessor_topology>B0.1.T,B0.1.CPT</predecessor_topology> + <name>3C147/1.0/TP</name> + <description>3C147/1.0/TP (Target Pipeline)</description> + <currentStatus> + <mom2:openedStatus/> + </currentStatus> + <processingCluster> + <name>CEP4</name> + <partition>/data/projects/</partition> + <numberOfTasks>244</numberOfTasks> + <minRAMPerTask unit="byte">1000000000</minRAMPerTask> + <minScratchPerTask unit="byte">100000000</minScratchPerTask> + <maxDurationPerTask>PT600S</maxDurationPerTask> + <numberOfCoresPerTask>20</numberOfCoresPerTask> + <runSimultaneous>true</runSimultaneous> + </processingCluster> + <pipelineAttributes> + <defaultTemplate>Calibration Pipeline Target</defaultTemplate> + <flaggingStrategy>LBAdefault</flaggingStrategy> + <duration>600</duration> + <demixingParameters> + <averagingFreqStep>16</averagingFreqStep> + <averagingTimeStep>5</averagingTimeStep> + <demixFreqStep>64</demixFreqStep> + <demixTimeStep>10</demixTimeStep> + <demixAlways>CasA,CygA</demixAlways> + <demixIfNeeded></demixIfNeeded> + <ignoreTarget></ignoreTarget> + </demixingParameters> + <bbsParameters> + <baselines></baselines> + <correlations></correlations> + <beamModelEnable>true</beamModelEnable> + <solveParms></solveParms> + <solveUVRange></solveUVRange> + <strategyBaselines></strategyBaselines> + <strategyTimeRange></strategyTimeRange> + </bbsParameters> + <misc> + {"employees":[ + {"firstName":"John", "lastName":"Doe"}, + {"firstName":"Anna", "lastName":"Smith"}, + {"firstName":"Peter", "lastName":"Jones"} + ]} + </misc> + + </pipelineAttributes> + <storageCluster> + <name>CEP666_pip</name> + <partition>/data/projects/</partition> + </storageCluster> + + <usedDataProducts> + <item> + <lofar:uvDataProduct topology="B0.1.T.SAP000.dps.uv"> + <name>B0.1.T.SAP000.dps.uv</name> + </lofar:uvDataProduct> + </item> + <item> + <lofar:instrumentModelDataProduct topology="B0.1.CPT.dps.im"> + <name>B0.1.CPT.dps.im</name> + </lofar:instrumentModelDataProduct> + </item> + </usedDataProducts> + <resultDataProducts> + <item> + <lofar:uvDataProduct> + <name>B0.1.PT0.dps.uv</name> + <topology>B0.1.PT0.dps.uv</topology> + <status>no_data</status> + <storageCluster> + <name>CEP4_dps_uv</name> + <partition>/data/projects/</partition> + </storageCluster> + </lofar:uvDataProduct> + </item> + </resultDataProducts> + </lofar:pipeline> + </item> +<item index="0"> + <lofar:pipeline xsi:type="lofar:ImagingPipelineType"> + <topology>B0.PI0</topology> + <predecessor_topology>B0.1.PT0</predecessor_topology> + <name>3C147/IM</name> + <description>3C147/IM (Imaging pipeline beam 0)</description> + <currentStatus> + <mom2:openedStatus/> + </currentStatus> + <processingCluster> + <name>CEP4</name> + <partition>/data/projects/</partition> + <numberOfTasks>244</numberOfTasks> + <minRAMPerTask unit="byte">1000000000</minRAMPerTask> + <minScratchPerTask unit="byte">100000000</minScratchPerTask> + <maxDurationPerTask>PT600S</maxDurationPerTask> + <numberOfCoresPerTask>20</numberOfCoresPerTask> + <runSimultaneous>true</runSimultaneous> + </processingCluster> + <storageCluster> + <name>CEP666_pip_imaging</name> + <partition>/data/projects/</partition> + </storageCluster> + <imagingPipelineAttributes> + <defaultTemplate>Imaging Pipeline LBA</defaultTemplate> + <duration>1500</duration> + <nrOfOutputSkyImage>24</nrOfOutputSkyImage> + <imagingParameters> + <nrSlicesPerImage>1</nrSlicesPerImage> + <nrSubbandsPerImage>10</nrSubbandsPerImage> + <maxBaseline></maxBaseline> + <fieldOfView>5.0</fieldOfView> + <weight></weight> + <robust></robust> + <iterations></iterations> + <threshold></threshold> + <uvMin></uvMin> + <uvMax></uvMax> + <stokes></stokes> + </imagingParameters> + <misc> + {"employees":[ + {"firstName":"John", "lastName":"Doe"}, + {"firstName":"Anna", "lastName":"Smith"}, + {"firstName":"Peter", "lastName":"Jones"} + ]} + </misc> + + </imagingPipelineAttributes> + <storageCluster> + <name>CEP555_pipe_level</name> + <partition>/data/projects/imaging</partition> + </storageCluster> + + <usedDataProducts> + <item> + <lofar:uvDataProduct topology="B0.1.PT0.dps.uv"> + <name>B0.1.PT0.dps.uv</name> + </lofar:uvDataProduct> + </item> + </usedDataProducts> + <resultDataProducts> + <item> + <lofar:skyImageDataProduct> + <name>B0.PI0.dps.si</name> + <topology>B0.PI0.dps.si</topology> + <status>no_data</status> + <storageCluster_xxx> + <name>CEP666_dps_si</name> + <partition>/data/projects/skyImageDataProduct</partition> + </storageCluster_xxx> + </lofar:skyImageDataProduct> + </item> + </resultDataProducts> + </lofar:pipeline> + </item> + </children> + </lofar:folder> + </item> +</children> + </lofar:folder> + </item> + </children> + </lofar:project>