Skip to content

Commit

Permalink
Fix broken tests with timestamp
Browse files Browse the repository at this point in the history
  • Loading branch information
rafaelweingartner committed Feb 13, 2025
1 parent c1b35c2 commit 1c4c7e9
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,11 @@
Create Date: 2024-04-24 09:16:00
"""

import datetime
from alembic import op

import sqlalchemy

from sqlalchemy.sql import func

# revision identifiers, used by Alembic.
revision = 'f89ed2e3c2ec'
down_revision = '18fff4509e3e'
Expand All @@ -33,7 +32,9 @@


def upgrade():
op.add_column(
"metric", sqlalchemy.Column(
sql_column = sqlalchemy.Column(
"last_measure_timestamp", sqlalchemy.DateTime,
nullable=False, server_default=func.current_timestamp()))
nullable=False, default=datetime.datetime.now(datetime.UTC),
server_default=sqlalchemy.sql.func.current_timestamp())
op.add_column(
"metric", sql_column)
6 changes: 3 additions & 3 deletions gnocchi/indexer/sqlalchemy_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
# License for the specific language governing permissions and limitations
# under the License.

import datetime
from oslo_db.sqlalchemy import models
import sqlalchemy
from sqlalchemy.ext import declarative
from sqlalchemy.orm import declarative_base
from sqlalchemy.sql import func

import sqlalchemy_utils

Expand Down Expand Up @@ -119,8 +119,8 @@ class Metric(Base, GnocchiBase, indexer.Metric):
# measurements; thus, if all metric for a resource are in this situation,
# chances are that the resource ceased existing in the backend.
last_measure_timestamp = sqlalchemy.Column(
"last_measure_timestamp", sqlalchemy.DateTime,
nullable=False, server_default=func.current_timestamp())
"last_measure_timestamp", sqlalchemy.DateTime, default=datetime.datetime.now(datetime.UTC), nullable=False,
server_default=sqlalchemy.sql.func.current_timestamp())

def jsonify(self):
d = {
Expand Down
53 changes: 46 additions & 7 deletions gnocchi/tests/indexer/sqlalchemy/test_migrations.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@
import fixtures
import oslo_db.exception
from oslo_db.sqlalchemy import test_migrations
import sqlalchemy.schema

import sqlalchemy as sa
import sqlalchemy_utils

from unittest import mock

from gnocchi import indexer
from gnocchi.indexer import sqlalchemy
from gnocchi.indexer import sqlalchemy_base
from gnocchi.indexer import sqlalchemy as gnocchi_sqlalchemy
from gnocchi.indexer import sqlalchemy_base as gnocchi_sqlalchemy_base
from gnocchi.tests import base


Expand All @@ -41,7 +43,7 @@ def setUp(self):
self.db = mock.Mock()
self.conf.set_override(
'url',
sqlalchemy.SQLAlchemyIndexer._create_new_database(
gnocchi_sqlalchemy.SQLAlchemyIndexer._create_new_database(
self.conf.indexer.url),
'indexer')
self.index = indexer.get_driver(self.conf)
Expand All @@ -56,10 +58,10 @@ def setUp(self):
# NOTE(sileht): load it in sqlalchemy metadata
self.index._RESOURCE_TYPE_MANAGER.get_classes(rt)

for table in sqlalchemy_base.Base.metadata.sorted_tables:
for table in gnocchi_sqlalchemy_base.Base.metadata.sorted_tables:
if (table.name.startswith("rt_") and
table.name not in valid_resource_type_tables):
sqlalchemy_base.Base.metadata.remove(table)
gnocchi_sqlalchemy_base.Base.metadata.remove(table)
self.index._RESOURCE_TYPE_MANAGER._cache.pop(
table.name.replace('_history', ''), None)

Expand All @@ -72,7 +74,44 @@ def _drop_database(self):

@staticmethod
def get_metadata():
return sqlalchemy_base.Base.metadata
return gnocchi_sqlalchemy_base.Base.metadata

def get_engine(self):
return self.index.get_engine()

def compare_server_default(self, ctxt, ins_col, meta_col, insp_def, meta_def, rendered_meta_def):
"""Compare default values between model and db table.
Return True if the defaults are different, False if not, or None to
allow the default implementation to compare these defaults.
:param ctxt: alembic MigrationContext instance
:param ins_col: reflected column
:param insp_def: reflected column default value
:param meta_col: column from model
:param meta_def: column default value from model
:param rendered_meta_def: rendered column default value (from model)
"""

# When the column has server_default=sqlalchemy.sql.func.now(), the diff includes the followings diff
# [ [ ( 'modify_default',
# None,
# 'metric',
# 'last_measure_timestamp',
# { 'existing_comment': None,
# 'existing_nullable': False,
# 'existing_type': DATETIME()},
# DefaultClause(<sqlalchemy.sql.elements.TextClause object at 0x7f0100b24b50>, for_update=False),
# DefaultClause(<sqlalchemy.sql.functions.now at 0x7f01010b08d0; now>, for_update=False))]]
method_return = super(ModelsMigrationsSync, self).compare_server_default(ctxt, ins_col, meta_col, insp_def,
meta_def, rendered_meta_def)

is_server_default_current_timestamp = isinstance(meta_def.arg, sa.sql.functions.current_timestamp) and\
isinstance(ins_col.server_default.arg, sa.sql.elements.TextClause)

if not is_server_default_current_timestamp:
return method_return

# If it is different from "CURRENT_TIMESTAMP", then we must throw an error.
return rendered_meta_def != "CURRENT_TIMESTAMP"
1 change: 1 addition & 0 deletions gnocchi/tests/test_carbonara.py
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,7 @@ def test_aggregation_std_with_unique(self):
ts = carbonara.TimeSerie.from_data(
[datetime64(2014, 1, 1, 12, 0, 0)], [3])
ts = self._resample(ts, numpy.timedelta64(60, 's'), 'std')

self.assertEqual(0, len(ts), ts.values)

ts = carbonara.TimeSerie.from_data(
Expand Down

0 comments on commit 1c4c7e9

Please sign in to comment.