From 3243eef54a4bd0a5cdcfb8bcb79ead3cd1a6300e Mon Sep 17 00:00:00 2001
From: Nico Vermaas <vermaas@astron.nl>
Date: Tue, 15 Dec 2020 08:46:48 +0100
Subject: [PATCH] remove atdb_interface package

---
 README.md                                     |   2 +
 atdb/taskdatabase/models.py                   |   1 -
 atdb/taskdatabase/serializers.py              |   2 +-
 .../templates/taskdatabase/index.html         |   2 +-
 atdb/taskdatabase/views.py                    |   1 -
 atdb_interface_pip/README.rst                 |  34 -
 .../atdb_interface.egg-info/PKG-INFO          |  10 -
 .../atdb_interface.egg-info/SOURCES.txt       |  10 -
 .../dependency_links.txt                      |   1 -
 .../atdb_interface.egg-info/entry_points.txt  |   3 -
 .../atdb_interface.egg-info/requires.txt      |   1 -
 .../atdb_interface.egg-info/top_level.txt     |   1 -
 atdb_interface_pip/atdb_interface/__init__.py |   0
 .../atdb_interface/atdb_interface.py          | 825 ------------------
 .../examples/arg00_post_new_dataproducts      |   3 -
 atdb_interface_pip/build.sh                   |   9 -
 .../dist/atdb_interface-1.2.8.tar.gz          | Bin 8316 -> 0 bytes
 .../dist/atdb_interface-1.2.9.tar.gz          | Bin 8549 -> 0 bytes
 atdb_interface_pip/setup.py                   |  21 -
 atdb_interface_pip/upload_to_nexus.sh         |  35 -
 20 files changed, 4 insertions(+), 957 deletions(-)
 delete mode 100644 atdb_interface_pip/README.rst
 delete mode 100644 atdb_interface_pip/atdb_interface.egg-info/PKG-INFO
 delete mode 100644 atdb_interface_pip/atdb_interface.egg-info/SOURCES.txt
 delete mode 100644 atdb_interface_pip/atdb_interface.egg-info/dependency_links.txt
 delete mode 100644 atdb_interface_pip/atdb_interface.egg-info/entry_points.txt
 delete mode 100644 atdb_interface_pip/atdb_interface.egg-info/requires.txt
 delete mode 100644 atdb_interface_pip/atdb_interface.egg-info/top_level.txt
 delete mode 100644 atdb_interface_pip/atdb_interface/__init__.py
 delete mode 100644 atdb_interface_pip/atdb_interface/atdb_interface.py
 delete mode 100644 atdb_interface_pip/atdb_interface/examples/arg00_post_new_dataproducts
 delete mode 100644 atdb_interface_pip/build.sh
 delete mode 100644 atdb_interface_pip/dist/atdb_interface-1.2.8.tar.gz
 delete mode 100644 atdb_interface_pip/dist/atdb_interface-1.2.9.tar.gz
 delete mode 100644 atdb_interface_pip/setup.py
 delete mode 100644 atdb_interface_pip/upload_to_nexus.sh

diff --git a/README.md b/README.md
index faeee5c1..66f4d98e 100644
--- a/README.md
+++ b/README.md
@@ -41,6 +41,8 @@ Deployment Diagram:
 
     > export DOCKER_BUILD_DIR=$HOME/my_docker/atdb-ldv/atdb-ldv/atdb
     > export DOCKER_COMPOSE_DIR=$DOCKER_BUILD_DIR/docker
+    > cd $DOCKER_BUILD_DIR
+    > git pull
     > cd $DOCKER_COMPOSE_DIR
     > docker-compose -p atdb up -d
     
diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py
index c69d4727..66d48412 100644
--- a/atdb/taskdatabase/models.py
+++ b/atdb/taskdatabase/models.py
@@ -111,7 +111,6 @@ class Observation(TaskObject):
     end_band = models.IntegerField(null=True)
 
     # ARTS SC4
-    process_triggers = models.BooleanField(default=False)
     beams = models.CharField(max_length=255, default="0..39")
 
     quality = models.CharField(max_length=30, default="unknown")
diff --git a/atdb/taskdatabase/serializers.py b/atdb/taskdatabase/serializers.py
index df64b011..0b0a4c74 100644
--- a/atdb/taskdatabase/serializers.py
+++ b/atdb/taskdatabase/serializers.py
@@ -57,7 +57,7 @@ class ObservationSerializer(serializers.ModelSerializer):
                   'generated_dataproducts','telescopes',
                   'data_location', 'irods_collection','node','control_parameters',
                   'skip_auto_ingest','observing_mode','science_mode','parset_location',
-                  'par_file_name','number_of_bins','start_band','end_band','process_triggers','beams', 'delay_center_offset',
+                  'par_file_name','number_of_bins','start_band','end_band','beams', 'delay_center_offset',
                   'locality_policy','max_lifetime_on_disk','quality','science_observation','filler','ingest_progress',
                   'timestamp_starting','timestamp_running','timestamp_completing',
                   'timestamp_ingesting','timestamp_archived','timestamp_aborted','timestamp_ingest_error')
diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html
index da4c482f..fa35e9ae 100644
--- a/atdb/taskdatabase/templates/taskdatabase/index.html
+++ b/atdb/taskdatabase/templates/taskdatabase/index.html
@@ -46,7 +46,7 @@
     </div>
     {% include 'taskdatabase/pagination.html' %}
 </div>
