def _post_edited_alarm(token, alarm_data, alarm_id=None):
    '''
    Post edited alarm to ceilometer api
    :param request: (Django Request Object) request
    :return: (Dict) success or error message
    '''

    if 'enabled' in alarm_data:
        alarm_data[
            'enabled'] = False if alarm_data['enabled'] == 'False' else True
    if 'repeat_actions' in alarm_data:
        alarm_data['repeat_actions'] = False if alarm_data[
            'repeat_actions'] == 'False' else True
    for action_type in [
            'alarm_actions', 'ok_actions', 'insufficient_data_actions'
    ]:
        if action_type in alarm_data:
            for i in range(0, len(alarm_data[action_type])):
                alarm_data[action_type][i] = \
                    'http://%s/notification/notify/?op=%s' % (settings.THIS_ADDR, alarm_data[action_type][i])
    kwargs = {}
    kwargs.update(alarm_data)

    # Threshold alarms
    threshold_alarm_capabilities = BaseMethods.add_list_unique(
        APICapabilities.ALARM_CAPABILITIES,
        APICapabilities.THRESHOLD_ALARM_CAPABILITIES,
        APICapabilities.QUERY_CAPABILITIES)
    kwargs = BaseMethods.sanitize_arguments(kwargs,
                                            threshold_alarm_capabilities)

    query_obj = []
    for query_para in APICapabilities.QUERY_CAPABILITIES:
        if query_para in kwargs:
            query_obj.append({
                'field': query_para,
                'value': kwargs.pop(query_para)
            })
    threshold_rule_obj = {'query': query_obj}

    for threshold_rule_para in APICapabilities.THRESHOLD_ALARM_CAPABILITIES:
        if threshold_rule_para in kwargs:
            threshold_rule_obj[threshold_rule_para] = kwargs.pop(
                threshold_rule_para)
    alarm_obj = {'threshold_rule': threshold_rule_obj}

    for alarm_para in APICapabilities.ALARM_CAPABILITIES:
        if alarm_para in kwargs:
            alarm_obj[alarm_para] = kwargs.pop(alarm_para)

    return openstack_api.ceilometer_api.update_threshold_alarm(
        token, alarm_id=alarm_id, alarm_body=alarm_obj)
    def get_data(self, base_url, method, header=None,
                 tenant_id=None, url_parameters=None, body=None):
        """
        Get the result of current request.
        :param base_url: (string)
        :param method: (string) HTTP request method, GET/POST/PUT/DELETE
        :param header: (dict) request header
        :param version: (string) API version
        :param tenant_id: (string) OpenStack project id
        :param url_parameters: (dict) query parameters
        :param body: (dict) request body
        :return: (dict)
        """
        extra_url = BaseMethods.url_para_to_url(**url_parameters) \
            if url_parameters else ''
        if header is not None:
            self.header = header
        if body is not None:
            self.body = json.dumps(body)
        else:
            self.body = None
        self.method = method
        self.url = '/%s/' % self.version + (('%s/' % tenant_id)
                                       if tenant_id is not None else '') \
                   + base_url + extra_url

        # Execute http request
        self.request(self.method, url=self.url, headers=self.header, body=self.body)
        response = None
        data = None
        try:
            response = self.getresponse()
        except httplib.NotConnected, e:
            raise err.ServerAddressError(self.host_port)
def _post_new_alarm(request):
    '''
    further process new alarm data, and post to ceilometer_api
    :param (Django request object) request
    :return: JSON
    '''
    alarm_data = BaseMethods.qdict_to_dict(request.POST)
    alarm_data.pop('next_step')
    alarm_data.pop('cur_step')

    if 'enabled' in alarm_data:
        alarm_data['enabled'] = False if alarm_data['enabled'] == 'False' else True
    if 'repeat_actions' in alarm_data:
        alarm_data['repeat_actions'] = False if alarm_data['repeat_actions'] == 'false' else True
    for action_type in ['alarm_actions', 'ok_actions', 'insufficient_data_actions']:
        if action_type in alarm_data:
            for i in range(0, len(alarm_data[action_type])):
                alarm_data[action_type][i] = \
                    'http://%s/notification/notify/?op=%s' % (settings.THIS_ADDR, alarm_data[action_type][i])
    kwargs = {}
    kwargs.update(alarm_data)
    q = [{}]
    try:
        q[0] = {}
        q[0]['value'] = kwargs.pop('resource_id')
        q[0]['field'] = 'resource_id'
        q[0]['op'] = 'eq'
    except NameError:
        q[0] = {}
    finally:
        kwargs['q'] = q

    token_id = request.session['token'].id
    return openstack_api.ceilometer_api.post_threshold_alarm(token_id, **kwargs)
