Skip to content

Commit 69eaf2c

Browse files
authored
feat(opamp-client-node): add TLS/mTLS support; release v0.3.0 (#1146)
Refs: #1044
1 parent e7385d8 commit 69eaf2c

File tree

18 files changed

+539
-29
lines changed

18 files changed

+539
-29
lines changed

packages/opamp-client-node/CHANGELOG.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
# @elastic/opamp-client-node Changelog
22

3-
## Unreleased
3+
## v0.3.0
4+
5+
- Add TLS and mTLS support. [#1044](https://github.com/elastic/elastic-otel-node/issues/1044)
6+
7+
```js
8+
const client = createOpAMPClient({
9+
// ...
10+
connect: {
11+
ca: fs.readFileSync(path.join(CERTS_DIR, 'ca.crt')),
12+
cert: fs.readFileSync(path.join(CERTS_DIR, 'client.crt')),
13+
key: fs.readFileSync(path.join(CERTS_DIR, 'client.key')),
14+
}
15+
});
16+
```
417

518
- Be more defensive in handling the `heartbeatIntervalSeconds` option: clamp to
619
`[100ms, 1d]` and use the default (30s) for invalid values. The previous
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
/**
7+
* An example showing the mTLS-related options of OpAMPClient.
8+
*
9+
* This expects to talk to an *HTTPS* OpAMP server. For example:
10+
* cd packages/mockopampserver
11+
* npm run example:mTLS
12+
*
13+
* Then run this example client:
14+
* cd packages/opamp-client-node
15+
* npm run example:mTLS
16+
*/
17+
18+
const fs = require('fs');
19+
const path = require('path');
20+
const luggite = require('luggite');
21+
const {
22+
createOpAMPClient,
23+
AgentCapabilities,
24+
RemoteConfigStatuses,
25+
} = require('..'); // @elastic/opamp-client-node
26+
27+
const log = luggite.createLogger({name: 'use-opamp-client', level: 'trace'});
28+
29+
const TEST_CERTS_DIR = path.resolve(__dirname, '../test/certs');
30+
31+
async function main() {
32+
const client = createOpAMPClient({
33+
log,
34+
endpoint: 'https://localhost:4320/v1/opamp',
35+
connect: {
36+
ca: fs.readFileSync(path.join(TEST_CERTS_DIR, 'ca.crt')),
37+
cert: fs.readFileSync(path.join(TEST_CERTS_DIR, 'client.crt')),
38+
key: fs.readFileSync(path.join(TEST_CERTS_DIR, 'client.key')),
39+
},
40+
capabilities:
41+
AgentCapabilities.AgentCapabilities_AcceptsRemoteConfig |
42+
AgentCapabilities.AgentCapabilities_ReportsRemoteConfig,
43+
onMessage: ({remoteConfig}) => {
44+
if (remoteConfig) {
45+
console.log('Got remote config:');
46+
console.dir(remoteConfig, {depth: 50});
47+
48+
// Apply the remote config.
49+
// ...
50+
51+
// Report the remote config status.
52+
client.setRemoteConfigStatus({
53+
status: RemoteConfigStatuses.RemoteConfigStatuses_APPLIED,
54+
lastRemoteConfigHash: remoteConfig.configHash,
55+
});
56+
}
57+
},
58+
});
59+
client.setAgentDescription({
60+
identifyingAttributes: {
61+
'service.name': 'use-opamp-client',
62+
},
63+
});
64+
client.start();
65+
66+
setInterval(() => {}, 10000); // Keep running until Ctrl+C.
67+
}
68+
69+
main();

packages/opamp-client-node/lib/index.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ const {
1515
RemoteConfigStatuses,
1616
} = require('./generated/opamp_pb');
1717

18+
// Re-export some types.
19+
/**
20+
* @typedef {import('./opamp-client').OpAMPClientOptions} OpAMPClientOptions
21+
*/
22+
1823
module.exports = {
1924
DIAG_CH_SEND_SUCCESS,
2025
DIAG_CH_SEND_FAIL,

packages/opamp-client-node/lib/opamp-client.js

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,7 @@ function normalizeHeartbeatIntervalSeconds(input) {
146146
*/
147147

148148
/**
149-
* @typedef {import('tls').ConnectionOptions} TLSConnectionOptions
150-
*/
151-
/**
152-
* @typedef {Pick<TLSConnectionOptions, 'ca'>} ConnectOptions
149+
* @typedef {Pick<import('tls').ConnectionOptions, 'ca' | 'cert' | 'key'>} ConnectOptions
153150
*/
154151

155152
/**
@@ -184,8 +181,14 @@ function normalizeHeartbeatIntervalSeconds(input) {
184181
* @property {number} [bodyTimeout] The timeout (in milliseconds) to wait for
185182
* the response body on a request to the OpAMP server. Default 10s.
186183
* @property {ConnectOptions} [connect] A small subset of Undici client connect
187-
* options (https://undici.nodejs.org/#/docs/api/Client?id=parameter-connectoptions):
188-
* - 'ca'
184+
* options (https://undici.nodejs.org/#/docs/api/Client?id=parameter-connectoptions).
185+
* Primarily this is intended to support mTLS options:
186+
* - [ca] Override the trusted CA certificates.
187+
* See https://nodejs.org/api/all.html#all_tls_tlscreatesecurecontextoptions
188+
* - [cert] TLS certificate chains in PEM format.
189+
* See https://nodejs.org/api/all.html#all_tls_tlscreatesecurecontextoptions
190+
* - [key] Private keys in PEM format.
191+
* See https://nodejs.org/api/all.html#all_tls_tlscreatesecurecontextoptions
189192
* @property {boolean} [diagEnabled] Diagnostics enabled, typically used for
190193
* testing. When enabled, events will be published to the following
191194
* diagnostics channels:
@@ -194,7 +197,6 @@ function normalizeHeartbeatIntervalSeconds(input) {
194197
* - `opamp-client.send.schedule`: {delayMs, errCount}
195198
*
196199
* TODO: enableCompression or similar option
197-
* TODO: add {ConnectionOptions} [connect] with a subset of https://undici.nodejs.org/#/docs/api/Client?id=parameter-connectoptions e.g. as used in play.mjs for `ca: [cacert]` to conn to opamp-go example server. Or could expose the full ConnectOptions, but that's heavy.
198200
*/
199201

200202
// See opamp-go/client/client.go for some inspiration for this interface.
@@ -255,6 +257,7 @@ class OpAMPClient {
255257
bodyTimeout: opts.bodyTimeout ?? DEFAULT_BODY_TIMEOUT,
256258
// A limited subset (because the full set is huge) of undici ConnectionOptions
257259
// https://undici.nodejs.org/#/docs/api/Client?id=parameter-connectoptions
260+
// TODO: actually limit to the documented subset?
258261
connect: opts.connect,
259262
});
260263
}

packages/opamp-client-node/package-lock.json

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

packages/opamp-client-node/package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@elastic/opamp-client-node",
3-
"version": "0.2.0",
3+
"version": "0.3.0",
44
"type": "commonjs",
55
"description": "an OpAMP client for Node.js",
66
"publishConfig": {
@@ -27,6 +27,7 @@
2727
"clean": "rm -rf node_modules",
2828
"example": "cd examples && node use-opamp-client.js | pino-pretty",
2929
"example:instrumented": "cd examples && node --import ../../opentelemetry-node/import.mjs use-opamp-client.js | pino-pretty",
30+
"example:mTLS": "cd examples && node use-opamp-client-mTLS.js | pino-pretty",
3031
"gen:protos": "buf generate",
3132
"gen:types": "rm -rf types && tsc",
3233
"lint": "npm run lint:eslint && npm run lint:deps && npm run lint:license-files && npm run lint:types",
@@ -35,7 +36,8 @@
3536
"lint:fix": "eslint --ext=js,mjs,cjs --fix .",
3637
"lint:license-files": "../../scripts/gen-notice.sh --lint .",
3738
"lint:types": "rm -rf build/lint-types && tsc --outDir build/lint-types && diff -ur types build/lint-types",
38-
"test": "tape test/**/*.test.js"
39+
"test": "tape test/**/*.test.js",
40+
"maint:regenerate-test-certs": "cd test/certs && ./regenerate.sh"
3941
},
4042
"files": [
4143
"CHANGELOG.md",
@@ -52,7 +54,7 @@
5254
"devDependencies": {
5355
"@bufbuild/buf": "^1.52.1",
5456
"@bufbuild/protoc-gen-es": "^2.2.5",
55-
"@elastic/mockopampserver": ">=0.2.0 <1",
57+
"@elastic/mockopampserver": ">=0.5.0 <1",
5658
"luggite": "^0.2.1",
5759
"pino-pretty": "^13.0.0",
5860
"tape": "^5.9.0"
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
-----BEGIN CERTIFICATE-----
2+
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
32+
-----END CERTIFICATE-----
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
-----BEGIN PRIVATE KEY-----
2+
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
51+
hdrzphak/KbLOWRGjr+0jZVpgFnU7g==
52+
-----END PRIVATE KEY-----
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIFdjCCA16gAwIBAgIBATANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJDTDEL
3+
MAkGA1UECAwCUk0xETAPBgNVBAcMCEVET1RUZXN0MQ0wCwYDVQQKDARSb290MQ0w
4+
CwYDVQQLDARUZXN0MQswCQYDVQQDDAJjYTAeFw0yNTExMDMyMzE4MjlaFw0yNjEx
5+
MDMyMzE4MjlaMGExCzAJBgNVBAYTAkNMMQswCQYDVQQIDAJSTTERMA8GA1UEBwwI
6+
RURPVFRlc3QxDTALBgNVBAoMBFRlc3QxDzANBgNVBAsMBkNsaWVudDESMBAGA1UE
7+
AwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuLTs
8+
BSVyqxTghEtakeDLvalZqkdCOsKMdtRSaEZafVPOE4K8eb+EAIRonVZqEGN+K0ZT
9+
7IC4V6TWVRyDOXGWb3s8KyvOL5K6qfMOeZQhGWu6VkWldwtQQDzW2HclP3RzIDD2
10+
YyA77GDKhzZtPYj17boMg/Q5TDeVAig3c707zUL9GIbI1HlrdLSLVoJzO5iG2x6q
11+
jQLy3/RKh/8vqRj52MBoDb2/uqppLNuL9st/6Q6QXhgMNPNlZuY8cEg3T6MN+a8c
12+
A9ucLqEfQoaOcCAFBErQEaWl+ezuiwDQ1cNm7D+EVno1k/38ZieEaQ4XYfgwY0zz
13+
jWYdCvL/IT19DsQ5xJo1nF/wWcXUKE2P7sdhC8YdwLPJ98dQfFEl4YY2qaGF22QB
14+
0OyPogaxdUHKwf56wsb2tc3miTKTkHdCR4ac9qFpUUXdkDDm5h7mQESX71jNg78C
15+
YaHR9F5+yeYWwCJcPCaYb1hUMFkSHG85v2bmbd7pciIqHjdNdsNwmaO01ZfmM/Cv
16+
KmsOmzNbOW3dsL4lLzkA+dxKqqVE+wo6XjdsGTnd/HduuvjS5ZM66yKyN+HnM+eI
17+
HfmCCALmGc+1Wy/NeOTapUOscZ2Jk+CRHpmFNifzFmPg18NjIOE8vi0HOKWutkBs
18+
W49gkFboEGVg+h8b2KgGkKdQxdUaIoj8DKfAnpUCAwEAAaNCMEAwHQYDVR0OBBYE
19+
FFhmSGvkiCwpHPXOlkcgcNCa9JgKMB8GA1UdIwQYMBaAFHjwbnO38WeUz9aGurNd
20+
HIOvWy7yMA0GCSqGSIb3DQEBCwUAA4ICAQAN96VxyNQyMEfHYR3N5bRLSbzkWQyR
21+
cpt5PovGoxTUrkj5W+s/Nm9CRt70BKHdVosYdmKlO1lpGZFfuW1TiCare7oNFble
22+
6bcr7e+HZhKFEolhyVQRHK76BDjg9qfw/oXMgiOStEg+vny/c4SBTYPLTqM+Iv1o
23+
kIEJhizFf2wb1pGBG9BuOF8o06eCV5e/4CaslSeGOm4BWwWdOd5NwwrR3YdPZqk6
24+
7FjtuW+GuVlPeC/jqR7cMAOy9NKI65T4e/m14UidfS0kIVHr+ZMGgC+kMxFGSeOs
25+
KXiF4Wj+YDCn89cV4gDNVYpYoyJm6P1jXIqm2uKGz4DrlB+/7ihpvFhvnb4xIU8W
26+
g3Nr5ABOrj6rTX5Iynd2lBFCYK3v7cJg4e4P41VeoFY0tW3O3PaseieW/IkUPCso
27+
l463cRGTllUIXTryY4M/k6EMRjrE2qC5jwbuOSujNm90dHSHcJ+y1WjcJzC8+4rf
28+
PtEJPRiptPZZAQMo/Ohex0Pr/gI3lDn7p4mIL/sB4435ORmu+v0m6kI1aJjFkr0y
29+
h5FClGjnis26G69y2sE6oex7xN4KPwss1iTpxnHDIWBaiXLZz2WX5uR1ZIv2gL5I
30+
V+isJp5A5P3w23QQfl+GotNqeZKpcBU+MumV1G1qmT7jimdXxamnSLQy//2CuScm
31+
MfOZKC7DZkCMsw==
32+
-----END CERTIFICATE-----
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN CERTIFICATE REQUEST-----
2+
MIIEpjCCAo4CAQAwYTELMAkGA1UEBhMCQ0wxCzAJBgNVBAgMAlJNMREwDwYDVQQH
3+
DAhFRE9UVGVzdDENMAsGA1UECgwEVGVzdDEPMA0GA1UECwwGQ2xpZW50MRIwEAYD
4+
VQQDDAlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC4
5+
tOwFJXKrFOCES1qR4Mu9qVmqR0I6wox21FJoRlp9U84Tgrx5v4QAhGidVmoQY34r
6+
RlPsgLhXpNZVHIM5cZZvezwrK84vkrqp8w55lCEZa7pWRaV3C1BAPNbYdyU/dHMg
7+
MPZjIDvsYMqHNm09iPXtugyD9DlMN5UCKDdzvTvNQv0YhsjUeWt0tItWgnM7mIbb
8+
HqqNAvLf9EqH/y+pGPnYwGgNvb+6qmks24v2y3/pDpBeGAw082Vm5jxwSDdPow35
9+
rxwD25wuoR9Cho5wIAUEStARpaX57O6LANDVw2bsP4RWejWT/fxmJ4RpDhdh+DBj
10+
TPONZh0K8v8hPX0OxDnEmjWcX/BZxdQoTY/ux2ELxh3As8n3x1B8USXhhjapoYXb
11+
ZAHQ7I+iBrF1QcrB/nrCxva1zeaJMpOQd0JHhpz2oWlRRd2QMObmHuZARJfvWM2D
12+
vwJhodH0Xn7J5hbAIlw8JphvWFQwWRIcbzm/ZuZt3ulyIioeN012w3CZo7TVl+Yz
13+
8K8qaw6bM1s5bd2wviUvOQD53EqqpUT7CjpeN2wZOd38d266+NLlkzrrIrI34ecz
14+
54gd+YIIAuYZz7VbL8145NqlQ6xxnYmT4JEemYU2J/MWY+DXw2Mg4Ty+LQc4pa62
15+
QGxbj2CQVugQZWD6HxvYqAaQp1DF1RoiiPwMp8CelQIDAQABoAAwDQYJKoZIhvcN
16+
AQELBQADggIBAABYpqIH7reW4PhsGL0zvZKMc0a6Yizjhy9JPxKiG0FB5FxOWRND
17+
3d6gythUQ7LhApE65VPuOnenO0eUvjT6ahR3zYPDbWUZQH8HROeep39EKeMrx+4n
18+
E/4Aew1MH+KMM7iWrp7haM+H+AtQvbJ19CtFK9XCwAohjyLM+QsJB3PTR9IXPjvc
19+
+iFxUkOS7kn4l9YT8hKlM2kxNF8F6EKuEacZtS7/Y04AMyv9LtmwuG7sO+nmBFMz
20+
Pi4wguNoeNDiq3GBhz3RibeH62Pj/uX/mnqsNeJ/r2kwI2gFV+qCCohUD30JHLDO
21+
vlbDYKBopP9JAUN3uYizAewnYNL4e2O2ozQk3yOa0rx4Wp9HYGoWFayrdGsXXKv5
22+
duqIE0FzUp4TZp88fObrN3ilV43tNzk1YmIlwU93Dp6tHZ7Tniv8r9EKe3ZE99sJ
23+
2al9GqQ5Wvsikige3eXeh3zUPFHQ2Livx69lsQwSTuYYPUVUt0HcmarjlhpIpSHA
24+
5vum1wJXgLLP/hVNQgnTaGyrTf+pVrKXQflFcrE4AoI0OIvxWRymey6MnFYfrhsI
25+
UnN72C9w1n966QUl5WY6Hx7wz0QoMkmm4HMrz+opWpeQeWdy67UPOF4Fq+XfQSvD
26+
mwuAv2KMTvgfY8ESdOKRIK4+UfR9S+Ok8Wxs48yrIqdDubFYJGOq9ueY
27+
-----END CERTIFICATE REQUEST-----

0 commit comments

Comments
 (0)