diff --git a/promgen/admin.py b/promgen/admin.py index 1e6390a5e..23537e8e4 100644 --- a/promgen/admin.py +++ b/promgen/admin.py @@ -66,8 +66,8 @@ class FarmAdmin(admin.ModelAdmin): list_filter = ('source',) -@admin.register(models.Exporter) -class ExporterAdmin(admin.ModelAdmin): +@admin.register(models.Job) +class JobAdmin(admin.ModelAdmin): list_display = ('job', 'port', 'path', 'project', 'enabled') list_filter = ('job', 'port',) readonly_fields = ('project',) diff --git a/promgen/forms.py b/promgen/forms.py index 1ee56fec6..569272d8d 100644 --- a/promgen/forms.py +++ b/promgen/forms.py @@ -77,7 +77,7 @@ class SilenceExpireForm(forms.Form): class ExporterForm(forms.ModelForm): class Meta: - model = models.Exporter + model = models.Job exclude = ['project'] widgets = { diff --git a/promgen/management/commands/register-job.py b/promgen/management/commands/register-job.py index bfaad54c5..565feb38e 100644 --- a/promgen/management/commands/register-job.py +++ b/promgen/management/commands/register-job.py @@ -8,7 +8,7 @@ class Command(BaseCommand): def add_arguments(self, parser): - help_text = util.HelpFor(models.Exporter) + help_text = util.HelpFor(models.Job) parser.add_argument("project", help="Existing Project") parser.add_argument("job", help=help_text.job) @@ -22,7 +22,7 @@ def handle(self, **kwargs): except models.Project.DoesNotExist: raise CommandError("Unable to find Project :%s" % kwargs["project"]) - job, created = models.Exporter.objects.get_or_create( + job, created = models.Job.objects.get_or_create( project=project, job=kwargs["job"], port=kwargs["port"], diff --git a/promgen/migrations/0013_rename_job.py b/promgen/migrations/0013_rename_job.py new file mode 100644 index 000000000..eef1fb27d --- /dev/null +++ b/promgen/migrations/0013_rename_job.py @@ -0,0 +1,11 @@ +# Generated by Django 2.2.9 on 2020-01-16 07:30 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [("promgen", "0012_validation_updates")] + + operations = [migrations.RenameModel("Exporter", "Job")] diff --git a/promgen/models.py b/promgen/models.py index 039d125da..74b84086b 100644 --- a/promgen/models.py +++ b/promgen/models.py @@ -316,7 +316,7 @@ def __str__(self): return '{} [{}]'.format(self.name, self.farm.name) -class Exporter(models.Model): +class Job(models.Model): job = models.CharField(max_length=128, help_text="Exporter name. Example node, jmx, app") port = models.IntegerField(help_text="Port Exporter is running on") path = models.CharField(max_length=128, blank=True, help_text="Exporter path. Defaults to /metrics") diff --git a/promgen/prometheus.py b/promgen/prometheus.py index cb0414a2e..756ae5097 100644 --- a/promgen/prometheus.py +++ b/promgen/prometheus.py @@ -104,7 +104,7 @@ def render_urls(): def render_config(service=None, project=None): data = [] - for exporter in models.Exporter.objects.\ + for exporter in models.Job.objects.\ prefetch_related( 'project__farm__host_set', 'project__farm', @@ -259,7 +259,7 @@ def import_config(config, replace_shard=None): logger.debug('Created host %s', host) counters['Host'].append(host) - exporter, created = models.Exporter.objects.get_or_create( + exporter, created = models.Job.objects.get_or_create( job=entry['labels']['job'], port=port, project=project, diff --git a/promgen/signals.py b/promgen/signals.py index 20badfaad..48f3caa98 100644 --- a/promgen/signals.py +++ b/promgen/signals.py @@ -99,7 +99,7 @@ def update_log(sender, instance, **kwargs): if instance.pk: old = sender.objects.get(pk=instance.pk) models.Audit.log('Updated %s %s' % (sender.__name__, instance), instance, old) -pre_save.connect(update_log, sender=models.Exporter) +pre_save.connect(update_log, sender=models.Job) pre_save.connect(update_log, sender=models.Farm) pre_save.connect(update_log, sender=models.Host) pre_save.connect(update_log, sender=models.Project) @@ -114,7 +114,7 @@ def create_log(sender, instance, created, **kwargs): # system. if created: models.Audit.log('Created %s %s' % (sender.__name__, instance), instance) -post_save.connect(create_log, sender=models.Exporter) +post_save.connect(create_log, sender=models.Job) post_save.connect(create_log, sender=models.Farm) post_save.connect(create_log, sender=models.Host) post_save.connect(create_log, sender=models.Project) @@ -125,7 +125,7 @@ def create_log(sender, instance, created, **kwargs): def delete_log(sender, instance, **kwargs): models.Audit.log('Deleted %s %s' % (sender.__name__, instance), instance) -post_delete.connect(delete_log, sender=models.Exporter) +post_delete.connect(delete_log, sender=models.Job) post_delete.connect(delete_log, sender=models.Farm) post_delete.connect(delete_log, sender=models.Host) post_delete.connect(delete_log, sender=models.Project) @@ -159,7 +159,7 @@ def delete_url(sender, instance, **kwargs): def save_host(sender, instance, **kwargs): '''Only trigger write if parent project also has exporters''' for project in instance.farm.project_set.all(): - if project.exporter_set: + if project.job_set: trigger_write_config.send(instance) @@ -167,7 +167,7 @@ def save_host(sender, instance, **kwargs): def delete_host(sender, instance, **kwargs): '''Only trigger write if parent project also has exporters''' for project in instance.farm.project_set.all(): - if project.exporter_set.exists(): + if project.job_set.exists(): trigger_write_config.send(instance) @@ -178,7 +178,7 @@ def delete_farm(sender, instance, **kwargs): trigger_write_config.send(instance) -@receiver(post_save, sender=models.Exporter) +@receiver(post_save, sender=models.Job) def save_exporter(sender, instance, **kwargs): '''Only trigger write if parent project also has hosts''' if instance.project.farm: @@ -186,7 +186,7 @@ def save_exporter(sender, instance, **kwargs): trigger_write_config.send(instance) -@receiver(pre_delete, sender=models.Exporter) +@receiver(pre_delete, sender=models.Job) def delete_exporter(sender, instance, **kwargs): '''Only trigger write if parent project also has hosts''' if instance.project.farm: @@ -197,14 +197,14 @@ def delete_exporter(sender, instance, **kwargs): @receiver(post_save, sender=models.Project) def save_project(sender, instance, **kwargs): logger.debug('save_project: %s', instance) - if instance.farm and instance.farm.host_set.exists() and instance.exporter_set.exists(): + if instance.farm and instance.farm.host_set.exists() and instance.job_set.exists(): trigger_write_config.send(instance) return True @receiver(pre_delete, sender=models.Project) def delete_project(sender, instance, **kwargs): - if instance.farm and instance.farm.host_set.exists() and instance.exporter_set.exists(): + if instance.farm and instance.farm.host_set.exists() and instance.job_set.exists(): trigger_write_config.send(instance) @@ -219,7 +219,7 @@ def save_service(sender, instance, **kwargs): for project in instance.project_set.prefetch_related( 'farm', 'farm__host_set', - 'exporter_set'): + 'job_set'): if save_project(sender=models.Project, instance=project): # If any of our save_project returns True, then we do not need to # check any others diff --git a/promgen/templates/promgen/host_block.html b/promgen/templates/promgen/host_block.html index 255f10751..763233298 100644 --- a/promgen/templates/promgen/host_block.html +++ b/promgen/templates/promgen/host_block.html @@ -6,7 +6,7 @@
Exporters from {{ project.name }}
-{% for exporter in project.exporter_set.all %} +{% for exporter in project.job_set.all %} diff --git a/promgen/templates/promgen/project_detail_exporters.html b/promgen/templates/promgen/project_detail_exporters.html index a082a8267..f3f27c81e 100644 --- a/promgen/templates/promgen/project_detail_exporters.html +++ b/promgen/templates/promgen/project_detail_exporters.html @@ -11,7 +11,7 @@ - {% for exporter in project.exporter_set.all %} + {% for exporter in project.job_set.all %} diff --git a/promgen/templates/promgen/project_row.html b/promgen/templates/promgen/project_row.html index 0d0598991..acab4d7a0 100644 --- a/promgen/templates/promgen/project_row.html +++ b/promgen/templates/promgen/project_row.html @@ -4,7 +4,7 @@
{{ exporter.job }} {{ exporter.port }}   
{{ exporter.job }} {{ exporter.port }} - {% for exporter in project.exporter_set.all %} + {% for exporter in project.job_set.all %} diff --git a/promgen/tests/test_cli.py b/promgen/tests/test_cli.py index ddbe1dad3..07d4d026b 100644 --- a/promgen/tests/test_cli.py +++ b/promgen/tests/test_cli.py @@ -24,15 +24,15 @@ def test_register_job(self, mock_signal): management.call_command("register-job", "TestProject", "example", 1234) # Ensure the jobs we expect exist - self.assertCount(models.Exporter, 1) + self.assertCount(models.Job, 1) # Registering the same job again shouldn't change our count management.call_command("register-job", "TestProject", "example", 1234) - self.assertCount(models.Exporter, 1) + self.assertCount(models.Job, 1) # But registering a new one will management.call_command("register-job", "TestProject", "example", 4321) - self.assertCount(models.Exporter, 2) + self.assertCount(models.Job, 2) @mock.patch("django.dispatch.dispatcher.Signal.send") def test_register_host(self, mock_signal): diff --git a/promgen/tests/test_routes.py b/promgen/tests/test_routes.py index 346bffc4c..3f168bf5b 100644 --- a/promgen/tests/test_routes.py +++ b/promgen/tests/test_routes.py @@ -42,7 +42,7 @@ def test_import(self, mock_write, mock_reload): self.assertRoute(response, views.Import, 302, "Redirect to imported object") self.assertCount(models.Service, 1, "Import one service") self.assertCount(models.Project, 2, "Import two projects") - self.assertCount(models.Exporter, 2, "Import two exporters") + self.assertCount(models.Job, 2, "Import two exporters") self.assertCount(models.Host, 3, "Import three hosts") @override_settings(PROMGEN=TEST_SETTINGS) @@ -62,7 +62,7 @@ def test_replace(self, mock_write, mock_reload): self.assertCount(models.Service, 1, "Import one service") self.assertCount(models.Project, 2, "Import two projects") - self.assertCount(models.Exporter, 2, "Import two exporters") + self.assertCount(models.Job, 2, "Import two exporters") self.assertCount(models.Farm, 3, "Original two farms and one new farm") self.assertCount(models.Host, 5, "Original 3 hosts and two new ones") diff --git a/promgen/tests/test_signals.py b/promgen/tests/test_signals.py index e23e37fab..c09df1d6d 100644 --- a/promgen/tests/test_signals.py +++ b/promgen/tests/test_signals.py @@ -20,11 +20,11 @@ def test_write_signal(self, write_mock, log_mock): project = models.Project.objects.create( name='Project', service=service, farm=farm, shard=shard ) - e1 = models.Exporter.objects.create( + e1 = models.Job.objects.create( job='Exporter 1', port=1234, project=project, ) - e2 = models.Exporter.objects.create( + e2 = models.Job.objects.create( job='Exporter 2', port=1234, project=project, ) @@ -48,7 +48,7 @@ def test_write_and_delete(self, write_mock, log_mock): # Farm but no exporters so no call self.assertEqual(write_mock.call_count, 0, 'Should not be called without exporters') - models.Exporter.objects.create( + models.Job.objects.create( job='Exporter 1', port=1234, project=project, ) # Create an exporter so our call should be 1 @@ -58,7 +58,7 @@ def test_write_and_delete(self, write_mock, log_mock): # Deleting our farm will call pre_delete on Farm and post_save on project self.assertEqual(write_mock.call_count, 3, 'Should be called after deleting farm') - models.Exporter.objects.create( + models.Job.objects.create( job='Exporter 2', port=1234, project=project, ) # Deleting our farm means our config is inactive, so no additional calls diff --git a/promgen/views.py b/promgen/views.py index 3e987a66d..6057a1f8b 100644 --- a/promgen/views.py +++ b/promgen/views.py @@ -58,7 +58,7 @@ class ShardList(LoginRequiredMixin, ListView): "project_set", "project_set__owner", "project_set__farm", - "project_set__exporter_set", + "project_set__job_set", "project_set__notifiers", "project_set__notifiers__owner", "prometheus_set", @@ -76,7 +76,7 @@ class ShardDetail(LoginRequiredMixin, DetailView): "project_set", "project_set__owner", "project_set__farm", - "project_set__exporter_set", + "project_set__job_set", "project_set__notifiers", "project_set__notifiers__owner", "project_set__notifiers__filter_set", @@ -95,7 +95,7 @@ class ServiceList(LoginRequiredMixin, ListView): "project_set__notifiers__owner", "project_set__notifiers__filter_set", "project_set__farm", - "project_set__exporter_set", + "project_set__job_set", "owner", "notifiers", "notifiers__owner", @@ -125,7 +125,7 @@ def get_queryset(self): 'project_set', 'project_set__farm', 'project_set__shard', - 'project_set__exporter_set', + 'project_set__job_set', 'project_set__notifiers', 'project_set__owner', 'project_set__notifiers__owner', @@ -169,7 +169,7 @@ def get(self, request, slug): id__in=context['farm_list'].values_list('project__id', flat=True) ).prefetch_related('notifiers', 'rule_set') - context['exporter_list'] = models.Exporter.objects.filter( + context['exporter_list'] = models.Job.objects.filter( project_id__in=context['project_list'].values_list('id', flat=True) ).prefetch_related('project', 'project__service') @@ -229,8 +229,8 @@ def get_queryset(self): if key == 'project': # Only projects may have exporters qset |= Q( - content_type_id=ContentType.objects.get_for_model(models.Exporter).id, - object_id__in=obj.exporter_set.values_list('id', flat=True) + content_type_id=ContentType.objects.get_for_model(models.Job).id, + object_id__in=obj.job_set.values_list('id', flat=True) ) # Only projects may have URLs qset |= Q( @@ -258,7 +258,7 @@ class ServiceDetail(LoginRequiredMixin, DetailView): 'project_set', 'project_set__shard', 'project_set__farm', - 'project_set__exporter_set', + 'project_set__job_set', 'project_set__notifiers', 'project_set__notifiers__owner' ) @@ -335,7 +335,7 @@ def post(self, request, pk): class ExporterDelete(LoginRequiredMixin, DeleteView): - model = models.Exporter + model = models.Job def get_success_url(self): return reverse('project-detail', args=[self.object.project_id]) @@ -343,7 +343,7 @@ def get_success_url(self): class ExporterToggle(LoginRequiredMixin, View): def post(self, request, pk): - exporter = get_object_or_404(models.Exporter, id=pk) + exporter = get_object_or_404(models.Job, id=pk) exporter.enabled = not exporter.enabled exporter.save() signals.trigger_write_config.send(request) @@ -597,13 +597,13 @@ def post(self, request, pk, source): class ExporterRegister(LoginRequiredMixin, FormView, mixins.ProjectMixin): - model = models.Exporter + model = models.Job template_name = 'promgen/exporter_form.html' form_class = forms.ExporterForm def form_valid(self, form): project = get_object_or_404(models.Project, id=self.kwargs['pk']) - exporter, _ = models.Exporter.objects.get_or_create(project=project, **form.clean()) + exporter, _ = models.Job.objects.get_or_create(project=project, **form.clean()) return HttpResponseRedirect(reverse('project-detail', args=[project.id])) @@ -1077,7 +1077,7 @@ def collect(self): "promgen_shards", "Registered Shards", models.Shard.objects.count() ) yield GaugeMetricFamily( - "promgen_exporters", "Registered Exporters", models.Exporter.objects.count() + "promgen_exporters", "Registered Exporters", models.Job.objects.count() ) yield GaugeMetricFamily( "promgen_services", "Registered Services", models.Service.objects.count() @@ -1129,7 +1129,7 @@ def get(self, request): 'project_list': { 'field': ('name__icontains',), 'model': models.Project, - 'prefetch': ('service', 'notifiers', 'exporter_set', 'notifiers__owner'), + 'prefetch': ('service', 'notifiers', 'job_set', 'notifiers__owner'), 'query': ('search', 'var-project'), }, 'rule_list': {
{{ exporter.job }} {{ exporter.port }}