Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Bindings view in Hooks create page #730

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
2936bca
Add Bindings view in Hooks create page
arshadkazmi42 May 12, 2019
641d42b
Create PulseBinding Component and use in PulseMessages and HookForm
arshadkazmi42 May 13, 2019
b8f864b
add static props in PulseBindings component
arshadkazmi42 May 17, 2019
f266cfc
Add binding to return from getDefinition
arshadkazmi42 May 17, 2019
5b9d224
Add bindings to payload
arshadkazmi42 May 23, 2019
f4984a0
Change routingKeyPattern to pattern for bindings in payload
arshadkazmi42 May 24, 2019
7776395
Change pattern to routingKeyPattern
arshadkazmi42 May 24, 2019
81ca99c
merge master
owlishDeveloper May 13, 2019
19a54e6
Add Create Worker Type button. Add Editor view
owlishDeveloper May 16, 2019
d623a5a
Define the workertype creation form
owlishDeveloper May 22, 2019
01ce1c8
Make the form functional
owlishDeveloper May 22, 2019
c9f2079
Cleanup
owlishDeveloper May 27, 2019
09636fd
Correct the provider config part of the component state
owlishDeveloper May 30, 2019
228f4f0
Change fetch query in webserver and change UI to render fetched values
arshadkazmi42 May 30, 2019
c9b3266
Rename worker type to worker pool
owlishDeveloper May 30, 2019
1d3da94
Implement review suggestions. Styling changes
owlishDeveloper May 31, 2019
af8de5e
More suggestions
owlishDeveloper May 31, 2019
eb645b9
Use different icon for Save button
owlishDeveloper May 31, 2019
a409b74
Change field labels. Add some useful styling
owlishDeveloper May 31, 2019
3d50fc2
Merge master
owlishDeveloper May 31, 2019
879ab4f
Finish merging master
owlishDeveloper May 31, 2019
34e753e
Finish merging master
owlishDeveloper May 31, 2019
9f06ab0
Return Dashboard. Remove button spacing for now. Remove some styles
owlishDeveloper Jun 1, 2019
bd061c2
Change imports
owlishDeveloper Jun 3, 2019
6d1929e
Replace FormLabel with ListSubheader. Ensure minimum width of the dro…
owlishDeveloper Jun 3, 2019
a9eeb15
Change name of a field. Change padding
owlishDeveloper Jun 3, 2019
6a7878e
Use vertical spacing instead of indentation to organize the form fields
owlishDeveloper Jun 3, 2019
9af784f
Add skeleton of worker-scanner tests
imbstack May 23, 2019
3f681f7
Add another check to provisioner testing
imbstack May 23, 2019
1cc3491
Add worker-scanner tests
imbstack May 28, 2019
bd28bd5
Parallelize coverage fetching
imbstack Jun 3, 2019
0936543
Add tests for reporting workerpool errors
imbstack Jun 3, 2019
3e35cea
Css cleanup, delete all bindings and save button enable fix
arshadkazmi42 Jun 4, 2019
a8980c3
Add minor changes
owlishDeveloper Jun 4, 2019
645cac1
Worker manager updates (#831)
imbstack Jun 4, 2019
9aa285d
Merge pull request #814 from owlishDeveloper/bug1542905-3
owlishDeveloper Jun 4, 2019
d28d642
Don't specify an explicit PORT for tc-web-ui
djmitche Jun 4, 2019
949fbc5
Merge pull request #836 from djmitche/no-explicit-PORT-for-web-ui
djmitche Jun 4, 2019
21fd0ef
Make setTimeout work with large timeout values (#838)
helfi92 Jun 4, 2019
989c444
Add Bindings view in Hooks create page
arshadkazmi42 May 12, 2019
3bbbb11
Create PulseBinding Component and use in PulseMessages and HookForm
arshadkazmi42 May 13, 2019
76a6f49
add static props in PulseBindings component
arshadkazmi42 May 17, 2019
019d25c
Add binding to return from getDefinition
arshadkazmi42 May 17, 2019
023761b
Add bindings to payload
arshadkazmi42 May 23, 2019
a31db51
Change routingKeyPattern to pattern for bindings in payload
arshadkazmi42 May 24, 2019
61a4307
Change pattern to routingKeyPattern
arshadkazmi42 May 24, 2019
16d71d2
Change fetch query in webserver and change UI to render fetched values
arshadkazmi42 May 30, 2019
badc0a3
Css cleanup, delete all bindings and save button enable fix
arshadkazmi42 Jun 4, 2019
bf4c6e0
Merge branch 'bindings-hook-view' of https://github.com/arshadkazmi42…
arshadkazmi42 Jun 5, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 0 additions & 1 deletion infrastructure/terraform/web-ui.tf
Expand Up @@ -4,7 +4,6 @@ module "web_ui_secrets" {

secrets = {
APPLICATION_NAME = "Taskcluster"
PORT = ""
GRAPHQL_ENDPOINT = "${var.root_url}/graphql"
GRAPHQL_SUBSCRIPTION_ENDPOINT = "${var.root_url}/subscription"

Expand Down
1 change: 0 additions & 1 deletion libraries/testing/src/time.js
Expand Up @@ -25,7 +25,6 @@ exports.runWithFakeTime = (fn, {mock=true, maxTime=30000, ...zurvanOptions}={})
});

let finished, err;
this.slow(maxTime);
fn.apply(this, []).then(
() => {
finished = true;
Expand Down
12 changes: 12 additions & 0 deletions services/web-server/src/graphql/Hooks.graphql
Expand Up @@ -51,6 +51,7 @@ type HookStatus {
type Hook {
hookGroupId: ID!
hookId: ID!
bindings: [HookBinding]
metadata: HookMetadata!
schedule: [String]!
task: JSON!
Expand All @@ -72,11 +73,22 @@ type DeleteHook {
hookId: ID
}

type HookBinding {
exchange: String!
routingKeyPattern: String!
}

input HookBindingInput {
exchange: String!
routingKeyPattern: String!
}

input HookInput {
metadata: HookMetadataInput!
schedule: [String]
expires: String
deadline: String
bindings: [HookBindingInput]
task: JSON!
triggerSchema: JSON
}
Expand Down
2 changes: 1 addition & 1 deletion services/worker-manager/src/data.js
Expand Up @@ -104,7 +104,7 @@ WorkerPool.expire = async function(monitor) {
});
};

WorkerPool.prototype.reportError = async function({kind, title, description, extra={}, notify}) {
WorkerPool.prototype.reportError = async function({kind, title, description, extra={}, notify, WorkerPoolError}) {
if (this.emailOnError) {
let extraInfo = '';
if (Object.keys(extra).length) {
Expand Down
6 changes: 3 additions & 3 deletions services/worker-manager/src/main.js
Expand Up @@ -182,10 +182,10 @@ let load = loader({
},

providers: {
requires: ['cfg', 'monitor', 'notify', 'estimator', 'Worker', 'WorkerPool', 'schemaset'],
setup: async ({cfg, monitor, notify, estimator, Worker, WorkerPool, schemaset}) =>
requires: ['cfg', 'monitor', 'notify', 'estimator', 'Worker', 'WorkerPool', 'WorkerPoolError', 'schemaset'],
setup: async ({cfg, monitor, notify, estimator, Worker, WorkerPool, WorkerPoolError, schemaset}) =>
new Providers().setup({
cfg, monitor, notify, estimator, Worker, WorkerPool,
cfg, monitor, notify, estimator, Worker, WorkerPool, WorkerPoolError,
validator: await schemaset.validator(cfg.taskcluster.rootUrl),
}),
},
Expand Down
6 changes: 5 additions & 1 deletion services/worker-manager/src/providers/google.js
Expand Up @@ -24,6 +24,7 @@ class GoogleProvider extends Provider {
validator,
Worker,
WorkerPool,
WorkerPoolError,
fake = false,
}) {
super({
Expand All @@ -33,9 +34,10 @@ class GoogleProvider extends Provider {
notify,
rootUrl,
estimator,
Worker,
validator,
Worker,
WorkerPool,
WorkerPoolError,
});
this.configSchema = 'config-google';
this.fake = fake;
Expand Down Expand Up @@ -374,6 +376,7 @@ class GoogleProvider extends Provider {
title: 'Instance Creation Error',
description: error.message, // TODO: Make sure we clear exposing this with security folks
notify: this.notify,
WorkerPoolError: this.WorkerPoolError,
});
}
return;
Expand Down Expand Up @@ -481,6 +484,7 @@ class GoogleProvider extends Provider {
code: err.code,
},
notify: this.notify,
WorkerPoolError: this.WorkerPoolError,
});
}
}
Expand Down
5 changes: 3 additions & 2 deletions services/worker-manager/src/providers/index.js
Expand Up @@ -3,7 +3,7 @@
* their providerType implementation as required
*/
class Providers {
async setup({cfg, monitor, notify, estimator, Worker, WorkerPool, validator}) {
async setup({cfg, monitor, notify, estimator, Worker, WorkerPool, WorkerPoolError, validator}) {
this._providers = {};

if (cfg.providers['null-provider']) {
Expand All @@ -26,12 +26,13 @@ class Providers {
const provider = new Provider({
providerId,
notify,
monitor: monitor.childMonitor(providerId),
monitor: monitor.childMonitor(`provider.${providerId}`),
rootUrl: cfg.taskcluster.rootUrl,
taskclusterCredentials: cfg.taskcluster.credentials,
estimator,
Worker,
WorkerPool,
WorkerPoolError,
validator,
...meta,
});
Expand Down
4 changes: 3 additions & 1 deletion services/worker-manager/src/providers/provider.js
Expand Up @@ -16,9 +16,10 @@ class Provider {
rootUrl,
taskclusterCredentials,
estimator,
Worker,
validator,
Worker,
WorkerPool,
WorkerPoolError,
}) {
this.providerId = providerId;
this.monitor = monitor;
Expand All @@ -29,6 +30,7 @@ class Provider {
this.estimator = estimator;
this.Worker = Worker;
this.WorkerPool = WorkerPool;
this.WorkerPoolError = WorkerPoolError;
}

/**
Expand Down
18 changes: 18 additions & 0 deletions services/worker-manager/src/providers/testing.js
Expand Up @@ -17,6 +17,24 @@ class TestingProvider extends Provider {
async removeResources({workerPool}) {
this.monitor.notice('remove-resource', {workerPoolId: workerPool.workerPoolId});
}

async provision({workerPool}) {
this.monitor.notice('test-provision', {workerPoolId: workerPool.workerPoolId});
}

async scanPrepare() {
this.monitor.notice('scan-prepare', {});
}

async checkWorker({worker}) {
await worker.modify(w => {
w.providerData.checked = true;
});
}

async scanCleanup() {
this.monitor.notice('scan-cleanup', {});
}
}

module.exports = {
Expand Down
6 changes: 3 additions & 3 deletions services/worker-manager/src/worker-scanner.js
Expand Up @@ -41,16 +41,16 @@ class WorkerScanner {
}

async scan() {
await Promise.all(Object.values(this.providers).map(x => x.scanPrepare()));
await this.providers.forAll(p => p.scanPrepare());
await this.Worker.scan({
state: Entity.op.notEqual(this.Worker.states.STOPPED),
}, {
handler: async worker => {
const provider = this.providers[worker.providerId];
const provider = this.providers.get(worker.providerId);
await provider.checkWorker({worker});
},
});
await Promise.all(Object.values(this.providers).map(x => x.scanCleanup()));
await this.providers.forAll(p => p.scanCleanup());
}
}

Expand Down
28 changes: 28 additions & 0 deletions services/worker-manager/test/helper.js
Expand Up @@ -69,6 +69,34 @@ exports.withProvisioner = (mock, skipping) => {
});
};

exports.withWorkerScanner = (mock, skipping) => {
let scanner;

suiteSetup(async function() {
if (skipping()) {
return;
}
exports.initiateWorkerScanner = async () => {
scanner = await exports.load('workerScanner');
// remove it right away, as it is started on load
exports.load.remove('workerScanner');
return scanner;
};
exports.terminateWorkerScanner = async () => {
if (scanner) {
await scanner.terminate();
scanner = null;
}
};
});

teardown(function() {
if (scanner) {
throw new Error('Must call terminateWorkerScanner if you have started it');
}
});
};

/**
* Set up a fake tc-queue object that supports only the `pendingTasks` method,
* and inject that into the loader. This is injected regardless of
Expand Down
16 changes: 12 additions & 4 deletions services/worker-manager/test/provisioner_test.js
Expand Up @@ -37,6 +37,14 @@ helper.secrets.mockSuite(testing.suiteName(), ['taskcluster', 'azure'], function
Fields: {workerPoolId: wt.workerPoolId, providerId: wt.input.providerId, v: 1},
Severity: LEVELS.info,
});
assert.deepEqual(
monitorManager.messages.find(
msg => msg.Type === 'test-provision' && msg.Fields.workerPoolId === wt.workerPoolId), {
Logger: `taskcluster.worker-manager.provider.${wt.input.providerId}`,
Type: 'test-provision',
Fields: {workerPoolId: wt.workerPoolId},
Severity: LEVELS.notice,
});
}));
});
await helper.terminateProvisioner();
Expand Down Expand Up @@ -144,7 +152,7 @@ helper.secrets.mockSuite(testing.suiteName(), ['taskcluster', 'azure'], function
routes: [],
});
assert.deepEqual(monitorManager.messages.find(msg => msg.Type === 'create-resource'), {
Logger: 'taskcluster.worker-manager.testing1',
Logger: 'taskcluster.worker-manager.provider.testing1',
Type: 'create-resource',
Severity: LEVELS.notice,
Fields: {workerPoolId: 'pp/foo'},
Expand Down Expand Up @@ -176,7 +184,7 @@ helper.secrets.mockSuite(testing.suiteName(), ['taskcluster', 'azure'], function
routes: [],
});
assert.deepEqual(monitorManager.messages.find(msg => msg.Type === 'update-resource'), {
Logger: 'taskcluster.worker-manager.testing1',
Logger: 'taskcluster.worker-manager.provider.testing1',
Type: 'update-resource',
Severity: LEVELS.notice,
Fields: {workerPoolId: 'pp/foo'},
Expand All @@ -198,13 +206,13 @@ helper.secrets.mockSuite(testing.suiteName(), ['taskcluster', 'azure'], function
routes: [],
});
assert.deepEqual(monitorManager.messages.find(msg => msg.Type === 'remove-resource'), {
Logger: 'taskcluster.worker-manager.testing1',
Logger: 'taskcluster.worker-manager.provider.testing1',
Type: 'remove-resource',
Severity: LEVELS.notice,
Fields: {workerPoolId: 'pp/foo'},
});
assert.deepEqual(monitorManager.messages.find(msg => msg.Type === 'create-resource'), {
Logger: 'taskcluster.worker-manager.testing2',
Logger: 'taskcluster.worker-manager.provider.testing2',
Type: 'create-resource',
Severity: LEVELS.notice,
Fields: {workerPoolId: 'pp/foo'},
Expand Down
54 changes: 54 additions & 0 deletions services/worker-manager/test/worker_pool_errors.js
@@ -0,0 +1,54 @@
const slugid = require('slugid');
const assert = require('assert');
const helper = require('./helper');
const testing = require('taskcluster-lib-testing');

helper.secrets.mockSuite(testing.suiteName(), ['taskcluster', 'azure'], function(mock, skipping) {
helper.withEntities(mock, skipping);
helper.withPulse(mock, skipping);
helper.withFakeNotify(mock, skipping);

test('create worker pool error', async function() {
await helper.WorkerPoolError.create({
workerPoolId: 'baz/foo',
errorId: slugid.v4(),
reported: new Date(),
kind: 'abc',
title: 'ABC',
description: 'ay bee see',
extra: {},
});

const errors = await helper.WorkerPoolError.scan({}, {});
assert.equal(errors.entries.length, 1);
});

test('report errors (no email)', async function() {
const wp = await helper.WorkerPool.create({
workerPoolId: 'ww/tt',
providerId: 'testing1',
description: 'none',
previousProviderIds: [],
scheduledForDeletion: false,
created: new Date(),
lastModified: new Date(),
config: {
},
owner: 'whatever@example.com',
providerData: {},
emailOnError: false,
});

await wp.reportError({
kind: 'something-error',
title: 'And Error about Something',
description: 'WHO KNOWS',
notify: helper.notify,
WorkerPoolError: helper.WorkerPoolError,
});

const errors = await helper.WorkerPoolError.scan({}, {});
assert.equal(errors.entries.length, 1);
assert.equal(errors.entries[0].workerPoolId, 'ww/tt');
});
});