diff --git a/tensorboard/components/tf_backend/environmentStore.ts b/tensorboard/components/tf_backend/environmentStore.ts index 419027a96a..961a5b9ff6 100644 --- a/tensorboard/components/tf_backend/environmentStore.ts +++ b/tensorboard/components/tf_backend/environmentStore.ts @@ -22,9 +22,7 @@ namespace tf_backend { private environment: Environment; load() { - const url = tf_backend - .getRouter() - .environment(tf_backend.getExperimentId()); + const url = tf_backend.getRouter().environment(); return this.requestManager.request(url).then((result) => { const environment = { dataLocation: result.data_location, diff --git a/tensorboard/components/tf_backend/router.ts b/tensorboard/components/tf_backend/router.ts index d6cb443f4b..e9ba029ca9 100644 --- a/tensorboard/components/tf_backend/router.ts +++ b/tensorboard/components/tf_backend/router.ts @@ -14,7 +14,7 @@ limitations under the License. ==============================================================================*/ namespace tf_backend { export interface Router { - environment: (experiment?: string) => string; + environment: () => string; experiments: () => string; pluginRoute: ( pluginName: string, @@ -22,7 +22,7 @@ namespace tf_backend { params?: URLSearchParams ) => string; pluginsListing: () => string; - runs: (experiment?: string) => string; + runs: () => string; runsForExperiment: (id: tf_backend.ExperimentId) => string; } @@ -39,11 +39,7 @@ namespace tf_backend { dataDir = dataDir.slice(0, dataDir.length - 1); } return { - environment: (experiment?: string) => { - const searchParams = new URLSearchParams(); - searchParams.set('experiment', experiment || ''); - return createDataPath(dataDir, '/environment', searchParams); - }, + environment: () => createDataPath(dataDir, '/environment'), experiments: () => createDataPath(dataDir, '/experiments'), pluginRoute: ( pluginName: string, @@ -57,11 +53,7 @@ namespace tf_backend { ); }, pluginsListing: () => createDataPath(dataDir, '/plugins_listing'), - runs: (experiment?: string) => { - const searchParams = new URLSearchParams(); - searchParams.set('experiment', experiment || ''); - return createDataPath(dataDir, '/runs', searchParams); - }, + runs: () => createDataPath(dataDir, '/runs'), runsForExperiment: (id) => { return createDataPath( dataDir, @@ -79,13 +71,6 @@ namespace tf_backend { return _router; } - /** - * @return {string} the experiment ID for the currently loaded page - */ - export function getExperimentId() { - return new URLSearchParams(window.location.search).get('experiment') || ''; - } - /** * Set the global router, to be returned by future calls to `getRouter`. * You may wish to invoke this if you are running a demo server with a diff --git a/tensorboard/components/tf_backend/runsStore.ts b/tensorboard/components/tf_backend/runsStore.ts index 646bd68a75..eb2b872239 100644 --- a/tensorboard/components/tf_backend/runsStore.ts +++ b/tensorboard/components/tf_backend/runsStore.ts @@ -17,7 +17,7 @@ namespace tf_backend { private _runs: string[] = []; load() { - const url = tf_backend.getRouter().runs(tf_backend.getExperimentId()); + const url = tf_backend.getRouter().runs(); return this.requestManager.request(url).then((newRuns) => { if (!_.isEqual(this._runs, newRuns)) { this._runs = newRuns; diff --git a/tensorboard/components/tf_backend/test/backendTests.ts b/tensorboard/components/tf_backend/test/backendTests.ts index 9be6ae0ba2..4225e37540 100644 --- a/tensorboard/components/tf_backend/test/backendTests.ts +++ b/tensorboard/components/tf_backend/test/backendTests.ts @@ -82,22 +82,22 @@ namespace tf_backend { it('leading slash in pathPrefix is an absolute path', () => { const router = createRouter('/data/'); - assert.equal(router.runs(), '/data/runs?experiment='); + assert.equal(router.runs(), '/data/runs'); }); it('returns complete pathname when pathPrefix omits slash', () => { const router = createRouter('data/'); - assert.equal(router.runs(), 'data/runs?experiment='); + assert.equal(router.runs(), 'data/runs'); }); it('does not prune many leading slashes that forms full url', () => { const router = createRouter('///data/hello'); - // This becomes 'http://data/hello/runs?experiment=' - assert.equal(router.runs(), '///data/hello/runs?experiment='); + // This becomes 'http://data/hello/runs' + assert.equal(router.runs(), '///data/hello/runs'); }); it('returns correct value for #environment', () => { - assert.equal(router.environment(), 'data/environment?experiment='); + assert.equal(router.environment(), 'data/environment'); }); it('returns correct value for #experiments', () => { @@ -177,7 +177,7 @@ namespace tf_backend { }); it('returns correct value for #runs', () => { - assert.equal(router.runs(), 'data/runs?experiment='); + assert.equal(router.runs(), 'data/runs'); }); it('returns correct value for #runsForExperiment', () => { diff --git a/tensorboard/plugins/core/BUILD b/tensorboard/plugins/core/BUILD index 39e5dbb506..05f26af550 100644 --- a/tensorboard/plugins/core/BUILD +++ b/tensorboard/plugins/core/BUILD @@ -16,6 +16,7 @@ py_library( srcs_version = "PY2AND3", visibility = ["//visibility:public"], deps = [ + "//tensorboard:plugin_util", "//tensorboard/backend:http_util", "//tensorboard/plugins:base_plugin", "//tensorboard/util:tb_logging", diff --git a/tensorboard/plugins/core/core_plugin.py b/tensorboard/plugins/core/core_plugin.py index e1fa23a24e..3659618fea 100644 --- a/tensorboard/plugins/core/core_plugin.py +++ b/tensorboard/plugins/core/core_plugin.py @@ -30,6 +30,7 @@ from werkzeug import utils from werkzeug import wrappers +from tensorboard import plugin_util from tensorboard.backend import http_util from tensorboard.plugins import base_plugin from tensorboard.util import tb_logging @@ -122,7 +123,7 @@ def _serve_environment(self, request): * window_title is the title of the TensorBoard web page. """ if self._data_provider: - experiment = request.args.get('experiment', '') + experiment = plugin_util.experiment_id(request.environ) data_location = self._data_provider.data_location(experiment) else: data_location = self._logdir or self._db_uri @@ -159,7 +160,7 @@ def _serve_runs(self, request): last, and then ties are broken by sorting on the run name. """ if self._data_provider: - experiment = request.args.get('experiment', '') + experiment = plugin_util.experiment_id(request.environ) runs = sorted( self._data_provider.list_runs(experiment_id=experiment), key=lambda run: ( @@ -235,7 +236,7 @@ def _serve_experiment_runs(self, request): """ results = [] if self._db_connection_provider: - exp_id = request.args.get('experiment') + exp_id = plugin_util.experiment_id(request.environ) runs_dict = collections.OrderedDict() db = self._db_connection_provider() diff --git a/tensorboard/plugins/core/core_plugin_test.py b/tensorboard/plugins/core/core_plugin_test.py index 22e3cab0f7..6a1bb5e5ff 100644 --- a/tensorboard/plugins/core/core_plugin_test.py +++ b/tensorboard/plugins/core/core_plugin_test.py @@ -189,7 +189,7 @@ def testExperimentRuns(self): [exp1, exp2] = self._get_json(self.db_based_server, '/data/experiments') exp1_runs = self._get_json(self.db_based_server, - '/data/experiment_runs?experiment=%s' % exp1.get('id')) + '/experiment/%s/data/experiment_runs' % exp1.get('id')) self.assertEqual(len(exp1_runs), 2); self.assertEqual(exp1_runs[0].get('name'), 'run1'); self.assertEqual(exp1_runs[1].get('name'), 'run2'); @@ -199,7 +199,7 @@ def testExperimentRuns(self): self.assertEqual(exp1_runs[1].get('tags')[0].get('name'), 'mytag'); exp2_runs = self._get_json(self.db_based_server, - '/data/experiment_runs?experiment=%s' % exp2.get('id')) + '/experiment/%s/data/experiment_runs' % exp2.get('id')) self.assertEqual(len(exp2_runs), 1); self.assertEqual(exp2_runs[0].get('name'), 'run3'); diff --git a/tensorboard/plugins/scalar/scalars_plugin.py b/tensorboard/plugins/scalar/scalars_plugin.py index 43758a6c8a..4314b65b61 100644 --- a/tensorboard/plugins/scalar/scalars_plugin.py +++ b/tensorboard/plugins/scalar/scalars_plugin.py @@ -235,7 +235,7 @@ def _get_value(self, scalar_data_blob, dtype_enum): @wrappers.Request.application def tags_route(self, request): - experiment = request.args.get('experiment', '') + experiment = plugin_util.experiment_id(request.environ) index = self.index_impl(experiment=experiment) return http_util.Respond(request, index, 'application/json') @@ -244,7 +244,7 @@ def scalars_route(self, request): """Given a tag and single run, return array of ScalarEvents.""" tag = request.args.get('tag') run = request.args.get('run') - experiment = request.args.get('experiment', '') + experiment = plugin_util.experiment_id(request.environ) output_format = request.args.get('format') (body, mime_type) = self.scalars_impl(tag, run, experiment, output_format) return http_util.Respond(request, body, mime_type) diff --git a/tensorboard/plugins/scalar/tf_scalar_dashboard/tf-scalar-card.html b/tensorboard/plugins/scalar/tf_scalar_dashboard/tf-scalar-card.html index cec4c3046f..d424c6a262 100644 --- a/tensorboard/plugins/scalar/tf_scalar_dashboard/tf-scalar-card.html +++ b/tensorboard/plugins/scalar/tf_scalar_dashboard/tf-scalar-card.html @@ -234,16 +234,14 @@ getDataLoadUrl: { type: Function, value: function() { - return ({tag, run, experiment}) => { - return tf_backend.getRouter().pluginRoute( - 'scalars', - '/scalars', - new URLSearchParams({ - tag, - run, - experiment: experiment || '', - }) - ); + return ({tag, run}) => { + return tf_backend + .getRouter() + .pluginRoute( + 'scalars', + '/scalars', + new URLSearchParams({tag, run}) + ); }; }, }, @@ -252,12 +250,7 @@ _downloadUrlFn: { type: Function, value: function() { - return (tag, run) => - this.getDataLoadUrl({ - tag, - run, - experiment: tf_backend.getExperimentId(), - }); + return (tag, run) => this.getDataLoadUrl({tag, run}); }, }, diff --git a/tensorboard/plugins/scalar/tf_scalar_dashboard/tf-scalar-dashboard.html b/tensorboard/plugins/scalar/tf_scalar_dashboard/tf-scalar-dashboard.html index cf0044dcb9..43c794da96 100644 --- a/tensorboard/plugins/scalar/tf_scalar_dashboard/tf-scalar-dashboard.html +++ b/tensorboard/plugins/scalar/tf_scalar_dashboard/tf-scalar-dashboard.html @@ -309,13 +309,7 @@