コード例 #1
0
 def test_post_invalid_timestamps(self):
     ship_id = str(uuid1())
     self.addCleanup(DBManager.delete_full_energy_entry, ship_id,
                     getLogger())
     data = {
         "spaceship_id":
         ship_id,
         "units":
         "kWh",
         "data": [
             {
                 "datetime": "2018-08-34T04:00:00Z",
                 "value": randint(0, 500)
             },
             {
                 "datetime": "2018-09-24T99:99:00Z",
                 "value": randint(0, 500)
             },
         ]
     }
     resp = requests.post(url=HOST_URL, json=data)
     expected = 'invalid values in data object'
     self.assertIn(expected, resp.text)
     self.assertEqual(resp.status_code, HTTPStatus.BAD_REQUEST)
     DBManager.delete_full_energy_entry(ship_id, getLogger())
コード例 #2
0
def ingest_data_and_respond(data, log):
    log.info('Got POSTed data: {}'.format(data))
    timeseries_df, err = Parser.validate_parse_consumption_data(data, log)
    if err != '':
        return err, HTTPStatus.BAD_REQUEST

    ship_id = data['spaceship_id']
    units = data['units'].lower()

    if units == 'kwh':
        timeseries, err = Parser.split(timeseries_df, log)
    elif units == 'kw':
        timeseries, err = Parser.convert_and_split(timeseries_df, log)

    if err != '':
        return err, HTTPStatus.BAD_REQUEST

    log.debug('Saving dataframe: {} \nfor ship_id: : {}'.format(
        timeseries,
        ship_id,
    ))

    if not DBManager.save_energy_entry(ship_id, timeseries):
        log.error('db save failed for ship: {}'.format(ship_id))
        log.error('timeseries: {}'.format(timeseries))
        res = DBManager.get_full_energy_entry(ship_id)
        log.error('full ship info in db befre fail: {}'.format(res))
        return 'DB error', HTTPStatus.SERVICE_UNAVAILABLE

    return 'Data saved successfully for ship {}'.format(ship_id)
コード例 #3
0
 def test_post_response_empty_data(self):
     ship_id = str(uuid1())
     self.addCleanup(DBManager.delete_full_energy_entry, ship_id,
                     getLogger())
     data = {"spaceship_id": ship_id, "units": "kWh", "data": []}
     resp = requests.post(url=HOST_URL, json=data)
     expected = 'empty data object'
     self.assertIn(expected, resp.text)
     self.assertEqual(resp.status_code, HTTPStatus.BAD_REQUEST)
     DBManager.delete_full_energy_entry(ship_id, getLogger())
コード例 #4
0
    def test_db_save_invalid_index(self):
        ship_id = str(uuid1())
        # create invalid dataframe
        index = pd.Series(np.random.randint(100))
        df = pd.DataFrame(index, columns=['not_date'])
        df['value'] = np.random.uniform(0, 1000,size=(len(index)))
        df = df.set_index('not_date')

        with self.assertRaises(TypeError):
            # save new timeseries
            DBManager.save_energy_entry(ship_id, df)
コード例 #5
0
def respond_to_aggregate_query(start, end):
    err = Parser.validate_start_and_end(start, end)
    if err != '':
        return Response(
            dumps({'error': err}),
            status=HTTPStatus.BAD_REQUEST,
            mimetype='application/json',
        )
    raw_usage_df = DBManager.get_fleet_raw_usage(start, end)
コード例 #6
0
    def test_db_query_outofrange(self):
        ship_id = str(uuid1())

        # create dataframe
        date_rng = pd.date_range(start='01/01/2018', end='02/01/2018', freq='15T')
        df = pd.DataFrame(date_rng, columns=['datetime'])
        df['value'] = np.random.uniform(0, 1000, size=(len(date_rng)))
        df['datetime'] = pd.to_datetime(df['datetime'])
        df = df.set_index('datetime')

        # save new timeseries
        DBManager.save_energy_entry(ship_id, df)

        # query
        start = '2019-01-01T00:00:00Z'
        end = '2022-01-05T00:00:00Z'
        got = DBManager.get_energy_entry(ship_id, start, end, MOCK_LOG)
        self.assertTrue(not got)

        # remove ship entry
        DBManager.delete_full_energy_entry(ship_id, MOCK_LOG)
