mirror of
https://github.com/ansible/awx.git
synced 2026-03-02 17:28:51 -03:30
Merge pull request #3272 from jladdjr/mo_stats
Add support for new playbook stats Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
This commit is contained in:
@@ -4038,7 +4038,8 @@ class JobHostSummarySerializer(BaseSerializer):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = JobHostSummary
|
model = JobHostSummary
|
||||||
fields = ('*', '-name', '-description', 'job', 'host', 'host_name', 'changed',
|
fields = ('*', '-name', '-description', 'job', 'host', 'host_name', 'changed',
|
||||||
'dark', 'failures', 'ok', 'processed', 'skipped', 'failed')
|
'dark', 'failures', 'ok', 'processed', 'skipped', 'failed',
|
||||||
|
'ignored', 'rescued')
|
||||||
|
|
||||||
def get_related(self, obj):
|
def get_related(self, obj):
|
||||||
res = super(JobHostSummarySerializer, self).get_related(obj)
|
res = super(JobHostSummarySerializer, self).get_related(obj)
|
||||||
|
|||||||
@@ -329,8 +329,10 @@ class BaseCallbackModule(CallbackBase):
|
|||||||
changed=stats.changed,
|
changed=stats.changed,
|
||||||
dark=stats.dark,
|
dark=stats.dark,
|
||||||
failures=stats.failures,
|
failures=stats.failures,
|
||||||
|
ignored=getattr(stats, 'ignored', 0),
|
||||||
ok=stats.ok,
|
ok=stats.ok,
|
||||||
processed=stats.processed,
|
processed=stats.processed,
|
||||||
|
rescued=getattr(stats, 'rescued', 0),
|
||||||
skipped=stats.skipped
|
skipped=stats.skipped
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
25
awx/main/migrations/0062_v350_new_playbook_stats.py
Normal file
25
awx/main/migrations/0062_v350_new_playbook_stats.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.11.16 on 2019-02-14 00:44
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('main', '0061_v350_track_native_credentialtype_source'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='jobhostsummary',
|
||||||
|
name='ignored',
|
||||||
|
field=models.PositiveIntegerField(default=0, editable=False),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='jobhostsummary',
|
||||||
|
name='rescued',
|
||||||
|
field=models.PositiveIntegerField(default=0, editable=False),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -483,7 +483,7 @@ class JobEvent(BasePlaybookEvent):
|
|||||||
job = self.job
|
job = self.job
|
||||||
for host in hostnames:
|
for host in hostnames:
|
||||||
host_stats = {}
|
host_stats = {}
|
||||||
for stat in ('changed', 'dark', 'failures', 'ok', 'processed', 'skipped'):
|
for stat in ('changed', 'dark', 'failures', 'ignored', 'ok', 'processed', 'rescued', 'skipped'):
|
||||||
try:
|
try:
|
||||||
host_stats[stat] = self.event_data.get(stat, {}).get(host, 0)
|
host_stats[stat] = self.event_data.get(stat, {}).get(host, 0)
|
||||||
except AttributeError: # in case event_data[stat] isn't a dict.
|
except AttributeError: # in case event_data[stat] isn't a dict.
|
||||||
|
|||||||
@@ -1123,17 +1123,19 @@ class JobHostSummary(CreatedModifiedModel):
|
|||||||
changed = models.PositiveIntegerField(default=0, editable=False)
|
changed = models.PositiveIntegerField(default=0, editable=False)
|
||||||
dark = models.PositiveIntegerField(default=0, editable=False)
|
dark = models.PositiveIntegerField(default=0, editable=False)
|
||||||
failures = models.PositiveIntegerField(default=0, editable=False)
|
failures = models.PositiveIntegerField(default=0, editable=False)
|
||||||
|
ignored = models.PositiveIntegerField(default=0, editable=False)
|
||||||
ok = models.PositiveIntegerField(default=0, editable=False)
|
ok = models.PositiveIntegerField(default=0, editable=False)
|
||||||
processed = models.PositiveIntegerField(default=0, editable=False)
|
processed = models.PositiveIntegerField(default=0, editable=False)
|
||||||
|
rescued = models.PositiveIntegerField(default=0, editable=False)
|
||||||
skipped = models.PositiveIntegerField(default=0, editable=False)
|
skipped = models.PositiveIntegerField(default=0, editable=False)
|
||||||
failed = models.BooleanField(default=False, editable=False)
|
failed = models.BooleanField(default=False, editable=False)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
host = getattr_dne(self, 'host')
|
host = getattr_dne(self, 'host')
|
||||||
hostname = host.name if host else 'N/A'
|
hostname = host.name if host else 'N/A'
|
||||||
return '%s changed=%d dark=%d failures=%d ok=%d processed=%d skipped=%s' % \
|
return '%s changed=%d dark=%d failures=%d ignored=%d ok=%d processed=%d rescued=%d skipped=%s' % \
|
||||||
(hostname, self.changed, self.dark, self.failures, self.ok,
|
(hostname, self.changed, self.dark, self.failures, self.ignored, self.ok,
|
||||||
self.processed, self.skipped)
|
self.processed, self.rescued, self.skipped)
|
||||||
|
|
||||||
def get_absolute_url(self, request=None):
|
def get_absolute_url(self, request=None):
|
||||||
return reverse('api:job_host_summary_detail', kwargs={'pk': self.pk}, request=request)
|
return reverse('api:job_host_summary_detail', kwargs={'pk': self.pk}, request=request)
|
||||||
|
|||||||
@@ -68,14 +68,14 @@ def test_job_host_summary_representation(host):
|
|||||||
job = Job.objects.create(name='foo')
|
job = Job.objects.create(name='foo')
|
||||||
jhs = JobHostSummary.objects.create(
|
jhs = JobHostSummary.objects.create(
|
||||||
host=host, job=job,
|
host=host, job=job,
|
||||||
changed=1, dark=2, failures=3, ok=4, processed=5, skipped=6
|
changed=1, dark=2, failures=3, ignored=4, ok=5, processed=6, rescued=7, skipped=8
|
||||||
)
|
)
|
||||||
assert 'single-host changed=1 dark=2 failures=3 ok=4 processed=5 skipped=6' == str(jhs)
|
assert 'single-host changed=1 dark=2 failures=3 ignored=4 ok=5 processed=6 rescued=7 skipped=8' == str(jhs)
|
||||||
|
|
||||||
# Representation should be robust to deleted related items
|
# Representation should be robust to deleted related items
|
||||||
jhs = JobHostSummary.objects.get(pk=jhs.id)
|
jhs = JobHostSummary.objects.get(pk=jhs.id)
|
||||||
host.delete()
|
host.delete()
|
||||||
assert 'N/A changed=1 dark=2 failures=3 ok=4 processed=5 skipped=6' == str(jhs)
|
assert 'N/A changed=1 dark=2 failures=3 ignored=4 ok=5 processed=6 rescued=7 skipped=8' == str(jhs)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ ansible -i "127.0.0.1," -c local -v -m wait_for -a "host=${RABBITMQ_HOST} port=5
|
|||||||
#/etc/init.d/ssh start
|
#/etc/init.d/ssh start
|
||||||
|
|
||||||
|
|
||||||
ansible -i "127.0.0.1," -c local -v -m postgresql_user -U postgres -a "name=awx-dev password=AWXsome1 login_user=postgres login_host=postgres" all
|
ansible -i "127.0.0.1," -c local -v -m postgresql_user --become-user postgres -a "name=awx-dev password=AWXsome1 login_user=postgres login_host=postgres" all
|
||||||
ansible -i "127.0.0.1," -c local -v -m postgresql_db -U postgres -a "name=awx-dev owner=awx-dev login_user=postgres login_host=postgres" all
|
ansible -i "127.0.0.1," -c local -v -m postgresql_db --become-user postgres -a "name=awx-dev owner=awx-dev login_user=postgres login_host=postgres" all
|
||||||
|
|
||||||
# Move to the source directory so we can bootstrap
|
# Move to the source directory so we can bootstrap
|
||||||
if [ -f "/awx_devel/manage.py" ]; then
|
if [ -f "/awx_devel/manage.py" ]; then
|
||||||
|
|||||||
Reference in New Issue
Block a user