def post(self, request, *args, **kwargs): try: body = json.loads(request.body.decode('utf-8')) prometheus.import_config(body, **kwargs) except Exception as e: return HttpResponse(e, status=400) return HttpResponse('Success', status=202)
def post(self, request, *args, **kwargs): form_class = self.get_form_class() form = form_class(request.POST, request.FILES) if 'rules' in request.POST: form = forms.ImportRuleForm(request.POST) if form.is_valid(): data = form.clean() counters = prometheus.import_rules(data['rules']) messages.info(request, 'Imported %s' % counters) return self.form_valid(form) else: return self.form_invalid(form) if form.is_valid(): data = form.clean() if data.get('file_field'): messages.info(request, 'Importing config from file') config = data['file_field'].read().decode('utf8') elif data.get('url'): messages.info(request, 'Importing config from url') response = util.get(data['url']) response.raise_for_status() config = response.text else: messages.info(request, 'Importing config') config = data['config'] kwargs = {} # This also lets us catch passing an empty string to signal using # the shard value from the post request if data.get('shard'): kwargs['replace_shard'] = data.get('shard') imported, skipped = prometheus.import_config(json.loads(config), **kwargs) if imported: counters = {key: len(imported[key]) for key in imported} messages.info(request, 'Imported %s' % counters) if skipped: counters = {key: len(skipped[key]) for key in skipped} messages.info(request, 'Skipped %s' % counters) # If we only have a single object in a category, automatically # redirect to that category to make things easier to understand if len(imported['Project']) == 1: return HttpResponseRedirect(imported['Project'][0].get_absolute_url()) if len(imported['Service']) == 1: return HttpResponseRedirect(imported['Service'][0].get_absolute_url()) if len(imported['Shard']) == 1: return HttpResponseRedirect(imported['Shard'][0].get_absolute_url()) # otherwise we can just use the default behavior return self.form_valid(form) else: return self.form_invalid(form)
def form_valid(self, form): data = form.clean() if data.get('file_field'): messages.info(self.request, 'Importing config from file') config = data['file_field'].read().decode('utf8') elif data.get('url'): messages.info(self.request, 'Importing config from url') response = util.get(data['url']) response.raise_for_status() config = response.text elif data.get('config'): messages.info(self.request, 'Importing config') config = data['config'] else: messages.warning(self.request, 'Missing config') return self.form_invalid(form) kwargs = {} # This also lets us catch passing an empty string to signal using # the shard value from the post request if data.get('shard'): kwargs['replace_shard'] = data.get('shard') imported, skipped = prometheus.import_config(json.loads(config), **kwargs) if imported: counters = {key: len(imported[key]) for key in imported} messages.info(self.request, 'Imported %s' % counters) if skipped: counters = {key: len(skipped[key]) for key in skipped} messages.info(self.request, 'Skipped %s' % counters) # If we only have a single object in a category, automatically # redirect to that category to make things easier to understand if len(imported['Project']) == 1: return HttpResponseRedirect( imported['Project'][0].get_absolute_url()) if len(imported['Service']) == 1: return HttpResponseRedirect( imported['Service'][0].get_absolute_url()) if len(imported['Shard']) == 1: return HttpResponseRedirect( imported['Shard'][0].get_absolute_url()) return redirect('service-list')
def handle(self, target_file, replace_shard, **kwargs): if target_file.startswith('http'): config = util.get(target_file).json() else: config = json.load(open(target_file), encoding='utf8') imported, skipped = prometheus.import_config(config, replace_shard) if imported: counters = {key: len(imported[key]) for key in imported} self.stdout.write('Imported {}'.format(counters)) if skipped: counters = {key: len(skipped[key]) for key in skipped} self.stdout.write('Skipped {}'.format(counters)) trigger_write_config.send(self, force=True) trigger_write_rules.send(self, force=True) trigger_write_urls.send(self, force=True)