def _post_edited_alarm(token, alarm_data, alarm_id=None):
    '''
    Post edited alarm to ceilometer api
    :param request: (Django Request Object) request
    :return: (Dict) success or error message
    '''

    if 'enabled' in alarm_data:
        alarm_data['enabled'] = False if alarm_data['enabled'] == 'False' else True
    if 'repeat_actions' in alarm_data:
        alarm_data['repeat_actions'] = False if alarm_data['repeat_actions'] == 'False' else True
    for action_type in ['alarm_actions', 'ok_actions', 'insufficient_data_actions']:
        if action_type in alarm_data:
            for i in range(0, len(alarm_data[action_type])):
                alarm_data[action_type][i] = \
                    'http://%s/notification/notify/?op=%s' % (settings.THIS_ADDR, alarm_data[action_type][i])
    kwargs = {}
    kwargs.update(alarm_data)

    # Threshold alarms
    threshold_alarm_capabilities = BaseMethods.add_list_unique(
        APICapabilities.ALARM_CAPABILITIES,
        APICapabilities.THRESHOLD_ALARM_CAPABILITIES,
        APICapabilities.QUERY_CAPABILITIES
    )
    kwargs = BaseMethods.sanitize_arguments(kwargs, threshold_alarm_capabilities)

    query_obj = []
    for query_para in APICapabilities.QUERY_CAPABILITIES:
        if query_para in kwargs:
            query_obj.append({'field': query_para, 'value': kwargs.pop(query_para)})
    threshold_rule_obj = {'query': query_obj}

    for threshold_rule_para in APICapabilities.THRESHOLD_ALARM_CAPABILITIES:
        if threshold_rule_para in kwargs:
            threshold_rule_obj[threshold_rule_para] = kwargs.pop(threshold_rule_para)
    alarm_obj = {'threshold_rule': threshold_rule_obj}

    for alarm_para in APICapabilities.ALARM_CAPABILITIES:
        if alarm_para in kwargs:
            alarm_obj[alarm_para] = kwargs.pop(alarm_para)

    return openstack_api.ceilometer_api.update_threshold_alarm(token,
                                                               alarm_id=alarm_id,
                                                               alarm_body=alarm_obj)
Example #5
0
def openstack_api_connection(base_url,
                             method,
                             header,
                             port,
                             version,
                             tenant_id=None,
                             url_parameters=None,
                             body=None):
    '''
    :param url: (string)
    :param method: (string) [POST | GET | PUT | DELETE ]
    :param header: (Dict) headers for request
    :param url_parameters: (Dict)
    :param body: (Dict)
    :return: (Dict) Data fetched from openstack api
    '''
    extra_url = (BaseMethods.url_para_to_url(
        **url_parameters)) if url_parameters else ''
    conn = httplib.HTTPConnection('%s:%s' %
                                  (settings.OPENSTACK_CONTROLLER_IP, port))
    req_header = header
    req_body = None if body is None else json.dumps(body)

    # TODO(pwwp):
    # use <finally> to handle success or error data
    try:
        conn.request(method,
                     '/%s/' % version +
                     (('%s/' % tenant_id) if tenant_id is not None else '') +
                     base_url + extra_url,
                     headers=req_header,
                     body=req_body)
        response = conn.getresponse()
        if response.status > 299:
            error = {
                'status': 'error',
                'error_code': response.status,
                'error_msg': response.reason,
                'data': ''
            }
            return error
        elif response.status == 204:
            data = {'status': 'success', 'data': ''}
            return data
        else:
            data = {'status': 'success', 'data': json.loads(response.read())}
            return data
    except socket.error, e:
        return {'status': 'error', 'error_msg': e.strerror}
