def test_telescope_availability_combine(self, mock_intervals): mock_intervals.return_value = [(datetime(2016, 9, 30, 18, 30, 0, tzinfo=timezone.utc), datetime(2016, 9, 30, 21, 0, 0, tzinfo=timezone.utc)), (datetime(2016, 10, 1, 18, 30, 0, tzinfo=timezone.utc), datetime(2016, 10, 1, 21, 0, 0, tzinfo=timezone.utc)), (datetime(2016, 10, 2, 18, 30, 0, tzinfo=timezone.utc), datetime(2016, 10, 2, 21, 0, 0, tzinfo=timezone.utc))] start = datetime(2016, 9, 30, tzinfo=timezone.utc) end = datetime(2016, 10, 2, tzinfo=timezone.utc) telescope_availability = get_telescope_availability_per_day(start, end) self.assertIn(self.tk1, telescope_availability) self.assertIn(self.tk2, telescope_availability) combined_telescope_availability = combine_telescope_availabilities_by_site_and_class(telescope_availability) combined_key = TelescopeKey(self.tk1.site, '', self.tk1.telescope[:-1]) self.assertIn(combined_key, combined_telescope_availability) doma_available_time = (datetime(2016, 10, 1, 20, 44, 58) - datetime(2016, 10, 1, 18, 30, 0)).total_seconds() doma_total_time = (datetime(2016, 10, 1, 21, 0, 0) - datetime(2016, 10, 1, 18, 30, 0)).total_seconds() doma_expected_availability = doma_available_time / doma_total_time domb_available_time = (datetime(2016, 10, 1, 19, 24, 59) - datetime(2016, 10, 1, 18, 30, 0)).total_seconds() domb_available_time += (datetime(2016, 10, 1, 20, 44, 58) - datetime(2016, 10, 1, 20, 24, 59)).total_seconds() domb_total_time = (datetime(2016, 10, 1, 21, 0, 0) - datetime(2016, 10, 1, 18, 30, 0)).total_seconds() domb_expected_availability = domb_available_time / domb_total_time total_expected_availability = (doma_expected_availability + domb_expected_availability) / 2.0 self.assertAlmostEqual(total_expected_availability, combined_telescope_availability[combined_key][0][1])
def test_telescope_availability_spans_interval(self, mock_intervals): mock_intervals.return_value = [(datetime(2016, 9, 30, 18, 30, 0, tzinfo=timezone.utc), datetime(2016, 9, 30, 21, 0, 0, tzinfo=timezone.utc)), (datetime(2016, 10, 1, 18, 30, 0, tzinfo=timezone.utc), datetime(2016, 10, 1, 19, 0, 0, tzinfo=timezone.utc)), (datetime(2016, 10, 1, 19, 10, 0, tzinfo=timezone.utc), datetime(2016, 10, 1, 19, 20, 0, tzinfo=timezone.utc)), (datetime(2016, 10, 2, 18, 30, 0, tzinfo=timezone.utc), datetime(2016, 10, 2, 21, 0, 0, tzinfo=timezone.utc))] start = datetime(2016, 9, 30, tzinfo=timezone.utc) end = datetime(2016, 10, 2, tzinfo=timezone.utc) telescope_availability = get_telescope_availability_per_day(start, end) self.assertIn(self.tk1, telescope_availability) self.assertIn(self.tk2, telescope_availability) doma_available_time = (datetime(2016, 10, 1, 19, 0, 0) - datetime(2016, 10, 1, 18, 30, 0)).total_seconds() doma_available_time += (datetime(2016, 10, 1, 19, 20, 0) - datetime(2016, 10, 1, 19, 10, 0)).total_seconds() doma_total_time = doma_available_time doma_expected_availability = doma_available_time / doma_total_time self.assertAlmostEqual(doma_expected_availability, telescope_availability[self.tk1][0][1]) domb_expected_availability = 1.0 self.assertAlmostEqual(domb_expected_availability, telescope_availability[self.tk2][0][1])
def get(self, request): try: start, end = get_start_end_paramters(request, default_days_back=1) except ValueError as e: return HttpResponseBadRequest(str(e)) combine = request.query_params.get('combine') sites = request.query_params.getlist('site') telescopes = request.query_params.getlist('telescope') telescope_availability = get_telescope_availability_per_day( start, end, sites=sites, telescopes=telescopes ) if combine: telescope_availability = combine_telescope_availabilities_by_site_and_class(telescope_availability) str_telescope_availability = {str(k): v for k, v in telescope_availability.items()} return Response(str_telescope_availability)
def get(self, request): try: start, end = get_start_end_paramters(request, default_days_back=1) except ValueError as e: return HttpResponseBadRequest(str(e)) combine = request.query_params.get('combine') sites = request.query_params.getlist('site') telescopes = request.query_params.getlist('telescope') try: telescope_availability = get_telescope_availability_per_day( start, end, sites=sites, telescopes=telescopes ) except ElasticSearchException: logger.warning('Error connecting to ElasticSearch. Is SBA reachable?') return Response('ConnectionError') if combine: telescope_availability = combine_telescope_availabilities_by_site_and_class(telescope_availability) str_telescope_availability = {str(k): v for k, v in telescope_availability.items()} return Response(str_telescope_availability)