From d0b111a064bbfbb5b70a04992618a86cda58f518 Mon Sep 17 00:00:00 2001 From: Fanna Lautenbach <lautenbach@astron.nl> Date: Tue, 2 Aug 2022 14:15:44 +0200 Subject: [PATCH] Revert "Merge branch 'SDC-685' into 'main'" This reverts commit 82e6ba0f784f8055f332e1f5f893f148ec24767b, reversing changes made to 71000b9139dda85664d3c9a09f788073ab0852cb. --- ldvspec/connection/__init__.py | 0 ldvspec/connection/config.py | 21 --- ldvspec/connection/database.cfg | 15 -- ldvspec/connection/retrieve_db_connection.py | 95 ---------- ldvspec/connection/test.py | 0 ldvspec/ldvspec/settings/dev.py | 1 - .../migrations/0004_auto_20220728_1007.py | 18 -- ldvspec/lofardata/models.py | 18 +- .../scripts/ldv_specification_interface.py | 158 ----------------- .../scripts/migrate_ldvadmin_to_ldvspec.py | 164 ------------------ ldvspec/lofardata/tests/test_dataproduct.py | 18 +- ldvspec/lofardata/tests/test_location.py | 4 +- ldvspec/lofardata/urls.py | 3 +- ldvspec/lofardata/views.py | 6 - ldvspec/requirements/base.txt | 3 +- 15 files changed, 18 insertions(+), 506 deletions(-) delete mode 100644 ldvspec/connection/__init__.py delete mode 100644 ldvspec/connection/config.py delete mode 100644 ldvspec/connection/database.cfg delete mode 100644 ldvspec/connection/test.py delete mode 100644 ldvspec/lofardata/migrations/0004_auto_20220728_1007.py delete mode 100644 ldvspec/lofardata/scripts/ldv_specification_interface.py delete mode 100644 ldvspec/lofardata/scripts/migrate_ldvadmin_to_ldvspec.py diff --git a/ldvspec/connection/__init__.py b/ldvspec/connection/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/ldvspec/connection/config.py b/ldvspec/connection/config.py deleted file mode 100644 index aa517437..00000000 --- a/ldvspec/connection/config.py +++ /dev/null @@ -1,21 +0,0 @@ -from configparser import ConfigParser -import os - - -def read_config(section, filename='database.cfg'): - full_filename = os.path.join(os.path.dirname(__file__), filename) - parser = ConfigParser() - read_result = parser.read(full_filename) - # If file not found then parser returns just an empty list it does not raise an Exception! - if len(read_result) == 0: - raise Exception("Configuration file with filename {0} not found".format(full_filename)) - - db_settings = {} - if parser.has_section(section): - params = parser.items(section) - for param in params: - db_settings[param[0]] = param[1] - else: - raise Exception('Section {0} not found in the {1} file'.format(section, filename)) - - return db_settings diff --git a/ldvspec/connection/database.cfg b/ldvspec/connection/database.cfg deleted file mode 100644 index 05df7ee8..00000000 --- a/ldvspec/connection/database.cfg +++ /dev/null @@ -1,15 +0,0 @@ -[postgresql-local] -host=localhost -port=5433 -database=ldv-spec-db -user=postgres -password=secret - -[postgresql-ldv] -tunnelhost=dop821.astron.nl -tunnelusername=sdco -host=sdc-db.astron.nl -port=5432 -database=ldvadmin -user=ldvrbow -password=Wehn5CTYj1RcbstMSGls \ No newline at end of file diff --git a/ldvspec/connection/retrieve_db_connection.py b/ldvspec/connection/retrieve_db_connection.py index 2f058c23..e69de29b 100644 --- a/ldvspec/connection/retrieve_db_connection.py +++ b/ldvspec/connection/retrieve_db_connection.py @@ -1,95 +0,0 @@ -import sys - -import psycopg2 -from ldvspec.connection import read_config -import logging -import argparse -from sshtunnel import SSHTunnelForwarder -import os - - -def connect_postgresql(section): - """ Connect to the PostgreSQL database server """ - conn = None - tunnel = None - try: - # read connection parameters - configuration = read_config(section=section) - - logging.info('Connecting PostgreSQL database %s', configuration.get('database', 'no database name given')) - - host = configuration.get('host', 'no host given') - if host != 'localhost': - tunnel = open_tunnel(configuration) - conn = psycopg2.connect(host='localhost', - port=tunnel.local_bind_port, - database=configuration.get('database'), - user=configuration.get('user'), - password=configuration.get('password')) - else: - conn = psycopg2.connect(**configuration) - - cur = conn.cursor() - cur.execute('SELECT version()') - db_version = cur.fetchone() - logging.info('Database version: ' + db_version[0]) - - except (Exception, psycopg2.DatabaseError) as error: - logging.error(error) - if tunnel is not None: - tunnel.stop() - - return conn, tunnel - - -def open_tunnel(configuration_params): - tunnel_host = configuration_params.get('tunnelhost', "no tunnel host given") - tunnel_username = configuration_params.get('tunnelusername', "no username for the tunnel given") - host = configuration_params.get('host', "no host given") - port = int(configuration_params.get('port', "no port given")) - - try: - ssh_config_file = os.path.expanduser("~/.ssh/config") - except FileNotFoundError as exc: - raise FileNotFoundError( - "Ssh config file not found on standard path '~/.ssh/config'. This is mandatory for opening the ssh tunnel" - ) from exc - - logging.info("Creating ssh tunnel for %s and port %s with tunnel host %s and username %s", repr(host), port, - repr(tunnel_host), repr(tunnel_username)) - ssh_tunnel = SSHTunnelForwarder( - ssh_address_or_host=tunnel_host, - ssh_username=tunnel_username, - ssh_config_file=ssh_config_file, - remote_bind_address=(host, port) - ) - ssh_tunnel.start() - return ssh_tunnel - - -def main(): - """ - Opens a database connection from configuration file database.cfg - """ - logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.DEBUG) - - # Check the invocation arguments - parser = argparse.ArgumentParser() - parser.add_argument("-s", "--section", help="Add the configuration's section from the database.cfg.") - args = parser.parse_args() - - if not args.section: - logging.critical("Error: no configuration section given. Try --help") - sys.exit(-1) - - return connect_postgresql(args.section) - - -if __name__ == '__main__': - connection, server = main() - if connection is not None: - connection.close() - logging.info('Database connection closed.') - if server is not None: - server.stop() - logging.info('Tunneled server stopped.') diff --git a/ldvspec/connection/test.py b/ldvspec/connection/test.py deleted file mode 100644 index e69de29b..00000000 diff --git a/ldvspec/ldvspec/settings/dev.py b/ldvspec/ldvspec/settings/dev.py index aeade1dd..afbb1c5a 100644 --- a/ldvspec/ldvspec/settings/dev.py +++ b/ldvspec/ldvspec/settings/dev.py @@ -13,7 +13,6 @@ DATABASES = { 'USER': 'postgres', 'PASSWORD': 'secret', 'NAME': 'ldv-spec-db', - #'HOST': 'localhost', 'HOST': 'raspiastro', 'PORT': '5433', }, diff --git a/ldvspec/lofardata/migrations/0004_auto_20220728_1007.py b/ldvspec/lofardata/migrations/0004_auto_20220728_1007.py deleted file mode 100644 index a7e3e5f3..00000000 --- a/ldvspec/lofardata/migrations/0004_auto_20220728_1007.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.1.4 on 2022-07-28 10:07 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('lofardata', '0003_increase_filter_name'), - ] - - operations = [ - migrations.AlterField( - model_name='dataproduct', - name='project', - field=models.CharField(max_length=50), - ), - ] diff --git a/ldvspec/lofardata/models.py b/ldvspec/lofardata/models.py index 5ee1fa21..2c51cce1 100644 --- a/ldvspec/lofardata/models.py +++ b/ldvspec/lofardata/models.py @@ -10,23 +10,15 @@ class DataLocation(models.Model): @staticmethod def insert_location_from_string(location_string): """ - Insert a datalocation from a srm string (e.g. srm://srm-url:4321) - Data Location names are: Sara, Juelich and Poznan + Insert a datalocation from a srm string (e.g. srm://surm:4321/path.tar) + :param str location_string: SRM url :return: DataLocation object + rtype: DataLocations """ - # netloc will become srm-url:4321 _, netloc, *_ = urlsplit(location_string) - if "sara" in netloc.lower(): - loc_name = "Sara" - elif "fz-juelich" in netloc.lower(): - loc_name = "Juelich" - elif "psnc" in netloc.lower(): - loc_name = "Poznan" - else: - loc_name = "Unknown" - dataloc = DataLocation(name=loc_name, uri=netloc) + dataloc = DataLocation(name=netloc, uri=location_string.rstrip('/')) dataloc.save() return dataloc @@ -36,7 +28,7 @@ class DataProduct(models.Model): oid_source = models.CharField(verbose_name='OBS_ID_SOURCE', max_length=15) dataproduct_source = models.CharField(max_length=20) dataproduct_type = models.CharField(max_length=50) - project = models.CharField(max_length=50) + project = models.CharField(max_length=15) location = models.ForeignKey(DataLocation, on_delete=models.DO_NOTHING) activity = models.CharField(max_length=50) surl = models.CharField(max_length=200) diff --git a/ldvspec/lofardata/scripts/ldv_specification_interface.py b/ldvspec/lofardata/scripts/ldv_specification_interface.py deleted file mode 100644 index d0469ad5..00000000 --- a/ldvspec/lofardata/scripts/ldv_specification_interface.py +++ /dev/null @@ -1,158 +0,0 @@ -""" -This module provides a REST interface to the LDV specifications - -Could be that this should be replaced with ldv_specification_interface module/python package -Its kinda prototype module for now required for the migration script -""" -import requests -import logging - -from json.decoder import JSONDecodeError - -try: - from simplejson.errors import JSONDecodeError as SimpleJSONDecodeError -except ModuleNotFoundError: - from json.decoder import JSONDecodeError as SimpleJSONDecodeError - -import argparse -import datetime -from urllib.parse import urlparse, urlunparse -# ============================================================== -# The request header -ATDB_HEADER = { - 'content-type': "application/json", - 'cache-control': "no-cache" -} -LDV_HOST_DEV = "http://localhost:8000/ldvspec/api/v1" # your local development environment with Django webserver -LDV_HOST_TEST = "https://sdc-dev.astron.nl:5554/ldvspec/api/v1" # the ldv sdc test environment. -LDV_HOST_PROD = "https://sdc.astron.nl:5554/ldvspec/api/v1" # the ldv sdc production environment. - - -class APIException(Exception): - pass - -class APIMissing(Exception): - pass - - -def is_http_exception(response: requests.Response): - if response.status_code in range(400, 499): - return True - return False - - -def is_success(response: requests.Response): - if response.status_code in range(200, 300): - return True - return False - - -def is_missing(response: requests.Response): - if response.status_code == 404: - return True - return False - - -def can_retry(response: requests.Response): - if response.status_code in [408, 429]: - return True - return False - - -class LDVSpecInterface(): - """ - This class is used to connect via REST interface - """ - def __init__(self, host, token): - """ - Constructor. - :param host: the host name of the backend. - :param token: The token to login - """ - # accept some presets to set host to dev, test, acc or prod - self.host = host - if self.host == 'dev': - self.host = LDV_HOST_DEV - elif self.host == 'test': - self.host = LDV_HOST_TEST - elif self.host == 'prod': - self.host = LDV_HOST_PROD - if not self.host.endswith('/'): - self.host += '/' - self.header = ATDB_HEADER - self.header['Authorization'] = f'Token {token}' - self._session = None - - def session(self): - if self._session is None: - self._session = requests.Session() - self._session.headers.update(self.header) - return self._session - - def _request(self, url, type, query_parameters=None, payload=None): - parsed_url = urlparse(url) - if not parsed_url.path.endswith('/'): - parsed_url = parsed_url._replace(path=parsed_url.path + '/') - - url = urlunparse(parsed_url) - - if isinstance(payload, str): - response = self.session().request(type, url, data=payload, headers=self.header, params=query_parameters) - else: - response = self.session().request(type, url, json=payload, headers=self.header, params=query_parameters) - - logging.debug(f"[{type} {response.url} ]") - logging.debug("Response: " + str(response.status_code) + ", " + str(response.reason)) - if is_missing(response): - raise APIMissing(url) - elif is_http_exception(response) and can_retry(response): - return self._request(url, type, query_parameters, payload) - elif is_http_exception(response): - raise APIException(f'{response.status_code}: {response.reason} {response.content}') - elif is_success(response): - try: - json_response = response.json() - - return json_response - except (SimpleJSONDecodeError, JSONDecodeError): - return response.content - raise APIException(f'Unrecognized response code {response.status_code}: {response.reason} {response.content}') - # raise (Exception("ERROR: " + response.url + " not found.")) - - # === Backend requests ================================================================================ - 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 - if not resource.endswith('/'): - resource += '/' - logging.debug(f'do_POST_json using url={url} and with payload: {payload}') - try: - json_response = self._request(url, 'POST', payload=payload) - if hasattr(json_response, 'id'): - return json_response['id'] - else: - return -1 - except Exception as err: - raise err - - def insert_multiple_dataproduct(self, payload): - """ - Insert multiple dataproducts. Implicit also dataproduct-location is added - :param: List of payload string - :return: List id of added dataproducts - """ - url = self.host + "insert_dataproduct/" - logging.debug(f'insert_multiple_dataproduct using url={url} and with payload: {payload}') - try: - json_response = self._request(url, 'POST', payload=payload) - response_lst_ids = [] - for resp in json_response: - response_lst_ids.append(resp['id']) - return response_lst_ids - except Exception as err: - raise err \ No newline at end of file diff --git a/ldvspec/lofardata/scripts/migrate_ldvadmin_to_ldvspec.py b/ldvspec/lofardata/scripts/migrate_ldvadmin_to_ldvspec.py deleted file mode 100644 index e85e7961..00000000 --- a/ldvspec/lofardata/scripts/migrate_ldvadmin_to_ldvspec.py +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env python3 -""" -This script migrates data from ldvadmin to ldv-spec-db with user arguments. -By default, the local ldv-spec-db is used and the ldvadmin on sdc-db.astron.nl -Script requires token to access the ldv-spec-db with REST API - -Some examples: -- Show latest version: - python ./ldvspec/lofardata/scripts/migrate_ldvadmin_to_ldvspec.py --version -- Import only 1000 records and show more verbosity: - python ./ldvspec/lofardata/scripts/migrate_ldvadmin_to_ldvspec.py --limit 1000 --verbose -- Import 50000 records and insert in steps of 10000 (so 5 steps) - python ./ldvspec/lofardata/scripts/migrate_ldvadmin_to_ldvspec.py --limit 50000 --max_nbr_dps_to_insert_per_request 10000 -- Import only 1000 records at production: - python ./ldvspec/lofardata/scripts/migrate_ldvadmin_to_ldvspec.py --limit 1000 --host prod - -""" -import os -import time -import logging -import argparse -import sys -import math -from ldv_specification_interface import LDVSpecInterface -import ldvspec.connection.retrieve_db_connection as connector - -logger = logging.getLogger(__file__) -handler = logging.StreamHandler(sys.stdout) -handler.setLevel(logging.INFO) -formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') -handler.setFormatter(formatter) -logger.addHandler(handler) - - -def change_logging_level(level): - logger = logging.getLogger() - logger.setLevel(level) - for handler in logger.handlers: - handler.setLevel(level) - - -def execute_query(connection, sql_query, data=None): - """ - Execute query of the ldvadmin Database - There is no commit required because we are doing only read queries - :param: connection: Database 'connection' - :param: sql_query - :param: data (optional) the data arguments of the sql_query - :return result of the query - """ - try: - cursor = connection.cursor() - cursor.execute(sql_query, data) - connection.commit() - return cursor.fetchall() - except Exception as exp: - logger.error("Could not execute query! '{}' results in -> {}".format(sql_query, exp)) - - -def main(): - """ - Migrates data from the ldvadmin database to a ldv-spec-db database. - """ - logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) - - # Check the invocation arguments - parser = argparse.ArgumentParser() - parser.add_argument("--version", default=False, help="Show current version of this program", action="store_true") - parser.add_argument("-v", "--verbose", default=False, help="More information at run time.", action="store_true") - parser.add_argument("-l", "--limit", default=0, type=int, help="Limit on the number of queries (0 is no limit)", action="store") - parser.add_argument("-t", "--token", default="ad9b37a24380948601257f9c1f889b07a00ac81e", - help="Token to access the REST API of ldvspec", action="store") - parser.add_argument("--host", nargs="?", default='dev', - help="The ldv-spec-db host. Presets are 'dev', 'test', 'prod', otherwise give a full url like https://atdb.astron.nl/atdb") - parser.add_argument("-s", "--section", default='postgresql-ldv', - help="Add the configuration's section from the database.cfg.") - # Have payload of more millions will most likely not work - # tested with 10.000 results in 90 seconds so # 11 mil. will be at least 28 hours - parser.add_argument("-r", "--max_nbr_dps_to_insert_per_request", default=1000, type=int, - help="The number of dataproducts to insert per REST request (0 is no limit)", action="store") - - args = parser.parse_args() - - if args.version: - # Get file's Last modification time stamp only in terms of seconds since epoch and convert in timestamp - modification_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.path.getmtime(__file__))) - logging.info("--- {} (last updated {}) ---".format(os.path.basename(__file__), modification_time)) - return - - logging.info("\nMoment please....\n") - - if args.verbose: - change_logging_level(logging.DEBUG) - - if args.limit == 0: - limit_str = "" - else: - limit_str = "limit {}".format(args.limit) - logging.debug("Limit on number of dataproducts to query is set to {}".format(args.limit)) - - if args.max_nbr_dps_to_insert_per_request == 0: - no_limit_to_insert = True - else: - no_limit_to_insert = False - logging.debug("Limit on number of dataproducts to insert REST is set to {}".format(args.max_nbr_dps_to_insert_per_request)) - - query_count_all_raw_dataproducts = "select count(*) from astrowise.raw_dataproducts" - query_count_all_pipeline_dataproducts = "select count(*) from astrowise.pl_dataproducts" - query_all_required_fields_raw_dataproducts = \ - "select obsid, obsid_source, dp_type, project, activity, uri, size, dysco from astrowise.raw_dataproducts {}"\ - .format(limit_str) - - # Create connection using ssh tunnel with the ldvadmin database - conn, tunnel = connector.connect_postgresql(args.section) - count_raw_dps = execute_query(conn, query_count_all_raw_dataproducts)[0][0] - count_pl_dps = execute_query(conn, query_count_all_pipeline_dataproducts)[0][0] - logging.info(f"There are {count_raw_dps} raw dataproducts and {count_pl_dps} pipeline dataproduct in the ldvadmin.astrowise table!!") - result_query_all_dps = execute_query(conn, query_all_required_fields_raw_dataproducts) - - # Are there still dataproducts left to query? - nbr_dps_left = len(result_query_all_dps) - args.limit - if nbr_dps_left > 0 and args.limit > 0: - logging.debug("Limit on number of leftover dataproducts to query is set to {}".format(nbr_dps_left)) - limit_str = "limit {}".format(nbr_dps_left) - query_all_required_fields_pipeline_dataproducts = \ - "select obsid, obsid_source, dp_type, project, activity, uri, size, dysco from astrowise.pl_dataproducts {}" \ - .format(limit_str) - result_query_all_dps.extend(execute_query(conn, query_all_required_fields_pipeline_dataproducts)) - - logging.info("{} dataproduct retrieved from ldvadmin".format(len(result_query_all_dps))) - # Create connection with ldv-spec-db using REST API, use temp. token created in my test-env - ldvspec_interface = LDVSpecInterface(args.host, args.token) - - # Now obtain the attributes from result an add to database using REST insert_dataproduct method - lst_all_dps = [] - for dps in result_query_all_dps: - logging.debug(dps) - metadata_str = "{'dysco_compression': %s}" % dps[7] - dps_dict = {"obs_id": dps[0], "oid_source": dps[1], "dataproduct_source": "LOFAR LTA", - "dataproduct_type": dps[2], "project": dps[3], "activity": dps[4], "surl": dps[5], - "filesize": dps[6], "additional_meta": metadata_str, "location": dps[5]} - lst_all_dps.append(dps_dict) - - if no_limit_to_insert: - res_lst_ids = ldvspec_interface.insert_multiple_dataproduct(payload=lst_all_dps) - logging.info("Added {} DataProduct objects".format(len(res_lst_ids))) - logging.debug("Added with ids={}".format(res_lst_ids)) - else: - cnt = 0 - nbr_required_inserts = math.ceil(len(lst_all_dps)/args.max_nbr_dps_to_insert_per_request) - for cnt in range(nbr_required_inserts): - start = cnt * args.max_nbr_dps_to_insert_per_request - end = start + args.max_nbr_dps_to_insert_per_request - cnt += 1 - res_lst_ids = ldvspec_interface.insert_multiple_dataproduct(payload=lst_all_dps[start:end]) - logging.info("Insert count {} of {}: Added {} DataProduct objects [{} till {}]". - format(cnt, nbr_required_inserts, args.max_nbr_dps_to_insert_per_request, start, end)) - logging.debug("Added with ids={}".format(res_lst_ids)) - - logging.info("\nThat's All Folks!\n") - - -if __name__ == "__main__": - main() diff --git a/ldvspec/lofardata/tests/test_dataproduct.py b/ldvspec/lofardata/tests/test_dataproduct.py index 47c0c656..138634b3 100644 --- a/ldvspec/lofardata/tests/test_dataproduct.py +++ b/ldvspec/lofardata/tests/test_dataproduct.py @@ -9,14 +9,14 @@ test_object_value = dict(obs_id='12345', oid_source='SAS', dataproduct_source='l project='LT10_10', location='srm://surfsara.nl:4884/', activity='observation', - surl='srm://surfsara.nl:4884/subfolder/some_nice.tar', + surl='srm://surfsara.nl:4884/...', filesize=40, additional_meta={'dysco_compression': True}) class TestDatabaseInteraction(dtest.TestCase): def test_insert(self): - location = DataLocation(name='sara', uri='srm://surfsara.nl') + location = DataLocation(name='surfsara', uri='srm://surfsara.nl') location.save() test_values = dict(test_object_value) test_values['location'] = location @@ -36,8 +36,8 @@ class TestDatabaseInteraction(dtest.TestCase): for field in test_values: self.assertEqual(test_object_value.get(field), getattr(dp, field), msg=f'Field {field} does not coincide') - self.assertEqual('Sara', dp.location.name) - self.assertEqual('surfsara.nl:4884', dp.location.uri) + self.assertEqual('surfsara.nl:4884', dp.location.name) + self.assertEqual( 'srm://surfsara.nl:4884', dp.location.uri) class TestRESTAPI(rtest.APITestCase): @@ -47,23 +47,23 @@ class TestRESTAPI(rtest.APITestCase): def test_insert_not_allowed(self): client = rtest.APIClient() - response = client.post('/ldvspec/api/v1/insert_dataproduct/', data={}, format='json') + response = client.post('/ldvspec/api/v1/data/insert/', data={}, format='json') self.assertEqual(response_status.HTTP_403_FORBIDDEN, response.status_code) def test_insert_flat_error(self): - response = self.client.post('/ldvspec/api/v1/insert_dataproduct/', data={}, format='json') + response = self.client.post('/ldvspec/api/v1/data/insert/', data={}, format='json') self.assertEqual(response_status.HTTP_400_BAD_REQUEST, response.status_code) def test_insert_flat_single(self): test_payload = dict(test_object_value) test_payload.pop('location') - response = self.client.post('/ldvspec/api/v1/insert_dataproduct/', data=test_payload, format='json') + response = self.client.post('/ldvspec/api/v1/data/insert/', data=test_payload, format='json') self.assertEqual(response_status.HTTP_201_CREATED, response.status_code) def test_insert_flat_multi(self): test_payload = dict(test_object_value) test_payload.pop('location') - response = self.client.post('/ldvspec/api/v1/insert_dataproduct/', data=[test_payload, test_payload], format='json') + response = self.client.post('/ldvspec/api/v1/data/insert/', data=[test_payload, test_payload], format='json') self.assertEqual(response_status.HTTP_201_CREATED, response.status_code) self.assertTrue(DataProduct.objects.count() == 2, 'Not all dataproduct have been inserted') @@ -72,7 +72,7 @@ class TestRESTAPI(rtest.APITestCase): def test_insert_flat_multi_insert_single(self): test_payload = dict(test_object_value) test_payload.pop('location') - response = self.client.post('/ldvspec/api/v1/insert_dataproduct/', data=test_payload, format='json') + response = self.client.post('/ldvspec/api/v1/data/insert/', data=test_payload, format='json') self.assertEqual(response_status.HTTP_201_CREATED, response.status_code) self.assertTrue(DataProduct.objects.count() == 1, 'Not all dataproduct have been inserted') diff --git a/ldvspec/lofardata/tests/test_location.py b/ldvspec/lofardata/tests/test_location.py index dc15c2a5..86d6466c 100644 --- a/ldvspec/lofardata/tests/test_location.py +++ b/ldvspec/lofardata/tests/test_location.py @@ -34,8 +34,8 @@ class TestDataLocation(dtest.TestCase): dataloc = DataLocation.insert_location_from_string('srm://test_site:44321/') self.assertTrue(dataloc.pk is not None, 'Cannot save object') - self.assertEqual('Unknown', dataloc.name) - self.assertEqual('test_site:44321', dataloc.uri) + self.assertEqual('test_site:44321', dataloc.name) + self.assertEqual('srm://test_site:44321', dataloc.uri) class TestRESTAPI(rtest.APITestCase): diff --git a/ldvspec/lofardata/urls.py b/ldvspec/lofardata/urls.py index 8095bd00..e8fdbc8e 100644 --- a/ldvspec/lofardata/urls.py +++ b/ldvspec/lofardata/urls.py @@ -14,9 +14,8 @@ urlpatterns = [ # REST API path('api/v1/data/', views.DataProductView.as_view(), name='dataproduct'), - path('api/v1/insert_dataproduct/', views.InsertMultiDataproductView.as_view(), name='dataproduct-insert'), + path('api/v1/data/insert/', views.InsertMultiDataproductView.as_view(), name='dataproduct-insert'), path('api/v1/data-location/', views.DataLocationView.as_view(), name='datalocation'), - path('api/v1/data/<int:pk>/', views.DataProductDetailsView.as_view(), name='dataproduct-detail-view-api'), path('api/v1/openapi/', get_schema_view( title="LDV Specification", diff --git a/ldvspec/lofardata/views.py b/ldvspec/lofardata/views.py index f45b6db7..1e2b4483 100644 --- a/ldvspec/lofardata/views.py +++ b/ldvspec/lofardata/views.py @@ -60,12 +60,6 @@ class DataProductView(generics.ListCreateAPIView): filter_class = DataProductFilterSet -class DataProductDetailsView(generics.RetrieveUpdateDestroyAPIView): - model = DataProduct - serializer_class = DataProductSerializer - queryset = DataProduct.objects.all() - - class DataLocationView(generics.ListCreateAPIView): model = DataLocation serializer_class = DataLocationSerializer diff --git a/ldvspec/requirements/base.txt b/ldvspec/requirements/base.txt index b0d8418b..45954f46 100644 --- a/ldvspec/requirements/base.txt +++ b/ldvspec/requirements/base.txt @@ -10,5 +10,4 @@ whitenoise==5.0.1 six==1.15.0 fontawesome-free==5.15.2 pyyaml==6.0 -uritemplate==4.1.1 -sshtunnel==0.4.0 \ No newline at end of file +uritemplate==4.1.1 \ No newline at end of file -- GitLab