Beispiel #1
0
def getServerListInService(request, service_id):
    """
    해당 서비스의 서버 리스트
    :param request:
    :param service_id:
    :return:
    """
    control = ControlEngine(request.session.get("ctrl_header"))
    # control = ControllerEngine()  # TODO: debugging 용
    vm_list = control.get_service_vm(service_id)
    if vm_list.get("success"):

        auth_url = request.session.get("auth_url")
        token = request.session.get("passToken")
        stack_id = vm_list.get("success").get("stack_id")
        # stack_name = vm_list.get("success").get("service_detail").get("name")

        nova = NovaRestAPI(auth_url, token)
        result_servers = nova.get_server_detail_list(
            fields=["id", "name", "metadata"])
        if result_servers.get("success"):
            servers = [
                result_server
                for result_server in result_servers["success"].get("servers")
                if result_server.get("metadata")
                and result_server["metadata"].get("metering.stack") == stack_id
            ]
            for temp_server in servers:
                server = {
                    "vm_name": temp_server.get("name"),
                    "vm_id": temp_server.get("id"),
                    "addresses": [],
                }
                for network_name, network in temp_server.get(
                        "addresses").items():
                    for address in network:
                        server["addresses"].append(address.get("addr"))
                vm_list["success"]["vm_list"].append(server)
        else:
            vm_list = result_servers

        # heat = HeatRestAPI(auth_url, token)
        # result = heat.get_resource_in_stack(stack_name, stack_id, {"type": "OS::Heat::AutoScalingGroup"})
        # if result.get("success"):
        #     as_groups = result["success"].get("resources")
        #     nova = NovaRestAPI(auth_url, token)
        #     for as_group in as_groups:
        #         asg_stack_id = as_group.get("physical_resource_id")
        #         result = heat.find_server_in_autoscaling(asg_stack_id)
        #         if result.get("success"):
        #             asg_stack_resources = result["success"]["resources"]
        #             for asg_stack_resource in asg_stack_resources:
        #                 server_name = "." + asg_stack_resource.get("logical_resource_id") + "."
        #                 result_servers = nova.get_server_detail_list({"name": server_name})
        #                 if result_servers.get("success"):
        #                     servers = result_servers["success"].get("servers")
        #                     for temp_server in servers:
        #                         server = {
        #                             "vm_name": temp_server.get("name"),
        #                             "vm_id": temp_server.get("id"),
        #                             "addresses": [],
        #                         }
        #                         for network_name, network in temp_server.get("addresses").items():
        #                             for address in network:
        #                                 server["addresses"].append(address.get("addr"))
        #                         vm_list["success"]["vm_list"].append(server)

    return JsonResponse(vm_list, safe=False)
Beispiel #2
0
def get_alarm_list(request):
    """
    :param request:
    :return:  {
        u'alarm_actions': [
            u'http://192.168.10.25:8080/alarm'
        ],
        u'project_id': u'227c72fcda1241b59b1241548649700c',
        u'ok_actions': [],
        u'이름 name': u'InstanceStatusAlarm',
        u'생성일 - 9시간 timestamp': u'2017-07-20T04:17:29.392703',
        u'설명 description': u'An event alarm kkkk',
        u'time_constraints': [],
        u'enabled': True,
        u'state_timestamp': u'2017-07-20T04:17:29.392703',
        u'이름에 링크 주소 alarm_id': u'0f276622-a037-4b9d-b7af-3014b52352f2',
        u'state': u'ok',
        u'insufficient_data_actions': [u'http://192.168.10.25:8080/nodata'],
        u'repeat_actions': False,
        u'user_id': u'f266e9e2e0fe43dfb2f9492851d470cd',
        u'event_rule': {
            u'query': [
                {
                    u'field': u'traits.instance_id',
                    u'type': u'string',
                    u'value': u'9d3f7a1a-fd78-43d3-8294-5ae0789bf76e',
                    u'op': u'eq'
                }, {
                    u'field': u'traits.state',
                    u'type': u'string',
                    u'임계값1 value': u'error',
                    u'임계값2 op': u'eq'
                }
            ],
            u'타입1 event_type': u'compute.instance.update'
        },
        u'type': u'event',
        u'severity': u'moderate'
    }
    """
    domain_name = request.session.get("domain_name")
    description = request.session.get("description")
    token = request.session.get('passToken')
    project_id = request.session.get('project_id')
    auth_url = request.session.get("auth_url")
    ctrl_header = request.session.get("ctrl_header")
    control = ControlEngine(ctrl_header)
    aodh = AodhRestAPI(auth_url, token)
    query = {
        "query": [
            {
                "field": "project",
                "op": "eq",
                "value": project_id
            },
        ]
    }
    if request.method == 'GET':
        service_id = request.GET.get("service_id")
    else:
        service_id = request.POST.get("service_id")
    result_vms = control.get_service_vm(service_id)
    result_alarms = aodh.get_alarm_list(query)
    alarm_list = []
    if result_vms.get("success") and result_alarms.get("success"):
        for alarm in result_alarms["success"]:
            for vm in result_vms["success"].get("vm_list"):
                if vm.get("vm_id") in alarm["threshold_rule"]["query"][0]["value"] or "image" in alarm["threshold_rule"]["meter_name"]:
                    alarm_list.append(alarm)

    # try:
    #     pass
    #     for alarm in alarmList:
    #         queryList = alarm.event_rule.get("query")
    #         alarm.event_rule["target"] = filter(lambda x: x.get("field") in targetList, queryList)[0]  # TODO: 우선 instance만
    #         threshold = filter(lambda x: x.get("field") in meterNameList, queryList)[0]
    #         alarm.event_rule["target"]["meter_name"] = threshold.get("field")  # TODO: 전부 넣어야함 memory등등
    #         alarm.event_rule["target"]["op"] = threshold.get("op")
    #         alarm.event_rule["target"]["threshold"] = threshold.get("value")
    #         del alarm.event_rule["target"]["type"]
    #         del alarm.event_rule["query"]
    # except Unauthorized as e:
    #     request.session["error"] = {"title":e.message, "message":e.details}
    #     if request.method == 'POST':
    #         return JsonResponse({"error":{"title":e.message, "message":e.details}})
    #     else:
    #         request.session["error"] = {"title": e.message, "message": e.details, "code":401}
    #         return redirect("/dashboard/login/?auth_url=" + auth_url + "&domain_name=" + domain_name + "&description=" + description)
    if request.method == 'POST':
        return JsonResponse({"success": {'alarmList': alarm_list}})
    else:
        token = request.session.get('passToken')
        if not token:
            return redirect("/dashboard/domains/?next=/dashboard/telemeter/alarms")
        return render(request, 'telemeter/alarms/index.html', {"alarmList": alarm_list})
