Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / callbacks.py @ 567ffb85

History | View | Annotate | Download (8 kB)

1 cb409cfd Georgios Gousios
# Copyright 2011 GRNET S.A. All rights reserved.
2 ad2d6807 Vangelis Koukis
#
3 cb409cfd Georgios Gousios
# Redistribution and use in source and binary forms, with or without
4 cb409cfd Georgios Gousios
# modification, are permitted provided that the following conditions
5 cb409cfd Georgios Gousios
# are met:
6 ad2d6807 Vangelis Koukis
#
7 cb409cfd Georgios Gousios
#   1. Redistributions of source code must retain the above copyright
8 cb409cfd Georgios Gousios
#      notice, this list of conditions and the following disclaimer.
9 ad2d6807 Vangelis Koukis
#
10 cb409cfd Georgios Gousios
#  2. Redistributions in binary form must reproduce the above copyright
11 cb409cfd Georgios Gousios
#     notice, this list of conditions and the following disclaimer in the
12 cb409cfd Georgios Gousios
#     documentation and/or other materials provided with the distribution.
13 cb409cfd Georgios Gousios
#
14 cb409cfd Georgios Gousios
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
15 cb409cfd Georgios Gousios
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 cb409cfd Georgios Gousios
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 cb409cfd Georgios Gousios
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
18 cb409cfd Georgios Gousios
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 cb409cfd Georgios Gousios
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 cb409cfd Georgios Gousios
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 cb409cfd Georgios Gousios
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 cb409cfd Georgios Gousios
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 cb409cfd Georgios Gousios
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 cb409cfd Georgios Gousios
# SUCH DAMAGE.
25 cb409cfd Georgios Gousios
#
26 cb409cfd Georgios Gousios
# The views and conclusions contained in the software and documentation are
27 cb409cfd Georgios Gousios
# those of the authors and should not be interpreted as representing official
28 cb409cfd Georgios Gousios
# policies, either expressed or implied, of GRNET S.A.
29 cb409cfd Georgios Gousios
30 cb409cfd Georgios Gousios
# Callback functions used by the dispatcher to process incoming notifications
31 cb409cfd Georgios Gousios
# from AMQP queues.
32 cb409cfd Georgios Gousios
33 86f046a8 Giorgos Verigakis
import logging
34 35079ab2 Georgios Gousios
import socket
35 23c84263 Georgios Gousios
import traceback
36 23c84263 Georgios Gousios
import json
37 23c84263 Georgios Gousios
import sys
38 23c84263 Georgios Gousios
39 23c84263 Georgios Gousios
from synnefo.db.models import VirtualMachine
40 1ed37c1d Giorgos Verigakis
from synnefo.logic import utils, backend
41 23c84263 Georgios Gousios
42 86f046a8 Giorgos Verigakis
43 86f046a8 Giorgos Verigakis
log = logging.getLogger()
44 23c84263 Georgios Gousios
45 95aee02c Vangelis Koukis
46 23c84263 Georgios Gousios
def update_db(message):
47 c25cc9ec Vangelis Koukis
    """Process a notification of type 'ganeti-op-status'"""
48 86f046a8 Giorgos Verigakis
    log.debug("Processing ganeti-op-status msg: %s", message.body)
49 eee48215 Vangelis Koukis
    msg = None
50 23c84263 Georgios Gousios
    try:
51 c25cc9ec Vangelis Koukis
        msg = json.loads(message.body)
52 23c84263 Georgios Gousios
53 23c84263 Georgios Gousios
        if msg["type"] != "ganeti-op-status":
54 86f046a8 Giorgos Verigakis
            log.error("Message is of unknown type %s.", msg["type"])
55 23c84263 Georgios Gousios
            return
56 23c84263 Georgios Gousios
57 0d0aa87d Georgios Gousios
        if msg["operation"] == "OP_INSTANCE_QUERY_DATA":
58 0d0aa87d Georgios Gousios
            return status_job_finished(message)
59 0d0aa87d Georgios Gousios
60 23c84263 Georgios Gousios
        vmid = utils.id_from_instance_name(msg["instance"])
61 23c84263 Georgios Gousios
        vm = VirtualMachine.objects.get(id=vmid)
