Skip to content

Commit 8a52faf

Browse files
committed
Squashed commit of the following:
commit e1cec23 Author: Jeromy Cannon <[email protected]> Date: Mon Apr 8 19:07:08 2024 +0100 update version Signed-off-by: Jeromy Cannon <[email protected]> commit 0f2c6a8 Author: Jeromy Cannon <[email protected]> Date: Sat Apr 6 07:42:30 2024 +0100 fixed bugs Signed-off-by: Jeromy Cannon <[email protected]> commit edadcb2 Merge: b45a8a3 dea5ea5 Author: Jeromy Cannon <[email protected]> Date: Fri Apr 5 16:52:19 2024 +0100 Merge branch 'main' into 00096-node-refresh commit b45a8a3 Author: Jeromy Cannon <[email protected]> Date: Fri Apr 5 16:49:51 2024 +0100 updates for addressing errors Signed-off-by: Jeromy Cannon <[email protected]> commit dea5ea5 Author: Hedera Eng Automation <[email protected]> Date: Fri Apr 5 15:43:04 2024 +0000 chore(release): 0.23.0 [skip ci] ## [0.23.0](v0.22.1...v0.23.0) (2024-04-05) ### Features * fix javascript documentation ([#193](#193)) ([f2476be](f2476be)) * remove helm & java install from ci pipeline ([#197](#197)) ([43bda68](43bda68)) ### Bug Fixes * solo relays command is not working ([#187](#187)) ([9ee6b46](9ee6b46)) commit fbcf7ca Author: JeffreyDallas <[email protected]> Date: Thu Apr 4 15:32:20 2024 -0500 ci: new github action workflow to generate static web pages using hugo (#200) Signed-off-by: Jeffrey Tang <[email protected]> commit 9129890 Author: Jeromy Cannon <[email protected]> Date: Thu Apr 4 18:59:07 2024 +0100 fix codacy complaint Signed-off-by: Jeromy Cannon <[email protected]> commit f801a0c Author: Jeromy Cannon <[email protected]> Date: Thu Apr 4 18:44:21 2024 +0100 add patched hedera version and fix code security issue Signed-off-by: Jeromy Cannon <[email protected]> commit 7d96536 Merge: 374e82e 2a66fe9 Author: Jeromy Cannon <[email protected]> Date: Thu Apr 4 16:54:11 2024 +0100 Merge branch 'main' into 00096-node-refresh commit 374e82e Author: Jeromy Cannon <[email protected]> Date: Thu Apr 4 16:53:38 2024 +0100 fix codestyle check Signed-off-by: Jeromy Cannon <[email protected]> commit a17ec56 Author: Jeromy Cannon <[email protected]> Date: Thu Apr 4 16:14:08 2024 +0100 update proxy times Signed-off-by: Jeromy Cannon <[email protected]> commit 75558c0 Author: Jeromy Cannon <[email protected]> Date: Thu Apr 4 15:42:23 2024 +0100 pretty Signed-off-by: Jeromy Cannon <[email protected]> commit c6cc393 Author: Jeromy Cannon <[email protected]> Date: Thu Apr 4 15:39:20 2024 +0100 todos Signed-off-by: Jeromy Cannon <[email protected]> commit b03268e Author: Jeromy Cannon <[email protected]> Date: Thu Apr 4 14:26:33 2024 +0100 made test cases DRY Signed-off-by: Jeromy Cannon <[email protected]> commit 9e30d0d Author: Jeromy Cannon <[email protected]> Date: Wed Apr 3 19:06:19 2024 +0100 prep for PR review Signed-off-by: Jeromy Cannon <[email protected]> commit 338423b Author: Jeromy Cannon <[email protected]> Date: Wed Apr 3 19:03:39 2024 +0100 cleanup TODOs Signed-off-by: Jeromy Cannon <[email protected]> commit a92305e Author: Jeromy Cannon <[email protected]> Date: Wed Apr 3 18:56:27 2024 +0100 remove dead code Signed-off-by: Jeromy Cannon <[email protected]> commit 969ecf3 Author: Jeromy Cannon <[email protected]> Date: Wed Apr 3 18:03:59 2024 +0100 remove TODOs Signed-off-by: Jeromy Cannon <[email protected]> commit f67edba Author: Jeromy Cannon <[email protected]> Date: Wed Apr 3 16:30:26 2024 +0100 use FST 0.24.1 Signed-off-by: Jeromy Cannon <[email protected]> commit 2cfabe0 Author: Jeromy Cannon <[email protected]> Date: Wed Apr 3 15:52:19 2024 +0100 remove unintentionally added files Signed-off-by: Jeromy Cannon <[email protected]> commit 3da67a3 Author: Jeromy Cannon <[email protected]> Date: Wed Apr 3 15:43:20 2024 +0100 working version with dump saved state Signed-off-by: Jeromy Cannon <[email protected]> commit 1dc4473 Author: Jeromy Cannon <[email protected]> Date: Wed Apr 3 13:06:45 2024 +0100 working version Signed-off-by: Jeromy Cannon <[email protected]> commit 713f3f0 Author: Jeromy Cannon <[email protected]> Date: Wed Apr 3 13:06:28 2024 +0100 working version Signed-off-by: Jeromy Cannon <[email protected]> commit 457478f Author: Jeromy Cannon <[email protected]> Date: Wed Apr 3 13:05:39 2024 +0100 todo and removed fst chart version override Signed-off-by: Jeromy Cannon <[email protected]> commit c051ee9 Author: Jeromy Cannon <[email protected]> Date: Wed Apr 3 13:04:20 2024 +0100 removed white noise in swirlds.log Signed-off-by: Jeromy Cannon <[email protected]> commit 2a66fe9 Author: JeffreyDallas <[email protected]> Date: Tue Apr 2 19:41:49 2024 -0500 test: add relay end to end test (#198) Signed-off-by: Jeffrey Tang <[email protected]> commit 43bda68 Author: JeffreyDallas <[email protected]> Date: Tue Apr 2 11:46:47 2024 -0500 feat: remove helm & java install from ci pipeline (#197) Signed-off-by: Jeffrey Tang <[email protected]> commit 8049e9c Author: Jeromy Cannon <[email protected]> Date: Mon Apr 1 18:42:38 2024 +0100 TODO for updating test-setup fst chart version Signed-off-by: Jeromy Cannon <[email protected]> commit 95c9c88 Author: Jeromy Cannon <[email protected]> Date: Mon Apr 1 17:43:55 2024 +0100 had to change network-nodeX services name Signed-off-by: Jeromy Cannon <[email protected]> commit 16e2ded Author: Jeromy Cannon <[email protected]> Date: Thu Mar 28 00:12:34 2024 +0000 pushing current code Signed-off-by: Jeromy Cannon <[email protected]> commit 0690cff Author: Jeromy Cannon <[email protected]> Date: Tue Mar 26 21:16:23 2024 +0000 draft of node refresh Signed-off-by: Jeromy Cannon <[email protected]> commit d5d53c5 Author: Jeromy Cannon <[email protected]> Date: Fri Mar 22 15:18:41 2024 +0000 in-progress Signed-off-by: Jeromy Cannon <[email protected]> Signed-off-by: Jeromy Cannon <[email protected]>
1 parent 9811960 commit 8a52faf

