mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
(core) add experimental support for python3 in staging
Summary: This adds `runsc` and `python3` to the grist-server images. For deployments with GRIST_EXPERIMENTAL_PLUGINS=1 (dev + staging but not prod) a hack is added to use `python3` under `runsc` for documents with a special title (`activate-python3-magic` or similar). This will simplify experiments on behavior of this configuration under realistic conditions. Hopefully, before landing this, I'll be able to switch to storing a python flag in a document options cell being added by @georgegevoian in a parallel diff, since using the doc title is super hacky :-). Test Plan: tested manually on worker built locally Reviewers: dsagal, alexmojaki Reviewed By: dsagal, alexmojaki Subscribers: georgegevoian Differential Revision: https://phab.getgrist.com/D2998
This commit is contained in:
parent
7465af8ce8
commit
e492dfdb22
@ -163,12 +163,22 @@ export class ActiveDoc extends EventEmitter {
|
|||||||
// Our DataEngine is a separate sandboxed process (one per open document). The data engine runs
|
// Our DataEngine is a separate sandboxed process (one per open document). The data engine runs
|
||||||
// user-defined python code including formula calculations. It maintains all document data and
|
// user-defined python code including formula calculations. It maintains all document data and
|
||||||
// metadata, and applies translates higher-level UserActions into lower-level DocActions.
|
// metadata, and applies translates higher-level UserActions into lower-level DocActions.
|
||||||
|
|
||||||
|
// HACK: If doc title as a slug contains "activate-python3-magic", and we are
|
||||||
|
// in an environment with GRIST_EXPERIMENTAL_PLUGINS=1 (dev or staging but not
|
||||||
|
// prod), use Python3. This is just for experimentation at this point.
|
||||||
|
// TODO: use a less hacky way to say we want to use py3 in a document.
|
||||||
|
const preferredPythonVersion =
|
||||||
|
(options?.docUrl?.match(/activate-python3-magic/) && process.env.GRIST_EXPERIMENTAL_PLUGINS === '1')
|
||||||
|
? '3' : undefined;
|
||||||
|
|
||||||
this._dataEngine = this._docManager.gristServer.create.NSandbox({
|
this._dataEngine = this._docManager.gristServer.create.NSandbox({
|
||||||
comment: docName,
|
comment: docName,
|
||||||
logCalls: false,
|
logCalls: false,
|
||||||
logTimes: true,
|
logTimes: true,
|
||||||
logMeta: {docId: docName},
|
logMeta: {docId: docName},
|
||||||
docUrl: options?.docUrl,
|
docUrl: options?.docUrl,
|
||||||
|
preferredPythonVersion,
|
||||||
});
|
});
|
||||||
|
|
||||||
this._activeDocImport = new ActiveDocImport(this);
|
this._activeDocImport = new ActiveDocImport(this);
|
||||||
|
@ -17,6 +17,8 @@ export interface ISandboxCreationOptions {
|
|||||||
importMount?: string; // if defined, make this path available read-only as "/importdir"
|
importMount?: string; // if defined, make this path available read-only as "/importdir"
|
||||||
|
|
||||||
docUrl?: string; // to support SELF_HYPERLINK.
|
docUrl?: string; // to support SELF_HYPERLINK.
|
||||||
|
|
||||||
|
preferredPythonVersion?: '2' | '3';
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ISandbox {
|
export interface ISandbox {
|
||||||
|
@ -37,6 +37,8 @@ interface ISandboxOptions {
|
|||||||
command?: string; // External program or container to call to run the sandbox.
|
command?: string; // External program or container to call to run the sandbox.
|
||||||
args: string[]; // The arguments to pass to the python process.
|
args: string[]; // The arguments to pass to the python process.
|
||||||
|
|
||||||
|
preferredPythonVersion?: string; // Mandatory for gvisor; ignored by other methods.
|
||||||
|
|
||||||
// TODO: update
|
// TODO: update
|
||||||
// ISandboxCreationOptions to talk about directories instead of
|
// ISandboxCreationOptions to talk about directories instead of
|
||||||
// mounts, since it may not be possible to remap directories as
|
// mounts, since it may not be possible to remap directories as
|
||||||
@ -357,14 +359,24 @@ const spawners = {
|
|||||||
export class NSandboxCreator implements ISandboxCreator {
|
export class NSandboxCreator implements ISandboxCreator {
|
||||||
private _flavor: keyof typeof spawners;
|
private _flavor: keyof typeof spawners;
|
||||||
private _command?: string;
|
private _command?: string;
|
||||||
|
private _preferredPythonVersion?: string;
|
||||||
|
|
||||||
public constructor(options: {defaultFlavor: keyof typeof spawners}) {
|
public constructor(options: {
|
||||||
const flavor = process.env.GRIST_SANDBOX_FLAVOR || options.defaultFlavor;
|
defaultFlavor: keyof typeof spawners,
|
||||||
|
ignoreEnvironment?: boolean,
|
||||||
|
command?: string,
|
||||||
|
preferredPythonVersion?: string,
|
||||||
|
}) {
|
||||||
|
const flavor = (!options.ignoreEnvironment && process.env.GRIST_SANDBOX_FLAVOR) ||
|
||||||
|
options.defaultFlavor;
|
||||||
if (!Object.keys(spawners).includes(flavor)) {
|
if (!Object.keys(spawners).includes(flavor)) {
|
||||||
throw new Error(`Unrecognized sandbox flavor: ${flavor}`);
|
throw new Error(`Unrecognized sandbox flavor: ${flavor}`);
|
||||||
}
|
}
|
||||||
this._flavor = flavor as keyof typeof spawners;
|
this._flavor = flavor as keyof typeof spawners;
|
||||||
this._command = process.env.GRIST_SANDBOX;
|
this._command = (!options.ignoreEnvironment && process.env.GRIST_SANDBOX) ||
|
||||||
|
options.command;
|
||||||
|
this._preferredPythonVersion = (!options.ignoreEnvironment && process.env.PYTHON_VERSION) ||
|
||||||
|
options.preferredPythonVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
public create(options: ISandboxCreationOptions): ISandbox {
|
public create(options: ISandboxCreationOptions): ISandbox {
|
||||||
@ -386,6 +398,7 @@ export class NSandboxCreator implements ISandboxCreator {
|
|||||||
...options.logMeta},
|
...options.logMeta},
|
||||||
logTimes: options.logTimes,
|
logTimes: options.logTimes,
|
||||||
command: this._command,
|
command: this._command,
|
||||||
|
preferredPythonVersion: this._preferredPythonVersion,
|
||||||
useGristEntrypoint: true,
|
useGristEntrypoint: true,
|
||||||
importDir: options.importMount,
|
importDir: options.importMount,
|
||||||
};
|
};
|
||||||
@ -521,7 +534,7 @@ function gvisor(options: ISandboxOptions): ChildProcess {
|
|||||||
if (options.deterministicMode) {
|
if (options.deterministicMode) {
|
||||||
wrapperArgs.push('--faketime', FAKETIME);
|
wrapperArgs.push('--faketime', FAKETIME);
|
||||||
}
|
}
|
||||||
const pythonVersion = process.env.PYTHON_VERSION;
|
const pythonVersion = options.preferredPythonVersion;
|
||||||
if (pythonVersion !== '2' && pythonVersion !== '3') {
|
if (pythonVersion !== '2' && pythonVersion !== '3') {
|
||||||
throw new Error("PYTHON_VERSION must be set to 2 or 3");
|
throw new Error("PYTHON_VERSION must be set to 2 or 3");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user