Add models for remaining event types

This commit is contained in:
gconsidine
2018-02-01 09:59:10 -05:00
committed by Jake McDermott
parent e5187e4ac8
commit 52a6cca206
7 changed files with 132 additions and 47 deletions

View File

@@ -4,7 +4,6 @@ import hasAnsi from 'has-ansi';
let vm; let vm;
let ansi; let ansi;
let job; let job;
let jobEvent;
let container; let container;
let $timeout; let $timeout;
let $sce; let $sce;
@@ -18,7 +17,6 @@ const meta = {
page: {} page: {}
}; };
const ROW_LIMIT = 200;
const PAGE_LIMIT = 3; const PAGE_LIMIT = 3;
const SCROLL_BUFFER = 250; const SCROLL_BUFFER = 250;
const SCROLL_LOAD_DELAY = 250; const SCROLL_LOAD_DELAY = 250;
@@ -41,7 +39,6 @@ const TIME_EVENTS = [
function JobsIndexController ( function JobsIndexController (
_job_, _job_,
JobEventModel,
_$sce_, _$sce_,
_$timeout_, _$timeout_,
_$scope_, _$scope_,
@@ -56,10 +53,10 @@ function JobsIndexController (
job = _job_; job = _job_;
ansi = new Ansi(); ansi = new Ansi();
jobEvent = new JobEventModel();
const events = job.get('related.job_events.results'); const events = job.get('related.job_events.results');
const html = $sce.trustAsHtml(parseEvents(events)); const parsed = parseEvents(events);
const html = $sce.trustAsHtml(parsed.html);
vm = this || {}; vm = this || {};
@@ -87,7 +84,7 @@ function JobsIndexController (
meta.page.cache = [{ meta.page.cache = [{
page: 1, page: 1,
count: events.length lines: parsed.lines
}]; }];
$timeout(() => { $timeout(() => {
@@ -118,11 +115,9 @@ function next () {
} }
meta.page.cache.push({ meta.page.cache.push({
page: data.page, page: data.page
count: data.results.length
}); });
console.log(data.results);
return shift() return shift()
.then(() => append(data.results)); .then(() => append(data.results));
}); });
@@ -138,7 +133,6 @@ function prev () {
}; };
console.log('[2] getting previous page', config.page, meta.page.cache); console.log('[2] getting previous page', config.page, meta.page.cache);
return job.goToPage(config) return job.goToPage(config)
.then(data => { .then(data => {
if (!data || !data.results) { if (!data || !data.results) {
@@ -146,8 +140,7 @@ function prev () {
} }
meta.page.cache.unshift({ meta.page.cache.unshift({
page: data.page, page: data.page
count: data.results.length
}); });
return pop() return pop()
@@ -202,8 +195,12 @@ function append (events) {
console.log('[4] appending next page'); console.log('[4] appending next page');
return $q(resolve => { return $q(resolve => {
const rows = $($sce.getTrustedHtml($sce.trustAsHtml(parseEvents(events)))); const parsed = parseEvents(events);
const rows = $($sce.getTrustedHtml($sce.trustAsHtml(parsed.html)));
const table = $(ELEMENT_TBODY); const table = $(ELEMENT_TBODY);
const index = meta.page.cache.length - 1;
meta.page.cache[index].lines = parsed.lines;
table.append(rows); table.append(rows);
$compile(rows.contents())($scope); $compile(rows.contents())($scope);
@@ -217,12 +214,11 @@ function prepend (events) {
console.log('[4] prepending next page'); console.log('[4] prepending next page');
return $q(resolve => { return $q(resolve => {
const rows = $($sce.getTrustedHtml($sce.trustAsHtml(parseEvents(events)))); const parsed = parseEvents(events);
const rows = $($sce.getTrustedHtml($sce.trustAsHtml(parsed.html)));
const table = $(ELEMENT_TBODY); const table = $(ELEMENT_TBODY);
// Set row count added meta.page.cache[0].lines = parsed.lines;
// pop number of rows (not number of events)
// meta.page.cache[0].rows = rows.length;
table.prepend(rows); table.prepend(rows);
$compile(rows.contents())($scope); $compile(rows.contents())($scope);
@@ -243,7 +239,7 @@ function pop () {
const ejected = meta.page.cache.pop(); const ejected = meta.page.cache.pop();
console.log('[3.1] popping', ejected); console.log('[3.1] popping', ejected);
const rows = $(ELEMENT_TBODY).children().slice(-ejected.count); const rows = $(ELEMENT_TBODY).children().slice(-ejected.lines);
rows.empty(); rows.empty();
rows.remove(); rows.remove();
@@ -264,7 +260,7 @@ function shift () {
const ejected = meta.page.cache.shift(); const ejected = meta.page.cache.shift();
console.log('[3.1] shifting', ejected); console.log('[3.1] shifting', ejected);
const rows = $(ELEMENT_TBODY).children().slice(0, ejected.count); const rows = $(ELEMENT_TBODY).children().slice(0, ejected.lines);
rows.empty(); rows.empty();
rows.remove(); rows.remove();
@@ -288,9 +284,22 @@ function scrollTo (direction) {
} }
function parseEvents (events) { function parseEvents (events) {
let lines = 0;
let html = '';
events.sort(orderByLineNumber); events.sort(orderByLineNumber);
return events.reduce((html, event) => `${html}${parseLine(event)}`, ''); events.forEach(event => {
const line = parseLine(event);
html += line.html;
lines += line.count;
});
return {
html,
lines
};
} }
function orderByLineNumber (a, b) { function orderByLineNumber (a, b) {
@@ -307,17 +316,18 @@ function orderByLineNumber (a, b) {
function parseLine (event) { function parseLine (event) {
if (!event || !event.stdout) { if (!event || !event.stdout) {
return ''; return { html: '', count: 0 };
} }
const { stdout } = event; const { stdout } = event;
const lines = stdout.split('\r\n'); const lines = stdout.split('\r\n');
let count = lines.length;
let ln = event.start_line; let ln = event.start_line;
const current = createRecord(ln, lines, event); const current = createRecord(ln, lines, event);
return lines.reduce((html, line, i) => { const html = lines.reduce((html, line, i) => {
ln++; ln++;
const isLastLine = i === lines.length - 1; const isLastLine = i === lines.length - 1;
@@ -325,10 +335,13 @@ function parseLine (event) {
if (current && current.isTruncated && isLastLine) { if (current && current.isTruncated && isLastLine) {
row += createRow(current); row += createRow(current);
count++;
} }
return `${html}${row}`; return `${html}${row}`;
}, ''); }, '');
return { html, count };
} }
function createRecord (ln, lines, event) { function createRecord (ln, lines, event) {
@@ -541,7 +554,6 @@ function onScroll () {
JobsIndexController.$inject = [ JobsIndexController.$inject = [
'job', 'job',
'JobEventModel',
'$sce', '$sce',
'$timeout', '$timeout',
'$scope', '$scope',

View File

@@ -10,10 +10,48 @@ const indexTemplate = require('~features/output/index.view.html');
const MODULE_NAME = 'at.features.output'; const MODULE_NAME = 'at.features.output';
function resolveJob (Job, ProjectUpdate, AdHocCommand, SystemJob, WorkflowJob, $stateParams) {
const { id } = $stateParams;
const { type } = $stateParams;
let Resource;
switch (type) {
case 'project':
Resource = ProjectUpdate;
break;
case 'playbook':
Resource = Job;
break;
case 'command':
Resource = AdHocCommand;
break;
case 'system':
Resource = SystemJob;
break;
case 'workflow':
Resource = WorkflowJob;
break;
default:
// Redirect
return null;
}
return new Resource('get', id)
.then(resource => resource.extend('job_events', {
pageCache: true,
pageLimit: 3,
params: {
page_size: 100,
order_by: 'start_line'
}
}));
}
function JobsRun ($stateExtender, strings) { function JobsRun ($stateExtender, strings) {
$stateExtender.addState({ $stateExtender.addState({
name: 'jobz', name: 'jobz',
route: '/jobz/:id', route: '/jobz/:type/:id',
ncyBreadcrumb: { ncyBreadcrumb: {
label: strings.get('state.TITLE') label: strings.get('state.TITLE')
}, },
@@ -29,19 +67,15 @@ function JobsRun ($stateExtender, strings) {
} }
}, },
resolve: { resolve: {
job: ['JobModel', '$stateParams', (Jobs, $stateParams) => { job: [
const { id } = $stateParams; 'JobModel',
'ProjectUpdateModel',
return new Jobs('get', id) 'AdHocCommandModel',
.then(job => job.extend('job_events', { 'SystemJobModel',
pageCache: true, 'WorkflowJobModel',
pageLimit: 3, '$stateParams',
params: { resolveJob
page_size: 100, ]
order_by: 'start_line'
},
}));
}]
} }
}); });
} }

View File

@@ -1,5 +1,5 @@
let Base;
let $http; let $http;
let BaseModel;
function getRelaunch (params) { function getRelaunch (params) {
const req = { const req = {
@@ -20,7 +20,7 @@ function postRelaunch (params) {
} }
function AdHocCommandModel (method, resource, config) { function AdHocCommandModel (method, resource, config) {
Base.call(this, 'ad_hoc_commands'); BaseModel.call(this, 'ad_hoc_commands');
this.Constructor = AdHocCommandModel; this.Constructor = AdHocCommandModel;
this.postRelaunch = postRelaunch.bind(this); this.postRelaunch = postRelaunch.bind(this);
@@ -29,16 +29,16 @@ function AdHocCommandModel (method, resource, config) {
return this.create(method, resource, config); return this.create(method, resource, config);
} }
function AdHocCommandModelLoader (BaseModel, _$http_) { function AdHocCommandModelLoader (_$http_, _BaseModel_) {
Base = BaseModel;
$http = _$http_; $http = _$http_;
BaseModel = _BaseModel_;
return AdHocCommandModel; return AdHocCommandModel;
} }
AdHocCommandModelLoader.$inject = [ AdHocCommandModelLoader.$inject = [
'$http',
'BaseModel', 'BaseModel',
'$http'
]; ];
export default AdHocCommandModelLoader; export default AdHocCommandModelLoader;

View File

@@ -460,8 +460,6 @@ function goToPage (config) {
return $http(req) return $http(req)
.then(({ data }) => { .then(({ data }) => {
let ejected;
if (pageCache) { if (pageCache) {
pageCache[pageNumber] = data.results; pageCache[pageNumber] = data.results;
pagesInCache.push(pageNumber); pagesInCache.push(pageNumber);
@@ -469,7 +467,9 @@ function goToPage (config) {
if (pagesInCache.length > this.page.limit) { if (pagesInCache.length > this.page.limit) {
const pageToDelete = pagesInCache.shift(); const pageToDelete = pagesInCache.shift();
console.log(pageCache);
delete pageCache[pageToDelete]; delete pageCache[pageToDelete];
console.log(this.page.cache);
} }
} }

View File

@@ -0,0 +1,19 @@
let BaseModel;
function ProjectUpdateModel (method, resource, config) {
BaseModel.call(this, 'jobs');
this.Constructor = ProjectUpdateModel;
return this.create(method, resource, config);
}
function ProjectUpdateModelLoader (_BaseModel_) {
BaseModel = _BaseModel_;
return ProjectUpdateModel;
}
ProjectUpdateModelLoader.$inject = ['BaseModel'];
export default ProjectUpdateModelLoader;

View File

@@ -0,0 +1,19 @@
let BaseModel;
function SystemJobModel (method, resource, config) {
BaseModel.call(this, 'jobs');
this.Constructor = SystemJobModel;
return this.create(method, resource, config);
}
function SystemJobModelLoader (_BaseModel_) {
BaseModel = _BaseModel_;
return SystemJobModel;
}
SystemJobModelLoader.$inject = ['BaseModel'];
export default SystemJobModelLoader;

View File

@@ -14,12 +14,13 @@ import InventorySource from '~models/InventorySource';
import Job from '~models/Job'; import Job from '~models/Job';
import JobEvent from '~models/JobEvent'; import JobEvent from '~models/JobEvent';
import JobTemplate from '~models/JobTemplate'; import JobTemplate from '~models/JobTemplate';
import Jobs from '~models/Jobs';
import Me from '~models/Me'; import Me from '~models/Me';
import NotificationTemplate from '~models/NotificationTemplate'; import NotificationTemplate from '~models/NotificationTemplate';
import Organization from '~models/Organization'; import Organization from '~models/Organization';
import Project from '~models/Project'; import Project from '~models/Project';
import Schedule from '~models/Schedule'; import Schedule from '~models/Schedule';
import ProjectUpdate from '~models/ProjectUpdate';
import SystemJob from '~models/SystemJob';
import UnifiedJobTemplate from '~models/UnifiedJobTemplate'; import UnifiedJobTemplate from '~models/UnifiedJobTemplate';
import WorkflowJob from '~models/WorkflowJob'; import WorkflowJob from '~models/WorkflowJob';
import WorkflowJobTemplate from '~models/WorkflowJobTemplate'; import WorkflowJobTemplate from '~models/WorkflowJobTemplate';
@@ -48,18 +49,18 @@ angular
.service('JobEventModel', JobEvent) .service('JobEventModel', JobEvent)
.service('JobModel', Job) .service('JobModel', Job)
.service('JobTemplateModel', JobTemplate) .service('JobTemplateModel', JobTemplate)
.service('JobsModel', Jobs)
.service('MeModel', Me) .service('MeModel', Me)
.service('NotificationTemplate', NotificationTemplate) .service('NotificationTemplate', NotificationTemplate)
.service('OrganizationModel', Organization) .service('OrganizationModel', Organization)
.service('ProjectModel', Project) .service('ProjectModel', Project)
.service('ScheduleModel', Schedule) .service('ScheduleModel', Schedule)
.service('UnifiedJobModel', UnifiedJob) .service('UnifiedJobModel', UnifiedJob)
.service('ProjectUpdateModel', ProjectUpdate)
.service('SystemJobModel', SystemJob)
.service('UnifiedJobTemplateModel', UnifiedJobTemplate) .service('UnifiedJobTemplateModel', UnifiedJobTemplate)
.service('WorkflowJobModel', WorkflowJob) .service('WorkflowJobModel', WorkflowJob)
.service('WorkflowJobTemplateModel', WorkflowJobTemplate) .service('WorkflowJobTemplateModel', WorkflowJobTemplate)
.service('WorkflowJobTemplateNodeModel', WorkflowJobTemplateNode) .service('WorkflowJobTemplateNodeModel', WorkflowJobTemplateNode)
.service('WorkflowJobTemplateNodeModel', WorkflowJobTemplateNode)
.service('ModelsStrings', ModelsStrings); .service('ModelsStrings', ModelsStrings);
export default MODULE_NAME; export default MODULE_NAME;