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

View File

@ -18,8 +18,6 @@
Release object and collection
"""
import copy
from distutils.version import StrictVersion
import yaml
@ -79,24 +77,19 @@ class Release(NailgunObject):
:param role: a role dict
: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.volumes_metadata['volumes_roles_mapping'][role['name']] = \
role.get('volumes_roles_mapping', [])
# Data was changed in second level, so mark attribute as changed
instance.volumes_metadata.changed()
@classmethod
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)
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)
@classmethod

View File

@ -14,7 +14,10 @@ kombu>=3.0.16
netaddr>=0.7.12,!=0.7.16
oslo.config>=2.3.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
# sqlalchemy-migrate requires conflicting version of pbr.
sqlalchemy-migrate>=0.9.6