-    <p class="footer"> Version 2.0.0 (11 dec 2020)</p>
+    <p class="footer"> Version 2.0.0 (15 dec 2020 - 08:00)</p>
 
     <script type="text/javascript">
         (function(seconds) {
diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py
index 7ab9e6d3..4f216d30 100644
--- a/atdb/taskdatabase/views.py
+++ b/atdb/taskdatabase/views.py
@@ -48,7 +48,6 @@ class ObservationFilter(filters.FilterSet):
             'irods_collection': ['exact', 'icontains'],
             'node': ['exact', 'in'],
             'skip_auto_ingest': ['exact'],
-            'process_triggers': ['exact'],
             'beams': ['exact', 'icontains'],
             'delay_center_offset': ['exact', 'icontains'],
             'quality': ['exact', 'icontains'],
diff --git a/atdb_interface_pip/README.rst b/atdb_interface_pip/README.rst
deleted file mode 100644
index ee327091..00000000
--- a/atdb_interface_pip/README.rst
+++ /dev/null
@@ -1,34 +0,0 @@
-atdb_interface
-==============
-This module contains a service that run standalone and interact with the Apertif Task Database REST API.
-
-See 'atdb_interface -h' for help and 'atdb_interface -e' for examples.
-
-This package is required when using atdb_services
-
-Installing
-^^^^^^^^^^
-To install a version from Nexus repository use::
-
-    > pip install <<nexus url>> --upgrade
-    or download and install the tarball,
-    > pip install atdb_interface.tar.gz --upgrade
-
-Within the development environment such as with PyCharm one can install the package within the virtualenv with which
-PyCharm is configured. To avoid uninstall and install after each code change pip can install packages within development
-mode::
-
-    (.env) > pip install -e ..project../atdb_interface_pip --upgrade
-
-This will install the package with soft links to the original code, such that one gets immediate refresh within PyCharm,
-which is used for refactoring, code completion, imports etc.
-
-Uninstalling
-^^^^^^^^^^^^
-Uninstall is trivial using the command (watch out for the '-')::
-
-    > pip uninstall atdb-interface
-
-or without confirmation::
-
-    > pip uninstall --yes atdb-interface
\ No newline at end of file
diff --git a/atdb_interface_pip/atdb_interface.egg-info/PKG-INFO b/atdb_interface_pip/atdb_interface.egg-info/PKG-INFO
deleted file mode 100644
index b7592a3f..00000000
--- a/atdb_interface_pip/atdb_interface.egg-info/PKG-INFO
+++ /dev/null
@@ -1,10 +0,0 @@
-Metadata-Version: 1.0
-Name: atdb-interface
-Version: 1.2.9
-Summary: ATDB interface
-Home-page: https://www.astron.nl/wsrt/wiki/doku.php?id=atdb:atdb_interface
-Author: Nico Vermaas - Astron
-Author-email: vermaas@astron.nl
-License: BSD
-Description: UNKNOWN
-Platform: UNKNOWN
diff --git a/atdb_interface_pip/atdb_interface.egg-info/SOURCES.txt b/atdb_interface_pip/atdb_interface.egg-info/SOURCES.txt
deleted file mode 100644
index e4282e34..00000000
--- a/atdb_interface_pip/atdb_interface.egg-info/SOURCES.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-README.rst
-setup.py
-atdb_interface/__init__.py
-atdb_interface/atdb_interface.py
-atdb_interface.egg-info/PKG-INFO
-atdb_interface.egg-info/SOURCES.txt
-atdb_interface.egg-info/dependency_links.txt
-atdb_interface.egg-info/entry_points.txt
-atdb_interface.egg-info/requires.txt
-atdb_interface.egg-info/top_level.txt
\ No newline at end of file
diff --git a/atdb_interface_pip/atdb_interface.egg-info/dependency_links.txt b/atdb_interface_pip/atdb_interface.egg-info/dependency_links.txt
deleted file mode 100644
index 8b137891..00000000
--- a/atdb_interface_pip/atdb_interface.egg-info/dependency_links.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/atdb_interface_pip/atdb_interface.egg-info/entry_points.txt b/atdb_interface_pip/atdb_interface.egg-info/entry_points.txt
deleted file mode 100644
index a5448a6f..00000000
--- a/atdb_interface_pip/atdb_interface.egg-info/entry_points.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-[console_scripts]
-atdb_interface = atdb_interface.atdb_interface:main
-
diff --git a/atdb_interface_pip/atdb_interface.egg-info/requires.txt b/atdb_interface_pip/atdb_interface.egg-info/requires.txt
deleted file mode 100644
index f2293605..00000000
--- a/atdb_interface_pip/atdb_interface.egg-info/requires.txt
+++ /dev/null
@@ -1 +0,0 @@
-requests
diff --git a/atdb_interface_pip/atdb_interface.egg-info/top_level.txt b/atdb_interface_pip/atdb_interface.egg-info/top_level.txt
deleted file mode 100644
index 643d97a1..00000000
--- a/atdb_interface_pip/atdb_interface.egg-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-atdb_interface
diff --git a/atdb_interface_pip/atdb_interface/__init__.py b/atdb_interface_pip/atdb_interface/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/atdb_interface_pip/atdb_interface/atdb_interface.py b/atdb_interface_pip/atdb_interface/atdb_interface.py
deleted file mode 100644
index 44cb7b02..00000000
--- a/atdb_interface_pip/atdb_interface/atdb_interface.py
+++ /dev/null
@@ -1,825 +0,0 @@
-#!/usr/bin/python3
-import sys
-import os
-import requests
-import json
-import argparse
-import datetime
-
-from pkg_resources import get_distribution
-pkg_version = get_distribution('atdb_interface').version
-"""
-atdb_interface.py : a commandline tool to interface with the ATDB REST API.
-:author Nico Vermaas - Astron
-"""
-LAST_UPDATE = "31 oct 2019"
-
-# ====================================================================
-
-# The request header
-ATDB_HEADER = {
-    'content-type': "application/json",
-    'cache-control': "no-cache",
-    'authorization': "Basic YWRtaW46YWRtaW4="
-}
-
-DEFAULT_BACKEND_HOST = "http://atdb-test.astron.nl/atdb"
-ATDB_HOST_DEV = "http://localhost:8000/atdb/"       # your local development environment with Django webserver
-ATDB_HOST_VM = "http://192.168.22.25/atdb"          # your local Ansible/Vagrant setup for testing
-ATDB_HOST_ACC = "http://192.168.22.25/atdb"         # your local Ansible/Vagrant acceptance setup
-ATDB_HOST_TEST = "http://atdb-test.astron.nl/atdb"  # the atdb test environment
-ATDB_HOST_PROD = "http://atdb.astron.nl/atdb"       # the atdb production environment.
-
-TIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ"
-
-
-class ATDB:
-    """
-    Calibrators class, use to parse SIP and update the backend database
-    through REST API calls.
-    """
-    def __init__(self, host, verbose=False):
-        """
-        Constructor.
-        :param host: the host name of the backend.
-        :param username: The username known in Django Admin.
-        :param verbose: more information runtime.
-        :param header: Request header for Atdb REST requests with token authentication.
-        """
-        # accept some presets to set host to dev, test, acc or prod
-        self.host = host
-        if self.host=='dev':
-            self.host = DEFAULT_BACKEND_HOST
-        elif self.host=='vm':
-            self.host = ATDB_HOST_VM
-        elif self.host=='test':
-            self.host = ATDB_HOST_TEST
-        elif self.host=='acc':
-            self.host = ATDB_HOST_ACC
-        elif self.host=='prod':
-            self.host = ATDB_HOST_PROD
-        if not self.host.endswith('/'):
-            self.host += '/'
-
-        self.verbose = verbose
-        self.header = ATDB_HEADER
-
-    def verbose_print(self, info_str):
-        """
-        Print info string if verbose is enabled (default False)
-        :param info_str: String to print
-        """
-        if self.verbose:
-            timestamp = datetime.datetime.now().strftime(TIME_FORMAT)
-            print(str(timestamp)+ ' - '+info_str)
-
-    # === Backend requests ================================================================================
-    @staticmethod
-    def reconstruct_beams_obsolete(payload_string):
-        """
-        Normally, to translate the specification string to a json payload that the http requests understand,
-        all substrings like 'a,b,c' are replaced with "a","b","c". But this should not be done for the beams list,
-         which is given as something like beams=1..10,11,12 or beams=[1..10,11,12] in the specification.
-         So this function reconstructs that stting. (a bit ugly, but as usual time constraints force me to cut a corner).
-        :param payload_string:
-        :return:
-        """
-
-        # find the part where the 'beams' are already converted to a messy string: "beams": ""beams" : "1..10" , "11" , "12" , "new_status"", "new_status"
-        start = payload_string.find('"beams"') + 10
-
-        if (start>=10):
-            # if no beams were found, then ignore this step
-            end = payload_string.find('"new_status"') -3
-
-            # save the before and after parts of the string
-            before = payload_string[0:start]
-            after = payload_string[end:]
-
-            # extract the middle part that needs to be changed: 1..10" , "11" , "12
-            middle = payload_string[start:end]
-
-            # remove all " and spaces, and surround it with "" again.
-            middle = middle.replace("\"","")
-            middle = middle.replace(" ","")
-            middle = '"' + middle + '"'
-
-            # reconstruct the payload string
-            payload_string = before + middle + after
-
-        return payload_string
-
-
-    def jsonifyPayload_obsolete(self, payload):
-        """
-        {name=WSRTA180223003_B003.MS,filename=WSRTA180223003_B003.MS} =>
-        {"name" : "WSRTA180223003_B003.MS" , "filename" : "WSRTA180223003_B003.MS"}
-        :param payload:
-        :return: payload_string
-        """
-
-        payload_string = str(payload).replace("{","{\"")
-        payload_string = payload_string.replace("}", "\"}")
-        payload_string = payload_string.replace("=", "\" : \"")
-        payload_string = payload_string.replace(",", "\" , \"")
-
-        # reconstruct the lists by moving the brackets outside the double quotes
-        payload_string = payload_string.replace("\"[", "[\"")
-        payload_string = payload_string.replace("]\"", "\"]")
-        payload_string = payload_string.replace("/,", "/\",\"")
-        payload_string = payload_string.replace("u\"", "\"")
-
-        #payload_string = json.dumps(payload)
-        # ugly: reconstruct beams string
-        payload_string = self.reconstruct_beams_obsolete(payload_string)
-
-        self.verbose_print("payload_string: [" + payload_string+"]")
-        return payload_string
-
-    def encodePayload(self, payload):
-        """
-
-        The POST body does not simply accept a payload dict, it needs to be translated to a string with some
-        peculiarities
-        :param payload:
-        :return: payload_string
-        """
-
-        payload_string = str(payload).replace("'","\"")
-        #payload_string = payload_string.replace(",", ",\n")
-
-        # reconstruct the lists by moving the brackets outside the double quotes
-        payload_string = payload_string.replace("\"[", "[\"")
-        payload_string = payload_string.replace("]\"", "\"]")
-        payload_string = payload_string.replace("/,", "/\",\"")
-        payload_string = payload_string.replace("u\"", "\"")
-
-        self.verbose_print("The payload_string: [" + payload_string+"]")
-        return payload_string
-
-
-    def GET_TaskObjectByTaskId(self, resource, taskid):
-        """
-        Do a http GET request to the alta backend to find the Observation with the given runId
-        :runId runId:
-        """
-
-        url = self.host + resource
-        # create the querystring, external_ref is the mapping of this element to the alta datamodel lookup field
-        querystring = {"taskID": taskid}
-
-        response = requests.request("GET", url, headers=self.header, params=querystring)
-        self.verbose_print("[GET " + response.url + "]")
-
-        try:
-            json_response = json.loads(response.text)
-            results = json_response["results"]
-            taskobject = results[0]
-            return taskobject
-        except:
-            raise (Exception(
-                "ERROR: " + str(response.status_code) + ", " + str(response.reason) + ', ' + str(response.content)))
-
-    # ------------------------------------------------------------------------------#
-    #                                Main User functions                            #
-    # ------------------------------------------------------------------------------#
-
-
-    def do_GET_ID(self, key, value):
-        """
-        Get the id based on a field value of a resource. This is a generic way to retrieve the id.
-        :param resource: contains the resource, for example 'observations', 'dataproducts'
-        :param field: the field to search on, this will probably be 'name' or 'filename'
-        :param value: the value of the 'field' to search on.
-        :return id
-        """
-
-        # split key in resource and field
-        params = key.split(":")
-        resource = params[0]
-        field = params[1]
-
-        url = self.host + resource + "?" + field + "=" + value
-        response = requests.request("GET", url, headers=self.header)
-        self.verbose_print("[GET " + response.url + "]")
-        self.verbose_print("Response: " + str(response.status_code) + ", " + str(response.reason))
-
-        try:
-            json_response = json.loads(response.text)
-            results = json_response["results"]
-            result = results[0]
-            id = result['id']
-            return id
-        except:
-            return '-1'
-            #raise (Exception("ERROR: " + response.url + " not found."))
-
-
-    def do_GET(self, key, id, taskid):
-        """
-        Do a http GET request to the ATDB backend to find the value of one field of an object
-        :param key: contains the name of the resource and the name of the field separated by a colon.
-        :param id: the database id of the object.
-        :param taskid (optional): when the taskid (of an activity) is known it can be used instead of id.
-        """
-
-        # split key in resource and field
-        params = key.split(":")
-        resource = params[0]
-        field = params[1]
-
-        if taskid!=None:
-            taskObject = self.GET_TaskObjectByTaskId(resource, taskid)
-            id = taskObject['id']
-
-        if id==None:
-            # give up and throw an exception.
-            raise (Exception("ERROR: no valid 'id' or 'taskid' provided"))
-
-        url = self.host + resource + "/" + str(id) + "/"
-        self.verbose_print(('url: ' + url))
-
-        response = requests.request("GET", url, headers=self.header)
-        self.verbose_print("[GET " + response.url + "]")
-        self.verbose_print("Response: " + str(response.status_code) + ", " + str(response.reason))
-
-        try:
-            json_response = json.loads(response.text)
-            value = json_response[field]
-            return value
-        except Exception as err:
-          self.verbose_print("Exception : " + str(err))
-          raise (
-              Exception("ERROR: " + str(response.status_code) + ", " + str(response.reason) + ', ' + str(response.content)))
-
-
-    def do_GET_LIST_page(self, key, query, page):
-        """
-        get a list of objects that match the query. (oiginal do_GET_LIST function was left intact for
-        backward compatibility reasons).
-        The backend is paginated, so you may want to indicate which page you want to retrieve.
-        The function returns a list of values of the field indicated in 'key'.
-        The function also returns the total count, so you can calculate the number of pages to retrieve
-        :param key:
-        :param query:
-        :param page:
-        :return:
-        """
-
-        self.verbose_print("do_GET_LIST(" + key + "," + query + ")")
-        # split key in resource and field
-        params = key.split(":")
-        resource = params[0]
-        field = params[1]
-
-        url = self.host + resource + "?" + str(query)
-        if (page != None):
-            url = url + "&page=" + str(page)
-
-        # self.verbose_print("url = " + url)
-
-        response = requests.request("GET", url, headers=self.header)
-        self.verbose_print("[GET " + response.url + "]")
-        self.verbose_print("Response: " + str(response.status_code) + ", " + str(response.reason))
-
-        try:
-            json_response = json.loads(response.text)
-            results = json_response["results"]
-            # results = json.loads(response.text)
-            # loop through the list of results and extract the requested field (probably taskID),
-            # and add it to the return list.
-            list = []
-            for result in results:
-                value = result[field]
-                list.append(value)
-
-            count = json_response["count"]
-
-            try:
-                # return the next page number, if available
-                next = json_response["next"]
-                pos_start = next.find("page")
-                pos_end = next.find("&",pos_start)
-                page_number = next[pos_start+5:pos_end]
-
-            except:
-                page_number = 0
-
-            return list, count, page_number
-
-        except Exception as err:
-            self.verbose_print("Exception : " + str(err))
-            raise (Exception(
-                "ERROR: " + str(response.status_code) + ", " + str(response.reason) + ', ' + str(response.content)))
-
-
-    #  python atdb_interface.py -o GET_LIST --key observations:taskID --query status=valid
-    def do_GET_LIST(self, key, query):
-
-        self.verbose_print("do_GET_LIST(" + key + "," + query + ")")
-        # split key in resource and field
-        params = key.split(":")
-        resource = params[0]
-        field = params[1]
-
-        url = self.host + resource + "?" + str(query)
-
-        # self.verbose_print("url = " + url)
-
-        response = requests.request("GET", url, headers=self.header)
-        self.verbose_print("[GET " + response.url + "]")
-        self.verbose_print("Response: " + str(response.status_code) + ", " + str(response.reason))
-
-        try:
-            json_response = json.loads(response.text)
-            results = json_response["results"]
-            #results = json.loads(response.text)
-            # loop through the list of results and extract the requested field (probably taskID),
-            # and add it to the return list.
-            list = []
-            for result in results:
-                value = result[field]
-                list.append(value)
-
-            return list
-
-        except Exception as err:
-            self.verbose_print("Exception : " + str(err))
-            raise (Exception(
-                "ERROR: " + str(response.status_code) + ", " + str(response.reason) + ', ' + str(response.content)))
-
-
-    def do_GET_NextTaskID(self, timestamp, taskid_postfix=""):
-        """
-        :param timestamp: timestamp on which the taskid is based
-        :param taskid_postfix: optional addition to the taskid,
-               like when taskid_postfix="_IMG" the taskid will become "190405001_IMG"
-        :return: taskid
-        """
-
-        self.verbose_print("do_GET_NextTaskID(" + str(timestamp) + ")")
-
-        # construct the url
-        url = self.host + "get_next_taskid?timestamp=" + str(timestamp)+"&taskid_postfix="+taskid_postfix
-
-        # do the request to the ATDB backend
-        response = requests.request("GET", url, headers=self.header)
-        self.verbose_print("[GET " + response.url + "]")
-        self.verbose_print("Response: " + str(response.status_code) + ", " + str(response.reason))
-
-        # parse the response
-        try:
-            json_response = json.loads(response.text)
-            taskID = json_response["taskID"]
-            return taskID
-        except Exception as err:
-            self.verbose_print("Exception : " + str(err))
-            raise (Exception(
-                "ERROR: " + str(response.status_code) + ", " + str(response.reason) + ', ' + str(response.content)))
-
-
-    def do_GET_Observation(self, taskid):
-        """
-        Do a http request to the ATDB backend get all the observation parameters in the response
-        :param taskid
-        """
-        self.verbose_print("do_GET_Observation(" + taskid + ")")
-
-        # construct the url
-        url = self.host + "observations?taskID=" + str(taskid)
-
-        # do the request to the ATDB backend
-        response = requests.request("GET", url, headers=self.header)
-        self.verbose_print("[GET " + response.url + "]")
-
-        # parse the response
-        try:
-            json_response = json.loads(response.text)
-            results = json_response["results"]
-            observation = results[0]
-            return observation
-        except Exception as err:
-            self.verbose_print("Exception : " + str(err))
-            raise (Exception(
-                "ERROR: " + str(response.status_code) + ", " + str(response.reason) + ', ' + str(response.content)))
-
-
-
-    def do_GET_NextObservation(self, my_status, observing_mode, datawriter):
-        """
-        Do a http request to the ATDB backend get the next observation of a given status and observing_mode
-        :param my_status: status to search for (probably 'scheduled')
-        :param observing_mode: imaging or arts
-        :param taskid (optional): when the taskid (of an activity) is known it can be used instead of id.
-        """
-        self.verbose_print("do_GET_NextObservation(" + my_status + "," + observing_mode + "," + datawriter + ")")
-
-        # construct the url
-        url = self.host + "get_next_observation?my_status=" + str(my_status) + "&observing_mode=" + str(observing_mode) + "&datawriter=" + str(datawriter)
-
-        # do the request to the ATDB backend
-        response = requests.request("GET", url, headers=self.header)
-        self.verbose_print("[GET " + response.url + "]")
-        self.verbose_print("Response: " + str(response.status_code) + ", " + str(response.reason))
-
-        # parse the response
-        try:
-            json_response = json.loads(response.text)
-            taskID = json_response["taskID"]
-            minutes_left = json_response["minutes_left"]
-            return taskID, minutes_left
-        except Exception as err:
-            self.verbose_print("Exception : " + str(err))
-            raise (Exception(
-                "ERROR: " + str(response.status_code) + ", " + str(response.reason) + ', ' + str(response.content)))
-
-
-    def do_PUT(self, key='observations', id=None, value=None, taskid=None):
-        """
-        PUT a value to an existing field of a resource (table).
-        :param key: contains the name of the resource and the name of the field separated by a dot. observations.description
-        :param id: the database id of the object.
-        :param value: the value that has to be PUT in the key. If omitted, an empty put will be done to trigger the signals.
-        :param taskid (optional): when the taskid of an observation is known it can be used instead of id.
-        """
-
-        # split key in resource and field
-        if key.find(':')>0:
-            params = key.split(":")
-            resource = params[0]
-            field = params[1]
-        else:
-            resource = key
-            field = None
-
-        if taskid!=None:
-            taskObject = self.GET_TaskObjectByTaskId(resource, taskid)
-            id = taskObject['id']
-
-        url = self.host + resource + "/" + str(id) + "/"
-        if id==None:
-            raise (Exception("ERROR: no valid 'id' or 'taskid' provided"))
-
-        payload = {}
-        if field!=None:
-            payload[field]=value
-            payload = self.encodePayload(payload)
-        try:
-            response = requests.request("PUT", url, data=payload, headers=self.header)
-            self.verbose_print("[PUT " + response.url + "]")
-            self.verbose_print("Response: " + str(response.status_code) + ", " + str(response.reason))
-        except:
-            raise (Exception(
-                "ERROR: " + str(response.status_code) + ", " + str(response.reason) + ', ' + str(response.content)))
-
-
-    # do_PUT_LIST(key = observations:new_status, taskid = 180223003, value = valid)
-    def do_PUT_LIST(self, key='dataproducts', taskid=None, value=None):
-        """
-        PUT a value to an existing field of  resource (table).
-        :param key: contains the name of the resource and the name of the field separated by a colon. observations:new_status
-        :param value: the value that has to be PUT in the key. If omitted, an empty put will be done to trigger the signals.
-        :param taskid: the value is PUT to all objects with the provided taskid
-        """
-
-        # split key in resource and field
-        if key.find(':')>0:
-            params = key.split(":")
-            resource = params[0]
-            field = params[1]
-        else:
-            resource = key
-            field = None
-
-        get_key = resource+':id'
-        get_query= 'taskID='+taskid
-        ids = self.do_GET_LIST(get_key,get_query)
-
-        for id in ids:
-            url = self.host + resource + "/" + str(id) + "/"
-            self.verbose_print(('url: ' + url))
-
-            payload = {}
-            if field!=None:
-                payload[field]=value
-                payload = self.encodePayload(payload)
-            try:
-                response = requests.request("PUT", url, data=payload, headers=self.header)
-                self.verbose_print("[PUT " + response.url + "]")
-                self.verbose_print("Response: " + str(response.status_code) + ", " + str(response.reason))
-            except:
-                raise (Exception(
-                    "ERROR: " + str(response.status_code) + ", " + str(response.reason) + ', ' + str(response.content)))
-
-
-    def do_POST_obsolete(self, resource, payload):
-        """
-        POST a payload to a resource (table). This creates a new object (observation or dataproduct)
-        This is the old function, left for backward compatibility. Use 'do_POST_json()' now.
-        :param resource: contains the resource, for example 'observations', 'dataproducts'
-        :param payload: the contents of the object to create in json format
-        """
-
-        url = self.host + resource + '/'
-        self.verbose_print(('payload: ' + payload))
-
-        payload = self.jsonifyPayload_obsolete(payload)
-        try:
-            response = requests.request("POST", url, data=payload, headers=self.header)
-            self.verbose_print("[POST " + response.url + "]")
-            self.verbose_print("Response: " + str(response.status_code) + ", " + str(response.reason))
-            if not (response.status_code==200 or response.status_code==201):
-                raise Exception()
-        except Exception:
-            raise (Exception("ERROR: " + str(response.status_code) + ", " + str(response.reason) + ', ' + str(response.content)))
-
-
-    def do_POST_json(self, resource, payload):
-        """
-        POST a payload to a resource (table). This creates a new object (observation or dataproduct)
-        This function replaces the old do_POST function that still needed to convert the json content in a very ugly
-        :param resource: contains the resource, for example 'observations', 'dataproducts'
-        :param payload: the contents of the object to create in json format
-        """
-
-        url = self.host + resource + '/'
-        self.verbose_print(('payload: ' + payload))
-
-        try:
-            response = requests.request("POST", url, data=payload, headers=self.header)
-            self.verbose_print("[POST " + response.url + "]")
-            self.verbose_print("Response: " + str(response.status_code) + ", " + str(response.reason))
-            if not (response.status_code==200 or response.status_code==201):
-                raise Exception()
-        except Exception:
-            raise (Exception("ERROR: " + str(response.status_code) + ", " + str(response.reason) + ', ' + str(response.content)))
-
-
-    def do_POST_dataproducts(self, taskid, dataproducts):
-        """
-        POST (create) a batch of dataproducts for the (observation) with the given taskid.
-        This is done with a custom made http request to the ATDB backend
-        :param taskid: taskid of the observation
-        :param dataproducts: json list of dataproducts to be added to the provided taskid
-        """
-
-        # is 'dataproducts' a valid list of dataproducts?
-        try:
-            number_of_dataproducts = len(dataproducts)
-            self.verbose_print("do_POST_dataproducts(" + taskid + "," + str(number_of_dataproducts) + ")")
-        except Exception as err:
-            raise (Exception(
-                "ERROR: " + str(err)))
-
-        # construct the url
-        url = self.host + "post_dataproducts?taskID=" + str(taskid)
-
-        # encode the dictonary as proper json
-        payload = self.encodePayload(dataproducts)
-        try:
-            # do a POST request to the 'post_dataproducts' resource of the ATDB backend
-            response = requests.request("POST", url, data=payload, headers=self.header)
-            self.verbose_print("[POST " + response.url + "]")
-
-            # if anything went wrong, throw an exception.
-            if not (response.status_code==200 or response.status_code==201):
-                raise Exception(str(response.status_code) + " - " + str(response.reason))
-        except Exception as err:
-            raise (Exception("ERROR: " + str(err)))
-
-        # if it has all succeeded, give back the taskid as an indication of success
-        return taskid
-
-
-    def do_DELETE(self, resource, id):
-        """
-        Do a http DELETE request to the ATDB backend
-        """
-        if id == None:
-            raise (Exception("ERROR: no valid 'id' provided"))
-
-        # if a range of ID's is given then do multiple deletes
-        if (str(id).find('..')>0):
-            self.verbose_print("Deleting " + str(id) + "...")
-            s = id.split('..')
-            start = int(s[0])
-            end = int(s[1]) + 1
-        else:
-            # just a single delete
-            start = int(id)
-            end = int(id) + 1
-
-        for i in range(start,end):
-            url = self.host + resource + "/" + str(i) + "/"
-
-            try:
-                response = requests.request("DELETE", url, headers=self.header)
-                self.verbose_print("[DELETE " + response.url + "]")
-                self.verbose_print("Response: " + str(response.status_code) + ", " + str(response.reason))
-            except:
-                raise (Exception("ERROR: deleting " + url + "failed." + response.url))
-
-
-    def do_setquality(self, key='observations', id=None, value=None, taskid=None):
-        """
-        PUT a value to the quality field and call the setquality functionality to transmit the value to ALTA.
-        The interface of this function is as close as possible to the regular do_PUT function to avoid confusion.
-        :param key: contains the name of the resource and the name of the field separated by a dot. observations.description
-        :param id: the database id of the object.
-        :param value: the value that has to be PUT in the key. If omitted, an empty put will be done to trigger the signals.
-        :param taskid (optional): when the taskid of an observation is known it can be used instead of id.
-        """
-
-        # split key in resource and field
-        if key.find(':') > 0:
-            params = key.split(":")
-            resource = params[0]
-            field = params[1]
-        else:
-            resource = key
-            field = "quality"
-
-        if taskid != None:
-            taskObject = self.GET_TaskObjectByTaskId(resource, taskid)
-            id = taskObject['id']
-
-        # this operation requires to http requests...
-
-        # the first request is a PUT to ATDB to set the Quality field
-        url = self.host + resource + "/" + str(id) + "/"
-        if id==None:
-            raise (Exception("ERROR: no valid 'id' or 'taskid' provided"))
-
-        payload = {}
-        if field!=None:
-            payload[field]=value
-            payload = self.encodePayload(payload)
-        try:
-            response = requests.request("PUT", url, data=payload, headers=self.header)
-            self.verbose_print("[PUT " + response.url + "]")
-            self.verbose_print("Response: " + str(response.status_code) + ", " + str(response.reason))
-        except:
-            raise (Exception(
-                "ERROR: " + str(response.status_code) + ", " + str(response.reason) + ', ' + str(response.content)))
-
-
-        # the second request is a GET to ATDB's 'setquality' resource, which will trigger a call to ALTA
-        url = self.host + resource + "/" + str(id) + "/setquality/" + value + "/1"
-
-        try:
-            response = requests.request("GET", url, headers=self.header)
-            self.verbose_print("[GET " + response.url + "]")
-            self.verbose_print("Response: " + str(response.status_code) + ", " + str(response.reason))
-        except:
-            raise (Exception(
-                "ERROR: " + str(response.status_code) + ", " + str(response.reason) + ', ' + str(
-                    response.content)))
-
-
-
-# ------------------------------------------------------------------------------#
-#                                Module level functions                         #
-# ------------------------------------------------------------------------------#
-def exit_with_error(message):
-    """
-    Exit the code for an error.
-    :param message: the message to print.
-    """
-    print(message)
-    sys.exit(-1)
-
-
-def get_arguments(parser):
-    """
-    Gets the arguments with which this application is called and returns
-    the parsed arguments.
-    If a parfile is give as argument, the arguments will be overrided
-    The args.parfile need to be an absolute path!
-    :param parser: the argument parser.
-    :return: Returns the arguments.
-    """
-    args = parser.parse_args()
-    if args.parfile:
-        args_file = args.parfile
-        if os.path.exists(args_file):
-            parse_args_params = ['@' + args_file]
-            # First add argument file
-            # Now add command-line arguments to allow override of settings from file.
-            for arg in sys.argv[1:]:  # Ignore first argument, since it is the path to the python script itself
-                parse_args_params.append(arg)
-            print(parse_args_params)
-            args = parser.parse_args(parse_args_params)
-        else:
-            raise (Exception("Can not find parameter file " + args_file))
-    return args
-# ------------------------------------------------------------------------------#
-#                                Main                                           #
-# ------------------------------------------------------------------------------#
-
-
-def main():
-    """
-    The main module.
-    """
-    parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
-    parser.add_argument("-v","--verbose", default=False, help="More information at run time.",action="store_true")
-    parser.add_argument("--host", nargs="?", default='test', help="Presets are 'dev', 'vm', 'test', 'acc', 'prod'. Otherwise give a full url like https://atdb.astron.nl/atdb")
-    parser.add_argument("--version", default=False, help="Show current version of this program", action="store_true")
-    parser.add_argument("--operation","-o", default="GET", help="GET, GET_ID, GET_LIST, POST, PUT, DELETE. Note that these operations will only work if you have the proper rights in the ALTA user database.")
-    parser.add_argument("--id", default=None, help="id of the object to PUT to.")
-    parser.add_argument("-t", "--taskid", nargs="?", default=None, help="Optional taskID which can be used instead of '--id' to lookup Observations or Dataproducts.")
-    parser.add_argument("--key", default="observations.title", help="resource.field to PUT a value to. Example: observations.title")
-    parser.add_argument("--query", "-q", default="taskID=180223003", help="Query to the REST API")
-    parser.add_argument("--value", default="", help="value to PUT in the resource.field. If omitted it will PUT the object without changing values, but the built-in 'signals' will be triggered.")
-    parser.add_argument("--payload", "-p", default="{}", help="Payload in json for the POST operation. To create new Observations or Dataproducts. (see examples)")
-    parser.add_argument("--show_examples", "-e", default=False, help="Show some examples",action="store_true")
-    parser.add_argument('--parfile', nargs='?', type=str,  help='Parameter file')
-
-    args = get_arguments(parser)
-    try:
-        atdb = ATDB(args.host, args.verbose)
-
-        if (args.show_examples):
-
-            print('atdb_interface.py version = '+ pkg_version + " (last updated " + LAST_UPDATE + ")")
-            print('---------------------------------------------------------------------------------------------')
-            print()
-            print('--- basic examples --- ')
-            print()
-            print("Show the 'status' for Observation with taskID 180720003")
-            print("> atdb_interface -o GET --key observations:my_status --taskid 180223003")
-            print()
-            print("GET the ID of Observation with taskID 180223003")
-            print("> atdb_interface -o GET_ID --key observations:taskID --value 180223003")
-            print()
-            print("GET the ID of Dataproduct with name WSRTA180223003_ALL_IMAGE.jpg")
-            print("> atdb_interface -o GET_ID --key dataproducts:name --value WSRTA180223003_ALL_IMAGE.jpg")
-            print()
-            print("GET the 'status' for Dataproduct with ID = 45")
-            print("> atdb_interface -o GET --key dataproducts:my_status --id 45")
-            print()
-            print("PUT the 'status' of dataproduct with ID = 45 on 'copied'")
-            print("> atdb_interface -o PUT --key dataproducts:new_status --id 45 --value copied")
-            print()
-            print("PUT the 'status' of observation with taskID 180720003 on 'valid'")
-            print("> atdb_interface -o PUT --key observations:new_status --value valid --taskid 180223003")
-            print()
-            print("DELETE dataproduct with ID = 46 from the database (no files will be deleted).")
-            print("> atdb_interface -o DELETE --key dataproducts --id 46")
-            print()
-            print("DELETE dataproducts with ID's ranging from 11..15 from the database (no files will be deleted).")
-            print("> atdb_interface -o DELETE --key dataproducts --id 11..15 -v")
-            print()
-            print('--- advanced examples --- ')
-            print()
-            print("GET_LIST of taskIDs for observations with status = 'valid'")
-            print("> atdb_interface -o GET_LIST --key observations:taskID --query status=valid")
-            print()
-            print("GET_LIST of IDs for dataproducts with status = 'invalid'")
-            print("> atdb_interface -o GET_LIST --key dataproducts:id --query status=invalid")
-            print()
-            print("PUT the field 'new_status' on 'valid' for all dataproducts with taskId = '180816001'")
-            print("> atdb_interface -o PUT_LIST --key dataproducts:new_status --taskid 180816001 --value valid")
-            print('---------------------------------------------------------------------------------------------')
-            return
-
-        if (args.version):
-            print('--- atdb_interface.py version = '+ pkg_version + " (last updated " + LAST_UPDATE + ") ---")
-            return
-
-        if (args.operation=='GET'):
-            result = atdb.do_GET(key=args.key, id=args.id, taskid=args.taskid)
-            print(result)
-
-        if (args.operation == 'GET_ID'):
-            result = atdb.do_GET_ID(key=args.key, value=args.value)
-            print(result)
-
-        if (args.operation == 'GET_LIST'):
-            result = atdb.do_GET_LIST(key=args.key, query=args.query)
-            print(result)
-
-        if (args.operation=='PUT_LIST'):
-            atdb.do_PUT_LIST(key=args.key, taskid=args.taskid, value=args.value)
-
-        if (args.operation=='PUT'):
-            atdb.do_PUT(key=args.key, id=args.id, value=args.value, taskid=args.taskid)
-
-        if (args.operation=='SET_QUALITY'):
-            atdb.do_setquality(key=args.key, id=args.id, value=args.value, taskid=args.taskid)
-
-        if (args.operation=='POST'):
-            atdb.do_POST_json(resource=args.key, payload=args.payload)
-
-        if (args.operation=='DELETE'):
-            atdb.do_DELETE(resource=args.key, id=args.id)
-
-    except Exception as exp:
-        exit_with_error(str(exp))
-
-    sys.exit(0)
-
-
-if __name__ == "__main__":
-    main()
-
diff --git a/atdb_interface_pip/atdb_interface/examples/arg00_post_new_dataproducts b/atdb_interface_pip/atdb_interface/examples/arg00_post_new_dataproducts
deleted file mode 100644
index 3f481592..00000000
--- a/atdb_interface_pip/atdb_interface/examples/arg00_post_new_dataproducts
+++ /dev/null
@@ -1,3 +0,0 @@
---operation=POST
---key=dataproducts
---payload={name=WSRTA180223003_B003.MS,filename=WSRTA180223003_B003.MS,description=WSRTA180223003_B003.MS,dataproduct_type=visibility,taskID=180223003,size=54321,quality=raw,new_status=defined,new_location=datawriter}
diff --git a/atdb_interface_pip/build.sh b/atdb_interface_pip/build.sh
deleted file mode 100644
index ac4426a8..00000000
--- a/atdb_interface_pip/build.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/bash
-# This script make a source distribution for the pip installable package in the current folder
-echo "Build a source distribution for ATDB interface"
-python --version
-# Explicit give format otherwise a zip is created (Windows?)
-python setup.py sdist --formats=gztar
-
-# Next command will not close the window, can be handy if something goes wrong
-#exec $SHELL
\ No newline at end of file
diff --git a/atdb_interface_pip/dist/atdb_interface-1.2.8.tar.gz b/atdb_interface_pip/dist/atdb_interface-1.2.8.tar.gz
deleted file mode 100644
index a431d44d98b0b9097fe70af666c42518a3342e01..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8316
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

diff --git a/atdb_interface_pip/dist/atdb_interface-1.2.9.tar.gz b/atdb_interface_pip/dist/atdb_interface-1.2.9.tar.gz
deleted file mode 100644
index e27e0114c2d8a7aa96fe2c2352fd73bdd183e974..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8549
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
T`Z;&)KY2%`m;V?}FfafB=)R0A

