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