From 24f848eefaed122bd15651b68c8579efcefecfe6 Mon Sep 17 00:00:00 2001 From: Alan Isaac Date: Sun, 18 Oct 2020 12:20:37 -0400 Subject: [PATCH] Add build & versions info to about menu (#606) * Added jaeger ui version to about menu Signed-off-by: Alan Pinkert * Added Jaeger version info from config Signed-off-by: Alan Pinkert * Removed extra 'v' from Jaeger version Signed-off-by: Alan Pinkert * Changed to use short git commit hash Signed-off-by: Alan Pinkert * Added test for missing coverage Signed-off-by: Alan Pinkert Signed-off-by: vvvprabhakar --- .../src/components/App/TopNav.test.js | 20 ++++- .../jaeger-ui/src/components/App/TopNav.tsx | 17 ++-- .../src/constants/default-config.tsx | 15 ++++ .../src/constants/default-version.tsx | 19 +++++ .../src/utils/version/get-version.test.js | 77 +++++++++++++++++++ .../src/utils/version/get-version.tsx | 35 +++++++++ packages/jaeger-ui/typings/custom.d.ts | 1 + 7 files changed, 174 insertions(+), 10 deletions(-) create mode 100644 packages/jaeger-ui/src/constants/default-version.tsx create mode 100644 packages/jaeger-ui/src/utils/version/get-version.test.js create mode 100644 packages/jaeger-ui/src/utils/version/get-version.tsx diff --git a/packages/jaeger-ui/src/components/App/TopNav.test.js b/packages/jaeger-ui/src/components/App/TopNav.test.js index ec89e63d96..fae9a06369 100644 --- a/packages/jaeger-ui/src/components/App/TopNav.test.js +++ b/packages/jaeger-ui/src/components/App/TopNav.test.js @@ -24,6 +24,9 @@ describe('', () => { const blogUrl = 'https://medium.com/jaegertracing/'; const labelAbout = 'About Jaeger'; const dropdownItems = [ + { + label: 'Version 1', + }, { label: 'Docs', url: 'http://jaeger.readthedocs.io/en/latest/', @@ -111,16 +114,27 @@ describe('', () => { }); describe('', () => { + let subMenu; + beforeEach(() => { wrapper = shallow(); + subMenu = shallow(wrapper.find('Dropdown').props().overlay); + }); + + it('renders sub-menu text', () => { + dropdownItems.slice(0, 0).forEach(itemConfig => { + const item = subMenu.find(`[text="${itemConfig.label}"]`); + expect(item.length).toBe(1); + expect(item.prop('disabled')).toBe(true); + }); }); - it('renders sub-menu items', () => { - const subMenu = shallow(wrapper.find('Dropdown').props().overlay); - dropdownItems.forEach(itemConfig => { + it('renders sub-menu links', () => { + dropdownItems.slice(1, 2).forEach(itemConfig => { const item = subMenu.find(`[href="${itemConfig.url}"]`); expect(item.length).toBe(1); expect(item.prop('target')).toBe(itemConfig.anchorTarget || '_blank'); + expect(item.text()).toBe(itemConfig.label); }); }); }); diff --git a/packages/jaeger-ui/src/components/App/TopNav.tsx b/packages/jaeger-ui/src/components/App/TopNav.tsx index 1bdf5d742f..ad33b4f438 100644 --- a/packages/jaeger-ui/src/components/App/TopNav.tsx +++ b/packages/jaeger-ui/src/components/App/TopNav.tsx @@ -68,19 +68,22 @@ if (getConfigValue('qualityMetrics.menuEnabled')) { }); } -function getItemLink(item: ConfigMenuItem) { +function getItem(item: ConfigMenuItem) { const { label, anchorTarget, url } = item; + const link = ( + + {label} + + ); return ( - - - {label} - + + {url ? link : label} ); } function CustomNavDropdown({ label, items }: ConfigMenuGroup) { - const menuItems = {items.map(getItemLink)}; + const menuItems = {items.map(getItem)}; return ( @@ -103,7 +106,7 @@ export function TopNavImpl(props: Props) { {menuItems.map(m => { if (isItem(m)) { - return getItemLink(m); + return getItem(m); } return ( diff --git a/packages/jaeger-ui/src/constants/default-config.tsx b/packages/jaeger-ui/src/constants/default-config.tsx index 5fd6bf472e..e6ca7a662e 100644 --- a/packages/jaeger-ui/src/constants/default-config.tsx +++ b/packages/jaeger-ui/src/constants/default-config.tsx @@ -15,6 +15,9 @@ import deepFreeze from 'deep-freeze'; import { FALLBACK_DAG_MAX_NUM_SERVICES } from './index'; +import getVersion from '../utils/version/get-version'; + +const { version } = require('../../package.json'); export default deepFreeze( Object.defineProperty( @@ -57,6 +60,18 @@ export default deepFreeze( label: 'GitHub', url: 'https://github.com/jaegertracing/', }, + { + label: `Jaeger ${getVersion().gitVersion}`, + }, + { + label: `Commit ${getVersion().gitCommit.substring(0, 7)}`, + }, + { + label: `Build ${getVersion().buildDate}`, + }, + { + label: `Jaeger UI v${version}`, + }, ], }, ], diff --git a/packages/jaeger-ui/src/constants/default-version.tsx b/packages/jaeger-ui/src/constants/default-version.tsx new file mode 100644 index 0000000000..b96666e29c --- /dev/null +++ b/packages/jaeger-ui/src/constants/default-version.tsx @@ -0,0 +1,19 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +export default Object.freeze({ + gitCommit: '', + gitVersion: '', + buildDate: '', +}); diff --git a/packages/jaeger-ui/src/utils/version/get-version.test.js b/packages/jaeger-ui/src/utils/version/get-version.test.js new file mode 100644 index 0000000000..4397419411 --- /dev/null +++ b/packages/jaeger-ui/src/utils/version/get-version.test.js @@ -0,0 +1,77 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* eslint-disable no-console, import/first */ + +import getVersion from './get-version'; +import defaultVersion from '../../constants/default-version'; + +describe('getVersion()', () => { + const warnFn = jest.fn(); + let oldWarn; + + beforeAll(() => { + oldWarn = console.warn; + console.warn = warnFn; + }); + + beforeEach(() => { + warnFn.mockClear(); + }); + + afterAll(() => { + console.warn = oldWarn; + }); + + describe('`window.getVersion` is not a function', () => { + beforeAll(() => { + window.getVersion = undefined; + }); + + it('warns once', () => { + getVersion(); + expect(warnFn.mock.calls.length).toBe(1); + getVersion(); + expect(warnFn.mock.calls.length).toBe(1); + }); + + it('returns the default version information', () => { + expect(getVersion()).toEqual(defaultVersion); + }); + }); + + describe('`window.getVersion` is a function', () => { + let embedded; + let getJaegerVersion; + + beforeEach(() => { + embedded = {}; + getJaegerVersion = jest.fn(() => embedded); + window.getJaegerVersion = getJaegerVersion; + }); + + it('returns the default version information when the embedded version information is `null`', () => { + embedded = null; + expect(getVersion()).toEqual(defaultVersion); + }); + + it('returns the embedded version information when it is not `null`', () => { + embedded = { + a: '1', + b: '2', + }; + expect(getVersion()).toEqual(embedded); + }); + }); +}); diff --git a/packages/jaeger-ui/src/utils/version/get-version.tsx b/packages/jaeger-ui/src/utils/version/get-version.tsx new file mode 100644 index 0000000000..0d45e3aed6 --- /dev/null +++ b/packages/jaeger-ui/src/utils/version/get-version.tsx @@ -0,0 +1,35 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import defaultVersion from '../../constants/default-version'; + +let haveWarnedFactoryFn = false; + +export default function getVersion() { + const getJaegerVersion = window.getJaegerVersion; + if (typeof getJaegerVersion !== 'function') { + if (!haveWarnedFactoryFn) { + // eslint-disable-next-line no-console + console.warn('Embedded version information not available'); + haveWarnedFactoryFn = true; + } + return { ...defaultVersion }; + } + const embedded = getJaegerVersion(); + if (!embedded) { + return { ...defaultVersion }; + } + + return { ...embedded }; +} diff --git a/packages/jaeger-ui/typings/custom.d.ts b/packages/jaeger-ui/typings/custom.d.ts index 607058ceee..c494a316c3 100644 --- a/packages/jaeger-ui/typings/custom.d.ts +++ b/packages/jaeger-ui/typings/custom.d.ts @@ -22,6 +22,7 @@ declare interface Window { __webpack_public_path__: string; // eslint-disable-line camelcase // For getting ui config getJaegerUiConfig?: () => Record; + getJaegerVersion?: () => Record; } // For inlined envvars