62 23c84263 Georgios Gousios
63 ad2d6807 Vangelis Koukis
        backend.process_op_status(vm, msg["jobId"], msg["operation"],
64 ad2d6807 Vangelis Koukis
                                  msg["status"], msg["logmsg"])
65 86f046a8 Giorgos Verigakis
        log.debug("Done processing ganeti-op-status msg for vm %s.",
66 ad2d6807 Vangelis Koukis
                      msg["instance"])
67 23c84263 Georgios Gousios
        message.channel.basic_ack(message.delivery_tag)
68 23c84263 Georgios Gousios
    except KeyError:
69 86f046a8 Giorgos Verigakis
        log.error("Malformed incoming JSON, missing attributes: %s",
70 ad2d6807 Vangelis Koukis
                      message.body)
71 23c84263 Georgios Gousios
    except VirtualMachine.InvalidBackendIdError:
72 86f046a8 Giorgos Verigakis
        log.debug("Ignoring msg for unknown instance %s.", msg["instance"])
73 95aee02c Vangelis Koukis
    except VirtualMachine.InvalidBackendMsgError, e:
74 86f046a8 Giorgos Verigakis
        log.debug("Ignoring msg of unknown type: %s.", e)
75 23c84263 Georgios Gousios
    except VirtualMachine.DoesNotExist:
76 86f046a8 Giorgos Verigakis
        log.error("VM for instance %s with id %d not found in DB.",
77 ad2d6807 Vangelis Koukis
                      msg["instance"], vmid)
78 23c84263 Georgios Gousios
    except Exception as e:
79 86f046a8 Giorgos Verigakis
        log.exception("Unexpected error, msg: %s", msg)
80 23c84263 Georgios Gousios
81 7ca9e930 Vangelis Koukis
82 7ca9e930 Vangelis Koukis
def update_net(message):
83 c25cc9ec Vangelis Koukis
    """Process a notification of type 'ganeti-net-status'"""
84 86f046a8 Giorgos Verigakis
    log.debug("Processing ganeti-net-status msg: %s", message.body)
85 eee48215 Vangelis Koukis
    msg = None
86 ad2d6807 Vangelis Koukis
    try:
87 c25cc9ec Vangelis Koukis
        msg = json.loads(message.body)
88 ad2d6807 Vangelis Koukis
89 ad2d6807 Vangelis Koukis
        if msg["type"] != "ganeti-net-status":
90 86f046a8 Giorgos Verigakis
            log.error("Message is of unknown type %s", msg["type"])
91 ad2d6807 Vangelis Koukis
            return
92 ad2d6807 Vangelis Koukis
93 ad2d6807 Vangelis Koukis
        vmid = utils.id_from_instance_name(msg["instance"])
94 ad2d6807 Vangelis Koukis
        vm = VirtualMachine.objects.get(id=vmid)
95 ad2d6807 Vangelis Koukis
96 ad2d6807 Vangelis Koukis
        backend.process_net_status(vm, msg["nics"])
97 86f046a8 Giorgos Verigakis
        log.debug("Done processing ganeti-net-status msg for vm %s.",
98 ad2d6807 Vangelis Koukis
                      msg["instance"])
99 ad2d6807 Vangelis Koukis
        message.channel.basic_ack(message.delivery_tag)
100 ad2d6807 Vangelis Koukis
    except KeyError:
101 86f046a8 Giorgos Verigakis
        log.error("Malformed incoming JSON, missing attributes: %s",
102 ad2d6807 Vangelis Koukis
                      message.body)
103 ad2d6807 Vangelis Koukis
    except VirtualMachine.InvalidBackendIdError:
104 86f046a8 Giorgos Verigakis
        log.debug("Ignoring msg for unknown instance %s.", msg["instance"])
105 ad2d6807 Vangelis Koukis
    except VirtualMachine.DoesNotExist:
106 86f046a8 Giorgos Verigakis
        log.error("VM for instance %s with id %d not found in DB.",
107 ad2d6807 Vangelis Koukis
                      msg["instance"], vmid)
108 ad2d6807 Vangelis Koukis
    except Exception as e:
109 86f046a8 Giorgos Verigakis
        log.exception("Unexpected error, msg: %s", msg)