def create_alarm(request):
    '''  Create new alarm through ceilometer alarm-create api  '''
    if request.method == 'GET':
        return render(
            request, 'alarms/create_alarm/create_threshold_alarm_basis.html', {
                'page_type': 'create_alarm',
                'title': 'Create-alarm',
                'threshold_step_html':
                'alarms/threshold_alarm_basis/_threshold_alarm_step_1.html',
                'step': '1',
                'alarm_data': {
                    'machine_type': 'vm',
                },
            })
    if request.method == 'POST':
        # Invalid inputs for step will be served with 404 page
        step = request.POST.get('next_step', '1')
        if step is None or step not in ['1', '2', '3', '4', 'post']:
            raise Http404('Invalid value of "step"')

        # alarm_data passes alarm data between alarm-create pages.
        alarm_data = BaseMethods.qdict_to_dict(request.POST)

        if step == 'post':
            return_data = _post_new_alarm(request)
            new_message = [], {}
            if return_data['status'] == 'success':
                messages.success(
                    request, return_data['data']['name'] + " has been created")
            else:
                messages.error(request, return_data['error_msg'])
            return HttpResponseRedirect('/monitor/alarms/')
        else:
            return render(
                request,
                'alarms/create_alarm/create_threshold_alarm_basis.html', {
                    'page_type':
                    'create_alarm',
                    'threshold_step_html':
                    'alarms/threshold_alarm_basis/_threshold_alarm_step_' +
                    step + '.html',
                    'step':
                    step,
                    'alarm_data':
                    alarm_data,
                })
    raise Http404('Unknown method')
Example #7
0
    def get_data(self,
                 base_url,
                 method,
                 header=None,
                 tenant_id=None,
                 url_parameters=None,
                 body=None):
        """
        Get the result of current request.
        :param base_url: (string)
        :param method: (string) HTTP request method, GET/POST/PUT/DELETE
        :param header: (dict) request header
        :param version: (string) API version
        :param tenant_id: (string) OpenStack project id
        :param url_parameters: (dict) query parameters
        :param body: (dict) request body
        :return: (dict)
        """
        extra_url = BaseMethods.url_para_to_url(**url_parameters) \
            if url_parameters else ''
        if header is not None:
            self.header = header
        if body is not None:
            self.body = json.dumps(body)
        else:
            self.body = None
        self.method = method
        self.url = '/%s/' % self.version + (('%s/' % tenant_id)
                                       if tenant_id is not None else '') \
                   + base_url + extra_url

        # Execute http request
        self.request(self.method,
                     url=self.url,
                     headers=self.header,
                     body=self.body)
        response = None
        data = None
        try:
            response = self.getresponse()
        except httplib.NotConnected, e:
            raise err.ServerAddressError(self.host_port)
def openstack_api_connection(base_url, method, header, port, version,
                             tenant_id=None, url_parameters=None, body=None):
    '''
    :param url: (string)
    :param method: (string) [POST | GET | PUT | DELETE ]
    :param header: (Dict) headers for request
    :param url_parameters: (Dict)
    :param body: (Dict)
    :return: (Dict) Data fetched from openstack api
    '''
    extra_url = (BaseMethods.url_para_to_url(**url_parameters)) if url_parameters else ''
    conn = httplib.HTTPConnection('%s:%s' % (settings.OPENSTACK_CONTROLLER_IP, port))
    req_header = header
    req_body = None if body is None else json.dumps(body)

    # TODO(pwwp):
    # use <finally> to handle success or error data
    try:
        conn.request(method, '/%s/' % version +
                     (('%s/' % tenant_id) if tenant_id is not None else '') +
                     base_url + extra_url,
                     headers=req_header, body=req_body)
        response = conn.getresponse()
        if response.status > 299:
            error = {'status': 'error',
                     'error_code': response.status,
                     'error_msg': response.reason,
                     'data': ''}
            return error
        elif response.status == 204:
            data = {'status': 'success',
                    'data': ''}
            return data
        else:
            data = {'status': 'success',
                    'data': json.loads(response.read())}
            return data
    except socket.error, e:
        return {'status': 'error',
                'error_msg': e.strerror
                }
def _post_new_alarm(request):
    '''
    further process new alarm data, and post to ceilometer_api
    :param (Django request object) request
    :return: JSON
    '''
    alarm_data = BaseMethods.qdict_to_dict(request.POST)
    alarm_data.pop('next_step')
    alarm_data.pop('cur_step')

    if 'enabled' in alarm_data:
        alarm_data[
            'enabled'] = False if alarm_data['enabled'] == 'False' else True
    if 'repeat_actions' in alarm_data:
        alarm_data['repeat_actions'] = False if alarm_data[
            'repeat_actions'] == 'false' else True
    for action_type in [
            'alarm_actions', 'ok_actions', 'insufficient_data_actions'
    ]:
        if action_type in alarm_data:
            for i in range(0, len(alarm_data[action_type])):
                alarm_data[action_type][i] = \
                    'http://%s/notification/notify/?op=%s' % (settings.THIS_ADDR, alarm_data[action_type][i])
    kwargs = {}
    kwargs.update(alarm_data)
    q = [{}]
    try:
        q[0] = {}
        q[0]['value'] = kwargs.pop('resource_id')
        q[0]['field'] = 'resource_id'
        q[0]['op'] = 'eq'
    except NameError:
        q[0] = {}
    finally:
        kwargs['q'] = q

    token_id = request.session['token'].id
    return openstack_api.ceilometer_api.post_threshold_alarm(
        token_id, **kwargs)
