Skip to content

Commit 87c5b35

Browse files
author
Miles Crabill
authored
Merge pull request #2464 from milescrabill/bug-1591476-registerworker-returns-worker-config
bug 1591476: registerWorker() returns workerConfig
2 parents 2e4075a + d5242b3 commit 87c5b35

File tree

24 files changed

+163
-24
lines changed

24 files changed

+163
-24
lines changed

changelog/bug-1591476.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
level: patch
2+
reference: bug 1591476
3+
---
4+
worker-manager's `registerWorker()` now returns worker config, and worker-runner (for Azure and static providers, others coming soon) merges that configuration with other configuration sources. This allows worker pools to include configuration for static workers, and allows Azure workers to fetch their config without referencing the non-functional customData instance metadata.

clients/client-go/tcworkermanager/types.go

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

generated/references.json

Lines changed: 14 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

services/worker-manager/schemas/v1/config-static.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,13 @@ additionalProperties: false
66
required: []
77
properties:
88
lifecycle: {$ref: 'worker-lifecycle.json#'}
9+
workerConfig:
10+
title: Worker Config
11+
type: object
12+
additionalProperties: true
13+
description: |
14+
This value is supplied unchanged to the worker from the provider configuration.
15+
The expectation is that the worker will merge this information with configuration from other sources,
16+
and this is precisely what [taskcluster-worker-runner](https://github.com/taskcluster/taskcluster-worker-runner) does.
17+
This property must not be used for secret configuration, as it is visible both in the worker pool configuration and in the worker instance's metadata.
18+
Instead, put secret configuration in the [secrets service](https://github.com/taskcluster/taskcluster-worker-runner#secrets).

services/worker-manager/schemas/v1/register-worker-response.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,18 @@ properties:
3636
required:
3737
- accessToken
3838
- clientId
39+
workerConfig:
40+
type: object
41+
title: Worker Config
42+
additionalProperties: true
43+
description: |
44+
This value is supplied unchanged to the worker from the worker-pool configuration.
45+
The expectation is that the worker will merge this information with configuration from other sources,
46+
and this is precisely what [taskcluster-worker-runner](https://github.com/taskcluster/taskcluster-worker-runner) does.
47+
This property must not be used for secret configuration, as it is visible both in the worker pool configuration and in the worker instance's metadata.
48+
Instead, put secret configuration in the [secrets service](https://github.com/taskcluster/taskcluster-worker-runner#secrets).
3949
additionalProperties: false
4050
required:
4151
- expires
4252
- credentials
53+
- workerConfig

services/worker-manager/src/api.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -647,10 +647,11 @@ builder.declare({
647647
`Worker ${workerGroup}/${workerId} does not have provider ${providerId}`, {});
648648
}
649649

650-
let expires;
650+
let expires, workerConfig;
651651
try {
652652
const reg = await provider.registerWorker({worker, workerPool, workerIdentityProof});
653653
expires = reg.expires;
654+
workerConfig = reg.workerConfig;
654655
} catch (err) {
655656
if (!(err instanceof ApiError)) {
656657
throw err;
@@ -682,5 +683,5 @@ builder.declare({
682683
credentials: this.cfg.taskcluster.credentials,
683684
});
684685

685-
return res.reply({expires: expires.toJSON(), credentials});
686+
return res.reply({expires: expires.toJSON(), credentials, workerConfig});
686687
});

services/worker-manager/src/providers/aws.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ class AwsProvider extends Provider {
225225
stateReason: i.StateReason.Message,
226226
terminateAfter,
227227
reregistrationTimeout,
228+
workerConfig: config.workerConfig || {},
228229
},
229230
});
230231
}));
@@ -275,7 +276,8 @@ class AwsProvider extends Provider {
275276
w.providerData.terminateAfter = expires.getTime();
276277
});
277278

278-
return {expires};
279+
const workerConfig = worker.providerData.workerConfig || {};
280+
return {expires, workerConfig};
279281
}
280282

