Revision 85a634e6 snf-cyclades-app/synnefo/api/servers.py

b/snf-cyclades-app/synnefo/api/servers.py
66 66
    (r'^/(\d+)/meta(?:.json|.xml)?$', 'metadata_demux'),
67 67
    (r'^/(\d+)/meta/(.+?)(?:.json|.xml)?$', 'metadata_item_demux'),
68 68
    (r'^/(\d+)/stats(?:.json|.xml)?$', 'server_stats'),
69
    (r'^/(\d+)/diagnostics(?:.json)?$', 'get_server_diagnostics'),
69 70
)
70 71

  
71 72

  
......
139 140
        attachments = [nic_to_dict(nic) for nic in vm.nics.all()]
140 141
        if attachments:
141 142
            d['attachments'] = {'values': attachments}
143

  
144
        # include the latest vm diagnostic, if set
145
        diagnostic = vm.get_last_diagnostic()
146
        if diagnostic:
147
            d['diagnostics'] = diagnostics_to_dict([diagnostic])
148

  
142 149
    return d
143 150

  
144 151

  
152
def diagnostics_to_dict(diagnostics):
153
    """
154
    Extract api data from diagnostics QuerySet.
155
    """
156
    entries = list()
157

  
158
    for diagnostic in diagnostics:
159
        # format source date if set
160
        formatted_source_date = None
161
        if diagnostic.source_date:
162
            formatted_source_date = util.isoformat(diagnostic.source_date)
163

  
164
        entry = {
165
            'source': diagnostic.source,
166
            'created': util.isoformat(diagnostic.created),
167
            'message': diagnostic.message,
168
            'details': diagnostic.details,
169
            'level': diagnostic.level,
170
        }
171

  
172
        if formatted_source_date:
173
            entry['source_date'] = formatted_source_date
174

  
175
        entries.append(entry)
176

  
177
    return entries
178

  
179

  
145 180
def render_server(request, server, status=200):
146 181
    if request.serialization == 'xml':
147 182
        data = render_to_string('server.xml', {
......
152 187
    return HttpResponse(data, status=status)
153 188

  
154 189

  
190
def render_diagnostics(request, diagnostics_dict, status=200):
191
    """
192
    Render diagnostics dictionary to json response.
193
    """
194
    return HttpResponse(json.dumps(diagnostics_dict), status=status)
195

  
196

  
197
@util.api_method('GET')
198
def get_server_diagnostics(request, server_id):
199
    """
200
    Virtual machine diagnostics api view.
201
    """
202
    log.debug('server_diagnostics %s', server_id)
203
    vm = util.get_vm(server_id, request.user_uniq)
204
    diagnostics = diagnostics_to_dict(vm.diagnostics.all())
205
    return render_diagnostics(request, diagnostics)
206

  
207

  
155 208
@util.api_method('GET')
156 209
def list_servers(request, detail=False):
157 210
    # Normal Response Codes: 200, 203
......
165 218
    user_vms = VirtualMachine.objects.filter(userid=request.user_uniq)
166 219

  
167 220
    since = util.isoparse(request.GET.get('changes-since'))
221

  
168 222
    if since:
169 223
        user_vms = user_vms.filter(updated__gte=since)
170 224
        if not user_vms:

Also available in: Unified diff