瀏覽代碼

Adds sqlalchemy json type

Alessandro Pilotti 10 年之前
父節點
當前提交
344907d7cf
共有 3 個文件被更改,包括 45 次插入7 次删除
  1. 3 5
      coriolis/conductor/rpc/server.py
  2. 4 2
      coriolis/db/sqlalchemy/models.py
  3. 38 0
      coriolis/db/sqlalchemy/types.py

+ 3 - 5
coriolis/conductor/rpc/server.py

@@ -1,7 +1,5 @@
 import uuid
 import uuid
 
 
-import json
-
 from oslo_log import log as logging
 from oslo_log import log as logging
 
 
 from coriolis import constants
 from coriolis import constants
@@ -28,8 +26,8 @@ class ConductorServerEndpoint(object):
         migration = models.Migration()
         migration = models.Migration()
         migration.id = str(uuid.uuid4())
         migration.id = str(uuid.uuid4())
         migration.status = constants.MIGRATION_STATUS_STARTED
         migration.status = constants.MIGRATION_STATUS_STARTED
-        migration.origin = json.dumps(origin)
-        migration.destination = json.dumps(destination)
+        migration.origin = origin
+        migration.destination = destination
 
 
         for instance in instances:
         for instance in instances:
             task = models.Task()
             task = models.Task()
@@ -74,7 +72,7 @@ class ConductorServerEndpoint(object):
 
 
         self._rpc_worker_client.begin_import_instance(
         self._rpc_worker_client.begin_import_instance(
             ctxt, op_export.host, op_import.id,
             ctxt, op_export.host, op_import.id,
-            json.loads(op_import.migration.destination),
+            op_import.migration.destination,
             op_import.instance,
             op_import.instance,
             export_info)
             export_info)
 
 

+ 4 - 2
coriolis/db/sqlalchemy/models.py

@@ -5,6 +5,8 @@ import sqlalchemy
 from sqlalchemy.ext import declarative
 from sqlalchemy.ext import declarative
 from sqlalchemy import orm
 from sqlalchemy import orm
 
 
+from coriolis.db.sqlalchemy import types
+
 BASE = declarative.declarative_base()
 BASE = declarative.declarative_base()
 
 
 
 
@@ -33,8 +35,8 @@ class Migration(BASE, models.TimestampMixin, models.ModelBase):
                            primary_key=True)
                            primary_key=True)
     user_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
     user_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
     project_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
     project_id = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
-    origin = sqlalchemy.Column(sqlalchemy.String(1024), nullable=False)
-    destination = sqlalchemy.Column(sqlalchemy.String(1024), nullable=False)
+    origin = sqlalchemy.Column(types.Json, nullable=False)
+    destination = sqlalchemy.Column(types.Json, nullable=False)
     status = sqlalchemy.Column(sqlalchemy.String(100), nullable=False)
     status = sqlalchemy.Column(sqlalchemy.String(100), nullable=False)
     tasks = orm.relationship(Task, cascade="all,delete",
     tasks = orm.relationship(Task, cascade="all,delete",
                              backref=orm.backref('migration'))
                              backref=orm.backref('migration'))

+ 38 - 0
coriolis/db/sqlalchemy/types.py

@@ -0,0 +1,38 @@
+
+#
+#    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.
+
+from oslo_serialization import jsonutils
+from sqlalchemy.dialects import mysql
+from sqlalchemy import types
+
+
+class LongText(types.TypeDecorator):
+    impl = types.Text
+
+    def load_dialect_impl(self, dialect):
+        if dialect.name == 'mysql':
+            return dialect.type_descriptor(mysql.LONGTEXT())
+        else:
+            return self.impl
+
+
+class Json(LongText):
+
+    def process_bind_param(self, value, dialect):
+        return jsonutils.dumps(value)
+
+    def process_result_value(self, value, dialect):
+        if value is None:
+            return None
+        return jsonutils.loads(value)