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)
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')
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)
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')
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(
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':