Example #10
0
def create_alarm(request):
    '''  Create new alarm through ceilometer alarm-create api  '''
    if request.method == 'GET':
        return render(request, 'alarms/create_alarm/create_threshold_alarm_basis.html',
                      {
                          'page_type': 'create_alarm',
                          'title': 'Create-alarm',
                          'threshold_step_html': 'alarms/threshold_alarm_basis/_threshold_alarm_step_1.html',
                          'step': '1',
                          'alarm_data': {
                              'machine_type': 'vm',
                          },
                      })
    if request.method == 'POST':
        # Invalid inputs for step will be served with 404 page
        step = request.POST.get('next_step', '1')
        if step is None or step not in ['1', '2', '3', '4', 'post']:
            raise Http404('Invalid value of "step"')

        # alarm_data passes alarm data between alarm-create pages.
        alarm_data = BaseMethods.qdict_to_dict(request.POST)

        if step == 'post':
            return_data = _post_new_alarm(request)
            new_message = [], {}
            if return_data['status'] == 'success':
                messages.success(request, return_data['data']['name'] + " has been created")
            else:
                messages.error(request, return_data['error_msg'])
            return HttpResponseRedirect('/monitor/alarms/')
        else:
            return render(request, 'alarms/create_alarm/create_threshold_alarm_basis.html',
                          {
                              'page_type': 'create_alarm',
                              'threshold_step_html': 'alarms/threshold_alarm_basis/_threshold_alarm_step_' + step + '.html',
                              'step': step,
                              'alarm_data': alarm_data,
                          })
    raise Http404('Unknown method')
Example #11
0
    if request.method == 'GET':
        return render(
            request, 'alarms/edit_alarm/edit_threshold_alarm_basis.html', {
                'page_type': 'edit_alarm',
                'title': 'Edit Alarm',
                'threshold_step_html':
                'alarms/threshold_alarm_basis/_threshold_alarm_step_2.html',
                'step': 2,
                'alarm_data': alarm_data
            })
    if request.method == 'POST':
        # Invalid inputs for step will be served with 404 page
        step = request.POST.get('next_step', '2')
        if step is None or step not in ['2', '3', '4', 'post']:
            raise Http404('Invalid value of "step"')
        edited_data = BaseMethods.qdict_to_dict(request.POST)
        edited_data.update(
            original_data)  # Overwrite keys that are not allowed to modify

        if step == 'post':
            return_data = _post_edited_alarm(token_id, edited_data, alarm_id)
            new_message = [], {}
            if return_data['status'] == 'success':
                messages.success(
                    request,
                    return_data['data']['name'] + " has been modified")
            else:
                messages.error(request, return_data['error_msg'])
            return HttpResponseRedirect('/monitor/alarms/')

        return render(
Example #12
0
    if request.method == 'GET':
        return render(request, 'alarms/edit_alarm/edit_threshold_alarm_basis.html',
                      {
                          'page_type': 'edit_alarm',
                          'title': 'Edit Alarm',
                          'threshold_step_html': 'alarms/threshold_alarm_basis/_threshold_alarm_step_2.html',
                          'step': 2,
                          'alarm_data': alarm_data
                      })
    if request.method == 'POST':
        # Invalid inputs for step will be served with 404 page
        step = request.POST.get('next_step', '2')
        if step is None or step not in ['2', '3', '4', 'post']:
            raise Http404('Invalid value of "step"')
        edited_data = BaseMethods.qdict_to_dict(request.POST)
        edited_data.update(original_data)  # Overwrite keys that are not allowed to modify

        if step == 'post':
            return_data = _post_edited_alarm(token_id, edited_data, alarm_id)
            new_message = [], {}
            if return_data['status'] == 'success':
                messages.success(request, return_data['data']['name'] + " has been modified")
            else:
                messages.error(request, return_data['error_msg'])
            return HttpResponseRedirect('/monitor/alarms/')

        return render(request, 'alarms/edit_alarm/edit_threshold_alarm_basis.html',
                      {
                          'page_type': 'edit_alarm',
                          'threshold_step_html':