Service Broker can't start in Intel SGX Enclave with Gramine
marchukv opened this issue · 1 comments
Prerequisites
Please answer the following questions for yourself before submitting an issue.
- I am running the latest version
- I checked the documentation and found no answer
- I checked to make sure that this issue has not already been filed
- I'm reporting the issue to the correct repository
Current Behavior
Intel SGX technology offers a confidential computing service. The Gramine project utilizes this technology to run Linux applications.
During initialization, the Moleculer Service Broker creates a NodeCatalog that requires a list of IP addresses. To obtain this list, the broker uses the networkInterfaces()
method from the node:os
module. However, this method utilizes the netlink
system call to retrieve the list of network interfaces, which is not supported by Gramine.
As a result, when the Service Broker is started, it throws an error message of "Unknown system error 97".
Correct me if I'm wrong but as far I understand from the code this list of ips is needed only for TCP transporter and isn't usable for anothers transport types. That's why there is the question - how to avoid geting list of ips during Service Broker starting in correct way?
Expected Behavior
Service Broker starts correctly with Gramine.
Failure Information
[2023-05-08T14:14:29.097Z] INFO tee-trusted-loader-1683555269091/BROKER: Moleculer v0.14.24 is starting...
[2023-05-08T14:14:29.097Z] INFO tee-trusted-loader-1683555269091/BROKER: Namespace: default
[2023-05-08T14:14:29.097Z] INFO tee-trusted-loader-1683555269091/BROKER: Node ID: tee-trusted-loader-1683555269091
[2023-05-08T14:14:29.098Z] INFO tee-trusted-loader-1683555269091/REGISTRY: Strategy: RoundRobinStrategy
[2023-05-08T14:14:29.099Z] INFO tee-trusted-loader-1683555269091/REGISTRY: Discoverer: LocalDiscoverer
[2023-05-08T14:14:29.099Z] FATAL tee-trusted-loader-1683555269091/BROKER: Unable to create ServiceBroker. SystemError [ERR_SYSTEM_ERROR]: A system error occurred: uv_interface_addresses returned Unknown system error 97 (Unknown system error 97)
at __node_internal_captureLargerStackTrace (node:internal/errors:478:5)
at new SystemError (node:internal/errors:238:5)
at new NodeError (node:internal/errors:349:7)
at __node_internal_checkError (node:os:68:13)
at Object.networkInterfaces (node:os:267:16)
at getIpList (/home/node/node_modules/moleculer/src/utils.js:172:25)
at NodeCatalog.createLocalNode (/home/node/node_modules/moleculer/src/registry/node-catalog.js:47:17)
at new NodeCatalog (/home/node/node_modules/moleculer/src/registry/node-catalog.js:35:8)
at new Registry (/home/node/node_modules/moleculer/src/registry/registry.js:48:16)
at new ServiceBroker (/home/node/node_modules/moleculer/src/service-broker.js:240:20)
at MoleculerRunner.startBroker (/home/node/node_modules/moleculer/src/runner.js:507:17)
at /home/node/node_modules/moleculer/src/runner.js:529:21 {
code: 'ERR_SYSTEM_ERROR',
info: { errno: 97, code: 'Unknown system error 97', message: 'Unknown system error 97', syscall: 'uv_interface_addresses' },
errno: [Getter/Setter: 97],
syscall: [Getter/Setter: 'uv_interface_addresses']
Steps to Reproduce
To reproduce this you need server with Intel SGX-compatible processor and correctly set up Gramine.
Then try to start Moleculer
Reproduce code snippet
const broker = new ServiceBroker({
logger: console,
transporter: {type:'AMQP', options: {url:'amqp://localhost:5672'}
});
broker.start();
Context
Everuthing is described in Current Behavior
section.
Failure Logs
GoTo Failure Information
section
The IP addresses are used by TCP transporter and it's visible in nodes
command in REPL. I think the easier solution is if we wrap the getIpList
method in utils into a try...catch block and if an error occurs we return with an empty array. Could you create a PR with this change?