From 2e78f14736c41e0b68b386ecadea0fe4f798e4d9 Mon Sep 17 00:00:00 2001
From: Guba Sándor <guba.sandor@cloud.bme.hu>
Date: Fri, 13 Sep 2013 23:07:39 +0200
Subject: [PATCH] refactor manager

---
 circle/manager/mancelery.py                                                                         |   9 ++++-----
 circle/manager/storage.py                                                                           |  16 ----------------
 circle/manager/storage_manager.py                                                                   |  18 ++++++++++++++++++
 circle/manager/vm.py                                                                                |  36 ------------------------------------
 circle/manager/vm_manager.py                                                                        |  36 ++++++++++++++++++++++++++++++++++++
 circle/vm/migrations/0003_auto__chg_field_instance_raw_data__chg_field_instancetemplate_raw_data.py | 272 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 circle/vm/models.py                                                                                 |  21 +++++++++++----------
 7 files changed, 341 insertions(+), 67 deletions(-)
 delete mode 100644 circle/manager/storage.py
 create mode 100644 circle/manager/storage_manager.py
 delete mode 100644 circle/manager/vm.py
 create mode 100644 circle/manager/vm_manager.py
 create mode 100644 circle/vm/migrations/0003_auto__chg_field_instance_raw_data__chg_field_instancetemplate_raw_data.py

diff --git a/circle/manager/mancelery.py b/circle/manager/mancelery.py
index 67d9e38..1fbd803 100755
--- a/circle/manager/mancelery.py
+++ b/circle/manager/mancelery.py
@@ -1,13 +1,12 @@
 from celery import Celery
 from kombu import Queue, Exchange
-from socket import gethostname
+from os import getenv
 