コード例 #7
0
 def test_post_response_missing_units_label(self):
     ship_id = str(uuid1())
     self.addCleanup(DBManager.delete_full_energy_entry, ship_id,
                     getLogger())
     data = {
         "spaceship_id":
         ship_id,
         "data": [{
             "datetime": "2018-08-24T00:00:00Z",
             "value": randint(0, 500)
         }, {
             "datetime": "2018-08-24T01:00:00Z",
             "value": randint(0, 500)
         }, {
             "datetime": "2018-08-24T02:00:00Z",
             "value": randint(0, 500)
         }]
     }
     resp = requests.post(url=HOST_URL, json=data)
     expected = 'missing units in input fields'
     self.assertEqual(resp.text, expected)
     self.assertEqual(resp.status_code, HTTPStatus.BAD_REQUEST)
     DBManager.delete_full_energy_entry(ship_id, getLogger())
コード例 #8
0
 def test_post_missing_data_timestamp(self):
     ship_id = str(uuid1())
     self.addCleanup(DBManager.delete_full_energy_entry, ship_id,
                     getLogger())
     data = {
         "spaceship_id":
         ship_id,
         "units":
         "kWh",
         "data": [
             {
                 "value": randint(0, 500)
             },
             {
                 "datetime": "2018-09-24T01:45:00Z",
                 "value": randint(0, 500)
             },
         ]
     }
     resp = requests.post(url=HOST_URL, json=data)
     expected = 'Data saved successfully for ship'
     self.assertIn(expected, resp.text)
     self.assertEqual(resp.status_code, HTTPStatus.OK)
     DBManager.delete_full_energy_entry(ship_id, getLogger())
コード例 #9
0
def respond_to_query(ship_id, start, end, log):
    err = Parser.validate_query(ship_id, start, end)
    if err != '':
        return Response(
            dumps({'error': err}),
            status=HTTPStatus.BAD_REQUEST,
            mimetype='application/json',
        )

    try:
        ship_id = int(ship_id)
    except ValueError:
        ship_id = str(ship_id)

    log.info('Got query params: ship_id: {}, start: {}, end: {}'.format(
        ship_id, start, end))
    db_obj = DBManager.get_energy_entry(ship_id, start, end, log)
    if not db_obj:
        message = 'No entries found in date range {} to {}'.format(start, end)
        log.warning('Attempting to query invalid timeframe. sending: %s' %
                    message)
        return Response(
            dumps({'error': message}),
            status=HTTPStatus.BAD_REQUEST,
            mimetype='application/json',
        )
    log.debug("Retrived saved data: {}".format(db_obj))
    resp, err = Parser.db_obj_to_query_response(ship_id, db_obj, log)

    if err != '':
        return Response(
            dumps({'error': err}),
            status=HTTPStatus.SERVICE_UNAVAILABLE,
            mimetype='application/json',
        )
    log.debug('Converted retrived to json response: {}'.format(resp))
    return Response(resp, status=HTTPStatus.OK, mimetype='application/json')
コード例 #10
0
    def test_db_save_delete_basic(self):
        empty_db = True
        ship_id = str(uuid1())
        try:
            all_data = DBManager.dump_energy_ts(MOCK_LOG)
            db = all_data['energy']
            empty_db = False
        except KeyError:
            pass

        # create dataframe
        date_rng = pd.date_range(start='01/01/2018', end='01/04/2018', freq='15T')
        df = pd.DataFrame(date_rng, columns=['datetime'])
        df['value'] = np.random.uniform(0, 1000, size=(len(date_rng)))
        df['datetime'] = pd.to_datetime(df['datetime'])
        df = df.set_index('datetime')
        if not empty_db:
            for row in df.values:
                self.assertFalse([ship_id, row[0]] in db.values)


        # save new timeseries
        DBManager.save_energy_entry(ship_id, df)
        all_data = DBManager.dump_energy_ts(getLogger())
        db = all_data['energy']
        for row in df.values:
            self.assertTrue([ship_id, row[0]] in db.values)

        # remove ship entry
        DBManager.delete_full_energy_entry(ship_id, MOCK_LOG)
        try:
            all_data = DBManager.dump_energy_ts(getLogger())
            db = all_data['energy']
        except KeyError:
            return
        for row in df.values:
            self.assertFalse([ship_id, row[0]] in db.values)
コード例 #11
0
 def tearDownClass(cls):
     for data in cls.to_post:
         DBManager.delete_full_energy_entry(data['spaceship_id'], getLogger())