File tree

10 files changed

+484
-129
lines changed

10 files changed

+484
-129
lines changed

src/commands/node.mjs

Lines changed: 276 additions & 55 deletions
Large diffs are not rendered by default.

src/core/helpers.mjs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,10 @@ export function isNumeric (str) {
170170
return !isNaN(str) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...
171171
!isNaN(parseFloat(str)) // ...and ensure strings of whitespace fail
172172
}
173+
174+
export function validatePath (input) {
175+
if (input.indexOf('\0') !== -1) {
176+
throw new FullstackTestingError(`access denied for path: ${input}`)
177+
}
178+
return input
179+
}

src/core/k8.mjs

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { v4 as uuid4 } from 'uuid'
2727
import { V1ObjectMeta, V1Secret } from '@kubernetes/client-node'
2828
import { sleep } from './helpers.mjs'
2929
import { constants } from './index.mjs'
30+
import { sleep } from './helpers.mjs'
3031

3132
/**
3233
* A kubernetes API wrapper class providing custom functionalities required by solo
@@ -397,27 +398,34 @@ export class K8 {
397398
const parentDir = path.dirname(destPath)
398399
const fileName = path.basename(destPath)
399400
const filterMap = new Map(Object.entries(filters))
400-
const entries = await this.listDir(podName, containerName, parentDir)
401-
402-
for (const item of entries) {
403-
if (item.name === fileName && !item.directory) {
404-
let found = true
405-
406-
for (const entry of filterMap.entries()) {
407-
const field = entry[0]
408-
const value = entry[1]
409-
this.logger.debug(`Checking file ${podName}:${containerName} ${destPath}; ${field} expected ${value}, found ${item[field]}`, { filters })
410-
if (`${value}` !== `${item[field]}`) {
411-
found = false
412-
break
401+
402+
try {
403+
const entries = await this.listDir(podName, containerName, parentDir)
404+
405+
for (const item of entries) {
406+
if (item.name === fileName && !item.directory) {
407+
let found = true
408+
409+
for (const entry of filterMap.entries()) {
410+
const field = entry[0]
411+
const value = entry[1]
412+
this.logger.debug(`Checking file ${podName}:${containerName} ${destPath}; ${field} expected ${value}, found ${item[field]}`, { filters })
413+
if (`${value}` !== `${item[field]}`) {
414+
found = false
415+
break
416+
}
413417
}
414-
}
415418

416-
if (found) {
417-
this.logger.debug(`File check succeeded ${podName}:${containerName} ${destPath}`, { filters })
418-
return true
419+
if (found) {
420+
this.logger.debug(`File check succeeded ${podName}:${containerName} ${destPath}`, { filters })
421+
return true
422+
}
419423
}
420424
}
425+
} catch (e) {
426+
const error = new FullstackTestingError(`unable to check file in '${podName}':${containerName}' - ${destPath}: ${e.message}`, e)
427+
this.logger.error(error.message, error)
428+
throw error
421429
}
422430

423431
return false

src/core/platform_installer.mjs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,25 @@ import * as semver from 'semver'
2222
import { FullstackTestingError, IllegalArgumentError, MissingArgumentError } from './errors.mjs'
2323
import { constants } from './index.mjs'
2424
import { Templates } from './templates.mjs'
25+
import { flags } from '../commands/index.mjs'
2526

2627
/**
2728
* PlatformInstaller install platform code in the root-container of a network pod
2829
*/
2930
export class PlatformInstaller {
30-
constructor (logger, k8) {
31+
constructor (logger, k8, configManager) {
3132
if (!logger) throw new MissingArgumentError('an instance of core/Logger is required')
3233
if (!k8) throw new MissingArgumentError('an instance of core/K8 is required')
3334

3435
this.logger = logger
3536
this.k8 = k8
37+
this.configManager = configManager
38+
}
39+
40+
_getNamespace () {
41+
const ns = this.configManager.getFlag(flags.namespace)
42+
if (!ns) throw new MissingArgumentError('namespace is not set')
43+
return ns
3644
}
3745

3846
async validatePlatformReleaseDir (releaseDir) {
@@ -262,8 +270,6 @@ export class PlatformInstaller {
262270
* @returns {Promise<unknown>}
263271
*/
264272
async prepareConfigTxt (nodeIDs, destPath, releaseTag, chainId = constants.HEDERA_CHAIN_ID, template = `${constants.RESOURCES_DIR}/templates/config.template`) {
265-
const self = this
266-
267273
if (!nodeIDs || nodeIDs.length === 0) throw new MissingArgumentError('list of node IDs is required')
268274
if (!destPath) throw new MissingArgumentError('destPath is required')
269275
if (!template) throw new MissingArgumentError('config templatePath is required')
@@ -290,14 +296,11 @@ export class PlatformInstaller {
290296
let nodeSeq = 0
291297
let accountIdSeq = parseInt(startAccountId.num.toString(), 10)
292298
for (const nodeId of nodeIDs) {
293-
const podName = Templates.renderNetworkPodName(nodeId)
294-
const svcName = Templates.renderNetworkSvcName(nodeId)
295-
296299
const nodeName = nodeId
297300
const nodeNickName = nodeId
298301

299-
const internalIP = await self.k8.getPodIP(podName)
300-
const externalIP = await self.k8.getClusterIP(svcName)
302+
const internalIP = Templates.renderFullyQualifiedNetworkPodName(this._getNamespace(), nodeId)
303+
const externalIP = Templates.renderFullyQualifiedNetworkSvcName(this._getNamespace(), nodeId)
301304

302305
const account = `${accountIdPrefix}.${accountIdSeq}`
303306
if (releaseVersion.minor >= 40) {

src/core/templates.mjs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,12 @@ export class Templates {
159159
throw new FullstackTestingError(`unknown dep: ${dep}`)
160160
}
161161
}
162+
163+
static renderFullyQualifiedNetworkPodName (namespace, nodeId) {
164+
return `${Templates.renderNetworkPodName(nodeId)}.${Templates.renderNetworkSvcName(nodeId)}.${namespace}.svc.cluster.local`
165+
}
166+
167+
static renderFullyQualifiedNetworkSvcName (namespace, nodeId) {
168+
return `${Templates.renderNetworkSvcName(nodeId)}.${namespace}.svc.cluster.local`
169+
}
162170
}

src/index.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export function main (argv) {
5151
const chartManager = new ChartManager(helm, logger)
5252
const configManager = new ConfigManager(logger)
5353
const k8 = new K8(configManager, logger)
54-
const platformInstaller = new PlatformInstaller(logger, k8)
54+
const platformInstaller = new PlatformInstaller(logger, k8, configManager)
5555
const keyManager = new KeyManager(logger)
5656
const accountManager = new AccountManager(logger, k8)
5757
const profileManager = new ProfileManager(logger, configManager)

test/e2e/commands/node.test.mjs

Lines changed: 153 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,16 @@
1414
* limitations under the License.
1515
*
1616
*/
17-
import { AccountBalanceQuery, AccountCreateTransaction, Hbar, PrivateKey } from '@hashgraph/sdk'
17+
import {
18+
AccountBalanceQuery,
19+
AccountCreateTransaction,
20+
Hbar,
21+
HbarUnit,
22+
PrivateKey
23+
} from '@hashgraph/sdk'
1824
import {
1925
afterAll,
26+
beforeAll,
2027
describe,
2128
expect,
2229
it
@@ -28,20 +35,22 @@ import {
2835
import {
2936
bootstrapNetwork,
3037
getDefaultArgv,
38+
getTestConfigManager,
3139
TEST_CLUSTER
3240
} from '../../test_util.js'
41+
import { sleep } from '../../../src/core/helpers.mjs'
3342

3443
describe.each([
35-
{ releaseTag: 'v0.47.0-alpha.0', keyFormat: constants.KEY_FORMAT_PFX, testName: 'node-cmd-e2e-pfx' },
36-
{ releaseTag: 'v0.47.0-alpha.0', keyFormat: constants.KEY_FORMAT_PEM, testName: 'node-cmd-e2e-pem' }
44+
{ releaseTag: 'v0.49.0-alpha.2', keyFormat: constants.KEY_FORMAT_PFX, testName: 'node-cmd-e2e-pfx', mode: 'kill' },
45+
{ releaseTag: 'v0.49.0-alpha.2', keyFormat: constants.KEY_FORMAT_PEM, testName: 'node-cmd-e2e-pem', mode: 'stop' }
3746
])('NodeCommand', (input) => {
3847
const testName = input.testName
3948
const namespace = testName
4049
const argv = getDefaultArgv()
4150
argv[flags.namespace.name] = namespace
4251
argv[flags.releaseTag.name] = input.releaseTag
4352
argv[flags.keyFormat.name] = input.keyFormat
44-
argv[flags.nodeIDs.name] = 'node0,node1,node2'
53+
argv[flags.nodeIDs.name] = 'node0,node1,node2,node3'
4554
argv[flags.generateGossipKeys.name] = true
4655
argv[flags.generateTlsKeys.name] = true
4756
argv[flags.clusterName.name] = TEST_CLUSTER
@@ -55,60 +64,159 @@ describe.each([
5564
await accountManager.close()
5665
})
5766

58-
describe(`Node should start successfully [release ${input.keyFormat}, keyFormat: ${input.releaseTag}]`, () => {
59-
it('Balance query should succeed', async () => {
60-
expect.assertions(2)
67+
describe(`Node should start successfully [release ${input.releaseTag}, keyFormat: ${input.keyFormat}]`, () => {
68+
balanceQueryShouldSucceed(accountManager, nodeCmd, namespace)
6169

62-
try {
63-
await accountManager.loadNodeClient(namespace)
64-
expect(accountManager._nodeClient).not.toBeNull()
70+
accountCreationShouldSucceed(accountManager, nodeCmd, namespace)
6571

66-
const balance = await new AccountBalanceQuery()
67-
.setAccountId(accountManager._nodeClient.getOperator().accountId)
68-
.execute(accountManager._nodeClient)
72+
it('Node Proxy should be UP', async () => {
73+
expect.assertions(1)
6974

70-
expect(balance.hbars).not.toBeNull()
75+
try {
76+
await expect(nodeCmd.checkNetworkNodeProxyUp('node0', 30399)).resolves.toBeTruthy()
7177
} catch (e) {
7278
nodeCmd.logger.showUserError(e)
7379
expect(e).toBeNull()
80+
} finally {
81+
await nodeCmd.close()
7482
}
75-
}, 120000)
83+
}, 20000)
84+
})
7685

77-
it('Account creation should succeed', async () => {
78-
expect.assertions(2)
86+
describe(`Node should refresh successfully [mode ${input.mode}, release ${input.releaseTag}, keyFormat: ${input.keyFormat}]`, () => {
87+
const nodeId = 'node0'
7988

80-
try {
81-
expect(accountManager._nodeClient).not.toBeNull()
82-
const accountKey = PrivateKey.generate()
89+
beforeAll(async () => {
90+
const podName = await nodeRefreshTestSetup(argv, testName, k8, nodeId)
91+
if (input.mode === 'kill') {
92+
const resp = await k8.kubeClient.deleteNamespacedPod(podName, namespace)
93+
expect(resp.response.statusCode).toEqual(200)
94+
await sleep(20000) // sleep to wait for pod to finish terminating
95+
} else if (input.mode === 'stop') {
96+
await expect(nodeCmd.stop(argv)).resolves.toBeTruthy()
97+
} else {
98+
throw new Error(`invalid mode: ${input.mode}`)
99+
}
100+
}, 120000)
83101

84-
let transaction = await new AccountCreateTransaction()
85-
.setNodeAccountIds([constants.HEDERA_NODE_ACCOUNT_ID_START])
86-
.setInitialBalance(new Hbar(0))
87-
.setKey(accountKey.publicKey)
88-
.freezeWith(accountManager._nodeClient)
102+
nodeShouldBeRunning(nodeCmd, namespace, nodeId)
89103

90-
transaction = await transaction.sign(accountKey)
91-
const response = await transaction.execute(accountManager._nodeClient)
92-
const receipt = await response.getReceipt(accountManager._nodeClient)
104+
nodeShouldNotBeActive(nodeCmd, nodeId)
93105

94-
expect(receipt.accountId).not.toBeNull()
95-
} catch (e) {
96-
nodeCmd.logger.showUserError(e)
97-
expect(e).toBeNull()
98-
}
99-
}, 20000)
106+
nodeRefreshShouldSucceed(nodeId, nodeCmd, argv)
100107

101-
it('Node Proxy should be UP', async () => {
102-
expect.assertions(1)
108+
balanceQueryShouldSucceed(accountManager, nodeCmd, namespace)
103109

104-
try {
105-
await expect(nodeCmd.checkNetworkNodeProxyUp('node0', 30313)).resolves.toBeTruthy()
106-
} catch (e) {
107-
nodeCmd.logger.showUserError(e)
108-
expect(e).toBeNull()
109-
} finally {
110-
await nodeCmd.close()
111-
}
112-
}, 20000)
110+
accountCreationShouldSucceed(accountManager, nodeCmd, namespace)
113111
})
114112
})
113+
114+
function accountCreationShouldSucceed (accountManager, nodeCmd, namespace) {
115+
it('Account creation should succeed', async () => {
116+
expect.assertions(3)
117+
118+
try {
119+
await accountManager.loadNodeClient(namespace)
120+
expect(accountManager._nodeClient).not.toBeNull()
121+
const privateKey = PrivateKey.generate()
122+
const amount = 100
123+
124+
const newAccount = await new AccountCreateTransaction()
125+
.setKey(privateKey)
126+
.setInitialBalance(Hbar.from(amount, HbarUnit.Hbar))
127+
.execute(accountManager._nodeClient)
128+
129+
// Get the new account ID
130+
const getReceipt = await newAccount.getReceipt(accountManager._nodeClient)
131+
const accountInfo = {
132+
accountId: getReceipt.accountId.toString(),
133+
privateKey: privateKey.toString(),
134+
publicKey: privateKey.publicKey.toString(),
135+
balance: amount
136+
}
137+
138+
expect(accountInfo.accountId).not.toBeNull()
139+
expect(accountInfo.balance).toEqual(amount)
140+
} catch (e) {
141+
nodeCmd.logger.showUserError(e)
142+
expect(e).toBeNull()
143+
}
144+
}, 20000)
145+
}
146+
147+
function balanceQueryShouldSucceed (accountManager, nodeCmd, namespace) {
148+
it('Balance query should succeed', async () => {
149+
expect.assertions(2)
150+
151+
try {
152+
await accountManager.loadNodeClient(namespace)
153+
expect(accountManager._nodeClient).not.toBeNull()
154+
155+
const balance = await new AccountBalanceQuery()
156+
.setAccountId(accountManager._nodeClient.getOperator().accountId)
157+
.execute(accountManager._nodeClient)
158+
159+
expect(balance.hbars).not.toBeNull()
160+
} catch (e) {
161+
nodeCmd.logger.showUserError(e)
162+
expect(e).toBeNull()
163+
}
164+
}, 20000)
165+
}
166+
167+
function nodeShouldBeRunning (nodeCmd, namespace, nodeId) {
168+
it(`${nodeId} should be running`, async () => {
169+
try {
170+
await expect(nodeCmd.checkNetworkNodePod(namespace, nodeId)).resolves.toBeTruthy()
171+
} catch (e) {
172+
nodeCmd.logger.showUserError(e)
173+
expect(e).toBeNull()
174+
} finally {
175+
await nodeCmd.close()
176+
}
177+
}, 20000)
178+
}
179+
180+
function nodeRefreshShouldSucceed (nodeId, nodeCmd, argv) {
181+
it(`${nodeId} refresh should succeed`, async () => {
182+
try {
183+
await expect(nodeCmd.refresh(argv)).resolves.toBeTruthy()
184+
} catch (e) {
185+
nodeCmd.logger.showUserError(e)
186+
expect(e).toBeNull()
187+
} finally {
188+
await nodeCmd.close()
189+
}
190+
}, 1200000)
191+
}
192+
193+
function nodeShouldNotBeActive (nodeCmd, nodeId) {
194+
it(`${nodeId} should not be ACTIVE`, async () => {
195+
expect(2)
196+
try {
197+
await expect(nodeCmd.checkNetworkNodeStarted(nodeId, 5)).rejects.toThrowError()
198+
} catch (e) {
199+
nodeCmd.logger.showUserError(e)
200+
expect(e).not.toBeNull()
201+
} finally {
202+
await nodeCmd.close()
203+
}
204+
}, 20000)
205+
}
206+
207+
async function nodeRefreshTestSetup (argv, testName, k8, nodeId) {
208+
argv[flags.nodeIDs.name] = nodeId
209+
const configManager = getTestConfigManager(`${testName}-solo.config`)
210+
configManager.update(argv, true)
211+
212+
const podArray = await k8.getPodsByLabel(
213+
[`app=network-${nodeId}`, 'fullstack.hedera.com/type=network-node'])
214+
215+
if (podArray.length > 0) {
216+
const podName = podArray[0].metadata.name
217+
k8.logger.info(`nodeRefreshTestSetup: podName: ${podName}`)
218+
return podName
219+
} else {
220+
throw new Error(`pod for ${nodeId} not found`)
221+
}
222+
}

test/e2e/core/platform_installer_e2e.test.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import { getTestCacheDir, getTmpDir, testLogger } from '../../test_util.js'
2929
describe('PackageInstallerE2E', () => {
3030
const configManager = new ConfigManager(testLogger)
3131
const k8 = new K8(configManager, testLogger)
32-
const installer = new PlatformInstaller(testLogger, k8)
32+
const installer = new PlatformInstaller(testLogger, k8, configManager)
3333
const testCacheDir = getTestCacheDir()
3434
const podName = 'network-node0-0'
3535
const packageVersion = 'v0.42.5'

0 commit comments

Comments
 (0)