indexer: make sure original_resource_id is never NULL

Currently the original resource id is never NULL… except when statsd create its
resource! So that's the only resource with a NULL original_resource_id.

Change-Id: If0b27630961808287d6b4d84b340dc9510191096
This commit is contained in:
Julien Danjou 2017-01-26 19:30:37 +01:00
parent ad4b851c7f
commit 2c0f2b6930
4 changed files with 77 additions and 8 deletions

View File

@ -0,0 +1,39 @@
# Copyright 2017 OpenStack Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
"""Make sure resource.original_resource_id is NOT NULL
Revision ID: 1e1a63d3d186
Revises: 397987e38570
Create Date: 2017-01-26 19:33:35.209688
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '1e1a63d3d186'
down_revision = '397987e38570'
branch_labels = None
depends_on = None
def upgrade():
for table_name in ('resource', 'resource_history'):
op.alter_column(table_name, "original_resource_id", nullable=False,
existing_type=sa.String(255),
existing_nullable=True)

View File

@ -734,17 +734,21 @@ class SQLAlchemyIndexer(indexer.IndexerDriver):
def create_resource(self, resource_type, id,
creator, user_id=None, project_id=None,
started_at=None, ended_at=None, metrics=None,
original_resource_id=None,
**kwargs):
if (started_at is not None
and ended_at is not None
and started_at > ended_at):
raise ValueError(
"Start timestamp cannot be after end timestamp")
if original_resource_id is None:
original_resource_id = str(id)
with self.facade.writer() as session:
resource_cls = self._resource_type_to_mappers(
session, resource_type)['resource']
r = resource_cls(
id=id,
original_resource_id=original_resource_id,
type=resource_type,
creator=creator,
user_id=user_id,

View File

@ -337,7 +337,8 @@ class ResourceMixin(ResourceJsonifier):
ended_at = sqlalchemy.Column(TimestampUTC)
user_id = sqlalchemy.Column(sqlalchemy.String(255))
project_id = sqlalchemy.Column(sqlalchemy.String(255))
original_resource_id = sqlalchemy.Column(sqlalchemy.String(255))
original_resource_id = sqlalchemy.Column(sqlalchemy.String(255),
nullable=False)
class Resource(ResourceMixin, Base, GnocchiBase):

View File

@ -214,7 +214,32 @@ class TestIndexerDriver(tests_base.TestCase):
"project_id": None,
"started_at": rc.started_at,
"ended_at": None,
"original_resource_id": None,
"original_resource_id": str(r1),
"type": "generic",
"metrics": {}},
rc.jsonify())
rg = self.index.get_resource('generic', r1, with_metrics=True)
self.assertEqual(rc, rg)
self.assertEqual(rc.metrics, rg.metrics)
def test_create_resource_with_original_resource_id(self):
r1 = uuid.uuid4()
creator = str(uuid.uuid4())
rc = self.index.create_resource('generic', r1, creator,
original_resource_id="foobar")
self.assertIsNotNone(rc.started_at)
self.assertIsNotNone(rc.revision_start)
self.assertEqual({"id": r1,
"revision_start": rc.revision_start,
"revision_end": None,
"creator": creator,
"created_by_user_id": creator,
"created_by_project_id": "",
"user_id": None,
"project_id": None,
"started_at": rc.started_at,
"ended_at": None,
"original_resource_id": "foobar",
"type": "generic",
"metrics": {}},
rc.jsonify())
@ -240,7 +265,7 @@ class TestIndexerDriver(tests_base.TestCase):
"project_id": None,
"started_at": rc.started_at,
"ended_at": None,
"original_resource_id": None,
"original_resource_id": str(r1),
"type": "generic",
"metrics": {}},
rc.jsonify())
@ -323,7 +348,7 @@ class TestIndexerDriver(tests_base.TestCase):
"project_id": None,
"started_at": ts,
"ended_at": None,
"original_resource_id": None,
"original_resource_id": str(r1),
"type": "generic",
"metrics": {}}, rc.jsonify())
r = self.index.get_resource('generic', r1, with_metrics=True)
@ -352,7 +377,7 @@ class TestIndexerDriver(tests_base.TestCase):
"project_id": None,
"started_at": rc.started_at,
"ended_at": None,
"original_resource_id": None,
"original_resource_id": str(r1),
"type": "generic",
"metrics": {'foo': str(e1), 'bar': str(e2)}},
rc.jsonify())
@ -369,7 +394,7 @@ class TestIndexerDriver(tests_base.TestCase):
"ended_at": None,
"user_id": None,
"project_id": None,
"original_resource_id": None,
"original_resource_id": str(r1),
"metrics": {'foo': str(e1), 'bar': str(e2)}},
r.jsonify())
@ -419,7 +444,7 @@ class TestIndexerDriver(tests_base.TestCase):
"project_id": None,
"type": "generic",
"started_at": r.started_at,
"original_resource_id": None,
"original_resource_id": str(r1),
"metrics": {}}, r.jsonify())
def test_update_resource_metrics(self):
@ -592,7 +617,7 @@ class TestIndexerDriver(tests_base.TestCase):
"created_by_user_id": creator,
"user_id": None,
"project_id": None,
"original_resource_id": None,
"original_resource_id": str(r1),
"type": "generic",
"metrics": {'bar': str(e2)}}, r.jsonify())