Changed JSON fields on mutable objects in Release object

Changed all JSON types fields of Release object on corresponding
Mutable(Dict/List) types.
Changed default value of 'vmware_attributes_metadata' field.

Change-Id: I024e199518526c1e60058c0ad25150ed4a543d26
Partial-Bug: 1482658
This commit is contained in:
Valentin Kaplov 2015-12-02 12:51:43 +03:00
parent 984f3bfc6a
commit 4aaa691d7c
3 changed files with 23 additions and 24 deletions

View File

@ -27,6 +27,7 @@ from sqlalchemy.orm import relationship
from nailgun import consts from nailgun import consts
from nailgun.db.sqlalchemy.models.base import Base from nailgun.db.sqlalchemy.models.base import Base
from nailgun.db.sqlalchemy.models.fields import JSON from nailgun.db.sqlalchemy.models.fields import JSON
from nailgun.db.sqlalchemy.models.mutable import MutableDict
from nailgun.db.sqlalchemy.models.mutable import MutableList from nailgun.db.sqlalchemy.models.mutable import MutableList
@ -38,7 +39,7 @@ class Release(Base):
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
name = Column(Unicode(100), nullable=False) name = Column(Unicode(100), nullable=False)
version = Column(String(30), nullable=False) version = Column(String(30), nullable=False)
can_update_from_versions = Column(JSON, default=[], can_update_from_versions = Column(MutableList.as_mutable(JSON), default=[],
nullable=False, server_default='[]') nullable=False, server_default='[]')
description = Column(Unicode) description = Column(Unicode)
operating_system = Column(String(50), nullable=False) operating_system = Column(String(50), nullable=False)
@ -50,18 +51,20 @@ class Release(Base):
nullable=False, nullable=False,
default=consts.RELEASE_STATES.unavailable default=consts.RELEASE_STATES.unavailable
) )
networks_metadata = Column(JSON, default={}) networks_metadata = Column(MutableDict.as_mutable(JSON), default={})
attributes_metadata = Column(JSON, default={}) attributes_metadata = Column(MutableDict.as_mutable(JSON), default={})
volumes_metadata = Column(JSON, default={}) volumes_metadata = Column(MutableDict.as_mutable(JSON), default={})
modes_metadata = Column(JSON, default={}) modes_metadata = Column(MutableDict.as_mutable(JSON), default={})
roles_metadata = Column(JSON, default={}) roles_metadata = Column(MutableDict.as_mutable(JSON), default={})
network_roles_metadata = Column(JSON, default=[], server_default='[]') network_roles_metadata = Column(
wizard_metadata = Column(JSON, default={}) MutableList.as_mutable(JSON), default=[], server_default='[]')
deployment_tasks = Column(JSON, default=[]) wizard_metadata = Column(MutableDict.as_mutable(JSON), default={})
vmware_attributes_metadata = Column(JSON, default=[]) deployment_tasks = Column(MutableList.as_mutable(JSON), default=[])
vmware_attributes_metadata = Column(
MutableDict.as_mutable(JSON), default={})
components_metadata = Column( components_metadata = Column(
MutableList.as_mutable(JSON), default=[], server_default='[]') MutableList.as_mutable(JSON), default=[], server_default='[]')
modes = Column(JSON, default=[]) modes = Column(MutableList.as_mutable(JSON), default=[])
clusters = relationship( clusters = relationship(
"Cluster", "Cluster",
primaryjoin="Release.id==Cluster.release_id", primaryjoin="Release.id==Cluster.release_id",

View File

@ -18,8 +18,6 @@
Release object and collection Release object and collection
""" """
import copy
from distutils.version import StrictVersion from distutils.version import StrictVersion
import yaml import yaml
@ -79,24 +77,19 @@ class Release(NailgunObject):
:param role: a role dict :param role: a role dict
:returns: None :returns: None
""" """
# mark sqlalchemy's attribute as dirty, so it will be flushed
# when needed
instance.roles_metadata = copy.deepcopy(instance.roles_metadata)
instance.volumes_metadata = copy.deepcopy(instance.volumes_metadata)
instance.roles_metadata[role['name']] = role['meta'] instance.roles_metadata[role['name']] = role['meta']
instance.volumes_metadata['volumes_roles_mapping'][role['name']] = \ instance.volumes_metadata['volumes_roles_mapping'][role['name']] = \
role.get('volumes_roles_mapping', []) role.get('volumes_roles_mapping', [])
# Data was changed in second level, so mark attribute as changed
instance.volumes_metadata.changed()
@classmethod @classmethod
def remove_role(cls, instance, role_name): def remove_role(cls, instance, role_name):
# mark sqlalchemy's attribute as dirty, so it will be flushed
# when needed
instance.roles_metadata = copy.deepcopy(instance.roles_metadata)
instance.volumes_metadata = copy.deepcopy(instance.volumes_metadata)
result = instance.roles_metadata.pop(role_name, None) result = instance.roles_metadata.pop(role_name, None)
instance.volumes_metadata['volumes_roles_mapping'].pop(role_name, None) instance.volumes_metadata['volumes_roles_mapping'].pop(role_name, None)
# Data was changed in second level, so mark attribute as changed
instance.volumes_metadata.changed()
return bool(result) return bool(result)
@classmethod @classmethod

View File

@ -14,7 +14,10 @@ kombu>=3.0.16
netaddr>=0.7.12,!=0.7.16 netaddr>=0.7.12,!=0.7.16
oslo.config>=2.3.0 oslo.config>=2.3.0
oslo.serialization>=1.4.0 oslo.serialization>=1.4.0
SQLAlchemy>=0.9.9,<1.1.0 # MutableDict.pop has a bug in version 1.0.10. 'pop' takes 2 args instead of 3.
# Before upping max version please ensure, that bug was fixed.
# https://bitbucket.org/zzzeek/sqlalchemy/issues/3605
SQLAlchemy>=0.9.9,<1.0.10
# oslo.db has no upper bound for sqlalchemy-migrate, and latest # oslo.db has no upper bound for sqlalchemy-migrate, and latest
# sqlalchemy-migrate requires conflicting version of pbr. # sqlalchemy-migrate requires conflicting version of pbr.
sqlalchemy-migrate>=0.9.6 sqlalchemy-migrate>=0.9.6