execute.js 5.81 KB
Newer Older
1
'use strict';
2
// const isolateBackend = require('./isolate')
3 4
const fs = require('fs')
const { spawn } = require('child_process');
5 6
const constants = require("../constants.json")
const libSupport = require('./lib')
7
const { Worker, isMainThread, workerData } = require('worker_threads');
8 9
const registry_url = constants.registry_url
const logger = libSupport.logger
10

11 12 13 14 15
function runIsolate(local_repository, metadata) {
    let port = metadata.port,
        functionHash = metadata.functionHash,
        resource_id = metadata.resource_id,
        memory = metadata.resources.memory
16
    let filename = local_repository + functionHash + ".js"
17 18
    return new Promise((resolve, reject) => {

19
        const worker = new Worker(filename, {
20
            argv: [resource_id, functionHash, port, "isolate", constants.network.external.kafka_host],
21 22 23 24
            resourceLimits: {
                maxOldGenerationSizeMb: memory
            }
        });
25 26 27 28 29
        worker.on('message', resolve);
        worker.on('error', reject);
        worker.on('exit', (code) => {
            if (code !== 0)
                reject(new Error(`Worker stopped with exit code ${code}`));
30
            logger.info(`Isolate Worker with resource_id ${resource_id} blown`);
Nilanjan Daw's avatar
Nilanjan Daw committed
31 32
            resolve()
        })
33 34 35 36
    });

}

37 38 39 40 41
function runProcess(local_repository, metadata) {
    let port = metadata.port,
        functionHash = metadata.functionHash,
        resource_id = metadata.resource_id,
        memory = metadata.resources.memory
nilanjandaw's avatar
nilanjandaw committed
42
    let filename = local_repository + functionHash + ".js"
43 44
    return new Promise((resolve, reject) => {
        let timeStart = Date.now()
45
        
46 47
        const process = spawn('node', [filename, resource_id, functionHash, port, "process", 
                constants.network.external.kafka_host, `--max-old-space-size=${memory}` ]);
48 49 50 51
        process.stdout.on('data', (data) => {
            console.log(`stdout: ${data}`);
            let timeDifference = Math.ceil((Date.now() - timeStart))
            console.log("process time taken: ", timeDifference);
52
            
53 54 55
        });

        process.stderr.on('data', (data) => {
56
            logger.error(`stderr: ${data}`);
57 58 59 60
            reject(data);
        });

        process.on('close', (code) => {
Nilanjan Daw's avatar
Nilanjan Daw committed
61
            resolve(process.pid);
62
            logger.info(`Process Environment with resource_id ${resource_id} blown`);
63 64 65 66 67 68
        });
    })

}


69 70 71 72 73 74
function runContainer(metadata) {
    let imageName = metadata.functionHash,
        port = metadata.port,
        resource_id = metadata.resource_id,
        memory = metadata.resources.memory

75
    logger.info(imageName);
76 77 78 79

    return new Promise((resolve, reject) => {
        let timeStart = Date.now()

80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
        const process_checkImage = spawn('docker', ["inspect", registry_url + imageName])

        process_checkImage.on('close', (code) => {
            if (code != 0) {
                const process_pullImage = spawn('docker', ["pull", registry_url + imageName]);

                process_pullImage.stderr.on('data', (data) => {
                    console.error(`stderr: ${data}`);
                    reject(data);
                });

                process_pullImage.on('close', (code) => {
                    if (code != 0)
                        reject("error")
                    else {
95 96 97
                        const process = spawn('docker', ["run", "--rm", `--network=${constants.network.network_bridge}`, "-p", `${port}:${port}`, 
                            "--name", resource_id, registry_url + imageName,
                            resource_id, imageName, port, "container", constants.network.internal.kafka_host]);
98
                        let result = "";
99
                        // timeStart = Date.now()
100
                        process.stdout.on('data', (data) => {
101
                            logger.info(`stdout: ${data}`);
102
                            let timeDifference = Math.ceil((Date.now() - timeStart))
103
                            logger.info("container run time taken: ", timeDifference);
104
                            result += data;
Nilanjan Daw's avatar
Nilanjan Daw committed
105
                            resolve(resource_id);
106 107 108
                        });

                        process.stderr.on('data', (data) => {
109
                            logger.error(`stderr: ${data}`);
110 111 112 113
                            reject(data);
                        });

                        process.on('close', (code) => {
114
                            logger.info("Exiting container");
115
                            
116 117 118 119 120
                        })
                    }
                    
                })
            } else {
121
                    logger.info("container starting at port", port);
122
                    
123 124 125
                    const process = spawn('docker', ["run", "--rm", `--network=${constants.network.network_bridge}`, 
                            "-p", `${port}:${port}`, "--name", resource_id, 
                        registry_url + imageName, resource_id, imageName, port, "container", constants.network.internal.kafka_host]);
126 127 128
                    let result = "";
                    // timeStart = Date.now()
                    process.stdout.on('data', (data) => {
129
                        logger.info(`stdout: ${data}`);
130
                        let timeDifference = Math.ceil((Date.now() - timeStart))
131
                        logger.info("container run time taken: ", timeDifference);
Nilanjan Daw's avatar
Nilanjan Daw committed
132
                        resolve(resource_id);
133 134 135
                    });

                    process.stderr.on('data', (data) => {
136
                        logger.error(`stderr: ${data}`);
137 138 139 140
                        reject(data);
                    });

                    process.on('close', (code) => {
141
                        logger.info("Exiting container");
142
                    })
143 144 145
                
            }
            
146
        })
147 148

        
149 150 151 152 153 154
    })

}

module.exports.runContainer = runContainer;
module.exports.runProcess = runProcess;
Nilanjan Daw's avatar
Nilanjan Daw committed
155
module.exports.runIsolate = runIsolate;