def clusterdetails_json(request): if request.user.is_superuser or request.user.has_perm('ganeti.view_instances'): if request.GET.get('cluster'): cluster_slug = request.GET.get('cluster') cluster_details = cache.get("cluster:%s:clusterdetails" % (cluster_slug)) if not cluster_details: try: cluster_details = clusterdetails_generator(cluster_slug) except GanetiApiError as e: messages.add_message( request, messages.ERROR, '%s: %s' % ( cluster_slug, format_ganeti_api_error(e) ) ) except Exception as e: messages.add_message( request, messages.ERROR, '%s' % ( e ) ) cache.set("cluster:%s:clusterdetails" % (cluster_slug), cluster_details, 3600 * 24) return HttpResponse( json.dumps(cluster_details), content_type='application/json' ) raise PermissionDenied
def _get_instances(cluster): try: instances.extend(cluster.get_user_instances(request.user)) except GanetiApiError as e: bad_clusters.append((cluster, format_ganeti_api_error(e))) except Exception as e: bad_clusters.append((cluster, e)) finally: close_connection()
def _get_jobs(cluster): try: jobs.extend(cluster.get_job_list()) except GanetiApiError as e: bad_clusters.append((cluster, format_ganeti_api_error(e))) except Exception as e: bad_clusters.append((cluster, e)) finally: close_old_connections()
def _get_instances(cluster): try: cluster_locked_nodes = cluster.locked_nodes_from_nodegroup() if cluster_locked_nodes: locked_clusters.append(str(cluster.description)) locked_nodes.extend(cluster_locked_nodes) instances.extend(cluster.get_user_instances(request.user)) except GanetiApiError as e: bad_clusters.append((cluster, format_ganeti_api_error(e))) except Exception as e: bad_clusters.append((cluster, e)) finally: close_old_connections()
def _get_instance_details(instance): try: if locked_instances is not None and instance.name in locked_instances: instance.joblock = locked_instances["%s" % instance.name] else: instance.joblock = False instancedetails.extend(generate_json(instance, request.user, locked_nodes)) except GanetiApiError as e: bad_clusters.append((cluster, format_ganeti_api_error(e))) except Exception as e: bad_clusters.append((cluster, e)) finally: close_connection()
def _get_instance_details(instance): try: if (locked_instances is not None and instance.name in locked_instances): instance.joblock = locked_instances['%s' % instance.name] else: instance.joblock = False instancedetails.extend( generate_json(instance, request.user, locked_nodes)) except GanetiApiError as e: bad_clusters.append((instance.cluster, format_ganeti_api_error(e))) except Exception as e: bad_clusters.append((instance.cluster, e)) finally: close_old_connections()
def get_cluster_node_group_stack(request): res = '' error = None cluster_id = request.GET.get('cluster_id', None) if cluster_id: cluster = get_object_or_404(Cluster, pk=cluster_id) else: return HttpResponseBadRequest() try: res = prepare_cluster_node_group_stack(cluster) except GanetiApiError as e: error = format_ganeti_api_error(e) except Exception as e: error = e if error: messages.add_message(request, messages.ERROR, error) return HttpResponse(json.dumps(res), content_type='application/json')
def get_user_group_list(request): if ( request.user.is_superuser or request.user.has_perm('ganeti.view_instances') ): q_params = request.GET.get('q') type_of_search = request.GET.get('type') if not (q_params or type_of_search): return HttpResponseBadRequest() p = Pool(20) bad_clusters = [] cache_key = "user:%s:index:instances" % request.user.username instances = cache.get(cache_key, []) def _get_instances(cluster): try: instances.extend(cluster.get_user_instances(request.user)) except GanetiApiError as e: bad_clusters.append((cluster, format_ganeti_api_error(e))) except Exception as e: bad_clusters.append((cluster, e)) finally: close_connection() if q_params and type_of_search: ret_list = [] if type_of_search == 'cluster': clusters = Cluster.objects.filter(slug__icontains=q_params) for cluster in clusters: cld = {} cld['text'] = cluster.slug cld['id'] = "c_%s" % cluster.pk cld['type'] = "cluster" ret_list.append(cld) elif type_of_search == 'users': users = User.objects.filter(is_active=True, username__icontains=q_params) for user in users: userd = {} userd['text'] = user.username userd['email'] = user.email userd['id'] = "u_%s" % user.pk userd['type'] = "user" ret_list.append(userd) elif type_of_search == 'groups': groups = Group.objects.filter(name__icontains=q_params) for group in groups: groupd = {} groupd['text'] = group.name groupd['id'] = "g_%s" % group.pk groupd['type'] = "group" ret_list.append(groupd) elif type_of_search == 'instances': notif_instances = Instance.objects.filter(name__icontains=q_params) for instance in notif_instances: instd = {} instd['text'] = instance.name instd['id'] = "i_%s" % instance.name instd['type'] = "vm" ret_list.append(instd) elif type_of_search == 'nodes': # get only enabled clusters for cluster in Cluster.objects.filter(disabled=False): try: for node in cluster.get_cluster_nodes(): if q_params in node.get('name'): noded = { 'text': '%s - %s' % (cluster, node.get('name')), 'id': 'n_%s_c_%s' % (node.get('name'), cluster.id), 'type': 'node' } ret_list.append(noded) except GanetiApiError as e: bad_clusters.append((cluster, format_ganeti_api_error(e))) except Exception as e: bad_clusters.append((cluster, e)) elif type_of_search == 'nodegroups': nodegroups = [] # get only enabled clusters for cluster in Cluster.objects.filter(disabled=False): try: nodegroups.append({cluster: cluster.get_node_groups()}) except GanetiApiError as e: bad_clusters.append((cluster, format_ganeti_api_error(e))) except Exception as e: bad_clusters.append((cluster, e)) for nodegroup_list in nodegroups: for cluster, nodegroup in nodegroup_list.items(): for ng in nodegroup: if q_params in ng.get('name'): nodegroupsd = { 'text': '%s - %s' % (cluster, ng.get('name')), 'id': 'ng_%s_c_%s' % (ng.get('name'), cluster.id), 'type': 'nodegroup' } ret_list.append(nodegroupsd) if bad_clusters: for c in list(set(bad_clusters)): message_text = "Some instances may be missing because the following clusters are unreachable: %s" % ( ", ".join( [ "%s: %s" % ( c[0].description or c[0].hostname, c[1] ) ] ) ) messages.add_message(request, messages.WARNING, message_text) action = ret_list return HttpResponse(json.dumps(action), mimetype='application/json') else: raise PermissionDenied()