281283
async checkWorker({worker}) {

services/worker-manager/src/providers/azure.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ class AzureProvider extends Provider {
200200
let providerData = {
201201
location: cfg.location,
202202
resourceGroupName: this.providerConfig.resourceGroupName,
203+
workerConfig: cfg.workerConfig,
203204
vm: {
204205
name: virtualMachineName,
205206
computerName,
@@ -375,8 +376,8 @@ class AzureProvider extends Provider {
375376
w.state = this.Worker.states.RUNNING;
376377
w.providerData.terminateAfter = expires.getTime();
377378
});
378-
379-
return {expires};
379+
const workerConfig = worker.providerData.workerConfig || {};
380+
return {expires, workerConfig};
380381
}
381382

382383
async scanPrepare() {

services/worker-manager/src/providers/google.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,8 @@ class GoogleProvider extends Provider {
158158
});
159159

160160
// assume for the moment that workers self-terminate before 96 hours
161-
return {expires};
161+
const workerConfig = worker.providerData.workerConfig || {};
162+
return {expires, workerConfig};
162163
}
163164

164165
async deprovision({workerPool}) {
@@ -324,6 +325,7 @@ class GoogleProvider extends Provider {
324325
},
325326
terminateAfter,
326327
reregistrationTimeout, // Record this for later reregistrations so that we can recalculate deadline
328+
workerConfig: cfg.workerConfig || {},
327329
},
328330
});
329331
}));

services/worker-manager/src/providers/static.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class StaticProvider extends Provider {
2727
expires: new Date(input.expires),
2828
capacity: input.capacity,
2929
state: Worker.states.RUNNING,
30-
providerData: {staticSecret},
30+
providerData: {staticSecret, workerConfig: workerPool.config.workerConfig},
3131
};
3232

3333
let worker;
@@ -71,8 +71,8 @@ class StaticProvider extends Provider {
7171
} else {
7272
expires = taskcluster.fromNow('96 hours');
7373
}
74-
75-
return {expires};
74+
const workerConfig = worker.providerData.workerConfig || {};
75+
return {expires, workerConfig};
7676
}
7777
}
7878

services/worker-manager/src/providers/testing.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ class TestingProvider extends Provider {
5656
if (worker.providerData.noExpiry) {
5757
return {};
5858
}
59-
return {expires: taskcluster.fromNow('1 hour')};
59+
const workerConfig = worker.providerData.workerConfig || {};
60+
return {expires: taskcluster.fromNow('1 hour'), workerConfig};
6061
}
6162