-
-HOSTNAME = gethostname()
+HOSTNAME = "localhost"
 
 celery = Celery('manager', backend='amqp',
-                broker='amqp://cloud:test@10.9.1.31/vmdriver',
-                include=['vmdriver_stub'])
+                broker=getenv("AMQP_URI"),
+                include=['manager.vm_manager', 'manager.storage_manager'])
 
 celery.conf.update(
     CELERY_QUEUES=(
diff --git a/circle/manager/storage.py b/circle/manager/storage.py
deleted file mode 100644
index 492d717..0000000
--- a/circle/manager/storage.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from .mancelery import celery
-
-
-@celery.task
-def deploy(disk, user):
-    '''Create new virtual machine from VM class.
-    '''
-    disk.deploy(task_uuid=deploy.rdiskd, user=user)
-
-
-def delete():
-    pass
-
-
-def save_as():
-    pass
diff --git a/circle/manager/storage_manager.py b/circle/manager/storage_manager.py
new file mode 100644
index 0000000..d0f1589
--- /dev/null
+++ b/circle/manager/storage_manager.py
@@ -0,0 +1,18 @@
+from .mancelery import celery
+
+
+@celery.task
+def deploy(disk, user):
+    '''Create new virtual machine from VM class.
+    '''
+    disk.deploy(task_uuid=deploy.rdiskd, user=user)
+
+
+@celery.task
+def delete():
+    pass
+
+
+@celery.task
+def save_as():
+    pass
diff --git a/circle/manager/vm.py b/circle/manager/vm.py
deleted file mode 100644
index 3a75108..0000000
--- a/circle/manager/vm.py
+++ /dev/null
@@ -1,36 +0,0 @@
-from mancelery import celery
-
-
-@celery.task
-def deploy(instance, user):
-    '''Create new virtual machine from VM class.
-    '''
-    instance.deploy(task_uuid=deploy.request.id, user=user)
-
-
-def delete():
-    pass
-
-
-def save_as():
-    pass
-
-
-def suspend():
-    pass
-
-
-def resume():
-    pass
-
-
-def restart():
-    pass
-
-
-def reset():
-    pass
-
-
-def migrate():
-    pass
diff --git a/circle/manager/vm_manager.py b/circle/manager/vm_manager.py
new file mode 100644
index 0000000..008829f
--- /dev/null
+++ b/circle/manager/vm_manager.py
@@ -0,0 +1,36 @@
+from .mancelery import celery
+
+
+@celery.task
+def deploy(instance, user):
+    '''Create new virtual machine from VM class.
+    '''
+    instance.deploy(task_uuid=deploy.request.id, user=user)
+
+
+def delete():
+    pass
+
+
+def save_as():
+    pass
+
+
+def suspend():
+    pass
+
+
+def resume():
+    pass
+
+
+def restart():
+    pass
+
+
+def reset():
+    pass
+
+
+def migrate():
+    pass
diff --git a/circle/vm/migrations/0003_auto__chg_field_instance_raw_data__chg_field_instancetemplate_raw_data.py b/circle/vm/migrations/0003_auto__chg_field_instance_raw_data__chg_field_instancetemplate_raw_data.py
new file mode 100644
index 0000000..cb55b76
--- /dev/null
+++ b/circle/vm/migrations/0003_auto__chg_field_instance_raw_data__chg_field_instancetemplate_raw_data.py
@@ -0,0 +1,272 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+
+        # Changing field 'Instance.raw_data'
+        db.alter_column(u'vm_instance', 'raw_data', self.gf('django.db.models.fields.TextField')(default=''))
+
+        # Changing field 'InstanceTemplate.raw_data'
+        db.alter_column(u'vm_instancetemplate', 'raw_data', self.gf('django.db.models.fields.TextField')(default=''))
+
+        # Changing field 'NamedBaseResourceConfig.raw_data'
+        db.alter_column(u'vm_namedbaseresourceconfig', 'raw_data', self.gf('django.db.models.fields.TextField')(default=''))
+
+    def backwards(self, orm):
+
+        # Changing field 'Instance.raw_data'
+        db.alter_column(u'vm_instance', 'raw_data', self.gf('django.db.models.fields.TextField')(null=True))
+
+        # Changing field 'InstanceTemplate.raw_data'
+        db.alter_column(u'vm_instancetemplate', 'raw_data', self.gf('django.db.models.fields.TextField')(null=True))
+
+        # Changing field 'NamedBaseResourceConfig.raw_data'
+        db.alter_column(u'vm_namedbaseresourceconfig', 'raw_data', self.gf('django.db.models.fields.TextField')(null=True))
+
+    models = {
+        u'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        u'auth.permission': {
+            'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        u'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+        },
+        u'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        u'firewall.domain': {
+            'Meta': {'object_name': 'Domain'},
+            'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
+            'ttl': ('django.db.models.fields.IntegerField', [], {'default': '600'})
+        },
+        u'firewall.group': {
+            'Meta': {'object_name': 'Group'},
+            'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}),
+            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        u'firewall.host': {
+            'Meta': {'object_name': 'Host'},
+            'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['firewall.Group']", 'null': 'True', 'blank': 'True'}),
+            'hostname': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ipv4': ('django.db.models.fields.GenericIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
+            'ipv6': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'location': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'mac': ('firewall.fields.MACAddressField', [], {'unique': 'True', 'max_length': '17'}),
+            'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
+            'pub_ipv4': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}),
+            'reverse': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}),
+            'shared_ip': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'vlan': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Vlan']"})
+        },
+        u'firewall.vlan': {
+            'Meta': {'object_name': 'Vlan'},
+            'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'dhcp_pool': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Domain']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'interface': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}),
+            'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}),
+            'network4': ('firewall.fields.IPNetworkField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'network6': ('firewall.fields.IPNetworkField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+            'reverse_domain': ('django.db.models.fields.TextField', [], {'default': "'%(d)d.%(c)d.%(b)d.%(a)d.in-addr.arpa'"}),
+            'snat_ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}),
+            'snat_to': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['firewall.Vlan']", 'null': 'True', 'blank': 'True'}),
+            'vid': ('django.db.models.fields.IntegerField', [], {'unique': 'True'})
+        },
+        u'storage.datastore': {
+            'Meta': {'ordering': "['name']", 'object_name': 'DataStore'},
+            'hostname': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
+            'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'})
+        },
+        u'storage.disk': {
+            'Meta': {'ordering': "['name']", 'object_name': 'Disk'},
+            'base': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'derivatives'", 'null': 'True', 'to': u"orm['storage.Disk']"}),
+            'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
+            'datastore': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['storage.DataStore']"}),
+            'dev_num': ('django.db.models.fields.CharField', [], {'default': "'a'", 'max_length': '1'}),
+            'filename': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'ready': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'size': ('django.db.models.fields.IntegerField', [], {}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '10'})
+        },
+        u'vm.instance': {
+            'Meta': {'ordering': "['pk']", 'object_name': 'Instance'},
+            'access_method': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
+            'active_since': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'arch': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
+            'boot_menu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'disks': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'instance_set'", 'symmetrical': 'False', 'to': u"orm['storage.Disk']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'lease': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.Lease']"}),
+            'max_ram_size': ('django.db.models.fields.IntegerField', [], {}),
+            'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+            'node': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'instance_set'", 'null': 'True', 'to': u"orm['vm.Node']"}),
+            'num_cores': ('django.db.models.fields.IntegerField', [], {}),
+            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
+            'priority': ('django.db.models.fields.IntegerField', [], {}),
+            'pw': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
+            'ram_size': ('django.db.models.fields.IntegerField', [], {}),
+            'raw_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'state': ('django.db.models.fields.CharField', [], {'default': "'NOSTATE'", 'max_length': '20'}),
+            'template': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'instance_set'", 'null': 'True', 'to': u"orm['vm.InstanceTemplate']"}),
+            'time_of_delete': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
+            'time_of_suspend': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
+            'vnc_port': ('django.db.models.fields.IntegerField', [], {})
+        },
+        u'vm.instanceactivity': {
+            'Meta': {'object_name': 'InstanceActivity'},
+            'activity_code': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
+            'finished': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'instance': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_log'", 'to': u"orm['vm.Instance']"}),
+            'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
+            'result': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'started': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'state': ('django.db.models.fields.CharField', [], {'default': "'PENDING'", 'max_length': '50'}),
+            'task_uuid': ('django.db.models.fields.CharField', [], {'max_length': '50', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        u'vm.instancetemplate': {
+            'Meta': {'ordering': "['name']", 'object_name': 'InstanceTemplate'},
+            'access_method': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
+            'arch': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
+            'boot_menu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'disks': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'template_set'", 'symmetrical': 'False', 'to': u"orm['storage.Disk']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'lease': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'template_set'", 'to': u"orm['vm.Lease']"}),
+            'max_ram_size': ('django.db.models.fields.IntegerField', [], {}),
+            'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
+            'num_cores': ('django.db.models.fields.IntegerField', [], {}),
+            'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['vm.InstanceTemplate']", 'null': 'True', 'blank': 'True'}),
+            'priority': ('django.db.models.fields.IntegerField', [], {}),
+            'ram_size': ('django.db.models.fields.IntegerField', [], {}),
+            'raw_data': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'state': ('django.db.models.fields.CharField', [], {'default': "'NEW'", 'max_length': '10'}),
+            'system': ('django.db.models.fields.TextField', [], {'blank': 'True'})
+        },
+        u'vm.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Host']", 'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'instance': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interface_set'", 'to': u"orm['vm.Instance']"}),
+            'vlan': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'vm_interface'", 'to': u"orm['firewall.Vlan']"})
+        },
+        u'vm.interfacetemplate': {
+            'Meta': {'object_name': 'InterfaceTemplate'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'managed': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interface_set'", 'to': u"orm['vm.InstanceTemplate']"}),
+            'vlan': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Vlan']"})
+        },
+        u'vm.lease': {
+            'Meta': {'ordering': "['name']", 'object_name': 'Lease'},
+            'delete_interval_seconds': ('django.db.models.fields.IntegerField', [], {}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
+            'suspend_interval_seconds': ('django.db.models.fields.IntegerField', [], {})
+        },
+        u'vm.namedbaseresourceconfig': {
+            'Meta': {'object_name': 'NamedBaseResourceConfig'},
+            'arch': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
+            'boot_menu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'max_ram_size': ('django.db.models.fields.IntegerField', [], {}),
+            'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}),
+            'num_cores': ('django.db.models.fields.IntegerField', [], {}),
+            'priority': ('django.db.models.fields.IntegerField', [], {}),
+            'ram_size': ('django.db.models.fields.IntegerField', [], {}),
+            'raw_data': ('django.db.models.fields.TextField', [], {'blank': 'True'})
+        },
+        u'vm.node': {
+            'Meta': {'object_name': 'Node'},
+            'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
+            'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['firewall.Host']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}),
+            'num_cores': ('django.db.models.fields.IntegerField', [], {}),
+            'priority': ('django.db.models.fields.IntegerField', [], {}),
+            'ram_size': ('django.db.models.fields.IntegerField', [], {})
+        },
+        u'vm.nodeactivity': {
+            'Meta': {'object_name': 'NodeActivity'},
+            'activity_code': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
+            'finished': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
+            'node': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_log'", 'to': u"orm['vm.Node']"}),
+            'result': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'started': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'status': ('django.db.models.fields.CharField', [], {'default': "'PENDING'", 'max_length': '50'}),
+            'task_uuid': ('django.db.models.fields.CharField', [], {'max_length': '50', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['vm']
\ No newline at end of file
diff --git a/circle/vm/models.py b/circle/vm/models.py
index 05edc6e..ae3248b 100755
--- a/circle/vm/models.py
+++ b/circle/vm/models.py
@@ -13,7 +13,7 @@ from netaddr import EUI
 
 from . import tasks
 from firewall.models import Vlan, Host
-from manager import vm, scheduler
+from manager import vm_manager, scheduler
 from storage.models import Disk
 
 
@@ -35,7 +35,7 @@ class BaseResourceConfigModel(models.Model):
     arch = models.CharField(max_length=10, verbose_name=_('architecture'))
     priority = models.IntegerField(help_text=_('instance priority'))
     boot_menu = models.BooleanField(default=False)
-    raw_data = models.TextField(blank=True, null=True)
+    raw_data = models.TextField(blank=True)
 
     class Meta:
         abstract = True
@@ -242,7 +242,7 @@ class Instance(BaseResourceConfigModel, TimeStampedModel):
                                         verbose_name=_('active since'))
     node = models.ForeignKey(Node, blank=True, null=True,
                              related_name='instance_set',
-                             verbose_name=_('host nose'))
+                             verbose_name=_('host node'))
     state = models.CharField(choices=STATES, default='NOSTATE', max_length=20)
     disks = models.ManyToManyField(Disk, related_name='instance_set',
                                    verbose_name=_('disks'))
@@ -416,15 +416,15 @@ class Instance(BaseResourceConfigModel, TimeStampedModel):
                 'type': 'vnc',
                 'listen': '0.0.0.0',
                 'passwd': '',
-                'port': self.get_vnc_port()
+                'port': self.vnc_port
             },
-            'raw_data': self.raw_data
+            'raw_data': "" if not self.raw_data else self.raw_data
         }
 
     def deploy_async(self, user=None):
         """ Launch celery task to handle the job asynchronously.
         """
-        vm.deploy.apply_async(self, user)
+        vm_manager.deploy.apply_async(self, user, queue="localhost.man")
 
     def deploy(self, user=None, task_uuid=None):
         """ Deploy new virtual machine with network
@@ -437,7 +437,7 @@ class Instance(BaseResourceConfigModel, TimeStampedModel):
 
         # Schedule
         act.update_state("PENDING")
-        self.node = scheduler.get_node()
+        self.node = scheduler.get_node(self)
         self.save()
 
         # Create virtual images
@@ -447,8 +447,8 @@ class Instance(BaseResourceConfigModel, TimeStampedModel):
 
         # Deploy VM on remote machine
         act.update_state("DEPLOYING VM")
-        tasks.create.apply_async(self.get_vm_desc,
-                                 queue=self.node + ".vm").get()
+        tasks.create.apply_async(args=[self.get_vm_desc()],
+                                 queue=self.node.host.hostname + ".vm").get()
 
         # Estabilish network connection (vmdriver)
         act.update_state("DEPLOYING NET")
@@ -457,7 +457,8 @@ class Instance(BaseResourceConfigModel, TimeStampedModel):
 
         # Resume vm
         act.update_state("BOOTING")
-        tasks.resume.apply_async(self.vm_name, queue=self.node + ".vm").get()
+        tasks.resume.apply_async(args=[self.vm_name],
+                                 queue=self.node + ".vm").get()
 
         act.finish(result='SUCCESS')
 
--
libgit2 0.26.0