110 7ca9e930 Vangelis Koukis
111 7ca9e930 Vangelis Koukis
112 9068cd85 Georgios Gousios
def update_build_progress(message):
113 c25cc9ec Vangelis Koukis
    """Process a create progress message"""
114 86f046a8 Giorgos Verigakis
    log.debug("Processing ganeti-create-progress msg: %s", message.body)
115 eee48215 Vangelis Koukis
    msg = None
116 9068cd85 Georgios Gousios
    try:
117 9068cd85 Georgios Gousios
        msg = json.loads(message.body)
118 9068cd85 Georgios Gousios
119 e6f5bb10 Vangelis Koukis
        if msg['type'] != "ganeti-create-progress":
120 86f046a8 Giorgos Verigakis
            log.error("Message is of unknown type %s", msg["type"])
121 9068cd85 Georgios Gousios
            return
122 9068cd85 Georgios Gousios
123 9068cd85 Georgios Gousios
        # XXX: The following assumes names like snf-12
124 c25cc9ec Vangelis Koukis
        vmid = msg['instance'].split('-')[1]
125 c25cc9ec Vangelis Koukis
        vm = VirtualMachine.objects.get(id=vmid)
126 9068cd85 Georgios Gousios
127 e6f5bb10 Vangelis Koukis
        backend.process_create_progress(vm, msg['rprogress'], None)
128 86f046a8 Giorgos Verigakis
        log.debug("Done processing ganeti-create-progress msg for vm %s.",
129 9068cd85 Georgios Gousios
                      msg["instance"])
130 9068cd85 Georgios Gousios
        message.channel.basic_ack(message.delivery_tag)
131 9068cd85 Georgios Gousios
    except KeyError:
132 86f046a8 Giorgos Verigakis
        log.error("Malformed incoming JSON, missing attributes: %s",
133 9068cd85 Georgios Gousios
                      message.body)
134 9068cd85 Georgios Gousios
    except Exception as e:
135 86f046a8 Giorgos Verigakis
        log.exception("Unexpected error, msg: %s", msg)
136 9068cd85 Georgios Gousios
        raise
137 9068cd85 Georgios Gousios
138 9068cd85 Georgios Gousios
139 604b2bf8 Georgios Gousios
def trigger_status_update(message):
140 c25cc9ec Vangelis Koukis
    """Triggers a status update job for a specific VM id"""
141 86f046a8 Giorgos Verigakis
    log.debug("Request to trigger status update: %s", message.body)
142 eee48215 Vangelis Koukis
    msg = None
143 604b2bf8 Georgios Gousios
    try:
144 c25cc9ec Vangelis Koukis
        msg = json.loads(message.body)
145 604b2bf8 Georgios Gousios
146 c4367587 Vangelis Koukis
        if msg["type"] != "reconcile":
147 86f046a8 Giorgos Verigakis
             log.error("Message is of unknown type %s", msg["type"])
148 604b2bf8 Georgios Gousios
             return
149 604b2bf8 Georgios Gousios
150 c4367587 Vangelis Koukis
        if msg["vmid"] == "":
151 86f046a8 Giorgos Verigakis
            log.error("Reconciliation message does not specify a VM id")
152 604b2bf8 Georgios Gousios
            return
153 604b2bf8 Georgios Gousios
154 0d0aa87d Georgios Gousios
        vm = VirtualMachine.objects.get(id=msg["vmid"])
155 604b2bf8 Georgios Gousios
        backend.request_status_update(vm)
156 604b2bf8 Georgios Gousios
157 604b2bf8 Georgios Gousios
        message.channel.basic_ack(message.delivery_tag)
158 0d0aa87d Georgios Gousios
    except KeyError as k:
159 86f046a8 Giorgos Verigakis
        log.error("Malformed incoming JSON, missing attributes: %s", k)
160 604b2bf8 Georgios Gousios
    except Exception as e:
161 86f046a8 Giorgos Verigakis
        log.exception("Unexpected error, msg: %s", msg)
162 604b2bf8 Georgios Gousios
163 c25cc9ec Vangelis Koukis
164 c25cc9ec Vangelis Koukis
def status_job_finished(message):
165 c25cc9ec Vangelis Koukis
    """Updates VM status based on a previously sent status update request"""