6263
async createWorker({workerPool, workerGroup, workerId, input}) {

services/worker-manager/test/api_test.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,6 +1050,11 @@ helper.secrets.mockSuite(testing.suiteName(), ['azure'], function(mock, skipping
10501050
});
10511051
await helper.Worker.create({
10521052
...defaultWorker,
1053+
providerData: {
1054+
workerConfig: {
1055+
"someKey": "someValue",
1056+
},
1057+
},
10531058
});
10541059
const res = await helper.workerManager.registerWorker({
10551060
...defaultRegisterWorker,
@@ -1058,6 +1063,8 @@ helper.secrets.mockSuite(testing.suiteName(), ['azure'], function(mock, skipping
10581063
assert.equal(res.credentials.clientId,
10591064
`worker/${providerId}/${workerPoolId}/${workerGroup}/${workerId}`);
10601065

1066+
assert.equal(res.workerConfig.someKey, "someValue");
1067+
10611068
// cheat a little and look in the certificate to check the scopes
10621069
const scopes = new Set(JSON.parse(res.credentials.certificate).scopes);
10631070
const msg = `got scopes ${[...scopes].join(', ')}`;

services/worker-manager/test/provider_aws_test.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,9 @@ helper.secrets.mockSuite(testing.suiteName(), ['azure'], function(mock, skipping
402402
availabilityZone: 'us-west-2a',
403403
privateIp: '172.31.23.159',
404404
owner: actualWorkerIid.accountId,
405+
workerConfig: {
406+
"someConfig": "someConfigValue",
407+
},
405408
},
406409
});
407410

@@ -413,6 +416,7 @@ helper.secrets.mockSuite(testing.suiteName(), ['azure'], function(mock, skipping
413416
const resp = await provider.registerWorker({worker: runningWorker, workerPool, workerIdentityProof});
414417
assert(resp.expires - new Date() + 10000 > 96 * 3600 * 1000);
415418
assert(resp.expires - new Date() - 10000 < 96 * 3600 * 1000);
419+
assert.equal(resp.workerConfig.someConfig, 'someConfigValue');
416420

417421
sinon.restore();
418422
});
@@ -430,6 +434,9 @@ helper.secrets.mockSuite(testing.suiteName(), ['azure'], function(mock, skipping
430434
availabilityZone: 'us-west-2a',
431435
privateIp: '172.31.23.159',
432436
owner: actualWorkerIid.accountId,
437+
workerConfig: {
438+
'someKey': 'someValue',
439+
},
433440
},
434441
});
435442

@@ -441,7 +448,7 @@ helper.secrets.mockSuite(testing.suiteName(), ['azure'], function(mock, skipping
441448
const resp = await provider.registerWorker({worker: runningWorker, workerPool, workerIdentityProof});
442449
assert(resp.expires - new Date() + 10000 > 10 * 3600 * 1000);
443450
assert(resp.expires - new Date() - 10000 < 10 * 3600 * 1000);
444-
451+
assert.equal(resp.workerConfig.someKey, 'someValue');
445452
sinon.restore();
446453
});
447454
});

services/worker-manager/test/provider_azure_test.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,18 +505,39 @@ helper.secrets.mockSuite(testing.suiteName(), ['azure'], function(mock, skipping
505505
test('sweet success', async function() {
506506
const worker = await helper.Worker.create({
507507
...defaultWorker,
508+
providerData: {
509+
...baseProviderData,
510+
vm: {
511+
name: 'some-vm',
512+
vmId: vmId,
513+
},
514+
workerConfig: {
515+
"someKey": "someValue",
516+
},
517+
},
508518
});
509519
const document = fs.readFileSync(path.resolve(__dirname, 'fixtures/azure_signature_good')).toString();
510520
const workerIdentityProof = {document};
511521
const res = await provider.registerWorker({workerPool, worker, workerIdentityProof});
512522
// allow +- 10 seconds since time passes while the test executes
513523
assert(res.expires - new Date() + 10000 > 96 * 3600 * 1000, res.expires);
514524
assert(res.expires - new Date() - 10000 < 96 * 3600 * 1000, res.expires);
525+
assert.equal(res.workerConfig.someKey, 'someValue');
515526
});
516527

517528
test('sweet success (different reregister)', async function() {
518529
const worker = await helper.Worker.create({
519530
...defaultWorker,
531+
providerData: {
532+
...baseProviderData,
533+
vm: {
534+
name: 'some-vm',
535+
vmId: vmId,
536+
},
537+
workerConfig: {
538+
"someKey": "someValue",
539+
},
540+
},
520541
});
521542
await worker.modify(w => {
522543
w.providerData.reregistrationTimeout = 10 * 3600 * 1000;
@@ -527,6 +548,7 @@ helper.secrets.mockSuite(testing.suiteName(), ['azure'], function(mock, skipping
527548
// allow +- 10 seconds since time passes while the test executes
528549
assert(res.expires - new Date() + 10000 > 10 * 3600 * 1000, res.expires);
529550
assert(res.expires - new Date() - 10000 < 10 * 3600 * 1000, res.expires);
551+
assert.equal(res.workerConfig.someKey, 'someValue');
530552
});
531553
});
532554
});

services/worker-manager/test/provider_google_test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,26 +434,36 @@ helper.secrets.mockSuite(testing.suiteName(), ['azure'], function(mock, skipping
434434
test('sweet success', async function() {
435435
const worker = await helper.Worker.create({
436436
...defaultWorker,
437+
providerData: {
438+
workerConfig: {
439+
"someKey": "someValue",
440+
},
441+
},
437442
});
438443
const workerIdentityProof = {token: 'good'};
439444
const res = await provider.registerWorker({workerPool, worker, workerIdentityProof});
440445
// allow +- 10 seconds since time passes while the test executes
441446
assert(res.expires - new Date() + 10000 > 96 * 3600 * 1000, res.expires);
442447
assert(res.expires - new Date() - 10000 < 96 * 3600 * 1000, res.expires);
448+
assert.equal(res.workerConfig.someKey, 'someValue');
443449
});
444450

445451
test('sweet success (different reregister)', async function() {
446452
const worker = await helper.Worker.create({
447453
...defaultWorker,
448454
providerData: {
449455
reregistrationTimeout: 3600 * 10 * 1000,
456+
workerConfig: {
457+
"someKey": "someValue",
458+
},
450459
},
451460
});
452461
const workerIdentityProof = {token: 'good'};
453462
const res = await provider.registerWorker({workerPool, worker, workerIdentityProof});
454463
// allow +- 10 seconds since time passes while the test executes
455464
assert(res.expires - new Date() + 10000 > 10 * 3600 * 1000, res.expires);
456465
assert(res.expires - new Date() - 10000 < 10 * 3600 * 1000, res.expires);
466+
assert.equal(res.workerConfig.someKey, 'someValue');
457467
});
458468
});
459469
});

services/worker-manager/test/provider_static_test.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,20 @@ helper.secrets.mockSuite(testing.suiteName(), ['azure'], function(mock, skipping
9090
test('successful registration', async function() {
9191
const worker = await helper.Worker.create({
9292
...defaultWorker,
93+
providerData: {
94+
staticSecret: 'good',
95+
workerConfig: {
96+
"someKey": "someValue",
97+
},
98+
},
9399
});
94100
const workerIdentityProof = {staticSecret: 'good'};
95101
const res = await provider.registerWorker({workerPool, worker, workerIdentityProof});
96102
const expectedExpires = new Date(Date.now() + 3600 * 1000);
97103
// allow +- 10 seconds since time passes while the test executes
98104
assert(Math.abs(res.expires - expectedExpires) < 10000,
99105
`${res.expires}, ${expectedExpires}, diff = ${res.expires - expectedExpires} ms`);
106+
assert.equal(res.workerConfig.someKey, 'someValue');
100107
});
101108
});
102109
});

