Revision 9dcfad23

b/snf-cyclades-app/synnefo/api/tests/servers.py
519 519
        with mocked_quotaholder():
520 520
            response = self.mypost('servers', 'test_user',
521 521
                                   json.dumps(request), 'json')
522
        self.assertEqual(response.status_code, 500)
522
        self.assertEqual(response.status_code, 202)
523 523
        mrapi().CreateInstance.assert_called_once()
524 524
        vm = VirtualMachine.objects.get()
525
        # The VM has been deleted
526
        self.assertTrue(vm.deleted)
527
        # and it has no nics
528
        self.assertEqual(len(vm.nics.all()), 0)
529
        self.assertEqual(vm.backendjobid, 0)
525
        # The VM has not been deleted
526
        self.assertFalse(vm.deleted)
527
        # but is in "ERROR" operstate
528
        self.assertEqual(vm.operstate, "ERROR")
530 529

  
531 530

  
532 531
@patch('synnefo.logic.rapi_pool.GanetiRapiClient')
b/snf-cyclades-app/synnefo/db/models.py
692 692
    STATES = (
693 693
        ("ACTIVE", "Active"),
694 694
        ("BUILDING", "Building"),
695
        ("ERROR", "Error"),
695 696
    )
696 697

  
697 698
    machine = models.ForeignKey(VirtualMachine, related_name='nics')
b/snf-cyclades-app/synnefo/logic/servers.py
1 1
import logging
2
import datetime
3 2

  
4 3
from socket import getfqdn
5 4
from functools import wraps
......
171 170
        # Create the server in Ganeti.
172 171
        create_server(vm, nics, flavor, image, personality, password)
173 172
    except:
174
        # If an exception is raised, then the user will never get the VM id.
175
        # In order to delete it from DB and release it's resources, we
176
        # mock a successful OP_INSTANCE_REMOVE job.
177
        backend.process_op_status(vm=vm, etime=datetime.datetime.now(),
178
                                  jobid=-0,
179
                                  opcode="OP_INSTANCE_REMOVE",
180
                                  status="success",
181
                                  logmsg="Reconciled eventd: VM creation"
182
                                         " failed.")
183
        raise
173
        log.exception("Failed create instance '%s'", vm)
174
        vm.operstate = "ERROR"
175
        vm.backendlogmsg = "Failed to send job to Ganeti."
176
        vm.save()
177
        vm.nics.all().update(state="ERROR")
184 178

  
185 179
    return vm
186 180

  
b/snf-cyclades-app/synnefo/logic/tests/servers.py
72 72
        # error in enqueue. check the vm is deleted and resources released
73 73
        mrapi().CreateInstance.side_effect = Exception("ganeti is down")
74 74
        with mocked_quotaholder():
75
            self.assertRaises(Exception, servers.create, **kwargs)
75
            servers.create(**kwargs)
76 76
        vm = models.VirtualMachine.objects.get()
77
        self.assertTrue(vm.deleted)
78
        self.assertEqual(len(vm.nics.all()), 0)
79
        vm.delete()
77
        self.assertFalse(vm.deleted)
78
        self.assertEqual(vm.operstate, "ERROR")
79
        self.assertEqual(len(vm.nics.all()), 1)
80
        for nic in vm.nics.all():
81
            self.assertEqual(nic.state, "ERROR")
80 82

  
81 83
        # success with no nics
82 84
        mrapi().CreateInstance.side_effect = None
......
85 87
                               DEFAULT_INSTANCE_NETWORKS=[]):
86 88
            with mocked_quotaholder():
87 89
                vm = servers.create(**kwargs)
88
        self.assertEqual(models.VirtualMachine.objects.count(), 1)
89 90
        vm = models.VirtualMachine.objects.get(id=vm.id)
90 91
        self.assertEqual(vm.nics.count(), 0)
91 92
        self.assertEqual(vm.backendjobid, 42)

Also available in: Unified diff