Use JsonEncoded{Dict,List} from oslo_db

Change-Id: I6aec5e40cefaab7f740bfa02d0386b7fc93aaae1
This commit is contained in:
Dmitry Tantsur 2015-08-21 20:02:17 +02:00
parent da8f9c8529
commit f91748619c
1 changed files with 12 additions and 48 deletions

View File

@ -18,17 +18,15 @@
SQLAlchemy models for baremetal data. SQLAlchemy models for baremetal data.
""" """
import json
from oslo_config import cfg from oslo_config import cfg
from oslo_db import options as db_options from oslo_db import options as db_options
from oslo_db.sqlalchemy import models from oslo_db.sqlalchemy import models
from oslo_db.sqlalchemy import types as db_types
import six.moves.urllib.parse as urlparse import six.moves.urllib.parse as urlparse
from sqlalchemy import Boolean, Column, DateTime from sqlalchemy import Boolean, Column, DateTime
from sqlalchemy import ForeignKey, Integer from sqlalchemy import ForeignKey, Integer
from sqlalchemy import schema, String, Text from sqlalchemy import schema, String, Text
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.types import TypeDecorator, TEXT
from ironic.common.i18n import _ from ironic.common.i18n import _
from ironic.common import paths from ironic.common import paths
@ -55,40 +53,6 @@ def table_args():
return None return None
class JsonEncodedType(TypeDecorator):
"""Abstract base type serialized as json-encoded string in db."""
type = None
impl = TEXT
def process_bind_param(self, value, dialect):
if value is None:
# Save default value according to current type to keep the
# interface the consistent.
value = self.type()
elif not isinstance(value, self.type):
raise TypeError("%s supposes to store %s objects, but %s given"
% (self.__class__.__name__,
self.type.__name__,
type(value).__name__))
serialized_value = json.dumps(value)
return serialized_value
def process_result_value(self, value, dialect):
if value is not None:
value = json.loads(value)
return value
class JSONEncodedDict(JsonEncodedType):
"""Represents dict serialized as json-encoded string in db."""
type = dict
class JSONEncodedList(JsonEncodedType):
"""Represents list serialized as json-encoded string in db."""
type = list
class IronicBase(models.TimestampMixin, class IronicBase(models.TimestampMixin,
models.ModelBase): models.ModelBase):
@ -114,7 +78,7 @@ class Chassis(Base):
) )
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
uuid = Column(String(36)) uuid = Column(String(36))
extra = Column(JSONEncodedDict) extra = Column(db_types.JsonEncodedDict)
description = Column(String(255), nullable=True) description = Column(String(255), nullable=True)
@ -128,7 +92,7 @@ class Conductor(Base):
) )
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
hostname = Column(String(255), nullable=False) hostname = Column(String(255), nullable=False)
drivers = Column(JSONEncodedList) drivers = Column(db_types.JsonEncodedList)
online = Column(Boolean, default=True) online = Column(Boolean, default=True)
@ -156,15 +120,15 @@ class Node(Base):
target_provision_state = Column(String(15), nullable=True) target_provision_state = Column(String(15), nullable=True)
provision_updated_at = Column(DateTime, nullable=True) provision_updated_at = Column(DateTime, nullable=True)
last_error = Column(Text, nullable=True) last_error = Column(Text, nullable=True)
instance_info = Column(JSONEncodedDict) instance_info = Column(db_types.JsonEncodedDict)
properties = Column(JSONEncodedDict) properties = Column(db_types.JsonEncodedDict)
driver = Column(String(255)) driver = Column(String(255))
driver_info = Column(JSONEncodedDict) driver_info = Column(db_types.JsonEncodedDict)
driver_internal_info = Column(JSONEncodedDict) driver_internal_info = Column(db_types.JsonEncodedDict)
clean_step = Column(JSONEncodedDict) clean_step = Column(db_types.JsonEncodedDict)
raid_config = Column(JSONEncodedDict) raid_config = Column(db_types.JsonEncodedDict)
target_raid_config = Column(JSONEncodedDict) target_raid_config = Column(db_types.JsonEncodedDict)
# NOTE(deva): this is the host name of the conductor which has # NOTE(deva): this is the host name of the conductor which has
# acquired a TaskManager lock on the node. # acquired a TaskManager lock on the node.
@ -185,7 +149,7 @@ class Node(Base):
console_enabled = Column(Boolean, default=False) console_enabled = Column(Boolean, default=False)
inspection_finished_at = Column(DateTime, nullable=True) inspection_finished_at = Column(DateTime, nullable=True)
inspection_started_at = Column(DateTime, nullable=True) inspection_started_at = Column(DateTime, nullable=True)
extra = Column(JSONEncodedDict) extra = Column(db_types.JsonEncodedDict)
class Port(Base): class Port(Base):
@ -200,4 +164,4 @@ class Port(Base):
uuid = Column(String(36)) uuid = Column(String(36))
address = Column(String(18)) address = Column(String(18))
node_id = Column(Integer, ForeignKey('nodes.id'), nullable=True) node_id = Column(Integer, ForeignKey('nodes.id'), nullable=True)
extra = Column(JSONEncodedDict) extra = Column(db_types.JsonEncodedDict)