166 eee48215 Vangelis Koukis
    msg = None
167 604b2bf8 Georgios Gousios
    try:
168 c25cc9ec Vangelis Koukis
        msg = json.loads(message.body)
169 604b2bf8 Georgios Gousios
170 0d0aa87d Georgios Gousios
        if msg["operation"] != 'OP_INSTANCE_QUERY_DATA':
171 86f046a8 Giorgos Verigakis
            log.error("Message is of unknown type %s", msg["operation"])
172 604b2bf8 Georgios Gousios
            return
173 604b2bf8 Georgios Gousios
174 c4367587 Vangelis Koukis
        if msg["status"] != "success":
175 86f046a8 Giorgos Verigakis
            log.warn("Ignoring non-success status update from job %d on VM %s",
176 604b2bf8 Georgios Gousios
                          msg['jobId'], msg['instance'])
177 2f355fb5 Georgios Gousios
            message.channel.basic_ack(message.delivery_tag)
178 604b2bf8 Georgios Gousios
            return
179 604b2bf8 Georgios Gousios
180 0d0aa87d Georgios Gousios
        status = backend.get_job_status(msg['jobId'])
181 604b2bf8 Georgios Gousios
182 86f046a8 Giorgos Verigakis
        log.debug("Node status job result: %s", status)
183 0d0aa87d Georgios Gousios
184 c4367587 Vangelis Koukis
        if status['summary'][0] != u'INSTANCE_QUERY_DATA':
185 86f046a8 Giorgos Verigakis
             log.error("Status update is of unknown type %s",
186 86f046a8 Giorgos Verigakis
                        status['summary'])
187 604b2bf8 Georgios Gousios
             return
188 604b2bf8 Georgios Gousios
189 2f355fb5 Georgios Gousios
        conf_state = status['opresult'][0][msg['instance']]['config_state']
190 2f355fb5 Georgios Gousios
        run_state = status['opresult'][0][msg['instance']]['run_state']
191 2f355fb5 Georgios Gousios
192 2f355fb5 Georgios Gousios
        # XXX: The following assumes names like snf-12
193 2f355fb5 Georgios Gousios
        instid = msg['instance'].split('-')[1]
194 2f355fb5 Georgios Gousios
195 2f355fb5 Georgios Gousios
        vm = VirtualMachine.objects.get(id = instid)
196 2f355fb5 Georgios Gousios
197 2f355fb5 Georgios Gousios
        if run_state == "up":
198 2f355fb5 Georgios Gousios
            opcode = "OP_INSTANCE_REBOOT"
199 c4367587 Vangelis Koukis
        else:
200 2f355fb5 Georgios Gousios
            opcode = "OP_INSTANCE_SHUTDOWN"
201 2f355fb5 Georgios Gousios
202 2f355fb5 Georgios Gousios
        backend.process_op_status(vm=vm, jobid=msg['jobId'],opcode=opcode,
203 2f355fb5 Georgios Gousios
                                  status="success",
204 2f355fb5 Georgios Gousios
                                  logmsg="Reconciliation: simulated event")
205 2f355fb5 Georgios Gousios
206 604b2bf8 Georgios Gousios
        message.channel.basic_ack(message.delivery_tag)
207 0d0aa87d Georgios Gousios
    except KeyError as k:
208 86f046a8 Giorgos Verigakis
        log.error("Malformed incoming JSON, missing attributes: %s", k)
209 604b2bf8 Georgios Gousios
    except Exception as e:
210 86f046a8 Giorgos Verigakis
        log.exception("Unexpected error, msg: %s", msg)
211 23c84263 Georgios Gousios
212 c25cc9ec Vangelis Koukis
213 23c84263 Georgios Gousios
def dummy_proc(message):
214 23c84263 Georgios Gousios
    try:
215 86f046a8 Giorgos Verigakis
        log.debug("Msg: %s", message.body)
216 23c84263 Georgios Gousios
        message.channel.basic_ack(message.delivery_tag)
217 23c84263 Georgios Gousios
    except Exception as e:
218 86f046a8 Giorgos Verigakis
        log.exception("Could not receive message")
219 23c84263 Georgios Gousios
        pass