tools/taskcluster-worker-runner/cfg/providerworkerconfig.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type ProviderWorkerConfig struct {
1717
Files []files.File `json:"files,omitempty"`
1818
}
1919

20-
// ParseProviderWorkerConfig takes a RawMessage represneting the `workerConfig`
20+
// ParseProviderWorkerConfig takes a RawMessage representing the `workerConfig`
2121
// field received from worker-manager, and returns the config and files it
2222
// contains. This requires the runnerConfig in order to determine the worker
2323
// implementation name.

tools/taskcluster-worker-runner/provider/aws/awsprovider.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,10 @@ func (p *AWSProvider) ConfigureRun(state *run.State) error {
5858
"signature": interface{}(instanceIdentityDocumentSignature),
5959
}
6060

61-
err = provider.RegisterWorker(
61+
// TODO
62+
// bug 1591476: we should get workerConfig from RegisterWorker()
63+
// and not from the metadata service
64+
_, err = provider.RegisterWorker(
6265
state,
6366
wm,
6467
userData.WorkerPoolId,

tools/taskcluster-worker-runner/provider/azure/azure.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func (p *AzureProvider) ConfigureRun(state *run.State) error {
6868
"document": interface{}(document),
6969
}
7070

71-
err = provider.RegisterWorker(
71+
workerConfig, err := provider.RegisterWorker(
7272
state,
7373
wm,
7474
customData.WorkerPoolId,
@@ -97,7 +97,7 @@ func (p *AzureProvider) ConfigureRun(state *run.State) error {
9797

9898
state.ProviderMetadata = providerMetadata
9999

100-
pwc, err := cfg.ParseProviderWorkerConfig(p.runnercfg, customData.ProviderWorkerConfig)
100+
pwc, err := cfg.ParseProviderWorkerConfig(p.runnercfg, workerConfig)
101101
if err != nil {
102102
return err
103103
}

0 commit comments

Comments
 (0)