Beispiel #3
0
def get_security_group_info(request):
    token = request.session.get("passToken")
    domain_name = request.session.get("domain_name")
    project_name = request.session.get("project_name")
    user_name = request.session.get("user_name")
    if request.method == "POST":
        data = request.POST.get("data")
        control = ControlEngine(request.session.get("ctrl_header"))
        data = json.loads(data)
        service_id = data.get("service_id")
        server_id = data.get("server_id")
        service_info = control.get_service_vm(
            service_id)  # service_id 에 해당하는 서비스에 속한 서버 리스트 반환
        if service_info.get("success"):
            # print "=============success보안장비정보=================="
            # print "service_id: ", service_id, "server_id: ", server_id
            # print "data", data
            vmList = service_info["success"].get("vm_list")
            vm_name_list = [
                vm.get("vm_name") for vm in vmList
                if vm.get("vm_id") == server_id
            ]
            if len(vm_name_list) != 0:
                searchVmName = vm_name_list[0]
                smap_data = control.get_map(service_id)
                if smap_data.get("success"):
                    map_data = smap_data.get("success").get("map_data")
                    used_security_group_list = map_data.get(
                        "used_security_group_list"
                    )  # service_id에 해당하는 맵데이터에서 사용한 보안장비찾기
                    if used_security_group_list:
                        print "used_security_group_list: ", used_security_group_list
                        used_security_group_id_list = []
                        for used_security_group in used_security_group_list:
                            if used_security_group.get(
                                    "vm_name"
                            ) == searchVmName:  # 사용된 보안장비의 가상서버 목록중 같은 이름이 있는지 확인
                                used_security_group_id_list.append(
                                    used_security_group["security_id"]
                                )  # 위조건에 만족한 보안장비 id저장
                        # print "used_security_group_id_list: ", used_security_group_id_list
                        if len(used_security_group_id_list) > 0:
                            used_security_group_id = used_security_group_id_list[
                                0]  # 저장된 보안장비 ID로 db에서 정보찾기
                            db_nm = request.session.get("domain_db_nm")
                            db_user = request.session.get("domain_db_user")
                            db_pass = request.session.get("domain_db_pass")
                            db_ip = request.session.get("domain_db_ip")
                            db_port = request.session.get("domain_db_port")
                            conn = SOAControlDomainDBConnector(db_nm=db_nm,
                                                               db_user=db_user,
                                                               db_pass=db_pass,
                                                               db_ip=db_ip,
                                                               db_port=db_port)
                            params = (used_security_group_id)
                            try:
                                select_security_resource = conn.select(
                                    SELECT_SECURITY_RESOURCE_GROUP, params)
                                if len(select_security_resource) > 0:
                                    security_resource = select_security_resource[
                                        0]
                                    security_resource["data"] = {
                                        "nodes":
                                        security_resource.get("topology_json"),
                                        "links":
                                        security_resource.get("link_json"),
                                        "security_types":
                                        security_resource.get("security_json")
                                    }
                                    result = {
                                        "success": {
                                            "security_resource":
                                            security_resource
                                        }
                                    }
                                else:
                                    raise Exception(used_security_group_id +
                                                    _(u"은 존재하지 않습니다."))
                            except Exception as e:
                                result = {
                                    "error": {
                                        "message": str(e),
                                        "title": "error"
                                    }
                                }
                    else:
                        result = {
                            "error": {
                                "message": _("해당 서버에는 보안정보가 없습니다."),
                                "title": "error"
                            }
                        }
                else:
                    result = {
                        "error": {
                            "message": _("해당 서비스에는 보안정보가 없습니다."),
                            "title": "error"
                        }
                    }
            else:
                result = {
                    "error": {
                        "message": _("해당 서버가 없습니다."),
                        "title": "error"
                    }
                }
        elif service_info.get("error"):
            result = service_info.get("error")
        else:
            # print "=============error보안장비정보=================="
            result = {"error": {"message": _(u"잘못된 아이디"), "title": "error"}}

        return JsonResponse(result)
    else:
        response = render('404.html', {})
        response.status_code = 404
        return response