Skip to content

Commit 0c026c5

Browse files
author
guntamb
committed
Add SageMaker-UI env endpoint patch
**Description** * Adding `/api/env` endpoint for the SageMaker Unified Studio user case that fetched the `/opt/ml/metadata/resource-metadata.json` file if present else throw server exception indicating no such file. **Motivation** * SMUS extensions would require this env metadata file. **Testing Done** * Build CE package and ran locally. Tested building the local image using BYOI **Backwards Compatibility Criteria (if any)** * N/A
1 parent acba5c3 commit 0c026c5

File tree

3 files changed

+94
-3
lines changed

3 files changed

+94
-3
lines changed

patched-vscode/src/vs/server/node/webClientServer.ts

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { createReadStream } from 'fs';
6+
import { createReadStream, existsSync, writeFileSync } from 'fs';
77
import {readFile } from 'fs/promises';
88
import { Promises } from 'vs/base/node/pfs';
99
import * as path from 'path';
@@ -102,6 +102,7 @@ export class WebClientServer {
102102
private readonly _callbackRoute: string;
103103
private readonly _webExtensionRoute: string;
104104
private readonly _idleRoute: string;
105+
private readonly _envMetadata: string;
105106

106107
constructor(
107108
private readonly _connectionToken: ServerConnectionToken,
@@ -118,6 +119,7 @@ export class WebClientServer {
118119
this._callbackRoute = `${serverRootPath}/callback`;
119120
this._webExtensionRoute = `${serverRootPath}/web-extension-resource`;
120121
this._idleRoute = '/api/idle';
122+
this._envMetadata = '/api/env';
121123
}
122124

123125
/**
@@ -146,6 +148,9 @@ export class WebClientServer {
146148
// extension resource support
147149
return this._handleWebExtensionResource(req, res, parsedUrl);
148150
}
151+
if (pathname === this._envMetadata) {
152+
return this._handleEnvMetadata(req, res);
153+
}
149154

150155
return serveError(req, res, 404, 'Not found.');
151156
} catch (error) {
@@ -459,12 +464,20 @@ export class WebClientServer {
459464
}
460465

461466
/**
462-
* Handles API requests to retrieve the last activity timestamp.
463-
*/
467+
* Handles API requests to retrieve the last activity timestamp.
468+
*/
464469
private async _handleIdle(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {
465470
try {
466471
const tmpDirectory = '/tmp/'
467472
const idleFilePath = path.join(tmpDirectory, '.sagemaker-last-active-timestamp');
473+
474+
// If idle shutdown file does not exist, this indicates the app UI may never been opened
475+
// Create the initial metadata file
476+
if (!existsSync(idleFilePath)) {
477+
const timestamp = new Date().toISOString();
478+
writeFileSync(idleFilePath, timestamp);
479+
}
480+
468481
const data = await readFile(idleFilePath, 'utf8');
469482

470483
res.statusCode = 200;
@@ -474,6 +487,26 @@ export class WebClientServer {
474487
serveError(req, res, 500, error.message)
475488
}
476489
}
490+
491+
/**
492+
* Handles API requests to retrieve the /opt/ml/metadata/resource-metadata.json file.
493+
*/
494+
private async _handleEnvMetadata(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {
495+
try {
496+
const envMetadataDirectory = '/opt/ml/metadata/';
497+
const envMetadataFilePath = path.join(envMetadataDirectory, 'resource-metadata.json');
498+
if (existsSync(envMetadataFilePath)) {
499+
const envMetadata = await readFile(envMetadataFilePath, 'utf8');
500+
res.statusCode = 200;
501+
res.setHeader('Content-Type', 'application/json');
502+
res.end(envMetadata);
503+
} else {
504+
serveError(req, res, 500, 'No metadata file at ' + envMetadataFilePath);
505+
}
506+
} catch (error) {
507+
serveError(req, res, 500, error.message);
508+
}
509+
}
477510
}
478511

479512
/**

patches/sagemaker-ui-env.patch

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
Index: sagemaker-code-editor/vscode/src/vs/server/node/webClientServer.ts
2+
===================================================================
3+
--- sagemaker-code-editor.orig/vscode/src/vs/server/node/webClientServer.ts
4+
+++ sagemaker-code-editor/vscode/src/vs/server/node/webClientServer.ts
5+
@@ -102,6 +102,7 @@ export class WebClientServer {
6+
private readonly _callbackRoute: string;
7+
private readonly _webExtensionRoute: string;
8+
private readonly _idleRoute: string;
9+
+ private readonly _envMetadata: string;
10+
11+
constructor(
12+
private readonly _connectionToken: ServerConnectionToken,
13+
@@ -118,6 +119,7 @@ export class WebClientServer {
14+
this._callbackRoute = `${serverRootPath}/callback`;
15+
this._webExtensionRoute = `${serverRootPath}/web-extension-resource`;
16+
this._idleRoute = '/api/idle';
17+
+ this._envMetadata = '/api/env';
18+
}
19+
20+
/**
21+
@@ -146,6 +148,9 @@ export class WebClientServer {
22+
// extension resource support
23+
return this._handleWebExtensionResource(req, res, parsedUrl);
24+
}
25+
+ if (pathname === this._envMetadata) {
26+
+ return this._handleEnvMetadata(req, res);
27+
+ }
28+
29+
return serveError(req, res, 404, 'Not found.');
30+
} catch (error) {
31+
@@ -482,6 +487,26 @@ export class WebClientServer {
32+
serveError(req, res, 500, error.message)
33+
}
34+
}
35+
+
36+
+ /**
37+
+ * Handles API requests to retrieve the /opt/ml/metadata/resource-metadata.json file.
38+
+ */
39+
+ private async _handleEnvMetadata(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {
40+
+ try {
41+
+ const envMetadataDirectory = '/opt/ml/metadata/';
42+
+ const envMetadataFilePath = path.join(envMetadataDirectory, 'resource-metadata.json');
43+
+ if (existsSync(envMetadataFilePath)) {
44+
+ const envMetadata = await readFile(envMetadataFilePath, 'utf8');
45+
+ res.statusCode = 200;
46+
+ res.setHeader('Content-Type', 'application/json');
47+
+ res.end(envMetadata);
48+
+ } else {
49+
+ serveError(req, res, 500, 'No metadata file at ' + envMetadataFilePath);
50+
+ }
51+
+ } catch (error) {
52+
+ serveError(req, res, 500, error.message);
53+
+ }
54+
+ }
55+
}
56+
57+
/**

patches/series

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ sagemaker-idle-extension.patch
1111
terminal-crash-mitigation.patch
1212
sagemaker-open-notebook-extension.patch
1313
security.diff
14+
sagemaker-ui-env.patch

0 commit comments

Comments
 (0)