From 408b38174a8cedc7f383923de32f9a6d9d27a725 Mon Sep 17 00:00:00 2001 From: Marliana Lara Date: Wed, 3 Jul 2019 13:07:05 -0400 Subject: [PATCH 01/14] Add job output menu controls component --- .../src/screens/Job/JobOutput/JobOutput.jsx | 14 ++++- .../Job/JobOutput/shared/MenuControls.jsx | 59 +++++++++++++++++++ .../src/screens/Job/JobOutput/shared/index.js | 1 + 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx create mode 100644 awx/ui_next/src/screens/Job/JobOutput/shared/index.js diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx index 1dbdb581d6..dcae5a48dc 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx @@ -1,5 +1,12 @@ import React, { Component } from 'react'; import { CardBody } from '@patternfly/react-core'; +import MenuControls from './shared/MenuControls'; +import styled from 'styled-components'; + +const OutputToolbar = styled.div` + display: flex; + justify-content: space-between; +`; class JobOutput extends Component { render() { @@ -7,7 +14,12 @@ class JobOutput extends Component { return ( - {job.name} + {job.name} - Heading and Job Stats placeholder
{/*Heading and Job Stats */} + Host Status Bar placeholder
{/*Host Status Bar */} + {/* Filter and Pagination */} + Filter placeholder + +
); } diff --git a/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx b/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx new file mode 100644 index 0000000000..a36373bfd9 --- /dev/null +++ b/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx @@ -0,0 +1,59 @@ +import React, { Component } from 'react'; +import { Button as PFButton } from '@patternfly/react-core'; +import { + PlusIcon, + AngleDoubleUpIcon, + AngleDoubleDownIcon, + AngleUpIcon, + AngleDownIcon, +} from '@patternfly/react-icons'; +import styled from 'styled-components'; + +const Wrapper = styled.div` + display: grid; + grid-gap: 20px; + grid-template-columns: repeat(5, 1fr); +`; + +const Button = styled(PFButton)` + &:hover { + background-color: #0066cc; + color: white; + } +`; + +class MenuControls extends Component { + render() { + return ( + + + + + + + + ); + } +} + +export default MenuControls; diff --git a/awx/ui_next/src/screens/Job/JobOutput/shared/index.js b/awx/ui_next/src/screens/Job/JobOutput/shared/index.js new file mode 100644 index 0000000000..307985d03c --- /dev/null +++ b/awx/ui_next/src/screens/Job/JobOutput/shared/index.js @@ -0,0 +1 @@ +export { default as MenuControls } from './MenuControls'; From 859c364fbe26d8b4eb28e9d3d0662b3da3009f22 Mon Sep 17 00:00:00 2001 From: Marliana Lara Date: Thu, 11 Jul 2019 10:46:46 -0400 Subject: [PATCH 02/14] Add MenuControl tests --- .../src/screens/Job/JobOutput/JobOutput.jsx | 12 +++++-- .../Job/JobOutput/shared/MenuControls.jsx | 20 +++-------- .../JobOutput/shared/MenuControls.test.jsx | 35 +++++++++++++++++++ 3 files changed, 49 insertions(+), 18 deletions(-) create mode 100644 awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.test.jsx diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx index dcae5a48dc..6e97e03269 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx @@ -14,12 +14,18 @@ class JobOutput extends Component { return ( - {job.name} - Heading and Job Stats placeholder
{/*Heading and Job Stats */} - Host Status Bar placeholder
{/*Host Status Bar */} - {/* Filter and Pagination */} + {job.name} + {/*Heading and Job Stats */} + {/*Host Status Bar */} + + {/* Filter and Pagination */} Filter placeholder +
    +
  • +
  • +
); } diff --git a/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx b/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx index a36373bfd9..8d135110dd 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx @@ -26,29 +26,19 @@ class MenuControls extends Component { render() { return ( - - - - - diff --git a/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.test.jsx b/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.test.jsx new file mode 100644 index 0000000000..ab63883778 --- /dev/null +++ b/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.test.jsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { mount } from 'enzyme'; +import MenuControls from './MenuControls'; + +let wrapper; +let PlusIcon; +let AngleDoubleUpIcon; +let AngleDoubleDownIcon; +let AngleUpIcon; +let AngleDownIcon; + +const findChildren = () => { + PlusIcon = wrapper.find('PlusIcon'); + AngleDoubleUpIcon = wrapper.find('AngleDoubleUpIcon'); + AngleDoubleDownIcon = wrapper.find('AngleDoubleDownIcon'); + AngleUpIcon = wrapper.find('AngleUpIcon'); + AngleDownIcon = wrapper.find('AngleDownIcon'); +} + +describe('MenuControls', () => { + test('should render successfully', () => { + wrapper = mount(); + expect(wrapper).toHaveLength(1); + }); + + test('should render menu control icons', () => { + wrapper = mount(); + findChildren(); + expect(PlusIcon.length).toBe(1); + expect(AngleDoubleUpIcon.length).toBe(1); + expect(AngleDoubleDownIcon.length).toBe(1); + expect(AngleUpIcon.length).toBe(1); + expect(AngleDownIcon.length).toBe(1); + }); +}); From da9288932336c02f8341fe8934ad4e6b9a2eb1a8 Mon Sep 17 00:00:00 2001 From: Marliana Lara Date: Fri, 12 Jul 2019 13:57:21 -0400 Subject: [PATCH 03/14] WIP - react virtualizer --- awx/ui_next/package-lock.json | 76 +++++++-- awx/ui_next/package.json | 1 + awx/ui_next/src/api/models/Jobs.js | 6 + .../src/screens/Job/JobOutput/JobOutput.jsx | 145 ++++++++++++++++-- .../Job/JobOutput/shared/MenuControls.jsx | 18 ++- .../JobOutput/shared/MenuControls.test.jsx | 2 +- .../src/screens/Job/JobOutput/shared/index.js | 2 +- 7 files changed, 220 insertions(+), 30 deletions(-) diff --git a/awx/ui_next/package-lock.json b/awx/ui_next/package-lock.json index a1783d92e1..7c82f572c3 100644 --- a/awx/ui_next/package-lock.json +++ b/awx/ui_next/package-lock.json @@ -4576,6 +4576,11 @@ } } }, + "clsx": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.0.4.tgz", + "integrity": "sha512-1mQ557MIZTrL/140j+JVdRM6e31/OA4vTYxXgqIIZlndyfjHpyawKZia1Im05Vp9BWmImkcNrNtFYQMyFcgJDg==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -5429,6 +5434,14 @@ "esutils": "^2.0.2" } }, + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, "dom-serializer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", @@ -7174,7 +7187,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -7195,12 +7209,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7215,17 +7231,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -7342,7 +7361,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -7354,6 +7374,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -7368,6 +7389,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -7375,12 +7397,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -7399,6 +7423,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -7479,7 +7504,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -7491,6 +7517,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -7576,7 +7603,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -7612,6 +7640,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -7631,6 +7660,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -7674,12 +7704,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -10790,6 +10822,11 @@ "type-check": "~0.3.2" } }, + "linear-layout-vector": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/linear-layout-vector/-/linear-layout-vector-0.0.1.tgz", + "integrity": "sha1-OYEU1zA7bsx/1rJzr3uEAdi6nHA=" + }, "load-json-file": { "version": "1.1.0", "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -13130,8 +13167,7 @@ "react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", - "dev": true + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-router": { "version": "4.3.1", @@ -13190,6 +13226,20 @@ } } }, + "react-virtualized": { + "version": "9.21.1", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.21.1.tgz", + "integrity": "sha512-E53vFjRRMCyUTEKuDLuGH1ld/9TFzjf/fFW816PE4HFXWZorESbSTYtiZz1oAjra0MminaUU1EnvUxoGuEFFPA==", + "requires": { + "babel-runtime": "^6.26.0", + "clsx": "^1.0.1", + "dom-helpers": "^2.4.0 || ^3.0.0", + "linear-layout-vector": "0.0.1", + "loose-envify": "^1.3.0", + "prop-types": "^15.6.0", + "react-lifecycles-compat": "^3.0.4" + } + }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", diff --git a/awx/ui_next/package.json b/awx/ui_next/package.json index aab41746ae..48d0855cda 100644 --- a/awx/ui_next/package.json +++ b/awx/ui_next/package.json @@ -70,6 +70,7 @@ "react-codemirror2": "^6.0.0", "react-dom": "^16.4.1", "react-router-dom": "^4.3.1", + "react-virtualized": "^9.21.1", "styled-components": "^4.2.0" } } diff --git a/awx/ui_next/src/api/models/Jobs.js b/awx/ui_next/src/api/models/Jobs.js index bd103c072a..a47b939a41 100644 --- a/awx/ui_next/src/api/models/Jobs.js +++ b/awx/ui_next/src/api/models/Jobs.js @@ -18,6 +18,12 @@ class Jobs extends Base { readDetail(id, type) { return this.http.get(`/api/v2${BASE_URLS[type]}${id}/`); } + + readJobEvents(id, params = {}) { + return this.http.get(`${this.baseUrl}${id}/job_events/`, { + params, + }); + } } export default Jobs; diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx index 6e97e03269..6f70d01c78 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx @@ -1,31 +1,154 @@ import React, { Component } from 'react'; import { CardBody } from '@patternfly/react-core'; -import MenuControls from './shared/MenuControls'; import styled from 'styled-components'; +import { JobsAPI } from '@api'; +import ContentError from '@components/ContentError'; +import ContentLoading from '@components/ContentLoading'; +import MenuControls from './shared/MenuControls'; +import { List, AutoSizer } from 'react-virtualized'; const OutputToolbar = styled.div` display: flex; - justify-content: space-between; + justify-content: flex-end; +`; +const OutputWrapper = styled.div` + height: calc(100vh - 325px); + background-color: #fafafa; + margin-top: 24px; +`; +const OutputRow = styled.div` + display: flex; `; class JobOutput extends Component { + listRef = React.createRef(); + + constructor(props) { + super(props); + + this.state = { + contentError: null, + hasContentLoading: true, + results: [], + scrollToIndex: -1, + startIndex: 0, + stopIndex: 0, + }; + + this.loadJobEvents = this.loadJobEvents.bind(this); + this.renderRow = this.renderRow.bind(this); + this.handleScrollTop = this.handleScrollTop.bind(this); + this.handleScrollBottom = this.handleScrollBottom.bind(this); + this.handleScrollNext = this.handleScrollNext.bind(this); + this.handleScrollPrevious = this.handleScrollPrevious.bind(this); + } + + componentDidMount() { + this.loadJobEvents(); + } + + async loadJobEvents() { + const { job } = this.props; + + try { + const { + data: { results = [] }, + } = await JobsAPI.readJobEvents(job.id); + this.setState({ results, hasContentLoading: true }); + } catch (err) { + this.setState({ contentError: err }); + } finally { + this.setState({ hasContentLoading: false }); + } + } + + renderRow({ index, key, style }) { + const { results } = this.state; + return ( + +
{results[index].id}
+
{results[index].stdout}
+
+ ); + } + + onRowsRendered = ({ startIndex, stopIndex }) => { + this.setState({ startIndex, stopIndex }); + }; + + handleScrollPrevious() { + const { startIndex, stopIndex } = this.state; + const index = startIndex - (stopIndex - startIndex); + this.setState({ scrollToIndex: Math.max(0, index) }); + } + + handleScrollNext() { + const { stopIndex } = this.state; + this.setState({ scrollToIndex: stopIndex + 1}); + } + + handleScrollTop() { + this.setState({ scrollToIndex: 0 }); + } + + handleScrollBottom() { + const { results } = this.state; + this.setState({ scrollToIndex: results.length - 1 }); + } + render() { const { job } = this.props; + const { + results, + hasContentLoading, + contentError, + scrollToIndex, + startIndex, + stopIndex + } = this.state; + + if (hasContentLoading) { + return ; + } + + if (contentError) { + return ; + } return ( {job.name} - {/*Heading and Job Stats */} - {/*Host Status Bar */} - {/* Filter and Pagination */} - Filter placeholder - + -
    -
  • -
  • -
+ + + {({ width, height }) => { + console.log('scroll to index', scrollToIndex); + console.log('start index', startIndex); + console.log('stop index', stopIndex); + return ( + + ); + }} + +
); } diff --git a/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx b/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx index 8d135110dd..9391ccadc6 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx @@ -23,22 +23,32 @@ const Button = styled(PFButton)` `; class MenuControls extends Component { + constructor(props) { + super(props); + } + render() { + const { + onScrollTop, + onScrollBottom, + onScrollNext, + onScrollPrevious, + } = this.props; return ( - - - - diff --git a/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.test.jsx b/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.test.jsx index ab63883778..8ac5fe4c46 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.test.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.test.jsx @@ -15,7 +15,7 @@ const findChildren = () => { AngleDoubleDownIcon = wrapper.find('AngleDoubleDownIcon'); AngleUpIcon = wrapper.find('AngleUpIcon'); AngleDownIcon = wrapper.find('AngleDownIcon'); -} +}; describe('MenuControls', () => { test('should render successfully', () => { diff --git a/awx/ui_next/src/screens/Job/JobOutput/shared/index.js b/awx/ui_next/src/screens/Job/JobOutput/shared/index.js index 307985d03c..3a2f81055d 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/shared/index.js +++ b/awx/ui_next/src/screens/Job/JobOutput/shared/index.js @@ -1 +1 @@ -export { default as MenuControls } from './MenuControls'; +export { default } from './MenuControls'; From 474a2a48bbc33a5d6c92e694dec4c93131969627 Mon Sep 17 00:00:00 2001 From: Jake McDermott Date: Fri, 12 Jul 2019 16:16:55 -0400 Subject: [PATCH 04/14] add job event component and sanitized html building for output lines --- awx/ui_next/package.json | 3 + awx/ui_next/src/api/models/Jobs.js | 12 +- .../src/screens/Job/JobOutput/JobEvent.jsx | 151 ++++++++++++++++++ .../screens/Job/JobOutput/JobEvent.test.jsx | 72 +++++++++ .../src/screens/Job/JobOutput/JobOutput.jsx | 55 +++++-- 5 files changed, 273 insertions(+), 20 deletions(-) create mode 100644 awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx create mode 100644 awx/ui_next/src/screens/Job/JobOutput/JobEvent.test.jsx diff --git a/awx/ui_next/package.json b/awx/ui_next/package.json index 48d0855cda..9a67f2ef02 100644 --- a/awx/ui_next/package.json +++ b/awx/ui_next/package.json @@ -61,9 +61,12 @@ "@patternfly/react-core": "^3.16.14", "@patternfly/react-icons": "^3.7.5", "@patternfly/react-tokens": "^2.3.3", + "ansi-to-html": "^0.6.11", "axios": "^0.18.0", "codemirror": "^5.47.0", "formik": "^1.5.1", + "has-ansi": "^3.0.0", + "html-entities": "^1.2.1", "js-yaml": "^3.13.1", "prop-types": "^15.6.2", "react": "^16.4.1", diff --git a/awx/ui_next/src/api/models/Jobs.js b/awx/ui_next/src/api/models/Jobs.js index a47b939a41..1a01ace0ba 100644 --- a/awx/ui_next/src/api/models/Jobs.js +++ b/awx/ui_next/src/api/models/Jobs.js @@ -19,10 +19,14 @@ class Jobs extends Base { return this.http.get(`/api/v2${BASE_URLS[type]}${id}/`); } - readJobEvents(id, params = {}) { - return this.http.get(`${this.baseUrl}${id}/job_events/`, { - params, - }); + readEvents(id, jobType = 'job', params = {}) { + let endpoint; + if (jobType === 'job') { + endpoint = `${this.baseUrl}${id}/job_events/`; + } else { + endpoint = `${this.baseUrl}${id}/events/`; + } + return this.http.get(endpoint, { params }); } } diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx new file mode 100644 index 0000000000..63d7b80c1c --- /dev/null +++ b/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx @@ -0,0 +1,151 @@ +import Ansi from 'ansi-to-html'; +import hasAnsi from 'has-ansi'; +import Entities from 'html-entities'; +import styled from 'styled-components'; +import React from 'react'; + +const EVENT_START_TASK = 'playbook_on_task_start'; +const EVENT_START_PLAY = 'playbook_on_play_start'; +const EVENT_STATS_PLAY = 'playbook_on_stats'; +const TIME_EVENTS = [EVENT_START_TASK, EVENT_START_PLAY, EVENT_STATS_PLAY]; + +const ansi = new Ansi({ + stream: true, + colors: { + 0: '#000', + 1: '#A00', + 2: '#080', + 3: '#F0AD4E', + 4: '#00A', + 5: '#A0A', + 6: '#0AA', + 7: '#AAA', + 8: '#555', + 9: '#F55', + 10: '#5F5', + 11: '#FF5', + 12: '#55F', + 13: '#F5F', + 14: '#5FF', + 15: '#FFF', + }, +}); +const entities = new Entities.AllHtmlEntities(); + +const JobEventWrapper = styled.div``; +const JobEventLine = styled.div` + display: flex; + + &:hover { + background-color: white; + } + + &:hover div { + background-color: white; + } + + &--hidden { + display: none; + } + ${({ isFirst }) => (isFirst ? 'padding-top: 10px;' : '')} +`; +const JobEventLineToggle = styled.div` + background-color: #ebebeb; + color: #646972; + display: flex; + flex: 0 0 30px; + font-size: 18px; + justify-content: center; + line-height: 12px; + + & > i { + cursor: pointer; + } + + user-select: none; +`; +const JobEventLineNumber = styled.div` + color: #161b1f; + background-color: #ebebeb; + flex: 0 0 45px; + text-align: right; + vertical-align: top; + padding-right: 5px; + border-right: 1px solid #b7b7b7; + user-select: none; +`; +const JobEventLineText = styled.div` + padding: 0 15px; + white-space: pre-wrap; + word-break: break-all; + word-wrap: break-word; + + .time { + font-size: 14px; + font-weight: 600; + user-select: none; + background-color: #ebebeb; + border-radius: 12px; + padding: 2px 10px; + margin-left: 15px; + } +`; + +function getTimestamp({ created }) { + const date = new Date(created); + + const dateHours = date.getHours(); + const dateMinutes = date.getMinutes(); + const dateSeconds = date.getSeconds(); + + const stampHour = dateHours < 10 ? `0${dateHours}` : dateHours; + const stampMinute = dateMinutes < 10 ? `0${dateMinutes}` : dateMinutes; + const stampSecond = dateSeconds < 10 ? `0${dateSeconds}` : dateSeconds; + + return `${stampHour}:${stampMinute}:${stampSecond}`; +} + +function getLineTextHtml({ created, event, start_line, stdout }) { + const sanitized = entities.encode(stdout); + return sanitized.split('\r\n').map((lineText, index) => { + let html; + if (hasAnsi(lineText)) { + html = ansi.toHtml(lineText); + } else { + html = lineText; + } + + if (index === 1 && TIME_EVENTS.includes(event)) { + const time = getTimestamp({ created }); + html += `${time}`; + } + + return { + lineNumber: start_line + index, + html, + }; + }); +} + +function JobEvent({ created, event, stdout, start_line, ...rest }) { + return !stdout ? null : ( + + {getLineTextHtml({ created, event, start_line, stdout }).map( + ({ lineNumber, html }) => + lineNumber > 0 && ( + + + {lineNumber} + + + ) + )} + + ); +} + +export default JobEvent; diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobEvent.test.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobEvent.test.jsx new file mode 100644 index 0000000000..d413f53726 --- /dev/null +++ b/awx/ui_next/src/screens/Job/JobOutput/JobEvent.test.jsx @@ -0,0 +1,72 @@ +import React from 'react'; +import { mountWithContexts } from '@testUtils/enzymeHelpers'; + +import JobEvent from './JobEvent'; + +const mockOnPlayStartEvent = { + created: '2019-07-11T18:11:22.005319Z', + event: 'playbook_on_play_start', + counter: 2, + start_line: 0, + end_line: 2, + stdout: + '\r\nPLAY [add hosts to inventory] **************************************************', +}; +const mockRunnerOnOkEvent = { + created: '2019-07-11T18:09:22.906001Z', + event: 'runner_on_ok', + counter: 5, + start_line: 4, + end_line: 5, + stdout: '\u001b[0;32mok: [localhost]\u001b[0m', +}; +const selectors = { + lineText: 'JobEvent__JobEventLineText', +}; + +function tzHours(hours) { + const date = new Date(); + date.setUTCHours(hours); + return date.getHours(); +} + +describe('', () => { + test('initially renders successfully', () => { + mountWithContexts(); + }); + + test('playbook event timestamps are rendered', () => { + let wrapper = mountWithContexts(); + let lineText = wrapper.find(selectors.lineText); + expect( + lineText.filterWhere(e => e.html().includes(`${tzHours(18)}:11:22`)) + ).toHaveLength(1); + + const singleDigitTimestampEvent = { + ...mockOnPlayStartEvent, + created: '2019-07-11T08:01:02.906001Z', + }; + wrapper = mountWithContexts(); + lineText = wrapper.find(selectors.lineText); + expect( + lineText.filterWhere(e => e.html().includes(`${tzHours(8)}:01:02`)) + ).toHaveLength(1); + }); + + test('ansi stdout colors are rendered as html', () => { + const wrapper = mountWithContexts(); + const lineText = wrapper.find(selectors.lineText); + expect( + lineText + .html() + .includes('ok: [localhost]') + ).toBe(true); + }); + + test("events without stdout aren't rendered", () => { + const missingStdoutEvent = { ...mockOnPlayStartEvent }; + delete missingStdoutEvent.stdout; + const wrapper = mountWithContexts(); + expect(wrapper.find(selectors.lineText)).toHaveLength(0); + }); +}); diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx index 6f70d01c78..179bb2927f 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx @@ -1,11 +1,14 @@ +import styled from 'styled-components'; +import { List, AutoSizer } from 'react-virtualized'; + import React, { Component } from 'react'; import { CardBody } from '@patternfly/react-core'; -import styled from 'styled-components'; + import { JobsAPI } from '@api'; import ContentError from '@components/ContentError'; import ContentLoading from '@components/ContentLoading'; +import JobEvent from './JobEvent'; import MenuControls from './shared/MenuControls'; -import { List, AutoSizer } from 'react-virtualized'; const OutputToolbar = styled.div` display: flex; @@ -15,9 +18,17 @@ const OutputWrapper = styled.div` height: calc(100vh - 325px); background-color: #fafafa; margin-top: 24px; -`; -const OutputRow = styled.div` + font-family: monospace; + font-size: 15px; + border: 1px solid #b7b7b7; display: flex; + flex-direction: column; +`; +const OutputFooter = styled.div` + background-color: #ebebeb; + border-right: 1px solid #b7b7b7; + width: 75px; + flex: 1; `; class JobOutput extends Component { @@ -41,6 +52,7 @@ class JobOutput extends Component { this.handleScrollBottom = this.handleScrollBottom.bind(this); this.handleScrollNext = this.handleScrollNext.bind(this); this.handleScrollPrevious = this.handleScrollPrevious.bind(this); + this.onRowsRendered = this.onRowsRendered.bind(this); } componentDidMount() { @@ -50,11 +62,15 @@ class JobOutput extends Component { async loadJobEvents() { const { job } = this.props; + this.setState({ hasContentLoading: true }); try { const { data: { results = [] }, - } = await JobsAPI.readJobEvents(job.id); - this.setState({ results, hasContentLoading: true }); + } = await JobsAPI.readEvents(job.id, job.type, { + page_size: 200, + order_by: 'start_line', + }); + this.setState({ results }); } catch (err) { this.setState({ contentError: err }); } finally { @@ -64,17 +80,23 @@ class JobOutput extends Component { renderRow({ index, key, style }) { const { results } = this.state; + const { created, event, stdout, start_line } = results[index]; return ( - -
{results[index].id}
-
{results[index].stdout}
-
+ ); } - onRowsRendered = ({ startIndex, stopIndex }) => { + onRowsRendered({ startIndex, stopIndex }) { this.setState({ startIndex, stopIndex }); - }; + } handleScrollPrevious() { const { startIndex, stopIndex } = this.state; @@ -84,7 +106,7 @@ class JobOutput extends Component { handleScrollNext() { const { stopIndex } = this.state; - this.setState({ scrollToIndex: stopIndex + 1}); + this.setState({ scrollToIndex: stopIndex + 1 }); } handleScrollTop() { @@ -104,7 +126,7 @@ class JobOutput extends Component { contentError, scrollToIndex, startIndex, - stopIndex + stopIndex, } = this.state; if (hasContentLoading) { @@ -137,10 +159,10 @@ class JobOutput extends Component { ref={this.listRef} width={width} height={height} - rowHeight={50} + rowHeight={25} rowRenderer={this.renderRow} rowCount={results.length} - overscanRowCount={5} + overscanRowCount={50} scrollToIndex={scrollToIndex} onRowsRendered={this.onRowsRendered} scrollToAlignment="start" @@ -148,6 +170,7 @@ class JobOutput extends Component { ); }} + ); From 40560e962fe21abe972d519a347bd2fd27c92846 Mon Sep 17 00:00:00 2001 From: Jake McDermott Date: Mon, 15 Jul 2019 07:16:55 -0400 Subject: [PATCH 05/14] compute row height on-the-fly --- .../src/screens/Job/JobOutput/JobOutput.jsx | 51 ++++++++++++++----- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx index 179bb2927f..551b8343da 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx @@ -1,5 +1,10 @@ import styled from 'styled-components'; -import { List, AutoSizer } from 'react-virtualized'; +import { + AutoSizer, + CellMeasurer, + CellMeasurerCache, + List, +} from 'react-virtualized'; import React, { Component } from 'react'; import { CardBody } from '@patternfly/react-core'; @@ -46,12 +51,18 @@ class JobOutput extends Component { stopIndex: 0, }; + this.cache = new CellMeasurerCache({ + fixedWidth: true, + defaultHeight: 25, + }); + this.loadJobEvents = this.loadJobEvents.bind(this); this.renderRow = this.renderRow.bind(this); this.handleScrollTop = this.handleScrollTop.bind(this); this.handleScrollBottom = this.handleScrollBottom.bind(this); this.handleScrollNext = this.handleScrollNext.bind(this); this.handleScrollPrevious = this.handleScrollPrevious.bind(this); + this.handleResize = this.handleResize.bind(this); this.onRowsRendered = this.onRowsRendered.bind(this); } @@ -78,19 +89,26 @@ class JobOutput extends Component { } } - renderRow({ index, key, style }) { + renderRow({ index, parent, key, style }) { const { results } = this.state; const { created, event, stdout, start_line } = results[index]; return ( - + cache={this.cache} + parent={parent} + rowIndex={index} + columnIndex={0} + > + + ); } @@ -118,6 +136,14 @@ class JobOutput extends Component { this.setState({ scrollToIndex: results.length - 1 }); } + handleResize({ width }) { + if (width !== this._previousWidth) { + this.cache.clearAll(); + this.listRef.current.recomputeRowHeights(); + } + this._previousWidth = width; + } + render() { const { job } = this.props; const { @@ -149,7 +175,7 @@ class JobOutput extends Component { /> - + {({ width, height }) => { console.log('scroll to index', scrollToIndex); console.log('start index', startIndex); @@ -159,7 +185,8 @@ class JobOutput extends Component { ref={this.listRef} width={width} height={height} - rowHeight={25} + deferredMeasurementCache={this.cache} + rowHeight={this.cache.rowHeight} rowRenderer={this.renderRow} rowCount={results.length} overscanRowCount={50} From 161c7706bc15a346aa205b03e6f0cde4ffc47306 Mon Sep 17 00:00:00 2001 From: Marliana Lara Date: Mon, 22 Jul 2019 13:23:31 -0400 Subject: [PATCH 06/14] Add InfiniteLoader to fetch rows as needed --- .../src/screens/Job/JobOutput/JobOutput.jsx | 117 +++++++++++------- 1 file changed, 73 insertions(+), 44 deletions(-) diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx index 551b8343da..29641a51a0 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx @@ -3,6 +3,7 @@ import { AutoSizer, CellMeasurer, CellMeasurerCache, + InfiniteLoader, List, } from 'react-virtualized'; @@ -47,8 +48,10 @@ class JobOutput extends Component { hasContentLoading: true, results: [], scrollToIndex: -1, - startIndex: 0, - stopIndex: 0, + loadedRowCount: 0, + loadedRowsMap: {}, + loadingRowCount: 0, + remoteRowCount: 0, }; this.cache = new CellMeasurerCache({ @@ -57,13 +60,14 @@ class JobOutput extends Component { }); this.loadJobEvents = this.loadJobEvents.bind(this); - this.renderRow = this.renderRow.bind(this); + this.rowRenderer = this.rowRenderer.bind(this); this.handleScrollTop = this.handleScrollTop.bind(this); this.handleScrollBottom = this.handleScrollBottom.bind(this); this.handleScrollNext = this.handleScrollNext.bind(this); this.handleScrollPrevious = this.handleScrollPrevious.bind(this); this.handleResize = this.handleResize.bind(this); - this.onRowsRendered = this.onRowsRendered.bind(this); + this.isRowLoaded = this.isRowLoaded.bind(this); + this.loadMoreRows = this.loadMoreRows.bind(this); } componentDidMount() { @@ -76,12 +80,12 @@ class JobOutput extends Component { this.setState({ hasContentLoading: true }); try { const { - data: { results = [] }, + data: { results = [], count }, } = await JobsAPI.readEvents(job.id, job.type, { - page_size: 200, + page_size: 50, order_by: 'start_line', }); - this.setState({ results }); + this.setState({ results, remoteRowCount: count + 1 }); } catch (err) { this.setState({ contentError: err }); } finally { @@ -89,8 +93,16 @@ class JobOutput extends Component { } } - renderRow({ index, parent, key, style }) { + isRowLoaded({ index }) { const { results } = this.state; + return !!results[index]; + } + + rowRenderer({ index, parent, key, style }) { + const { results } = this.state; + if (!results[index]) { + return; + } const { created, event, stdout, start_line } = results[index]; return ( { + this.setState({ results: [...results, ...response.data.results] }); + }); } handleScrollPrevious() { - const { startIndex, stopIndex } = this.state; - const index = startIndex - (stopIndex - startIndex); - this.setState({ scrollToIndex: Math.max(0, index) }); + const startIndex = this.listRef.Grid._renderedRowStartIndex; + const stopIndex = this.listRef.Grid._renderedRowStopIndex; + const range = stopIndex - startIndex + 1; + this.listRef.scrollToRow(Math.max(0, startIndex - range)); } handleScrollNext() { - const { stopIndex } = this.state; - this.setState({ scrollToIndex: stopIndex + 1 }); + const stopIndex = this.listRef.Grid._renderedRowStopIndex; + this.listRef.scrollToRow(stopIndex - 1); } handleScrollTop() { - this.setState({ scrollToIndex: 0 }); + this.listRef.scrollToRow(0); } handleScrollBottom() { - const { results } = this.state; - this.setState({ scrollToIndex: results.length - 1 }); + const { remoteRowCount } = this.state; + this.listRef.scrollToRow(remoteRowCount - 1); } handleResize({ width }) { if (width !== this._previousWidth) { this.cache.clearAll(); - this.listRef.current.recomputeRowHeights(); + this.listRef.recomputeRowHeights(); } this._previousWidth = width; } @@ -147,12 +171,10 @@ class JobOutput extends Component { render() { const { job } = this.props; const { - results, hasContentLoading, contentError, scrollToIndex, - startIndex, - stopIndex, + remoteRowCount, } = this.state; if (hasContentLoading) { @@ -175,28 +197,35 @@ class JobOutput extends Component { /> - - {({ width, height }) => { - console.log('scroll to index', scrollToIndex); - console.log('start index', startIndex); - console.log('stop index', stopIndex); - return ( - - ); - }} - + + {({ onRowsRendered, registerChild }) => ( + + {({ width, height }) => { + return ( + { + this.listRef = ref; + registerChild(ref); + }} + deferredMeasurementCache={this.cache} + height={height} + onRowsRendered={onRowsRendered} + rowCount={remoteRowCount} + rowHeight={this.cache.rowHeight} + rowRenderer={this.rowRenderer} + scrollToAlignment="start" + scrollToIndex={scrollToIndex} + width={width} + /> + ); + }} + + )} + From 0a3633113e0728b0424e7327c62fdf7b56fd9b6a Mon Sep 17 00:00:00 2001 From: Jake McDermott Date: Mon, 22 Jul 2019 16:19:50 -0400 Subject: [PATCH 07/14] ensure results are always indexed by counter when loading new rows --- .../src/screens/Job/JobOutput/JobOutput.jsx | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx index 29641a51a0..4d5f425485 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx @@ -46,7 +46,7 @@ class JobOutput extends Component { this.state = { contentError: null, hasContentLoading: true, - results: [], + results: {}, scrollToIndex: -1, loadedRowCount: 0, loadedRowsMap: {}, @@ -80,12 +80,18 @@ class JobOutput extends Component { this.setState({ hasContentLoading: true }); try { const { - data: { results = [], count }, + data: { results: newResults = [], count }, } = await JobsAPI.readEvents(job.id, job.type, { page_size: 50, order_by: 'start_line', }); - this.setState({ results, remoteRowCount: count + 1 }); + + this.setState(({ results }) => { + newResults.forEach(jobEvent => { + results[jobEvent.counter] = jobEvent; + }); + return { results, remoteRowCount: count + 1 }; + }); } catch (err) { this.setState({ contentError: err }); } finally { @@ -126,7 +132,6 @@ class JobOutput extends Component { async loadMoreRows({ startIndex, stopIndex }) { const { job } = this.props; - const { results } = this.state; let params = { counter__gte: startIndex, @@ -135,7 +140,12 @@ class JobOutput extends Component { }; return await JobsAPI.readEvents(job.id, job.type, params).then(response => { - this.setState({ results: [...results, ...response.data.results] }); + this.setState(({ results }) => { + response.data.results.forEach(jobEvent => { + results[jobEvent.counter] = jobEvent; + }); + return { results }; + }); }); } @@ -158,6 +168,7 @@ class JobOutput extends Component { handleScrollBottom() { const { remoteRowCount } = this.state; this.listRef.scrollToRow(remoteRowCount - 1); + this.setState({ scrollToIndex: remoteRowCount - 1 }); } handleResize({ width }) { From 033308de695dc76e00000241a92c9df0840a8df0 Mon Sep 17 00:00:00 2001 From: Jake McDermott Date: Tue, 23 Jul 2019 13:12:12 -0400 Subject: [PATCH 08/14] add missing event placeholders and recompute heights on load --- .../src/screens/Job/JobOutput/JobEvent.jsx | 17 +-- .../Job/JobOutput/JobEventSkeleton.jsx | 85 ++++++++++++++ .../Job/JobOutput/JobEventSkeleton.test.jsx | 22 ++++ .../src/screens/Job/JobOutput/JobOutput.jsx | 109 +++++++++++------- 4 files changed, 187 insertions(+), 46 deletions(-) create mode 100644 awx/ui_next/src/screens/Job/JobOutput/JobEventSkeleton.jsx create mode 100644 awx/ui_next/src/screens/Job/JobOutput/JobEventSkeleton.test.jsx diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx index 63d7b80c1c..ab4be12950 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx @@ -98,11 +98,11 @@ function getTimestamp({ created }) { const dateMinutes = date.getMinutes(); const dateSeconds = date.getSeconds(); - const stampHour = dateHours < 10 ? `0${dateHours}` : dateHours; - const stampMinute = dateMinutes < 10 ? `0${dateMinutes}` : dateMinutes; - const stampSecond = dateSeconds < 10 ? `0${dateSeconds}` : dateSeconds; + const stampHours = dateHours < 10 ? `0${dateHours}` : dateHours; + const stampMinutes = dateMinutes < 10 ? `0${dateMinutes}` : dateMinutes; + const stampSeconds = dateSeconds < 10 ? `0${dateSeconds}` : dateSeconds; - return `${stampHour}:${stampMinute}:${stampSecond}`; + return `${stampHours}:${stampMinutes}:${stampSeconds}`; } function getLineTextHtml({ created, event, start_line, stdout }) { @@ -127,13 +127,16 @@ function getLineTextHtml({ created, event, start_line, stdout }) { }); } -function JobEvent({ created, event, stdout, start_line, ...rest }) { +function JobEvent({ counter, created, event, stdout, start_line, ...rest }) { return !stdout ? null : ( {getLineTextHtml({ created, event, start_line, stdout }).map( ({ lineNumber, html }) => - lineNumber > 0 && ( - + lineNumber !== 0 && ( + {lineNumber} i { + cursor: pointer; + } + + user-select: none; +`; +const JobEventSkeletonLineNumber = styled.div` + color: #161b1f; + background-color: #ebebeb; + flex: 0 0 45px; + text-align: right; + vertical-align: top; + padding-right: 5px; + border-right: 1px solid #b7b7b7; + user-select: none; +`; +const JobEventSkeletonContentWrapper = styled.div` + padding: 0 15px; + white-space: pre-wrap; + word-break: break-all; + word-wrap: break-word; + + .content { + background: var(--pf-global--disabled-color--200); + background: linear-gradient( + to right, + #f5f5f5 10%, + #e8e8e8 18%, + #f5f5f5 33% + ); + border-radius: 5px; + } +`; + +function JobEventSkeletonContent({ contentLength }) { + return ( + + {' '.repeat(contentLength)} + + ); +} + +function JobEventSkeleton({ counter, contentLength, ...rest }) { + return ( + counter > 1 && ( + + + + + + + + ) + ); +} + +export default JobEventSkeleton; diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobEventSkeleton.test.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobEventSkeleton.test.jsx new file mode 100644 index 0000000000..acf17ed168 --- /dev/null +++ b/awx/ui_next/src/screens/Job/JobOutput/JobEventSkeleton.test.jsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { mountWithContexts } from '@testUtils/enzymeHelpers'; + +import JobEventSkeleton from './JobEventSkeleton'; + +const contentSelector = 'JobEventSkeletonContent'; + +describe('', () => { + test('initially renders successfully', () => { + const wrapper = mountWithContexts( + + ); + expect(wrapper.find(contentSelector).length).toEqual(1); + }); + + test('always skips first counter', () => { + const wrapper = mountWithContexts( + + ); + expect(wrapper.find(contentSelector).length).toEqual(0); + }); +}); diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx index 4d5f425485..4a3ff30661 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx @@ -14,6 +14,7 @@ import { JobsAPI } from '@api'; import ContentError from '@components/ContentError'; import ContentLoading from '@components/ContentLoading'; import JobEvent from './JobEvent'; +import JobEventSkeleton from './JobEventSkeleton'; import MenuControls from './shared/MenuControls'; const OutputToolbar = styled.div` @@ -37,9 +38,15 @@ const OutputFooter = styled.div` flex: 1; `; -class JobOutput extends Component { - listRef = React.createRef(); +function range(low, high) { + const numbers = []; + for (let n = low; n <= high; n++) { + numbers.push(n); + } + return numbers; +} +class JobOutput extends Component { constructor(props) { super(props); @@ -47,10 +54,7 @@ class JobOutput extends Component { contentError: null, hasContentLoading: true, results: {}, - scrollToIndex: -1, - loadedRowCount: 0, - loadedRowsMap: {}, - loadingRowCount: 0, + currentlyLoading: [], remoteRowCount: 0, }; @@ -74,10 +78,32 @@ class JobOutput extends Component { this.loadJobEvents(); } + componentDidUpdate(prevProps, prevState) { + // recompute row heights for any job events that have transitioned + // from loading to loaded + const { currentlyLoading } = this.state; + let shouldRecomputeRowHeights = false; + prevState.currentlyLoading + .filter(n => !currentlyLoading.includes(n)) + .forEach(n => { + shouldRecomputeRowHeights = true; + this.cache.clear(n); + }); + if (shouldRecomputeRowHeights) { + this.listRef.recomputeRowHeights(); + } + } + + listRef = React.createRef(); + async loadJobEvents() { const { job } = this.props; - this.setState({ hasContentLoading: true }); + const loadRange = range(1, 50); + this.setState(({ currentlyLoading }) => ({ + hasContentLoading: true, + currentlyLoading: currentlyLoading.concat(loadRange), + })); try { const { data: { results: newResults = [], count }, @@ -85,7 +111,6 @@ class JobOutput extends Component { page_size: 50, order_by: 'start_line', }); - this.setState(({ results }) => { newResults.forEach(jobEvent => { results[jobEvent.counter] = jobEvent; @@ -95,21 +120,23 @@ class JobOutput extends Component { } catch (err) { this.setState({ contentError: err }); } finally { - this.setState({ hasContentLoading: false }); + this.setState(({ currentlyLoading }) => ({ + hasContentLoading: false, + currentlyLoading: currentlyLoading.filter(n => !loadRange.includes(n)), + })); } } isRowLoaded({ index }) { - const { results } = this.state; - return !!results[index]; + const { results, currentlyLoading } = this.state; + if (results[index]) { + return true; + } + return currentlyLoading.includes(index); } rowRenderer({ index, parent, key, style }) { const { results } = this.state; - if (!results[index]) { - return; - } - const { created, event, stdout, start_line } = results[index]; return ( - + {results[index] ? ( + + ) : ( + + )} ); } - async loadMoreRows({ startIndex, stopIndex }) { + loadMoreRows({ startIndex, stopIndex }) { const { job } = this.props; - let params = { + const loadRange = range(startIndex, stopIndex); + this.setState(({ currentlyLoading }) => ({ + currentlyLoading: currentlyLoading.concat(loadRange), + })); + const params = { counter__gte: startIndex, counter__lte: stopIndex, order_by: 'start_line', }; - - return await JobsAPI.readEvents(job.id, job.type, params).then(response => { - this.setState(({ results }) => { + return JobsAPI.readEvents(job.id, job.type, params).then(response => { + this.setState(({ results, currentlyLoading }) => { response.data.results.forEach(jobEvent => { results[jobEvent.counter] = jobEvent; }); - return { results }; + return { + results, + currentlyLoading: currentlyLoading.filter( + n => !loadRange.includes(n) + ), + }; }); }); } @@ -152,8 +189,8 @@ class JobOutput extends Component { handleScrollPrevious() { const startIndex = this.listRef.Grid._renderedRowStartIndex; const stopIndex = this.listRef.Grid._renderedRowStopIndex; - const range = stopIndex - startIndex + 1; - this.listRef.scrollToRow(Math.max(0, startIndex - range)); + const scrollRange = stopIndex - startIndex + 1; + this.listRef.scrollToRow(Math.max(0, startIndex - scrollRange)); } handleScrollNext() { @@ -168,7 +205,6 @@ class JobOutput extends Component { handleScrollBottom() { const { remoteRowCount } = this.state; this.listRef.scrollToRow(remoteRowCount - 1); - this.setState({ scrollToIndex: remoteRowCount - 1 }); } handleResize({ width }) { @@ -181,12 +217,7 @@ class JobOutput extends Component { render() { const { job } = this.props; - const { - hasContentLoading, - contentError, - scrollToIndex, - remoteRowCount, - } = this.state; + const { hasContentLoading, contentError, remoteRowCount } = this.state; if (hasContentLoading) { return ; @@ -229,8 +260,8 @@ class JobOutput extends Component { rowHeight={this.cache.rowHeight} rowRenderer={this.rowRenderer} scrollToAlignment="start" - scrollToIndex={scrollToIndex} width={width} + overscanRowCount={20} /> ); }} From 2aa38e84ddfee2d349062d6d3376abaa1477ed76 Mon Sep 17 00:00:00 2001 From: Marliana Lara Date: Fri, 26 Jul 2019 10:36:28 -0400 Subject: [PATCH 09/14] Add guard clause to loadMoreRows and style tweaks --- .../src/screens/Job/JobOutput/JobEvent.jsx | 6 +++--- .../src/screens/Job/JobOutput/JobOutput.jsx | 15 +++++++++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx index ab4be12950..7947a22786 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx @@ -71,7 +71,7 @@ const JobEventLineNumber = styled.div` text-align: right; vertical-align: top; padding-right: 5px; - border-right: 1px solid #b7b7b7; + border-right: 1px solid #d7d7d7; user-select: none; `; const JobEventLineText = styled.div` @@ -132,10 +132,10 @@ function JobEvent({ counter, created, event, stdout, start_line, ...rest }) { {getLineTextHtml({ created, event, start_line, stdout }).map( ({ lineNumber, html }) => - lineNumber !== 0 && ( + lineNumber >= 0 && ( {lineNumber} diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx index 4a3ff30661..4ca912a02f 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx @@ -17,23 +17,26 @@ import JobEvent from './JobEvent'; import JobEventSkeleton from './JobEventSkeleton'; import MenuControls from './shared/MenuControls'; +const OutputHeader = styled.div` + font-weight: var(--pf-global--FontWeight--bold); +`; const OutputToolbar = styled.div` display: flex; justify-content: flex-end; `; const OutputWrapper = styled.div` - height: calc(100vh - 325px); + height: calc(100vh - 350px); background-color: #fafafa; margin-top: 24px; font-family: monospace; font-size: 15px; - border: 1px solid #b7b7b7; + outline: 1px solid #d7d7d7; display: flex; flex-direction: column; `; const OutputFooter = styled.div` background-color: #ebebeb; - border-right: 1px solid #b7b7b7; + border-right: 1px solid #d7d7d7; width: 75px; flex: 1; `; @@ -160,6 +163,9 @@ class JobOutput extends Component { } loadMoreRows({ startIndex, stopIndex }) { + if (startIndex === 0 && stopIndex === 0) { + return; + } const { job } = this.props; const loadRange = range(startIndex, stopIndex); @@ -171,6 +177,7 @@ class JobOutput extends Component { counter__lte: stopIndex, order_by: 'start_line', }; + return JobsAPI.readEvents(job.id, job.type, params).then(response => { this.setState(({ results, currentlyLoading }) => { response.data.results.forEach(jobEvent => { @@ -229,7 +236,7 @@ class JobOutput extends Component { return ( - {job.name} + {job.name} Date: Fri, 26 Jul 2019 13:02:57 -0400 Subject: [PATCH 10/14] Refactor MenuControls as a functional component * Fix lint errors --- .../src/screens/Job/JobOutput/JobOutput.jsx | 2 +- .../Job/JobOutput/shared/MenuControls.jsx | 59 ++++++++----------- 2 files changed, 26 insertions(+), 35 deletions(-) diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx index 4ca912a02f..7850ec98e8 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx @@ -164,7 +164,7 @@ class JobOutput extends Component { loadMoreRows({ startIndex, stopIndex }) { if (startIndex === 0 && stopIndex === 0) { - return; + return Promise.resolve(null); } const { job } = this.props; diff --git a/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx b/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx index 9391ccadc6..1e7e3ffdcf 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import React from 'react'; import { Button as PFButton } from '@patternfly/react-core'; import { PlusIcon, @@ -22,38 +22,29 @@ const Button = styled(PFButton)` } `; -class MenuControls extends Component { - constructor(props) { - super(props); - } - - render() { - const { - onScrollTop, - onScrollBottom, - onScrollNext, - onScrollPrevious, - } = this.props; - return ( - - - - - - - - ); - } -} +const MenuControls = ({ + onScrollTop, + onScrollBottom, + onScrollNext, + onScrollPrevious, +}) => ( + + + + + + + +); export default MenuControls; From b2922792bc26e9b1bcb4592c8328db5a88cdd0d0 Mon Sep 17 00:00:00 2001 From: Jake McDermott Date: Mon, 5 Aug 2019 13:36:36 -0400 Subject: [PATCH 11/14] add function for testing output lines --- .../src/screens/Job/JobOutput/JobEvent.jsx | 1 + .../screens/Job/JobOutput/JobOutput.test.jsx | 39 +++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx index 7947a22786..83ab56c811 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx @@ -140,6 +140,7 @@ function JobEvent({ counter, created, event, stdout, start_line, ...rest }) { {lineNumber} e.length > 1); + const jobEventLines = wrapper.find('div[type="job_event_line_text"]'); + const actualLines = []; + jobEventLines.forEach(line => { + actualLines.push(line.text()); + }); + expectedLines.forEach((line, index) => { + expect(actualLines[index]).toEqual(line); + }); +} + describe('', () => { const mockDetails = { name: 'Foo', }; - test('initially renders succesfully', () => { - mountWithContexts(); + test('initially renders succesfully', async done => { + const wrapper = mountWithContexts(); + // wait until not loading + await waitForElement(wrapper, 'EmptyStateBody', (e) => e.length === 0); + + // await checkOutput(wrapper, [ + // '', + // 'PLAY [localhost] ***************************************************************08:00:52', + // '', + // 'TASK [Gathering Facts] *********************************************************08:00:52', + // 'ok: [localhost]', + // '', + // 'TASK [Check Slack accounts against ldap] ***************************************08:00:53', + // 'changed: [localhost]', + // '', + // 'TASK [E-mail output] ***********************************************************08:00:58', + // 'skipping: [localhost]', + // '', + // 'PLAY RECAP *********************************************************************08:00:58', + // 'localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 ', + // '', + // ]); + done(); }); }); From 475645f604f42fec0f3479fa7b8052bc6e5a5b25 Mon Sep 17 00:00:00 2001 From: Marliana Lara Date: Thu, 8 Aug 2019 13:36:45 -0400 Subject: [PATCH 12/14] Add JobOutput tests --- awx/ui_next/package-lock.json | 39 +- .../src/screens/Job/JobOutput/JobOutput.jsx | 39 +- .../screens/Job/JobOutput/JobOutput.test.jsx | 200 +- .../JobOutput/{shared => }/MenuControls.jsx | 16 +- .../{shared => }/MenuControls.test.jsx | 0 .../src/screens/Job/JobOutput/data.job.json | 194 + .../Job/JobOutput/data.job_events.json | 8461 +++++++++++++++++ .../src/screens/Job/JobOutput/shared/index.js | 1 - 8 files changed, 8892 insertions(+), 58 deletions(-) rename awx/ui_next/src/screens/Job/JobOutput/{shared => }/MenuControls.jsx (68%) rename awx/ui_next/src/screens/Job/JobOutput/{shared => }/MenuControls.test.jsx (100%) create mode 100644 awx/ui_next/src/screens/Job/JobOutput/data.job.json create mode 100644 awx/ui_next/src/screens/Job/JobOutput/data.job_events.json delete mode 100644 awx/ui_next/src/screens/Job/JobOutput/shared/index.js diff --git a/awx/ui_next/package-lock.json b/awx/ui_next/package-lock.json index 7c82f572c3..0e64b85366 100644 --- a/awx/ui_next/package-lock.json +++ b/awx/ui_next/package-lock.json @@ -2307,6 +2307,14 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, + "ansi-to-html": { + "version": "0.6.11", + "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.11.tgz", + "integrity": "sha512-88XZtrcwrfkyn6fGstHnkaF1kl7hGtNCYh4vSmItgEV+6JnQHryDBf7udF4f2RhTRQmYvJvPcTtqgaqrxzc9oA==", + "requires": { + "entities": "^1.1.1" + } + }, "ansi-wrap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", @@ -4242,6 +4250,16 @@ "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" + }, + "dependencies": { + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "chardet": { @@ -5680,8 +5698,7 @@ "entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" }, "enzyme": { "version": "3.9.0", @@ -7953,11 +7970,18 @@ } }, "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-3.0.0.tgz", + "integrity": "sha1-Ngd+8dFfMzSEqn+neihgbxxlWzc=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + } } }, "has-flag": { @@ -8170,8 +8194,7 @@ "html-entities": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" }, "html-tokenize": { "version": "2.0.0", diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx index 7850ec98e8..088f64b0ff 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx @@ -15,7 +15,7 @@ import ContentError from '@components/ContentError'; import ContentLoading from '@components/ContentLoading'; import JobEvent from './JobEvent'; import JobEventSkeleton from './JobEventSkeleton'; -import MenuControls from './shared/MenuControls'; +import MenuControls from './MenuControls'; const OutputHeader = styled.div` font-weight: var(--pf-global--FontWeight--bold); @@ -52,7 +52,7 @@ function range(low, high) { class JobOutput extends Component { constructor(props) { super(props); - + this.listRef = React.createRef(); this.state = { contentError: null, hasContentLoading: true, @@ -68,13 +68,14 @@ class JobOutput extends Component { this.loadJobEvents = this.loadJobEvents.bind(this); this.rowRenderer = this.rowRenderer.bind(this); - this.handleScrollTop = this.handleScrollTop.bind(this); - this.handleScrollBottom = this.handleScrollBottom.bind(this); + this.handleScrollFirst = this.handleScrollFirst.bind(this); + this.handleScrollLast = this.handleScrollLast.bind(this); this.handleScrollNext = this.handleScrollNext.bind(this); this.handleScrollPrevious = this.handleScrollPrevious.bind(this); this.handleResize = this.handleResize.bind(this); this.isRowLoaded = this.isRowLoaded.bind(this); this.loadMoreRows = this.loadMoreRows.bind(this); + this.scrollToRow = this.scrollToRow.bind(this); } componentDidMount() { @@ -93,12 +94,12 @@ class JobOutput extends Component { this.cache.clear(n); }); if (shouldRecomputeRowHeights) { - this.listRef.recomputeRowHeights(); + if (this.listRef.recomputeRowHeights) { + this.listRef.recomputeRowHeights(); + } } } - listRef = React.createRef(); - async loadJobEvents() { const { job } = this.props; @@ -193,25 +194,29 @@ class JobOutput extends Component { }); } + scrollToRow(rowIndex) { + this.listRef.scrollToRow(rowIndex); + } + handleScrollPrevious() { const startIndex = this.listRef.Grid._renderedRowStartIndex; const stopIndex = this.listRef.Grid._renderedRowStopIndex; const scrollRange = stopIndex - startIndex + 1; - this.listRef.scrollToRow(Math.max(0, startIndex - scrollRange)); + this.scrollToRow(Math.max(0, startIndex - scrollRange)); } handleScrollNext() { const stopIndex = this.listRef.Grid._renderedRowStopIndex; - this.listRef.scrollToRow(stopIndex - 1); + this.scrollToRow(stopIndex - 1); } - handleScrollTop() { - this.listRef.scrollToRow(0); + handleScrollFirst() { + this.scrollToRow(0); } - handleScrollBottom() { + handleScrollLast() { const { remoteRowCount } = this.state; - this.listRef.scrollToRow(remoteRowCount - 1); + this.scrollToRow(remoteRowCount - 1); } handleResize({ width }) { @@ -239,8 +244,8 @@ class JobOutput extends Component { {job.name} @@ -261,13 +266,13 @@ class JobOutput extends Component { registerChild(ref); }} deferredMeasurementCache={this.cache} - height={height} + height={height || 1} onRowsRendered={onRowsRendered} rowCount={remoteRowCount} rowHeight={this.cache.rowHeight} rowRenderer={this.rowRenderer} scrollToAlignment="start" - width={width} + width={width || 1} overscanRowCount={20} /> ); diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.test.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.test.jsx index f21745936e..252416d580 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.test.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.test.jsx @@ -1,48 +1,196 @@ import React from 'react'; - import { mountWithContexts, waitForElement } from '@testUtils/enzymeHelpers'; - import JobOutput from './JobOutput'; +import { JobsAPI } from '@api'; +import mockJobData from './data.job.json'; +import mockJobEventsData from './data.job_events.json'; + +jest.mock('@api'); async function checkOutput(wrapper, expectedLines) { - await waitForElement(wrapper, 'div[type="job_event"]', (e) => e.length > 1); + await waitForElement(wrapper, 'div[type="job_event"]', e => e.length > 1); const jobEventLines = wrapper.find('div[type="job_event_line_text"]'); const actualLines = []; jobEventLines.forEach(line => { actualLines.push(line.text()); }); + expect(actualLines.length).toEqual(expectedLines.length); expectedLines.forEach((line, index) => { expect(actualLines[index]).toEqual(line); }); } -describe('', () => { - const mockDetails = { - name: 'Foo', +async function findScrollButtons(wrapper) { + const menuControls = await waitForElement(wrapper, 'MenuControls'); + const scrollFirstButton = menuControls.find( + 'button[aria-label="scroll first"]' + ); + const scrollLastButton = menuControls.find( + 'button[aria-label="scroll last"]' + ); + const scrollPreviousButton = menuControls.find( + 'button[aria-label="scroll previous"]' + ); + return { + scrollFirstButton, + scrollLastButton, + scrollPreviousButton, }; +} + +describe('', () => { + let wrapper; + const mockJob = mockJobData; + const mockJobEvents = mockJobEventsData; + const scrollMock = jest.fn(); + + beforeEach(() => { + JobsAPI.readEvents.mockResolvedValue({ + data: { + count: 100, + next: null, + previous: null, + results: mockJobEvents.results, + }, + }); + }); + + afterEach(() => { + jest.clearAllMocks(); + wrapper.unmount(); + }); test('initially renders succesfully', async done => { - const wrapper = mountWithContexts(); - // wait until not loading - await waitForElement(wrapper, 'EmptyStateBody', (e) => e.length === 0); + wrapper = mountWithContexts(); + await waitForElement(wrapper, 'JobEvent', el => el.length > 0); + await checkOutput(wrapper, [ + '', + 'PLAY [all] *********************************************************************11:37:25', + '', + 'TASK [debug] *******************************************************************11:37:25', + 'ok: [localhost] => (item=1) => {', + ' "msg": "This is a debug message: 1"', + '}', + 'ok: [localhost] => (item=2) => {', + ' "msg": "This is a debug message: 2"', + '}', + 'ok: [localhost] => (item=3) => {', + ' "msg": "This is a debug message: 3"', + '}', + 'ok: [localhost] => (item=4) => {', + ' "msg": "This is a debug message: 4"', + '}', + 'ok: [localhost] => (item=5) => {', + ' "msg": "This is a debug message: 5"', + '}', + 'ok: [localhost] => (item=6) => {', + ' "msg": "This is a debug message: 6"', + '}', + 'ok: [localhost] => (item=7) => {', + ' "msg": "This is a debug message: 7"', + '}', + 'ok: [localhost] => (item=8) => {', + ' "msg": "This is a debug message: 8"', + '}', + 'ok: [localhost] => (item=9) => {', + ' "msg": "This is a debug message: 9"', + '}', + 'ok: [localhost] => (item=10) => {', + ' "msg": "This is a debug message: 10"', + '}', + 'ok: [localhost] => (item=11) => {', + ' "msg": "This is a debug message: 11"', + '}', + 'ok: [localhost] => (item=12) => {', + ' "msg": "This is a debug message: 12"', + '}', + 'ok: [localhost] => (item=13) => {', + ' "msg": "This is a debug message: 13"', + '}', + 'ok: [localhost] => (item=14) => {', + ' "msg": "This is a debug message: 14"', + '}', + 'ok: [localhost] => (item=15) => {', + ' "msg": "This is a debug message: 15"', + '}', + 'ok: [localhost] => (item=16) => {', + ' "msg": "This is a debug message: 16"', + '}', + ]); - // await checkOutput(wrapper, [ - // '', - // 'PLAY [localhost] ***************************************************************08:00:52', - // '', - // 'TASK [Gathering Facts] *********************************************************08:00:52', - // 'ok: [localhost]', - // '', - // 'TASK [Check Slack accounts against ldap] ***************************************08:00:53', - // 'changed: [localhost]', - // '', - // 'TASK [E-mail output] ***********************************************************08:00:58', - // 'skipping: [localhost]', - // '', - // 'PLAY RECAP *********************************************************************08:00:58', - // 'localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 ', - // '', - // ]); + expect(wrapper.find('JobOutput').length).toBe(1); + done(); + }); + + test('should call scrollToRow with expected index when scroll "previous" button is clicked', async done => { + const handleScrollPrevious = jest.spyOn( + JobOutput.prototype, + 'handleScrollPrevious' + ); + wrapper = mountWithContexts(); + await waitForElement(wrapper, 'JobEvent', el => el.length > 0); + const { scrollLastButton, scrollPreviousButton } = await findScrollButtons( + wrapper + ); + wrapper.find('JobOutput').instance().scrollToRow = scrollMock; + + scrollLastButton.simulate('click'); + scrollPreviousButton.simulate('click'); + + expect(handleScrollPrevious).toHaveBeenCalled(); + expect(scrollMock).toHaveBeenCalledTimes(2); + expect(scrollMock.mock.calls).toEqual([[100], [0]]); + done(); + }); + + test('should call scrollToRow with expected indices on when scroll "first" and "last" buttons are clicked', async done => { + const handleScrollFirst = jest.spyOn( + JobOutput.prototype, + 'handleScrollFirst' + ); + wrapper = mountWithContexts(); + await waitForElement(wrapper, 'JobEvent', el => el.length > 0); + const { scrollFirstButton, scrollLastButton } = await findScrollButtons( + wrapper + ); + wrapper.find('JobOutput').instance().scrollToRow = scrollMock; + + scrollFirstButton.simulate('click'); + scrollLastButton.simulate('click'); + scrollFirstButton.simulate('click'); + + expect(handleScrollFirst).toHaveBeenCalled(); + expect(scrollMock).toHaveBeenCalledTimes(3); + expect(scrollMock.mock.calls).toEqual([[0], [100], [0]]); + done(); + }); + + test('should call scrollToRow with expected index on when scroll "last" button is clicked', async done => { + const handleScrollLast = jest.spyOn( + JobOutput.prototype, + 'handleScrollLast' + ); + wrapper = mountWithContexts(); + await waitForElement(wrapper, 'EmptyStateBody', e => e.length === 0); + wrapper + .find('JobOutput') + .instance() + .handleResize({ width: 100 }); + const { scrollLastButton } = await findScrollButtons(wrapper); + wrapper.find('JobOutput').instance().scrollToRow = scrollMock; + + scrollLastButton.simulate('click'); + + expect(handleScrollLast).toHaveBeenCalled(); + expect(scrollMock).toHaveBeenCalledTimes(1); + expect(scrollMock.mock.calls).toEqual([[100]]); + done(); + }); + + test('should throw error', async done => { + JobsAPI.readEvents = () => Promise.reject(new Error()); + wrapper = mountWithContexts(); + await waitForElement(wrapper, 'ContentError', e => e.length === 1); done(); }); }); diff --git a/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx b/awx/ui_next/src/screens/Job/JobOutput/MenuControls.jsx similarity index 68% rename from awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx rename to awx/ui_next/src/screens/Job/JobOutput/MenuControls.jsx index 1e7e3ffdcf..fbfb5def55 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/MenuControls.jsx @@ -23,8 +23,8 @@ const Button = styled(PFButton)` `; const MenuControls = ({ - onScrollTop, - onScrollBottom, + onScrollFirst, + onScrollLast, onScrollNext, onScrollPrevious, }) => ( @@ -32,16 +32,20 @@ const MenuControls = ({ - - - - diff --git a/awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.test.jsx b/awx/ui_next/src/screens/Job/JobOutput/MenuControls.test.jsx similarity index 100% rename from awx/ui_next/src/screens/Job/JobOutput/shared/MenuControls.test.jsx rename to awx/ui_next/src/screens/Job/JobOutput/MenuControls.test.jsx diff --git a/awx/ui_next/src/screens/Job/JobOutput/data.job.json b/awx/ui_next/src/screens/Job/JobOutput/data.job.json new file mode 100644 index 0000000000..2d7f322131 --- /dev/null +++ b/awx/ui_next/src/screens/Job/JobOutput/data.job.json @@ -0,0 +1,194 @@ +{ + "id": 2, + "type": "job", + "url": "/api/v2/jobs/2/", + "related": { + "created_by": "/api/v2/users/1/", + "labels": "/api/v2/jobs/2/labels/", + "inventory": "/api/v2/inventories/1/", + "project": "/api/v2/projects/6/", + "extra_credentials": "/api/v2/jobs/2/extra_credentials/", + "credentials": "/api/v2/jobs/2/credentials/", + "unified_job_template": "/api/v2/job_templates/7/", + "stdout": "/api/v2/jobs/2/stdout/", + "job_events": "/api/v2/jobs/2/job_events/", + "job_host_summaries": "/api/v2/jobs/2/job_host_summaries/", + "activity_stream": "/api/v2/jobs/2/activity_stream/", + "notifications": "/api/v2/jobs/2/notifications/", + "create_schedule": "/api/v2/jobs/2/create_schedule/", + "job_template": "/api/v2/job_templates/7/", + "cancel": "/api/v2/jobs/2/cancel/", + "project_update": "/api/v2/project_updates/4/", + "relaunch": "/api/v2/jobs/2/relaunch/" + }, + "summary_fields": { + "inventory": { + "id": 1, + "name": "Demo Inventory", + "description": "", + "has_active_failures": false, + "total_hosts": 1, + "hosts_with_active_failures": 0, + "total_groups": 0, + "groups_with_active_failures": 0, + "has_inventory_sources": false, + "total_inventory_sources": 0, + "inventory_sources_with_failures": 0, + "organization_id": 1, + "kind": "" + }, + "project": { + "id": 6, + "name": "Demo Project", + "description": "", + "status": "successful", + "scm_type": "git" + }, + "project_update": { + "id": 4, + "name": "Demo Project", + "description": "", + "status": "successful", + "failed": false + }, + "job_template": { + "id": 7, + "name": "Demo Job Template", + "description": "" + }, + "unified_job_template": { + "id": 7, + "name": "Demo Job Template", + "description": "", + "unified_job_type": "job" + }, + "instance_group": { + "id": 1, + "name": "tower" + }, + "created_by": { + "id": 1, + "username": "admin", + "first_name": "", + "last_name": "" + }, + "user_capabilities": { + "delete": true, + "start": true + }, + "labels": { + "count": 0, + "results": [] + }, + "extra_credentials": [], + "credentials": [ + { + "id": 1, + "name": "Demo Credential", + "description": "", + "kind": "ssh", + "cloud": false + } + ] + }, + "created": "2019-08-08T19:24:05.344276Z", + "modified": "2019-08-08T19:24:18.162949Z", + "name": "Demo Job Template", + "description": "", + "job_type": "run", + "inventory": 1, + "project": 6, + "playbook": "chatty_tasks.yml", + "forks": 0, + "limit": "", + "verbosity": 0, + "extra_vars": "{\"num_messages\": 94}", + "job_tags": "", + "force_handlers": false, + "skip_tags": "", + "start_at_task": "", + "timeout": 0, + "use_fact_cache": false, + "unified_job_template": 7, + "launch_type": "manual", + "status": "successful", + "failed": false, + "started": "2019-08-08T19:24:18.329589Z", + "finished": "2019-08-08T19:24:50.119995Z", + "elapsed": 31.79, + "job_args": "[\"bwrap\", \"--unshare-pid\", \"--dev-bind\", \"/\", \"/\", \"--proc\", \"/proc\", \"--bind\", \"/tmp/ansible_runner_pi_pzufy15c/ansible_runner_pi_r_aeukpy/tmpvsg8ly2y\", \"/etc/ssh\", \"--bind\", \"/tmp/ansible_runner_pi_pzufy15c/ansible_runner_pi_r_aeukpy/tmpq_grmdym\", \"/projects\", \"--bind\", \"/tmp/ansible_runner_pi_pzufy15c/ansible_runner_pi_r_aeukpy/tmpfq8ea2z6\", \"/tmp\", \"--bind\", \"/tmp/ansible_runner_pi_pzufy15c/ansible_runner_pi_r_aeukpy/tmpq6v4y_tt\", \"/var/lib/awx\", \"--bind\", \"/tmp/ansible_runner_pi_pzufy15c/ansible_runner_pi_r_aeukpy/tmpupj_jhhb\", \"/var/log\", \"--ro-bind\", \"/venv/ansible\", \"/venv/ansible\", \"--ro-bind\", \"/venv/awx\", \"/venv/awx\", \"--bind\", \"/projects/_6__demo_project\", \"/projects/_6__demo_project\", \"--bind\", \"/tmp/awx_2_a4b1afiw\", \"/tmp/awx_2_a4b1afiw\", \"--chdir\", \"/projects/_6__demo_project\", \"ansible-playbook\", \"-u\", \"admin\", \"-i\", \"/tmp/awx_2_a4b1afiw/tmppb57i4_e\", \"-e\", \"@/tmp/awx_2_a4b1afiw/env/extravars\", \"chatty_tasks.yml\"]", + "job_cwd": "/projects/_6__demo_project", + "job_env": { + "HOSTNAME": "awx", + "MAKEFLAGS": "w", + "RABBITMQ_USER": "guest", + "OS": "Operating System: Docker for Mac", + "LC_ALL": "en_US.UTF-8", + "RABBITMQ_VHOST": "/", + "SDB_HOST": "0.0.0.0", + "MAKELEVEL": "2", + "VIRTUAL_ENV": "/venv/ansible", + "MFLAGS": "-w", + "PATH": "/venv/ansible/bin:/venv/awx/bin:/venv/awx/bin:/usr/local/n/versions/node/10.15.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "RABBITMQ_PASS": "**********", + "SUPERVISOR_GROUP_NAME": "tower-processes", + "PWD": "/awx_devel", + "LANG": "\"en-us\"", + "PS1": "(awx) ", + "SUPERVISOR_ENABLED": "1", + "SHLVL": "2", + "HOME": "/var/lib/awx", + "LANGUAGE": "en_US:en", + "AWX_GROUP_QUEUES": "tower", + "SUPERVISOR_SERVER_URL": "unix:///tmp/supervisor.sock", + "SUPERVISOR_PROCESS_NAME": "awx-dispatcher", + "RABBITMQ_HOST": "rabbitmq", + "CURRENT_UID": "501", + "_": "/venv/awx/bin/python3", + "DJANGO_SETTINGS_MODULE": "awx.settings.development", + "DJANGO_LIVE_TEST_SERVER_ADDRESS": "localhost:9013-9199", + "SDB_NOTIFY_HOST": "docker.for.mac.host.internal", + "TZ": "UTC", + "ANSIBLE_FORCE_COLOR": "True", + "ANSIBLE_HOST_KEY_CHECKING": "False", + "ANSIBLE_INVENTORY_UNPARSED_FAILED": "True", + "ANSIBLE_PARAMIKO_RECORD_HOST_KEYS": "False", + "ANSIBLE_VENV_PATH": "/venv/ansible", + "PROOT_TMP_DIR": "/tmp", + "AWX_PRIVATE_DATA_DIR": "/tmp/awx_2_a4b1afiw", + "ANSIBLE_COLLECTIONS_PATHS": "/tmp/collections", + "PYTHONPATH": "/venv/ansible/lib/python2.7/site-packages:/awx_devel/awx/lib:", + "JOB_ID": "2", + "INVENTORY_ID": "1", + "PROJECT_REVISION": "23f070aad8e2da131d97ea98b42b553ccf0b0b82", + "ANSIBLE_RETRY_FILES_ENABLED": "False", + "MAX_EVENT_RES": "700000", + "ANSIBLE_CALLBACK_PLUGINS": "/awx_devel/awx/plugins/callback", + "AWX_HOST": "https://towerhost", + "ANSIBLE_SSH_CONTROL_PATH_DIR": "/tmp/awx_2_a4b1afiw/cp", + "ANSIBLE_STDOUT_CALLBACK": "awx_display", + "AWX_ISOLATED_DATA_DIR": "/tmp/awx_2_a4b1afiw/artifacts/2" + }, + "job_explanation": "", + "execution_node": "awx", + "controller_node": "", + "result_traceback": "", + "event_processing_finished": true, + "job_template": 7, + "passwords_needed_to_start": [], + "allow_simultaneous": false, + "artifacts": {}, + "scm_revision": "23f070aad8e2da131d97ea98b42b553ccf0b0b82", + "instance_group": 1, + "diff_mode": false, + "job_slice_number": 0, + "job_slice_count": 1, + "host_status_counts": { + "ok": 1 + }, + "playbook_counts": { + "play_count": 1, + "task_count": 1 + }, + "custom_virtualenv": "/venv/ansible" +} \ No newline at end of file diff --git a/awx/ui_next/src/screens/Job/JobOutput/data.job_events.json b/awx/ui_next/src/screens/Job/JobOutput/data.job_events.json new file mode 100644 index 0000000000..9ead005938 --- /dev/null +++ b/awx/ui_next/src/screens/Job/JobOutput/data.job_events.json @@ -0,0 +1,8461 @@ +{ + "count": 100, + "next": null, + "previous": null, + "results": [ + { + "id": 1951, + "type": "job_event", + "url": "/api/v2/job_events/1951/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1951/children/" + }, + "summary_fields": { + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:24.987840Z", + "modified": "2019-08-08T15:37:25.048723Z", + "job": 59, + "event": "playbook_on_start", + "counter": 1, + "event_display": "Playbook Started", + "event_data": { + "pid": 3, + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml" + }, + "event_level": 0, + "failed": false, + "changed": false, + "uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "parent_uuid": "", + "host": null, + "host_name": "", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "", + "task": "", + "role": "", + "stdout": "", + "start_line": 0, + "end_line": 0, + "verbosity": 0 + }, + { + "id": 1952, + "type": "job_event", + "url": "/api/v2/job_events/1952/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1952/children/" + }, + "summary_fields": { + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.061004Z", + "modified": "2019-08-08T15:37:25.085012Z", + "job": 59, + "event": "playbook_on_task_start", + "counter": 3, + "event_display": "Task Started (debug)", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "is_conditional": false, + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8", + "name": "debug" + }, + "event_level": 2, + "failed": false, + "changed": false, + "uuid": "0242ac13-0005-25a7-452d-000000000008", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000006", + "host": null, + "host_name": "", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\r\nTASK [debug] *******************************************************************", + "start_line": 2, + "end_line": 4, + "verbosity": 0 + }, + { + "id": 1953, + "type": "job_event", + "url": "/api/v2/job_events/1953/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1953/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.061686Z", + "modified": "2019-08-08T15:37:25.095775Z", + "job": 59, + "event": "runner_on_start", + "counter": 4, + "event_display": "runner_on_start", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 0, + "failed": false, + "changed": false, + "uuid": "dc9793ec-0715-4d4a-b426-db88a27031f9", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "", + "start_line": 4, + "end_line": 4, + "verbosity": 0 + }, + { + "id": 1954, + "type": "job_event", + "url": "/api/v2/job_events/1954/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1954/children/" + }, + "summary_fields": { + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.051822Z", + "modified": "2019-08-08T15:37:25.098589Z", + "job": 59, + "event": "playbook_on_play_start", + "counter": 2, + "event_display": "Play Started (all)", + "event_data": { + "play_pattern": "all", + "play": "all", + "name": "all", + "pattern": "all", + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml" + }, + "event_level": 1, + "failed": false, + "changed": false, + "uuid": "0242ac13-0005-25a7-452d-000000000006", + "parent_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "host": null, + "host_name": "", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "", + "role": "", + "stdout": "\r\nPLAY [all] *********************************************************************", + "start_line": 0, + "end_line": 2, + "verbosity": 0 + }, + { + "id": 1955, + "type": "job_event", + "url": "/api/v2/job_events/1955/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1955/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.122464Z", + "modified": "2019-08-08T15:37:25.164373Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 7, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "3", + "changed": false, + "msg": "This is a debug message: 3", + "_ansible_verbose_always": true, + "_ansible_item_label": "3" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "7757e0a3-a5f7-43cc-8525-ebaff5110277", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=3) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 3\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 10, + "end_line": 13, + "verbosity": 0 + }, + { + "id": 1956, + "type": "job_event", + "url": "/api/v2/job_events/1956/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1956/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.114591Z", + "modified": "2019-08-08T15:37:25.168145Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 5, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "1", + "changed": false, + "msg": "This is a debug message: 1", + "_ansible_verbose_always": true, + "_ansible_item_label": "1" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "287e1747-d115-4c8f-9efd-6749f6b7bcf6", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=1) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 1\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 4, + "end_line": 7, + "verbosity": 0 + }, + { + "id": 1957, + "type": "job_event", + "url": "/api/v2/job_events/1957/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1957/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.154933Z", + "modified": "2019-08-08T15:37:25.188832Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 12, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "8", + "changed": false, + "msg": "This is a debug message: 8", + "_ansible_verbose_always": true, + "_ansible_item_label": "8" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "25ba7f33-0c0d-4bf0-a6f3-17b216be9dc8", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=8) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 8\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 25, + "end_line": 28, + "verbosity": 0 + }, + { + "id": 1958, + "type": "job_event", + "url": "/api/v2/job_events/1958/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1958/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.116393Z", + "modified": "2019-08-08T15:37:25.193501Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 6, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "2", + "changed": false, + "msg": "This is a debug message: 2", + "_ansible_verbose_always": true, + "_ansible_item_label": "2" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "cf5d9970-1f23-4647-a18f-cf8848e4bcc9", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=2) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 2\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 7, + "end_line": 10, + "verbosity": 0 + }, + { + "id": 1959, + "type": "job_event", + "url": "/api/v2/job_events/1959/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1959/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.130725Z", + "modified": "2019-08-08T15:37:25.211164Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 8, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "4", + "changed": false, + "msg": "This is a debug message: 4", + "_ansible_verbose_always": true, + "_ansible_item_label": "4" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "24093058-42f0-4ce2-b106-f079faf6c70a", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=4) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 4\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 13, + "end_line": 16, + "verbosity": 0 + }, + { + "id": 1960, + "type": "job_event", + "url": "/api/v2/job_events/1960/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1960/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.212417Z", + "modified": "2019-08-08T15:37:25.244597Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 17, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "13", + "changed": false, + "msg": "This is a debug message: 13", + "_ansible_verbose_always": true, + "_ansible_item_label": "13" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "e070e2b8-5584-4ca3-8f08-0de79af05a64", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=13) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 13\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 40, + "end_line": 43, + "verbosity": 0 + }, + { + "id": 1961, + "type": "job_event", + "url": "/api/v2/job_events/1961/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1961/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.135172Z", + "modified": "2019-08-08T15:37:25.265542Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 9, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "5", + "changed": false, + "msg": "This is a debug message: 5", + "_ansible_verbose_always": true, + "_ansible_item_label": "5" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "885a54b6-066e-4864-a28e-23ed5e4ea04e", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=5) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 5\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 16, + "end_line": 19, + "verbosity": 0 + }, + { + "id": 1962, + "type": "job_event", + "url": "/api/v2/job_events/1962/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1962/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.231698Z", + "modified": "2019-08-08T15:37:25.296171Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 19, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "15", + "changed": false, + "msg": "This is a debug message: 15", + "_ansible_verbose_always": true, + "_ansible_item_label": "15" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "d3ddf636-02d5-4a08-a78b-62eb333c7783", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=15) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 15\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 46, + "end_line": 49, + "verbosity": 0 + }, + { + "id": 1963, + "type": "job_event", + "url": "/api/v2/job_events/1963/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1963/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.136453Z", + "modified": "2019-08-08T15:37:25.306913Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 10, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "6", + "changed": false, + "msg": "This is a debug message: 6", + "_ansible_verbose_always": true, + "_ansible_item_label": "6" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "52597da6-2d20-4d47-a4c7-299cca248c21", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=6) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 6\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 19, + "end_line": 22, + "verbosity": 0 + }, + { + "id": 1964, + "type": "job_event", + "url": "/api/v2/job_events/1964/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1964/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.155770Z", + "modified": "2019-08-08T15:37:25.319527Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 13, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "9", + "changed": false, + "msg": "This is a debug message: 9", + "_ansible_verbose_always": true, + "_ansible_item_label": "9" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "1173cfdf-6287-4c9d-bff8-1acced310816", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=9) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 9\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 28, + "end_line": 31, + "verbosity": 0 + }, + { + "id": 1965, + "type": "job_event", + "url": "/api/v2/job_events/1965/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1965/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.264301Z", + "modified": "2019-08-08T15:37:25.351689Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 23, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "19", + "changed": false, + "msg": "This is a debug message: 19", + "_ansible_verbose_always": true, + "_ansible_item_label": "19" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "72d786db-19bd-40eb-8d3a-27fea279504c", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=19) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 19\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 58, + "end_line": 61, + "verbosity": 0 + }, + { + "id": 1966, + "type": "job_event", + "url": "/api/v2/job_events/1966/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1966/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.143418Z", + "modified": "2019-08-08T15:37:25.371300Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 11, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "7", + "changed": false, + "msg": "This is a debug message: 7", + "_ansible_verbose_always": true, + "_ansible_item_label": "7" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "b59d1599-4271-4f33-8a81-56179e393e49", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=7) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 7\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 22, + "end_line": 25, + "verbosity": 0 + }, + { + "id": 1967, + "type": "job_event", + "url": "/api/v2/job_events/1967/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1967/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.162116Z", + "modified": "2019-08-08T15:37:25.372288Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 14, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "10", + "changed": false, + "msg": "This is a debug message: 10", + "_ansible_verbose_always": true, + "_ansible_item_label": "10" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "27a0daba-455f-4735-8d59-d98ab739d36a", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=10) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 10\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 31, + "end_line": 34, + "verbosity": 0 + }, + { + "id": 1968, + "type": "job_event", + "url": "/api/v2/job_events/1968/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1968/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.252802Z", + "modified": "2019-08-08T15:37:25.394896Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 21, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "17", + "changed": false, + "msg": "This is a debug message: 17", + "_ansible_verbose_always": true, + "_ansible_item_label": "17" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "ae431284-1bf3-415e-90f7-e2ae33a95c4b", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=17) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 17\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 52, + "end_line": 55, + "verbosity": 0 + }, + { + "id": 1969, + "type": "job_event", + "url": "/api/v2/job_events/1969/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1969/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.205213Z", + "modified": "2019-08-08T15:37:25.427928Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 16, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "12", + "changed": false, + "msg": "This is a debug message: 12", + "_ansible_verbose_always": true, + "_ansible_item_label": "12" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "69a7d576-bc8d-4edf-a596-0eecf436ff9a", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=12) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 12\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 37, + "end_line": 40, + "verbosity": 0 + }, + { + "id": 1970, + "type": "job_event", + "url": "/api/v2/job_events/1970/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1970/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.299469Z", + "modified": "2019-08-08T15:37:25.463075Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 27, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "23", + "changed": false, + "msg": "This is a debug message: 23", + "_ansible_verbose_always": true, + "_ansible_item_label": "23" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "a5b42459-e942-4d34-8877-2319af9ef4cf", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=23) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 23\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 70, + "end_line": 73, + "verbosity": 0 + }, + { + "id": 1971, + "type": "job_event", + "url": "/api/v2/job_events/1971/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1971/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.244702Z", + "modified": "2019-08-08T15:37:25.526403Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 20, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "16", + "changed": false, + "msg": "This is a debug message: 16", + "_ansible_verbose_always": true, + "_ansible_item_label": "16" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "67e4695c-13da-4184-a0df-d3af8354d9aa", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=16) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 16\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 49, + "end_line": 52, + "verbosity": 0 + }, + { + "id": 1972, + "type": "job_event", + "url": "/api/v2/job_events/1972/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1972/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.322576Z", + "modified": "2019-08-08T15:37:25.549772Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 29, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "25", + "changed": false, + "msg": "This is a debug message: 25", + "_ansible_verbose_always": true, + "_ansible_item_label": "25" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "f9891818-0ee2-4888-a2f9-ae153f7d1357", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=25) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 25\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 76, + "end_line": 79, + "verbosity": 0 + }, + { + "id": 1973, + "type": "job_event", + "url": "/api/v2/job_events/1973/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1973/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.181926Z", + "modified": "2019-08-08T15:37:25.574921Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 15, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "11", + "changed": false, + "msg": "This is a debug message: 11", + "_ansible_verbose_always": true, + "_ansible_item_label": "11" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "878bd798-987b-4a97-afae-0846275358b5", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=11) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 11\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 34, + "end_line": 37, + "verbosity": 0 + }, + { + "id": 1974, + "type": "job_event", + "url": "/api/v2/job_events/1974/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1974/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.393855Z", + "modified": "2019-08-08T15:37:25.619902Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 36, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "32", + "changed": false, + "msg": "This is a debug message: 32", + "_ansible_verbose_always": true, + "_ansible_item_label": "32" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "cec5c08c-7e2a-4e15-bd67-3e56ac5e73ef", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=32) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 32\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 97, + "end_line": 100, + "verbosity": 0 + }, + { + "id": 1975, + "type": "job_event", + "url": "/api/v2/job_events/1975/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1975/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.303513Z", + "modified": "2019-08-08T15:37:25.723744Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 28, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "24", + "changed": false, + "msg": "This is a debug message: 24", + "_ansible_verbose_always": true, + "_ansible_item_label": "24" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "8b2db45b-631b-4e7b-82d1-4a439181ba9c", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=24) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 24\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 73, + "end_line": 76, + "verbosity": 0 + }, + { + "id": 1976, + "type": "job_event", + "url": "/api/v2/job_events/1976/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1976/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.283824Z", + "modified": "2019-08-08T15:37:25.730438Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 25, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "21", + "changed": false, + "msg": "This is a debug message: 21", + "_ansible_verbose_always": true, + "_ansible_item_label": "21" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "ab8d39a6-7239-4965-ac4c-7f7074d0a0ea", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=21) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 21\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 64, + "end_line": 67, + "verbosity": 0 + }, + { + "id": 1977, + "type": "job_event", + "url": "/api/v2/job_events/1977/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1977/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.631074Z", + "modified": "2019-08-08T15:37:25.752209Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 46, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "42", + "changed": false, + "msg": "This is a debug message: 42", + "_ansible_verbose_always": true, + "_ansible_item_label": "42" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "5dd80c9a-1d5d-49ed-ad19-4914d986d1cf", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=42) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 42\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 127, + "end_line": 130, + "verbosity": 0 + }, + { + "id": 1978, + "type": "job_event", + "url": "/api/v2/job_events/1978/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1978/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.225183Z", + "modified": "2019-08-08T15:37:25.806700Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 18, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "14", + "changed": false, + "msg": "This is a debug message: 14", + "_ansible_verbose_always": true, + "_ansible_item_label": "14" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "84e803f0-d112-4d84-9132-b32b02932975", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=14) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 14\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 43, + "end_line": 46, + "verbosity": 0 + }, + { + "id": 1979, + "type": "job_event", + "url": "/api/v2/job_events/1979/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1979/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.288561Z", + "modified": "2019-08-08T15:37:25.847544Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 26, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "22", + "changed": false, + "msg": "This is a debug message: 22", + "_ansible_verbose_always": true, + "_ansible_item_label": "22" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "066f445c-8a27-4320-8777-4bc2ac25b2da", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=22) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 22\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 67, + "end_line": 70, + "verbosity": 0 + }, + { + "id": 1980, + "type": "job_event", + "url": "/api/v2/job_events/1980/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1980/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.345087Z", + "modified": "2019-08-08T15:37:25.850009Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 31, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "27", + "changed": false, + "msg": "This is a debug message: 27", + "_ansible_verbose_always": true, + "_ansible_item_label": "27" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "99136b75-aee0-4b64-acde-d150c0cab0e8", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=27) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 27\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 82, + "end_line": 85, + "verbosity": 0 + }, + { + "id": 1981, + "type": "job_event", + "url": "/api/v2/job_events/1981/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1981/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.684194Z", + "modified": "2019-08-08T15:37:25.897566Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 52, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "48", + "changed": false, + "msg": "This is a debug message: 48", + "_ansible_verbose_always": true, + "_ansible_item_label": "48" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "d3c0de28-ff94-404d-a105-3bb0990f6d2b", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=48) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 48\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 145, + "end_line": 148, + "verbosity": 0 + }, + { + "id": 1982, + "type": "job_event", + "url": "/api/v2/job_events/1982/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1982/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.259912Z", + "modified": "2019-08-08T15:37:25.947998Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 22, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "18", + "changed": false, + "msg": "This is a debug message: 18", + "_ansible_verbose_always": true, + "_ansible_item_label": "18" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "b1231979-cbd3-421e-94cd-96c48a10f2f9", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=18) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 18\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 55, + "end_line": 58, + "verbosity": 0 + }, + { + "id": 1983, + "type": "job_event", + "url": "/api/v2/job_events/1983/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1983/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.357450Z", + "modified": "2019-08-08T15:37:25.967124Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 32, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "28", + "changed": false, + "msg": "This is a debug message: 28", + "_ansible_verbose_always": true, + "_ansible_item_label": "28" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "abe4e598-3d45-4955-a4bc-508caa1521a6", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=28) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 28\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 85, + "end_line": 88, + "verbosity": 0 + }, + { + "id": 1984, + "type": "job_event", + "url": "/api/v2/job_events/1984/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1984/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.688599Z", + "modified": "2019-08-08T15:37:25.985948Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 53, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "49", + "changed": false, + "msg": "This is a debug message: 49", + "_ansible_verbose_always": true, + "_ansible_item_label": "49" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "0204bc95-47cf-45b4-8451-a3224aac0e93", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=49) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 49\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 148, + "end_line": 151, + "verbosity": 0 + }, + { + "id": 1985, + "type": "job_event", + "url": "/api/v2/job_events/1985/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1985/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.366248Z", + "modified": "2019-08-08T15:37:25.990361Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 33, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "29", + "changed": false, + "msg": "This is a debug message: 29", + "_ansible_verbose_always": true, + "_ansible_item_label": "29" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "e8b372ce-7719-44df-851b-a850304eb4fc", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=29) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 29\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 88, + "end_line": 91, + "verbosity": 0 + }, + { + "id": 1986, + "type": "job_event", + "url": "/api/v2/job_events/1986/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1986/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.371939Z", + "modified": "2019-08-08T15:37:26.050993Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 34, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "30", + "changed": false, + "msg": "This is a debug message: 30", + "_ansible_verbose_always": true, + "_ansible_item_label": "30" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "795e209a-5d0f-46bf-97b6-3e615c54a7f6", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=30) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 30\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 91, + "end_line": 94, + "verbosity": 0 + }, + { + "id": 1987, + "type": "job_event", + "url": "/api/v2/job_events/1987/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1987/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.270342Z", + "modified": "2019-08-08T15:37:26.098691Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 24, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "20", + "changed": false, + "msg": "This is a debug message: 20", + "_ansible_verbose_always": true, + "_ansible_item_label": "20" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "23232d27-b7dd-4fcb-9c14-19a0b327ff71", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=20) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 20\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 61, + "end_line": 64, + "verbosity": 0 + }, + { + "id": 1988, + "type": "job_event", + "url": "/api/v2/job_events/1988/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1988/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.378638Z", + "modified": "2019-08-08T15:37:26.164846Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 35, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "31", + "changed": false, + "msg": "This is a debug message: 31", + "_ansible_verbose_always": true, + "_ansible_item_label": "31" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "2676ddb6-07fc-4974-8cdd-49cd1c871a3c", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=31) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 31\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 94, + "end_line": 97, + "verbosity": 0 + }, + { + "id": 1989, + "type": "job_event", + "url": "/api/v2/job_events/1989/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1989/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.816660Z", + "modified": "2019-08-08T15:37:26.172160Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 56, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "52", + "changed": false, + "msg": "This is a debug message: 52", + "_ansible_verbose_always": true, + "_ansible_item_label": "52" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "80c90d5c-a7d9-48d0-8ae9-29b0ff01e8a3", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=52) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 52\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 157, + "end_line": 160, + "verbosity": 0 + }, + { + "id": 1990, + "type": "job_event", + "url": "/api/v2/job_events/1990/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1990/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.516207Z", + "modified": "2019-08-08T15:37:26.190950Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 42, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "38", + "changed": false, + "msg": "This is a debug message: 38", + "_ansible_verbose_always": true, + "_ansible_item_label": "38" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "16de33f2-e1e6-465a-abb1-2d6141576ce6", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=38) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 38\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 115, + "end_line": 118, + "verbosity": 0 + }, + { + "id": 1991, + "type": "job_event", + "url": "/api/v2/job_events/1991/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1991/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.334043Z", + "modified": "2019-08-08T15:37:26.224306Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 30, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "26", + "changed": false, + "msg": "This is a debug message: 26", + "_ansible_verbose_always": true, + "_ansible_item_label": "26" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "ad5ce684-620f-4cc6-af17-7a7d05becb0d", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=26) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 26\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 79, + "end_line": 82, + "verbosity": 0 + }, + { + "id": 1992, + "type": "job_event", + "url": "/api/v2/job_events/1992/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1992/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.432490Z", + "modified": "2019-08-08T15:37:26.304362Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 39, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "35", + "changed": false, + "msg": "This is a debug message: 35", + "_ansible_verbose_always": true, + "_ansible_item_label": "35" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "e12cebfb-9cda-49a5-8a68-6b3056bbe1f1", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=35) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 35\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 106, + "end_line": 109, + "verbosity": 0 + }, + { + "id": 1993, + "type": "job_event", + "url": "/api/v2/job_events/1993/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1993/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.401634Z", + "modified": "2019-08-08T15:37:26.313193Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 37, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "33", + "changed": false, + "msg": "This is a debug message: 33", + "_ansible_verbose_always": true, + "_ansible_item_label": "33" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "14a428f7-7ace-4313-bb4c-7a23bbf4a4a4", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=33) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 33\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 100, + "end_line": 103, + "verbosity": 0 + }, + { + "id": 1994, + "type": "job_event", + "url": "/api/v2/job_events/1994/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1994/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.978210Z", + "modified": "2019-08-08T15:37:26.375204Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 65, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "61", + "changed": false, + "msg": "This is a debug message: 61", + "_ansible_verbose_always": true, + "_ansible_item_label": "61" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "d07105ee-a3fd-4afb-9a6d-6d85d64741eb", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=61) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 61\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 184, + "end_line": 187, + "verbosity": 0 + }, + { + "id": 1995, + "type": "job_event", + "url": "/api/v2/job_events/1995/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1995/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.457296Z", + "modified": "2019-08-08T15:37:26.396251Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 40, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "36", + "changed": false, + "msg": "This is a debug message: 36", + "_ansible_verbose_always": true, + "_ansible_item_label": "36" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "e28f67c3-8804-4524-997a-8ba0f035cee9", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=36) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 36\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 109, + "end_line": 112, + "verbosity": 0 + }, + { + "id": 1996, + "type": "job_event", + "url": "/api/v2/job_events/1996/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1996/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.636518Z", + "modified": "2019-08-08T15:37:26.404285Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 47, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "43", + "changed": false, + "msg": "This is a debug message: 43", + "_ansible_verbose_always": true, + "_ansible_item_label": "43" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "39ea55e2-d57e-43ae-a9f7-ba3580eaef66", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=43) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 43\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 130, + "end_line": 133, + "verbosity": 0 + }, + { + "id": 1997, + "type": "job_event", + "url": "/api/v2/job_events/1997/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1997/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.411413Z", + "modified": "2019-08-08T15:37:26.454426Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 38, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "34", + "changed": false, + "msg": "This is a debug message: 34", + "_ansible_verbose_always": true, + "_ansible_item_label": "34" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "0bd44ef6-b477-420b-b2a7-809d85922c4c", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=34) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 34\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 103, + "end_line": 106, + "verbosity": 0 + }, + { + "id": 1998, + "type": "job_event", + "url": "/api/v2/job_events/1998/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1998/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.476510Z", + "modified": "2019-08-08T15:37:26.469731Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 41, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "37", + "changed": false, + "msg": "This is a debug message: 37", + "_ansible_verbose_always": true, + "_ansible_item_label": "37" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "04793473-b8e1-41c0-a899-d825133d3205", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=37) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 37\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 112, + "end_line": 115, + "verbosity": 0 + }, + { + "id": 1999, + "type": "job_event", + "url": "/api/v2/job_events/1999/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/1999/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.782456Z", + "modified": "2019-08-08T15:37:26.480129Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 55, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "51", + "changed": false, + "msg": "This is a debug message: 51", + "_ansible_verbose_always": true, + "_ansible_item_label": "51" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "7672f729-0342-417f-aa26-8280dff2199e", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=51) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 51\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 154, + "end_line": 157, + "verbosity": 0 + }, + { + "id": 2000, + "type": "job_event", + "url": "/api/v2/job_events/2000/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2000/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.108794Z", + "modified": "2019-08-08T15:37:26.509659Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 76, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "72", + "changed": false, + "msg": "This is a debug message: 72", + "_ansible_verbose_always": true, + "_ansible_item_label": "72" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "e4629ee0-d3aa-4f2c-b901-7d3d48578b5b", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=72) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 72\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 217, + "end_line": 220, + "verbosity": 0 + }, + { + "id": 2001, + "type": "job_event", + "url": "/api/v2/job_events/2001/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2001/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.562799Z", + "modified": "2019-08-08T15:37:26.527184Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 43, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "39", + "changed": false, + "msg": "This is a debug message: 39", + "_ansible_verbose_always": true, + "_ansible_item_label": "39" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "eb7ee827-dd6d-434f-acb9-cfafe987b8fd", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=39) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 39\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 118, + "end_line": 121, + "verbosity": 0 + }, + { + "id": 2002, + "type": "job_event", + "url": "/api/v2/job_events/2002/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2002/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.875364Z", + "modified": "2019-08-08T15:37:26.547488Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 59, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "55", + "changed": false, + "msg": "This is a debug message: 55", + "_ansible_verbose_always": true, + "_ansible_item_label": "55" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "adf680e4-5f4c-4768-ba44-2948b6ef4f62", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=55) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 55\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 166, + "end_line": 169, + "verbosity": 0 + }, + { + "id": 2003, + "type": "job_event", + "url": "/api/v2/job_events/2003/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2003/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.593206Z", + "modified": "2019-08-08T15:37:26.589112Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 44, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "40", + "changed": false, + "msg": "This is a debug message: 40", + "_ansible_verbose_always": true, + "_ansible_item_label": "40" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "23cb2160-08d8-4dd9-8f9b-447986e80a2d", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=40) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 40\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 121, + "end_line": 124, + "verbosity": 0 + }, + { + "id": 2004, + "type": "job_event", + "url": "/api/v2/job_events/2004/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2004/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.612613Z", + "modified": "2019-08-08T15:37:26.601979Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 45, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "41", + "changed": false, + "msg": "This is a debug message: 41", + "_ansible_verbose_always": true, + "_ansible_item_label": "41" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "4a166e98-2a69-4e62-a8e4-e5df71866514", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=41) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 41\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 124, + "end_line": 127, + "verbosity": 0 + }, + { + "id": 2005, + "type": "job_event", + "url": "/api/v2/job_events/2005/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2005/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.142635Z", + "modified": "2019-08-08T15:37:26.628858Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 79, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "75", + "changed": false, + "msg": "This is a debug message: 75", + "_ansible_verbose_always": true, + "_ansible_item_label": "75" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "3fd46a16-fc84-4e94-8b13-a32d947fb5fb", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=75) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 75\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 226, + "end_line": 229, + "verbosity": 0 + }, + { + "id": 2006, + "type": "job_event", + "url": "/api/v2/job_events/2006/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2006/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.921867Z", + "modified": "2019-08-08T15:37:26.632276Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 61, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "57", + "changed": false, + "msg": "This is a debug message: 57", + "_ansible_verbose_always": true, + "_ansible_item_label": "57" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "fa21ba48-9a18-49d1-aaa0-3f61c2d982ce", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=57) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 57\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 172, + "end_line": 175, + "verbosity": 0 + }, + { + "id": 2007, + "type": "job_event", + "url": "/api/v2/job_events/2007/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2007/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.652186Z", + "modified": "2019-08-08T15:37:26.667728Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 49, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "45", + "changed": false, + "msg": "This is a debug message: 45", + "_ansible_verbose_always": true, + "_ansible_item_label": "45" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "eed162c5-31cc-4836-b2ed-6aa1f2053bf5", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=45) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 45\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 136, + "end_line": 139, + "verbosity": 0 + }, + { + "id": 2008, + "type": "job_event", + "url": "/api/v2/job_events/2008/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2008/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.961446Z", + "modified": "2019-08-08T15:37:26.708329Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 63, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "59", + "changed": false, + "msg": "This is a debug message: 59", + "_ansible_verbose_always": true, + "_ansible_item_label": "59" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "75ce69ff-f589-4b61-8a9b-bfe8986d48da", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=59) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 59\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 178, + "end_line": 181, + "verbosity": 0 + }, + { + "id": 2009, + "type": "job_event", + "url": "/api/v2/job_events/2009/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2009/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.648666Z", + "modified": "2019-08-08T15:37:26.714656Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 48, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "44", + "changed": false, + "msg": "This is a debug message: 44", + "_ansible_verbose_always": true, + "_ansible_item_label": "44" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "bfe0e36b-bf2e-405d-9351-6ed833860724", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=44) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 44\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 133, + "end_line": 136, + "verbosity": 0 + }, + { + "id": 2010, + "type": "job_event", + "url": "/api/v2/job_events/2010/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2010/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.721278Z", + "modified": "2019-08-08T15:37:26.759459Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 54, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "50", + "changed": false, + "msg": "This is a debug message: 50", + "_ansible_verbose_always": true, + "_ansible_item_label": "50" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "b979d166-ad9d-4e37-9d8d-06d5550e5141", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=50) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 50\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 151, + "end_line": 154, + "verbosity": 0 + }, + { + "id": 2011, + "type": "job_event", + "url": "/api/v2/job_events/2011/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2011/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.215385Z", + "modified": "2019-08-08T15:37:26.767222Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 81, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "77", + "changed": false, + "msg": "This is a debug message: 77", + "_ansible_verbose_always": true, + "_ansible_item_label": "77" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "f8448a5a-950e-4c97-9962-891613b85c03", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=77) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 77\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 232, + "end_line": 235, + "verbosity": 0 + }, + { + "id": 2012, + "type": "job_event", + "url": "/api/v2/job_events/2012/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2012/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.028414Z", + "modified": "2019-08-08T15:37:26.780879Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 69, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "65", + "changed": false, + "msg": "This is a debug message: 65", + "_ansible_verbose_always": true, + "_ansible_item_label": "65" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "aeb6f1c1-cae6-4a4c-b52a-69715153a38a", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=65) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 65\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 196, + "end_line": 199, + "verbosity": 0 + }, + { + "id": 2013, + "type": "job_event", + "url": "/api/v2/job_events/2013/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2013/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.657415Z", + "modified": "2019-08-08T15:37:26.832748Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 50, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "46", + "changed": false, + "msg": "This is a debug message: 46", + "_ansible_verbose_always": true, + "_ansible_item_label": "46" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "3b2477c5-ddf8-4e84-8415-9ea167afe428", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=46) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 46\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 139, + "end_line": 142, + "verbosity": 0 + }, + { + "id": 2014, + "type": "job_event", + "url": "/api/v2/job_events/2014/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2014/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.881794Z", + "modified": "2019-08-08T15:37:26.890635Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 60, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "56", + "changed": false, + "msg": "This is a debug message: 56", + "_ansible_verbose_always": true, + "_ansible_item_label": "56" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "d75a0264-d329-4b96-bc42-989792b9f7ad", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=56) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 56\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 169, + "end_line": 172, + "verbosity": 0 + }, + { + "id": 2015, + "type": "job_event", + "url": "/api/v2/job_events/2015/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2015/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.328777Z", + "modified": "2019-08-08T15:37:26.998865Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 85, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "81", + "changed": false, + "msg": "This is a debug message: 81", + "_ansible_verbose_always": true, + "_ansible_item_label": "81" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "3bfd47e6-56dc-4dda-8a88-47cccf7c3aab", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=81) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 81\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 244, + "end_line": 247, + "verbosity": 0 + }, + { + "id": 2016, + "type": "job_event", + "url": "/api/v2/job_events/2016/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2016/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.081640Z", + "modified": "2019-08-08T15:37:27.050089Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 74, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "70", + "changed": false, + "msg": "This is a debug message: 70", + "_ansible_verbose_always": true, + "_ansible_item_label": "70" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "9db217cb-a183-4230-8838-d3206ed1c3a2", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=70) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 70\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 211, + "end_line": 214, + "verbosity": 0 + }, + { + "id": 2017, + "type": "job_event", + "url": "/api/v2/job_events/2017/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2017/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.936432Z", + "modified": "2019-08-08T15:37:27.133867Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 62, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "58", + "changed": false, + "msg": "This is a debug message: 58", + "_ansible_verbose_always": true, + "_ansible_item_label": "58" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "3b3508c8-8c75-46c0-bc77-e66ceac4d7f5", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=58) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 58\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 175, + "end_line": 178, + "verbosity": 0 + }, + { + "id": 2018, + "type": "job_event", + "url": "/api/v2/job_events/2018/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2018/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.681942Z", + "modified": "2019-08-08T15:37:27.138805Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 51, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "47", + "changed": false, + "msg": "This is a debug message: 47", + "_ansible_verbose_always": true, + "_ansible_item_label": "47" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "711a4387-1f0d-47b3-9810-6505bcd9f468", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=47) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 47\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 142, + "end_line": 145, + "verbosity": 0 + }, + { + "id": 2019, + "type": "job_event", + "url": "/api/v2/job_events/2019/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2019/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.543726Z", + "modified": "2019-08-08T15:37:27.179624Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 97, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "93", + "changed": false, + "msg": "This is a debug message: 93", + "_ansible_verbose_always": true, + "_ansible_item_label": "93" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "e8091813-e222-494b-ba35-57fc56b5d593", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=93) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 93\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 280, + "end_line": 283, + "verbosity": 0 + }, + { + "id": 2020, + "type": "job_event", + "url": "/api/v2/job_events/2020/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2020/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.119541Z", + "modified": "2019-08-08T15:37:27.227196Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 77, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "73", + "changed": false, + "msg": "This is a debug message: 73", + "_ansible_verbose_always": true, + "_ansible_item_label": "73" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "d00ffa7a-dff3-4e57-9ba2-fa9f921d931e", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=73) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 73\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 220, + "end_line": 223, + "verbosity": 0 + }, + { + "id": 2021, + "type": "job_event", + "url": "/api/v2/job_events/2021/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2021/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.842870Z", + "modified": "2019-08-08T15:37:27.262791Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 57, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "53", + "changed": false, + "msg": "This is a debug message: 53", + "_ansible_verbose_always": true, + "_ansible_item_label": "53" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "810bd4e9-d488-459d-9d6a-4109ad77eda4", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=53) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 53\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 160, + "end_line": 163, + "verbosity": 0 + }, + { + "id": 2022, + "type": "job_event", + "url": "/api/v2/job_events/2022/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2022/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.963586Z", + "modified": "2019-08-08T15:37:27.275525Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 64, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "60", + "changed": false, + "msg": "This is a debug message: 60", + "_ansible_verbose_always": true, + "_ansible_item_label": "60" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "00025b42-8e42-4319-a665-8a77cdb9fbfd", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=60) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 60\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 181, + "end_line": 184, + "verbosity": 0 + }, + { + "id": 2023, + "type": "job_event", + "url": "/api/v2/job_events/2023/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2023/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.133664Z", + "modified": "2019-08-08T15:37:27.335812Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 78, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "74", + "changed": false, + "msg": "This is a debug message: 74", + "_ansible_verbose_always": true, + "_ansible_item_label": "74" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "e62f05bf-04b3-489b-9da8-0115e82e24be", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=74) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 74\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 223, + "end_line": 226, + "verbosity": 0 + }, + { + "id": 2024, + "type": "job_event", + "url": "/api/v2/job_events/2024/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2024/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.860885Z", + "modified": "2019-08-08T15:37:27.346429Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 58, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "54", + "changed": false, + "msg": "This is a debug message: 54", + "_ansible_verbose_always": true, + "_ansible_item_label": "54" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "40eacdf0-b24a-4200-aebc-b271059fde60", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=54) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 54\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 163, + "end_line": 166, + "verbosity": 0 + }, + { + "id": 2025, + "type": "job_event", + "url": "/api/v2/job_events/2025/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2025/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:25.990345Z", + "modified": "2019-08-08T15:37:27.392596Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 66, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "62", + "changed": false, + "msg": "This is a debug message: 62", + "_ansible_verbose_always": true, + "_ansible_item_label": "62" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "dff70f80-febf-4b7e-8370-f74a53daf06d", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=62) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 62\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 187, + "end_line": 190, + "verbosity": 0 + }, + { + "id": 2026, + "type": "job_event", + "url": "/api/v2/job_events/2026/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2026/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.292911Z", + "modified": "2019-08-08T15:37:27.486075Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 83, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "79", + "changed": false, + "msg": "This is a debug message: 79", + "_ansible_verbose_always": true, + "_ansible_item_label": "79" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "1ff1a537-03a6-4e66-95a9-d664b5334436", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=79) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 79\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 238, + "end_line": 241, + "verbosity": 0 + }, + { + "id": 2027, + "type": "job_event", + "url": "/api/v2/job_events/2027/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2027/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.005857Z", + "modified": "2019-08-08T15:37:27.524324Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 67, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "63", + "changed": false, + "msg": "This is a debug message: 63", + "_ansible_verbose_always": true, + "_ansible_item_label": "63" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "1cb1a21b-5e4f-4c63-a1c0-17a71c7cea99", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=63) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 63\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 190, + "end_line": 193, + "verbosity": 0 + }, + { + "id": 2028, + "type": "job_event", + "url": "/api/v2/job_events/2028/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2028/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.013264Z", + "modified": "2019-08-08T15:37:27.549575Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 68, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "64", + "changed": false, + "msg": "This is a debug message: 64", + "_ansible_verbose_always": true, + "_ansible_item_label": "64" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "cdfdaf8a-8c42-40e1-9f76-c7b90ec7551c", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=64) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 64\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 193, + "end_line": 196, + "verbosity": 0 + }, + { + "id": 2029, + "type": "job_event", + "url": "/api/v2/job_events/2029/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2029/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.040913Z", + "modified": "2019-08-08T15:37:27.652740Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 70, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "66", + "changed": false, + "msg": "This is a debug message: 66", + "_ansible_verbose_always": true, + "_ansible_item_label": "66" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "a7370c5c-446b-46ba-b36d-129667df93b0", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=66) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 66\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 199, + "end_line": 202, + "verbosity": 0 + }, + { + "id": 2030, + "type": "job_event", + "url": "/api/v2/job_events/2030/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2030/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.348043Z", + "modified": "2019-08-08T15:37:27.701447Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 86, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "82", + "changed": false, + "msg": "This is a debug message: 82", + "_ansible_verbose_always": true, + "_ansible_item_label": "82" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "3f04cd9e-3bb2-47e3-922d-5f765a0f5b02", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=82) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 82\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 247, + "end_line": 250, + "verbosity": 0 + }, + { + "id": 2031, + "type": "job_event", + "url": "/api/v2/job_events/2031/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2031/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.051202Z", + "modified": "2019-08-08T15:37:27.713701Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 71, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "67", + "changed": false, + "msg": "This is a debug message: 67", + "_ansible_verbose_always": true, + "_ansible_item_label": "67" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "eb2007ce-4711-491c-8d3a-ccbe62fe4045", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=67) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 67\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 202, + "end_line": 205, + "verbosity": 0 + }, + { + "id": 2032, + "type": "job_event", + "url": "/api/v2/job_events/2032/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2032/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.068442Z", + "modified": "2019-08-08T15:37:27.743860Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 73, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "69", + "changed": false, + "msg": "This is a debug message: 69", + "_ansible_verbose_always": true, + "_ansible_item_label": "69" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "19250a89-c8c7-47fe-84eb-af53515333ac", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=69) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 69\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 208, + "end_line": 211, + "verbosity": 0 + }, + { + "id": 2033, + "type": "job_event", + "url": "/api/v2/job_events/2033/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2033/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.092184Z", + "modified": "2019-08-08T15:37:27.821021Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 75, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "71", + "changed": false, + "msg": "This is a debug message: 71", + "_ansible_verbose_always": true, + "_ansible_item_label": "71" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "17682380-5ed3-4ac3-ba88-3813929369e4", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=71) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 71\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 214, + "end_line": 217, + "verbosity": 0 + }, + { + "id": 2034, + "type": "job_event", + "url": "/api/v2/job_events/2034/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2034/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.057146Z", + "modified": "2019-08-08T15:37:27.838870Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 72, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "68", + "changed": false, + "msg": "This is a debug message: 68", + "_ansible_verbose_always": true, + "_ansible_item_label": "68" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "b5a496b7-4cac-4454-87f2-195deeb96f59", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=68) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 68\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 205, + "end_line": 208, + "verbosity": 0 + }, + { + "id": 2035, + "type": "job_event", + "url": "/api/v2/job_events/2035/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2035/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.378788Z", + "modified": "2019-08-08T15:37:27.858412Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 88, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "84", + "changed": false, + "msg": "This is a debug message: 84", + "_ansible_verbose_always": true, + "_ansible_item_label": "84" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "aecec084-0d6c-4498-91fd-0103c86f36ce", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=84) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 84\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 253, + "end_line": 256, + "verbosity": 0 + }, + { + "id": 2036, + "type": "job_event", + "url": "/api/v2/job_events/2036/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2036/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.168374Z", + "modified": "2019-08-08T15:37:27.898424Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 80, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "76", + "changed": false, + "msg": "This is a debug message: 76", + "_ansible_verbose_always": true, + "_ansible_item_label": "76" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "79b8e25f-7183-44c0-aed7-83f0f9ea69ac", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=76) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 76\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 229, + "end_line": 232, + "verbosity": 0 + }, + { + "id": 2037, + "type": "job_event", + "url": "/api/v2/job_events/2037/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2037/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.439215Z", + "modified": "2019-08-08T15:37:27.922574Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 91, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "87", + "changed": false, + "msg": "This is a debug message: 87", + "_ansible_verbose_always": true, + "_ansible_item_label": "87" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "b7ef243f-2136-470b-a06e-4beda7295f6e", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=87) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 87\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 262, + "end_line": 265, + "verbosity": 0 + }, + { + "id": 2038, + "type": "job_event", + "url": "/api/v2/job_events/2038/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2038/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.307088Z", + "modified": "2019-08-08T15:37:27.942731Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 84, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "80", + "changed": false, + "msg": "This is a debug message: 80", + "_ansible_verbose_always": true, + "_ansible_item_label": "80" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "61650cd0-bed6-4cbb-bc6f-a99857997a31", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=80) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 80\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 241, + "end_line": 244, + "verbosity": 0 + }, + { + "id": 2039, + "type": "job_event", + "url": "/api/v2/job_events/2039/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2039/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.258772Z", + "modified": "2019-08-08T15:37:27.955766Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 82, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "78", + "changed": false, + "msg": "This is a debug message: 78", + "_ansible_verbose_always": true, + "_ansible_item_label": "78" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "74c9ae54-4a08-4a5e-958a-715d33d03f8c", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=78) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 78\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 235, + "end_line": 238, + "verbosity": 0 + }, + { + "id": 2040, + "type": "job_event", + "url": "/api/v2/job_events/2040/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2040/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.513963Z", + "modified": "2019-08-08T15:37:27.967600Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 95, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "91", + "changed": false, + "msg": "This is a debug message: 91", + "_ansible_verbose_always": true, + "_ansible_item_label": "91" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "967894da-b197-4291-8684-a69d47b44186", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=91) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 91\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 274, + "end_line": 277, + "verbosity": 0 + }, + { + "id": 2041, + "type": "job_event", + "url": "/api/v2/job_events/2041/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2041/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.528974Z", + "modified": "2019-08-08T15:37:28.008778Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 96, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "92", + "changed": false, + "msg": "This is a debug message: 92", + "_ansible_verbose_always": true, + "_ansible_item_label": "92" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "3fd2bc86-518a-4a6d-8273-7a588260f6d4", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=92) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 92\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 277, + "end_line": 280, + "verbosity": 0 + }, + { + "id": 2042, + "type": "job_event", + "url": "/api/v2/job_events/2042/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2042/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.562362Z", + "modified": "2019-08-08T15:37:28.023718Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 98, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "94", + "changed": false, + "msg": "This is a debug message: 94", + "_ansible_verbose_always": true, + "_ansible_item_label": "94" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "44102517-9500-4b5d-8ba0-cfb837f96bee", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=94) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 94\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 283, + "end_line": 286, + "verbosity": 0 + }, + { + "id": 2043, + "type": "job_event", + "url": "/api/v2/job_events/2043/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2043/children/" + }, + "summary_fields": { + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.621574Z", + "modified": "2019-08-08T15:37:28.057416Z", + "job": 59, + "event": "playbook_on_stats", + "counter": 100, + "event_display": "Playbook Complete", + "event_data": { + "ignored": {}, + "skipped": {}, + "ok": { + "localhost": 1 + }, + "artifact_data": {}, + "rescued": {}, + "changed": {}, + "pid": 3, + "dark": {}, + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "failures": {}, + "processed": { + "localhost": 1 + } + }, + "event_level": 1, + "failed": false, + "changed": false, + "uuid": "752f3afc-4b84-4a94-987a-118b886c9cac", + "parent_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "host": null, + "host_name": "", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "", + "task": "", + "role": "", + "stdout": "\r\nPLAY RECAP *********************************************************************\r\n\u001b[0;32mlocalhost\u001b[0m : \u001b[0;32mok=1 \u001b[0m changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 \r\n", + "start_line": 286, + "end_line": 290, + "verbosity": 0 + }, + { + "id": 2044, + "type": "job_event", + "url": "/api/v2/job_events/2044/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2044/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.358130Z", + "modified": "2019-08-08T15:37:28.082780Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 87, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "83", + "changed": false, + "msg": "This is a debug message: 83", + "_ansible_verbose_always": true, + "_ansible_item_label": "83" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "eab79b3f-a96e-4796-96c1-d649e451cfbd", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=83) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 83\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 250, + "end_line": 253, + "verbosity": 0 + }, + { + "id": 2045, + "type": "job_event", + "url": "/api/v2/job_events/2045/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2045/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.391893Z", + "modified": "2019-08-08T15:37:28.159238Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 89, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "85", + "changed": false, + "msg": "This is a debug message: 85", + "_ansible_verbose_always": true, + "_ansible_item_label": "85" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "33745267-bc8a-49b5-98d4-1635e8a7b389", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=85) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 85\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 256, + "end_line": 259, + "verbosity": 0 + }, + { + "id": 2046, + "type": "job_event", + "url": "/api/v2/job_events/2046/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2046/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.409526Z", + "modified": "2019-08-08T15:37:28.203268Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 90, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "86", + "changed": false, + "msg": "This is a debug message: 86", + "_ansible_verbose_always": true, + "_ansible_item_label": "86" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "c41b733d-a428-4389-b1fd-fe562cfa1645", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=86) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 86\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 259, + "end_line": 262, + "verbosity": 0 + }, + { + "id": 2047, + "type": "job_event", + "url": "/api/v2/job_events/2047/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2047/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.455792Z", + "modified": "2019-08-08T15:37:28.247902Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 92, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "88", + "changed": false, + "msg": "This is a debug message: 88", + "_ansible_verbose_always": true, + "_ansible_item_label": "88" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "57d5ca96-f245-436e-88e5-04c5d61e9db5", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=88) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 88\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 265, + "end_line": 268, + "verbosity": 0 + }, + { + "id": 2048, + "type": "job_event", + "url": "/api/v2/job_events/2048/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2048/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.475327Z", + "modified": "2019-08-08T15:37:28.289995Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 93, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "89", + "changed": false, + "msg": "This is a debug message: 89", + "_ansible_verbose_always": true, + "_ansible_item_label": "89" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "df145399-0a25-4bfa-90f3-d68a16be3c09", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=89) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 89\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 268, + "end_line": 271, + "verbosity": 0 + }, + { + "id": 2049, + "type": "job_event", + "url": "/api/v2/job_events/2049/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2049/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.496247Z", + "modified": "2019-08-08T15:37:28.332622Z", + "job": 59, + "event": "runner_item_on_ok", + "counter": 94, + "event_display": "Item OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "res": { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "90", + "changed": false, + "msg": "This is a debug message: 90", + "_ansible_verbose_always": true, + "_ansible_item_label": "90" + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "862a71c3-6e6d-49b0-ab50-a1a2d126a351", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "\u001b[0;32mok: [localhost] => (item=90) => {\u001b[0m\r\n\u001b[0;32m \"msg\": \"This is a debug message: 90\"\u001b[0m\r\n\u001b[0;32m}\u001b[0m", + "start_line": 271, + "end_line": 274, + "verbosity": 0 + }, + { + "id": 2050, + "type": "job_event", + "url": "/api/v2/job_events/2050/", + "related": { + "job": "/api/v2/jobs/59/", + "children": "/api/v2/job_events/2050/children/", + "host": "/api/v2/hosts/1/" + }, + "summary_fields": { + "host": { + "id": 1, + "name": "localhost", + "description": "", + "has_active_failures": false, + "has_inventory_sources": false + }, + "job": { + "id": 59, + "name": "Chatty Tasks", + "description": "", + "status": "successful", + "failed": false, + "elapsed": 8.408, + "type": "job", + "job_template_id": 14, + "job_template_name": "Chatty Tasks" + }, + "role": {} + }, + "created": "2019-08-08T15:37:26.580706Z", + "modified": "2019-08-08T15:37:28.543622Z", + "job": 59, + "event": "runner_on_ok", + "counter": 99, + "event_display": "Host OK", + "event_data": { + "play_pattern": "all", + "play": "all", + "task": "debug", + "task_args": "", + "remote_addr": "localhost", + "res": { + "msg": "All items completed", + "changed": false, + "results": [ + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "1", + "failed": false, + "changed": false, + "msg": "This is a debug message: 1", + "_ansible_verbose_always": true, + "_ansible_item_label": "1" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "2", + "failed": false, + "changed": false, + "msg": "This is a debug message: 2", + "_ansible_verbose_always": true, + "_ansible_item_label": "2" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "3", + "failed": false, + "changed": false, + "msg": "This is a debug message: 3", + "_ansible_verbose_always": true, + "_ansible_item_label": "3" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "4", + "failed": false, + "changed": false, + "msg": "This is a debug message: 4", + "_ansible_verbose_always": true, + "_ansible_item_label": "4" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "5", + "failed": false, + "changed": false, + "msg": "This is a debug message: 5", + "_ansible_verbose_always": true, + "_ansible_item_label": "5" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "6", + "failed": false, + "changed": false, + "msg": "This is a debug message: 6", + "_ansible_verbose_always": true, + "_ansible_item_label": "6" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "7", + "failed": false, + "changed": false, + "msg": "This is a debug message: 7", + "_ansible_verbose_always": true, + "_ansible_item_label": "7" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "8", + "failed": false, + "changed": false, + "msg": "This is a debug message: 8", + "_ansible_verbose_always": true, + "_ansible_item_label": "8" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "9", + "failed": false, + "changed": false, + "msg": "This is a debug message: 9", + "_ansible_verbose_always": true, + "_ansible_item_label": "9" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "10", + "failed": false, + "changed": false, + "msg": "This is a debug message: 10", + "_ansible_verbose_always": true, + "_ansible_item_label": "10" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "11", + "failed": false, + "changed": false, + "msg": "This is a debug message: 11", + "_ansible_verbose_always": true, + "_ansible_item_label": "11" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "12", + "failed": false, + "changed": false, + "msg": "This is a debug message: 12", + "_ansible_verbose_always": true, + "_ansible_item_label": "12" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "13", + "failed": false, + "changed": false, + "msg": "This is a debug message: 13", + "_ansible_verbose_always": true, + "_ansible_item_label": "13" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "14", + "failed": false, + "changed": false, + "msg": "This is a debug message: 14", + "_ansible_verbose_always": true, + "_ansible_item_label": "14" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "15", + "failed": false, + "changed": false, + "msg": "This is a debug message: 15", + "_ansible_verbose_always": true, + "_ansible_item_label": "15" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "16", + "failed": false, + "changed": false, + "msg": "This is a debug message: 16", + "_ansible_verbose_always": true, + "_ansible_item_label": "16" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "17", + "failed": false, + "changed": false, + "msg": "This is a debug message: 17", + "_ansible_verbose_always": true, + "_ansible_item_label": "17" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "18", + "failed": false, + "changed": false, + "msg": "This is a debug message: 18", + "_ansible_verbose_always": true, + "_ansible_item_label": "18" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "19", + "failed": false, + "changed": false, + "msg": "This is a debug message: 19", + "_ansible_verbose_always": true, + "_ansible_item_label": "19" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "20", + "failed": false, + "changed": false, + "msg": "This is a debug message: 20", + "_ansible_verbose_always": true, + "_ansible_item_label": "20" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "21", + "failed": false, + "changed": false, + "msg": "This is a debug message: 21", + "_ansible_verbose_always": true, + "_ansible_item_label": "21" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "22", + "failed": false, + "changed": false, + "msg": "This is a debug message: 22", + "_ansible_verbose_always": true, + "_ansible_item_label": "22" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "23", + "failed": false, + "changed": false, + "msg": "This is a debug message: 23", + "_ansible_verbose_always": true, + "_ansible_item_label": "23" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "24", + "failed": false, + "changed": false, + "msg": "This is a debug message: 24", + "_ansible_verbose_always": true, + "_ansible_item_label": "24" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "25", + "failed": false, + "changed": false, + "msg": "This is a debug message: 25", + "_ansible_verbose_always": true, + "_ansible_item_label": "25" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "26", + "failed": false, + "changed": false, + "msg": "This is a debug message: 26", + "_ansible_verbose_always": true, + "_ansible_item_label": "26" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "27", + "failed": false, + "changed": false, + "msg": "This is a debug message: 27", + "_ansible_verbose_always": true, + "_ansible_item_label": "27" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "28", + "failed": false, + "changed": false, + "msg": "This is a debug message: 28", + "_ansible_verbose_always": true, + "_ansible_item_label": "28" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "29", + "failed": false, + "changed": false, + "msg": "This is a debug message: 29", + "_ansible_verbose_always": true, + "_ansible_item_label": "29" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "30", + "failed": false, + "changed": false, + "msg": "This is a debug message: 30", + "_ansible_verbose_always": true, + "_ansible_item_label": "30" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "31", + "failed": false, + "changed": false, + "msg": "This is a debug message: 31", + "_ansible_verbose_always": true, + "_ansible_item_label": "31" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "32", + "failed": false, + "changed": false, + "msg": "This is a debug message: 32", + "_ansible_verbose_always": true, + "_ansible_item_label": "32" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "33", + "failed": false, + "changed": false, + "msg": "This is a debug message: 33", + "_ansible_verbose_always": true, + "_ansible_item_label": "33" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "34", + "failed": false, + "changed": false, + "msg": "This is a debug message: 34", + "_ansible_verbose_always": true, + "_ansible_item_label": "34" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "35", + "failed": false, + "changed": false, + "msg": "This is a debug message: 35", + "_ansible_verbose_always": true, + "_ansible_item_label": "35" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "36", + "failed": false, + "changed": false, + "msg": "This is a debug message: 36", + "_ansible_verbose_always": true, + "_ansible_item_label": "36" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "37", + "failed": false, + "changed": false, + "msg": "This is a debug message: 37", + "_ansible_verbose_always": true, + "_ansible_item_label": "37" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "38", + "failed": false, + "changed": false, + "msg": "This is a debug message: 38", + "_ansible_verbose_always": true, + "_ansible_item_label": "38" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "39", + "failed": false, + "changed": false, + "msg": "This is a debug message: 39", + "_ansible_verbose_always": true, + "_ansible_item_label": "39" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "40", + "failed": false, + "changed": false, + "msg": "This is a debug message: 40", + "_ansible_verbose_always": true, + "_ansible_item_label": "40" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "41", + "failed": false, + "changed": false, + "msg": "This is a debug message: 41", + "_ansible_verbose_always": true, + "_ansible_item_label": "41" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "42", + "failed": false, + "changed": false, + "msg": "This is a debug message: 42", + "_ansible_verbose_always": true, + "_ansible_item_label": "42" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "43", + "failed": false, + "changed": false, + "msg": "This is a debug message: 43", + "_ansible_verbose_always": true, + "_ansible_item_label": "43" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "44", + "failed": false, + "changed": false, + "msg": "This is a debug message: 44", + "_ansible_verbose_always": true, + "_ansible_item_label": "44" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "45", + "failed": false, + "changed": false, + "msg": "This is a debug message: 45", + "_ansible_verbose_always": true, + "_ansible_item_label": "45" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "46", + "failed": false, + "changed": false, + "msg": "This is a debug message: 46", + "_ansible_verbose_always": true, + "_ansible_item_label": "46" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "47", + "failed": false, + "changed": false, + "msg": "This is a debug message: 47", + "_ansible_verbose_always": true, + "_ansible_item_label": "47" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "48", + "failed": false, + "changed": false, + "msg": "This is a debug message: 48", + "_ansible_verbose_always": true, + "_ansible_item_label": "48" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "49", + "failed": false, + "changed": false, + "msg": "This is a debug message: 49", + "_ansible_verbose_always": true, + "_ansible_item_label": "49" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "50", + "failed": false, + "changed": false, + "msg": "This is a debug message: 50", + "_ansible_verbose_always": true, + "_ansible_item_label": "50" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "51", + "failed": false, + "changed": false, + "msg": "This is a debug message: 51", + "_ansible_verbose_always": true, + "_ansible_item_label": "51" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "52", + "failed": false, + "changed": false, + "msg": "This is a debug message: 52", + "_ansible_verbose_always": true, + "_ansible_item_label": "52" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "53", + "failed": false, + "changed": false, + "msg": "This is a debug message: 53", + "_ansible_verbose_always": true, + "_ansible_item_label": "53" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "54", + "failed": false, + "changed": false, + "msg": "This is a debug message: 54", + "_ansible_verbose_always": true, + "_ansible_item_label": "54" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "55", + "failed": false, + "changed": false, + "msg": "This is a debug message: 55", + "_ansible_verbose_always": true, + "_ansible_item_label": "55" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "56", + "failed": false, + "changed": false, + "msg": "This is a debug message: 56", + "_ansible_verbose_always": true, + "_ansible_item_label": "56" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "57", + "failed": false, + "changed": false, + "msg": "This is a debug message: 57", + "_ansible_verbose_always": true, + "_ansible_item_label": "57" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "58", + "failed": false, + "changed": false, + "msg": "This is a debug message: 58", + "_ansible_verbose_always": true, + "_ansible_item_label": "58" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "59", + "failed": false, + "changed": false, + "msg": "This is a debug message: 59", + "_ansible_verbose_always": true, + "_ansible_item_label": "59" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "60", + "failed": false, + "changed": false, + "msg": "This is a debug message: 60", + "_ansible_verbose_always": true, + "_ansible_item_label": "60" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "61", + "failed": false, + "changed": false, + "msg": "This is a debug message: 61", + "_ansible_verbose_always": true, + "_ansible_item_label": "61" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "62", + "failed": false, + "changed": false, + "msg": "This is a debug message: 62", + "_ansible_verbose_always": true, + "_ansible_item_label": "62" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "63", + "failed": false, + "changed": false, + "msg": "This is a debug message: 63", + "_ansible_verbose_always": true, + "_ansible_item_label": "63" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "64", + "failed": false, + "changed": false, + "msg": "This is a debug message: 64", + "_ansible_verbose_always": true, + "_ansible_item_label": "64" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "65", + "failed": false, + "changed": false, + "msg": "This is a debug message: 65", + "_ansible_verbose_always": true, + "_ansible_item_label": "65" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "66", + "failed": false, + "changed": false, + "msg": "This is a debug message: 66", + "_ansible_verbose_always": true, + "_ansible_item_label": "66" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "67", + "failed": false, + "changed": false, + "msg": "This is a debug message: 67", + "_ansible_verbose_always": true, + "_ansible_item_label": "67" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "68", + "failed": false, + "changed": false, + "msg": "This is a debug message: 68", + "_ansible_verbose_always": true, + "_ansible_item_label": "68" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "69", + "failed": false, + "changed": false, + "msg": "This is a debug message: 69", + "_ansible_verbose_always": true, + "_ansible_item_label": "69" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "70", + "failed": false, + "changed": false, + "msg": "This is a debug message: 70", + "_ansible_verbose_always": true, + "_ansible_item_label": "70" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "71", + "failed": false, + "changed": false, + "msg": "This is a debug message: 71", + "_ansible_verbose_always": true, + "_ansible_item_label": "71" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "72", + "failed": false, + "changed": false, + "msg": "This is a debug message: 72", + "_ansible_verbose_always": true, + "_ansible_item_label": "72" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "73", + "failed": false, + "changed": false, + "msg": "This is a debug message: 73", + "_ansible_verbose_always": true, + "_ansible_item_label": "73" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "74", + "failed": false, + "changed": false, + "msg": "This is a debug message: 74", + "_ansible_verbose_always": true, + "_ansible_item_label": "74" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "75", + "failed": false, + "changed": false, + "msg": "This is a debug message: 75", + "_ansible_verbose_always": true, + "_ansible_item_label": "75" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "76", + "failed": false, + "changed": false, + "msg": "This is a debug message: 76", + "_ansible_verbose_always": true, + "_ansible_item_label": "76" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "77", + "failed": false, + "changed": false, + "msg": "This is a debug message: 77", + "_ansible_verbose_always": true, + "_ansible_item_label": "77" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "78", + "failed": false, + "changed": false, + "msg": "This is a debug message: 78", + "_ansible_verbose_always": true, + "_ansible_item_label": "78" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "79", + "failed": false, + "changed": false, + "msg": "This is a debug message: 79", + "_ansible_verbose_always": true, + "_ansible_item_label": "79" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "80", + "failed": false, + "changed": false, + "msg": "This is a debug message: 80", + "_ansible_verbose_always": true, + "_ansible_item_label": "80" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "81", + "failed": false, + "changed": false, + "msg": "This is a debug message: 81", + "_ansible_verbose_always": true, + "_ansible_item_label": "81" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "82", + "failed": false, + "changed": false, + "msg": "This is a debug message: 82", + "_ansible_verbose_always": true, + "_ansible_item_label": "82" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "83", + "failed": false, + "changed": false, + "msg": "This is a debug message: 83", + "_ansible_verbose_always": true, + "_ansible_item_label": "83" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "84", + "failed": false, + "changed": false, + "msg": "This is a debug message: 84", + "_ansible_verbose_always": true, + "_ansible_item_label": "84" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "85", + "failed": false, + "changed": false, + "msg": "This is a debug message: 85", + "_ansible_verbose_always": true, + "_ansible_item_label": "85" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "86", + "failed": false, + "changed": false, + "msg": "This is a debug message: 86", + "_ansible_verbose_always": true, + "_ansible_item_label": "86" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "87", + "failed": false, + "changed": false, + "msg": "This is a debug message: 87", + "_ansible_verbose_always": true, + "_ansible_item_label": "87" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "88", + "failed": false, + "changed": false, + "msg": "This is a debug message: 88", + "_ansible_verbose_always": true, + "_ansible_item_label": "88" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "89", + "failed": false, + "changed": false, + "msg": "This is a debug message: 89", + "_ansible_verbose_always": true, + "_ansible_item_label": "89" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "90", + "failed": false, + "changed": false, + "msg": "This is a debug message: 90", + "_ansible_verbose_always": true, + "_ansible_item_label": "90" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "91", + "failed": false, + "changed": false, + "msg": "This is a debug message: 91", + "_ansible_verbose_always": true, + "_ansible_item_label": "91" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "92", + "failed": false, + "changed": false, + "msg": "This is a debug message: 92", + "_ansible_verbose_always": true, + "_ansible_item_label": "92" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "93", + "failed": false, + "changed": false, + "msg": "This is a debug message: 93", + "_ansible_verbose_always": true, + "_ansible_item_label": "93" + }, + { + "ansible_loop_var": "item", + "_ansible_no_log": false, + "item": "94", + "failed": false, + "changed": false, + "msg": "This is a debug message: 94", + "_ansible_verbose_always": true, + "_ansible_item_label": "94" + } + ] + }, + "pid": 3, + "play_uuid": "0242ac13-0005-25a7-452d-000000000006", + "task_uuid": "0242ac13-0005-25a7-452d-000000000008", + "event_loop": "sequence", + "playbook_uuid": "4b471a8a-22be-460a-8a64-31a458fbe192", + "playbook": "chatty_tasks.yml", + "task_action": "debug", + "host": "localhost", + "task_path": "/projects/_6__demo_project/chatty_tasks.yml:8" + }, + "event_level": 3, + "failed": false, + "changed": false, + "uuid": "bf7019dc-b96c-4f1e-81d1-04407e649fcd", + "parent_uuid": "0242ac13-0005-25a7-452d-000000000008", + "host": 1, + "host_name": "localhost", + "parent": null, + "playbook": "chatty_tasks.yml", + "play": "all", + "task": "debug", + "role": "", + "stdout": "", + "start_line": 286, + "end_line": 286, + "verbosity": 0 + } + ] +} \ No newline at end of file diff --git a/awx/ui_next/src/screens/Job/JobOutput/shared/index.js b/awx/ui_next/src/screens/Job/JobOutput/shared/index.js deleted file mode 100644 index 3a2f81055d..0000000000 --- a/awx/ui_next/src/screens/Job/JobOutput/shared/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './MenuControls'; From 2a926fffd9a85fd0fe2a50d45d5cb8037b154d85 Mon Sep 17 00:00:00 2001 From: Jake McDermott Date: Thu, 8 Aug 2019 14:48:01 -0400 Subject: [PATCH 13/14] set default timezone to UTC for test runs --- awx/ui_next/package.json | 4 ++-- .../src/screens/Job/JobOutput/JobEvent.test.jsx | 10 ++-------- .../src/screens/Job/JobOutput/JobOutput.test.jsx | 10 +++++----- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/awx/ui_next/package.json b/awx/ui_next/package.json index 9a67f2ef02..2da2fd955d 100644 --- a/awx/ui_next/package.json +++ b/awx/ui_next/package.json @@ -5,8 +5,8 @@ "main": "index.jsx", "scripts": { "start": "webpack-dev-server --config ./webpack.config.js --mode development", - "test": "jest --coverage", - "test-watch": "jest --watch", + "test": "TZ='UTC' jest --coverage", + "test-watch": "TZ='UTC' jest --watch", "lint": "eslint --ext .js --ext .jsx .", "add-locale": "lingui add-locale", "extract-strings": "lingui extract", diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobEvent.test.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobEvent.test.jsx index d413f53726..5377edbc58 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobEvent.test.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobEvent.test.jsx @@ -24,12 +24,6 @@ const selectors = { lineText: 'JobEvent__JobEventLineText', }; -function tzHours(hours) { - const date = new Date(); - date.setUTCHours(hours); - return date.getHours(); -} - describe('', () => { test('initially renders successfully', () => { mountWithContexts(); @@ -39,7 +33,7 @@ describe('', () => { let wrapper = mountWithContexts(); let lineText = wrapper.find(selectors.lineText); expect( - lineText.filterWhere(e => e.html().includes(`${tzHours(18)}:11:22`)) + lineText.filterWhere(e => e.text().includes('18:11:22')) ).toHaveLength(1); const singleDigitTimestampEvent = { @@ -49,7 +43,7 @@ describe('', () => { wrapper = mountWithContexts(); lineText = wrapper.find(selectors.lineText); expect( - lineText.filterWhere(e => e.html().includes(`${tzHours(8)}:01:02`)) + lineText.filterWhere(e => e.text().includes('08:01:02')) ).toHaveLength(1); }); diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.test.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.test.jsx index 252416d580..7762efdb76 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.test.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.test.jsx @@ -8,7 +8,7 @@ import mockJobEventsData from './data.job_events.json'; jest.mock('@api'); async function checkOutput(wrapper, expectedLines) { - await waitForElement(wrapper, 'div[type="job_event"]', e => e.length > 1); + await waitForElement(wrapper, 'div[type="job_event"]', el => el.length > 1); const jobEventLines = wrapper.find('div[type="job_event_line_text"]'); const actualLines = []; jobEventLines.forEach(line => { @@ -65,9 +65,9 @@ describe('', () => { await waitForElement(wrapper, 'JobEvent', el => el.length > 0); await checkOutput(wrapper, [ '', - 'PLAY [all] *********************************************************************11:37:25', + 'PLAY [all] *********************************************************************15:37:25', '', - 'TASK [debug] *******************************************************************11:37:25', + 'TASK [debug] *******************************************************************15:37:25', 'ok: [localhost] => (item=1) => {', ' "msg": "This is a debug message: 1"', '}', @@ -171,7 +171,7 @@ describe('', () => { 'handleScrollLast' ); wrapper = mountWithContexts(); - await waitForElement(wrapper, 'EmptyStateBody', e => e.length === 0); + await waitForElement(wrapper, 'EmptyStateBody', el => el.length === 0); wrapper .find('JobOutput') .instance() @@ -190,7 +190,7 @@ describe('', () => { test('should throw error', async done => { JobsAPI.readEvents = () => Promise.reject(new Error()); wrapper = mountWithContexts(); - await waitForElement(wrapper, 'ContentError', e => e.length === 1); + await waitForElement(wrapper, 'ContentError', el => el.length === 1); done(); }); }); From 748bf63d4eebb9c77f72e45dfd66f0161481f54b Mon Sep 17 00:00:00 2001 From: Marliana Lara Date: Tue, 13 Aug 2019 12:38:38 -0400 Subject: [PATCH 14/14] Move job event line styles into a shared dir Set a field to avoid setState warnings Fix lint errors --- .../src/screens/Job/JobOutput/JobEvent.jsx | 80 ++++-------------- .../screens/Job/JobOutput/JobEvent.test.jsx | 2 +- .../Job/JobOutput/JobEventSkeleton.jsx | 84 ++++--------------- .../src/screens/Job/JobOutput/JobOutput.jsx | 65 ++++++++------ .../Job/JobOutput/shared/JobEventLine.jsx | 18 ++++ .../JobOutput/shared/JobEventLineNumber.jsx | 12 +++ .../Job/JobOutput/shared/JobEventLineText.jsx | 29 +++++++ .../JobOutput/shared/JobEventLineToggle.jsx | 17 ++++ .../screens/Job/JobOutput/shared/index.jsx | 4 + 9 files changed, 152 insertions(+), 159 deletions(-) create mode 100644 awx/ui_next/src/screens/Job/JobOutput/shared/JobEventLine.jsx create mode 100644 awx/ui_next/src/screens/Job/JobOutput/shared/JobEventLineNumber.jsx create mode 100644 awx/ui_next/src/screens/Job/JobOutput/shared/JobEventLineText.jsx create mode 100644 awx/ui_next/src/screens/Job/JobOutput/shared/JobEventLineToggle.jsx create mode 100644 awx/ui_next/src/screens/Job/JobOutput/shared/index.jsx diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx index 83ab56c811..4e41d50a90 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobEvent.jsx @@ -1,8 +1,13 @@ import Ansi from 'ansi-to-html'; import hasAnsi from 'has-ansi'; import Entities from 'html-entities'; -import styled from 'styled-components'; import React from 'react'; +import { + JobEventLine, + JobEventLineToggle, + JobEventLineNumber, + JobEventLineText, +} from './shared'; const EVENT_START_TASK = 'playbook_on_task_start'; const EVENT_START_PLAY = 'playbook_on_play_start'; @@ -32,65 +37,6 @@ const ansi = new Ansi({ }); const entities = new Entities.AllHtmlEntities(); -const JobEventWrapper = styled.div``; -const JobEventLine = styled.div` - display: flex; - - &:hover { - background-color: white; - } - - &:hover div { - background-color: white; - } - - &--hidden { - display: none; - } - ${({ isFirst }) => (isFirst ? 'padding-top: 10px;' : '')} -`; -const JobEventLineToggle = styled.div` - background-color: #ebebeb; - color: #646972; - display: flex; - flex: 0 0 30px; - font-size: 18px; - justify-content: center; - line-height: 12px; - - & > i { - cursor: pointer; - } - - user-select: none; -`; -const JobEventLineNumber = styled.div` - color: #161b1f; - background-color: #ebebeb; - flex: 0 0 45px; - text-align: right; - vertical-align: top; - padding-right: 5px; - border-right: 1px solid #d7d7d7; - user-select: none; -`; -const JobEventLineText = styled.div` - padding: 0 15px; - white-space: pre-wrap; - word-break: break-all; - word-wrap: break-word; - - .time { - font-size: 14px; - font-weight: 600; - user-select: none; - background-color: #ebebeb; - border-radius: 12px; - padding: 2px 10px; - margin-left: 15px; - } -`; - function getTimestamp({ created }) { const date = new Date(created); @@ -127,9 +73,17 @@ function getLineTextHtml({ created, event, start_line, stdout }) { }); } -function JobEvent({ counter, created, event, stdout, start_line, ...rest }) { +function JobEvent({ + counter, + created, + event, + stdout, + start_line, + style, + type, +}) { return !stdout ? null : ( - +
{getLineTextHtml({ created, event, start_line, stdout }).map( ({ lineNumber, html }) => lineNumber >= 0 && ( @@ -148,7 +102,7 @@ function JobEvent({ counter, created, event, stdout, start_line, ...rest }) { ) )} - +
); } diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobEvent.test.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobEvent.test.jsx index 5377edbc58..5ea70b8e47 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobEvent.test.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobEvent.test.jsx @@ -21,7 +21,7 @@ const mockRunnerOnOkEvent = { stdout: '\u001b[0;32mok: [localhost]\u001b[0m', }; const selectors = { - lineText: 'JobEvent__JobEventLineText', + lineText: 'JobEventLineText', }; describe('', () => { diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobEventSkeleton.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobEventSkeleton.jsx index 6eead9c4b0..1cae0c74df 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobEventSkeleton.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobEventSkeleton.jsx @@ -1,83 +1,29 @@ -import styled from 'styled-components'; import React from 'react'; - -const JobEventSkeletonWrapper = styled.div``; -const JobEventSkeletonLine = styled.div` - display: flex; - - &:hover { - background-color: white; - } - - &:hover div { - background-color: white; - } - - &--hidden { - display: none; - } -`; -const JobEventSkeletonLineToggle = styled.div` - background-color: #ebebeb; - color: #646972; - display: flex; - flex: 0 0 30px; - font-size: 18px; - justify-content: center; - line-height: 12px; - - & > i { - cursor: pointer; - } - - user-select: none; -`; -const JobEventSkeletonLineNumber = styled.div` - color: #161b1f; - background-color: #ebebeb; - flex: 0 0 45px; - text-align: right; - vertical-align: top; - padding-right: 5px; - border-right: 1px solid #b7b7b7; - user-select: none; -`; -const JobEventSkeletonContentWrapper = styled.div` - padding: 0 15px; - white-space: pre-wrap; - word-break: break-all; - word-wrap: break-word; - - .content { - background: var(--pf-global--disabled-color--200); - background: linear-gradient( - to right, - #f5f5f5 10%, - #e8e8e8 18%, - #f5f5f5 33% - ); - border-radius: 5px; - } -`; +import { + JobEventLine, + JobEventLineToggle, + JobEventLineNumber, + JobEventLineText, +} from './shared'; function JobEventSkeletonContent({ contentLength }) { return ( - + {' '.repeat(contentLength)} - +
); } -function JobEventSkeleton({ counter, contentLength, ...rest }) { +function JobEventSkeleton({ counter, contentLength, style }) { return ( counter > 1 && ( - - - - +
+ + + - - + +
) ); } diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx index 088f64b0ff..18508c1372 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx @@ -66,6 +66,7 @@ class JobOutput extends Component { defaultHeight: 25, }); + this._isMounted = false; this.loadJobEvents = this.loadJobEvents.bind(this); this.rowRenderer = this.rowRenderer.bind(this); this.handleScrollFirst = this.handleScrollFirst.bind(this); @@ -79,6 +80,7 @@ class JobOutput extends Component { } componentDidMount() { + this._isMounted = true; this.loadJobEvents(); } @@ -100,14 +102,19 @@ class JobOutput extends Component { } } + componentWillUnmount() { + this._isMounted = false; + } + async loadJobEvents() { const { job } = this.props; const loadRange = range(1, 50); - this.setState(({ currentlyLoading }) => ({ - hasContentLoading: true, - currentlyLoading: currentlyLoading.concat(loadRange), - })); + this._isMounted && + this.setState(({ currentlyLoading }) => ({ + hasContentLoading: true, + currentlyLoading: currentlyLoading.concat(loadRange), + })); try { const { data: { results: newResults = [], count }, @@ -115,19 +122,23 @@ class JobOutput extends Component { page_size: 50, order_by: 'start_line', }); - this.setState(({ results }) => { - newResults.forEach(jobEvent => { - results[jobEvent.counter] = jobEvent; + this._isMounted && + this.setState(({ results }) => { + newResults.forEach(jobEvent => { + results[jobEvent.counter] = jobEvent; + }); + return { results, remoteRowCount: count + 1 }; }); - return { results, remoteRowCount: count + 1 }; - }); } catch (err) { this.setState({ contentError: err }); } finally { - this.setState(({ currentlyLoading }) => ({ - hasContentLoading: false, - currentlyLoading: currentlyLoading.filter(n => !loadRange.includes(n)), - })); + this._isMounted && + this.setState(({ currentlyLoading }) => ({ + hasContentLoading: false, + currentlyLoading: currentlyLoading.filter( + n => !loadRange.includes(n) + ), + })); } } @@ -170,9 +181,10 @@ class JobOutput extends Component { const { job } = this.props; const loadRange = range(startIndex, stopIndex); - this.setState(({ currentlyLoading }) => ({ - currentlyLoading: currentlyLoading.concat(loadRange), - })); + this._isMounted && + this.setState(({ currentlyLoading }) => ({ + currentlyLoading: currentlyLoading.concat(loadRange), + })); const params = { counter__gte: startIndex, counter__lte: stopIndex, @@ -180,17 +192,18 @@ class JobOutput extends Component { }; return JobsAPI.readEvents(job.id, job.type, params).then(response => { - this.setState(({ results, currentlyLoading }) => { - response.data.results.forEach(jobEvent => { - results[jobEvent.counter] = jobEvent; + this._isMounted && + this.setState(({ results, currentlyLoading }) => { + response.data.results.forEach(jobEvent => { + results[jobEvent.counter] = jobEvent; + }); + return { + results, + currentlyLoading: currentlyLoading.filter( + n => !loadRange.includes(n) + ), + }; }); - return { - results, - currentlyLoading: currentlyLoading.filter( - n => !loadRange.includes(n) - ), - }; - }); }); } diff --git a/awx/ui_next/src/screens/Job/JobOutput/shared/JobEventLine.jsx b/awx/ui_next/src/screens/Job/JobOutput/shared/JobEventLine.jsx new file mode 100644 index 0000000000..5f48f8ad0a --- /dev/null +++ b/awx/ui_next/src/screens/Job/JobOutput/shared/JobEventLine.jsx @@ -0,0 +1,18 @@ +import styled from 'styled-components'; + +export default styled.div` + display: flex; + + &:hover { + background-color: white; + } + + &:hover div { + background-color: white; + } + + &--hidden { + display: none; + } + ${({ isFirst }) => (isFirst ? 'padding-top: 10px;' : '')} +`; diff --git a/awx/ui_next/src/screens/Job/JobOutput/shared/JobEventLineNumber.jsx b/awx/ui_next/src/screens/Job/JobOutput/shared/JobEventLineNumber.jsx new file mode 100644 index 0000000000..52b3c4b670 --- /dev/null +++ b/awx/ui_next/src/screens/Job/JobOutput/shared/JobEventLineNumber.jsx @@ -0,0 +1,12 @@ +import styled from 'styled-components'; + +export default styled.div` + color: #161b1f; + background-color: #ebebeb; + flex: 0 0 45px; + text-align: right; + vertical-align: top; + padding-right: 5px; + border-right: 1px solid #d7d7d7; + user-select: none; +`; diff --git a/awx/ui_next/src/screens/Job/JobOutput/shared/JobEventLineText.jsx b/awx/ui_next/src/screens/Job/JobOutput/shared/JobEventLineText.jsx new file mode 100644 index 0000000000..71f80a3134 --- /dev/null +++ b/awx/ui_next/src/screens/Job/JobOutput/shared/JobEventLineText.jsx @@ -0,0 +1,29 @@ +import styled from 'styled-components'; + +export default styled.div` + padding: 0 15px; + white-space: pre-wrap; + word-break: break-all; + word-wrap: break-word; + + .time { + font-size: 14px; + font-weight: 600; + user-select: none; + background-color: #ebebeb; + border-radius: 12px; + padding: 2px 10px; + margin-left: 15px; + } + + .content { + background: var(--pf-global--disabled-color--200); + background: linear-gradient( + to right, + #f5f5f5 10%, + #e8e8e8 18%, + #f5f5f5 33% + ); + border-radius: 5px; + } +`; diff --git a/awx/ui_next/src/screens/Job/JobOutput/shared/JobEventLineToggle.jsx b/awx/ui_next/src/screens/Job/JobOutput/shared/JobEventLineToggle.jsx new file mode 100644 index 0000000000..45ee8ffc94 --- /dev/null +++ b/awx/ui_next/src/screens/Job/JobOutput/shared/JobEventLineToggle.jsx @@ -0,0 +1,17 @@ +import styled from 'styled-components'; + +export default styled.div` + background-color: #ebebeb; + color: #646972; + display: flex; + flex: 0 0 30px; + font-size: 18px; + justify-content: center; + line-height: 12px; + + & > i { + cursor: pointer; + } + + user-select: none; +`; diff --git a/awx/ui_next/src/screens/Job/JobOutput/shared/index.jsx b/awx/ui_next/src/screens/Job/JobOutput/shared/index.jsx new file mode 100644 index 0000000000..d0edeb8e1f --- /dev/null +++ b/awx/ui_next/src/screens/Job/JobOutput/shared/index.jsx @@ -0,0 +1,4 @@ +export { default as JobEventLine } from './JobEventLine'; +export { default as JobEventLineToggle } from './JobEventLineToggle'; +export { default as JobEventLineNumber } from './JobEventLineNumber'; +export { default as JobEventLineText } from './JobEventLineText';