diff --git a/atdb_interface_pip/setup.py b/atdb_interface_pip/setup.py
deleted file mode 100644
index 6fdd44c1..00000000
--- a/atdb_interface_pip/setup.py
+++ /dev/null
@@ -1,21 +0,0 @@
-from setuptools import setup, find_packages
-
-def readme():
-    with open('README.rst') as f:
-        return f.read()
-
-setup(name='atdb_interface',
-      version='1.2.9',
-      description='ATDB interface',
-      url='https://www.astron.nl/wsrt/wiki/doku.php?id=atdb:atdb_interface',
-      author='Nico Vermaas - Astron',
-      author_email='vermaas@astron.nl',
-      license='BSD',
-      install_requires=['requests'],
-      packages=find_packages(),
-      entry_points={
-            'console_scripts': [
-                  'atdb_interface=atdb_interface.atdb_interface:main',
-            ],
-      },
-      )
\ No newline at end of file
diff --git a/atdb_interface_pip/upload_to_nexus.sh b/atdb_interface_pip/upload_to_nexus.sh
deleted file mode 100644
index a5b6f8f0..00000000
--- a/atdb_interface_pip/upload_to_nexus.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/bash
-
-##---------------------------------------------------------------------------------------------------------------------#
-##! \brief   Description: This script uploads the created atdb_interface artifact to the Nexus repository
-##!          In:  $1   [Optional] Additional Artifact version tag which can be anything
-##!          Out: None
-##!          Returns: None
-##!          Preconditions:
-##!             - build should be done /dist/atdb_interface-[version].tar.gz is available
-##!          Postconditions:
-##!             - artifact uploaded to https://support.astron.nl/nexus/content/repositories/snapshots/nl/astron/atdb/ATDB_interface-[version][additional version tag].tar.gz
-##!          Examples:     .\upload_to_nexus
-##!                        .\upload_to_nexus 20180913
-##!                        .\upload_to_nexus test
-##---------------------------------------------------------------------------------------------------------------------#
-
-VERSION=$(python setup.py --version)
-ARTIFACT_NAME="ATDB_interface"
-ARTIFACT_BUILD="/dist/atdb_interface-${VERSION}.tar.gz"
-
-ARTIFACT_UPLOAD_BASE_PATH="https://support.astron.nl/nexus/content/repositories/snapshots/nl/astron/atdb/"
-if [[ $# -eq 1 ]]; then
-    ARTIFACT_VERSION="-${VERSION}-${1}"
-else
-    ARTIFACT_VERSION="-${VERSION}"
-fi
-
-ARTIFACT_UPLOAD_PATH="${ARTIFACT_UPLOAD_BASE_PATH}${ARTIFACT_NAME}${ARTIFACT_VERSION}.tar.gz"
-ARTIFACT_BUILD_PATH="$(pwd)${ARTIFACT_BUILD}"
-
-echo "Upload ${ARTIFACT_BUILD_PATH} to $ARTIFACT_UPLOAD_PATH"
-curl --insecure --upload-file ${ARTIFACT_BUILD_PATH} -u upload:upload ${ARTIFACT_UPLOAD_PATH}
-
-# Next command will not close the window, can be handy if something goes wrong
-exec $SHELL
\ No newline at end of file
-- 
GitLab